From 1c8fbbe9f2fff26a826593814085ef44af7c8b31 Mon Sep 17 00:00:00 2001 From: fiftyeightandeight Date: Mon, 4 Mar 2024 11:07:09 +0800 Subject: [PATCH] tests integrated --- Clarinet.json | 2 +- Clarinet.toml | 74 +- contracts/boot.clar | 10 +- .../extensions/fastpool-strategy-manager.clar | 4 +- contracts/extensions/lisa-rebase.clar | 7 +- contracts/extensions/lqstx-mint-endpoint.clar | 181 +- .../lqstx-vault.clar} | 16 +- contracts/lisa-dao.clar | 2 +- .../{extensions => }/lqstx-mint-registry.clar | 64 +- contracts/mocks/mock-strategy-manager.clar | 39 + contracts/mocks/mock-strategy.clar | 29 + contracts/mocks/rebase-mock.clar | 19 + contracts/proxies/lisa-transfer-proxy.clar | 2 +- contracts/proxies/lqstx-transfer-proxy.clar | 2 +- contracts/regtest-boot.clar | 19 + .../fastpool/fastpool-strategy.clar | 2 +- contracts/token-lisa.clar | 2 +- contracts/token-lqstx.clar | 128 +- contracts/token-vlqstx.clar | 97 + contracts/token-wlqstx.clar | 157 -- contracts/traits/rebase-strategy-trait.clar | 8 + .../traits/sip-010-extensions-trait.clar | 2 +- contracts/traits/sip-010-trait.clar | 28 +- .../traits/sip-010-transferable-trait.clar | 2 +- contracts/traits/trait-rebase-sip-010.clar | 4 +- contracts/wrapped-tokens/token-wlqstx.clar | 215 ++ deployments/default.simnet-plan.yaml | 371 ++++ pnpm-lock.yaml | 1893 +++++++++++++++++ tests/lqstx-mint-endpoint.test.ts | 466 ++++ 29 files changed, 3491 insertions(+), 354 deletions(-) rename contracts/{vault.clar => extensions/lqstx-vault.clar} (70%) rename contracts/{extensions => }/lqstx-mint-registry.clar (51%) create mode 100644 contracts/mocks/mock-strategy-manager.clar create mode 100644 contracts/mocks/mock-strategy.clar create mode 100644 contracts/mocks/rebase-mock.clar create mode 100644 contracts/regtest-boot.clar create mode 100644 contracts/token-vlqstx.clar delete mode 100644 contracts/token-wlqstx.clar create mode 100644 contracts/traits/rebase-strategy-trait.clar create mode 100644 contracts/wrapped-tokens/token-wlqstx.clar create mode 100644 deployments/default.simnet-plan.yaml create mode 100644 pnpm-lock.yaml create mode 100644 tests/lqstx-mint-endpoint.test.ts diff --git a/Clarinet.json b/Clarinet.json index 9330451..0ca6787 100644 --- a/Clarinet.json +++ b/Clarinet.json @@ -1,5 +1,5 @@ { - "name": "btc-bridge", + "name": "liquid-stacking-testing", "dependencies": { "alex_v1": { "commit": "dev", diff --git a/Clarinet.toml b/Clarinet.toml index d28ce42..0786100 100644 --- a/Clarinet.toml +++ b/Clarinet.toml @@ -20,8 +20,8 @@ epoch = 2.4 path = "contracts/boot.clar" epoch = 2.4 -[contracts.vault] -path = "contracts/vault.clar" +[contracts.lqstx-vault] +path = "contracts/extensions/lqstx-vault.clar" epoch = 2.4 [contracts.treasury] @@ -148,6 +148,10 @@ epoch = 2.4 path = "contracts/traits/sip-010-trait.clar" epoch = 2.4 +[contracts.rebase-strategy-trait] +path = "contracts/traits/rebase-strategy-trait.clar" +epoch = 2.4 + [contracts.sip-010-transferable-trait] path = "contracts/traits/sip-010-transferable-trait.clar" epoch = 2.4 @@ -165,21 +169,25 @@ path = "contracts/extensions/lqstx-mint-endpoint.clar" epoch = 2.4 [contracts.lqstx-mint-registry] -path = "contracts/extensions/lqstx-mint-registry.clar" +path = "contracts/lqstx-mint-registry.clar" epoch = 2.4 [contracts.token-lqstx] path = "contracts/token-lqstx.clar" epoch = 2.4 -[contracts.token-wlqstx] -path = "contracts/token-wlqstx.clar" +[contracts.token-vlqstx] +path = "contracts/token-vlqstx.clar" epoch = 2.4 [contracts.token-lisa] path = "contracts/token-lisa.clar" epoch = 2.4 +[contracts.token-wlqstx] +path = "contracts/wrapped-tokens/token-wlqstx.clar" +epoch = 2.4 + [contracts.lisa-rebase] path = "contracts/extensions/lisa-rebase.clar" epoch = 2.4 @@ -192,6 +200,62 @@ epoch = 2.4 path = "contracts/extensions/operators.clar" epoch = 2.4 +[contracts.rebase-mock] +path = "contracts/mocks/rebase-mock.clar" +epoch = 2.4 + +[contracts.mock-strategy] +path = "contracts/mocks/mock-strategy.clar" +epoch = 2.4 + +[contracts.mock-strategy-manager] +path = "contracts/mocks/mock-strategy-manager.clar" +epoch = 2.4 + +[contracts.regtest-boot] +path = "contracts/regtest-boot.clar" +epoch = 2.4 + +[contracts.amm-swap-pool-v1-1] +path = "contracts_modules/alex_v1/pool/amm-swap-pool-v1-1.clar" +depends_on = ["trait-ownable", "trait-sip-010", "token-amm-swap-pool-v1-1"] + +[contracts.token-amm-swap-pool-v1-1] +path = "contracts_modules/alex_v1/pool-token/token-amm-swap-pool-v1-1.clar" +depends_on = ["trait-ownable", "trait-semi-fungible", "alex-vault-v1-1"] + +[contracts.alex-vault-v1-1] +path = "contracts_modules/alex_v1/alex-vault-v1-1.clar" +depends_on = [ + "trait-vault", + "trait-sip-010", + "trait-flash-loan-user", + "trait-ownable", + "trait-semi-fungible" +] + +[contracts.trait-vault] +path = "contracts_modules/alex_v1/traits/trait-vault.clar" +depends_on = ["trait-sip-010", "trait-flash-loan-user"] + +[contracts.trait-ownable] +path = "contracts_modules/alex_v1/traits/trait-ownable.clar" +depends_on = [] + +[contracts.trait-flash-loan-user] +path = "contracts_modules/alex_v1/traits/trait-flash-loan-user.clar" +depends_on = ["trait-sip-010"] + +[contracts.trait-semi-fungible] +path = "contracts_modules/alex_v1/traits/trait-semi-fungible.clar" +depends_on = [] + +[contracts.token-wstx] +path = "contracts_modules/alex_v1/wrapped-token/token-wstx.clar" + +[contracts.trait-sip-010] +path = "contracts_modules/alex_v1/traits/trait-sip-010.clar" + # [repl.analysis] # passes = ["check_checker"] # check_checker = { trusted_sender = false, trusted_caller = false, callee_filter = false } diff --git a/contracts/boot.clar b/contracts/boot.clar index bae38a7..bdcf5f8 100644 --- a/contracts/boot.clar +++ b/contracts/boot.clar @@ -2,18 +2,16 @@ (define-public (execute (sender principal)) (begin - ;; Enable core contracts (try! (contract-call? .lisa-dao set-extensions (list {extension: .lqstx-mint-endpoint, enabled: true} - {extension: .lqstx-mint-registry, enabled: true} - {extension: .vault, enabled: true} + {extension: .lqstx-vault, enabled: true} {extension: .treasury, enabled: true} {extension: .fastpool-strategy-manager, enabled: true} {extension: .lisa-rebase, enabled: true} {extension: .rebase-1, enabled: true} - {extension: .operators, enabled: true} + {extension: .operators, enabled: true} ))) - + ;; Set initial operators (try! (contract-call? .operators set-operators (list {operator: tx-sender, enabled: true} @@ -29,7 +27,7 @@ ;; Mint initial LISA token supply (try! (contract-call? .token-lisa dao-mint-many (list {recipient: .treasury, amount: u100000000000000} - ))) + ))) (ok true) ) ) diff --git a/contracts/extensions/fastpool-strategy-manager.clar b/contracts/extensions/fastpool-strategy-manager.clar index 2ba92c8..56cee5e 100644 --- a/contracts/extensions/fastpool-strategy-manager.clar +++ b/contracts/extensions/fastpool-strategy-manager.clar @@ -14,14 +14,14 @@ (define-public (fund-strategy (amounts (list 20 uint))) (begin (asserts! (is-authorised-manager tx-sender) err-unauthorised) - (contract-call? .vault fund-strategy .fastpool-strategy (unwrap-panic (to-consensus-buff? amounts))) + (contract-call? .lqstx-vault fund-strategy .fastpool-strategy (unwrap-panic (to-consensus-buff? amounts))) ) ) (define-public (refund-strategy (selection (list 20 bool))) (begin (asserts! (is-authorised-manager tx-sender) err-unauthorised) - (contract-call? .vault refund-strategy .fastpool-strategy (unwrap-panic (to-consensus-buff? selection))) + (contract-call? .lqstx-vault refund-strategy .fastpool-strategy (unwrap-panic (to-consensus-buff? selection))) ) ) diff --git a/contracts/extensions/lisa-rebase.clar b/contracts/extensions/lisa-rebase.clar index 617162e..c7463d3 100644 --- a/contracts/extensions/lisa-rebase.clar +++ b/contracts/extensions/lisa-rebase.clar @@ -11,9 +11,12 @@ ) (define-public (rebase (strategies (list 20 ))) - (let ((total-stx (+ (stx-get-balance .vault) (try! (fold sum-strategy-amounts strategies (ok u0)))))) + (let ((total-stx (- (+ (stx-get-balance .lqstx-vault) (try! (fold sum-strategy-amounts strategies (ok u0)))) (contract-call? .lqstx-mint-endpoint get-mint-requests-pending-amount)))) (try! (is-dao-or-extension)) - (try! (contract-call? .token-lqstx set-reward-multiplier-from-balance total-stx)) + (as-contract (try! (contract-call? .token-lqstx set-reserve total-stx))) (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 c0c8896..fd455d2 100644 --- a/contracts/extensions/lqstx-mint-endpoint.clar +++ b/contracts/extensions/lqstx-mint-endpoint.clar @@ -1,7 +1,8 @@ ;; ;; lqstx-mint-endpoint ;; -(use-trait sip-010-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait) +(use-trait sip-010-trait .sip-010-trait.sip-010-trait) +(use-trait rebase-strategy-trait .rebase-strategy-trait.rebase-strategy-trait) (define-constant err-unauthorised (err u1000)) (define-constant err-paused (err u1001)) @@ -12,7 +13,14 @@ (define-constant FINALIZED 0x01) (define-constant REVOKED 0x02) +(define-constant max-uint u340282366920938463463374607431768211455) + (define-data-var paused bool true) +(define-data-var mint-delay uint u144) ;; mint available 1 day after cycle starts + +;; @dev test only +(define-data-var activation-block uint u0) +(define-data-var reward-cycle-length uint u2016) ;; 2 weeks ;; read-only calls @@ -31,90 +39,175 @@ (define-read-only (get-burn-request-or-fail (request-id uint)) (contract-call? .lqstx-mint-registry get-burn-request-or-fail request-id)) -(define-read-only (get-rewards-paid-upto) - (contract-call? .lqstx-mint-registry get-rewards-paid-upto)) +(define-read-only (get-mint-requests-pending-or-default (user principal)) + (contract-call? .lqstx-mint-registry get-mint-requests-pending-or-default user)) + +(define-read-only (get-burn-requests-pending-or-default (user principal)) + (contract-call? .lqstx-mint-registry get-burn-requests-pending-or-default user)) + +(define-read-only (get-mint-requests-pending-amount) + (contract-call? .lqstx-mint-registry get-mint-requests-pending-amount)) + +(define-read-only (get-mint-request-or-fail-many (request-ids (list 1000 uint))) + (ok (map get-mint-request-or-fail request-ids))) + +(define-read-only (get-burn-request-or-fail-many (request-ids (list 1000 uint))) + (ok (map get-burn-request-or-fail request-ids))) (define-read-only (validate-mint-request (request-id uint)) (let ( - (request-details (try! (contract-call? .lqstx-mint-registry get-mint-request-or-fail request-id)))) - (asserts! (>= (get-rewards-paid-upto) (get requested-at request-details)) err-request-pending) - (asserts! (is-eq PENDING (get status request-details)) err-request-finalized-or-revoked) - (ok true))) + (request-details (try! (contract-call? .lqstx-mint-registry get-mint-request-or-fail request-id))) + (request-id-idx (unwrap! (index-of? (get-mint-requests-pending-or-default (get requested-by request-details)) request-id) err-request-finalized-or-revoked))) + (asserts! (>= block-height (+ (get-first-stacks-block-in-reward-cycle (+ (get requested-at request-details) u1)) (var-get mint-delay))) err-request-pending) + (ok request-id-idx))) ;; @dev it favours smaller amounts as we do not allow partial burn (define-read-only (validate-burn-request (request-id uint)) (let ( (request-details (try! (contract-call? .lqstx-mint-registry get-burn-request-or-fail request-id))) - (vaulted-amount (unwrap-panic (contract-call? .token-wlqstx get-shares-to-tokens (get amount request-details)))) - (balance (stx-account .vault))) - (asserts! (>= (* (get unlocked balance) u100) vaulted-amount) err-request-pending) - (asserts! (is-eq PENDING (get status request-details)) err-request-finalized-or-revoked) - (ok { vaulted-amount: vaulted-amount, balance: balance }))) + (request-id-idx (unwrap! (index-of? (get-burn-requests-pending-or-default (get requested-by request-details)) request-id) err-request-finalized-or-revoked)) + (vaulted-amount (contract-call? .token-vlqstx get-shares-to-tokens (get wrapped-amount request-details)))) + (asserts! (>= (stx-get-balance .lqstx-vault) vaulted-amount) err-request-pending) + (ok { vaulted-amount: vaulted-amount, request-id-idx: request-id-idx }))) +;; @dev test only +(define-read-only (get-reward-cycle (stacks-height uint)) + ;; (contract-call? 'SP000000000000000000002Q6VF78.pox-3 current-pox-reward-cycle)) + (if (>= stacks-height (var-get activation-block)) + (some (/ (- stacks-height (var-get activation-block)) (var-get reward-cycle-length))) + none)) + + +;; TODO: re-write based on POX +(define-read-only (get-first-stacks-block-in-reward-cycle (reward-cycle uint)) + (+ (var-get activation-block) (* (var-get reward-cycle-length) reward-cycle))) + +(define-read-only (get-mint-delay) + (var-get mint-delay)) + +;; governance calls (define-public (set-paused (new-paused bool)) - (begin + (begin (try! (is-dao-or-extension)) (ok (var-set paused new-paused)))) - + +(define-public (set-mint-delay (new-delay uint)) + (begin + (try! (is-dao-or-extension)) + (ok (var-set mint-delay new-delay)))) + +;; @dev test only +(define-public (set-reward-cycle-length (new-reward-cycle-length uint)) + (begin + (try! (is-dao-or-extension)) + (ok (var-set reward-cycle-length new-reward-cycle-length)))) + ;; public calls ;; @dev the requestor stx is held by the contract until mint can be finalized. -(define-public (request-mint (amount-in-fixed uint)) +(define-public (request-mint (amount uint)) (let ( - (cycle (contract-call? 'SP000000000000000000002Q6VF78.pox-3 current-pox-reward-cycle)) - (request-details { requested-by: tx-sender, amount: amount-in-fixed, requested-at: cycle, status: PENDING }) + (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))))) (try! (is-paused-or-fail)) - (try! (stx-transfer? (/ amount-in-fixed u100) tx-sender .lqstx-mint-registry)) - (print { type: "mint-request", id: request-id, details: request-details}) + (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))))) + (print { type: "mint-request", id: request-id, details: request-details }) (ok request-id))) (define-public (finalize-mint (request-id uint)) (let ( - (request-details (try! (get-mint-request-or-fail request-id)))) + (request-details (try! (get-mint-request-or-fail request-id))) + (mint-requests (get-mint-requests-pending-or-default (get requested-by request-details))) + (request-id-idx (try! (validate-mint-request request-id)))) (try! (is-paused-or-fail)) - (try! (validate-mint-request request-id)) - (as-contract (try! (contract-call? .lqstx-mint-registry stx-transfer (/ (get amount request-details) u100) .vault))) - (as-contract (try! (contract-call? .token-lqstx dao-mint-fixed (get amount request-details) (get requested-by request-details)))) - (as-contract (contract-call? .lqstx-mint-registry set-mint-request request-id (merge request-details { status: FINALIZED }))))) + (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)))) + (ok true))) + +(define-public (finalize-mint-many (request-ids (list 1000 uint))) + (fold check-err (map finalize-mint request-ids) (ok true))) (define-public (revoke-mint (request-id uint)) (let ( - (request-details (try! (get-mint-request-or-fail request-id)))) + (request-details (try! (get-mint-request-or-fail request-id))) + (mint-requests (get-mint-requests-pending-or-default (get requested-by request-details))) + (request-id-idx (unwrap! (index-of? mint-requests request-id) err-request-finalized-or-revoked))) (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-mint-registry stx-transfer (/ (get amount request-details) u100) (get requested-by request-details)))) - (as-contract (contract-call? .lqstx-mint-registry set-mint-request request-id (merge request-details { status: REVOKED }))))) + (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)))) + (ok true))) -(define-public (request-burn (amount-in-fixed uint)) +(define-public (request-burn (amount uint) (rebase-trait )) (let ( + (sender tx-sender) ;; @dev requested-at not used for burn - (cycle (contract-call? 'SP000000000000000000002Q6VF78.pox-3 current-pox-reward-cycle)) - (request-details { requested-by: tx-sender, amount: amount-in-fixed, requested-at: cycle, status: PENDING }) + (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))))) (try! (is-paused-or-fail)) - (try! (contract-call? .token-wlqstx mint-fixed amount-in-fixed tx-sender)) - (try! (contract-call? .token-wlqstx transfer-fixed amount-in-fixed tx-sender .lqstx-mint-registry none)) - (print { type: "burn-request", id: request-id, details: request-details }) - (ok request-id))) + (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))))) + (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 }))))) (define-public (finalize-burn (request-id uint)) (let ( (request-details (try! (get-burn-request-or-fail request-id))) - (transfer-wlqstx (as-contract (try! (contract-call? .lqstx-mint-registry transfer-fixed (get amount request-details) tx-sender .token-wlqstx)))) + (transfer-vlqstx (as-contract (try! (contract-call? .lqstx-mint-registry transfer (get wrapped-amount request-details) 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! (contract-call? .token-wlqstx burn-fixed (get amount request-details) tx-sender)) - (try! (contract-call? .token-lqstx dao-burn-fixed (get vaulted-amount validation-data) tx-sender)) - (as-contract (try! (contract-call? .vault proxy-call .stx-transfer-proxy (unwrap-panic (to-consensus-buff? { ustx: (/ (get vaulted-amount validation-data) u100), recipient: (get requested-by request-details) }))))) - (as-contract (contract-call? .lqstx-mint-registry set-burn-request request-id (merge request-details { status: FINALIZED }))))) + (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))))) + (ok true))) + +(define-public (finalize-burn-many (request-ids (list 1000 uint))) + (fold check-err (map finalize-burn request-ids) (ok true))) (define-public (revoke-burn (request-id uint)) (let ( - (request-details (try! (get-burn-request-or-fail request-id)))) + (request-details (try! (get-burn-request-or-fail request-id))) + (burn-requests (get-burn-requests-pending-or-default (get requested-by request-details))) + (request-id-idx (unwrap! (index-of? burn-requests request-id) err-request-finalized-or-revoked)) + (lqstx-amount (contract-call? .token-vlqstx get-shares-to-tokens (get wrapped-amount request-details)))) (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) - (try! (contract-call? .token-wlqstx burn-fixed (get amount request-details) tx-sender)) - (as-contract (contract-call? .token-lqstx transfer-fixed (unwrap-panic (contract-call? .token-wlqstx get-shares-to-tokens (get amount request-details))) tx-sender (get requested-by request-details) none)))) + (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)))) + (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 + err-value (err err-value))) + +(define-private (pop (target (list 1000 uint)) (idx uint)) + (match (slice? target (+ idx u1) (len target)) + some-value (unwrap-panic (as-max-len? (concat (unwrap-panic (slice? target u0 idx)) some-value) u1000)) + (unwrap-panic (slice? target u0 idx)))) + diff --git a/contracts/vault.clar b/contracts/extensions/lqstx-vault.clar similarity index 70% rename from contracts/vault.clar rename to contracts/extensions/lqstx-vault.clar index a030252..a120a6d 100644 --- a/contracts/vault.clar +++ b/contracts/extensions/lqstx-vault.clar @@ -6,20 +6,21 @@ (define-constant err-unauthorised (err u1000)) (define-read-only (is-dao-or-extension) - (ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised)) -) + (ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised))) + +;; privileged calls (define-public (fund-strategy (strategy ) (payload (buff 2048))) - (let ((amount-taken (try! (as-contract (contract-call? strategy execute payload))))) + (begin (try! (is-dao-or-extension)) - (ok amount-taken) + (as-contract (contract-call? strategy execute payload)) ) ) (define-public (refund-strategy (strategy ) (payload (buff 2048))) - (let ((amount-refunded (try! (as-contract (contract-call? strategy refund payload))))) + (begin (try! (is-dao-or-extension)) - (ok amount-refunded) + (as-contract (contract-call? strategy refund payload)) ) ) @@ -29,3 +30,6 @@ (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/lisa-dao.clar b/contracts/lisa-dao.clar index 1b3ffcf..e24d2ba 100644 --- a/contracts/lisa-dao.clar +++ b/contracts/lisa-dao.clar @@ -78,4 +78,4 @@ (asserts! (is-eq contract-caller (contract-of extension)) err-invalid-extension) (as-contract (contract-call? extension callback sender payload)) ) -) +) \ No newline at end of file diff --git a/contracts/extensions/lqstx-mint-registry.clar b/contracts/lqstx-mint-registry.clar similarity index 51% rename from contracts/extensions/lqstx-mint-registry.clar rename to contracts/lqstx-mint-registry.clar index 246db7a..d3917f6 100644 --- a/contracts/extensions/lqstx-mint-registry.clar +++ b/contracts/lqstx-mint-registry.clar @@ -2,8 +2,7 @@ ;; lqstx-mint-registry ;; -(use-trait sip-010-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait) -(use-trait sip-010-extensions-trait .sip-010-extensions-trait.sip-010-extensions-trait) +(use-trait sip-010-trait .sip-010-trait.sip-010-trait) (define-constant err-unauthorised (err u1000)) (define-constant err-unknown-request-id (err u1008)) @@ -12,25 +11,21 @@ (define-constant FINALIZED 0x01) (define-constant REVOKED 0x02) -(define-data-var rewards-paid-upto uint u0) - (define-data-var mint-request-nonce uint u0) (define-data-var burn-request-nonce uint u0) (define-map mint-requests uint { requested-by: principal, amount: uint, requested-at: uint, status: (buff 1) }) -(define-map burn-requests uint { requested-by: principal, amount: uint, requested-at: uint, status: (buff 1) }) +(define-map burn-requests uint { requested-by: principal, amount: uint, wrapped-amount: uint, requested-at: uint, status: (buff 1) }) + +(define-map mint-requests-pending principal (list 1000 uint)) +(define-map burn-requests-pending principal (list 1000 uint)) + +(define-data-var mint-requests-pending-amount uint u0) ;; read-only calls (define-read-only (is-dao-or-extension) (ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised))) - -(define-read-only (get-pending) PENDING) -(define-read-only (get-finalized) FINALIZED) -(define-read-only (get-revoked) REVOKED) - -(define-read-only (get-rewards-paid-upto) - (var-get rewards-paid-upto)) (define-read-only (get-mint-request-nonce) (var-get mint-request-nonce)) @@ -44,39 +39,56 @@ (define-read-only (get-burn-request-or-fail (request-id uint)) (ok (unwrap! (map-get? burn-requests request-id) err-unknown-request-id))) -;; governance calls +(define-read-only (get-mint-requests-pending-or-default (user principal)) + (default-to (list ) (map-get? mint-requests-pending user))) -;; @dev this should be called after all strategies paid rewards for the relevant cycle -(define-public (set-rewards-paid-upto (cycle uint) (vault-balance uint)) - (begin - (try! (is-dao-or-extension)) - (try! (contract-call? .token-lqstx set-reward-multiplier vault-balance)) - (ok (var-set rewards-paid-upto cycle)))) +(define-read-only (get-burn-requests-pending-or-default (user principal)) + (default-to (list ) (map-get? burn-requests-pending user))) + +(define-read-only (get-mint-requests-pending-amount) + (var-get mint-requests-pending-amount)) + +;; governance calls (define-public (set-mint-request (request-id uint) (details { requested-by: principal, amount: uint, requested-at: uint, status: (buff 1) })) (let ( - (current-nonce (var-get mint-request-nonce)) - (id (if (is-some (map-get? mint-requests request-id)) request-id (begin (var-set mint-request-nonce (+ current-nonce u1)) current-nonce))) + (next-nonce (+ (var-get mint-request-nonce) u1)) + (id (if (is-some (map-get? mint-requests request-id)) request-id (begin (var-set mint-request-nonce next-nonce) next-nonce))) ) (try! (is-dao-or-extension)) (map-set mint-requests id details) (ok id))) -(define-public (set-burn-request (request-id uint) (details { requested-by: principal, amount: uint, requested-at: uint, status: (buff 1) })) +(define-public (set-burn-request (request-id uint) (details { requested-by: principal, amount: uint, wrapped-amount: uint, requested-at: uint, status: (buff 1) })) (let ( - (current-nonce (var-get burn-request-nonce)) - (id (if (is-some (map-get? burn-requests request-id)) request-id (begin (var-set burn-request-nonce (+ current-nonce u1)) current-nonce))) + (next-nonce (+ (var-get burn-request-nonce) u1)) + (id (if (is-some (map-get? burn-requests request-id)) request-id (begin (var-set burn-request-nonce next-nonce) next-nonce))) ) (try! (is-dao-or-extension)) (map-set burn-requests id details) (ok id))) -(define-public (transfer-fixed (amount uint) (recipient principal) (token-trait )) +(define-public (set-mint-requests-pending (requested-by principal) (new-list (list 1000 uint))) + (begin + (try! (is-dao-or-extension)) + (ok (map-set mint-requests-pending requested-by new-list)))) + +(define-public (set-burn-requests-pending (requested-by principal) (new-list (list 1000 uint))) + (begin + (try! (is-dao-or-extension)) + (ok (map-set burn-requests-pending requested-by new-list)))) + +(define-public (set-mint-requests-pending-amount (new-amount uint)) + (begin + (try! (is-dao-or-extension)) + (ok (var-set mint-requests-pending-amount new-amount)))) + +(define-public (transfer (amount uint) (recipient principal) (token-trait )) (begin (try! (is-dao-or-extension)) - (as-contract (contract-call? token-trait transfer-fixed amount tx-sender recipient none)))) + (as-contract (contract-call? token-trait transfer amount tx-sender recipient none)))) (define-public (stx-transfer (amount uint) (recipient principal)) (begin diff --git a/contracts/mocks/mock-strategy-manager.clar b/contracts/mocks/mock-strategy-manager.clar new file mode 100644 index 0000000..72bf967 --- /dev/null +++ b/contracts/mocks/mock-strategy-manager.clar @@ -0,0 +1,39 @@ +(impl-trait .extension-trait.extension-trait) + +(define-constant err-unauthorised (err u1000)) + +(define-map authorised-managers principal bool) +(map-set authorised-managers tx-sender true) + +(define-read-only (is-dao-or-extension) + (ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised)) +) + +(define-read-only (is-authorised-manager (who principal)) + (default-to false (map-get? authorised-managers who)) +) + +(define-public (fund-strategy (amount uint)) + (begin + (asserts! (is-authorised-manager tx-sender) err-unauthorised) + (as-contract (contract-call? .lqstx-vault fund-strategy .mock-strategy (contract-call? .mock-strategy create-payload amount))) + ) +) + +(define-public (refund-strategy (amount uint)) + (begin + (asserts! (is-authorised-manager tx-sender) err-unauthorised) + (as-contract (contract-call? .lqstx-vault refund-strategy .mock-strategy (contract-call? .mock-strategy create-payload amount))) + ) +) + +(define-public (set-authorised-manager (who principal) (enabled bool)) + (begin + (try! (is-dao-or-extension)) + (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/mocks/mock-strategy.clar b/contracts/mocks/mock-strategy.clar new file mode 100644 index 0000000..ed185b6 --- /dev/null +++ b/contracts/mocks/mock-strategy.clar @@ -0,0 +1,29 @@ +(impl-trait .strategy-trait.strategy-trait) + +(define-constant err-unauthorised (err u1000)) + +(define-read-only (is-dao-or-extension) + (ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised))) + +(define-read-only (create-payload (amount uint)) + (unwrap-panic (to-consensus-buff? amount))) + +;; governance calls + +(define-public (execute (payload (buff 2048))) + (let ( + (amount (unwrap-panic (from-consensus-buff? uint payload)))) + (try! (is-dao-or-extension)) + (try! (stx-transfer? amount tx-sender (as-contract tx-sender))) + (ok amount))) + +(define-public (refund (payload (buff 2048))) + (let ( + (sender tx-sender) + (amount (unwrap-panic (from-consensus-buff? uint payload)))) + (try! (is-dao-or-extension)) + (as-contract (try! (stx-transfer? amount tx-sender sender))) + (ok amount))) + +(define-read-only (get-amount-in-strategy) + (ok (stx-get-balance (as-contract tx-sender)))) \ No newline at end of file diff --git a/contracts/mocks/rebase-mock.clar b/contracts/mocks/rebase-mock.clar new file mode 100644 index 0000000..db37e5a --- /dev/null +++ b/contracts/mocks/rebase-mock.clar @@ -0,0 +1,19 @@ +(define-public (rebase) + (as-contract (contract-call? .lisa-rebase rebase (list .mock-strategy)))) + +(define-public (finalize-mint (request-id uint)) + (begin + (try! (rebase)) + (as-contract (try! (contract-call? .lqstx-mint-endpoint finalize-mint request-id))) + (try! (rebase)) + (ok true))) + +(define-public (finalize-burn (request-id uint)) + (begin + (try! (rebase)) + (as-contract (try! (contract-call? .lqstx-mint-endpoint finalize-burn request-id))) + (try! (rebase)) + (ok true))) + +(define-public (callback (extension principal) (payload (buff 2048))) + (ok true)) \ No newline at end of file diff --git a/contracts/proxies/lisa-transfer-proxy.clar b/contracts/proxies/lisa-transfer-proxy.clar index 53b1574..d15eadc 100644 --- a/contracts/proxies/lisa-transfer-proxy.clar +++ b/contracts/proxies/lisa-transfer-proxy.clar @@ -3,7 +3,7 @@ (define-constant err-invalid-payload (err u4000)) (define-public (proxy-call (payload (buff 2048))) - (let ((decoded (unwrap! (from-consensus-buff? { amount: uint, recipient: principal, memo: (optional (buff 34)) } payload) err-invalid-payload))) + (let ((decoded (unwrap! (from-consensus-buff? { amount: uint, recipient: principal, memo: (optional (buff 2048)) } payload) err-invalid-payload))) (contract-call? .token-lisa transfer (get amount decoded) tx-sender (get recipient decoded) (get memo decoded)) ) ) diff --git a/contracts/proxies/lqstx-transfer-proxy.clar b/contracts/proxies/lqstx-transfer-proxy.clar index fef18dd..83634e6 100644 --- a/contracts/proxies/lqstx-transfer-proxy.clar +++ b/contracts/proxies/lqstx-transfer-proxy.clar @@ -3,7 +3,7 @@ (define-constant err-invalid-payload (err u4000)) (define-public (proxy-call (payload (buff 2048))) - (let ((decoded (unwrap! (from-consensus-buff? { amount: uint, recipient: principal, memo: (optional (buff 34)) } payload) err-invalid-payload))) + (let ((decoded (unwrap! (from-consensus-buff? { amount: uint, recipient: principal, memo: (optional (buff 2048)) } payload) err-invalid-payload))) (contract-call? .token-lqstx transfer (get amount decoded) tx-sender (get recipient decoded) (get memo decoded)) ) ) diff --git a/contracts/regtest-boot.clar b/contracts/regtest-boot.clar new file mode 100644 index 0000000..ca5e88d --- /dev/null +++ b/contracts/regtest-boot.clar @@ -0,0 +1,19 @@ +(impl-trait .proposal-trait.proposal-trait) + +(define-public (execute (sender principal)) + (begin + (try! (contract-call? .lisa-dao set-extensions (list + {extension: .lqstx-mint-endpoint, enabled: true} + {extension: .lisa-rebase, enabled: true} + {extension: .rebase-mock, enabled: true} + {extension: .mock-strategy-manager, enabled: true} + {extension: .lqstx-vault, enabled: true} + ))) + (try! (contract-call? .lqstx-mint-endpoint set-paused false)) + (try! (contract-call? .lqstx-mint-endpoint set-reward-cycle-length u200)) + (try! (contract-call? .lqstx-mint-endpoint set-mint-delay u14)) + (try! (contract-call? .mock-strategy-manager set-authorised-manager 'ST2QXSK64YQX3CQPC530K79XWQ98XFAM9W3XKEH3N true)) + (try! (contract-call? .mock-strategy-manager set-authorised-manager 'ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND true)) + (ok true) + ) +) diff --git a/contracts/strategies/fastpool/fastpool-strategy.clar b/contracts/strategies/fastpool/fastpool-strategy.clar index 09a5fdf..db3c1ca 100644 --- a/contracts/strategies/fastpool/fastpool-strategy.clar +++ b/contracts/strategies/fastpool/fastpool-strategy.clar @@ -19,7 +19,7 @@ ) (define-read-only (is-vault-caller) - (ok (asserts! (is-eq tx-sender .vault) err-not-vault-caller)) + (ok (asserts! (is-eq tx-sender .lqstx-vault) err-not-vault-caller)) ) (define-private (process-strategy (amount uint) (member )) diff --git a/contracts/token-lisa.clar b/contracts/token-lisa.clar index 4492db2..c516f5d 100644 --- a/contracts/token-lisa.clar +++ b/contracts/token-lisa.clar @@ -80,7 +80,7 @@ ;; sip010-ft-trait -(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34)))) +(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 2048)))) (begin (asserts! (or (is-eq tx-sender sender) (is-eq contract-caller sender)) err-not-token-owner) (ft-transfer? lisa amount sender recipient) diff --git a/contracts/token-lqstx.clar b/contracts/token-lqstx.clar index 07bc0f6..11335b4 100644 --- a/contracts/token-lqstx.clar +++ b/contracts/token-lqstx.clar @@ -1,19 +1,18 @@ ;; lqstx ;; -(impl-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait) - -(define-constant err-unauthorised (err u3000)) -(define-constant ONE_8 u100000000) (define-fungible-token lqstx) +(define-constant err-unauthorised (err u3000)) +(define-constant err-invalid-amount (err u3001)) + (define-data-var token-name (string-ascii 32) "lqstx") (define-data-var token-symbol (string-ascii 10) "lqstx") (define-data-var token-uri (optional (string-utf8 256)) (some u"https://cdn.alexlab.co/metadata/token-lqstx.json")) -(define-data-var token-decimals uint u8) +(define-data-var token-decimals uint u6) -(define-data-var reward-multiplier uint ONE_8) +(define-data-var reserve uint u0) ;; governance functions @@ -25,9 +24,7 @@ (define-public (dao-set-symbol (new-symbol (string-ascii 10))) (begin (try! (is-dao-or-extension)) - (ok (var-set token-symbol new-symbol)) - ) -) + (ok (var-set token-symbol new-symbol)))) (define-public (dao-set-decimals (new-decimals uint)) (begin @@ -39,54 +36,38 @@ (try! (is-dao-or-extension)) (ok (var-set token-uri new-uri)))) -(define-public (set-reward-multiplier-from-balance (balance uint)) +;; privileged calls + +(define-public (set-reserve (new-reserve uint)) (begin (try! (is-dao-or-extension)) - (ok (var-set reward-multiplier (/ balance (ft-get-supply lqstx)))) - ) -) + (ok (var-set reserve new-reserve)))) -(define-public (set-reward-multiplier (new-multiplier uint)) +(define-public (add-reserve (increment uint)) + (set-reserve (+ (var-get reserve) increment))) + +(define-public (remove-reserve (decrement uint)) (begin - (try! (is-dao-or-extension)) - (ok (var-set reward-multiplier new-multiplier)) - ) -) - -(define-public (add-reward-multiplier (increment uint)) - (set-reward-multiplier (+ (var-get reward-multiplier) increment)) -) + (asserts! (<= decrement (var-get reserve)) err-invalid-amount) + (set-reserve (- (var-get reserve) decrement)))) (define-public (dao-mint (amount uint) (recipient principal)) (begin (try! (is-dao-or-extension)) - (ft-mint? lqstx (unwrap-panic (get-tokens-to-shares amount)) recipient))) - -(define-public (dao-mint-fixed (amount uint) (recipient principal)) - (begin - (try! (is-dao-or-extension)) - (ft-mint? lqstx (fixed-to-decimals (unwrap-panic (get-tokens-to-shares amount))) recipient))) - -(define-public (dao-burn-fixed (amount uint) (sender principal)) - (begin - (try! (is-dao-or-extension)) - (ft-burn? lqstx (fixed-to-decimals (unwrap-panic (get-tokens-to-shares amount))) sender))) + (ft-mint? lqstx (get-tokens-to-shares amount) recipient))) (define-public (dao-burn (amount uint) (sender principal)) (begin (try! (is-dao-or-extension)) - (ft-burn? lqstx (unwrap-panic (get-tokens-to-shares amount)) sender))) + (ft-burn? lqstx (get-tokens-to-shares amount) sender))) -(define-public (dao-burn-fixed-many (senders (list 200 {amount: uint, sender: principal}))) - (begin - (try! (is-dao-or-extension)) - (ok (map dao-burn-fixed-many-iter senders)))) +(define-public (burn-many (senders (list 200 {amount: uint, sender: principal}))) + (fold check-err (map dao-burn-many-iter senders) (ok true))) ;; read-only functions (define-read-only (is-dao-or-extension) - (ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised)) -) + (ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised))) (define-read-only (get-name) (ok (var-get token-name))) @@ -94,69 +75,52 @@ (define-read-only (get-symbol) (ok (var-get token-symbol))) +(define-read-only (get-token-uri) + (ok (var-get token-uri))) + (define-read-only (get-decimals) (ok (var-get token-decimals))) (define-read-only (get-balance (who principal)) - (get-shares-to-tokens (get-shares who))) + (ok (get-shares-to-tokens (unwrap-panic (get-share who))))) (define-read-only (get-total-supply) - (get-shares-to-tokens (get-total-shares))) + (get-reserve)) -(define-read-only (get-token-uri) - (ok (var-get token-uri))) - -(define-read-only (get-shares (who principal)) - (ft-get-balance lqstx who)) +(define-read-only (get-share (who principal)) + (ok (ft-get-balance lqstx who))) (define-read-only (get-total-shares) - (ft-get-supply lqstx)) + (ok (ft-get-supply lqstx))) +;; TODO this can be attacked - need to check (define-read-only (get-tokens-to-shares (amount uint)) - (ok (div-down amount (var-get reward-multiplier)))) + (if (is-eq (get-reserve) (ok u0)) + amount + (/ (* amount (unwrap-panic (get-total-shares))) (unwrap-panic (get-reserve))))) +;; TODO this can be attacked - need to check (define-read-only (get-shares-to-tokens (shares uint)) - (ok (mul-down shares (var-get reward-multiplier)))) + (if (is-eq (get-total-shares) (ok u0)) + shares + (/ (* shares (unwrap-panic (get-reserve))) (unwrap-panic (get-total-shares))))) -(define-read-only (get-reward-multiplier) - (ok (var-get reward-multiplier))) - -(define-read-only (get-total-supply-fixed) - (ok (decimals-to-fixed (unwrap-panic (get-total-supply))))) - -(define-read-only (get-balance-fixed (account principal)) - (ok (decimals-to-fixed (unwrap-panic (get-balance account))))) +(define-read-only (get-reserve) + (ok (var-get reserve))) ;; public calls -(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34)))) - (transfer-fixed (decimals-to-fixed amount) sender recipient memo)) - -(define-public (transfer-fixed (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34)))) +(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 2048)))) (begin - (asserts! (or (is-eq sender contract-caller) (is-eq sender tx-sender)) err-unauthorised) - (try! (ft-transfer? lqstx (fixed-to-decimals (unwrap-panic (get-tokens-to-shares amount))) sender recipient)) + (asserts! (is-eq sender tx-sender) err-unauthorised) + (try! (ft-transfer? lqstx (get-tokens-to-shares amount) sender recipient)) (match memo to-print (print to-print) 0x) (ok true))) ;; private functions -(define-private (dao-burn-fixed-many-iter (item {amount: uint, sender: principal})) - (dao-burn-fixed (get amount item) (get sender item))) +(define-private (dao-burn-many-iter (item {amount: uint, sender: principal})) + (dao-burn (get amount item) (get sender item))) -(define-private (pow-decimals) - (pow u10 (unwrap-panic (get-decimals)))) - -(define-private (decimals-to-fixed (amount uint)) - (/ (* amount ONE_8) (pow-decimals))) - -(define-private (fixed-to-decimals (amount uint)) - (/ (* amount (pow-decimals)) ONE_8)) - -(define-private (mul-down (a uint) (b uint)) - (/ (* a b) ONE_8)) - -(define-private (div-down (a uint) (b uint)) - (if (is-eq a u0) - u0 - (/ (* a ONE_8) b))) +(define-private (check-err (result (response bool uint)) (prior (response bool uint))) + (match prior ok-value result err-value (err err-value))) diff --git a/contracts/token-vlqstx.clar b/contracts/token-vlqstx.clar new file mode 100644 index 0000000..e425508 --- /dev/null +++ b/contracts/token-vlqstx.clar @@ -0,0 +1,97 @@ +;; vlqstx + +(define-fungible-token vlqstx) + +(define-constant err-unauthorised (err u3000)) + +(define-data-var token-name (string-ascii 32) "vlqstx") +(define-data-var token-symbol (string-ascii 10) "vlqstx") +(define-data-var token-uri (optional (string-utf8 256)) (some u"https://cdn.alexlab.co/metadata/vlqstx.json")) + +(define-data-var token-decimals uint u6) + +;; governance functions + +(define-public (set-name (new-name (string-ascii 32))) + (begin + (try! (is-dao-or-extension)) + (ok (var-set token-name new-name)))) + +(define-public (set-symbol (new-symbol (string-ascii 10))) + (begin + (try! (is-dao-or-extension)) + (ok (var-set token-symbol new-symbol)) + ) +) + +(define-public (set-decimals (new-decimals uint)) + (begin + (try! (is-dao-or-extension)) + (ok (var-set token-decimals new-decimals)))) + +(define-public (set-token-uri (new-uri (optional (string-utf8 256)))) + (begin + (try! (is-dao-or-extension)) + (ok (var-set token-uri new-uri)))) + +;; public functions + +(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 2048)))) + (begin + (asserts! (is-eq sender tx-sender) err-unauthorised) + (try! (ft-transfer? vlqstx amount sender recipient)) + (match memo to-print (print to-print) 0x) + (ok true))) + +(define-public (mint (amount uint) (recipient principal)) + (begin + (asserts! (is-eq recipient tx-sender) 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) + (as-contract (try! (contract-call? .token-lqstx transfer (get-shares-to-tokens amount) tx-sender sender none))) + (ft-burn? vlqstx amount sender))) + +;; read-only functions + +(define-read-only (is-dao-or-extension) + (ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised))) + +(define-read-only (get-name) + (ok (var-get token-name))) + +(define-read-only (get-symbol) + (ok (var-get token-symbol))) + +(define-read-only (get-token-uri) + (ok (var-get token-uri))) + +(define-read-only (get-decimals) + (ok (var-get token-decimals))) + +(define-read-only (get-balance (who principal)) + (ok (ft-get-balance vlqstx who))) + +(define-read-only (get-total-supply) + (ok (ft-get-supply vlqstx))) + +(define-read-only (get-share (who principal)) + (ok (get-shares-to-tokens (unwrap-panic (get-balance who))))) + +(define-read-only (get-total-shares) + (contract-call? .token-lqstx get-balance (as-contract tx-sender))) + +(define-read-only (get-tokens-to-shares (amount uint)) + (if (is-eq (get-total-supply) (ok u0)) + amount + (/ (* amount (unwrap-panic (get-total-supply))) (unwrap-panic (get-total-shares))))) + +(define-read-only (get-shares-to-tokens (shares uint)) + (if (is-eq (get-total-supply) (ok u0)) + shares + (/ (* shares (unwrap-panic (get-total-shares))) (unwrap-panic (get-total-supply))))) + +;; private functions diff --git a/contracts/token-wlqstx.clar b/contracts/token-wlqstx.clar deleted file mode 100644 index 712a74f..0000000 --- a/contracts/token-wlqstx.clar +++ /dev/null @@ -1,157 +0,0 @@ -;; wlqstx -;; -(impl-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait) - -(define-constant err-unauthorised (err u3000)) -(define-constant one-8 u100000000) -(define-constant base-token .token-lqstx) - -(define-fungible-token wlqstx) - -(define-data-var token-name (string-ascii 32) "wlqstx") -(define-data-var token-symbol (string-ascii 10) "wlqstx") -(define-data-var token-uri (optional (string-utf8 256)) (some u"https://cdn.alexlab.co/metadata/wlqstx.json")) - -(define-data-var token-decimals uint u8) - -;; governance functions - -(define-public (set-name (new-name (string-ascii 32))) - (begin - (try! (is-dao-or-extension)) - (ok (var-set token-name new-name)))) - -(define-public (set-symbol (new-symbol (string-ascii 10))) - (begin - (try! (is-dao-or-extension)) - (ok (var-set token-symbol new-symbol)) - ) -) - -(define-public (set-decimals (new-decimals uint)) - (begin - (try! (is-dao-or-extension)) - (ok (var-set token-decimals new-decimals)))) - -(define-public (set-token-uri (new-uri (optional (string-utf8 256)))) - (begin - (try! (is-dao-or-extension)) - (ok (var-set token-uri new-uri)))) - -;; public functions - -(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34)))) - (transfer-fixed (decimals-to-fixed amount) sender recipient memo)) - -(define-public (transfer-fixed (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34)))) - (begin - (asserts! (is-eq sender tx-sender) err-unauthorised) - (try! (ft-transfer? wlqstx (fixed-to-decimals amount) sender recipient)) - (match memo to-print (print to-print) 0x) - (ok true))) - -(define-public (mint-fixed (amount uint) (recipient principal)) - (let - ( - (shares (unwrap-panic (get-tokens-to-shares amount))) - ) - (asserts! (is-eq recipient tx-sender) err-unauthorised) - (try! (contract-call? .token-lqstx transfer-fixed amount recipient (as-contract tx-sender) none)) - (ft-mint? wlqstx (fixed-to-decimals shares) recipient))) - -(define-public (mint (amount uint) (recipient principal)) - (mint-fixed (decimals-to-fixed amount) recipient)) - -(define-public (burn-fixed (amount uint) (sender principal)) - (let - ( - (vaulted-amount (unwrap-panic (get-shares-to-tokens amount))) - ) - (asserts! (is-eq sender tx-sender) err-unauthorised) - (try! (ft-burn? wlqstx (fixed-to-decimals amount) sender)) - (as-contract (try! (contract-call? .token-lqstx transfer-fixed vaulted-amount tx-sender sender none))) - (ok true))) - -(define-public (burn (amount uint) (sender principal)) - (burn-fixed (decimals-to-fixed amount) sender)) - -;; read-only functions - -(define-read-only (is-dao-or-extension) - (ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised))) - -(define-read-only (get-name) - (ok (var-get token-name))) - -(define-read-only (get-symbol) - (ok (var-get token-symbol))) - -(define-read-only (get-decimals) - (ok (var-get token-decimals))) - -(define-read-only (get-balance (who principal)) - (ok (ft-get-balance wlqstx who))) - -(define-read-only (get-total-supply) - (ok (ft-get-supply wlqstx))) - -(define-read-only (get-total-supply-fixed) - (ok (decimals-to-fixed (unwrap-panic (get-total-supply))))) - -(define-read-only (get-balance-fixed (account principal)) - (ok (decimals-to-fixed (unwrap-panic (get-balance account))))) - -(define-read-only (get-token-uri) - (ok (var-get token-uri))) - -(define-read-only (get-vaulted-balance-fixed (who principal)) - (get-shares-to-tokens (unwrap-panic (get-balance-fixed who)))) - -(define-read-only (get-total-vaulted-balance-fixed) - (ok (unwrap-panic (contract-call? .token-lqstx get-balance-fixed (as-contract tx-sender))))) - -(define-read-only (get-tokens-to-shares (amount uint)) - (let - ( - (total-supply (unwrap-panic (get-total-supply-fixed))) - ) - (ok (if (is-eq total-supply u0) - amount - (div-down (mul-down amount total-supply) (unwrap-panic (get-total-vaulted-balance-fixed))) - )) - ) -) - -(define-read-only (get-shares-to-tokens (shares uint)) - (let - ( - (total-supply (unwrap-panic (get-total-supply-fixed))) - ) - (ok (if (is-eq total-supply u0) - shares - (div-down (mul-down shares (unwrap-panic (get-total-vaulted-balance-fixed))) total-supply) - )) - ) -) - -(define-read-only (get-reward-multiplier) - (contract-call? .token-lqstx get-reward-multiplier)) - -;; private functions - -(define-private (pow-decimals) - (pow u10 (unwrap-panic (get-decimals)))) - -(define-private (decimals-to-fixed (amount uint)) - (/ (* amount one-8) (pow-decimals))) - -(define-private (fixed-to-decimals (amount uint)) - (/ (* amount (pow-decimals)) one-8)) - -(define-private (mul-down (a uint) (b uint)) - (/ (* a b) one-8)) - -(define-private (div-down (a uint) (b uint)) - (if (is-eq a u0) - u0 - (/ (* a one-8) b))) diff --git a/contracts/traits/rebase-strategy-trait.clar b/contracts/traits/rebase-strategy-trait.clar new file mode 100644 index 0000000..cc631cf --- /dev/null +++ b/contracts/traits/rebase-strategy-trait.clar @@ -0,0 +1,8 @@ +(define-trait rebase-strategy-trait + ( + (rebase () (response uint uint)) + (finalize-mint (uint) (response bool uint)) + (finalize-burn (uint) (response bool uint)) + ) +) + diff --git a/contracts/traits/sip-010-extensions-trait.clar b/contracts/traits/sip-010-extensions-trait.clar index c458bd3..e9585c7 100644 --- a/contracts/traits/sip-010-extensions-trait.clar +++ b/contracts/traits/sip-010-extensions-trait.clar @@ -4,6 +4,6 @@ (burn (uint principal) (response bool uint)) (mint-fixed (uint principal) (response bool uint)) (burn-fixed (uint principal) (response bool uint)) - (transfer-fixed (uint principal principal (optional (buff 34))) (response bool uint)) + (transfer-fixed (uint principal principal (optional (buff 2048))) (response bool uint)) ) ) \ No newline at end of file diff --git a/contracts/traits/sip-010-trait.clar b/contracts/traits/sip-010-trait.clar index 1045c8a..8910402 100644 --- a/contracts/traits/sip-010-trait.clar +++ b/contracts/traits/sip-010-trait.clar @@ -1,24 +1,24 @@ (define-trait sip-010-trait ( - ;; Transfer from the caller to a new principal - (transfer (uint principal principal (optional (buff 34))) (response bool uint)) + ;; Transfer from the caller to a new principal + (transfer (uint principal principal (optional (buff 2048))) (response bool uint)) - ;; the human readable name of the token - (get-name () (response (string-ascii 32) uint)) + ;; the human readable name of the token + (get-name () (response (string-ascii 32) uint)) - ;; the ticker symbol, or empty if none - (get-symbol () (response (string-ascii 32) uint)) + ;; the ticker symbol, or empty if none + (get-symbol () (response (string-ascii 32) uint)) - ;; the number of decimals used, e.g. 6 would mean 1_000_000 represents 1 token - (get-decimals () (response uint uint)) + ;; the number of decimals used, e.g. 6 would mean 1_000_000 represents 1 token + (get-decimals () (response uint uint)) - ;; the balance of the passed principal - (get-balance (principal) (response uint uint)) + ;; the balance of the passed principal + (get-balance (principal) (response uint uint)) - ;; the current total supply (which does not need to be a constant) - (get-total-supply () (response uint uint)) + ;; the current total supply (which does not need to be a constant) + (get-total-supply () (response uint uint)) - ;; an optional URI that represents metadata of this token - (get-token-uri () (response (optional (string-utf8 256)) uint)) + ;; an optional URI that represents metadata of this token + (get-token-uri () (response (optional (string-utf8 256)) uint)) ) ) \ No newline at end of file diff --git a/contracts/traits/sip-010-transferable-trait.clar b/contracts/traits/sip-010-transferable-trait.clar index 2c47625..562ec1f 100644 --- a/contracts/traits/sip-010-transferable-trait.clar +++ b/contracts/traits/sip-010-transferable-trait.clar @@ -1,5 +1,5 @@ (define-trait sip-010-transferable-trait ( - (transfer (uint principal principal (optional (buff 34))) (response bool uint)) + (transfer (uint principal principal (optional (buff 2048))) (response bool uint)) ) ) diff --git a/contracts/traits/trait-rebase-sip-010.clar b/contracts/traits/trait-rebase-sip-010.clar index 9a4221c..1d6ee20 100644 --- a/contracts/traits/trait-rebase-sip-010.clar +++ b/contracts/traits/trait-rebase-sip-010.clar @@ -1,7 +1,7 @@ (define-trait rebase-sip-010-trait ( ;; Transfer from the caller to a new principal - (transfer (uint principal principal (optional (buff 34))) (response bool uint)) + (transfer (uint principal principal (optional (buff 2048))) (response bool uint)) ;; the human readable name of the token (get-name () (response (string-ascii 32) uint)) @@ -22,7 +22,7 @@ (get-token-uri () (response (optional (string-utf8 256)) uint)) ;; helper functions for 8-digit fixed notation - (transfer-fixed (uint principal principal (optional (buff 34))) (response bool uint)) + (transfer-fixed (uint principal principal (optional (buff 2048))) (response bool uint)) (get-balance-fixed (principal) (response uint uint)) (get-total-supply-fixed () (response uint uint)) diff --git a/contracts/wrapped-tokens/token-wlqstx.clar b/contracts/wrapped-tokens/token-wlqstx.clar new file mode 100644 index 0000000..48bfce1 --- /dev/null +++ b/contracts/wrapped-tokens/token-wlqstx.clar @@ -0,0 +1,215 @@ +(impl-trait .trait-sip-010.sip-010-trait) + +(define-fungible-token wlqstx) + +(define-data-var token-name (string-ascii 32) "Wrapped lqSTX") +(define-data-var token-symbol (string-ascii 10) "wlqstx") +(define-data-var token-uri (optional (string-utf8 256)) (some u"https://cdn.alexlab.co/metadata/token-wlqstx.json")) + +(define-data-var token-decimals uint u8) + +(define-data-var contract-owner principal tx-sender) + +;; errors +(define-constant ERR-NOT-AUTHORIZED (err u1000)) +(define-constant ERR-MINT-FAILED (err u6002)) +(define-constant ERR-BURN-FAILED (err u6003)) +(define-constant ERR-TRANSFER-FAILED (err u3000)) +(define-constant ERR-NOT-SUPPORTED (err u6004)) + +(define-read-only (get-contract-owner) + (ok (var-get contract-owner)) +) + +(define-public (set-contract-owner (owner principal)) + (begin + (try! (check-is-owner)) + (ok (var-set contract-owner owner)) + ) +) + +(define-private (check-is-owner) + (ok (asserts! (is-eq tx-sender (var-get contract-owner)) ERR-NOT-AUTHORIZED)) +) + +(define-public (set-name (new-name (string-ascii 32))) + (begin + (try! (check-is-owner)) + (ok (var-set token-name new-name)) + ) +) + +(define-public (set-symbol (new-symbol (string-ascii 10))) + (begin + (try! (check-is-owner)) + (ok (var-set token-symbol new-symbol)) + ) +) + +(define-public (set-decimals (new-decimals uint)) + (begin + (try! (check-is-owner)) + (ok (var-set token-decimals new-decimals)) + ) +) + +(define-public (set-token-uri (new-uri (optional (string-utf8 256)))) + (begin + (try! (check-is-owner)) + (ok (var-set token-uri new-uri)) + ) +) + +;; --------------------------------------------------------- +;; SIP-10 Functions +;; --------------------------------------------------------- + +;; @desc get-total-supply +;; @returns (response uint) +(define-read-only (get-total-supply) + ;; least authority Issue D + ERR-NOT-SUPPORTED +) + +;; @desc get-name +;; @returns (response string-utf8) +(define-read-only (get-name) + (ok (var-get token-name)) +) + +;; @desc get-symbol +;; @returns (response string-utf8) +(define-read-only (get-symbol) + (ok (var-get token-symbol)) +) + +;; @desc get-decimals +;; @returns (response uint) +(define-read-only (get-decimals) + (ok (var-get token-decimals)) +) + +(define-private (get-base-decimals) + (contract-call? .token-lqstx get-decimals)) + + +;; @desc get-balance +;; @params account +;; @returns (response uint) +(define-read-only (get-balance (account principal)) + (ok (/ (* (unwrap-panic (contract-call? .token-lqstx get-balance account)) (pow-decimals)) (pow u10 (unwrap-panic (get-base-decimals))))) +) + +;; @desc get-token-uri +;; @returns (response some string-utf-8) +(define-read-only (get-token-uri) + (ok (var-get token-uri)) +) + +;; @desc transfer +;; @restricted sender; tx-sender should be sender +;; @params amount +;; @params sender +;; @params recipient +;; @params memo; expiry +;; @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) + (contract-call? .token-lqstx transfer (/ (* amount (pow u10 (unwrap-panic (get-base-decimals)))) (pow-decimals)) sender recipient memo) + ) +) + +(define-constant ONE_8 u100000000) + +;; @desc pow-decimals +;; @returns uint +(define-private (pow-decimals) + (pow u10 (unwrap-panic (get-decimals))) +) + +;; @desc fixed-to-decimals +;; @params amount +;; @returns uint +(define-read-only (fixed-to-decimals (amount uint)) + (/ (* amount (pow-decimals)) ONE_8) +) + +;; @desc decimals-to-fixed +;; @params amount +;; @returns uint +(define-private (decimals-to-fixed (amount uint)) + (/ (* amount ONE_8) (pow-decimals)) +) + +;; @desc get-total-supply-fixed +;; @params token-id +;; @returns (response uint) +(define-read-only (get-total-supply-fixed) + ;; least authority Issue D + ERR-NOT-SUPPORTED +) + +;; @desc get-balance-fixed +;; @params token-id +;; @params who +;; @returns (response uint) +(define-read-only (get-balance-fixed (account principal)) + (ok (decimals-to-fixed (unwrap-panic (get-balance account)))) +) + +;; @desc transfer-fixed +;; @params token-id +;; @params amount +;; @params sender +;; @params recipient +;; @returns (response bool) +(define-public (transfer-fixed (amount uint) (sender principal) (recipient principal) (memo (optional (buff 2048)))) + (transfer (fixed-to-decimals amount) sender recipient memo) +) + +(define-public (mint (amount uint) (recipient principal)) + ERR-MINT-FAILED +) + +(define-public (burn (amount uint) (sender principal)) + ERR-BURN-FAILED +) + +(define-public (mint-fixed (amount uint) (recipient principal)) + (mint (fixed-to-decimals amount) recipient) +) + +;; @desc burn-fixed +;; @params token-id +;; @params amount +;; @params sender +;; @returns (response bool) +(define-public (burn-fixed (amount uint) (sender principal)) + (burn (fixed-to-decimals amount) sender) +) + +;; @desc check-err +;; @params result +;; @params prior +;; @returns (response bool uint) +(define-private (check-err (result (response bool uint)) (prior (response bool uint))) + (match prior + ok-value result + err-value (err err-value) + ) +) + +(define-private (transfer-from-tuple (recipient { to: principal, amount: uint })) + (ok (unwrap! (transfer-fixed (get amount recipient) tx-sender (get to recipient) none) ERR-TRANSFER-FAILED)) +) + +(define-public (send-many (recipients (list 200 { to: principal, amount: uint}))) + (fold check-err (map transfer-from-tuple recipients) (ok true)) +) + +(define-read-only (get-reserve-fixed) + (ok (* (unwrap-panic (contract-call? .token-lqstx get-reserve)) u100))) + +;; contract initialisation +(set-contract-owner .executor-dao) diff --git a/deployments/default.simnet-plan.yaml b/deployments/default.simnet-plan.yaml new file mode 100644 index 0000000..ba115d1 --- /dev/null +++ b/deployments/default.simnet-plan.yaml @@ -0,0 +1,371 @@ +--- +id: 0 +name: "Simulated deployment, used as a default for `clarinet console`, `clarinet test` and `clarinet check`" +network: simnet +genesis: + wallets: + - name: deployer + address: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + balance: "100000000000000" + - name: faucet + address: STNHKEPYEPJ8ET55ZZ0M5A34J0R3N5FM2CMMMAZ6 + balance: "100000000000000" + - name: wallet_1 + address: ST1SJ3DTE5DN7X54YDH5D64R3BCB6A2AG2ZQ8YPD5 + balance: "100000000000000" + - name: wallet_2 + address: ST2CY5V39NHDPWSXMW9QDT3HC3GD6Q6XX4CFRK9AG + balance: "100000000000000" + - name: wallet_3 + address: ST2JHG361ZXG51QTKY2NQCVBPPRRE2KZB1HR05NNC + balance: "100000000000000" + - name: wallet_4 + address: ST2NEB84ASENDXKYGJPQW86YXQCEFEX2ZQPG87ND + balance: "100000000000000" + - name: wallet_5 + address: ST2REHHS5J3CERCRBEPMGH7921Q6PYKAADT7JP2VB + balance: "100000000000000" + - name: wallet_6 + address: ST3AM1A56AK2C1XAFJ4115ZSV26EB49BVQ10MGCS0 + balance: "100000000000000" + - name: wallet_7 + address: ST3PF13W7Z0RRM42A8VZRVFQ75SV1K26RXEP8YGKJ + balance: "100000000000000" + - name: wallet_8 + address: ST3NBRSFKX28FQ2ZJ1MAKX58HKHSDGNV5N7R21XCP + balance: "100000000000000" + contracts: + - costs + - pox + - pox-2 + - pox-3 + - pox-4 + - lockup + - costs-2 + - costs-3 + - cost-voting + - bns +plan: + batches: + - id: 0 + transactions: + - emulated-contract-publish: + contract-name: sip-010-trait-ft-standard + emulated-sender: SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE + path: /Users/chanahn/githome/liquid-stacking/./.cache/requirements/SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: trait-sip-010 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts_modules/alex_v1/traits/trait-sip-010.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: trait-flash-loan-user + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts_modules/alex_v1/traits/trait-flash-loan-user.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: trait-semi-fungible + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts_modules/alex_v1/traits/trait-semi-fungible.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: alex-vault-v1-1 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts_modules/alex_v1/alex-vault-v1-1.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: trait-ownable + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts_modules/alex_v1/traits/trait-ownable.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: token-amm-swap-pool-v1-1 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts_modules/alex_v1/pool-token/token-amm-swap-pool-v1-1.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: amm-swap-pool-v1-1 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts_modules/alex_v1/pool/amm-swap-pool-v1-1.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: token-wstx + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts_modules/alex_v1/wrapped-token/token-wstx.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: trait-vault + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts_modules/alex_v1/traits/trait-vault.clar + clarity-version: 1 + epoch: "2.1" + - id: 1 + transactions: + - emulated-contract-publish: + contract-name: pox-fast-pool-v2 + emulated-sender: SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP + path: /Users/chanahn/githome/liquid-stacking/./.cache/requirements/SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox-fast-pool-v2.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member1 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member10 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member11 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member12 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member13 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member14 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member15 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member16 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member17 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member18 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member19 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member2 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member20 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member3 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member4 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member5 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member6 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member7 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member8 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-member9 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-member.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: strategy-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/traits/strategy-trait.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-strategy + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/strategies/fastpool/fastpool-strategy.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: extension-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/traits/extension-trait.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: proposal-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/traits/proposal-trait.clar + clarity-version: 2 + epoch: "2.4" + - id: 2 + transactions: + - emulated-contract-publish: + contract-name: lisa-dao + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/lisa-dao.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: proxy-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/traits/proxy-trait.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: lqstx-vault + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/extensions/lqstx-vault.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: fastpool-strategy-manager + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/extensions/fastpool-strategy-manager.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: operators + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/extensions/operators.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: sip-010-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/traits/sip-010-trait.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: token-lisa + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/token-lisa.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: boot + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/boot.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: lqstx-mint-registry + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/lqstx-mint-registry.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: rebase-strategy-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/traits/rebase-strategy-trait.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: stx-transfer-proxy + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/proxies/stx-transfer-proxy.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: token-lqstx + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/token-lqstx.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: token-vlqstx + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/token-vlqstx.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: lqstx-mint-endpoint + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/extensions/lqstx-mint-endpoint.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: lisa-rebase + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/extensions/lisa-rebase.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: lisa-transfer-proxy + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/proxies/lisa-transfer-proxy.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: lqstx-transfer-proxy + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/proxies/lqstx-transfer-proxy.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: mock-strategy + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/mocks/mock-strategy.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: mock-strategy-manager + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/mocks/mock-strategy-manager.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: rebase-1 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/rules/rebase-1.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: rebase-mock + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/mocks/rebase-mock.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: regtest-boot + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/regtest-boot.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: sip-010-extensions-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/traits/sip-010-extensions-trait.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: sip-010-transferable-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/traits/sip-010-transferable-trait.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: stx-transfer-many-proxy + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/proxies/stx-transfer-many-proxy.clar + clarity-version: 2 + epoch: "2.4" + - id: 3 + transactions: + - emulated-contract-publish: + contract-name: token-wlqstx + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/wrapped-tokens/token-wlqstx.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: treasury + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: /Users/chanahn/githome/liquid-stacking/contracts/treasury.clar + clarity-version: 2 + epoch: "2.4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..496eed9 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1893 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@hirosystems/clarinet-sdk': + specifier: ^1.0.0 + version: 1.3.0 + '@stacks/transactions': + specifier: ^6.9.0 + version: 6.12.0 + chokidar-cli: + specifier: ^3.0.0 + version: 3.0.0 + typescript: + specifier: ^5.2.2 + version: 5.3.3 + vite: + specifier: ^4.4.9 + version: 4.5.2(@types/node@20.11.24) + vitest: + specifier: ^0.34.4 + version: 0.34.6 + vitest-environment-clarinet: + specifier: ^1.0.0 + version: 1.1.0(@hirosystems/clarinet-sdk@1.3.0)(vitest@0.34.6) + +packages: + + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@hirosystems/clarinet-sdk-wasm@2.3.1: + resolution: {integrity: sha512-2x5cdnhMrYu5mJrtB0/LCkSX8gLAWFoB8juzjQVoPj+Q3oi+9586COyvqCzqJdFPf1mZhuWYgtWQvk5rm3d4XA==} + dev: false + + /@hirosystems/clarinet-sdk@1.3.0: + resolution: {integrity: sha512-CB6+E8gcFJp2Q+iYZ74opI+GJBsAEc54SdPdMY8lvz/H7lHonQtyjn0aOPl8Th5jcC3Cq+yqb6APDWbBr07vUA==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + '@hirosystems/clarinet-sdk-wasm': 2.3.1 + '@stacks/transactions': 6.12.0 + kolorist: 1.8.0 + prompts: 2.4.2 + vitest: 1.3.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@edge-runtime/vm' + - '@types/node' + - '@vitest/browser' + - '@vitest/ui' + - encoding + - happy-dom + - jsdom + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: false + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: false + + /@noble/hashes@1.1.5: + resolution: {integrity: sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==} + dev: false + + /@noble/secp256k1@1.7.1: + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + dev: false + + /@rollup/rollup-android-arm-eabi@4.12.0: + resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-android-arm64@4.12.0: + resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-arm64@4.12.0: + resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-x64@4.12.0: + resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.12.0: + resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.12.0: + resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-musl@4.12.0: + resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.12.0: + resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-gnu@4.12.0: + resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-musl@4.12.0: + resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.12.0: + resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.12.0: + resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-x64-msvc@4.12.0: + resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: false + + /@stacks/common@6.10.0: + resolution: {integrity: sha512-6x5Z7AKd9/kj3+DYE9xIDIkFLHihBH614i2wqrZIjN02WxVo063hWSjIlUxlx8P4gl6olVzlOy5LzhLJD9OP0A==} + dependencies: + '@types/bn.js': 5.1.5 + '@types/node': 18.19.21 + dev: false + + /@stacks/network@6.11.3: + resolution: {integrity: sha512-c4ClCU/QUwuu8NbHtDKPJNa0M5YxauLN3vYaR0+S4awbhVIKFQSxirm9Q9ckV1WBh7FtD6u2S0x+tDQGAODjNg==} + dependencies: + '@stacks/common': 6.10.0 + cross-fetch: 3.1.8 + transitivePeerDependencies: + - encoding + dev: false + + /@stacks/transactions@6.12.0: + resolution: {integrity: sha512-gRP3SfTaAIoTdjMvOiLrMZb/senqB8JQlT5Y4C3/CiHhiprYwTx7TbOCSa7WsNOU99H4aNfHvatmymuggXQVkA==} + dependencies: + '@noble/hashes': 1.1.5 + '@noble/secp256k1': 1.7.1 + '@stacks/common': 6.10.0 + '@stacks/network': 6.11.3 + c32check: 2.0.0 + lodash.clonedeep: 4.5.0 + transitivePeerDependencies: + - encoding + dev: false + + /@types/bn.js@5.1.5: + resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} + dependencies: + '@types/node': 18.19.21 + dev: false + + /@types/chai-subset@1.3.5: + resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} + dependencies: + '@types/chai': 4.3.12 + dev: false + + /@types/chai@4.3.12: + resolution: {integrity: sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==} + dev: false + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: false + + /@types/node@18.19.21: + resolution: {integrity: sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==} + dependencies: + undici-types: 5.26.5 + dev: false + + /@types/node@20.11.24: + resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==} + dependencies: + undici-types: 5.26.5 + dev: false + + /@vitest/expect@0.34.6: + resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} + dependencies: + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + chai: 4.4.1 + dev: false + + /@vitest/expect@1.3.1: + resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} + dependencies: + '@vitest/spy': 1.3.1 + '@vitest/utils': 1.3.1 + chai: 4.4.1 + dev: false + + /@vitest/runner@0.34.6: + resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} + dependencies: + '@vitest/utils': 0.34.6 + p-limit: 4.0.0 + pathe: 1.1.2 + dev: false + + /@vitest/runner@1.3.1: + resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} + dependencies: + '@vitest/utils': 1.3.1 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: false + + /@vitest/snapshot@0.34.6: + resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} + dependencies: + magic-string: 0.30.8 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: false + + /@vitest/snapshot@1.3.1: + resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} + dependencies: + magic-string: 0.30.8 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: false + + /@vitest/spy@0.34.6: + resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} + dependencies: + tinyspy: 2.2.1 + dev: false + + /@vitest/spy@1.3.1: + resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} + dependencies: + tinyspy: 2.2.1 + dev: false + + /@vitest/utils@0.34.6: + resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} + dependencies: + diff-sequences: 29.6.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: false + + /@vitest/utils@1.3.1: + resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: false + + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: false + + /base-x@4.0.0: + resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /c32check@2.0.0: + resolution: {integrity: sha512-rpwfAcS/CMqo0oCqDf3r9eeLgScRE3l/xHDCXhM3UyrfvIn7PrLq63uHh7yYbv8NzaZn5MVsVhIRpQ+5GZ5HyA==} + engines: {node: '>=8'} + dependencies: + '@noble/hashes': 1.1.5 + base-x: 4.0.0 + dev: false + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: false + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: false + + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: false + + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: false + + /chokidar-cli@3.0.0: + resolution: {integrity: sha512-xVW+Qeh7z15uZRxHOkP93Ux8A0xbPzwK4GaqD8dQOYc34TlkqUhVSS59fK36DOp5WdJlrRzlYSy02Ht99FjZqQ==} + engines: {node: '>= 8.10.0'} + hasBin: true + dependencies: + chokidar: 3.6.0 + lodash.debounce: 4.0.8 + lodash.throttle: 4.1.1 + yargs: 13.3.2 + dev: false + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /cliui@5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: false + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: false + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: false + + /emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: false + + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: false + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: false + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: false + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: false + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /js-tokens@8.0.3: + resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} + dev: false + + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: false + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: false + + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: false + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: false + + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.6.1 + pkg-types: 1.0.3 + dev: false + + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: false + + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: false + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: false + + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: false + + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: false + + /magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + + /mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.4.0 + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: false + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: false + + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: false + + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: false + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: false + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.1 + mlly: 1.6.1 + pathe: 1.1.2 + dev: false + + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: false + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: false + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: false + + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /rollup@4.12.0: + resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.12.0 + '@rollup/rollup-android-arm64': 4.12.0 + '@rollup/rollup-darwin-arm64': 4.12.0 + '@rollup/rollup-darwin-x64': 4.12.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 + '@rollup/rollup-linux-arm64-gnu': 4.12.0 + '@rollup/rollup-linux-arm64-musl': 4.12.0 + '@rollup/rollup-linux-riscv64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-gnu': 4.12.0 + '@rollup/rollup-linux-x64-musl': 4.12.0 + '@rollup/rollup-win32-arm64-msvc': 4.12.0 + '@rollup/rollup-win32-ia32-msvc': 4.12.0 + '@rollup/rollup-win32-x64-msvc': 4.12.0 + fsevents: 2.3.3 + dev: false + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: false + + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: false + + /string-width@3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + dependencies: + ansi-regex: 4.1.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.11.3 + dev: false + + /strip-literal@2.0.0: + resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} + dependencies: + js-tokens: 8.0.3 + dev: false + + /tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + dev: false + + /tinypool@0.7.0: + resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} + engines: {node: '>=14.0.0'} + dev: false + + /tinypool@0.8.2: + resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + engines: {node: '>=14.0.0'} + dev: false + + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: false + + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + dev: false + + /ufo@1.4.0: + resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} + dev: false + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: false + + /vite-node@0.34.6(@types/node@20.11.24): + resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.6.1 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 4.5.2(@types/node@20.11.24) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: false + + /vite-node@1.3.1: + resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.1.4 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: false + + /vite@4.5.2(@types/node@20.11.24): + resolution: {integrity: sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.11.24 + esbuild: 0.18.20 + postcss: 8.4.35 + rollup: 3.29.4 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /vite@5.1.4: + resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.19.12 + postcss: 8.4.35 + rollup: 4.12.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /vitest-environment-clarinet@1.1.0(@hirosystems/clarinet-sdk@1.3.0)(vitest@0.34.6): + resolution: {integrity: sha512-abf6VPWVyzZ6Ynz3kNqKZGsJuS0MH5xKyJeR9dgE5Y4dQ34KaBoTeA2jzgamDUxyX1y+5/yA/SBQab4sZjX8Sg==} + peerDependencies: + '@hirosystems/clarinet-sdk': '1' + vitest: '1' + dependencies: + '@hirosystems/clarinet-sdk': 1.3.0 + vitest: 0.34.6 + dev: false + + /vitest@0.34.6: + resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.12 + '@types/chai-subset': 1.3.5 + '@types/node': 20.11.24 + '@vitest/expect': 0.34.6 + '@vitest/runner': 0.34.6 + '@vitest/snapshot': 0.34.6 + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + acorn: 8.11.3 + acorn-walk: 8.3.2 + cac: 6.7.14 + chai: 4.4.1 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.8 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 1.3.0 + tinybench: 2.6.0 + tinypool: 0.7.0 + vite: 4.5.2(@types/node@20.11.24) + vite-node: 0.34.6(@types/node@20.11.24) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: false + + /vitest@1.3.1: + resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.3.1 + '@vitest/ui': 1.3.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@vitest/expect': 1.3.1 + '@vitest/runner': 1.3.1 + '@vitest/snapshot': 1.3.1 + '@vitest/spy': 1.3.1 + '@vitest/utils': 1.3.1 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.8 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.1.4 + vite-node: 1.3.1 + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: false + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: false + + /wrap-ansi@5.1.0: + resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} + engines: {node: '>=6'} + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yargs-parser@13.1.2: + resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yargs@13.3.2: + resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 13.1.2 + dev: false + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: false + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: false diff --git a/tests/lqstx-mint-endpoint.test.ts b/tests/lqstx-mint-endpoint.test.ts new file mode 100644 index 0000000..ab0a48c --- /dev/null +++ b/tests/lqstx-mint-endpoint.test.ts @@ -0,0 +1,466 @@ +import { tx } from '@hirosystems/clarinet-sdk'; +import { Cl } from '@stacks/transactions'; +import { describe, expect, it } from 'vitest'; + +const accounts = simnet.getAccounts(); +const user = accounts.get('wallet_1')!; +const oracle = accounts.get('wallet_2')!; +const bot = accounts.get('wallet_3')!; +const manager = accounts.get('wallet_4')!; + +const contracts = { + endpoint: 'lqstx-mint-endpoint', + registry: 'lqstx-mint-registry', + vault: 'lqstx-vault', + lqstx: 'token-lqstx', + vlqstx: 'token-vlqstx', + wstx: 'token-wstx', + strategy: 'mock-strategy', + rebase: 'lisa-rebase', + rebase1: 'rebase-mock', + amm: 'amm-swap-pool-v1-1', + wlqstx: 'token-wlqstx', + dao: 'lisa-dao', + boot: 'regtest-boot', + manager: 'mock-strategy-manager' +} + +const prepareTest = () => + simnet.mineBlock([ + tx.callPublicFn( + contracts.dao, + 'construct', + [ + Cl.contractPrincipal(simnet.deployer, contracts.boot), + ], + simnet.deployer, + ), + ]); + +const requestMint = () => + simnet.callPublicFn( + contracts.endpoint, + 'request-mint', + [Cl.uint(100e6)], + user, + ) + +const requestBurn = (payload: Buffer) => + simnet.mineBlock([ + tx.callPublicFn( + contracts.rebase1, + 'rebase', + [], + oracle + ), + tx.callPublicFn( + contracts.rebase1, + 'finalize-mint', + [Cl.uint(1)], + bot + ), + tx.callPublicFn( + contracts.manager, + 'fund-strategy', + [ + Cl.uint(100e6) + ], + manager + ), + tx.callPublicFn( + contracts.rebase1, + 'rebase', + [], + oracle + ), + tx.callPublicFn( + contracts.endpoint, + 'request-burn', + [ + Cl.uint(100e6), + Cl.contractPrincipal(simnet.deployer, contracts.rebase1), + ], + user + ), + ]); + +describe(contracts.endpoint, () => { + it('can request mint', () => { + prepareTest().map((e: any) => expect(e.result).toBeOk(Cl.bool(true))); + + const response = requestMint(); + expect(response.result).toBeOk(Cl.uint(1)); + }); + + it('can finalize mint', () => { + prepareTest().map((e: any) => expect(e.result).toBeOk(Cl.bool(true))); + + expect(requestMint().result).toBeOk(Cl.uint(1)); + + const cycle = simnet.callReadOnlyFn(contracts.endpoint, 'get-reward-cycle', [Cl.uint(simnet.blockHeight)], user).result.value.value; + 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 + + const finaliseErr = simnet.callPublicFn( + contracts.rebase1, + 'finalize-mint', + [Cl.uint(1)], + bot + ); + expect(finaliseErr.result).toBeErr(Cl.uint(1006)); + + simnet.mineEmptyBlocks(144); // mint-delay + + let responses = simnet.mineBlock([ + tx.callPublicFn( + contracts.rebase1, + 'finalize-mint', + [Cl.uint(1)], + bot + ), + tx.callPublicFn( + contracts.endpoint, + 'revoke-mint', + [Cl.uint(1)], + user + ), + ]); + expect(responses[0].result).toBeOk(Cl.bool(true)); + expect(responses[1].result).toBeErr(Cl.uint(1007)); + }); + + it('can revoke mint', () => { + prepareTest().map((e: any) => expect(e.result).toBeOk(Cl.bool(true))); + + expect(requestMint().result).toBeOk(Cl.uint(1)); + + let responses = simnet.mineBlock([ + tx.callPublicFn( + contracts.endpoint, + 'revoke-mint', + [Cl.uint(1)], + bot + ), + tx.callPublicFn( + contracts.endpoint, + 'revoke-mint', + [Cl.uint(1)], + user + ), + ]); + expect(responses[0].result).toBeErr(Cl.uint(1000)); + expect(responses[1].result).toBeOk(Cl.bool(true)); + + const cycle = simnet.callReadOnlyFn(contracts.endpoint, 'get-reward-cycle', [Cl.uint(simnet.blockHeight)], user).result.value.value; + 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 + + responses = simnet.mineBlock([ + tx.callPublicFn( + contracts.rebase1, + 'finalize-mint', + [Cl.uint(1)], + bot + ) + ]); + expect(responses[0].result).toBeErr(Cl.uint(1007)); + }); + + it('can request burn', () => { + prepareTest().map((e: any) => expect(e.result).toBeOk(Cl.bool(true))); + + expect(requestMint().result).toBeOk(Cl.uint(1)); + const cycle = simnet.callReadOnlyFn(contracts.endpoint, 'get-reward-cycle', [Cl.uint(simnet.blockHeight)], user).result.value.value; + 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; + const responses = requestBurn(payload); + expect(responses[0].result).toBeOk(Cl.uint(0)); + expect(responses[1].result).toBeOk(Cl.bool(true)); + console.log(responses[2].result); + expect(responses[2].result).toBeOk(Cl.uint(100e6)); + expect(responses[3].result).toBeOk(Cl.uint(100e6)); + expect(responses[4].result).toBeOk(Cl.tuple({ 'request-id': Cl.uint(1), status: Cl.bufferFromHex('00') })); + }); + + it('can finalize burn', () => { + prepareTest().map((e: any) => expect(e.result).toBeOk(Cl.bool(true))); + + expect(requestMint().result).toBeOk(Cl.uint(1)); + const cycle = simnet.callReadOnlyFn(contracts.endpoint, 'get-reward-cycle', [Cl.uint(simnet.blockHeight)], user).result.value.value; + 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; + const burnResponses = requestBurn(payload); + expect(burnResponses[0].result).toBeOk(Cl.uint(0)); + expect(burnResponses[1].result).toBeOk(Cl.bool(true)); + expect(burnResponses[2].result).toBeOk(Cl.uint(100e6)); + expect(burnResponses[3].result).toBeOk(Cl.uint(100e6)); + expect(burnResponses[4].result).toBeOk(Cl.tuple({ 'request-id': Cl.uint(1), status: Cl.bufferFromHex('00') })); + + const responses = simnet.mineBlock([ + tx.callPublicFn( + contracts.manager, + 'refund-strategy', + [ + Cl.uint(100e6) + ], + manager + ), + tx.callPublicFn( + contracts.rebase1, + 'rebase', + [], + oracle + ), + tx.callPublicFn( + contracts.rebase1, + 'finalize-burn', + [Cl.uint(1)], + bot + ), + tx.callPublicFn( + contracts.endpoint, + 'revoke-burn', + [Cl.uint(1)], + user + ), + ]); + expect(responses[0].result).toBeOk(Cl.uint(100e6)); + 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', () => { + prepareTest().map((e: any) => expect(e.result).toBeOk(Cl.bool(true))); + + expect(requestMint().result).toBeOk(Cl.uint(1)); + const cycle = simnet.callReadOnlyFn(contracts.endpoint, 'get-reward-cycle', [Cl.uint(simnet.blockHeight)], user).result.value.value; + 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; + const burnResponses = requestBurn(payload); + expect(burnResponses[0].result).toBeOk(Cl.uint(0)); + expect(burnResponses[1].result).toBeOk(Cl.bool(true)); + expect(burnResponses[2].result).toBeOk(Cl.uint(100e6)); + expect(burnResponses[3].result).toBeOk(Cl.uint(100e6)); + expect(burnResponses[4].result).toBeOk(Cl.tuple({ 'request-id': Cl.uint(1), status: Cl.bufferFromHex('00') })); + + const responses = simnet.mineBlock([ + tx.callPublicFn( + contracts.manager, + 'refund-strategy', + [ + Cl.uint(100e6) + ], + manager + ), + tx.callPublicFn( + contracts.endpoint, + 'revoke-burn', + [Cl.uint(1)], + bot + ), + tx.callPublicFn( + contracts.endpoint, + 'revoke-burn', + [Cl.uint(1)], + user + ), + tx.callPublicFn( + contracts.rebase1, + 'finalize-mint', + [Cl.uint(1)], + bot + ) + ]); + expect(responses[0].result).toBeOk(Cl.uint(100e6)); + expect(responses[1].result).toBeErr(Cl.uint(1000)); + expect(responses[2].result).toBeOk(Cl.bool(true)); + expect(responses[3].result).toBeErr(Cl.uint(1007)); + }); + + it('can interact with strategies', () => { + prepareTest().map((e: any) => expect(e.result).toBeOk(Cl.bool(true))); + + expect(requestMint().result).toBeOk(Cl.uint(1)); + + const payload = simnet.callReadOnlyFn( + contracts.strategy, + 'create-payload', + [Cl.uint(100e6)], + manager + ).result.buffer; + + const cycle = simnet.callReadOnlyFn(contracts.endpoint, 'get-reward-cycle', [Cl.uint(simnet.blockHeight)], user).result.value.value; + 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 - 100); + + let responses = simnet.mineBlock([ + tx.callPublicFn( + contracts.rebase1, + 'finalize-mint', + [Cl.uint(1)], + bot + ), + tx.callPublicFn( + contracts.manager, + 'fund-strategy', + [ + Cl.uint(100e6) + ], + bot + ), + tx.callPublicFn( + contracts.manager, + 'fund-strategy', + [ + Cl.uint(100e6) + ], + manager + ), + ]); + expect(responses[0].result).toBeErr(Cl.uint(1006)); + expect(responses[1].result).toBeErr(Cl.uint(1000)); + expect(responses[2].result).toBeOk(Cl.uint(100e6)); + + simnet.mineEmptyBlocks(99); // go to the next cycle + simnet.mineEmptyBlocks(144); // mint-delay + + responses = simnet.mineBlock([ + tx.callPublicFn( + contracts.rebase1, + 'finalize-mint', + [Cl.uint(1)], + bot + ), + tx.callPublicFn( + contracts.endpoint, + 'request-burn', + [ + Cl.uint(100e6), + Cl.contractPrincipal(simnet.deployer, contracts.rebase1), + ], + user + ), + tx.callPublicFn( + contracts.rebase1, + 'finalize-burn', + [Cl.uint(1)], + bot + ), + tx.callPublicFn( + contracts.manager, + 'refund-strategy', + [ + Cl.uint(100e6) + ], + bot + ), + tx.callPublicFn( + contracts.manager, + 'refund-strategy', + [ + Cl.uint(100e6) + ], + manager + ), + tx.callPublicFn( + contracts.manager, + 'refund-strategy', + [ + Cl.uint(100e6) + ], + manager + ), + tx.callPublicFn( + contracts.rebase1, + 'rebase', + [], + oracle + ), + tx.callPublicFn( + contracts.rebase1, + 'finalize-burn', + [Cl.uint(1)], + bot + ) + ]); + expect(responses[0].result).toBeOk(Cl.bool(true)); + expect(responses[1].result).toBeOk(Cl.tuple({ 'request-id': Cl.uint(1), status: Cl.bufferFromHex('00') })); + expect(responses[2].result).toBeErr(Cl.uint(1006)); + expect(responses[3].result).toBeErr(Cl.uint(1000)); + expect(responses[4].result).toBeOk(Cl.uint(100e6)); + expect(responses[5].result).toBeErr(Cl.uint(1)); + expect(responses[6].result).toBeOk(Cl.uint(100e6)); + expect(responses[7].result).toBeOk(Cl.bool(true)); + }); + + it('can set up amm pool', () => { + prepareTest().map((e: any) => expect(e.result).toBeOk(Cl.bool(true))); + + expect(requestMint().result).toBeOk(Cl.uint(1)); + + const cycle = simnet.callReadOnlyFn(contracts.endpoint, 'get-reward-cycle', [Cl.uint(simnet.blockHeight)], user).result.value.value; + 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 + + const finaliseErr = simnet.callPublicFn( + contracts.rebase1, + 'finalize-mint', + [Cl.uint(1)], + bot + ); + expect(finaliseErr.result).toBeErr(Cl.uint(1006)); + + simnet.mineEmptyBlocks(144); // mint-delay + + let responses = simnet.mineBlock([ + tx.callPublicFn( + contracts.rebase1, + 'finalize-mint', + [Cl.uint(1)], + bot + ), + tx.callPublicFn( + contracts.amm, + 'create-pool', + [ + Cl.principal(simnet.deployer + '.' + contracts.wstx), + Cl.principal(simnet.deployer + '.' + contracts.wlqstx), + Cl.uint(1e8), + Cl.principal(user), + Cl.uint(1e8), + Cl.uint(1e8) + ], + user + ) + ]); + expect(responses[0].result).toBeOk(Cl.bool(true)); + expect(responses[1].result).toBeOk(Cl.bool(true)); + }); +});