diff --git a/contracts/boot.clar b/contracts/boot.clar index a4db1ec..870cdb4 100644 --- a/contracts/boot.clar +++ b/contracts/boot.clar @@ -6,6 +6,7 @@ (begin (try! (contract-call? .lisa-dao set-extensions (list {extension: .lqstx-mint-endpoint, enabled: true} + {extension: .lqstx-mint-registry, enabled: true} {extension: .lqstx-vault, enabled: true} {extension: .treasury, enabled: true} {extension: .fastpool-strategy-manager, enabled: true} diff --git a/contracts/extensions/lisa-rebase.clar b/contracts/extensions/lisa-rebase.clar index c7463d3..962c55c 100644 --- a/contracts/extensions/lisa-rebase.clar +++ b/contracts/extensions/lisa-rebase.clar @@ -17,6 +17,3 @@ (ok total-stx) ) ) - -(define-public (callback (extension principal) (payload (buff 2048))) - (ok true)) \ No newline at end of file diff --git a/contracts/extensions/lqstx-mint-endpoint.clar b/contracts/extensions/lqstx-mint-endpoint.clar index 02012ed..28b58bc 100644 --- a/contracts/extensions/lqstx-mint-endpoint.clar +++ b/contracts/extensions/lqstx-mint-endpoint.clar @@ -111,11 +111,11 @@ (sender tx-sender) (cycle (unwrap-panic (get-reward-cycle block-height))) (request-details { requested-by: sender, amount: amount, requested-at: cycle, status: PENDING }) - (request-id (as-contract (try! (contract-call? .lqstx-mint-registry set-mint-request u0 request-details))))) + (request-id (try! (contract-call? .lqstx-mint-registry set-mint-request u0 request-details)))) (try! (is-paused-or-fail)) (try! (stx-transfer? amount sender .lqstx-vault)) - (as-contract (try! (contract-call? .lqstx-mint-registry set-mint-requests-pending-amount (+ (get-mint-requests-pending-amount) amount)))) - (as-contract (try! (contract-call? .lqstx-mint-registry set-mint-requests-pending sender (unwrap-panic (as-max-len? (append (get-mint-requests-pending-or-default sender) request-id) u1000))))) + (try! (contract-call? .lqstx-mint-registry set-mint-requests-pending-amount (+ (get-mint-requests-pending-amount) amount))) + (try! (contract-call? .lqstx-mint-registry set-mint-requests-pending sender (unwrap-panic (as-max-len? (append (get-mint-requests-pending-or-default sender) request-id) u1000)))) (print { type: "mint-request", id: request-id, details: request-details }) (ok request-id))) @@ -126,10 +126,10 @@ (request-id-idx (try! (validate-mint-request request-id)))) (try! (is-paused-or-fail)) (try! (is-dao-or-extension)) - (as-contract (try! (contract-call? .token-lqstx dao-mint (get amount request-details) (get requested-by request-details)))) - (as-contract (try! (contract-call? .lqstx-mint-registry set-mint-request request-id (merge request-details { status: FINALIZED })))) - (as-contract (try! (contract-call? .lqstx-mint-registry set-mint-requests-pending-amount (- (get-mint-requests-pending-amount) (get amount request-details))))) - (as-contract (try! (contract-call? .lqstx-mint-registry set-mint-requests-pending (get requested-by request-details) (pop mint-requests request-id-idx)))) + (try! (contract-call? .token-lqstx dao-mint (get amount request-details) (get requested-by request-details))) + (try! (contract-call? .lqstx-mint-registry set-mint-request request-id (merge request-details { status: FINALIZED }))) + (try! (contract-call? .lqstx-mint-registry set-mint-requests-pending-amount (- (get-mint-requests-pending-amount) (get amount request-details)))) + (try! (contract-call? .lqstx-mint-registry set-mint-requests-pending (get requested-by request-details) (pop mint-requests request-id-idx))) (ok true))) (define-public (finalize-mint-many (request-ids (list 1000 uint))) @@ -143,10 +143,10 @@ (try! (is-paused-or-fail)) (asserts! (is-eq tx-sender (get requested-by request-details)) err-unauthorised) (asserts! (is-eq PENDING (get status request-details)) err-request-finalized-or-revoked) - (as-contract (try! (contract-call? .lqstx-vault proxy-call .stx-transfer-proxy (unwrap-panic (to-consensus-buff? { ustx: (get amount request-details), recipient: (get requested-by request-details) }))))) - (as-contract (try! (contract-call? .lqstx-mint-registry set-mint-request request-id (merge request-details { status: REVOKED })))) - (as-contract (try! (contract-call? .lqstx-mint-registry set-mint-requests-pending-amount (- (get-mint-requests-pending-amount) (get amount request-details))))) - (as-contract (try! (contract-call? .lqstx-mint-registry set-mint-requests-pending (get requested-by request-details) (pop mint-requests request-id-idx)))) + (try! (contract-call? .lqstx-vault proxy-call .stx-transfer-proxy (unwrap-panic (to-consensus-buff? { ustx: (get amount request-details), recipient: (get requested-by request-details) })))) + (try! (contract-call? .lqstx-mint-registry set-mint-request request-id (merge request-details { status: REVOKED }))) + (try! (contract-call? .lqstx-mint-registry set-mint-requests-pending-amount (- (get-mint-requests-pending-amount) (get amount request-details)))) + (try! (contract-call? .lqstx-mint-registry set-mint-requests-pending (get requested-by request-details) (pop mint-requests request-id-idx))) (ok true))) (define-public (request-burn (amount uint) (rebase-trait )) @@ -156,11 +156,11 @@ (cycle (unwrap-panic (get-reward-cycle block-height))) (vlqstx-amount (contract-call? .token-vlqstx get-tokens-to-shares amount)) (request-details { requested-by: sender, amount: amount, wrapped-amount: vlqstx-amount, requested-at: cycle, status: PENDING }) - (request-id (as-contract (try! (contract-call? .lqstx-mint-registry set-burn-request u0 request-details))))) + (request-id (try! (contract-call? .lqstx-mint-registry set-burn-request u0 request-details)))) (try! (is-paused-or-fail)) (try! (contract-call? .token-vlqstx mint amount sender)) (try! (contract-call? .token-vlqstx transfer vlqstx-amount sender .lqstx-mint-registry none)) - (as-contract (try! (contract-call? .lqstx-mint-registry set-burn-requests-pending sender (unwrap-panic (as-max-len? (append (get-burn-requests-pending-or-default sender) request-id) u1000))))) + (try! (contract-call? .lqstx-mint-registry set-burn-requests-pending sender (unwrap-panic (as-max-len? (append (get-burn-requests-pending-or-default sender) request-id) u1000)))) (match (contract-call? rebase-trait finalize-burn request-id) ok-value (ok { request-id: request-id, status: FINALIZED }) err-value (begin (print { type: "burn-request", id: request-id, details: request-details, finalize-err: err-value }) (ok { request-id: request-id, status: PENDING }))))) @@ -168,16 +168,16 @@ (define-public (finalize-burn (request-id uint)) (let ( (request-details (try! (get-burn-request-or-fail request-id))) - (transfer-vlqstx (as-contract (try! (contract-call? .lqstx-mint-registry transfer (get wrapped-amount request-details) tx-sender .token-vlqstx)))) + (transfer-vlqstx (try! (contract-call? .lqstx-mint-registry transfer (get wrapped-amount request-details) (as-contract tx-sender) .token-vlqstx))) (burn-requests (get-burn-requests-pending-or-default (get requested-by request-details))) (validation-data (try! (validate-burn-request request-id)))) (try! (is-paused-or-fail)) (try! (is-dao-or-extension)) - (as-contract (try! (contract-call? .token-vlqstx burn (get wrapped-amount request-details) tx-sender))) - (as-contract (try! (contract-call? .token-lqstx dao-burn (get vaulted-amount validation-data) tx-sender))) - (as-contract (try! (contract-call? .lqstx-vault proxy-call .stx-transfer-proxy (unwrap-panic (to-consensus-buff? { ustx: (get vaulted-amount validation-data), recipient: (get requested-by request-details) }))))) - (as-contract (try! (contract-call? .lqstx-mint-registry set-burn-request request-id (merge request-details { status: FINALIZED })))) - (as-contract (try! (contract-call? .lqstx-mint-registry set-burn-requests-pending (get requested-by request-details) (pop burn-requests (get request-id-idx validation-data))))) + (try! (contract-call? .token-vlqstx burn (get wrapped-amount request-details) (as-contract tx-sender))) + (try! (contract-call? .token-lqstx dao-burn (get vaulted-amount validation-data) (as-contract tx-sender))) + (try! (contract-call? .lqstx-vault proxy-call .stx-transfer-proxy (unwrap-panic (to-consensus-buff? { ustx: (get vaulted-amount validation-data), recipient: (get requested-by request-details) })))) + (try! (contract-call? .lqstx-mint-registry set-burn-request request-id (merge request-details { status: FINALIZED }))) + (try! (contract-call? .lqstx-mint-registry set-burn-requests-pending (get requested-by request-details) (pop burn-requests (get request-id-idx validation-data)))) (ok true))) (define-public (finalize-burn-many (request-ids (list 1000 uint))) @@ -192,16 +192,13 @@ (try! (is-paused-or-fail)) (asserts! (is-eq PENDING (get status request-details)) err-request-finalized-or-revoked) (asserts! (is-eq tx-sender (get requested-by request-details)) err-unauthorised) - (as-contract (try! (contract-call? .lqstx-mint-registry transfer (get wrapped-amount request-details) tx-sender .token-vlqstx))) - (as-contract (try! (contract-call? .token-vlqstx burn (get wrapped-amount request-details) tx-sender))) - (as-contract (try! (contract-call? .token-lqstx transfer lqstx-amount tx-sender (get requested-by request-details) none))) - (as-contract (try! (contract-call? .lqstx-mint-registry set-burn-request request-id (merge request-details { status: REVOKED })))) - (as-contract (try! (contract-call? .lqstx-mint-registry set-burn-requests-pending (get requested-by request-details) (pop burn-requests request-id-idx)))) + (try! (contract-call? .lqstx-mint-registry transfer (get wrapped-amount request-details) (as-contract tx-sender) .token-vlqstx)) + (try! (contract-call? .token-vlqstx burn (get wrapped-amount request-details) (as-contract tx-sender))) + (try! (contract-call? .token-lqstx transfer lqstx-amount (as-contract tx-sender) (get requested-by request-details) none)) + (try! (contract-call? .lqstx-mint-registry set-burn-request request-id (merge request-details { status: REVOKED }))) + (try! (contract-call? .lqstx-mint-registry set-burn-requests-pending (get requested-by request-details) (pop burn-requests request-id-idx))) (ok true))) -(define-public (callback (extension principal) (payload (buff 2048))) - (ok true)) - (define-private (check-err (result (response bool uint)) (prior (response bool uint))) (match prior ok-value result diff --git a/contracts/extensions/lqstx-vault.clar b/contracts/extensions/lqstx-vault.clar index a120a6d..ba563aa 100644 --- a/contracts/extensions/lqstx-vault.clar +++ b/contracts/extensions/lqstx-vault.clar @@ -30,6 +30,3 @@ (as-contract (contract-call? proxy proxy-call payload)) ) ) - -(define-public (callback (extension principal) (payload (buff 2048))) - (ok true)) \ No newline at end of file diff --git a/contracts/mocks/mock-strategy-manager.clar b/contracts/mocks/mock-strategy-manager.clar index 72bf967..bba2df2 100644 --- a/contracts/mocks/mock-strategy-manager.clar +++ b/contracts/mocks/mock-strategy-manager.clar @@ -1,5 +1,3 @@ -(impl-trait .extension-trait.extension-trait) - (define-constant err-unauthorised (err u1000)) (define-map authorised-managers principal bool) @@ -33,7 +31,3 @@ (ok (map-set authorised-managers who enabled)) ) ) - -(define-public (callback (sender principal) (memo (buff 2048))) - (ok true) -) \ No newline at end of file diff --git a/contracts/token-lqstx.clar b/contracts/token-lqstx.clar index 5f3a32a..68e2276 100644 --- a/contracts/token-lqstx.clar +++ b/contracts/token-lqstx.clar @@ -112,7 +112,7 @@ (define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 2048)))) (begin - (asserts! (is-eq sender tx-sender) err-unauthorised) + (asserts! (or (is-eq tx-sender sender) (is-eq contract-caller sender)) err-unauthorised) (try! (ft-transfer? lqstx (get-tokens-to-shares amount) sender recipient)) (print { type: "transfer", amount: amount, sender: sender, recipient: recipient, memo: memo }) (ok true))) diff --git a/contracts/token-vlqstx.clar b/contracts/token-vlqstx.clar index 621ad7a..a6c1bd2 100644 --- a/contracts/token-vlqstx.clar +++ b/contracts/token-vlqstx.clar @@ -38,20 +38,20 @@ (define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 2048)))) (begin - (asserts! (is-eq sender tx-sender) err-unauthorised) + (asserts! (or (is-eq tx-sender sender) (is-eq contract-caller sender)) err-unauthorised) (try! (ft-transfer? vlqstx amount sender recipient)) (print { type: "transfer", amount: amount, sender: sender, recipient: recipient, memo: memo }) (ok true))) (define-public (mint (amount uint) (recipient principal)) (begin - (asserts! (is-eq recipient tx-sender) err-unauthorised) + (asserts! (or (is-eq tx-sender recipient) (is-eq contract-caller recipient)) err-unauthorised) (try! (ft-mint? vlqstx (get-tokens-to-shares amount) recipient)) (contract-call? .token-lqstx transfer amount recipient (as-contract tx-sender) none))) (define-public (burn (amount uint) (sender principal)) (begin - (asserts! (is-eq sender tx-sender) err-unauthorised) + (asserts! (or (is-eq tx-sender sender) (is-eq contract-caller sender)) err-unauthorised) (as-contract (try! (contract-call? .token-lqstx transfer (get-shares-to-tokens amount) tx-sender sender none))) (ft-burn? vlqstx amount sender))) diff --git a/contracts/wrapped-tokens/token-wlqstx.clar b/contracts/wrapped-tokens/token-wlqstx.clar index 48bfce1..c510d95 100644 --- a/contracts/wrapped-tokens/token-wlqstx.clar +++ b/contracts/wrapped-tokens/token-wlqstx.clar @@ -115,7 +115,7 @@ ;; @returns (response bool uint)/ error (define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 2048)))) (begin - (asserts! (is-eq sender tx-sender) ERR-NOT-AUTHORIZED) + (asserts! (or (is-eq tx-sender sender) (is-eq contract-caller sender)) ERR-NOT-AUTHORIZED) (contract-call? .token-lqstx transfer (/ (* amount (pow u10 (unwrap-panic (get-base-decimals)))) (pow-decimals)) sender recipient memo) ) ) diff --git a/scripts/broadcast-multisig-deployment-plan.ts b/scripts/broadcast-multisig-deployment-plan.ts index 1d2d266..a6a90ce 100644 --- a/scripts/broadcast-multisig-deployment-plan.ts +++ b/scripts/broadcast-multisig-deployment-plan.ts @@ -1,12 +1,10 @@ import { deserializeTransaction, - // broadcastTransaction, getNonce, addressToString, broadcastTransaction, TxBroadcastResult, } from "@stacks/transactions"; -// import { bytesToHex } from '@stacks/common'; import { getNetwork, getStacksAddress } from "./config.ts"; import { readPlan, verboseLog } from "./utils.ts"; diff --git a/tests/lqstx-mint-endpoint.test.ts b/tests/lqstx-mint-endpoint.test.ts index 0b9df4e..9824438 100644 --- a/tests/lqstx-mint-endpoint.test.ts +++ b/tests/lqstx-mint-endpoint.test.ts @@ -34,7 +34,7 @@ const prepareTest = () => Cl.contractPrincipal(simnet.deployer, contracts.boot), ], simnet.deployer, - ), + ), ]); const requestMint = () => @@ -66,7 +66,7 @@ const requestBurn = (payload: Buffer) => Cl.uint(100e6) ], manager - ), + ), tx.callPublicFn( contracts.rebase1, 'rebase', @@ -175,13 +175,13 @@ describe(contracts.endpoint, () => { const blocksToMine = Number(simnet.callReadOnlyFn(contracts.endpoint, 'get-first-stacks-block-in-reward-cycle', [Cl.uint(cycle + 1n)], user).result.value) - simnet.blockHeight; simnet.mineEmptyBlocks(blocksToMine); // go to the next cycle simnet.mineEmptyBlocks(144); // mint-delay - + const payload = simnet.callReadOnlyFn( contracts.strategy, 'create-payload', [Cl.uint(100e6)], manager - ).result.buffer; + ).result.buffer; const responses = requestBurn(payload); expect(responses[0].result).toBeOk(Cl.uint(0)); expect(responses[1].result).toBeOk(Cl.bool(true)); @@ -204,7 +204,7 @@ describe(contracts.endpoint, () => { 'create-payload', [Cl.uint(100e6)], manager - ).result.buffer; + ).result.buffer; const burnResponses = requestBurn(payload); expect(burnResponses[0].result).toBeOk(Cl.uint(0)); expect(burnResponses[1].result).toBeOk(Cl.bool(true)); @@ -226,7 +226,7 @@ describe(contracts.endpoint, () => { 'rebase', [], oracle - ), + ), tx.callPublicFn( contracts.rebase1, 'finalize-burn', @@ -244,7 +244,7 @@ describe(contracts.endpoint, () => { expect(responses[1].result).toBeOk(Cl.uint(100e6)); expect(responses[2].result).toBeOk(Cl.bool(true)); expect(responses[3].result).toBeErr(Cl.uint(1007)); - + }); it('can revoke burn', () => { @@ -261,7 +261,7 @@ describe(contracts.endpoint, () => { 'create-payload', [Cl.uint(100e6)], manager - ).result.buffer; + ).result.buffer; const burnResponses = requestBurn(payload); expect(burnResponses[0].result).toBeOk(Cl.uint(0)); expect(burnResponses[1].result).toBeOk(Cl.bool(true)); @@ -277,7 +277,7 @@ describe(contracts.endpoint, () => { Cl.uint(100e6) ], manager - ), + ), tx.callPublicFn( contracts.endpoint, 'revoke-burn', @@ -356,7 +356,7 @@ describe(contracts.endpoint, () => { 'finalize-mint', [Cl.uint(1)], bot - ), + ), tx.callPublicFn( contracts.endpoint, 'request-burn',