From 0ead7f7eb7d5559dc1a7ea365bf971f4bbdaa22b Mon Sep 17 00:00:00 2001 From: friedger Date: Fri, 22 Mar 2024 13:28:34 +0100 Subject: [PATCH 01/27] feat: add ccip-019 --- Clarinet.toml | 5 + contracts/proposals/ccip019-nakamoto.clar | 313 ++++++++++++++++++++++ 2 files changed, 318 insertions(+) create mode 100644 contracts/proposals/ccip019-nakamoto.clar diff --git a/Clarinet.toml b/Clarinet.toml index 7f9bd00..6ce49cd 100644 --- a/Clarinet.toml +++ b/Clarinet.toml @@ -164,6 +164,11 @@ path = "contracts/proposals/ccip017-extend-sunset-period.clar" clarity_version = 2 epoch = 2.4 +[contracts.ccip019-nakamoto] +path = "contracts/proposals/ccip019-nakamoto.clar" +clarity_version = 2 +epoch = 2.4 + # CITYCOINS PROTOCOL TRAITS [contracts.extension-trait] diff --git a/contracts/proposals/ccip019-nakamoto.clar b/contracts/proposals/ccip019-nakamoto.clar new file mode 100644 index 0000000..cbb3e70 --- /dev/null +++ b/contracts/proposals/ccip019-nakamoto.clar @@ -0,0 +1,313 @@ +;; TRAITS + +(impl-trait .proposal-trait.proposal-trait) +(impl-trait .ccip015-trait.ccip015-trait) + +;; ERRORS + +(define-constant ERR_PANIC (err u1400)) +(define-constant ERR_VOTED_ALREADY (err u1401)) +(define-constant ERR_NOTHING_STACKED (err u1402)) +(define-constant ERR_USER_NOT_FOUND (err u1403)) +(define-constant ERR_PROPOSAL_NOT_ACTIVE (err u1404)) +(define-constant ERR_PROPOSAL_STILL_ACTIVE (err u1405)) +(define-constant ERR_NO_CITY_ID (err u1406)) +(define-constant ERR_VOTE_FAILED (err u1407)) + +;; CONSTANTS + +(define-constant SELF (as-contract tx-sender)) +(define-constant MISSED_PAYOUT u1) +(define-constant CCIP_019 { + name: "Upgrade for Nakamoto", + link: "", + hash: "", +}) + +(define-constant VOTE_SCALE_FACTOR (pow u10 u16)) ;; 16 decimal places +(define-constant MIA_SCALE_BASE (pow u10 u4)) ;; 4 decimal places +(define-constant MIA_SCALE_FACTOR u8760) ;; 0.8760 or 87.60% +;; MIA votes scaled to make 1 MIA = 1 NYC +;; full calculation available in CCIP-014 + +;; DATA VARS + +;; vote block heights +(define-data-var voteActive bool true) +(define-data-var voteStart uint u0) +(define-data-var voteEnd uint u0) + +(var-set voteStart block-height) + +;; vote tracking +(define-data-var yesVotes uint u0) +(define-data-var yesTotal uint u0) +(define-data-var noVotes uint u0) +(define-data-var noTotal uint u0) + +;; DATA MAPS + +(define-map UserVotes + uint ;; user ID + { ;; vote + vote: bool, + mia: uint, + nyc: uint, + total: uint, + } +) + +;; PUBLIC FUNCTIONS + +(define-public (execute (sender principal)) + (let + ( + (miaId (unwrap! (contract-call? .ccd004-city-registry get-city-id "mia") ERR_PANIC)) + (nycId (unwrap! (contract-call? .ccd004-city-registry get-city-id "nyc") ERR_PANIC)) + (miaBalance (contract-call? .ccd002-treasury-mia-mining-v2 get-balance-stx)) + (nycBalance (contract-call? .ccd002-treasury-nyc-mining-v2 get-balance-stx)) + ) + + ;; check vote complete/passed + (try! (is-executable)) + + ;; update vote variables + (var-set voteEnd block-height) + (var-set voteActive false) + + ;; enable new treasuries in the DAO + (try! (contract-call? .base-dao set-extensions + (list + {extension: .ccd002-treasury-mia-mining-v3, enabled: true} + {extension: .ccd002-treasury-nyc-mining-v3, enabled: true} + ) + )) + + ;; allow MIA/NYC in respective treasuries + ;; MAINNET: 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 + ;; MAINNET: 'SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-token-v2 + (try! (contract-call? .ccd002-treasury-mia-mining-v3 set-allowed 'ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H.miamicoin-token-v2 true)) + (try! (contract-call? .ccd002-treasury-nyc-mining-v3 set-allowed 'STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ.newyorkcitycoin-token-v2 true)) + + ;; transfer funds to new treasury extensions + (try! (contract-call? .ccd002-treasury-mia-mining-v2 withdraw-stx miaBalance .ccd002-treasury-mia-mining-v3)) + (try! (contract-call? .ccd002-treasury-nyc-mining-v2 withdraw-stx nycBalance .ccd002-treasury-nyc-mining-v3)) + + ;; delegate stack the STX in the mining treasuries (up to 50M STX each) + ;; MAINNET: SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox-fast-pool-v2 + ;; MAINNET: SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox-fast-pool-v2 + (try! (contract-call? .ccd002-treasury-mia-mining-v3 delegate-stx u50000000000000 'ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6)) + (try! (contract-call? .ccd002-treasury-nyc-mining-v3 delegate-stx u50000000000000 'ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6)) + + ;; add treasuries to ccd005-city-data + (try! (contract-call? .ccd005-city-data add-treasury miaId .ccd002-treasury-mia-mining-v3 "mining-v2")) + (try! (contract-call? .ccd005-city-data add-treasury nycId .ccd002-treasury-nyc-mining-v3 "mining-v2")) + + (ok true) + ) +) + +(define-public (vote-on-proposal (vote bool)) + (let + ( + (miaId (unwrap! (contract-call? .ccd004-city-registry get-city-id "mia") ERR_NO_CITY_ID)) + (nycId (unwrap! (contract-call? .ccd004-city-registry get-city-id "nyc") ERR_NO_CITY_ID)) + (voterId (unwrap! (contract-call? .ccd003-user-registry get-user-id contract-caller) ERR_USER_NOT_FOUND)) + (voterRecord (map-get? UserVotes voterId)) + ) + ;; check that proposal is active + ;;(asserts! (and + ;; (>= block-height (var-get voteStart)) + ;; (<= block-height (var-get voteEnd))) + ;; ERR_PROPOSAL_NOT_ACTIVE) + (asserts! (var-get voteActive) ERR_PROPOSAL_NOT_ACTIVE) + ;; check if vote record exists + (match voterRecord record + ;; if the voterRecord exists + (begin + ;; check vote is not the same as before + (asserts! (not (is-eq (get vote record) vote)) ERR_VOTED_ALREADY) + ;; record the new vote for the user + (map-set UserVotes voterId + (merge record { vote: vote }) + ) + ;; update the overall vote totals + (if vote + (begin + (var-set yesVotes (+ (var-get yesVotes) u1)) + (var-set yesTotal (+ (var-get yesTotal) (get total record))) + (var-set noVotes (- (var-get noVotes) u1)) + (var-set noTotal (- (var-get noTotal) (get total record))) + ) + (begin + (var-set yesVotes (- (var-get yesVotes) u1)) + (var-set yesTotal (- (var-get yesTotal) (get total record))) + (var-set noVotes (+ (var-get noVotes) u1)) + (var-set noTotal (+ (var-get noTotal) (get total record))) + ) + ) + ) + ;; if the voterRecord does not exist + (let + ( + (scaledVoteMia (default-to u0 (get-mia-vote miaId voterId true))) + (scaledVoteNyc (default-to u0 (get-nyc-vote nycId voterId true))) + (voteMia (scale-down scaledVoteMia)) + (voteNyc (scale-down scaledVoteNyc)) + (voteTotal (+ voteMia voteNyc)) + ) + ;; record the vote for the user + (map-insert UserVotes voterId { + vote: vote, + mia: voteMia, + nyc: voteNyc, + total: voteTotal, + }) + ;; update the overall vote totals + (if vote + (begin + (var-set yesVotes (+ (var-get yesVotes) u1)) + (var-set yesTotal (+ (var-get yesTotal) voteTotal)) + ) + (begin + (var-set noVotes (+ (var-get noVotes) u1)) + (var-set noTotal (+ (var-get noTotal) voteTotal)) + ) + ) + ) + ) + ;; print voter information + (print (map-get? UserVotes voterId)) + ;; print vote totals + (print (get-vote-totals)) + (ok true) + ) +) + +;; READ ONLY FUNCTIONS + +(define-read-only (is-executable) + (begin + ;; additional checks could be added here in future proposals + ;; line below revised since vote will start at deployed height + ;; (asserts! (>= block-height (var-get voteStart)) ERR_PROPOSAL_NOT_ACTIVE) + ;; line below revised since vote will end when proposal executes + ;; (asserts! (>= block-height (var-get voteEnd)) ERR_PROPOSAL_STILL_ACTIVE) + ;; check that there is at least one vote + (asserts! (or (> (var-get yesVotes) u0) (> (var-get noVotes) u0)) ERR_VOTE_FAILED) + ;; check that yes total is more than no total + (asserts! (> (var-get yesTotal) (var-get noTotal)) ERR_VOTE_FAILED) + (ok true) + ) +) + +(define-read-only (is-vote-active) + (some (var-get voteActive)) +) + +(define-read-only (get-proposal-info) + (some CCIP_019) +) + +(define-read-only (get-vote-period) + (if (and + (> (var-get voteStart) u0) + (> (var-get voteEnd) u0)) + ;; if both are set, return values + (some { + startBlock: (var-get voteStart), + endBlock: (var-get voteEnd), + length: (- (var-get voteEnd) (var-get voteStart)) + }) + ;; else return none + none + ) +) + +(define-read-only (get-vote-totals) + (some { + yesVotes: (var-get yesVotes), + yesTotal: (var-get yesTotal), + noVotes: (var-get noVotes), + noTotal: (var-get noTotal) + }) +) + +(define-read-only (get-voter-info (id uint)) + (map-get? UserVotes id) +) + +;; MIA vote calculation +;; returns (some uint) or (none) +;; optionally scaled by VOTE_SCALE_FACTOR (10^6) +(define-read-only (get-mia-vote (cityId uint) (userId uint) (scaled bool)) + (let + ( + ;; MAINNET: MIA cycle 54 / first block BTC 779,450 STX 97,453 + ;; cycle 2 / u4500 used in tests + (cycle54Hash (unwrap! (get-block-hash u4500) none)) + (cycle54Data (at-block cycle54Hash (contract-call? .ccd007-citycoin-stacking get-stacker cityId u2 userId))) + (cycle54Amount (get stacked cycle54Data)) + ;; MAINNET: MIA cycle 55 / first block BTC 781,550 STX 99,112 + ;; cycle 3 / u6600 used in tests + (cycle55Hash (unwrap! (get-block-hash u6600) none)) + (cycle55Data (at-block cycle55Hash (contract-call? .ccd007-citycoin-stacking get-stacker cityId u3 userId))) + (cycle55Amount (get stacked cycle55Data)) + ;; MIA vote calculation + (avgStacked (/ (+ (scale-up cycle54Amount) (scale-up cycle55Amount)) u2)) + (scaledVote (/ (* avgStacked MIA_SCALE_FACTOR) MIA_SCALE_BASE)) + ) + ;; check that at least one value is positive + (asserts! (or (> cycle54Amount u0) (> cycle55Amount u0)) none) + ;; return scaled or unscaled value + (if scaled (some scaledVote) (some (/ scaledVote VOTE_SCALE_FACTOR))) + ) +) + +;; NYC vote calculation +;; returns (some uint) or (none) +;; optionally scaled by VOTE_SCALE_FACTOR (10^6) +(define-read-only (get-nyc-vote (cityId uint) (userId uint) (scaled bool)) + (let + ( + ;; NYC cycle 54 / first block BTC 779,450 STX 97,453 + ;; cycle 2 / u4500 used in tests + (cycle54Hash (unwrap! (get-block-hash u4500) none)) + (cycle54Data (at-block cycle54Hash (contract-call? .ccd007-citycoin-stacking get-stacker cityId u2 userId))) + (cycle54Amount (get stacked cycle54Data)) + ;; NYC cycle 55 / first block BTC 781,550 STX 99,112 + ;; cycle 3 / u6600 used in tests + (cycle55Hash (unwrap! (get-block-hash u6600) none)) + (cycle55Data (at-block cycle55Hash (contract-call? .ccd007-citycoin-stacking get-stacker cityId u3 userId))) + (cycle55Amount (get stacked cycle55Data)) + ;; NYC vote calculation + (scaledVote (/ (+ (scale-up cycle54Amount) (scale-up cycle55Amount)) u2)) + ) + ;; check that at least one value is positive + (asserts! (or (> cycle54Amount u0) (> cycle55Amount u0)) none) + ;; return scaled or unscaled value + (if scaled (some scaledVote) (some (/ scaledVote VOTE_SCALE_FACTOR))) + ) +) + +;; PRIVATE FUNCTIONS + +;; get block hash by height +(define-private (get-block-hash (blockHeight uint)) + (get-block-info? id-header-hash blockHeight) +) + +;; CREDIT: ALEX math-fixed-point-16.clar + +(define-private (scale-up (a uint)) + (* a VOTE_SCALE_FACTOR) +) + +(define-private (scale-down (a uint)) + (/ a VOTE_SCALE_FACTOR) +) + +;; INITIALIZATION + +;; fund proposal with 8 uSTX for payouts from deployer +(stx-transfer? (* MISSED_PAYOUT u8) tx-sender (as-contract tx-sender)) From 71265babe3426935526438766c1a5101c725f4cc Mon Sep 17 00:00:00 2001 From: friedger Date: Sat, 4 May 2024 16:48:05 +0200 Subject: [PATCH 02/27] chore: remove unused code --- contracts/extensions/ccd002-treasury-v3.clar | 2 +- .../proposals/ccip019-pox-4-stacking.clar | 20 ++----------------- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/contracts/extensions/ccd002-treasury-v3.clar b/contracts/extensions/ccd002-treasury-v3.clar index 0748342..a5802bd 100644 --- a/contracts/extensions/ccd002-treasury-v3.clar +++ b/contracts/extensions/ccd002-treasury-v3.clar @@ -177,7 +177,7 @@ ;; MAINNET: 'SP000000000000000000002Q6VF78.pox-4 ;; TESTNET: 'ST000000000000000000002AMW42H.pox-4 (match (as-contract (contract-call? 'ST000000000000000000002AMW42H.pox-4 revoke-delegate-stx)) - success (ok success) + success (begin (print success) (ok true)) err (err (to-uint err)) ) ) diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index 7141d8a..23ce399 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -5,13 +5,6 @@ ;; ERRORS (define-constant ERR_PANIC (err u1400)) -(define-constant ERR_VOTED_ALREADY (err u1401)) -(define-constant ERR_NOTHING_STACKED (err u1402)) -(define-constant ERR_USER_NOT_FOUND (err u1403)) -(define-constant ERR_PROPOSAL_NOT_ACTIVE (err u1404)) -(define-constant ERR_PROPOSAL_STILL_ACTIVE (err u1405)) -(define-constant ERR_NO_CITY_ID (err u1406)) -(define-constant ERR_VOTE_FAILED (err u1407)) ;; CONSTANTS @@ -34,9 +27,6 @@ (nycBalance (contract-call? .ccd002-treasury-nyc-mining-v2 get-balance-stx)) ) - ;; check vote complete/passed - (try! (is-executable)) - ;; enable new treasuries in the DAO (try! (contract-call? .base-dao set-extensions (list @@ -56,8 +46,8 @@ (try! (contract-call? .ccd002-treasury-nyc-mining-v2 withdraw-stx nycBalance .ccd002-treasury-nyc-mining-v3)) ;; delegate stack the STX in the mining treasuries (up to 50M STX each) - ;; MAINNET: SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox-fast-pool-v2 - ;; MAINNET: SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox-fast-pool-v2 + ;; MAINNET: SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3 + ;; MAINNET: SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3 (try! (contract-call? .ccd002-treasury-mia-mining-v3 delegate-stx u50000000000000 'ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6)) (try! (contract-call? .ccd002-treasury-nyc-mining-v3 delegate-stx u50000000000000 'ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6)) @@ -71,12 +61,6 @@ ;; READ ONLY FUNCTIONS -(define-read-only (is-executable) - (begin - (ok true) - ) -) - (define-read-only (get-proposal-info) (some CCIP_019) ) \ No newline at end of file From 0127f6912ab0c6d3619724d8568cf470cd312b1e Mon Sep 17 00:00:00 2001 From: friedger Date: Sat, 4 May 2024 17:14:01 +0200 Subject: [PATCH 03/27] feat: add rewards-treasury --- Clarinet.toml | 15 ++++++++ .../extensions/ccip019-rewards-treasury.clar | 35 +++++++++++++++++++ .../proposals/ccip019-pox-4-stacking.clar | 1 + contracts/traits/ccip019-proxy-trait.clar | 3 ++ 4 files changed, 54 insertions(+) create mode 100644 contracts/extensions/ccip019-rewards-treasury.clar create mode 100644 contracts/traits/ccip019-proxy-trait.clar diff --git a/Clarinet.toml b/Clarinet.toml index 2404074..492f85a 100644 --- a/Clarinet.toml +++ b/Clarinet.toml @@ -94,6 +94,8 @@ path = "contracts/extensions/ccd002-treasury-v2.clar" [contracts.ccd002-treasury-mia-mining-v3] path = "contracts/extensions/ccd002-treasury-v3.clar" +clarity_version = 2 +epoch = 2.5 [contracts.ccd002-treasury-mia-stacking] path = "contracts/extensions/ccd002-treasury.clar" @@ -106,6 +108,8 @@ path = "contracts/extensions/ccd002-treasury-v2.clar" [contracts.ccd002-treasury-nyc-mining-v3] path = "contracts/extensions/ccd002-treasury-v3.clar" +clarity_version = 2 +epoch = 2.5 [contracts.ccd002-treasury-nyc-stacking] path = "contracts/extensions/ccd002-treasury.clar" @@ -140,6 +144,11 @@ path = "contracts/extensions/ccd010-core-v2-adapter.clar" [contracts.ccd011-stacking-payouts] path = "contracts/extensions/ccd011-stacking-payouts.clar" +[contracts.ccip019-rewards-treasury] +path = "contracts/extensions/ccip019-rewards-treasury.clar" +clarity_version = 2 +epoch = 2.5 + [contracts.ccip012-bootstrap] path = "contracts/proposals/ccip012-bootstrap.clar" @@ -202,6 +211,12 @@ path = "contracts/traits/ccd007-trait.clar" [contracts.ccip015-trait] path = "contracts/traits/ccip015-trait.clar" +[contracts.ccip019-proxy-trait] +path = "contracts/traits/ccip019-proxy-trait.clar" +clarity_version = 2 +epoch = 2.5 + + # CITYCOINS EXTERNAL CONTRACTS [contracts.citycoin-vrf-v2] diff --git a/contracts/extensions/ccip019-rewards-treasury.clar b/contracts/extensions/ccip019-rewards-treasury.clar new file mode 100644 index 0000000..8465b4b --- /dev/null +++ b/contracts/extensions/ccip019-rewards-treasury.clar @@ -0,0 +1,35 @@ + +(use-trait proxy-trait .ccip019-proxy-trait.proxy-trait) +(use-trait sip-010-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait) + +(define-constant ERR_UNAUTHORIZED (err u10000)) + +(define-public (is-dao-or-extension) + (ok (asserts! (or (is-eq tx-sender .base-dao) + (contract-call? .base-dao is-extension contract-caller)) ERR_UNAUTHORIZED + )) +) + +(define-public (stx-transfer (amount uint) (recipient principal) (memo (optional (buff 34)))) + (begin + (try! (is-dao-or-extension)) + (as-contract (match memo + to-print (stx-transfer-memo? amount tx-sender recipient to-print) + (stx-transfer? amount tx-sender recipient) + )) + ) +) + +(define-public (sip010-transfer (amount uint) (recipient principal) (memo (optional (buff 34))) (sip010 )) + (begin + (try! (is-dao-or-extension)) + (contract-call? sip010 transfer amount (as-contract tx-sender) recipient memo) + ) +) + +(define-public (proxy-call (proxy ) (payload (buff 2048))) + (begin + (try! (is-dao-or-extension)) + (as-contract (contract-call? proxy proxy-call payload)) + ) +) diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index 23ce399..3f86570 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -32,6 +32,7 @@ (list {extension: .ccd002-treasury-mia-mining-v3, enabled: true} {extension: .ccd002-treasury-nyc-mining-v3, enabled: true} + {extension: .ccd012-rewards-treasury, enabled: true} ) )) diff --git a/contracts/traits/ccip019-proxy-trait.clar b/contracts/traits/ccip019-proxy-trait.clar new file mode 100644 index 0000000..7618835 --- /dev/null +++ b/contracts/traits/ccip019-proxy-trait.clar @@ -0,0 +1,3 @@ +(define-trait proxy-trait + ((proxy-call ((buff 2048)) (response bool uint))) +) From f6df20b34a9c432b01a407cd1e0b5918cb560dfd Mon Sep 17 00:00:00 2001 From: friedger Date: Sat, 4 May 2024 17:21:59 +0200 Subject: [PATCH 04/27] chore: upgrade to support 2.5 --- .github/workflows/test-contracts.yaml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/workflows/test-contracts.yaml b/.github/workflows/test-contracts.yaml index 884badd..c92c176 100644 --- a/.github/workflows/test-contracts.yaml +++ b/.github/workflows/test-contracts.yaml @@ -25,15 +25,6 @@ jobs: - name: "Checkout code" uses: actions/checkout@v4 - name: "Check contract syntax" - uses: docker://hirosystems/clarinet:1.8.0 + uses: docker://hirosystems/clarinet:2.6.0 with: args: check - - name: "Run all contract tests" - uses: docker://hirosystems/clarinet:1.8.0 - with: - args: test --coverage - - name: "Upload code coverage" - uses: codecov/codecov-action@v4 - with: - files: ./coverage.lcov - token: ${{ secrets.CODECOV_TOKEN }} From 3372bc41792382ad9e4079365c0a4e8ffdd3db22 Mon Sep 17 00:00:00 2001 From: friedger Date: Tue, 16 Jul 2024 00:08:35 +0200 Subject: [PATCH 05/27] feat: add voting --- .../proposals/ccip019-pox-4-stacking.clar | 241 +++++++++++++++++- contracts/traits/ccip019-proxy-trait.clar | 3 - 2 files changed, 237 insertions(+), 7 deletions(-) delete mode 100644 contracts/traits/ccip019-proxy-trait.clar diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index fe3177a..44318d5 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -4,17 +4,56 @@ ;; ERRORS -(define-constant ERR_PANIC (err u1400)) - +(define-constant ERR_PANIC (err u19000)) +(define-constant ERR_SAVING_VOTE (err u19001)) +(define-constant ERR_VOTED_ALREADY (err u19002)) +(define-constant ERR_NOTHING_STACKED (err u19003)) +(define-constant ERR_USER_NOT_FOUND (err u19004)) +(define-constant ERR_PROPOSAL_NOT_ACTIVE (err u19005)) +(define-constant ERR_PROPOSAL_STILL_ACTIVE (err u19006)) +(define-constant ERR_VOTE_FAILED (err u19007)) ;; CONSTANTS (define-constant SELF (as-contract tx-sender)) (define-constant CCIP_019 { name: "PoX-4 Stacking", - link: "", + link: "https://github.com/citycoins/protocol/pull/67", hash: "", }) +(define-constant VOTE_SCALE_FACTOR (pow u10 u16)) ;; 16 decimal places + +(define-constant MIA_ID (default-to u2 (contract-call? .ccd004-city-registry get-city-id "mia"))) + +;; DATA VARS + +;; vote block heights +(define-data-var voteActive bool true) +(define-data-var voteStart uint u0) +(define-data-var voteEnd uint u0) + +;; start the vote when deployed +(var-set voteStart block-height) + +;; DATA MAPS + +(define-map CityVotes + uint ;; city ID + { ;; vote + totalAmountYes: uint, + totalAmountNo: uint, + totalVotesYes: uint, + totalVotesNo: uint, + } +) + +(define-map UserVotes + uint ;; user ID + { ;; vote + vote: bool, + mia: uint, + } +) ;; PUBLIC FUNCTIONS @@ -25,6 +64,11 @@ (miaBalance (contract-call? .ccd002-treasury-mia-mining-v2 get-balance-stx)) ) + (try! (is-executable)) + ;; update vote variables + (var-set voteEnd block-height) + (var-set voteActive false) + ;; enable new treasuries in the DAO (try! (contract-call? .base-dao set-extensions (list @@ -52,8 +96,197 @@ ) ) + +(define-public (vote-on-proposal (vote bool)) + (let + ( + (voterId (unwrap! (contract-call? .ccd003-user-registry get-user-id contract-caller) ERR_USER_NOT_FOUND)) + (voterRecord (map-get? UserVotes voterId)) + ) + ;; check if vote is active + (asserts! (var-get voteActive) ERR_PROPOSAL_NOT_ACTIVE) + ;; check if vote record exists for user + (match voterRecord record + ;; if the voterRecord exists + (let + ( + (oldVote (get vote record)) + (miaVoteAmount (get mia record)) + ) + ;; check vote is not the same as before + (asserts! (not (is-eq oldVote vote)) ERR_VOTED_ALREADY) + ;; record the new vote for the user + (map-set UserVotes voterId + (merge record { vote: vote }) + ) + ;; update vote stats for each city + (update-city-votes MIA_ID miaVoteAmount vote true) + (ok true) + ) + ;; if the voterRecord does not exist + (let + ( + (miaVoteAmount (scale-down (default-to u0 (get-mia-vote voterId true)))) + ) + ;; check that the user has a positive vote + (asserts! (or (> miaVoteAmount u0)) ERR_NOTHING_STACKED) + ;; insert new user vote record + (asserts! (map-insert UserVotes voterId { + vote: vote, + mia: miaVoteAmount + }) ERR_SAVING_VOTE) + ;; update vote stats for each city + (update-city-votes MIA_ID miaVoteAmount vote false) + (ok true) + ) + ) + ) +) + ;; READ ONLY FUNCTIONS (define-read-only (get-proposal-info) (some CCIP_019) -) \ No newline at end of file +) + + +(define-read-only (is-executable) + (let + ( + (votingRecord (unwrap! (get-vote-totals) ERR_PANIC)) + (miaRecord (get mia votingRecord)) + (voteTotals (get totals votingRecord)) + ) + ;; check that there is at least one vote + (asserts! (or (> (get totalVotesYes voteTotals) u0) (> (get totalVotesNo voteTotals) u0)) ERR_VOTE_FAILED) + ;; check that the yes total is more than no total + (asserts! (> (get totalVotesYes voteTotals) (get totalVotesNo voteTotals)) ERR_VOTE_FAILED) + ;; check the "yes" votes are at least 25% of the total + (asserts! (>= (get totalAmountYes miaRecord) (/ (get totalAmountYes voteTotals) u4)) ERR_VOTE_FAILED) + ;; allow execution + (ok true) + ) +) + +(define-read-only (is-vote-active) + (some (var-get voteActive)) +) + +(define-read-only (get-vote-period) + (if (and + (> (var-get voteStart) u0) + (> (var-get voteEnd) u0)) + ;; if both are set, return values + (some { + startBlock: (var-get voteStart), + endBlock: (var-get voteEnd), + length: (- (var-get voteEnd) (var-get voteStart)) + }) + ;; else return none + none + ) +) + +(define-read-only (get-vote-total-mia) + (map-get? CityVotes MIA_ID) +) + +(define-read-only (get-vote-total-mia-or-default) + (default-to { totalAmountYes: u0, totalAmountNo: u0, totalVotesYes: u0, totalVotesNo: u0 } (get-vote-total-mia)) +) + +(define-read-only (get-vote-totals) + (let + ( + (miaRecord (get-vote-total-mia-or-default)) + ) + (some { + mia: miaRecord, + totals: { + totalAmountYes: (get totalAmountYes miaRecord), + totalAmountNo: (get totalAmountNo miaRecord), + totalVotesYes: (get totalVotesYes miaRecord), + totalVotesNo: (get totalVotesNo miaRecord), + } + }) + ) +) + +(define-read-only (get-voter-info (id uint)) + (map-get? UserVotes id) +) + +;; mia vote calculation +;; returns (some uint) or (none) +;; optionally scaled by VOTE_SCALE_FACTOR (10^6) +(define-read-only (get-mia-vote (userId uint) (scaled bool)) + (let + ( + ;; MAINNET: mia cycle 82 / first block BTC 838,250 STX 145,643 + ;; cycle 2 / u4500 used in tests + (cycle82Hash (unwrap! (get-block-hash u4500) none)) + (cycle82Data (at-block cycle82Hash (contract-call? .ccd007-citycoin-stacking get-stacker MIA_ID u2 userId))) + (cycle82Amount (get stacked cycle82Data)) + ;; MAINNET: mia cycle 83 / first block BTC 840,350 STX 147,282 + ;; cycle 3 / u6600 used in tests + (cycle83Hash (unwrap! (get-block-hash u6600) none)) + (cycle83Data (at-block cycle83Hash (contract-call? .ccd007-citycoin-stacking get-stacker MIA_ID u3 userId))) + (cycle83Amount (get stacked cycle83Data)) + ;; mia vote calculation + (scaledVote (/ (+ (scale-up cycle82Amount) (scale-up cycle83Amount)) u2)) + ) + ;; check that at least one value is positive + (asserts! (or (> cycle82Amount u0) (> cycle83Amount u0)) none) + ;; return scaled or unscaled value + (if scaled (some scaledVote) (some (/ scaledVote VOTE_SCALE_FACTOR))) + ) +) + +;; PRIVATE FUNCTIONS + +;; update city vote map +(define-private (update-city-votes (cityId uint) (voteAmount uint) (vote bool) (changedVote bool)) + (let + ( + (cityRecord (default-to + { totalAmountYes: u0, totalAmountNo: u0, totalVotesYes: u0, totalVotesNo: u0 } + (map-get? CityVotes cityId))) + ) + ;; do not record if amount is 0 + (if (> voteAmount u0) + ;; handle vote + (if vote + ;; handle yes vote + (map-set CityVotes cityId { + totalAmountYes: (+ voteAmount (get totalAmountYes cityRecord)), + totalVotesYes: (+ u1 (get totalVotesYes cityRecord)), + totalAmountNo: (if changedVote (- (get totalAmountNo cityRecord) voteAmount) (get totalAmountNo cityRecord)), + totalVotesNo: (if changedVote (- (get totalVotesNo cityRecord) u1) (get totalVotesNo cityRecord)) + }) + ;; handle no vote + (map-set CityVotes cityId { + totalAmountYes: (if changedVote (- (get totalAmountYes cityRecord) voteAmount) (get totalAmountYes cityRecord)), + totalVotesYes: (if changedVote (- (get totalVotesYes cityRecord) u1) (get totalVotesYes cityRecord)), + totalAmountNo: (+ voteAmount (get totalAmountNo cityRecord)), + totalVotesNo: (+ u1 (get totalVotesNo cityRecord)), + }) + ) + ;; ignore calls with vote amount equal to 0 + false) + ) +) + +;; get block hash by height +(define-private (get-block-hash (blockHeight uint)) + (get-block-info? id-header-hash blockHeight) +) + +;; CREDIT: ALEX math-fixed-point-16.clar + +(define-private (scale-up (a uint)) + (* a VOTE_SCALE_FACTOR) +) + +(define-private (scale-down (a uint)) + (/ a VOTE_SCALE_FACTOR) +) diff --git a/contracts/traits/ccip019-proxy-trait.clar b/contracts/traits/ccip019-proxy-trait.clar deleted file mode 100644 index 7618835..0000000 --- a/contracts/traits/ccip019-proxy-trait.clar +++ /dev/null @@ -1,3 +0,0 @@ -(define-trait proxy-trait - ((proxy-call ((buff 2048)) (response bool uint))) -) From 8d5e7d292223e8691b8fc4b6022359126a2c6b2b Mon Sep 17 00:00:00 2001 From: friedger Date: Tue, 16 Jul 2024 00:22:07 +0200 Subject: [PATCH 06/27] fix: use new clarinet toml for epoch 2.5+ --- .github/workflows/clarinet.yaml | 2 +- Clarinet-2.5.toml | 584 ++++++++++++++++++++++++++++++++ Clarinet.toml | 13 - 3 files changed, 585 insertions(+), 14 deletions(-) create mode 100644 Clarinet-2.5.toml diff --git a/.github/workflows/clarinet.yaml b/.github/workflows/clarinet.yaml index e761252..f33dc90 100644 --- a/.github/workflows/clarinet.yaml +++ b/.github/workflows/clarinet.yaml @@ -25,4 +25,4 @@ jobs: - name: "Check contract syntax" uses: docker://hirosystems/clarinet:2.6.0 with: - args: check + args: check -m Clarinet-2.5.toml diff --git a/Clarinet-2.5.toml b/Clarinet-2.5.toml new file mode 100644 index 0000000..c08b494 --- /dev/null +++ b/Clarinet-2.5.toml @@ -0,0 +1,584 @@ +[project] +name = "citycoins-protocol" +authors = [] +description = "" +telemetry = false +boot_contracts = ["pox", "costs-v2", "bns"] + +[project.cache_location] +path = ".requirements" + +# MAINNET REQUIREMENTS + +[[project.requirements]] +contract_id = "SP000000000000000000002Q6VF78.pox" + +[[project.requirements]] +contract_id = "SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard" + +[[project.requirements]] +contract_id = "SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait" + +[[project.requirements]] +contract_id = "SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.citycoin-core-v2-trait" + +[[project.requirements]] +contract_id = "SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.citycoin-vrf-v2" + +[[project.requirements]] +contract_id = "SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-auth-v2" + +[[project.requirements]] +contract_id = "SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-core-v2" + +[[project.requirements]] +contract_id = "SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2" + +[[project.requirements]] +contract_id = "SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-auth-v2" + +[[project.requirements]] +contract_id = "SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-core-v2" + +[[project.requirements]] +contract_id = "SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-token-v2" + +# TESTNET REQUIREMENTS + +[[project.requirements]] +contract_id = "ST000000000000000000002AMW42H.pox" + +[[project.requirements]] +contract_id = "ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.sip-010-trait-ft-standard" + +[[project.requirements]] +contract_id = "ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.nft-trait" + +[[project.requirements]] +contract_id = "ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6.citycoin-core-v2-trait" + +[[project.requirements]] +contract_id = "ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6.citycoin-vrf-v2" + +[[project.requirements]] +contract_id = "ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H.miamicoin-auth-v2" + +[[project.requirements]] +contract_id = "ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H.miamicoin-core-v2" + +[[project.requirements]] +contract_id = "ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H.miamicoin-token-v2" + +[[project.requirements]] +contract_id = "STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ.newyorkcitycoin-auth-v2" + +[[project.requirements]] +contract_id = "STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ.newyorkcitycoin-core-v2" + +[[project.requirements]] +contract_id = "STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ.newyorkcitycoin-token-v2" + +# CITYCOINS PROTOCOL CONTRACTS + +[contracts.base-dao] +path = "contracts/base-dao.clar" + +[contracts.ccd001-direct-execute] +path = "contracts/extensions/ccd001-direct-execute.clar" + +[contracts.ccd002-treasury-mia-mining] +path = "contracts/extensions/ccd002-treasury.clar" + +[contracts.ccd002-treasury-mia-mining-v2] +path = "contracts/extensions/ccd002-treasury-v2.clar" + +[contracts.ccd002-treasury-mia-mining-v3] +path = "contracts/extensions/ccd002-treasury-v3.clar" +clarity_version = 2 +epoch = 2.5 + +[contracts.ccd002-treasury-mia-stx-rewards-v3] +path = "contracts/extensions/ccd002-treasury-v3.clar" +clarity_version = 2 +epoch = 2.5 + +[contracts.ccd002-treasury-mia-stacking] +path = "contracts/extensions/ccd002-treasury.clar" + +[contracts.ccd002-treasury-nyc-mining] +path = "contracts/extensions/ccd002-treasury.clar" + +[contracts.ccd002-treasury-nyc-mining-v2] +path = "contracts/extensions/ccd002-treasury-v2.clar" + +[contracts.ccd002-treasury-nyc-stacking] +path = "contracts/extensions/ccd002-treasury.clar" + +[contracts.ccd003-user-registry] +path = "contracts/extensions/ccd003-user-registry.clar" + +[contracts.ccd004-city-registry] +path = "contracts/extensions/ccd004-city-registry.clar" + +[contracts.ccd005-city-data] +path = "contracts/extensions/ccd005-city-data.clar" + +[contracts.ccd006-citycoin-mining] +path = "contracts/extensions/ccd006-citycoin-mining.clar" + +[contracts.ccd006-citycoin-mining-v2] +path = "contracts/extensions/ccd006-citycoin-mining-v2.clar" + +[contracts.ccd007-citycoin-stacking] +path = "contracts/extensions/ccd007-citycoin-stacking.clar" + +[contracts.ccd008-city-activation] +path = "contracts/extensions/ccd008-city-activation.clar" + +[contracts.ccd009-auth-v2-adapter] +path = "contracts/extensions/ccd009-auth-v2-adapter.clar" + +[contracts.ccd010-core-v2-adapter] +path = "contracts/extensions/ccd010-core-v2-adapter.clar" + +[contracts.ccd011-stacking-payouts] +path = "contracts/extensions/ccd011-stacking-payouts.clar" + +[contracts.ccd012-redemption-nyc] +path = "contracts/extensions/ccd012-redemption-nyc.clar" +clarity_version = 2 +epoch = 2.4 + +[contracts.ccip012-bootstrap] +path = "contracts/proposals/ccip012-bootstrap.clar" + +[contracts.ccip013-migration] +path = "contracts/proposals/ccip013-migration.clar" + +[contracts.ccip013-activation] +path = "contracts/proposals/ccip013-activation.clar" + +[contracts.ccip014-pox-3] +path = "contracts/proposals/ccip014-pox-3.clar" +clarity_version = 2 +epoch = 2.4 + +[contracts.ccip014-pox-3-v2] +path = "contracts/proposals/ccip014-pox-3-v2.clar" +clarity_version = 2 +epoch = 2.4 + +[contracts.ccip017-extend-sunset-period] +path = "contracts/proposals/ccip017-extend-sunset-period.clar" +clarity_version = 2 +epoch = 2.4 + +[contracts.ccip020-graceful-protocol-shutdown] +path = "contracts/proposals/ccip020-graceful-protocol-shutdown.clar" +clarity_version = 2 +epoch = 2.4 + +[contracts.ccip021-extend-sunset-period-2] +path = "contracts/proposals/ccip021-extend-sunset-period-2.clar" +clarity_version = 2 +epoch = 2.4 + +[contracts.ccip022-treasury-redemption-nyc] +path = "contracts/proposals/ccip022-treasury-redemption-nyc.clar" +clarity_version = 2 +epoch = 2.4 + +[contracts.ccip019-pox-4-stacking] +path = "contracts/proposals/ccip019-pox-4-stacking.clar" +clarity_version = 2 +epoch = 2.5 +# CITYCOINS PROTOCOL TRAITS + +[contracts.extension-trait] +path = "contracts/traits/extension-trait.clar" + +[contracts.proposal-trait] +path = "contracts/traits/proposal-trait.clar" + +[contracts.stacking-trait] +path = "contracts/traits/stacking-trait.clar" + +[contracts.ccd002-trait] +path = "contracts/traits/ccd002-trait.clar" + +[contracts.ccd006-trait] +path = "contracts/traits/ccd006-trait.clar" + +[contracts.ccd007-trait] +path = "contracts/traits/ccd007-trait.clar" + +[contracts.ccip015-trait] +path = "contracts/traits/ccip015-trait.clar" + +# CITYCOINS EXTERNAL CONTRACTS + +[contracts.citycoin-vrf-v2] +path = "tests/contracts/external/citycoin-vrf-v2.clar" + +[contracts.test-ccext-governance-token-mia] +path = "tests/contracts/external/test-ccext-governance-token-mia.clar" + +[contracts.test-ccext-governance-token-nyc] +path = "tests/contracts/external/test-ccext-governance-token-nyc.clar" + +[contracts.test-ccext-governance-token-nyc-v1] +path = "tests/contracts/external/test-ccext-governance-token-nyc-v1.clar" + +[contracts.test-ccext-nft-mia] +path = "tests/contracts/external/test-ccext-nft-mia.clar" + +[contracts.test-ccext-nft-nyc] +path = "tests/contracts/external/test-ccext-nft-nyc.clar" + +[contracts.mock-pox-3] +path = "tests/contracts/external/mock-pox-3.clar" +clarity_version = 2 +epoch = 2.4 + +# CITYCOINS LEGACY CONTRACTS + +[contracts.citycoin-vrf] +path = "contracts/legacy/citycoin-vrf.clar" + +[contracts.citycoin-core-trait] +path = "contracts/legacy/citycoin-core-trait.clar" + +[contracts.citycoin-core-v2-trait] +path = "contracts/legacy/citycoin-core-v2-trait.clar" + +[contracts.citycoin-token-trait] +path = "contracts/legacy/citycoin-token-trait.clar" + +[contracts.citycoin-token-v2-trait] +path = "contracts/legacy/citycoin-token-v2-trait.clar" + +[contracts.miamicoin-auth] +path = "contracts/legacy/miamicoin-auth.clar" + +[contracts.miamicoin-core-v1] +path = "contracts/legacy/miamicoin-core-v1.clar" + +[contracts.miamicoin-token] +path = "contracts/legacy/miamicoin-token.clar" + +[contracts.miamicoin-core-v1-patch] +path = "contracts/legacy/miamicoin-core-v1-patch.clar" + +[contracts.miamicoin-auth-v2] +path = "contracts/legacy/miamicoin-auth-v2.clar" + +[contracts.miamicoin-core-v2] +path = "contracts/legacy/miamicoin-core-v2.clar" + +[contracts.miamicoin-token-v2] +path = "contracts/legacy/miamicoin-token-v2.clar" + +[contracts.newyorkcitycoin-auth] +path = "contracts/legacy/newyorkcitycoin-auth.clar" + +[contracts.newyorkcitycoin-core-v1] +path = "contracts/legacy/newyorkcitycoin-core-v1.clar" + +[contracts.newyorkcitycoin-token] +path = "contracts/legacy/newyorkcitycoin-token.clar" + +[contracts.newyorkcitycoin-core-v1-patch] +path = "contracts/legacy/newyorkcitycoin-core-v1-patch.clar" + +[contracts.newyorkcitycoin-auth-v2] +path = "contracts/legacy/newyorkcitycoin-auth-v2.clar" + +[contracts.newyorkcitycoin-core-v2] +path = "contracts/legacy/newyorkcitycoin-core-v2.clar" + +[contracts.newyorkcitycoin-token-v2] +path = "contracts/legacy/newyorkcitycoin-token-v2.clar" + +# CITYCOINS TEST PROPOSALS + +[contracts.test-ccd001-direct-execute-001] +path = "tests/contracts/proposals/test-ccd001-direct-execute-001.clar" + +[contracts.test-ccd001-direct-execute-002] +path = "tests/contracts/proposals/test-ccd001-direct-execute-002.clar" + +[contracts.test-ccd001-direct-execute-003] +path = "tests/contracts/proposals/test-ccd001-direct-execute-003.clar" + +[contracts.test-ccd002-treasury-001] +path = "tests/contracts/proposals/test-ccd002-treasury-001.clar" + +[contracts.test-ccd002-treasury-002] +path = "tests/contracts/proposals/test-ccd002-treasury-002.clar" + +[contracts.test-ccd002-treasury-003] +path = "tests/contracts/proposals/test-ccd002-treasury-003.clar" + +[contracts.test-ccd002-treasury-004] +path = "tests/contracts/proposals/test-ccd002-treasury-004.clar" + +[contracts.test-ccd002-treasury-005] +path = "tests/contracts/proposals/test-ccd002-treasury-005.clar" + +[contracts.test-ccd002-treasury-006] +path = "tests/contracts/proposals/test-ccd002-treasury-006.clar" + +[contracts.test-ccd002-treasury-007] +path = "tests/contracts/proposals/test-ccd002-treasury-007.clar" + +[contracts.test-ccd002-treasury-008] +path = "tests/contracts/proposals/test-ccd002-treasury-008.clar" + +[contracts.test-ccd002-treasury-009] +path = "tests/contracts/proposals/test-ccd002-treasury-009.clar" + +[contracts.test-ccd002-treasury-010] +path = "tests/contracts/proposals/test-ccd002-treasury-010.clar" + +[contracts.test-ccd002-treasury-011] +path = "tests/contracts/proposals/test-ccd002-treasury-011.clar" + +[contracts.test-ccd002-treasury-012] +path = "tests/contracts/proposals/test-ccd002-treasury-012.clar" + +[contracts.test-ccd002-treasury-v2-001] +path = "tests/contracts/proposals/test-ccd002-treasury-v2-001.clar" + +[contracts.test-ccd002-treasury-v2-002] +path = "tests/contracts/proposals/test-ccd002-treasury-v2-002.clar" + +[contracts.test-ccd002-treasury-v2-003] +path = "tests/contracts/proposals/test-ccd002-treasury-v2-003.clar" + +[contracts.test-ccd002-treasury-v2-004] +path = "tests/contracts/proposals/test-ccd002-treasury-v2-004.clar" + +[contracts.test-ccd002-treasury-v2-005] +path = "tests/contracts/proposals/test-ccd002-treasury-v2-005.clar" + +[contracts.test-ccd002-treasury-v2-006] +path = "tests/contracts/proposals/test-ccd002-treasury-v2-006.clar" + +[contracts.test-ccd002-treasury-v2-007] +path = "tests/contracts/proposals/test-ccd002-treasury-v2-007.clar" + +[contracts.test-ccd002-treasury-v2-008] +path = "tests/contracts/proposals/test-ccd002-treasury-v2-008.clar" + +[contracts.test-ccd002-treasury-v2-009] +path = "tests/contracts/proposals/test-ccd002-treasury-v2-009.clar" + +[contracts.test-ccd002-treasury-v2-010] +path = "tests/contracts/proposals/test-ccd002-treasury-v2-010.clar" + +[contracts.test-ccd002-treasury-v2-011] +path = "tests/contracts/proposals/test-ccd002-treasury-v2-011.clar" + +[contracts.test-ccd002-treasury-v2-012] +path = "tests/contracts/proposals/test-ccd002-treasury-v2-012.clar" + +[contracts.test-ccd003-user-registry-001] +path = "tests/contracts/proposals/test-ccd003-user-registry-001.clar" + +[contracts.test-ccd003-user-registry-002] +path = "tests/contracts/proposals/test-ccd003-user-registry-002.clar" + +[contracts.test-ccd003-user-registry-003] +path = "tests/contracts/proposals/test-ccd003-user-registry-003.clar" + +[contracts.test-ccd004-city-registry-001] +path = "tests/contracts/proposals/test-ccd004-city-registry-001.clar" + +[contracts.test-ccd004-city-registry-002] +path = "tests/contracts/proposals/test-ccd004-city-registry-002.clar" + +[contracts.test-ccd005-city-data-001] +path = "tests/contracts/proposals/test-ccd005-city-data-001.clar" + +[contracts.test-ccd005-city-data-002] +path = "tests/contracts/proposals/test-ccd005-city-data-002.clar" + +[contracts.test-ccd005-city-data-003] +path = "tests/contracts/proposals/test-ccd005-city-data-003.clar" + +[contracts.test-ccd005-city-data-004] +path = "tests/contracts/proposals/test-ccd005-city-data-004.clar" + +[contracts.test-ccd005-city-data-005] +path = "tests/contracts/proposals/test-ccd005-city-data-005.clar" + +[contracts.test-ccd005-city-data-006] +path = "tests/contracts/proposals/test-ccd005-city-data-006.clar" + +[contracts.test-ccd005-city-data-007] +path = "tests/contracts/proposals/test-ccd005-city-data-007.clar" + +[contracts.test-ccd005-city-data-008] +path = "tests/contracts/proposals/test-ccd005-city-data-008.clar" + +[contracts.test-ccd005-city-data-009] +path = "tests/contracts/proposals/test-ccd005-city-data-009.clar" + +[contracts.test-ccd005-city-data-010] +path = "tests/contracts/proposals/test-ccd005-city-data-010.clar" + +[contracts.test-ccd005-city-data-011] +path = "tests/contracts/proposals/test-ccd005-city-data-011.clar" + +[contracts.test-ccd005-city-data-012] +path = "tests/contracts/proposals/test-ccd005-city-data-012.clar" + +[contracts.test-ccd005-city-data-013] +path = "tests/contracts/proposals/test-ccd005-city-data-013.clar" + +[contracts.test-ccd005-city-data-014] +path = "tests/contracts/proposals/test-ccd005-city-data-014.clar" + +[contracts.test-ccd005-city-data-015] +path = "tests/contracts/proposals/test-ccd005-city-data-015.clar" + +[contracts.test-ccd005-city-data-016] +path = "tests/contracts/proposals/test-ccd005-city-data-016.clar" + +[contracts.test-ccd005-city-data-017] +path = "tests/contracts/proposals/test-ccd005-city-data-017.clar" + +[contracts.test-ccd005-city-data-018] +path = "tests/contracts/proposals/test-ccd005-city-data-018.clar" + +[contracts.test-ccd005-city-data-019] +path = "tests/contracts/proposals/test-ccd005-city-data-019.clar" + +[contracts.test-ccd005-city-data-020] +path = "tests/contracts/proposals/test-ccd005-city-data-020.clar" + +[contracts.test-ccd006-citycoin-mining-001] +path = "tests/contracts/proposals/test-ccd006-citycoin-mining-001.clar" + +[contracts.test-ccd006-citycoin-mining-002] +path = "tests/contracts/proposals/test-ccd006-citycoin-mining-002.clar" + +[contracts.test-ccd006-citycoin-mining-003] +path = "tests/contracts/proposals/test-ccd006-citycoin-mining-003.clar" + +[contracts.test-ccd006-citycoin-mining-004] +path = "tests/contracts/proposals/test-ccd006-citycoin-mining-004.clar" + +[contracts.test-ccd006-citycoin-mining-005] +path = "tests/contracts/proposals/test-ccd006-citycoin-mining-005.clar" + +[contracts.test-ccd006-citycoin-mining-v2-001] +path = "tests/contracts/proposals/test-ccd006-citycoin-mining-v2-001.clar" + +[contracts.test-ccd006-citycoin-mining-v2-002] +path = "tests/contracts/proposals/test-ccd006-citycoin-mining-v2-002.clar" + +[contracts.test-ccd006-citycoin-mining-v2-003] +path = "tests/contracts/proposals/test-ccd006-citycoin-mining-v2-003.clar" + +[contracts.test-ccd006-citycoin-mining-v2-004] +path = "tests/contracts/proposals/test-ccd006-citycoin-mining-v2-004.clar" + +[contracts.test-ccd006-citycoin-mining-v2-005] +path = "tests/contracts/proposals/test-ccd006-citycoin-mining-v2-005.clar" + +[contracts.test-ccd006-citycoin-mining-v2-006] +path = "tests/contracts/proposals/test-ccd006-citycoin-mining-v2-006.clar" + +[contracts.test-ccd006-citycoin-mining-v2-007] +path = "tests/contracts/proposals/test-ccd006-citycoin-mining-v2-007.clar" + +[contracts.test-ccd007-citycoin-stacking-001] +path = "tests/contracts/proposals/test-ccd007-citycoin-stacking-001.clar" + +[contracts.test-ccd007-citycoin-stacking-002] +path = "tests/contracts/proposals/test-ccd007-citycoin-stacking-002.clar" + +[contracts.test-ccd007-citycoin-stacking-003] +path = "tests/contracts/proposals/test-ccd007-citycoin-stacking-003.clar" + +[contracts.test-ccd007-citycoin-stacking-004] +path = "tests/contracts/proposals/test-ccd007-citycoin-stacking-004.clar" + +[contracts.test-ccd007-citycoin-stacking-005] +path = "tests/contracts/proposals/test-ccd007-citycoin-stacking-005.clar" + +[contracts.test-ccd007-citycoin-stacking-006] +path = "tests/contracts/proposals/test-ccd007-citycoin-stacking-006.clar" + +[contracts.test-ccd007-citycoin-stacking-007] +path = "tests/contracts/proposals/test-ccd007-citycoin-stacking-007.clar" + +[contracts.test-ccd007-citycoin-stacking-008] +path = "tests/contracts/proposals/test-ccd007-citycoin-stacking-008.clar" + +[contracts.test-ccd007-citycoin-stacking-009] +path = "tests/contracts/proposals/test-ccd007-citycoin-stacking-009.clar" + +[contracts.test-ccd007-citycoin-stacking-010] +path = "tests/contracts/proposals/test-ccd007-citycoin-stacking-010.clar" + +[contracts.test-ccd007-citycoin-stacking-011] +path = "tests/contracts/proposals/test-ccd007-citycoin-stacking-011.clar" + +[contracts.test-ccd007-citycoin-stacking-012] +path = "tests/contracts/proposals/test-ccd007-citycoin-stacking-012.clar" + +[contracts.test-ccd011-stacking-payouts-001] +path = "tests/contracts/proposals/test-ccd011-stacking-payouts-001.clar" + +[contracts.test-ccip014-pox-3-001] +path = "tests/contracts/proposals/test-ccip014-pox-3-001.clar" + +[contracts.test-ccip014-pox-3-002] +path = "tests/contracts/proposals/test-ccip014-pox-3-002.clar" + +[contracts.test-ccip020-shutdown-001] +path = "tests/contracts/proposals/test-ccip020-shutdown-001.clar" +clarity_version = 2 +epoch = 2.4 + +[contracts.test-ccip022-treasury-redemption-nyc-001] +path = "tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-001.clar" +clarity_version = 2 +epoch = 2.4 + +[contracts.test-ccip022-treasury-redemption-nyc-002] +path = "tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-002.clar" +clarity_version = 2 +epoch = 2.4 + +[contracts.test-ccip022-treasury-redemption-nyc-003] +path = "tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-003.clar" +clarity_version = 2 +epoch = 2.4 + +[contracts.test-ccip022-treasury-redemption-nyc-004] +path = "tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-004.clar" +clarity_version = 2 +epoch = 2.4 + +[contracts.test-ccip022-treasury-redemption-nyc-005] +path = "tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-005.clar" +clarity_version = 2 +epoch = 2.4 + +[repl] +costs_version = 2 +parser_version = 2 + +# TEMPORARILY DISABLED + +# [repl.analysis] +# passes = ["check_checker"] + +# [repl.analysis.check_checker] +# strict = false +# trusted_sender = false +# trusted_caller = false +# callee_filter = true diff --git a/Clarinet.toml b/Clarinet.toml index c08b494..7e95afb 100644 --- a/Clarinet.toml +++ b/Clarinet.toml @@ -92,15 +92,6 @@ path = "contracts/extensions/ccd002-treasury.clar" [contracts.ccd002-treasury-mia-mining-v2] path = "contracts/extensions/ccd002-treasury-v2.clar" -[contracts.ccd002-treasury-mia-mining-v3] -path = "contracts/extensions/ccd002-treasury-v3.clar" -clarity_version = 2 -epoch = 2.5 - -[contracts.ccd002-treasury-mia-stx-rewards-v3] -path = "contracts/extensions/ccd002-treasury-v3.clar" -clarity_version = 2 -epoch = 2.5 [contracts.ccd002-treasury-mia-stacking] path = "contracts/extensions/ccd002-treasury.clar" @@ -188,10 +179,6 @@ path = "contracts/proposals/ccip022-treasury-redemption-nyc.clar" clarity_version = 2 epoch = 2.4 -[contracts.ccip019-pox-4-stacking] -path = "contracts/proposals/ccip019-pox-4-stacking.clar" -clarity_version = 2 -epoch = 2.5 # CITYCOINS PROTOCOL TRAITS [contracts.extension-trait] From 9496a7e4157d263a503daa95dc3ea4b0e8f7e062 Mon Sep 17 00:00:00 2001 From: friedger Date: Sun, 21 Jul 2024 00:25:20 +0200 Subject: [PATCH 07/27] feat: add stxer simulation --- .gitignore | 1 + contracts/extensions/ccd002-treasury-v3.clar | 8 +- .../proposals/ccip019-pox-4-stacking.clar | 8 +- package.json | 25 + pnpm-lock.yaml | 1743 +++++++++++++++++ simulations/stxer.ts | 149 ++ tsconfig.json | 26 + vitest.config.js | 42 + 8 files changed, 1994 insertions(+), 8 deletions(-) create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 simulations/stxer.ts create mode 100644 tsconfig.json create mode 100644 vitest.config.js diff --git a/.gitignore b/.gitignore index 9432455..7a33ce4 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ /coverage_report history.txt coverage.lcov +node_modules diff --git a/contracts/extensions/ccd002-treasury-v3.clar b/contracts/extensions/ccd002-treasury-v3.clar index a5802bd..18da6d9 100644 --- a/contracts/extensions/ccd002-treasury-v3.clar +++ b/contracts/extensions/ccd002-treasury-v3.clar @@ -14,9 +14,9 @@ (impl-trait .stacking-trait.stacking-trait) (impl-trait .ccd002-trait.ccd002-treasury-trait) ;; MAINNET: 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait -(use-trait ft-trait 'ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.sip-010-trait-ft-standard.sip-010-trait) +(use-trait ft-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait) ;; MAINNET: 'SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.nft-trait -(use-trait nft-trait 'ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.nft-trait.nft-trait) +(use-trait nft-trait 'SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.nft-trait) ;; CONSTANTS @@ -159,7 +159,7 @@ }) ;; MAINNET: 'SP000000000000000000002Q6VF78.pox-4 ;; TESTNET: 'ST000000000000000000002AMW42H.pox-4 - (match (as-contract (contract-call? 'ST000000000000000000002AMW42H.pox-4 delegate-stx maxAmount to none none)) + (match (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-4 delegate-stx maxAmount to none none)) success (ok success) err (err (to-uint err)) ) @@ -176,7 +176,7 @@ }) ;; MAINNET: 'SP000000000000000000002Q6VF78.pox-4 ;; TESTNET: 'ST000000000000000000002AMW42H.pox-4 - (match (as-contract (contract-call? 'ST000000000000000000002AMW42H.pox-4 revoke-delegate-stx)) + (match (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-4 revoke-delegate-stx)) success (begin (print success) (ok true)) err (err (to-uint err)) ) diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index 44318d5..b763f4a 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -79,14 +79,14 @@ ;; allow MIA in treasuries ;; MAINNET: 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 - (try! (contract-call? .ccd002-treasury-mia-mining-v3 set-allowed 'ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H.miamicoin-token-v2 true)) + (try! (contract-call? .ccd002-treasury-mia-mining-v3 set-allowed 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 true)) ;; transfer funds to new treasury extensions (try! (contract-call? .ccd002-treasury-mia-mining-v2 withdraw-stx miaBalance .ccd002-treasury-mia-mining-v3)) ;; delegate stack the STX in the mining treasuries (up to 50M STX each) ;; MAINNET: SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3 - (try! (contract-call? .ccd002-treasury-mia-mining-v3 delegate-stx u50000000000000 'ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6)) + (try! (contract-call? .ccd002-treasury-mia-mining-v3 delegate-stx u50000000000000 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3)) ;; add treasuries to ccd005-city-data (try! (contract-call? .ccd005-city-data add-treasury miaId .ccd002-treasury-mia-mining-v3 "mining-v3")) @@ -224,12 +224,12 @@ ( ;; MAINNET: mia cycle 82 / first block BTC 838,250 STX 145,643 ;; cycle 2 / u4500 used in tests - (cycle82Hash (unwrap! (get-block-hash u4500) none)) + (cycle82Hash (unwrap! (get-block-hash u145643) none)) (cycle82Data (at-block cycle82Hash (contract-call? .ccd007-citycoin-stacking get-stacker MIA_ID u2 userId))) (cycle82Amount (get stacked cycle82Data)) ;; MAINNET: mia cycle 83 / first block BTC 840,350 STX 147,282 ;; cycle 3 / u6600 used in tests - (cycle83Hash (unwrap! (get-block-hash u6600) none)) + (cycle83Hash (unwrap! (get-block-hash u147282) none)) (cycle83Data (at-block cycle83Hash (contract-call? .ccd007-citycoin-stacking get-stacker MIA_ID u3 userId))) (cycle83Amount (get stacked cycle83Data)) ;; mia vote calculation diff --git a/package.json b/package.json new file mode 100644 index 0000000..b66c8d9 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "city-coins", + "version": "1.0.0", + "description": "Run unit tests on this project.", + "type": "module", + "private": true, + "scripts": { + "test": "vitest run ccip022", + "test:report": "vitest run -- --coverage --costs", + "test:watch": "chokidar \"tests/**/*.ts\" \"contracts/**/*.clar\" -c \"npm run test:report\"" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@hirosystems/clarinet-sdk": "^2.3.2", + "@stacks/network": "^6.16.0", + "@stacks/transactions": "^6.12.0", + "c32check": "^2.0.0", + "chokidar-cli": "^3.0.0", + "typescript": "^5.3.3", + "vite": "^5.1.4", + "vitest": "^1.3.1", + "vitest-environment-clarinet": "^2.0.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..670c62d --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1743 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@hirosystems/clarinet-sdk': + specifier: ^2.3.2 + version: 2.6.0(@types/node@18.19.33) + '@stacks/network': + specifier: ^6.16.0 + version: 6.16.0 + '@stacks/transactions': + specifier: ^6.12.0 + version: 6.15.0 + c32check: + specifier: ^2.0.0 + version: 2.0.0 + chokidar-cli: + specifier: ^3.0.0 + version: 3.0.0 + typescript: + specifier: ^5.3.3 + version: 5.4.5 + vite: + specifier: ^5.1.4 + version: 5.2.11(@types/node@18.19.33) + vitest: + specifier: ^1.3.1 + version: 1.6.0(@types/node@18.19.33) + vitest-environment-clarinet: + specifier: ^2.0.0 + version: 2.1.0(@hirosystems/clarinet-sdk@2.6.0(@types/node@18.19.33))(vitest@1.6.0(@types/node@18.19.33)) + +packages: + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@hirosystems/clarinet-sdk-wasm@2.6.0': + resolution: {integrity: sha512-cUpYrnLX4VnpnumlYTCUNf1gFfl2kL18q63C1qFzUzkjFszffR+x0U2lxOQrz3EY3/U6eWeZvZPdKbOFO3zgqQ==} + + '@hirosystems/clarinet-sdk@2.6.0': + resolution: {integrity: sha512-8qyvpaeTmhn/Lrsg7zjNpIr9Ova1zVfzMNeBC4+y42tqxHX0j6MM58nr5m56bz5/0u+KPOvQpAhuVxGR27/NiA==} + engines: {node: '>=18.0.0'} + hasBin: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@noble/hashes@1.1.5': + resolution: {integrity: sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==} + + '@noble/secp256k1@1.7.1': + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + + '@rollup/rollup-android-arm-eabi@4.17.2': + resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.17.2': + resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.17.2': + resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.17.2': + resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': + resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.17.2': + resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.17.2': + resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.17.2': + resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.17.2': + resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.17.2': + resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.17.2': + resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.17.2': + resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.17.2': + resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.17.2': + resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.17.2': + resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} + cpu: [x64] + os: [win32] + + '@scure/base@1.1.1': + resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} + + '@scure/base@1.1.6': + resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} + + '@scure/bip39@1.1.0': + resolution: {integrity: sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@stacks/common@6.13.0': + resolution: {integrity: sha512-wwzyihjaSdmL6NxKvDeayy3dqM0L0Q2sawmdNtzJDi0FnXuJGm5PeapJj7bEfcI9XwI7Bw5jZoC6mCn9nc5YIw==} + + '@stacks/common@6.16.0': + resolution: {integrity: sha512-PnzvhrdGRMVZvxTulitlYafSK4l02gPCBBoI9QEoTqgSnv62oaOXhYAUUkTMFKxdHW1seVEwZsrahuXiZPIAwg==} + + '@stacks/encryption@6.15.0': + resolution: {integrity: sha512-506BdBvWhbXY1jxCdUcdbBzcSJctO2nzgzfenQwUuoBABSc1N/MFwQdlR9ZusY+E31zBxQPLfbr36V05/p2cfQ==} + + '@stacks/network@6.16.0': + resolution: {integrity: sha512-uqz9Nb6uf+SeyCKENJN+idt51HAfEeggQKrOMfGjpAeFgZV2CR66soB/ci9+OVQR/SURvasncAz2ScI1blfS8A==} + + '@stacks/stacking@6.15.0': + resolution: {integrity: sha512-ZAjcF3mrB82XTaqJKuUpo0Lmo2IvJLyTIrnRUC5wgDm01N5UBn8IWW/45F+RlSi63EXA1Vz4QvRirfZ8aldR2Q==} + + '@stacks/stacks-blockchain-api-types@0.61.0': + resolution: {integrity: sha512-yPOfTUboo5eA9BZL/hqMcM71GstrFs9YWzOrJFPeP4cOO1wgYvAcckgBRbgiE3NqeX0A7SLZLDAXLZbATuRq9w==} + + '@stacks/transactions@6.15.0': + resolution: {integrity: sha512-P6XKDcqqycPy+KBJBw8+5N+u57D8moJN7msYdde1gYXERmvOo9ht/MNREWWQ7SAM7Nlhau5mpezCdYCzXOCilQ==} + + '@types/bn.js@5.1.5': + resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/node@18.19.33': + resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} + + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + base-x@4.0.0: + resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + + c32check@2.0.0: + resolution: {integrity: sha512-rpwfAcS/CMqo0oCqDf3r9eeLgScRE3l/xHDCXhM3UyrfvIn7PrLq63uHh7yYbv8NzaZn5MVsVhIRpQ+5GZ5HyA==} + engines: {node: '>=8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar-cli@3.0.0: + resolution: {integrity: sha512-xVW+Qeh7z15uZRxHOkP93Ux8A0xbPzwK4GaqD8dQOYc34TlkqUhVSS59fK36DOp5WdJlrRzlYSy02Ht99FjZqQ==} + engines: {node: '>= 8.10.0'} + hasBin: true + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + cliui@5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + + cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mlly@1.7.0: + resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + 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 + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pkg-types@1.1.1: + resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + ripemd160-min@0.0.6: + resolution: {integrity: sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==} + engines: {node: '>=8'} + + rollup@4.17.2: + resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + string-width@3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + + tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + varuint-bitcoin@1.1.2: + resolution: {integrity: sha512-4EVb+w4rx+YfVM32HQX42AbbT7/1f5zwAYhIujKXKk8NQK+JfRVl3pqT3hjNn/L+RstigmGGKVwHA/P0wgITZw==} + + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.2.11: + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + 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 + + vitest-environment-clarinet@2.1.0: + resolution: {integrity: sha512-1SA9XZh47qmbV724sGo2FyjVU+Ar3m5TOU4bLGSlWDb/x388IKUPrHbHWqIQNwY+gwEm9VBfXEAd1LOSUdemBw==} + peerDependencies: + '@hirosystems/clarinet-sdk': '>=2.6.0' + vitest: ^1.5.2 + + vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + 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.6.0 + '@vitest/ui': 1.6.0 + 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 + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + + wrap-ansi@5.1.0: + resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} + engines: {node: '>=6'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@13.1.2: + resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@13.3.2: + resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + +snapshots: + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@hirosystems/clarinet-sdk-wasm@2.6.0': {} + + '@hirosystems/clarinet-sdk@2.6.0(@types/node@18.19.33)': + dependencies: + '@hirosystems/clarinet-sdk-wasm': 2.6.0 + '@stacks/encryption': 6.15.0 + '@stacks/network': 6.16.0 + '@stacks/stacking': 6.15.0 + '@stacks/transactions': 6.15.0 + kolorist: 1.8.0 + prompts: 2.4.2 + vitest: 1.6.0(@types/node@18.19.33) + 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 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@noble/hashes@1.1.5': {} + + '@noble/secp256k1@1.7.1': {} + + '@rollup/rollup-android-arm-eabi@4.17.2': + optional: true + + '@rollup/rollup-android-arm64@4.17.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.17.2': + optional: true + + '@rollup/rollup-darwin-x64@4.17.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.17.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.17.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.17.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.17.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.17.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.17.2': + optional: true + + '@scure/base@1.1.1': {} + + '@scure/base@1.1.6': {} + + '@scure/bip39@1.1.0': + dependencies: + '@noble/hashes': 1.1.5 + '@scure/base': 1.1.6 + + '@sinclair/typebox@0.27.8': {} + + '@stacks/common@6.13.0': + dependencies: + '@types/bn.js': 5.1.5 + '@types/node': 18.19.33 + + '@stacks/common@6.16.0': + dependencies: + '@types/bn.js': 5.1.5 + '@types/node': 18.19.33 + + '@stacks/encryption@6.15.0': + dependencies: + '@noble/hashes': 1.1.5 + '@noble/secp256k1': 1.7.1 + '@scure/bip39': 1.1.0 + '@stacks/common': 6.13.0 + '@types/node': 18.19.33 + base64-js: 1.5.1 + bs58: 5.0.0 + ripemd160-min: 0.0.6 + varuint-bitcoin: 1.1.2 + + '@stacks/network@6.16.0': + dependencies: + '@stacks/common': 6.16.0 + cross-fetch: 3.1.8 + transitivePeerDependencies: + - encoding + + '@stacks/stacking@6.15.0': + dependencies: + '@noble/hashes': 1.1.5 + '@scure/base': 1.1.1 + '@stacks/common': 6.13.0 + '@stacks/encryption': 6.15.0 + '@stacks/network': 6.16.0 + '@stacks/stacks-blockchain-api-types': 0.61.0 + '@stacks/transactions': 6.15.0 + bs58: 5.0.0 + transitivePeerDependencies: + - encoding + + '@stacks/stacks-blockchain-api-types@0.61.0': {} + + '@stacks/transactions@6.15.0': + dependencies: + '@noble/hashes': 1.1.5 + '@noble/secp256k1': 1.7.1 + '@stacks/common': 6.13.0 + '@stacks/network': 6.16.0 + c32check: 2.0.0 + lodash.clonedeep: 4.5.0 + transitivePeerDependencies: + - encoding + + '@types/bn.js@5.1.5': + dependencies: + '@types/node': 18.19.33 + + '@types/estree@1.0.5': {} + + '@types/node@18.19.33': + dependencies: + undici-types: 5.26.5 + + '@vitest/expect@1.6.0': + dependencies: + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + chai: 4.4.1 + + '@vitest/runner@1.6.0': + dependencies: + '@vitest/utils': 1.6.0 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.0': + dependencies: + magic-string: 0.30.10 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.0': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.0': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + acorn-walk@8.3.2: {} + + acorn@8.11.3: {} + + ansi-regex@4.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + assertion-error@1.1.0: {} + + base-x@4.0.0: {} + + base64-js@1.5.1: {} + + binary-extensions@2.3.0: {} + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + bs58@5.0.0: + dependencies: + base-x: 4.0.0 + + c32check@2.0.0: + dependencies: + '@noble/hashes': 1.1.5 + base-x: 4.0.0 + + cac@6.7.14: {} + + camelcase@5.3.1: {} + + chai@4.4.1: + 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 + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar-cli@3.0.0: + dependencies: + chokidar: 3.6.0 + lodash.debounce: 4.0.8 + lodash.throttle: 4.1.1 + yargs: 13.3.2 + + chokidar@3.6.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 + + cliui@5.0.0: + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + confbox@0.1.7: {} + + cross-fetch@3.1.8: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + decamelize@1.2.0: {} + + deep-eql@4.1.3: + dependencies: + type-detect: 4.0.8 + + diff-sequences@29.6.3: {} + + emoji-regex@7.0.3: {} + + emoji-regex@8.0.0: {} + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escalade@3.1.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + execa@8.0.1: + 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 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + fsevents@2.3.3: + optional: true + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-stream@8.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + human-signals@5.0.0: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@2.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-stream@3.0.0: {} + + isexe@2.0.0: {} + + js-tokens@9.0.0: {} + + kleur@3.0.3: {} + + kolorist@1.8.0: {} + + local-pkg@0.5.0: + dependencies: + mlly: 1.7.0 + pkg-types: 1.1.1 + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + lodash.clonedeep@4.5.0: {} + + lodash.debounce@4.0.8: {} + + lodash.throttle@4.1.1: {} + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + merge-stream@2.0.0: {} + + mimic-fn@4.0.0: {} + + mlly@1.7.0: + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.1.1 + ufo: 1.5.3 + + ms@2.1.2: {} + + nanoid@3.3.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + normalize-path@3.0.0: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.0.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-try@2.2.0: {} + + path-exists@3.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + pathe@1.1.2: {} + + pathval@1.1.1: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pkg-types@1.1.1: + dependencies: + confbox: 0.1.7 + mlly: 1.7.0 + pathe: 1.1.2 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + react-is@18.3.1: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + require-directory@2.1.1: {} + + require-main-filename@2.0.0: {} + + ripemd160-min@0.0.6: {} + + rollup@4.17.2: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.17.2 + '@rollup/rollup-android-arm64': 4.17.2 + '@rollup/rollup-darwin-arm64': 4.17.2 + '@rollup/rollup-darwin-x64': 4.17.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 + '@rollup/rollup-linux-arm-musleabihf': 4.17.2 + '@rollup/rollup-linux-arm64-gnu': 4.17.2 + '@rollup/rollup-linux-arm64-musl': 4.17.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 + '@rollup/rollup-linux-riscv64-gnu': 4.17.2 + '@rollup/rollup-linux-s390x-gnu': 4.17.2 + '@rollup/rollup-linux-x64-gnu': 4.17.2 + '@rollup/rollup-linux-x64-musl': 4.17.2 + '@rollup/rollup-win32-arm64-msvc': 4.17.2 + '@rollup/rollup-win32-ia32-msvc': 4.17.2 + '@rollup/rollup-win32-x64-msvc': 4.17.2 + fsevents: 2.3.3 + + safe-buffer@5.2.1: {} + + set-blocking@2.0.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + sisteransi@1.0.5: {} + + source-map-js@1.2.0: {} + + stackback@0.0.2: {} + + std-env@3.7.0: {} + + string-width@3.1.0: + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-final-newline@3.0.0: {} + + strip-literal@2.1.0: + dependencies: + js-tokens: 9.0.0 + + tinybench@2.8.0: {} + + tinypool@0.8.4: {} + + tinyspy@2.2.1: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@0.0.3: {} + + type-detect@4.0.8: {} + + typescript@5.4.5: {} + + ufo@1.5.3: {} + + undici-types@5.26.5: {} + + varuint-bitcoin@1.1.2: + dependencies: + safe-buffer: 5.2.1 + + vite-node@1.6.0(@types/node@18.19.33): + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.1 + vite: 5.2.11(@types/node@18.19.33) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite@5.2.11(@types/node@18.19.33): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.17.2 + optionalDependencies: + '@types/node': 18.19.33 + fsevents: 2.3.3 + + vitest-environment-clarinet@2.1.0(@hirosystems/clarinet-sdk@2.6.0(@types/node@18.19.33))(vitest@1.6.0(@types/node@18.19.33)): + dependencies: + '@hirosystems/clarinet-sdk': 2.6.0(@types/node@18.19.33) + vitest: 1.6.0(@types/node@18.19.33) + + vitest@1.6.0(@types/node@18.19.33): + dependencies: + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + 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.10 + pathe: 1.1.2 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.8.0 + tinypool: 0.8.4 + vite: 5.2.11(@types/node@18.19.33) + vite-node: 1.6.0(@types/node@18.19.33) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 18.19.33 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-module@2.0.1: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.2.2: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wrap-ansi@5.1.0: + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yargs-parser@13.1.2: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@21.1.1: {} + + yargs@13.3.2: + 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 + + yargs@17.7.2: + 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 + + yocto-queue@1.0.0: {} diff --git a/simulations/stxer.ts b/simulations/stxer.ts new file mode 100644 index 0000000..e4233d8 --- /dev/null +++ b/simulations/stxer.ts @@ -0,0 +1,149 @@ +import { StacksMainnet } from "@stacks/network"; +import { AnchorMode, PostConditionMode, StacksTransaction, boolCV, bufferCV, contractPrincipalCV, listCV, makeUnsignedContractCall, makeUnsignedContractDeploy, principalCV, serializeCV, stringAsciiCV, tupleCV, uintCV } from "@stacks/transactions"; +import { c32addressDecode } from "c32check"; +import fs from "fs"; + +// current beta api endpoint +const SIMULATION_API_ENDPOINT = "https://api.stxer.xyz/simulations"; + +function runTx(tx: StacksTransaction) { + // type 0: run transaction + return tupleCV({ type: uintCV(0), data: bufferCV(tx.serialize()) }); +} + +const common_params = { + network: new StacksMainnet(), + publicKey: "", + postConditionMode: PostConditionMode.Allow, + anchorMode: AnchorMode.Any, + fee: 100, +}; + +function runEval(address: string, contractName: string, code: string) { + // type 1: eval arbitrary code inside a contract + return tupleCV({ + type: uintCV(1), + data: bufferCV( + serializeCV( + tupleCV({ + contract: contractPrincipalCV(address, contractName), + code: stringAsciiCV(code), + }) + ) + ), + }); +} + +async function vote(address: string, nonce: number) { + const [, addressHash] = c32addressDecode(address); + const voteTx1 = await makeUnsignedContractCall({ + contractAddress: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH", + contractName: "ccip019-pox-4-stacking", + functionName: "vote-on-proposal", + functionArgs: [boolCV(true)], + nonce: nonce++, + ...common_params, + }); + voteTx1.auth.spendingCondition.signer = addressHash; + return voteTx1; +} + +async function main() { + const block_height = 156894; + const block_hash = "390579d10ed73f98ef829e0068d014d32a6a128e3ba0b80c42321010c61fff1a"; + + // DO NOT sign any transactions you're about to send, this is not required for simulation + let address = "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH"; + let nonce = 36; + + let [, addressHash] = c32addressDecode(address); + + const deployTx1 = await makeUnsignedContractDeploy({ + contractName: "ccd002-treasury-mia-mining-v3", + codeBody: fs.readFileSync("contracts/extensions/ccd002-treasury-v3.clar").toString(), + nonce: nonce++, + ...common_params, + }); + deployTx1.auth.spendingCondition.signer = addressHash; + + const deployTx2 = await makeUnsignedContractDeploy({ + contractName: "ccd002-treasury-mia-stx-stacking-v3", + codeBody: fs.readFileSync("contracts/extensions/ccd002-treasury-v3.clar").toString(), + nonce: nonce++, + ...common_params, + }); + deployTx2.auth.spendingCondition.signer = addressHash; + + const deployTx3 = await makeUnsignedContractDeploy({ + contractName: "ccip019-pox-4-stacking", + codeBody: fs.readFileSync("contracts/proposals/ccip019-pox-4-stacking.clar").toString(), + nonce: nonce++, + ...common_params, + }); + deployTx3.auth.spendingCondition.signer = addressHash; + + const voteTxs: StacksTransaction[] = []; + + voteTxs.push(await vote("SP3TF26QFS3YMYHC9N3ZZTZQKCM4AFYMVW1WMFRTT", 932)); + voteTxs.push(await vote("SP3W06MK1XP52KTHJB96D04JSBW2NQCA42FFMQZXZ", 565)); + voteTxs.push(await vote("SP2S7Y7BMX7Y73FHV3SV9W1EE63EQ98BE95PZ4C4E", 2486)); + voteTxs.push(await vote("SP1KVKBYWMCK7WSDYS0DDF8R3XT5RD5QKBPQK3SBB", 567)); + voteTxs.push(await vote("SP39XMB07QV4KN4PB6X3KHNQKWARB0F9AXY6K41E0", 626)); + voteTxs.push(await vote("SP1V4BWKPD559WP67GWCV8VR0VRKJ7ESS8WHKYEJP", 905)); + voteTxs.push(await vote("SP3W8BCK1KKJB8H34QA2RWV2Z35E7RNPKEXJSFAF0", 3872)); + voteTxs.push(await vote("SPM3GE47QTMMVBT6DH0XFBXYS1AJHSSAQMYSB4J8", 7706)); + voteTxs.push(await vote("SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X", 802)); + + address = "SP7DGES13508FHRWS1FB0J3SZA326FP6QRMB6JDE"; + [, addressHash] = c32addressDecode(address); + nonce = 120; + const tx1 = await makeUnsignedContractCall({ + contractAddress: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH", + contractName: "ccd001-direct-execute", + functionName: "direct-execute", + functionArgs: [principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccip019-pox-4-stacking")], + nonce: nonce++, + ...common_params, + }); + tx1.auth.spendingCondition.signer = addressHash; + + address = "SP3YYGCGX1B62CYAH4QX7PQE63YXG7RDTXD8BQHJQ"; + [, addressHash] = c32addressDecode(address); + nonce = 17; + const tx2 = await makeUnsignedContractCall({ + contractAddress: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH", + contractName: "ccd001-direct-execute", + functionName: "direct-execute", + functionArgs: [principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccip019-pox-4-stacking")], + nonce: nonce++, + ...common_params, + }); + tx2.auth.spendingCondition.signer = addressHash; + + address = "SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X"; + [, addressHash] = c32addressDecode(address); + nonce = 803; + const tx3 = await makeUnsignedContractCall({ + contractAddress: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH", + contractName: "ccd001-direct-execute", + functionName: "direct-execute", + functionArgs: [principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccip019-pox-4-stacking")], + nonce: nonce++, + ...common_params, + }); + tx3.auth.spendingCondition.signer = addressHash; + + const req = tupleCV({ + block_height: uintCV(block_height), + block_hash: bufferCV(Buffer.from(block_hash, "hex")), + steps: listCV([deployTx1, deployTx2, deployTx3, ...voteTxs, tx1, tx2, tx3].map((t) => runTx(t))), + }); + const body = serializeCV(req); + const rs: any = await fetch(SIMULATION_API_ENDPOINT, { + method: "POST", + body, + }).then((rs) => rs.json()); + console.log("Simulation will be available at: https://stxer.xyz/simulations/" + rs.id); +} + +main().catch(console.error); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1bdaf36 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,26 @@ + +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ESNext"], + "skipLibCheck": true, + + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + "strict": true, + "noImplicitAny": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "node_modules/@hirosystems/clarinet-sdk/vitest-helpers/src", + "tests" + ] +} diff --git a/vitest.config.js b/vitest.config.js new file mode 100644 index 0000000..c6a8506 --- /dev/null +++ b/vitest.config.js @@ -0,0 +1,42 @@ + +/// + +import { defineConfig } from "vite"; +import { vitestSetupFilePath, getClarinetVitestsArgv } from "@hirosystems/clarinet-sdk/vitest"; + +/* + In this file, Vitest is configured so that it works seamlessly with Clarinet and the Simnet. + + The `vitest-environment-clarinet` will initialise the clarinet-sdk + and make the `simnet` object available globally in the test files. + + `vitestSetupFilePath` points to a file in the `@hirosystems/clarinet-sdk` package that does two things: + - run `before` hooks to initialize the simnet and `after` hooks to collect costs and coverage reports. + - load custom vitest matchers to work with Clarity values (such as `expect(...).toBeUint()`) + + The `getClarinetVitestsArgv()` will parse options passed to the command `vitest run --` + - vitest run -- --manifest ./Clarinet.toml # pass a custom path + - vitest run -- --coverage --costs # collect coverage and cost reports +*/ + +export default defineConfig({ + test: { + environment: "clarinet", // use vitest-environment-clarinet + pool: "forks", + poolOptions: { + threads: { singleThread: true }, + forks: { singleFork: true }, + }, + setupFiles: [ + vitestSetupFilePath, + // custom setup files can be added here + ], + environmentOptions: { + clarinet: { + ...getClarinetVitestsArgv(), + // add or override options + }, + }, + }, +}); + From f0987f5a8b3d66bd87fa6a2b29620c00f2678bcc Mon Sep 17 00:00:00 2001 From: friedger Date: Sun, 21 Jul 2024 08:17:45 +0200 Subject: [PATCH 08/27] chore: rename simulation --- simulations/{stxer.ts => stxer-ccip019.ts} | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) rename simulations/{stxer.ts => stxer-ccip019.ts} (87%) diff --git a/simulations/stxer.ts b/simulations/stxer-ccip019.ts similarity index 87% rename from simulations/stxer.ts rename to simulations/stxer-ccip019.ts index e4233d8..328ce68 100644 --- a/simulations/stxer.ts +++ b/simulations/stxer-ccip019.ts @@ -84,15 +84,9 @@ async function main() { const voteTxs: StacksTransaction[] = []; - voteTxs.push(await vote("SP3TF26QFS3YMYHC9N3ZZTZQKCM4AFYMVW1WMFRTT", 932)); - voteTxs.push(await vote("SP3W06MK1XP52KTHJB96D04JSBW2NQCA42FFMQZXZ", 565)); - voteTxs.push(await vote("SP2S7Y7BMX7Y73FHV3SV9W1EE63EQ98BE95PZ4C4E", 2486)); - voteTxs.push(await vote("SP1KVKBYWMCK7WSDYS0DDF8R3XT5RD5QKBPQK3SBB", 567)); - voteTxs.push(await vote("SP39XMB07QV4KN4PB6X3KHNQKWARB0F9AXY6K41E0", 626)); - voteTxs.push(await vote("SP1V4BWKPD559WP67GWCV8VR0VRKJ7ESS8WHKYEJP", 905)); - voteTxs.push(await vote("SP3W8BCK1KKJB8H34QA2RWV2Z35E7RNPKEXJSFAF0", 3872)); - voteTxs.push(await vote("SPM3GE47QTMMVBT6DH0XFBXYS1AJHSSAQMYSB4J8", 7706)); - voteTxs.push(await vote("SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X", 802)); + voteTxs.push(await vote("SP18Z92ZT0GAB2JHD21CZ3KS1WPGNDJCYZS7CV3MD", 524)); + voteTxs.push(await vote("SP34N5WWPHWTVJVYPE368HYDEXMZWKPVF639B3P5T", 978)); + voteTxs.push(await vote("SP1T91N2Y2TE5M937FE3R6DE0HGWD85SGCV50T95A", 243)); address = "SP7DGES13508FHRWS1FB0J3SZA326FP6QRMB6JDE"; [, addressHash] = c32addressDecode(address); @@ -122,7 +116,7 @@ async function main() { address = "SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X"; [, addressHash] = c32addressDecode(address); - nonce = 803; + nonce = 802; const tx3 = await makeUnsignedContractCall({ contractAddress: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH", contractName: "ccd001-direct-execute", From 5e04323f17d2cba9476894a243602b590deec506 Mon Sep 17 00:00:00 2001 From: friedger Date: Sun, 21 Jul 2024 08:51:11 +0200 Subject: [PATCH 09/27] fix: add permission to stack for stx rewards treasury --- .../proposals/ccip019-pox-4-stacking.clar | 9 ++- simulations/stxer-ccip019.ts | 76 ++++++++++--------- 2 files changed, 45 insertions(+), 40 deletions(-) diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index b763f4a..d6fc991 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -84,9 +84,10 @@ ;; transfer funds to new treasury extensions (try! (contract-call? .ccd002-treasury-mia-mining-v2 withdraw-stx miaBalance .ccd002-treasury-mia-mining-v3)) - ;; delegate stack the STX in the mining treasuries (up to 50M STX each) + ;; delegate stack the STX in the mining and rewards treasuries (up to 50M STX each) ;; MAINNET: SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3 (try! (contract-call? .ccd002-treasury-mia-mining-v3 delegate-stx u50000000000000 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3)) + (try! (contract-call? .ccd002-treasury-mia-stx-stacking-v3 delegate-stx u50000000000000 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3)) ;; add treasuries to ccd005-city-data (try! (contract-call? .ccd005-city-data add-treasury miaId .ccd002-treasury-mia-mining-v3 "mining-v3")) @@ -129,7 +130,7 @@ (miaVoteAmount (scale-down (default-to u0 (get-mia-vote voterId true)))) ) ;; check that the user has a positive vote - (asserts! (or (> miaVoteAmount u0)) ERR_NOTHING_STACKED) + (asserts! (> miaVoteAmount u0) ERR_NOTHING_STACKED) ;; insert new user vote record (asserts! (map-insert UserVotes voterId { vote: vote, @@ -225,12 +226,12 @@ ;; MAINNET: mia cycle 82 / first block BTC 838,250 STX 145,643 ;; cycle 2 / u4500 used in tests (cycle82Hash (unwrap! (get-block-hash u145643) none)) - (cycle82Data (at-block cycle82Hash (contract-call? .ccd007-citycoin-stacking get-stacker MIA_ID u2 userId))) + (cycle82Data (at-block cycle82Hash (contract-call? .ccd007-citycoin-stacking get-stacker MIA_ID u82 userId))) (cycle82Amount (get stacked cycle82Data)) ;; MAINNET: mia cycle 83 / first block BTC 840,350 STX 147,282 ;; cycle 3 / u6600 used in tests (cycle83Hash (unwrap! (get-block-hash u147282) none)) - (cycle83Data (at-block cycle83Hash (contract-call? .ccd007-citycoin-stacking get-stacker MIA_ID u3 userId))) + (cycle83Data (at-block cycle83Hash (contract-call? .ccd007-citycoin-stacking get-stacker MIA_ID u83 userId))) (cycle83Amount (get stacked cycle83Data)) ;; mia vote calculation (scaledVote (/ (+ (scale-up cycle82Amount) (scale-up cycle83Amount)) u2)) diff --git a/simulations/stxer-ccip019.ts b/simulations/stxer-ccip019.ts index 328ce68..b7ce747 100644 --- a/simulations/stxer-ccip019.ts +++ b/simulations/stxer-ccip019.ts @@ -1,5 +1,5 @@ import { StacksMainnet } from "@stacks/network"; -import { AnchorMode, PostConditionMode, StacksTransaction, boolCV, bufferCV, contractPrincipalCV, listCV, makeUnsignedContractCall, makeUnsignedContractDeploy, principalCV, serializeCV, stringAsciiCV, tupleCV, uintCV } from "@stacks/transactions"; +import { AnchorMode, PostConditionMode, SignedTokenTransferOptions, StacksTransaction, boolCV, bufferCV, contractPrincipalCV, listCV, makeSTXTokenTransfer, makeUnsignedContractCall, makeUnsignedContractDeploy, makeUnsignedSTXTokenTransfer, principalCV, serializeCV, stringAsciiCV, tupleCV, uintCV } from "@stacks/transactions"; import { c32addressDecode } from "c32check"; import fs from "fs"; @@ -48,9 +48,23 @@ async function vote(address: string, nonce: number) { return voteTx1; } +async function directExecute(address: string, nonce: number) { + const [, addressHash] = c32addressDecode(address); + const voteTx1 = await makeUnsignedContractCall({ + contractAddress: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH", + contractName: "ccd001-direct-execute", + functionName: "direct-execute", + functionArgs: [principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccip019-pox-4-stacking")], + nonce: nonce++, + ...common_params, + }); + voteTx1.auth.spendingCondition.signer = addressHash; + return voteTx1; +} + async function main() { - const block_height = 156894; - const block_hash = "390579d10ed73f98ef829e0068d014d32a6a128e3ba0b80c42321010c61fff1a"; + const block_height = 157894; + const block_hash = "5e584e604a8caffc476be973562f4ad05231cecb70f3ede3af110986dffee4cf"; // DO NOT sign any transactions you're about to send, this is not required for simulation let address = "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH"; @@ -84,53 +98,43 @@ async function main() { const voteTxs: StacksTransaction[] = []; - voteTxs.push(await vote("SP18Z92ZT0GAB2JHD21CZ3KS1WPGNDJCYZS7CV3MD", 524)); - voteTxs.push(await vote("SP34N5WWPHWTVJVYPE368HYDEXMZWKPVF639B3P5T", 978)); - voteTxs.push(await vote("SP1T91N2Y2TE5M937FE3R6DE0HGWD85SGCV50T95A", 243)); + voteTxs.push(await vote("SP18Z92ZT0GAB2JHD21CZ3KS1WPGNDJCYZS7CV3MD", 529)); + voteTxs.push(await vote("SP34N5WWPHWTVJVYPE368HYDEXMZWKPVF639B3P5T", 982)); + voteTxs.push(await vote("SP1T91N2Y2TE5M937FE3R6DE0HGWD85SGCV50T95A", 245)); - address = "SP7DGES13508FHRWS1FB0J3SZA326FP6QRMB6JDE"; - [, addressHash] = c32addressDecode(address); - nonce = 120; - const tx1 = await makeUnsignedContractCall({ - contractAddress: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH", - contractName: "ccd001-direct-execute", - functionName: "direct-execute", - functionArgs: [principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccip019-pox-4-stacking")], - nonce: nonce++, - ...common_params, - }); - tx1.auth.spendingCondition.signer = addressHash; + const executeTxs: StacksTransaction[] = []; + executeTxs.push(await directExecute("SP7DGES13508FHRWS1FB0J3SZA326FP6QRMB6JDE", 122)); + executeTxs.push(await directExecute("SP3YYGCGX1B62CYAH4QX7PQE63YXG7RDTXD8BQHJQ", 17)); + executeTxs.push(await directExecute("SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X", 803)); - address = "SP3YYGCGX1B62CYAH4QX7PQE63YXG7RDTXD8BQHJQ"; - [, addressHash] = c32addressDecode(address); - nonce = 17; - const tx2 = await makeUnsignedContractCall({ - contractAddress: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH", - contractName: "ccd001-direct-execute", - functionName: "direct-execute", - functionArgs: [principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccip019-pox-4-stacking")], + address = "SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X"; + nonce = 804; + const transferStxTx = await makeUnsignedSTXTokenTransfer({ + amount: 10000000, + recipient: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stx-stacking-v3", nonce: nonce++, ...common_params, }); - tx2.auth.spendingCondition.signer = addressHash; + [, addressHash] = c32addressDecode(address); + transferStxTx.auth.spendingCondition.signer = addressHash; address = "SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X"; - [, addressHash] = c32addressDecode(address); - nonce = 802; - const tx3 = await makeUnsignedContractCall({ - contractAddress: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH", - contractName: "ccd001-direct-execute", - functionName: "direct-execute", - functionArgs: [principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccip019-pox-4-stacking")], + nonce = 805; + const lockStxTx = await makeUnsignedContractCall({ + contractAddress: "SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP", + contractName: "pox4-fast-pool-v3", + functionName: "delegate-stack-stx-many", + functionArgs: [listCV([principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-mining-v3"), principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stx-stacking-v3")])], nonce: nonce++, ...common_params, }); - tx3.auth.spendingCondition.signer = addressHash; + [, addressHash] = c32addressDecode(address); + lockStxTx.auth.spendingCondition.signer = addressHash; const req = tupleCV({ block_height: uintCV(block_height), block_hash: bufferCV(Buffer.from(block_hash, "hex")), - steps: listCV([deployTx1, deployTx2, deployTx3, ...voteTxs, tx1, tx2, tx3].map((t) => runTx(t))), + steps: listCV([deployTx1, deployTx2, deployTx3, ...voteTxs, ...executeTxs, transferStxTx, lockStxTx].map((t) => runTx(t))), }); const body = serializeCV(req); const rs: any = await fetch(SIMULATION_API_ENDPOINT, { From cb6070f6fbc459b70903eaa5d28e32088bbfa3be Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Thu, 1 Aug 2024 12:48:07 -0700 Subject: [PATCH 10/27] fix: use testnet instead of mainnet addresses This helps the tests pass locally and should work with the Clarinet-2.5 toml file in the action. Mainnet can be used but need to be added as requirements and the requirements files in the cache need to be uploaded or the GH runner can't see/create them correctly. --- Clarinet-2.5.toml | 3 --- contracts/extensions/ccd002-treasury-v3.clar | 8 ++++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Clarinet-2.5.toml b/Clarinet-2.5.toml index c08b494..2206d0e 100644 --- a/Clarinet-2.5.toml +++ b/Clarinet-2.5.toml @@ -10,9 +10,6 @@ path = ".requirements" # MAINNET REQUIREMENTS -[[project.requirements]] -contract_id = "SP000000000000000000002Q6VF78.pox" - [[project.requirements]] contract_id = "SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard" diff --git a/contracts/extensions/ccd002-treasury-v3.clar b/contracts/extensions/ccd002-treasury-v3.clar index 18da6d9..a5802bd 100644 --- a/contracts/extensions/ccd002-treasury-v3.clar +++ b/contracts/extensions/ccd002-treasury-v3.clar @@ -14,9 +14,9 @@ (impl-trait .stacking-trait.stacking-trait) (impl-trait .ccd002-trait.ccd002-treasury-trait) ;; MAINNET: 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait -(use-trait ft-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait) +(use-trait ft-trait 'ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.sip-010-trait-ft-standard.sip-010-trait) ;; MAINNET: 'SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.nft-trait -(use-trait nft-trait 'SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.nft-trait) +(use-trait nft-trait 'ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.nft-trait.nft-trait) ;; CONSTANTS @@ -159,7 +159,7 @@ }) ;; MAINNET: 'SP000000000000000000002Q6VF78.pox-4 ;; TESTNET: 'ST000000000000000000002AMW42H.pox-4 - (match (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-4 delegate-stx maxAmount to none none)) + (match (as-contract (contract-call? 'ST000000000000000000002AMW42H.pox-4 delegate-stx maxAmount to none none)) success (ok success) err (err (to-uint err)) ) @@ -176,7 +176,7 @@ }) ;; MAINNET: 'SP000000000000000000002Q6VF78.pox-4 ;; TESTNET: 'ST000000000000000000002AMW42H.pox-4 - (match (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-4 revoke-delegate-stx)) + (match (as-contract (contract-call? 'ST000000000000000000002AMW42H.pox-4 revoke-delegate-stx)) success (begin (print success) (ok true)) err (err (to-uint err)) ) From 4d799a00eaf85e4ae698b3eb332aa1f9bd648453 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Wed, 7 Aug 2024 14:25:30 -0700 Subject: [PATCH 11/27] chore: bump clarinet --- .github/workflows/clarinet.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/clarinet.yaml b/.github/workflows/clarinet.yaml index f33dc90..9b56153 100644 --- a/.github/workflows/clarinet.yaml +++ b/.github/workflows/clarinet.yaml @@ -23,6 +23,6 @@ jobs: mkdir -p ~/.clarinet echo "enable_hints = false" >> ~/.clarinet/clarinetrc.toml - name: "Check contract syntax" - uses: docker://hirosystems/clarinet:2.6.0 + uses: docker://hirosystems/clarinet:2.8.0 with: args: check -m Clarinet-2.5.toml From 40ef4fab607b165d1abff97125ee14c611884a4d Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Wed, 7 Aug 2024 14:34:44 -0700 Subject: [PATCH 12/27] fix: make default clarinet latest version Since work is moving forward with this Clarinet file we can use it as the main one, and the legacy one can be referenced when running the old binary + the old Clarinet-legacy.toml. This updates the GH actions as well. --- .github/workflows/clarinet-legacy.yaml | 4 ++-- .github/workflows/clarinet.yaml | 2 +- Clarinet-2.5.toml => Clarinet-legacy.toml | 16 +++------------- Clarinet.toml | 16 +++++++++++++--- 4 files changed, 19 insertions(+), 19 deletions(-) rename Clarinet-2.5.toml => Clarinet-legacy.toml (97%) diff --git a/.github/workflows/clarinet-legacy.yaml b/.github/workflows/clarinet-legacy.yaml index 2f2aae6..caacacb 100644 --- a/.github/workflows/clarinet-legacy.yaml +++ b/.github/workflows/clarinet-legacy.yaml @@ -24,11 +24,11 @@ jobs: - name: "Check contract syntax (legacy)" uses: docker://hirosystems/clarinet:1.8.0 with: - args: check + args: check -m Clarinet-legacy.toml - name: "Run all contract tests (legacy)" uses: docker://hirosystems/clarinet:1.8.0 with: - args: test --coverage + args: test --coverage -m Clarinet-legacy.toml - name: "Upload code coverage" uses: codecov/codecov-action@v4 with: diff --git a/.github/workflows/clarinet.yaml b/.github/workflows/clarinet.yaml index 9b56153..ccff937 100644 --- a/.github/workflows/clarinet.yaml +++ b/.github/workflows/clarinet.yaml @@ -25,4 +25,4 @@ jobs: - name: "Check contract syntax" uses: docker://hirosystems/clarinet:2.8.0 with: - args: check -m Clarinet-2.5.toml + args: check diff --git a/Clarinet-2.5.toml b/Clarinet-legacy.toml similarity index 97% rename from Clarinet-2.5.toml rename to Clarinet-legacy.toml index 2206d0e..7e95afb 100644 --- a/Clarinet-2.5.toml +++ b/Clarinet-legacy.toml @@ -10,6 +10,9 @@ path = ".requirements" # MAINNET REQUIREMENTS +[[project.requirements]] +contract_id = "SP000000000000000000002Q6VF78.pox" + [[project.requirements]] contract_id = "SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard" @@ -89,15 +92,6 @@ path = "contracts/extensions/ccd002-treasury.clar" [contracts.ccd002-treasury-mia-mining-v2] path = "contracts/extensions/ccd002-treasury-v2.clar" -[contracts.ccd002-treasury-mia-mining-v3] -path = "contracts/extensions/ccd002-treasury-v3.clar" -clarity_version = 2 -epoch = 2.5 - -[contracts.ccd002-treasury-mia-stx-rewards-v3] -path = "contracts/extensions/ccd002-treasury-v3.clar" -clarity_version = 2 -epoch = 2.5 [contracts.ccd002-treasury-mia-stacking] path = "contracts/extensions/ccd002-treasury.clar" @@ -185,10 +179,6 @@ path = "contracts/proposals/ccip022-treasury-redemption-nyc.clar" clarity_version = 2 epoch = 2.4 -[contracts.ccip019-pox-4-stacking] -path = "contracts/proposals/ccip019-pox-4-stacking.clar" -clarity_version = 2 -epoch = 2.5 # CITYCOINS PROTOCOL TRAITS [contracts.extension-trait] diff --git a/Clarinet.toml b/Clarinet.toml index 7e95afb..823dfd1 100644 --- a/Clarinet.toml +++ b/Clarinet.toml @@ -10,9 +10,6 @@ path = ".requirements" # MAINNET REQUIREMENTS -[[project.requirements]] -contract_id = "SP000000000000000000002Q6VF78.pox" - [[project.requirements]] contract_id = "SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard" @@ -92,6 +89,15 @@ path = "contracts/extensions/ccd002-treasury.clar" [contracts.ccd002-treasury-mia-mining-v2] path = "contracts/extensions/ccd002-treasury-v2.clar" +[contracts.ccd002-treasury-mia-mining-v3] +path = "contracts/extensions/ccd002-treasury-v3.clar" +clarity_version = 2 +epoch = 2.5 + +[contracts.ccd002-treasury-stx-rewards-v3] +path = "contracts/extensions/ccd002-treasury-v3.clar" +clarity_version = 2 +epoch = 2.5 [contracts.ccd002-treasury-mia-stacking] path = "contracts/extensions/ccd002-treasury.clar" @@ -179,6 +185,10 @@ path = "contracts/proposals/ccip022-treasury-redemption-nyc.clar" clarity_version = 2 epoch = 2.4 +[contracts.ccip019-pox-4-stacking] +path = "contracts/proposals/ccip019-pox-4-stacking.clar" +clarity_version = 2 +epoch = 2.5 # CITYCOINS PROTOCOL TRAITS [contracts.extension-trait] From a12f9f64850cd2b0618831138c7f3083000ff76f Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Wed, 7 Aug 2024 14:35:21 -0700 Subject: [PATCH 13/27] fix: use shorter contract name I forget where the limit is but looks like that was why clarinet check was failing! --- contracts/proposals/ccip019-pox-4-stacking.clar | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index d6fc991..8de912f 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -73,7 +73,7 @@ (try! (contract-call? .base-dao set-extensions (list {extension: .ccd002-treasury-mia-mining-v3, enabled: true} - {extension: .ccd002-treasury-mia-stx-rewards-v3, enabled: true} + {extension: .ccd002-treasury-stx-rewards-v3, enabled: true} ) )) @@ -87,11 +87,11 @@ ;; delegate stack the STX in the mining and rewards treasuries (up to 50M STX each) ;; MAINNET: SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3 (try! (contract-call? .ccd002-treasury-mia-mining-v3 delegate-stx u50000000000000 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3)) - (try! (contract-call? .ccd002-treasury-mia-stx-stacking-v3 delegate-stx u50000000000000 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3)) + (try! (contract-call? .ccd002-treasury-stx-rewards-v3 delegate-stx u50000000000000 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3)) ;; add treasuries to ccd005-city-data (try! (contract-call? .ccd005-city-data add-treasury miaId .ccd002-treasury-mia-mining-v3 "mining-v3")) - (try! (contract-call? .ccd005-city-data add-treasury miaId .ccd002-treasury-mia-stx-stacking-v3 "stx-v3")) + (try! (contract-call? .ccd005-city-data add-treasury miaId .ccd002-treasury-stx-rewards-v3 "stx-v3")) (ok true) ) From 03b0aa3363840ec2e97473c0dddf521f1539ca79 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Wed, 7 Aug 2024 14:40:04 -0700 Subject: [PATCH 14/27] fix: update contract name and treasury name Using mia over stx makes it easier to understand what the treasury is associated with, and the treasury name is part of the suggestion here (and fits in the 10char limit): https://github.com/citycoins/protocol/pull/67#discussion_r1700769596 --- Clarinet.toml | 2 +- contracts/proposals/ccip019-pox-4-stacking.clar | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Clarinet.toml b/Clarinet.toml index 823dfd1..07959d7 100644 --- a/Clarinet.toml +++ b/Clarinet.toml @@ -94,7 +94,7 @@ path = "contracts/extensions/ccd002-treasury-v3.clar" clarity_version = 2 epoch = 2.5 -[contracts.ccd002-treasury-stx-rewards-v3] +[contracts.ccd002-treasury-mia-rewards-v3] path = "contracts/extensions/ccd002-treasury-v3.clar" clarity_version = 2 epoch = 2.5 diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index 8de912f..815260f 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -73,7 +73,7 @@ (try! (contract-call? .base-dao set-extensions (list {extension: .ccd002-treasury-mia-mining-v3, enabled: true} - {extension: .ccd002-treasury-stx-rewards-v3, enabled: true} + {extension: .ccd002-treasury-mia-rewards-v3, enabled: true} ) )) @@ -87,11 +87,11 @@ ;; delegate stack the STX in the mining and rewards treasuries (up to 50M STX each) ;; MAINNET: SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3 (try! (contract-call? .ccd002-treasury-mia-mining-v3 delegate-stx u50000000000000 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3)) - (try! (contract-call? .ccd002-treasury-stx-rewards-v3 delegate-stx u50000000000000 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3)) + (try! (contract-call? .ccd002-treasury-mia-rewards-v3 delegate-stx u50000000000000 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3)) ;; add treasuries to ccd005-city-data (try! (contract-call? .ccd005-city-data add-treasury miaId .ccd002-treasury-mia-mining-v3 "mining-v3")) - (try! (contract-call? .ccd005-city-data add-treasury miaId .ccd002-treasury-stx-rewards-v3 "stx-v3")) + (try! (contract-call? .ccd005-city-data add-treasury miaId .ccd002-treasury-mia-rewards-v3 "rewards-v3")) (ok true) ) From 081933b8142a33714ce061cba0dd664b38e68313 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Wed, 7 Aug 2024 14:44:02 -0700 Subject: [PATCH 15/27] fix: add ccip-015 trait --- contracts/proposals/ccip019-pox-4-stacking.clar | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index 815260f..557ed33 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -1,6 +1,7 @@ ;; TRAITS (impl-trait .proposal-trait.proposal-trait) +(impl-trait .ccip015-trait.ccip015-trait) ;; ERRORS From a8249badbbc3753d7efca3581c28c003fe6cdaed Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Wed, 7 Aug 2024 14:53:06 -0700 Subject: [PATCH 16/27] chore: add package lock and default deployment plan --- deployments/default.simnet-plan.yaml | 966 ++++++++++ package-lock.json | 2422 ++++++++++++++++++++++++++ 2 files changed, 3388 insertions(+) create mode 100644 deployments/default.simnet-plan.yaml create mode 100644 package-lock.json diff --git a/deployments/default.simnet-plan.yaml b/deployments/default.simnet-plan.yaml new file mode 100644 index 0000000..f02793a --- /dev/null +++ b/deployments/default.simnet-plan.yaml @@ -0,0 +1,966 @@ +--- +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: citycoin-core-trait + emulated-sender: SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27 + path: ".cache/requirements/SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27.citycoin-core-trait.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: citycoin-token-trait + emulated-sender: SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27 + path: ".cache/requirements/SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27.citycoin-token-trait.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-auth + emulated-sender: SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27 + path: ".cache/requirements/SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27.miamicoin-auth.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: sip-010-trait-ft-standard + emulated-sender: SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE + path: ".cache/requirements/SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-token + emulated-sender: SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27 + path: ".cache/requirements/SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27.miamicoin-token.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: citycoin-core-v2-trait + emulated-sender: SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11 + path: ".cache/requirements/SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.citycoin-core-v2-trait.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: citycoin-token-v2-trait + emulated-sender: SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11 + path: ".cache/requirements/SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.citycoin-token-v2-trait.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: citycoin-vrf-v2 + emulated-sender: SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11 + path: ".cache/requirements/SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.citycoin-vrf-v2.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-auth-v2 + emulated-sender: SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11 + path: ".cache/requirements/SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-auth-v2.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-auth + emulated-sender: SP2H8PY27SEZ03MWRKS5XABZYQN17ETGQS3527SA5 + path: ".cache/requirements/SP2H8PY27SEZ03MWRKS5XABZYQN17ETGQS3527SA5.newyorkcitycoin-auth.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-token + emulated-sender: SP2H8PY27SEZ03MWRKS5XABZYQN17ETGQS3527SA5 + path: ".cache/requirements/SP2H8PY27SEZ03MWRKS5XABZYQN17ETGQS3527SA5.newyorkcitycoin-token.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-token-v2 + emulated-sender: SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11 + path: ".cache/requirements/SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-token-v2.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-core-v2 + emulated-sender: SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11 + path: ".cache/requirements/SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-core-v2.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-auth-v2 + emulated-sender: SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R + path: ".cache/requirements/SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-auth-v2.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-core-v1-patch + emulated-sender: SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R + path: ".cache/requirements/SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-core-v1-patch.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-token-v2 + emulated-sender: SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R + path: ".cache/requirements/SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-core-v2 + emulated-sender: SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R + path: ".cache/requirements/SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-core-v2.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: nft-trait + emulated-sender: SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9 + path: ".cache/requirements/SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: citycoin-core-v2-trait + emulated-sender: ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6 + path: ".cache/requirements/ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6.citycoin-core-v2-trait.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: citycoin-token-v2-trait + emulated-sender: ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6 + path: ".cache/requirements/ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6.citycoin-token-v2-trait.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-auth-v2 + emulated-sender: STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ + path: ".cache/requirements/STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ.newyorkcitycoin-auth-v2.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: sip-010-trait-ft-standard + emulated-sender: ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT + path: ".cache/requirements/ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.sip-010-trait-ft-standard.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-token-v2 + emulated-sender: STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ + path: ".cache/requirements/STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ.newyorkcitycoin-token-v2.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: citycoin-vrf-v2 + emulated-sender: ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6 + path: ".cache/requirements/ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6.citycoin-vrf-v2.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-core-v2 + emulated-sender: STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ + path: ".cache/requirements/STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ.newyorkcitycoin-core-v2.clar" + clarity-version: 1 + epoch: "2.1" + - id: 1 + transactions: + - emulated-contract-publish: + contract-name: miamicoin-auth-v2 + emulated-sender: ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H + path: ".cache/requirements/ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H.miamicoin-auth-v2.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-token-v2 + emulated-sender: ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H + path: ".cache/requirements/ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H.miamicoin-token-v2.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-core-v2 + emulated-sender: ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H + path: ".cache/requirements/ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H.miamicoin-core-v2.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: nft-trait + emulated-sender: ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT + path: ".cache/requirements/ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.nft-trait.clar" + clarity-version: 1 + - emulated-contract-publish: + contract-name: extension-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/traits/extension-trait.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: proposal-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/traits/proposal-trait.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: base-dao + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/base-dao.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd001-direct-execute + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd001-direct-execute.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd002-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/traits/ccd002-trait.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: stacking-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/traits/stacking-trait.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd002-treasury-mia-mining + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd002-treasury.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd002-treasury-mia-mining-v2 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd002-treasury-v2.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd002-treasury-mia-stacking + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd002-treasury.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd002-treasury-nyc-mining + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd002-treasury.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd002-treasury-nyc-mining-v2 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd002-treasury-v2.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd002-treasury-nyc-stacking + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd002-treasury.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd003-user-registry + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd003-user-registry.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd004-city-registry + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd004-city-registry.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd005-city-data + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd005-city-data.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd006-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/traits/ccd006-trait.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccext-governance-token-mia + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/external/test-ccext-governance-token-mia.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccext-governance-token-nyc + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/external/test-ccext-governance-token-nyc.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd010-core-v2-adapter + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd010-core-v2-adapter.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: citycoin-vrf-v2 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/external/citycoin-vrf-v2.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd006-citycoin-mining + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd006-citycoin-mining.clar + clarity-version: 1 + epoch: "2.1" + - id: 2 + transactions: + - emulated-contract-publish: + contract-name: ccd006-citycoin-mining-v2 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd006-citycoin-mining-v2.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd007-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/traits/ccd007-trait.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd007-citycoin-stacking + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd007-citycoin-stacking.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd008-city-activation + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd008-city-activation.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd009-auth-v2-adapter + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd009-auth-v2-adapter.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccd011-stacking-payouts + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd011-stacking-payouts.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccext-governance-token-nyc-v1 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/external/test-ccext-governance-token-nyc-v1.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccip012-bootstrap + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/proposals/ccip012-bootstrap.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccip013-migration + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/proposals/ccip013-migration.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccip013-activation + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/proposals/ccip013-activation.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: ccip015-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/traits/ccip015-trait.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: citycoin-core-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/citycoin-core-trait.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: citycoin-core-v2-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/citycoin-core-v2-trait.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: citycoin-token-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/citycoin-token-trait.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: citycoin-token-v2-trait + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/citycoin-token-v2-trait.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: citycoin-vrf + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/citycoin-vrf.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-auth + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/miamicoin-auth.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-auth-v2 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/miamicoin-auth-v2.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-token + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/miamicoin-token.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-core-v1 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/miamicoin-core-v1.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-core-v1-patch + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/miamicoin-core-v1-patch.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-token-v2 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/miamicoin-token-v2.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: miamicoin-core-v2 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/miamicoin-core-v2.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-auth + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/newyorkcitycoin-auth.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-auth-v2 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/newyorkcitycoin-auth-v2.clar + clarity-version: 1 + epoch: "2.1" + - id: 3 + transactions: + - emulated-contract-publish: + contract-name: newyorkcitycoin-token + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/newyorkcitycoin-token.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-core-v1 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/newyorkcitycoin-core-v1.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-core-v1-patch + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/newyorkcitycoin-core-v1-patch.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-token-v2 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/newyorkcitycoin-token-v2.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: newyorkcitycoin-core-v2 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/legacy/newyorkcitycoin-core-v2.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd001-direct-execute-001 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd001-direct-execute-001.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd001-direct-execute-002 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd001-direct-execute-002.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd001-direct-execute-003 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd001-direct-execute-003.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-001 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-001.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-002 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-002.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-003 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-003.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-004 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-004.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-005 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-005.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-006 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-006.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-007 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-007.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-008 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-008.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccext-nft-nyc + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/external/test-ccext-nft-nyc.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-009 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-009.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-010 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-010.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-011 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-011.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-012 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-012.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-v2-001 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-v2-001.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-v2-002 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-v2-002.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-v2-003 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-v2-003.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-v2-004 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-v2-004.clar + clarity-version: 1 + epoch: "2.1" + - id: 4 + transactions: + - emulated-contract-publish: + contract-name: test-ccd002-treasury-v2-005 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-v2-005.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-v2-006 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-v2-006.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-v2-007 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-v2-007.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-v2-008 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-v2-008.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-v2-009 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-v2-009.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-v2-010 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-v2-010.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-v2-011 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-v2-011.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd002-treasury-v2-012 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd002-treasury-v2-012.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd003-user-registry-001 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd003-user-registry-001.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd003-user-registry-002 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd003-user-registry-002.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd003-user-registry-003 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd003-user-registry-003.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd004-city-registry-001 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd004-city-registry-001.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd004-city-registry-002 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd004-city-registry-002.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-001 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-001.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-002 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-002.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-003 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-003.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-004 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-004.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-005 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-005.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-006 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-006.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-007 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-007.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-008 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-008.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-009 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-009.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-010 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-010.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-011 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-011.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-012 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-012.clar + clarity-version: 1 + epoch: "2.1" + - id: 5 + transactions: + - emulated-contract-publish: + contract-name: test-ccd005-city-data-013 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-013.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-014 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-014.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-015 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-015.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-016 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-016.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-017 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-017.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-018 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-018.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-019 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-019.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd005-city-data-020 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd005-city-data-020.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd006-citycoin-mining-001 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd006-citycoin-mining-001.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd006-citycoin-mining-002 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd006-citycoin-mining-002.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd006-citycoin-mining-003 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd006-citycoin-mining-003.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd006-citycoin-mining-004 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd006-citycoin-mining-004.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd006-citycoin-mining-005 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd006-citycoin-mining-005.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd006-citycoin-mining-v2-001 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-001.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd006-citycoin-mining-v2-002 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-002.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd006-citycoin-mining-v2-003 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-003.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd006-citycoin-mining-v2-004 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-004.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd006-citycoin-mining-v2-005 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-005.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd006-citycoin-mining-v2-006 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-006.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd006-citycoin-mining-v2-007 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-007.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd007-citycoin-stacking-001 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd007-citycoin-stacking-001.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd007-citycoin-stacking-002 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd007-citycoin-stacking-002.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd007-citycoin-stacking-003 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd007-citycoin-stacking-003.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd007-citycoin-stacking-004 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd007-citycoin-stacking-004.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd007-citycoin-stacking-005 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd007-citycoin-stacking-005.clar + clarity-version: 1 + epoch: "2.1" + - id: 6 + transactions: + - emulated-contract-publish: + contract-name: test-ccd007-citycoin-stacking-006 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd007-citycoin-stacking-006.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd007-citycoin-stacking-007 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd007-citycoin-stacking-007.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd007-citycoin-stacking-008 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd007-citycoin-stacking-008.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd007-citycoin-stacking-009 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd007-citycoin-stacking-009.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd007-citycoin-stacking-010 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd007-citycoin-stacking-010.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd007-citycoin-stacking-011 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd007-citycoin-stacking-011.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd007-citycoin-stacking-012 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd007-citycoin-stacking-012.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccd011-stacking-payouts-001 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccd011-stacking-payouts-001.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccext-nft-mia + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/external/test-ccext-nft-mia.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccip014-pox-3-001 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccip014-pox-3-001.clar + clarity-version: 1 + - emulated-contract-publish: + contract-name: test-ccip014-pox-3-002 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccip014-pox-3-002.clar + clarity-version: 1 + epoch: "2.1" + - id: 7 + transactions: + - emulated-contract-publish: + contract-name: ccd012-redemption-nyc + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd012-redemption-nyc.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: ccip014-pox-3 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/proposals/ccip014-pox-3.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: ccip014-pox-3-v2 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/proposals/ccip014-pox-3-v2.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: ccip017-extend-sunset-period + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/proposals/ccip017-extend-sunset-period.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: ccip020-graceful-protocol-shutdown + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/proposals/ccip020-graceful-protocol-shutdown.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: ccip021-extend-sunset-period-2 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/proposals/ccip021-extend-sunset-period-2.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: ccip022-treasury-redemption-nyc + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/proposals/ccip022-treasury-redemption-nyc.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: mock-pox-3 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/external/mock-pox-3.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: test-ccip020-shutdown-001 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccip020-shutdown-001.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: test-ccip022-treasury-redemption-nyc-001 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-001.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: test-ccip022-treasury-redemption-nyc-002 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-002.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: test-ccip022-treasury-redemption-nyc-003 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-003.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: test-ccip022-treasury-redemption-nyc-004 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-004.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: test-ccip022-treasury-redemption-nyc-005 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-005.clar + clarity-version: 2 + epoch: "2.4" + - id: 8 + transactions: + - emulated-contract-publish: + contract-name: ccd002-treasury-mia-mining-v3 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd002-treasury-v3.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: ccd002-treasury-mia-rewards-v3 + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/extensions/ccd002-treasury-v3.clar + clarity-version: 2 + - emulated-contract-publish: + contract-name: ccip019-pox-4-stacking + emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM + path: contracts/proposals/ccip019-pox-4-stacking.clar + clarity-version: 2 + epoch: "2.5" diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f440f0a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2422 @@ +{ + "name": "city-coins", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "city-coins", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@hirosystems/clarinet-sdk": "^2.3.2", + "@stacks/network": "^6.16.0", + "@stacks/transactions": "^6.12.0", + "c32check": "^2.0.0", + "chokidar-cli": "^3.0.0", + "typescript": "^5.3.3", + "vite": "^5.1.4", + "vitest": "^1.3.1", + "vitest-environment-clarinet": "^2.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@hirosystems/clarinet-sdk": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/@hirosystems/clarinet-sdk/-/clarinet-sdk-2.8.1.tgz", + "integrity": "sha512-cD8amt/moqix/YVvq7T4ODstaKC7z0o78uujbcFv6/eGiIRs+AemqlaQBubdS3LHGHdNlCHRJ6nRqEBgPODbPw==", + "license": "GPL-3.0", + "dependencies": { + "@hirosystems/clarinet-sdk-wasm": "^2.8.0", + "@stacks/transactions": "^6.13.0", + "kolorist": "^1.8.0", + "prompts": "^2.4.2", + "vitest": "^1.0.4", + "yargs": "^17.7.2" + }, + "bin": { + "clarinet-sdk": "dist/cjs/node/src/bin/index.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@hirosystems/clarinet-sdk-wasm": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@hirosystems/clarinet-sdk-wasm/-/clarinet-sdk-wasm-2.8.0.tgz", + "integrity": "sha512-Lkr7YHzirierK50fTKTtVpXUvvUfPT+U70bDzB+13oK3NUtWG18zq6JNQ5A2NLWniU/szPJ4M9C63ba7+U091Q==", + "license": "GPL-3.0" + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@noble/hashes": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.5.tgz", + "integrity": "sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", + "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", + "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", + "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", + "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", + "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", + "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", + "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", + "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", + "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", + "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", + "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", + "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", + "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", + "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", + "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@stacks/common": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@stacks/common/-/common-6.16.0.tgz", + "integrity": "sha512-PnzvhrdGRMVZvxTulitlYafSK4l02gPCBBoI9QEoTqgSnv62oaOXhYAUUkTMFKxdHW1seVEwZsrahuXiZPIAwg==", + "license": "MIT", + "dependencies": { + "@types/bn.js": "^5.1.0", + "@types/node": "^18.0.4" + } + }, + "node_modules/@stacks/network": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@stacks/network/-/network-6.16.0.tgz", + "integrity": "sha512-uqz9Nb6uf+SeyCKENJN+idt51HAfEeggQKrOMfGjpAeFgZV2CR66soB/ci9+OVQR/SURvasncAz2ScI1blfS8A==", + "license": "MIT", + "dependencies": { + "@stacks/common": "^6.16.0", + "cross-fetch": "^3.1.5" + } + }, + "node_modules/@stacks/transactions": { + "version": "6.16.1", + "resolved": "https://registry.npmjs.org/@stacks/transactions/-/transactions-6.16.1.tgz", + "integrity": "sha512-yCtUM+8IN0QJbnnlFhY1wBW7Q30Cxje3Zmy8DgqdBoM/EPPWadez/8wNWFANVAMyUZeQ9V/FY+8MAw4E+pCReA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.1.5", + "@noble/secp256k1": "1.7.1", + "@stacks/common": "^6.16.0", + "@stacks/network": "^6.16.0", + "c32check": "^2.0.0", + "lodash.clonedeep": "^4.5.0" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.43.tgz", + "integrity": "sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@vitest/expect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", + "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", + "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.6.0", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", + "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", + "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==", + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/c32check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/c32check/-/c32check-2.0.0.tgz", + "integrity": "sha512-rpwfAcS/CMqo0oCqDf3r9eeLgScRE3l/xHDCXhM3UyrfvIn7PrLq63uHh7yYbv8NzaZn5MVsVhIRpQ+5GZ5HyA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.2", + "base-x": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "license": "MIT", + "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.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar-cli": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-3.0.0.tgz", + "integrity": "sha512-xVW+Qeh7z15uZRxHOkP93Ux8A0xbPzwK4GaqD8dQOYc34TlkqUhVSS59fK36DOp5WdJlrRzlYSy02Ht99FjZqQ==", + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "lodash.debounce": "^4.0.8", + "lodash.throttle": "^4.1.1", + "yargs": "^13.3.0" + }, + "bin": { + "chokidar": "index.js" + }, + "engines": { + "node": ">= 8.10.0" + } + }, + "node_modules/chokidar-cli/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chokidar-cli/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar-cli/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/chokidar-cli/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "license": "MIT" + }, + "node_modules/chokidar-cli/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar-cli/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chokidar-cli/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chokidar-cli/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chokidar-cli/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/chokidar-cli/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "license": "MIT", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/chokidar-cli/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "license": "MIT" + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "license": "MIT", + "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.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", + "license": "MIT" + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "license": "MIT", + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT" + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mlly": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz", + "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.7", + "mlly": "^1.7.1", + "pathe": "^1.1.2" + } + }, + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, + "node_modules/rollup": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.0.tgz", + "integrity": "sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.40", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", + "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", + "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.6.0", + "@vitest/runner": "1.6.0", + "@vitest/snapshot": "1.6.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.3", + "vite": "^5.0.0", + "vite-node": "1.6.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.6.0", + "@vitest/ui": "1.6.0", + "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 + } + } + }, + "node_modules/vitest-environment-clarinet": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vitest-environment-clarinet/-/vitest-environment-clarinet-2.1.0.tgz", + "integrity": "sha512-1SA9XZh47qmbV724sGo2FyjVU+Ar3m5TOU4bLGSlWDb/x388IKUPrHbHWqIQNwY+gwEm9VBfXEAd1LOSUdemBw==", + "license": "GPL-3.0", + "peerDependencies": { + "@hirosystems/clarinet-sdk": ">=2.6.0", + "vitest": "^1.5.2" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} From 80b09ea24514f0b4403f81ef6a89f097124a900c Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Wed, 7 Aug 2024 15:04:06 -0700 Subject: [PATCH 17/27] fix: update stxer simulation with latest --- simulations/stxer-ccip019.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/simulations/stxer-ccip019.ts b/simulations/stxer-ccip019.ts index b7ce747..904b9b5 100644 --- a/simulations/stxer-ccip019.ts +++ b/simulations/stxer-ccip019.ts @@ -50,7 +50,7 @@ async function vote(address: string, nonce: number) { async function directExecute(address: string, nonce: number) { const [, addressHash] = c32addressDecode(address); - const voteTx1 = await makeUnsignedContractCall({ + const directExecuteTx1 = await makeUnsignedContractCall({ contractAddress: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH", contractName: "ccd001-direct-execute", functionName: "direct-execute", @@ -58,13 +58,13 @@ async function directExecute(address: string, nonce: number) { nonce: nonce++, ...common_params, }); - voteTx1.auth.spendingCondition.signer = addressHash; - return voteTx1; + directExecuteTx1.auth.spendingCondition.signer = addressHash; + return directExecuteTx1; } async function main() { - const block_height = 157894; - const block_hash = "5e584e604a8caffc476be973562f4ad05231cecb70f3ede3af110986dffee4cf"; + const block_height = 161020; + const block_hash = "cf26a611c560d1775fc9d1d01cc1b223175a3cd2efddd0d56fec44526fd48576"; // DO NOT sign any transactions you're about to send, this is not required for simulation let address = "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH"; @@ -81,7 +81,7 @@ async function main() { deployTx1.auth.spendingCondition.signer = addressHash; const deployTx2 = await makeUnsignedContractDeploy({ - contractName: "ccd002-treasury-mia-stx-stacking-v3", + contractName: "ccd002-treasury-mia-rewards-v3", codeBody: fs.readFileSync("contracts/extensions/ccd002-treasury-v3.clar").toString(), nonce: nonce++, ...common_params, @@ -100,18 +100,18 @@ async function main() { voteTxs.push(await vote("SP18Z92ZT0GAB2JHD21CZ3KS1WPGNDJCYZS7CV3MD", 529)); voteTxs.push(await vote("SP34N5WWPHWTVJVYPE368HYDEXMZWKPVF639B3P5T", 982)); - voteTxs.push(await vote("SP1T91N2Y2TE5M937FE3R6DE0HGWD85SGCV50T95A", 245)); + voteTxs.push(await vote("SP1T91N2Y2TE5M937FE3R6DE0HGWD85SGCV50T95A", 249)); const executeTxs: StacksTransaction[] = []; executeTxs.push(await directExecute("SP7DGES13508FHRWS1FB0J3SZA326FP6QRMB6JDE", 122)); executeTxs.push(await directExecute("SP3YYGCGX1B62CYAH4QX7PQE63YXG7RDTXD8BQHJQ", 17)); - executeTxs.push(await directExecute("SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X", 803)); + executeTxs.push(await directExecute("SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X", 813)); address = "SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X"; - nonce = 804; + nonce = 813; const transferStxTx = await makeUnsignedSTXTokenTransfer({ amount: 10000000, - recipient: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stx-stacking-v3", + recipient: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-rewards-v3", nonce: nonce++, ...common_params, }); @@ -119,12 +119,12 @@ async function main() { transferStxTx.auth.spendingCondition.signer = addressHash; address = "SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X"; - nonce = 805; + nonce = nonce++; const lockStxTx = await makeUnsignedContractCall({ contractAddress: "SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP", contractName: "pox4-fast-pool-v3", functionName: "delegate-stack-stx-many", - functionArgs: [listCV([principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-mining-v3"), principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-stx-stacking-v3")])], + functionArgs: [listCV([principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-mining-v3"), principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-rewards-v3")])], nonce: nonce++, ...common_params, }); From 43d7e79b4570db27b9de3a1d272872e2973e934c Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Wed, 7 Aug 2024 15:20:26 -0700 Subject: [PATCH 18/27] fix: update support for stxer simulation Since we're not using the package.json for Clarinet testing it required some changes to be able to run the stxer simulation. Current process is to run npx tsc then node to run the js file in dist. --- .gitignore | 2 ++ package-lock.json | 2 +- package.json | 2 +- tsconfig.json | 29 ++++++++--------------------- 4 files changed, 12 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index 7a33ce4..f512125 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ **/settings/Mainnet.toml **/settings/Testnet.toml +dist + # removing to resolve issue with testnet reset # will use files obtained locally beforehand # .cache/ diff --git a/package-lock.json b/package-lock.json index f440f0a..a32c1fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@hirosystems/clarinet-sdk": "^2.3.2", "@stacks/network": "^6.16.0", - "@stacks/transactions": "^6.12.0", + "@stacks/transactions": "^6.16.1", "c32check": "^2.0.0", "chokidar-cli": "^3.0.0", "typescript": "^5.3.3", diff --git a/package.json b/package.json index b66c8d9..bfc99d4 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dependencies": { "@hirosystems/clarinet-sdk": "^2.3.2", "@stacks/network": "^6.16.0", - "@stacks/transactions": "^6.12.0", + "@stacks/transactions": "^6.16.1", "c32check": "^2.0.0", "chokidar-cli": "^3.0.0", "typescript": "^5.3.3", diff --git a/tsconfig.json b/tsconfig.json index 1bdaf36..ade2eb8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,26 +1,13 @@ - { "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "lib": ["ESNext"], - "skipLibCheck": true, - - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - + "target": "ES2020", + "module": "ES2020", + "moduleResolution": "node", + "esModuleInterop": true, "strict": true, - "noImplicitAny": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true + "outDir": "./dist", + "allowSyntheticDefaultImports": true, + "skipLibCheck": true }, - "include": [ - "node_modules/@hirosystems/clarinet-sdk/vitest-helpers/src", - "tests" - ] + "include": ["simulations/**/*"] } From 67382c95f057bacd49c21a17b75b7ff51766bda6 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Wed, 7 Aug 2024 15:21:36 -0700 Subject: [PATCH 19/27] fix: remove simnet plan, causes conflict with gh action It's automatically generated but Clarinet is complaining it's not formatted correctly. We don't need it so it's gone now. --- deployments/default.simnet-plan.yaml | 966 --------------------------- 1 file changed, 966 deletions(-) delete mode 100644 deployments/default.simnet-plan.yaml diff --git a/deployments/default.simnet-plan.yaml b/deployments/default.simnet-plan.yaml deleted file mode 100644 index f02793a..0000000 --- a/deployments/default.simnet-plan.yaml +++ /dev/null @@ -1,966 +0,0 @@ ---- -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: citycoin-core-trait - emulated-sender: SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27 - path: ".cache/requirements/SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27.citycoin-core-trait.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: citycoin-token-trait - emulated-sender: SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27 - path: ".cache/requirements/SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27.citycoin-token-trait.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-auth - emulated-sender: SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27 - path: ".cache/requirements/SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27.miamicoin-auth.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: sip-010-trait-ft-standard - emulated-sender: SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE - path: ".cache/requirements/SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-token - emulated-sender: SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27 - path: ".cache/requirements/SP466FNC0P7JWTNM2R9T199QRZN1MYEDTAR0KP27.miamicoin-token.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: citycoin-core-v2-trait - emulated-sender: SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11 - path: ".cache/requirements/SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.citycoin-core-v2-trait.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: citycoin-token-v2-trait - emulated-sender: SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11 - path: ".cache/requirements/SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.citycoin-token-v2-trait.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: citycoin-vrf-v2 - emulated-sender: SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11 - path: ".cache/requirements/SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.citycoin-vrf-v2.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-auth-v2 - emulated-sender: SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11 - path: ".cache/requirements/SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-auth-v2.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-auth - emulated-sender: SP2H8PY27SEZ03MWRKS5XABZYQN17ETGQS3527SA5 - path: ".cache/requirements/SP2H8PY27SEZ03MWRKS5XABZYQN17ETGQS3527SA5.newyorkcitycoin-auth.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-token - emulated-sender: SP2H8PY27SEZ03MWRKS5XABZYQN17ETGQS3527SA5 - path: ".cache/requirements/SP2H8PY27SEZ03MWRKS5XABZYQN17ETGQS3527SA5.newyorkcitycoin-token.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-token-v2 - emulated-sender: SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11 - path: ".cache/requirements/SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-token-v2.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-core-v2 - emulated-sender: SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11 - path: ".cache/requirements/SPSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1F4DYQ11.newyorkcitycoin-core-v2.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-auth-v2 - emulated-sender: SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R - path: ".cache/requirements/SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-auth-v2.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-core-v1-patch - emulated-sender: SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R - path: ".cache/requirements/SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-core-v1-patch.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-token-v2 - emulated-sender: SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R - path: ".cache/requirements/SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-core-v2 - emulated-sender: SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R - path: ".cache/requirements/SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-core-v2.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: nft-trait - emulated-sender: SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9 - path: ".cache/requirements/SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: citycoin-core-v2-trait - emulated-sender: ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6 - path: ".cache/requirements/ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6.citycoin-core-v2-trait.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: citycoin-token-v2-trait - emulated-sender: ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6 - path: ".cache/requirements/ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6.citycoin-token-v2-trait.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-auth-v2 - emulated-sender: STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ - path: ".cache/requirements/STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ.newyorkcitycoin-auth-v2.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: sip-010-trait-ft-standard - emulated-sender: ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT - path: ".cache/requirements/ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.sip-010-trait-ft-standard.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-token-v2 - emulated-sender: STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ - path: ".cache/requirements/STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ.newyorkcitycoin-token-v2.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: citycoin-vrf-v2 - emulated-sender: ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6 - path: ".cache/requirements/ST1XQXW9JNQ1W4A7PYTN3HCHPEY7SHM6KPA085ES6.citycoin-vrf-v2.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-core-v2 - emulated-sender: STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ - path: ".cache/requirements/STSCWDV3RKV5ZRN1FQD84YE1NQFEDJ9R1D64KKHQ.newyorkcitycoin-core-v2.clar" - clarity-version: 1 - epoch: "2.1" - - id: 1 - transactions: - - emulated-contract-publish: - contract-name: miamicoin-auth-v2 - emulated-sender: ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H - path: ".cache/requirements/ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H.miamicoin-auth-v2.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-token-v2 - emulated-sender: ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H - path: ".cache/requirements/ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H.miamicoin-token-v2.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-core-v2 - emulated-sender: ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H - path: ".cache/requirements/ST1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8WRH7C6H.miamicoin-core-v2.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: nft-trait - emulated-sender: ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT - path: ".cache/requirements/ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.nft-trait.clar" - clarity-version: 1 - - emulated-contract-publish: - contract-name: extension-trait - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/traits/extension-trait.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: proposal-trait - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/traits/proposal-trait.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: base-dao - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/base-dao.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd001-direct-execute - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd001-direct-execute.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd002-trait - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/traits/ccd002-trait.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: stacking-trait - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/traits/stacking-trait.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd002-treasury-mia-mining - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd002-treasury.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd002-treasury-mia-mining-v2 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd002-treasury-v2.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd002-treasury-mia-stacking - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd002-treasury.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd002-treasury-nyc-mining - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd002-treasury.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd002-treasury-nyc-mining-v2 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd002-treasury-v2.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd002-treasury-nyc-stacking - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd002-treasury.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd003-user-registry - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd003-user-registry.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd004-city-registry - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd004-city-registry.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd005-city-data - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd005-city-data.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd006-trait - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/traits/ccd006-trait.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccext-governance-token-mia - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/external/test-ccext-governance-token-mia.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccext-governance-token-nyc - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/external/test-ccext-governance-token-nyc.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd010-core-v2-adapter - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd010-core-v2-adapter.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: citycoin-vrf-v2 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/external/citycoin-vrf-v2.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd006-citycoin-mining - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd006-citycoin-mining.clar - clarity-version: 1 - epoch: "2.1" - - id: 2 - transactions: - - emulated-contract-publish: - contract-name: ccd006-citycoin-mining-v2 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd006-citycoin-mining-v2.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd007-trait - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/traits/ccd007-trait.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd007-citycoin-stacking - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd007-citycoin-stacking.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd008-city-activation - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd008-city-activation.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd009-auth-v2-adapter - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd009-auth-v2-adapter.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccd011-stacking-payouts - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd011-stacking-payouts.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccext-governance-token-nyc-v1 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/external/test-ccext-governance-token-nyc-v1.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccip012-bootstrap - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/proposals/ccip012-bootstrap.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccip013-migration - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/proposals/ccip013-migration.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccip013-activation - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/proposals/ccip013-activation.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: ccip015-trait - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/traits/ccip015-trait.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: citycoin-core-trait - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/citycoin-core-trait.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: citycoin-core-v2-trait - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/citycoin-core-v2-trait.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: citycoin-token-trait - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/citycoin-token-trait.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: citycoin-token-v2-trait - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/citycoin-token-v2-trait.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: citycoin-vrf - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/citycoin-vrf.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-auth - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/miamicoin-auth.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-auth-v2 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/miamicoin-auth-v2.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-token - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/miamicoin-token.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-core-v1 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/miamicoin-core-v1.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-core-v1-patch - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/miamicoin-core-v1-patch.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-token-v2 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/miamicoin-token-v2.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: miamicoin-core-v2 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/miamicoin-core-v2.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-auth - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/newyorkcitycoin-auth.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-auth-v2 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/newyorkcitycoin-auth-v2.clar - clarity-version: 1 - epoch: "2.1" - - id: 3 - transactions: - - emulated-contract-publish: - contract-name: newyorkcitycoin-token - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/newyorkcitycoin-token.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-core-v1 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/newyorkcitycoin-core-v1.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-core-v1-patch - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/newyorkcitycoin-core-v1-patch.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-token-v2 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/newyorkcitycoin-token-v2.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: newyorkcitycoin-core-v2 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/legacy/newyorkcitycoin-core-v2.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd001-direct-execute-001 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd001-direct-execute-001.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd001-direct-execute-002 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd001-direct-execute-002.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd001-direct-execute-003 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd001-direct-execute-003.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-001 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-001.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-002 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-002.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-003 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-003.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-004 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-004.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-005 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-005.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-006 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-006.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-007 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-007.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-008 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-008.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccext-nft-nyc - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/external/test-ccext-nft-nyc.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-009 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-009.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-010 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-010.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-011 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-011.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-012 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-012.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-v2-001 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-v2-001.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-v2-002 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-v2-002.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-v2-003 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-v2-003.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-v2-004 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-v2-004.clar - clarity-version: 1 - epoch: "2.1" - - id: 4 - transactions: - - emulated-contract-publish: - contract-name: test-ccd002-treasury-v2-005 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-v2-005.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-v2-006 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-v2-006.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-v2-007 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-v2-007.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-v2-008 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-v2-008.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-v2-009 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-v2-009.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-v2-010 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-v2-010.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-v2-011 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-v2-011.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd002-treasury-v2-012 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd002-treasury-v2-012.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd003-user-registry-001 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd003-user-registry-001.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd003-user-registry-002 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd003-user-registry-002.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd003-user-registry-003 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd003-user-registry-003.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd004-city-registry-001 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd004-city-registry-001.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd004-city-registry-002 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd004-city-registry-002.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-001 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-001.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-002 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-002.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-003 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-003.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-004 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-004.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-005 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-005.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-006 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-006.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-007 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-007.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-008 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-008.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-009 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-009.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-010 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-010.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-011 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-011.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-012 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-012.clar - clarity-version: 1 - epoch: "2.1" - - id: 5 - transactions: - - emulated-contract-publish: - contract-name: test-ccd005-city-data-013 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-013.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-014 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-014.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-015 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-015.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-016 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-016.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-017 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-017.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-018 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-018.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-019 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-019.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd005-city-data-020 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd005-city-data-020.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd006-citycoin-mining-001 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd006-citycoin-mining-001.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd006-citycoin-mining-002 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd006-citycoin-mining-002.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd006-citycoin-mining-003 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd006-citycoin-mining-003.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd006-citycoin-mining-004 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd006-citycoin-mining-004.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd006-citycoin-mining-005 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd006-citycoin-mining-005.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd006-citycoin-mining-v2-001 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-001.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd006-citycoin-mining-v2-002 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-002.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd006-citycoin-mining-v2-003 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-003.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd006-citycoin-mining-v2-004 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-004.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd006-citycoin-mining-v2-005 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-005.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd006-citycoin-mining-v2-006 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-006.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd006-citycoin-mining-v2-007 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd006-citycoin-mining-v2-007.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd007-citycoin-stacking-001 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd007-citycoin-stacking-001.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd007-citycoin-stacking-002 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd007-citycoin-stacking-002.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd007-citycoin-stacking-003 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd007-citycoin-stacking-003.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd007-citycoin-stacking-004 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd007-citycoin-stacking-004.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd007-citycoin-stacking-005 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd007-citycoin-stacking-005.clar - clarity-version: 1 - epoch: "2.1" - - id: 6 - transactions: - - emulated-contract-publish: - contract-name: test-ccd007-citycoin-stacking-006 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd007-citycoin-stacking-006.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd007-citycoin-stacking-007 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd007-citycoin-stacking-007.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd007-citycoin-stacking-008 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd007-citycoin-stacking-008.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd007-citycoin-stacking-009 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd007-citycoin-stacking-009.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd007-citycoin-stacking-010 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd007-citycoin-stacking-010.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd007-citycoin-stacking-011 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd007-citycoin-stacking-011.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd007-citycoin-stacking-012 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd007-citycoin-stacking-012.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccd011-stacking-payouts-001 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccd011-stacking-payouts-001.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccext-nft-mia - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/external/test-ccext-nft-mia.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccip014-pox-3-001 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccip014-pox-3-001.clar - clarity-version: 1 - - emulated-contract-publish: - contract-name: test-ccip014-pox-3-002 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccip014-pox-3-002.clar - clarity-version: 1 - epoch: "2.1" - - id: 7 - transactions: - - emulated-contract-publish: - contract-name: ccd012-redemption-nyc - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd012-redemption-nyc.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: ccip014-pox-3 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/proposals/ccip014-pox-3.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: ccip014-pox-3-v2 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/proposals/ccip014-pox-3-v2.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: ccip017-extend-sunset-period - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/proposals/ccip017-extend-sunset-period.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: ccip020-graceful-protocol-shutdown - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/proposals/ccip020-graceful-protocol-shutdown.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: ccip021-extend-sunset-period-2 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/proposals/ccip021-extend-sunset-period-2.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: ccip022-treasury-redemption-nyc - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/proposals/ccip022-treasury-redemption-nyc.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: mock-pox-3 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/external/mock-pox-3.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: test-ccip020-shutdown-001 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccip020-shutdown-001.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: test-ccip022-treasury-redemption-nyc-001 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-001.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: test-ccip022-treasury-redemption-nyc-002 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-002.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: test-ccip022-treasury-redemption-nyc-003 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-003.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: test-ccip022-treasury-redemption-nyc-004 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-004.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: test-ccip022-treasury-redemption-nyc-005 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: tests/contracts/proposals/test-ccip022-treasury-redemption-nyc-005.clar - clarity-version: 2 - epoch: "2.4" - - id: 8 - transactions: - - emulated-contract-publish: - contract-name: ccd002-treasury-mia-mining-v3 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd002-treasury-v3.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: ccd002-treasury-mia-rewards-v3 - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/extensions/ccd002-treasury-v3.clar - clarity-version: 2 - - emulated-contract-publish: - contract-name: ccip019-pox-4-stacking - emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM - path: contracts/proposals/ccip019-pox-4-stacking.clar - clarity-version: 2 - epoch: "2.5" From 7fb0af548bd3a40df78901540a972f1f4f9f2a02 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Wed, 7 Aug 2024 15:31:27 -0700 Subject: [PATCH 20/27] fix: update all refs to mainnet except traits For whatever reason when changing the traits to mainnet even with them listed in the project requirements there is an error that deposit-ft doesn't match the trait spec. Will update the two trait references manually for the updated simulation. --- .../SP000000000000000000002Q6VF78.pox-4.clar | 1484 +++++++++++++++++ .../SP000000000000000000002Q6VF78.pox-4.json | 4 + ...VNKXVW8FVZE198XEFFP.pox4-fast-pool-v3.clar | 378 +++++ ...VNKXVW8FVZE198XEFFP.pox4-fast-pool-v3.json | 4 + Clarinet.toml | 6 + contracts/extensions/ccd002-treasury-v3.clar | 8 +- .../proposals/ccip019-pox-4-stacking.clar | 2 - 7 files changed, 1878 insertions(+), 8 deletions(-) create mode 100644 .cache/requirements/SP000000000000000000002Q6VF78.pox-4.clar create mode 100644 .cache/requirements/SP000000000000000000002Q6VF78.pox-4.json create mode 100644 .cache/requirements/SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3.clar create mode 100644 .cache/requirements/SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3.json diff --git a/.cache/requirements/SP000000000000000000002Q6VF78.pox-4.clar b/.cache/requirements/SP000000000000000000002Q6VF78.pox-4.clar new file mode 100644 index 0000000..9824a71 --- /dev/null +++ b/.cache/requirements/SP000000000000000000002Q6VF78.pox-4.clar @@ -0,0 +1,1484 @@ +;; The .pox-4 contract +;; Error codes +(define-constant ERR_STACKING_UNREACHABLE 255) +(define-constant ERR_STACKING_CORRUPTED_STATE 254) +(define-constant ERR_STACKING_INSUFFICIENT_FUNDS 1) +(define-constant ERR_STACKING_INVALID_LOCK_PERIOD 2) +(define-constant ERR_STACKING_ALREADY_STACKED 3) +(define-constant ERR_STACKING_NO_SUCH_PRINCIPAL 4) +(define-constant ERR_STACKING_EXPIRED 5) +(define-constant ERR_STACKING_STX_LOCKED 6) +(define-constant ERR_STACKING_PERMISSION_DENIED 9) +(define-constant ERR_STACKING_THRESHOLD_NOT_MET 11) +(define-constant ERR_STACKING_POX_ADDRESS_IN_USE 12) +(define-constant ERR_STACKING_INVALID_POX_ADDRESS 13) + +(define-constant ERR_STACKING_INVALID_AMOUNT 18) +(define-constant ERR_NOT_ALLOWED 19) +(define-constant ERR_STACKING_ALREADY_DELEGATED 20) +(define-constant ERR_DELEGATION_EXPIRES_DURING_LOCK 21) +(define-constant ERR_DELEGATION_TOO_MUCH_LOCKED 22) +(define-constant ERR_DELEGATION_POX_ADDR_REQUIRED 23) +(define-constant ERR_INVALID_START_BURN_HEIGHT 24) +(define-constant ERR_NOT_CURRENT_STACKER 25) +(define-constant ERR_STACK_EXTEND_NOT_LOCKED 26) +(define-constant ERR_STACK_INCREASE_NOT_LOCKED 27) +(define-constant ERR_DELEGATION_NO_REWARD_SLOT 28) +(define-constant ERR_DELEGATION_WRONG_REWARD_SLOT 29) +(define-constant ERR_STACKING_IS_DELEGATED 30) +(define-constant ERR_STACKING_NOT_DELEGATED 31) +(define-constant ERR_INVALID_SIGNER_KEY 32) +(define-constant ERR_REUSED_SIGNER_KEY 33) +(define-constant ERR_DELEGATION_ALREADY_REVOKED 34) +(define-constant ERR_INVALID_SIGNATURE_PUBKEY 35) +(define-constant ERR_INVALID_SIGNATURE_RECOVER 36) +(define-constant ERR_INVALID_REWARD_CYCLE 37) +(define-constant ERR_SIGNER_AUTH_AMOUNT_TOO_HIGH 38) +(define-constant ERR_SIGNER_AUTH_USED 39) +(define-constant ERR_INVALID_INCREASE 40) + +;; Valid values for burnchain address versions. +;; These first four correspond to address hash modes in Stacks 2.1, +;; and are defined in pox-mainnet.clar and pox-testnet.clar (so they +;; cannot be defined here again). +(define-constant ADDRESS_VERSION_P2PKH 0x00) +(define-constant ADDRESS_VERSION_P2SH 0x01) +(define-constant ADDRESS_VERSION_P2WPKH 0x02) +(define-constant ADDRESS_VERSION_P2WSH 0x03) +(define-constant ADDRESS_VERSION_NATIVE_P2WPKH 0x04) +(define-constant ADDRESS_VERSION_NATIVE_P2WSH 0x05) +(define-constant ADDRESS_VERSION_NATIVE_P2TR 0x06) + +;; Values for stacks address versions +(define-constant STACKS_ADDR_VERSION_MAINNET 0x16) +(define-constant STACKS_ADDR_VERSION_TESTNET 0x1a) + +;; Keep these constants in lock-step with the address version buffs above +;; Maximum value of an address version as a uint +(define-constant MAX_ADDRESS_VERSION u6) +;; Maximum value of an address version that has a 20-byte hashbytes +;; (0x00, 0x01, 0x02, 0x03, and 0x04 have 20-byte hashbytes) +(define-constant MAX_ADDRESS_VERSION_BUFF_20 u4) +;; Maximum value of an address version that has a 32-byte hashbytes +;; (0x05 and 0x06 have 32-byte hashbytes) +(define-constant MAX_ADDRESS_VERSION_BUFF_32 u6) + +;; PoX mainnet constants +;; Min/max number of reward cycles uSTX can be locked for +(define-constant MIN_POX_REWARD_CYCLES u1) +(define-constant MAX_POX_REWARD_CYCLES u12) + +;; Default length of the PoX registration window, in burnchain blocks. +(define-constant PREPARE_CYCLE_LENGTH (if is-in-mainnet u100 u50)) + +;; Default length of the PoX reward cycle, in burnchain blocks. +(define-constant REWARD_CYCLE_LENGTH (if is-in-mainnet u2100 u1050)) + +;; Stacking thresholds +(define-constant STACKING_THRESHOLD_25 (if is-in-mainnet u20000 u8000)) + +;; SIP18 message prefix +(define-constant SIP018_MSG_PREFIX 0x534950303138) + +;; Data vars that store a copy of the burnchain configuration. +;; Implemented as data-vars, so that different configurations can be +;; used in e.g. test harnesses. +(define-data-var pox-prepare-cycle-length uint PREPARE_CYCLE_LENGTH) +(define-data-var pox-reward-cycle-length uint REWARD_CYCLE_LENGTH) +(define-data-var first-burnchain-block-height uint u0) +(define-data-var configured bool false) +(define-data-var first-pox-4-reward-cycle uint u0) + +;; This function can only be called once, when it boots up +(define-public (set-burnchain-parameters (first-burn-height uint) + (prepare-cycle-length uint) + (reward-cycle-length uint) + (begin-pox-4-reward-cycle uint)) + (begin + (asserts! (not (var-get configured)) (err ERR_NOT_ALLOWED)) + (var-set first-burnchain-block-height first-burn-height) + (var-set pox-prepare-cycle-length prepare-cycle-length) + (var-set pox-reward-cycle-length reward-cycle-length) + (var-set first-pox-4-reward-cycle begin-pox-4-reward-cycle) + (var-set configured true) + (ok true)) +) + +;; The Stacking lock-up state and associated metadata. +;; Records are inserted into this map via `stack-stx`, `delegate-stack-stx`, `stack-extend` +;; `delegate-stack-extend` and burnchain transactions for invoking `stack-stx`, etc. +;; Records will be deleted from this map when auto-unlocks are processed +;; +;; This map de-normalizes some state from the `reward-cycle-pox-address-list` map +;; and the `pox-4` contract tries to keep this state in sync with the reward-cycle +;; state. The major invariants of this `stacking-state` map are: +;; (1) any entry in `reward-cycle-pox-address-list` with `some stacker` points to a real `stacking-state` +;; (2) `stacking-state.reward-set-indexes` matches the index of that `reward-cycle-pox-address-list` +;; (3) all `stacking-state.reward-set-indexes` match the index of their reward cycle entries +;; (4) `stacking-state.pox-addr` matches `reward-cycle-pox-address-list.pox-addr` +;; (5) if set, (len reward-set-indexes) == lock-period +;; (6) (reward-cycle-to-burn-height (+ lock-period first-reward-cycle)) == (get unlock-height (stx-account stacker)) +;; These invariants only hold while `cur-reward-cycle < (+ lock-period first-reward-cycle)` +;; +(define-map stacking-state + { stacker: principal } + { + ;; Description of the underlying burnchain address that will + ;; receive PoX'ed tokens. Translating this into an address + ;; depends on the burnchain being used. When Bitcoin is + ;; the burnchain, this gets translated into a p2pkh, p2sh, + ;; p2wpkh-p2sh, p2wsh-p2sh, p2wpkh, p2wsh, or p2tr UTXO, + ;; depending on the version. The `hashbytes` field *must* be + ;; either 20 bytes or 32 bytes, depending on the output. + pox-addr: { version: (buff 1), hashbytes: (buff 32) }, + ;; how long the uSTX are locked, in reward cycles. + lock-period: uint, + ;; reward cycle when rewards begin + first-reward-cycle: uint, + ;; indexes in each reward-set associated with this user. + ;; these indexes are only valid looking forward from + ;; `first-reward-cycle` (i.e., they do not correspond + ;; to entries in the reward set that may have been from + ;; previous stack-stx calls, or prior to an extend) + reward-set-indexes: (list 12 uint), + ;; principal of the delegate, if stacker has delegated + delegated-to: (optional principal), + } +) + +;; Delegation relationships +(define-map delegation-state + { stacker: principal } + { + amount-ustx: uint, ;; how many uSTX delegated? + delegated-to: principal, ;; who are we delegating? + until-burn-ht: (optional uint), ;; how long does the delegation last? + ;; does the delegate _need_ to use a specific + ;; pox recipient address? + pox-addr: (optional { version: (buff 1), hashbytes: (buff 32) }) + } +) + +;; allowed contract-callers +(define-map allowance-contract-callers + { sender: principal, contract-caller: principal } + { until-burn-ht: (optional uint) }) + +;; How many uSTX are stacked in a given reward cycle. +;; Updated when a new PoX address is registered, or when more STX are granted +;; to it. +(define-map reward-cycle-total-stacked + { reward-cycle: uint } + { total-ustx: uint } +) + +;; Internal map read by the Stacks node to iterate through the list of +;; PoX reward addresses on a per-reward-cycle basis. +(define-map reward-cycle-pox-address-list + { reward-cycle: uint, index: uint } + { + pox-addr: { version: (buff 1), hashbytes: (buff 32) }, + total-ustx: uint, + stacker: (optional principal), + signer: (buff 33) + } +) + +(define-map reward-cycle-pox-address-list-len + { reward-cycle: uint } + { len: uint } +) + +;; how much has been locked up for this address before +;; committing? +;; this map allows stackers to stack amounts < minimum +;; by paying the cost of aggregation during the commit +(define-map partial-stacked-by-cycle + { + pox-addr: { version: (buff 1), hashbytes: (buff 32) }, + reward-cycle: uint, + sender: principal + } + { stacked-amount: uint } +) + +;; This is identical to partial-stacked-by-cycle, but its data is never deleted. +;; It is used to preserve data for downstream clients to observe aggregate +;; commits. Each key/value pair in this map is simply the last value of +;; partial-stacked-by-cycle right after it was deleted (so, subsequent calls +;; to the `stack-aggregation-*` functions will overwrite this). +(define-map logged-partial-stacked-by-cycle + { + pox-addr: { version: (buff 1), hashbytes: (buff 32) }, + reward-cycle: uint, + sender: principal + } + { stacked-amount: uint } +) + +;; State for setting authorizations for signer keys to be used in +;; certain stacking transactions. These fields match the fields used +;; in the message hash for signature-based signer key authorizations. +;; Values in this map are set in `set-signer-key-authorization`. +(define-map signer-key-authorizations + { + ;; The signer key being authorized + signer-key: (buff 33), + ;; The reward cycle for which the authorization is valid. + ;; For `stack-stx` and `stack-extend`, this refers to the reward + ;; cycle where the transaction is confirmed. For `stack-aggregation-commit`, + ;; this refers to the reward cycle argument in that function. + reward-cycle: uint, + ;; For `stack-stx`, this refers to `lock-period`. For `stack-extend`, + ;; this refers to `extend-count`. For `stack-aggregation-commit`, this is `u1`. + period: uint, + ;; A string representing the function where this authorization is valid. Either + ;; `stack-stx`, `stack-extend`, `stack-increase` or `agg-commit`. + topic: (string-ascii 14), + ;; The PoX address that can be used with this signer key + pox-addr: { version: (buff 1), hashbytes: (buff 32) }, + ;; The unique auth-id for this authorization + auth-id: uint, + ;; The maximum amount of uSTX that can be used (per tx) with this signer key + max-amount: uint, + } + bool ;; Whether the authorization can be used or not +) + +;; State for tracking used signer key authorizations. This prevents re-use +;; of the same signature or pre-set authorization for multiple transactions. +;; Refer to the `signer-key-authorizations` map for the documentation on these fields +(define-map used-signer-key-authorizations + { + signer-key: (buff 33), + reward-cycle: uint, + period: uint, + topic: (string-ascii 14), + pox-addr: { version: (buff 1), hashbytes: (buff 32) }, + auth-id: uint, + max-amount: uint, + } + bool ;; Whether the field has been used or not +) + +;; What's the reward cycle number of the burnchain block height? +;; Will runtime-abort if height is less than the first burnchain block (this is intentional) +(define-read-only (burn-height-to-reward-cycle (height uint)) + (/ (- height (var-get first-burnchain-block-height)) (var-get pox-reward-cycle-length))) + +;; What's the block height at the start of a given reward cycle? +(define-read-only (reward-cycle-to-burn-height (cycle uint)) + (+ (var-get first-burnchain-block-height) (* cycle (var-get pox-reward-cycle-length)))) + +;; What's the current PoX reward cycle? +(define-read-only (current-pox-reward-cycle) + (burn-height-to-reward-cycle burn-block-height)) + +;; Get the _current_ PoX stacking principal information. If the information +;; is expired, or if there's never been such a stacker, then returns none. +(define-read-only (get-stacker-info (stacker principal)) + (match (map-get? stacking-state { stacker: stacker }) + stacking-info + (if (<= (+ (get first-reward-cycle stacking-info) (get lock-period stacking-info)) (current-pox-reward-cycle)) + ;; present, but lock has expired + none + ;; present, and lock has not expired + (some stacking-info) + ) + ;; no state at all + none + )) + +(define-read-only (check-caller-allowed) + (or (is-eq tx-sender contract-caller) + (let ((caller-allowed + ;; if not in the caller map, return false + (unwrap! (map-get? allowance-contract-callers + { sender: tx-sender, contract-caller: contract-caller }) + false)) + (expires-at + ;; if until-burn-ht not set, then return true (because no expiry) + (unwrap! (get until-burn-ht caller-allowed) true))) + ;; is the caller allowance expired? + (if (>= burn-block-height expires-at) + false + true)))) + +(define-read-only (get-check-delegation (stacker principal)) + (let ((delegation-info (try! (map-get? delegation-state { stacker: stacker })))) + ;; did the existing delegation expire? + (if (match (get until-burn-ht delegation-info) + until-burn-ht (> burn-block-height until-burn-ht) + false) + ;; it expired, return none + none + ;; delegation is active + (some delegation-info)))) + +;; Get the size of the reward set for a reward cycle. +;; Note that this also _will_ return PoX addresses that are beneath +;; the minimum threshold -- i.e. the threshold can increase after insertion. +;; Used internally by the Stacks node, which filters out the entries +;; in this map to select PoX addresses with enough STX. +(define-read-only (get-reward-set-size (reward-cycle uint)) + (default-to + u0 + (get len (map-get? reward-cycle-pox-address-list-len { reward-cycle: reward-cycle })))) + +;; Add a single PoX address to a single reward cycle. +;; Used to build up a set of per-reward-cycle PoX addresses. +;; No checking will be done -- don't call if this PoX address is already registered in this reward cycle! +;; Returns the index into the reward cycle that the PoX address is stored to +(define-private (append-reward-cycle-pox-addr (pox-addr (tuple (version (buff 1)) (hashbytes (buff 32)))) + (reward-cycle uint) + (amount-ustx uint) + (stacker (optional principal)) + (signer (buff 33))) + (let ((sz (get-reward-set-size reward-cycle))) + (map-set reward-cycle-pox-address-list + { reward-cycle: reward-cycle, index: sz } + { pox-addr: pox-addr, total-ustx: amount-ustx, stacker: stacker, signer: signer }) + (map-set reward-cycle-pox-address-list-len + { reward-cycle: reward-cycle } + { len: (+ u1 sz) }) + sz)) + +;; How many uSTX are stacked? +(define-read-only (get-total-ustx-stacked (reward-cycle uint)) + (default-to + u0 + (get total-ustx (map-get? reward-cycle-total-stacked { reward-cycle: reward-cycle }))) +) + +;; Called internally by the node to iterate through the list of PoX addresses in this reward cycle. +;; Returns (optional (tuple (pox-addr ) (total-ustx ))) +(define-read-only (get-reward-set-pox-address (reward-cycle uint) (index uint)) + (map-get? reward-cycle-pox-address-list { reward-cycle: reward-cycle, index: index })) + +;; Add a PoX address to the `cycle-index`-th reward cycle, if `cycle-index` is between 0 and the given num-cycles (exclusive). +;; Arguments are given as a tuple, so this function can be (folded ..)'ed onto a list of its arguments. +;; Used by add-pox-addr-to-reward-cycles. +;; No checking is done. +;; The returned tuple is the same as inputted `params`, but the `i` field is incremented if +;; the pox-addr was added to the given cycle. Also, `reward-set-indexes` grows to include all +;; of the `reward-cycle-index` key parts of the `reward-cycle-pox-address-list` which get added by this function. +;; This way, the caller knows which items in a given reward cycle's PoX address list got updated. +(define-private (add-pox-addr-to-ith-reward-cycle (cycle-index uint) (params (tuple + (pox-addr (tuple (version (buff 1)) (hashbytes (buff 32)))) + (reward-set-indexes (list 12 uint)) + (first-reward-cycle uint) + (num-cycles uint) + (stacker (optional principal)) + (signer (buff 33)) + (amount-ustx uint) + (i uint)))) + (let ((reward-cycle (+ (get first-reward-cycle params) (get i params))) + (num-cycles (get num-cycles params)) + (i (get i params)) + (reward-set-index (if (< i num-cycles) + (let ((total-ustx (get-total-ustx-stacked reward-cycle)) + (reward-index + ;; record how many uSTX this pox-addr will stack for in the given reward cycle + (append-reward-cycle-pox-addr + (get pox-addr params) + reward-cycle + (get amount-ustx params) + (get stacker params) + (get signer params) + ))) + ;; update running total + (map-set reward-cycle-total-stacked + { reward-cycle: reward-cycle } + { total-ustx: (+ (get amount-ustx params) total-ustx) }) + (some reward-index)) + none)) + (next-i (if (< i num-cycles) (+ i u1) i))) + { + pox-addr: (get pox-addr params), + first-reward-cycle: (get first-reward-cycle params), + num-cycles: num-cycles, + amount-ustx: (get amount-ustx params), + stacker: (get stacker params), + signer: (get signer params), + reward-set-indexes: (match + reward-set-index new (unwrap-panic (as-max-len? (append (get reward-set-indexes params) new) u12)) + (get reward-set-indexes params)), + i: next-i + })) + +;; Add a PoX address to a given sequence of reward cycle lists. +;; A PoX address can be added to at most 12 consecutive cycles. +;; No checking is done. +(define-private (add-pox-addr-to-reward-cycles (pox-addr (tuple (version (buff 1)) (hashbytes (buff 32)))) + (first-reward-cycle uint) + (num-cycles uint) + (amount-ustx uint) + (stacker principal) + (signer (buff 33))) + (let ((cycle-indexes (list u0 u1 u2 u3 u4 u5 u6 u7 u8 u9 u10 u11)) + (results (fold add-pox-addr-to-ith-reward-cycle cycle-indexes + { pox-addr: pox-addr, first-reward-cycle: first-reward-cycle, num-cycles: num-cycles, + reward-set-indexes: (list), amount-ustx: amount-ustx, i: u0, stacker: (some stacker), signer: signer })) + (reward-set-indexes (get reward-set-indexes results))) + ;; For safety, add up the number of times (add-principal-to-ith-reward-cycle) returns 1. + ;; It _should_ be equal to num-cycles. + (asserts! (is-eq num-cycles (get i results)) (err ERR_STACKING_UNREACHABLE)) + (asserts! (is-eq num-cycles (len reward-set-indexes)) (err ERR_STACKING_UNREACHABLE)) + (ok reward-set-indexes))) + +(define-private (add-pox-partial-stacked-to-ith-cycle + (cycle-index uint) + (params { pox-addr: { version: (buff 1), hashbytes: (buff 32) }, + reward-cycle: uint, + num-cycles: uint, + amount-ustx: uint })) + (let ((pox-addr (get pox-addr params)) + (num-cycles (get num-cycles params)) + (reward-cycle (get reward-cycle params)) + (amount-ustx (get amount-ustx params))) + (let ((current-amount + (default-to u0 + (get stacked-amount + (map-get? partial-stacked-by-cycle { sender: tx-sender, pox-addr: pox-addr, reward-cycle: reward-cycle }))))) + (if (>= cycle-index num-cycles) + ;; do not add to cycles >= cycle-index + false + ;; otherwise, add to the partial-stacked-by-cycle + (map-set partial-stacked-by-cycle + { sender: tx-sender, pox-addr: pox-addr, reward-cycle: reward-cycle } + { stacked-amount: (+ amount-ustx current-amount) })) + ;; produce the next params tuple + { pox-addr: pox-addr, + reward-cycle: (+ u1 reward-cycle), + num-cycles: num-cycles, + amount-ustx: amount-ustx }))) + +;; Add a PoX address to a given sequence of partial reward cycle lists. +;; A PoX address can be added to at most 12 consecutive cycles. +;; No checking is done. +(define-private (add-pox-partial-stacked (pox-addr (tuple (version (buff 1)) (hashbytes (buff 32)))) + (first-reward-cycle uint) + (num-cycles uint) + (amount-ustx uint)) + (let ((cycle-indexes (list u0 u1 u2 u3 u4 u5 u6 u7 u8 u9 u10 u11))) + (fold add-pox-partial-stacked-to-ith-cycle cycle-indexes + { pox-addr: pox-addr, reward-cycle: first-reward-cycle, num-cycles: num-cycles, amount-ustx: amount-ustx }) + true)) + +;; What is the minimum number of uSTX to be stacked in the given reward cycle? +;; Used internally by the Stacks node, and visible publicly. +(define-read-only (get-stacking-minimum) + (/ stx-liquid-supply STACKING_THRESHOLD_25)) + +;; Is the address mode valid for a PoX address? +(define-read-only (check-pox-addr-version (version (buff 1))) + (<= (buff-to-uint-be version) MAX_ADDRESS_VERSION)) + +;; Is this buffer the right length for the given PoX address? +(define-read-only (check-pox-addr-hashbytes (version (buff 1)) (hashbytes (buff 32))) + (if (<= (buff-to-uint-be version) MAX_ADDRESS_VERSION_BUFF_20) + (is-eq (len hashbytes) u20) + (if (<= (buff-to-uint-be version) MAX_ADDRESS_VERSION_BUFF_32) + (is-eq (len hashbytes) u32) + false))) + +;; Is the given lock period valid? +(define-read-only (check-pox-lock-period (lock-period uint)) + (and (>= lock-period MIN_POX_REWARD_CYCLES) + (<= lock-period MAX_POX_REWARD_CYCLES))) + +;; Evaluate if a participant can stack an amount of STX for a given period. +;; This method is designed as a read-only method so that it can be used as +;; a set of guard conditions and also as a read-only RPC call that can be +;; performed beforehand. +(define-read-only (can-stack-stx (pox-addr (tuple (version (buff 1)) (hashbytes (buff 32)))) + (amount-ustx uint) + (first-reward-cycle uint) + (num-cycles uint)) + (begin + ;; minimum uSTX must be met + (asserts! (<= (get-stacking-minimum) amount-ustx) + (err ERR_STACKING_THRESHOLD_NOT_MET)) + + (minimal-can-stack-stx pox-addr amount-ustx first-reward-cycle num-cycles))) + +;; Evaluate if a participant can stack an amount of STX for a given period. +;; This method is designed as a read-only method so that it can be used as +;; a set of guard conditions and also as a read-only RPC call that can be +;; performed beforehand. +(define-read-only (minimal-can-stack-stx + (pox-addr (tuple (version (buff 1)) (hashbytes (buff 32)))) + (amount-ustx uint) + (first-reward-cycle uint) + (num-cycles uint)) + (begin + ;; amount must be valid + (asserts! (> amount-ustx u0) + (err ERR_STACKING_INVALID_AMOUNT)) + + ;; lock period must be in acceptable range. + (asserts! (check-pox-lock-period num-cycles) + (err ERR_STACKING_INVALID_LOCK_PERIOD)) + + ;; address version must be valid + (asserts! (check-pox-addr-version (get version pox-addr)) + (err ERR_STACKING_INVALID_POX_ADDRESS)) + + ;; address hashbytes must be valid for the version + (asserts! (check-pox-addr-hashbytes (get version pox-addr) (get hashbytes pox-addr)) + (err ERR_STACKING_INVALID_POX_ADDRESS)) + + (ok true))) + +;; Revoke contract-caller authorization to call stacking methods +(define-public (disallow-contract-caller (caller principal)) + (begin + (asserts! (is-eq tx-sender contract-caller) + (err ERR_STACKING_PERMISSION_DENIED)) + (ok (map-delete allowance-contract-callers { sender: tx-sender, contract-caller: caller })))) + +;; Give a contract-caller authorization to call stacking methods +;; normally, stacking methods may only be invoked by _direct_ transactions +;; (i.e., the tx-sender issues a direct contract-call to the stacking methods) +;; by issuing an allowance, the tx-sender may call through the allowed contract +(define-public (allow-contract-caller (caller principal) (until-burn-ht (optional uint))) + (begin + (asserts! (is-eq tx-sender contract-caller) + (err ERR_STACKING_PERMISSION_DENIED)) + (ok (map-set allowance-contract-callers + { sender: tx-sender, contract-caller: caller } + { until-burn-ht: until-burn-ht })))) + +;; Lock up some uSTX for stacking! Note that the given amount here is in micro-STX (uSTX). +;; The STX will be locked for the given number of reward cycles (lock-period). +;; This is the self-service interface. tx-sender will be the Stacker. +;; +;; * The given stacker cannot currently be stacking. +;; * You will need the minimum uSTX threshold. This will be determined by (get-stacking-minimum) +;; at the time this method is called. +;; * You may need to increase the amount of uSTX locked up later, since the minimum uSTX threshold +;; may increase between reward cycles. +;; * You need to provide a signer key to be used in the signer DKG process. +;; * The Stacker will receive rewards in the reward cycle following `start-burn-ht`. +;; Importantly, `start-burn-ht` may not be further into the future than the next reward cycle, +;; and in most cases should be set to the current burn block height. +;; +;; To ensure that the Stacker is authorized to use the provided `signer-key`, the stacker +;; must provide either a signature have an authorization already saved. Refer to +;; `verify-signer-key-sig` for more information. +;; +;; The tokens will unlock and be returned to the Stacker (tx-sender) automatically. +(define-public (stack-stx (amount-ustx uint) + (pox-addr (tuple (version (buff 1)) (hashbytes (buff 32)))) + (start-burn-ht uint) + (lock-period uint) + (signer-sig (optional (buff 65))) + (signer-key (buff 33)) + (max-amount uint) + (auth-id uint)) + ;; this stacker's first reward cycle is the _next_ reward cycle + (let ((first-reward-cycle (+ u1 (current-pox-reward-cycle))) + (specified-reward-cycle (+ u1 (burn-height-to-reward-cycle start-burn-ht)))) + ;; the start-burn-ht must result in the next reward cycle, do not allow stackers + ;; to "post-date" their `stack-stx` transaction + (asserts! (is-eq first-reward-cycle specified-reward-cycle) + (err ERR_INVALID_START_BURN_HEIGHT)) + + ;; must be called directly by the tx-sender or by an allowed contract-caller + (asserts! (check-caller-allowed) + (err ERR_STACKING_PERMISSION_DENIED)) + + ;; tx-sender principal must not be stacking + (asserts! (is-none (get-stacker-info tx-sender)) + (err ERR_STACKING_ALREADY_STACKED)) + + ;; tx-sender must not be delegating + (asserts! (is-none (get-check-delegation tx-sender)) + (err ERR_STACKING_ALREADY_DELEGATED)) + + ;; the Stacker must have sufficient unlocked funds + (asserts! (>= (stx-get-balance tx-sender) amount-ustx) + (err ERR_STACKING_INSUFFICIENT_FUNDS)) + + ;; Validate ownership of the given signer key + (try! (consume-signer-key-authorization pox-addr (- first-reward-cycle u1) "stack-stx" lock-period signer-sig signer-key amount-ustx max-amount auth-id)) + + ;; ensure that stacking can be performed + (try! (can-stack-stx pox-addr amount-ustx first-reward-cycle lock-period)) + + ;; register the PoX address with the amount stacked + (let ((reward-set-indexes (try! (add-pox-addr-to-reward-cycles pox-addr first-reward-cycle lock-period amount-ustx tx-sender signer-key)))) + ;; add stacker record + (map-set stacking-state + { stacker: tx-sender } + { pox-addr: pox-addr, + reward-set-indexes: reward-set-indexes, + first-reward-cycle: first-reward-cycle, + lock-period: lock-period, + delegated-to: none }) + + ;; return the lock-up information, so the node can actually carry out the lock. + (ok { stacker: tx-sender, lock-amount: amount-ustx, signer-key: signer-key, unlock-burn-height: (reward-cycle-to-burn-height (+ first-reward-cycle lock-period)) })))) + +;; Revokes the delegation to the current stacking pool. +;; New in pox-4: Fails if the delegation was already revoked. +;; Returns the last delegation state. +(define-public (revoke-delegate-stx) + (let ((last-delegation-state (get-check-delegation tx-sender))) + ;; must be called directly by the tx-sender or by an allowed contract-caller + (asserts! (check-caller-allowed) + (err ERR_STACKING_PERMISSION_DENIED)) + (asserts! (is-some last-delegation-state) (err ERR_DELEGATION_ALREADY_REVOKED)) + (asserts! (map-delete delegation-state { stacker: tx-sender }) (err ERR_DELEGATION_ALREADY_REVOKED)) + (ok last-delegation-state))) + +;; Delegate to `delegate-to` the ability to stack from a given address. +;; This method _does not_ lock the funds, rather, it allows the delegate +;; to issue the stacking lock. +;; The caller specifies: +;; * amount-ustx: the total amount of ustx the delegate may be allowed to lock +;; * until-burn-ht: an optional burn height at which this delegation expires +;; * pox-addr: an optional address to which any rewards *must* be sent +(define-public (delegate-stx (amount-ustx uint) + (delegate-to principal) + (until-burn-ht (optional uint)) + (pox-addr (optional { version: (buff 1), hashbytes: (buff 32) }))) + + (begin + ;; must be called directly by the tx-sender or by an allowed contract-caller + (asserts! (check-caller-allowed) + (err ERR_STACKING_PERMISSION_DENIED)) + + ;; delegate-stx no longer requires the delegator to not currently + ;; be stacking. + ;; delegate-stack-* functions assert that + ;; 1. users can't swim in two pools at the same time. + ;; 2. users can't switch pools without cool down cycle. + ;; Other pool admins can't increase or extend. + ;; 3. users can't join a pool while already directly stacking. + + ;; pox-addr, if given, must be valid + (match pox-addr + address + (asserts! (check-pox-addr-version (get version address)) + (err ERR_STACKING_INVALID_POX_ADDRESS)) + true) + + (match pox-addr + pox-tuple + (asserts! (check-pox-addr-hashbytes (get version pox-tuple) (get hashbytes pox-tuple)) + (err ERR_STACKING_INVALID_POX_ADDRESS)) + true) + + ;; tx-sender must not be delegating + (asserts! (is-none (get-check-delegation tx-sender)) + (err ERR_STACKING_ALREADY_DELEGATED)) + + ;; add delegation record + (map-set delegation-state + { stacker: tx-sender } + { amount-ustx: amount-ustx, + delegated-to: delegate-to, + until-burn-ht: until-burn-ht, + pox-addr: pox-addr }) + + (ok true))) + +;; Generate a message hash for validating a signer key. +;; The message hash follows SIP018 for signing structured data. The structured data +;; is the tuple `{ pox-addr: { version, hashbytes }, reward-cycle, auth-id, max-amount }`. +;; The domain is `{ name: "pox-4-signer", version: "1.0.0", chain-id: chain-id }`. +(define-read-only (get-signer-key-message-hash (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (reward-cycle uint) + (topic (string-ascii 14)) + (period uint) + (max-amount uint) + (auth-id uint)) + (sha256 (concat + SIP018_MSG_PREFIX + (concat + (sha256 (unwrap-panic (to-consensus-buff? { name: "pox-4-signer", version: "1.0.0", chain-id: chain-id }))) + (sha256 (unwrap-panic + (to-consensus-buff? { + pox-addr: pox-addr, + reward-cycle: reward-cycle, + topic: topic, + period: period, + auth-id: auth-id, + max-amount: max-amount, + }))))))) + +;; Verify a signature from the signing key for this specific stacker. +;; See `get-signer-key-message-hash` for details on the message hash. +;; +;; Note that `reward-cycle` corresponds to the _current_ reward cycle, +;; when used with `stack-stx` and `stack-extend`. Both the reward cycle and +;; the lock period are inflexible, which means that the stacker must confirm their transaction +;; during the exact reward cycle and with the exact period that the signature or authorization was +;; generated for. +;; +;; The `amount` field is checked to ensure it is not larger than `max-amount`, which is +;; a field in the authorization. `auth-id` is a random uint to prevent authorization +;; replays. +;; +;; This function does not verify the payload of the authorization. The caller of +;; this function must ensure that the payload (reward cycle, period, topic, and pox-addr) +;; are valid according to the caller function's requirements. +;; +;; When `signer-sig` is present, the public key is recovered from the signature +;; and compared to `signer-key`. If `signer-sig` is `none`, the function verifies that an authorization was previously +;; added for this key. +;; +;; This function checks to ensure that the authorization hasn't been used yet, but it +;; does _not_ store the authorization as used. The function `consume-signer-key-authorization` +;; handles that, and this read-only function is exposed for client-side verification. +(define-read-only (verify-signer-key-sig (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (reward-cycle uint) + (topic (string-ascii 14)) + (period uint) + (signer-sig-opt (optional (buff 65))) + (signer-key (buff 33)) + (amount uint) + (max-amount uint) + (auth-id uint)) + (begin + ;; Validate that amount is less than or equal to `max-amount` + (asserts! (>= max-amount amount) (err ERR_SIGNER_AUTH_AMOUNT_TOO_HIGH)) + (asserts! (is-none (map-get? used-signer-key-authorizations { signer-key: signer-key, reward-cycle: reward-cycle, topic: topic, period: period, pox-addr: pox-addr, auth-id: auth-id, max-amount: max-amount })) + (err ERR_SIGNER_AUTH_USED)) + (match signer-sig-opt + ;; `signer-sig` is present, verify the signature + signer-sig (ok (asserts! + (is-eq + (unwrap! (secp256k1-recover? + (get-signer-key-message-hash pox-addr reward-cycle topic period max-amount auth-id) + signer-sig) (err ERR_INVALID_SIGNATURE_RECOVER)) + signer-key) + (err ERR_INVALID_SIGNATURE_PUBKEY))) + ;; `signer-sig` is not present, verify that an authorization was previously added for this key + (ok (asserts! (default-to false (map-get? signer-key-authorizations + { signer-key: signer-key, reward-cycle: reward-cycle, period: period, topic: topic, pox-addr: pox-addr, auth-id: auth-id, max-amount: max-amount })) + (err ERR_NOT_ALLOWED))) + )) + ) + +;; This function does two things: +;; +;; - Verify that a signer key is authorized to be used +;; - Updates the `used-signer-key-authorizations` map to prevent reuse +;; +;; This "wrapper" method around `verify-signer-key-sig` allows that function to remain +;; read-only, so that it can be used by clients as a sanity check before submitting a transaction. +(define-private (consume-signer-key-authorization (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (reward-cycle uint) + (topic (string-ascii 14)) + (period uint) + (signer-sig-opt (optional (buff 65))) + (signer-key (buff 33)) + (amount uint) + (max-amount uint) + (auth-id uint)) + (begin + ;; verify the authorization + (try! (verify-signer-key-sig pox-addr reward-cycle topic period signer-sig-opt signer-key amount max-amount auth-id)) + ;; update the `used-signer-key-authorizations` map + (asserts! (map-insert used-signer-key-authorizations + { signer-key: signer-key, reward-cycle: reward-cycle, topic: topic, period: period, pox-addr: pox-addr, auth-id: auth-id, max-amount: max-amount } true) + (err ERR_SIGNER_AUTH_USED)) + (ok true))) + +;; Commit partially stacked STX and allocate a new PoX reward address slot. +;; This allows a stacker/delegate to lock fewer STX than the minimal threshold in multiple transactions, +;; so long as: 1. The pox-addr is the same. +;; 2. This "commit" transaction is called _before_ the PoX anchor block. +;; This ensures that each entry in the reward set returned to the stacks-node is greater than the threshold, +;; but does not require it be all locked up within a single transaction +;; +;; Returns (ok uint) on success, where the given uint is the reward address's index in the list of reward +;; addresses allocated in this reward cycle. This index can then be passed to `stack-aggregation-increase` +;; to later increment the STX this PoX address represents, in amounts less than the stacking minimum. +;; +;; *New in Stacks 2.1.* +(define-private (inner-stack-aggregation-commit (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (reward-cycle uint) + (signer-sig (optional (buff 65))) + (signer-key (buff 33)) + (max-amount uint) + (auth-id uint)) + (let ((partial-stacked + ;; fetch the partial commitments + (unwrap! (map-get? partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle }) + (err ERR_STACKING_NO_SUCH_PRINCIPAL)))) + ;; must be called directly by the tx-sender or by an allowed contract-caller + (asserts! (check-caller-allowed) + (err ERR_STACKING_PERMISSION_DENIED)) + (let ((amount-ustx (get stacked-amount partial-stacked))) + (try! (consume-signer-key-authorization pox-addr reward-cycle "agg-commit" u1 signer-sig signer-key amount-ustx max-amount auth-id)) + (try! (can-stack-stx pox-addr amount-ustx reward-cycle u1)) + ;; Add the pox addr to the reward cycle, and extract the index of the PoX address + ;; so the delegator can later use it to call stack-aggregation-increase. + (let ((add-pox-addr-info + (add-pox-addr-to-ith-reward-cycle + u0 + { pox-addr: pox-addr, + first-reward-cycle: reward-cycle, + num-cycles: u1, + reward-set-indexes: (list), + stacker: none, + signer: signer-key, + amount-ustx: amount-ustx, + i: u0 })) + (pox-addr-index (unwrap-panic + (element-at (get reward-set-indexes add-pox-addr-info) u0)))) + + ;; don't update the stacking-state map, + ;; because it _already has_ this stacker's state + ;; don't lock the STX, because the STX is already locked + ;; + ;; clear the partial-stacked state, and log it + (map-delete partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle }) + (map-set logged-partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle } partial-stacked) + (ok pox-addr-index))))) + +;; Legacy interface for stack-aggregation-commit. +;; Wraps inner-stack-aggregation-commit. See its docstring for details. +;; Returns (ok true) on success +;; Returns (err ...) on failure. +(define-public (stack-aggregation-commit (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (reward-cycle uint) + (signer-sig (optional (buff 65))) + (signer-key (buff 33)) + (max-amount uint) + (auth-id uint)) + (match (inner-stack-aggregation-commit pox-addr reward-cycle signer-sig signer-key max-amount auth-id) + pox-addr-index (ok true) + commit-err (err commit-err))) + +;; Public interface to `inner-stack-aggregation-commit`. See its documentation for details. +;; *New in Stacks 2.1.* +(define-public (stack-aggregation-commit-indexed (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (reward-cycle uint) + (signer-sig (optional (buff 65))) + (signer-key (buff 33)) + (max-amount uint) + (auth-id uint)) + (inner-stack-aggregation-commit pox-addr reward-cycle signer-sig signer-key max-amount auth-id)) + +;; Commit partially stacked STX to a PoX address which has already received some STX (more than the Stacking min). +;; This allows a delegator to lock up marginally more STX from new delegates, even if they collectively do not +;; exceed the Stacking minimum, so long as the target PoX address already represents at least as many STX as the +;; Stacking minimum. +;; +;; The `reward-cycle-index` is emitted as a contract event from `stack-aggregation-commit` when the initial STX are +;; locked up by this delegator. It must be passed here to add more STX behind this PoX address. If the delegator +;; called `stack-aggregation-commit` multiple times for the same PoX address, then any such `reward-cycle-index` will +;; work here. +;; +;; *New in Stacks 2.1* +;; +(define-public (stack-aggregation-increase (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (reward-cycle uint) + (reward-cycle-index uint) + (signer-sig (optional (buff 65))) + (signer-key (buff 33)) + (max-amount uint) + (auth-id uint)) + (let ((partial-stacked + ;; fetch the partial commitments + (unwrap! (map-get? partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle }) + (err ERR_STACKING_NO_SUCH_PRINCIPAL)))) + + ;; must be called directly by the tx-sender or by an allowed contract-caller + (asserts! (check-caller-allowed) + (err ERR_STACKING_PERMISSION_DENIED)) + + ;; reward-cycle must be in the future + (asserts! (> reward-cycle (current-pox-reward-cycle)) + (err ERR_STACKING_INVALID_LOCK_PERIOD)) + + (let ((partial-amount-ustx (get stacked-amount partial-stacked)) + ;; reward-cycle and reward-cycle-index must point to an existing record in reward-cycle-pox-address-list + (existing-entry (unwrap! (map-get? reward-cycle-pox-address-list { reward-cycle: reward-cycle, index: reward-cycle-index }) + (err ERR_DELEGATION_NO_REWARD_SLOT))) + ;; reward-cycle must point to an existing record in reward-cycle-total-stacked + ;; infallible; getting existing-entry succeeded so this must succeed + (existing-cycle (unwrap-panic (map-get? reward-cycle-total-stacked { reward-cycle: reward-cycle }))) + (increased-entry-total (+ (get total-ustx existing-entry) partial-amount-ustx)) + (increased-cycle-total (+ (get total-ustx existing-cycle) partial-amount-ustx)) + (existing-signer-key (get signer existing-entry))) + + ;; must be stackable + (try! (minimal-can-stack-stx pox-addr increased-entry-total reward-cycle u1)) + + ;; new total must exceed the stacking minimum + (asserts! (<= (get-stacking-minimum) increased-entry-total) + (err ERR_STACKING_THRESHOLD_NOT_MET)) + + ;; there must *not* be a stacker entry (since this is a delegator) + (asserts! (is-none (get stacker existing-entry)) + (err ERR_DELEGATION_WRONG_REWARD_SLOT)) + + ;; the given PoX address must match the one on record + (asserts! (is-eq pox-addr (get pox-addr existing-entry)) + (err ERR_DELEGATION_WRONG_REWARD_SLOT)) + + ;; Validate that amount is less than or equal to `max-amount` + (asserts! (>= max-amount increased-entry-total) (err ERR_SIGNER_AUTH_AMOUNT_TOO_HIGH)) + + ;; Validate that signer-key matches the existing signer-key + (asserts! (is-eq existing-signer-key signer-key) (err ERR_INVALID_SIGNER_KEY)) + + ;; Verify signature from delegate that allows this sender for this cycle + ;; 'lock-period' param set to one period, same as aggregation-commit-indexed + (try! (consume-signer-key-authorization pox-addr reward-cycle "agg-increase" u1 signer-sig signer-key increased-entry-total max-amount auth-id)) + + ;; update the pox-address list -- bump the total-ustx + (map-set reward-cycle-pox-address-list + { reward-cycle: reward-cycle, index: reward-cycle-index } + { pox-addr: pox-addr, + total-ustx: increased-entry-total, + stacker: none, + signer: signer-key }) + + ;; update the total ustx in this cycle + (map-set reward-cycle-total-stacked + { reward-cycle: reward-cycle } + { total-ustx: increased-cycle-total }) + + ;; don't update the stacking-state map, + ;; because it _already has_ this stacker's state + ;; don't lock the STX, because the STX is already locked + ;; + ;; clear the partial-stacked state, and log it + (map-delete partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle }) + (map-set logged-partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle } partial-stacked) + (ok true)))) + +;; As a delegate, stack the given principal's STX using partial-stacked-by-cycle +;; Once the delegate has stacked > minimum, the delegate should call stack-aggregation-commit +(define-public (delegate-stack-stx (stacker principal) + (amount-ustx uint) + (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (start-burn-ht uint) + (lock-period uint)) + ;; this stacker's first reward cycle is the _next_ reward cycle + (let ((first-reward-cycle (+ u1 (current-pox-reward-cycle))) + (specified-reward-cycle (+ u1 (burn-height-to-reward-cycle start-burn-ht))) + (unlock-burn-height (reward-cycle-to-burn-height (+ (current-pox-reward-cycle) u1 lock-period)))) + ;; the start-burn-ht must result in the next reward cycle, do not allow stackers + ;; to "post-date" their `stack-stx` transaction + (asserts! (is-eq first-reward-cycle specified-reward-cycle) + (err ERR_INVALID_START_BURN_HEIGHT)) + + ;; must be called directly by the tx-sender or by an allowed contract-caller + (asserts! (check-caller-allowed) + (err ERR_STACKING_PERMISSION_DENIED)) + + ;; stacker must have delegated to the caller + (let ((delegation-info (unwrap! (get-check-delegation stacker) (err ERR_STACKING_PERMISSION_DENIED)))) + ;; must have delegated to tx-sender + (asserts! (is-eq (get delegated-to delegation-info) tx-sender) + (err ERR_STACKING_PERMISSION_DENIED)) + ;; must have delegated enough stx + (asserts! (>= (get amount-ustx delegation-info) amount-ustx) + (err ERR_DELEGATION_TOO_MUCH_LOCKED)) + ;; if pox-addr is set, must be equal to pox-addr + (asserts! (match (get pox-addr delegation-info) + specified-pox-addr (is-eq pox-addr specified-pox-addr) + true) + (err ERR_DELEGATION_POX_ADDR_REQUIRED)) + ;; delegation must not expire before lock period + (asserts! (match (get until-burn-ht delegation-info) + until-burn-ht (>= until-burn-ht + unlock-burn-height) + true) + (err ERR_DELEGATION_EXPIRES_DURING_LOCK)) + ) + + ;; stacker principal must not be stacking + (asserts! (is-none (get-stacker-info stacker)) + (err ERR_STACKING_ALREADY_STACKED)) + + ;; the Stacker must have sufficient unlocked funds + (asserts! (>= (stx-get-balance stacker) amount-ustx) + (err ERR_STACKING_INSUFFICIENT_FUNDS)) + + ;; ensure that stacking can be performed + (try! (minimal-can-stack-stx pox-addr amount-ustx first-reward-cycle lock-period)) + + ;; register the PoX address with the amount stacked via partial stacking + ;; before it can be included in the reward set, this must be committed! + (add-pox-partial-stacked pox-addr first-reward-cycle lock-period amount-ustx) + + ;; add stacker record + (map-set stacking-state + { stacker: stacker } + { pox-addr: pox-addr, + first-reward-cycle: first-reward-cycle, + reward-set-indexes: (list), + lock-period: lock-period, + delegated-to: (some tx-sender) }) + + ;; return the lock-up information, so the node can actually carry out the lock. + (ok { stacker: stacker, + lock-amount: amount-ustx, + unlock-burn-height: unlock-burn-height }))) + + +;; Used for PoX parameters discovery +(define-read-only (get-pox-info) + (ok { + min-amount-ustx: (get-stacking-minimum), + reward-cycle-id: (current-pox-reward-cycle), + prepare-cycle-length: (var-get pox-prepare-cycle-length), + first-burnchain-block-height: (var-get first-burnchain-block-height), + reward-cycle-length: (var-get pox-reward-cycle-length), + total-liquid-supply-ustx: stx-liquid-supply, + }) +) + +;; Update the number of stacked STX in a given reward cycle entry. +;; `reward-cycle-index` is the index into the `reward-cycle-pox-address-list` map for a given reward cycle number. +;; `updates`, if `(some ..)`, encodes which PoX reward cycle entry (if any) gets updated. In particular, it must have +;; `(some stacker)` as the listed stacker, and must be an upcoming reward cycle. +(define-private (increase-reward-cycle-entry + (reward-cycle-index uint) + (updates (optional { first-cycle: uint, reward-cycle: uint, stacker: principal, add-amount: uint, signer-key: (buff 33) }))) + (let ((data (try! updates)) + (first-cycle (get first-cycle data)) + (reward-cycle (get reward-cycle data)) + (passed-signer-key (get signer-key data))) + (if (> first-cycle reward-cycle) + ;; not at first cycle to process yet + (some { first-cycle: first-cycle, reward-cycle: (+ u1 reward-cycle), stacker: (get stacker data), add-amount: (get add-amount data), signer-key: (get signer-key data) }) + (let ((existing-entry (unwrap-panic (map-get? reward-cycle-pox-address-list { reward-cycle: reward-cycle, index: reward-cycle-index }))) + (existing-total (unwrap-panic (map-get? reward-cycle-total-stacked { reward-cycle: reward-cycle }))) + (existing-signer-key (get signer existing-entry)) + (add-amount (get add-amount data)) + (total-ustx (+ (get total-ustx existing-total) add-amount))) + ;; stacker must match + (asserts! (is-eq (get stacker existing-entry) (some (get stacker data))) none) + ;; signer-key must match + (asserts! (is-eq existing-signer-key passed-signer-key) none) + ;; update the pox-address list + (map-set reward-cycle-pox-address-list + { reward-cycle: reward-cycle, index: reward-cycle-index } + { pox-addr: (get pox-addr existing-entry), + ;; This addresses the bug in pox-2 (see SIP-022) + total-ustx: (+ (get total-ustx existing-entry) add-amount), + stacker: (some (get stacker data)), + signer: (get signer existing-entry) }) + ;; update the total + (map-set reward-cycle-total-stacked + { reward-cycle: reward-cycle } + { total-ustx: total-ustx }) + (some { first-cycle: first-cycle, + reward-cycle: (+ u1 reward-cycle), + stacker: (get stacker data), + add-amount: (get add-amount data), + signer-key: passed-signer-key }))))) + +;; Increase the number of STX locked. +;; *New in Stacks 2.1* +;; This method locks up an additional amount of STX from `tx-sender`'s, indicated +;; by `increase-by`. The `tx-sender` must already be Stacking & must not be +;; straddling more than one signer-key for the cycles effected. +;; Refer to `verify-signer-key-sig` for more information on the authorization parameters +;; included here. +(define-public (stack-increase + (increase-by uint) + (signer-sig (optional (buff 65))) + (signer-key (buff 33)) + (max-amount uint) + (auth-id uint)) + (let ((stacker-info (stx-account tx-sender)) + (amount-stacked (get locked stacker-info)) + (amount-unlocked (get unlocked stacker-info)) + (unlock-height (get unlock-height stacker-info)) + (cur-cycle (current-pox-reward-cycle)) + (first-increased-cycle (+ cur-cycle u1)) + (stacker-state (unwrap! (map-get? stacking-state + { stacker: tx-sender }) + (err ERR_STACK_INCREASE_NOT_LOCKED))) + (cur-pox-addr (get pox-addr stacker-state)) + (cur-period (get lock-period stacker-state))) + ;; tx-sender must be currently locked + (asserts! (> amount-stacked u0) + (err ERR_STACK_INCREASE_NOT_LOCKED)) + ;; must be called with positive `increase-by` + (asserts! (>= increase-by u1) + (err ERR_STACKING_INVALID_AMOUNT)) + ;; stacker must have enough stx to lock + (asserts! (>= amount-unlocked increase-by) + (err ERR_STACKING_INSUFFICIENT_FUNDS)) + ;; must be called directly by the tx-sender or by an allowed contract-caller + (asserts! (check-caller-allowed) + (err ERR_STACKING_PERMISSION_DENIED)) + ;; stacker must be directly stacking + (asserts! (> (len (get reward-set-indexes stacker-state)) u0) + (err ERR_STACKING_IS_DELEGATED)) + ;; stacker must not be delegating + (asserts! (is-none (get delegated-to stacker-state)) + (err ERR_STACKING_IS_DELEGATED)) + + ;; Validate that amount is less than or equal to `max-amount` + (asserts! (>= max-amount (+ increase-by amount-stacked)) (err ERR_SIGNER_AUTH_AMOUNT_TOO_HIGH)) + + ;; Verify signature from delegate that allows this sender for this cycle + (try! (consume-signer-key-authorization cur-pox-addr cur-cycle "stack-increase" cur-period signer-sig signer-key increase-by max-amount auth-id)) + + ;; update reward cycle amounts + (asserts! (is-some (fold increase-reward-cycle-entry + (get reward-set-indexes stacker-state) + (some { first-cycle: first-increased-cycle, + reward-cycle: (get first-reward-cycle stacker-state), + stacker: tx-sender, + add-amount: increase-by, + signer-key: signer-key }))) + (err ERR_INVALID_INCREASE)) + ;; NOTE: stacking-state map is unchanged: it does not track amount-stacked in PoX-4 + (ok { stacker: tx-sender, total-locked: (+ amount-stacked increase-by)}))) + +;; Extend an active Stacking lock. +;; *New in Stacks 2.1* +;; This method extends the `tx-sender`'s current lockup for an additional `extend-count` +;; and associates `pox-addr` with the rewards, The `signer-key` will be the key +;; used for signing. The `tx-sender` can thus decide to change the key when extending. +;; +;; Because no additional STX are locked in this function, the `amount` field used +;; to verify the signer key authorization is zero. Refer to `verify-signer-key-sig` for more information. +(define-public (stack-extend (extend-count uint) + (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (signer-sig (optional (buff 65))) + (signer-key (buff 33)) + (max-amount uint) + (auth-id uint)) + (let ((stacker-info (stx-account tx-sender)) + ;; to extend, there must already be an etry in the stacking-state + (stacker-state (unwrap! (get-stacker-info tx-sender) (err ERR_STACK_EXTEND_NOT_LOCKED))) + (amount-ustx (get locked stacker-info)) + (unlock-height (get unlock-height stacker-info)) + (cur-cycle (current-pox-reward-cycle)) + ;; first-extend-cycle will be the cycle in which tx-sender *would have* unlocked + (first-extend-cycle (burn-height-to-reward-cycle unlock-height)) + ;; new first cycle should be max(cur-cycle, stacker-state.first-reward-cycle) + (cur-first-reward-cycle (get first-reward-cycle stacker-state)) + (first-reward-cycle (if (> cur-cycle cur-first-reward-cycle) cur-cycle cur-first-reward-cycle))) + + ;; must be called with positive extend-count + (asserts! (>= extend-count u1) + (err ERR_STACKING_INVALID_LOCK_PERIOD)) + + ;; stacker must be directly stacking + (asserts! (> (len (get reward-set-indexes stacker-state)) u0) + (err ERR_STACKING_IS_DELEGATED)) + + ;; stacker must not be delegating + (asserts! (is-none (get delegated-to stacker-state)) + (err ERR_STACKING_IS_DELEGATED)) + + ;; Verify signature from delegate that allows this sender for this cycle + (try! (consume-signer-key-authorization pox-addr cur-cycle "stack-extend" extend-count signer-sig signer-key u0 max-amount auth-id)) + + (let ((last-extend-cycle (- (+ first-extend-cycle extend-count) u1)) + (lock-period (+ u1 (- last-extend-cycle first-reward-cycle))) + (new-unlock-ht (reward-cycle-to-burn-height (+ u1 last-extend-cycle)))) + + ;; first cycle must be after the current cycle + (asserts! (> first-extend-cycle cur-cycle) (err ERR_STACKING_INVALID_LOCK_PERIOD)) + ;; lock period must be positive + (asserts! (> lock-period u0) (err ERR_STACKING_INVALID_LOCK_PERIOD)) + + ;; must be called directly by the tx-sender or by an allowed contract-caller + (asserts! (check-caller-allowed) + (err ERR_STACKING_PERMISSION_DENIED)) + + ;; tx-sender must be locked + (asserts! (> amount-ustx u0) + (err ERR_STACK_EXTEND_NOT_LOCKED)) + + ;; tx-sender must not be delegating + (asserts! (is-none (get-check-delegation tx-sender)) + (err ERR_STACKING_ALREADY_DELEGATED)) + + ;; standard can-stack-stx checks + (try! (can-stack-stx pox-addr amount-ustx first-extend-cycle lock-period)) + + ;; register the PoX address with the amount stacked + ;; for the new cycles + (let ((extended-reward-set-indexes (try! (add-pox-addr-to-reward-cycles pox-addr first-extend-cycle extend-count amount-ustx tx-sender signer-key))) + (reward-set-indexes + ;; use the active stacker state and extend the existing reward-set-indexes + (let ((cur-cycle-index (- first-reward-cycle (get first-reward-cycle stacker-state))) + (old-indexes (get reward-set-indexes stacker-state)) + ;; build index list by taking the old-indexes starting from cur cycle + ;; and adding the new indexes to it. this way, the index is valid starting from the current cycle + (new-list (concat (default-to (list) (slice? old-indexes cur-cycle-index (len old-indexes))) + extended-reward-set-indexes))) + (unwrap-panic (as-max-len? new-list u12))))) + ;; update stacker record + (map-set stacking-state + { stacker: tx-sender } + { pox-addr: pox-addr, + reward-set-indexes: reward-set-indexes, + first-reward-cycle: first-reward-cycle, + lock-period: lock-period, + delegated-to: none }) + + ;; return lock-up information + (ok { stacker: tx-sender, unlock-burn-height: new-unlock-ht }))))) + +;; As a delegator, increase an active Stacking lock, issuing a "partial commitment" for the +;; increased cycles. +;; *New in Stacks 2.1* +;; This method increases `stacker`'s current lockup and partially commits the additional +;; STX to `pox-addr` +(define-public (delegate-stack-increase + (stacker principal) + (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (increase-by uint)) + (let ((stacker-info (stx-account stacker)) + (existing-lock (get locked stacker-info)) + (available-stx (get unlocked stacker-info)) + (unlock-height (get unlock-height stacker-info))) + + ;; must be called with positive `increase-by` + (asserts! (>= increase-by u1) + (err ERR_STACKING_INVALID_AMOUNT)) + + (let ((unlock-in-cycle (burn-height-to-reward-cycle unlock-height)) + (cur-cycle (current-pox-reward-cycle)) + (first-increase-cycle (+ cur-cycle u1)) + (last-increase-cycle (- unlock-in-cycle u1)) + (cycle-count (try! (if (<= first-increase-cycle last-increase-cycle) + (ok (+ u1 (- last-increase-cycle first-increase-cycle))) + (err ERR_STACKING_INVALID_LOCK_PERIOD)))) + (new-total-locked (+ increase-by existing-lock)) + (stacker-state + (unwrap! (map-get? stacking-state { stacker: stacker }) + (err ERR_STACK_INCREASE_NOT_LOCKED)))) + + ;; must be called directly by the tx-sender or by an allowed contract-caller + (asserts! (check-caller-allowed) + (err ERR_STACKING_PERMISSION_DENIED)) + + ;; stacker must not be directly stacking + (asserts! (is-eq (len (get reward-set-indexes stacker-state)) u0) + (err ERR_STACKING_NOT_DELEGATED)) + + ;; stacker must be delegated to tx-sender + (asserts! (is-eq (unwrap! (get delegated-to stacker-state) + (err ERR_STACKING_NOT_DELEGATED)) + tx-sender) + (err ERR_STACKING_PERMISSION_DENIED)) + + ;; stacker must be currently locked + (asserts! (> existing-lock u0) + (err ERR_STACK_INCREASE_NOT_LOCKED)) + + ;; stacker must have enough stx to lock + (asserts! (>= available-stx increase-by) + (err ERR_STACKING_INSUFFICIENT_FUNDS)) + + ;; stacker must have delegated to the caller + (let ((delegation-info (unwrap! (get-check-delegation stacker) (err ERR_STACKING_PERMISSION_DENIED))) + (delegated-to (get delegated-to delegation-info)) + (delegated-amount (get amount-ustx delegation-info)) + (delegated-pox-addr (get pox-addr delegation-info)) + (delegated-until (get until-burn-ht delegation-info))) + ;; must have delegated to tx-sender + (asserts! (is-eq delegated-to tx-sender) + (err ERR_STACKING_PERMISSION_DENIED)) + ;; must have delegated enough stx + (asserts! (>= delegated-amount new-total-locked) + (err ERR_DELEGATION_TOO_MUCH_LOCKED)) + ;; if pox-addr is set, must be equal to pox-addr + (asserts! (match delegated-pox-addr + specified-pox-addr (is-eq pox-addr specified-pox-addr) + true) + (err ERR_DELEGATION_POX_ADDR_REQUIRED)) + ;; delegation must not expire before lock period + (asserts! (match delegated-until + until-burn-ht + (>= until-burn-ht unlock-height) + true) + (err ERR_DELEGATION_EXPIRES_DURING_LOCK))) + + ;; delegate stacking does minimal-can-stack-stx + (try! (minimal-can-stack-stx pox-addr new-total-locked first-increase-cycle (+ u1 (- last-increase-cycle first-increase-cycle)))) + + ;; register the PoX address with the amount stacked via partial stacking + ;; before it can be included in the reward set, this must be committed! + (add-pox-partial-stacked pox-addr first-increase-cycle cycle-count increase-by) + + ;; stacking-state is unchanged, so no need to update + + ;; return the lock-up information, so the node can actually carry out the lock. + (ok { stacker: stacker, total-locked: new-total-locked})))) + +;; As a delegator, extend an active stacking lock, issuing a "partial commitment" for the +;; extended-to cycles. +;; *New in Stacks 2.1* +;; This method extends `stacker`'s current lockup for an additional `extend-count` +;; and partially commits those new cycles to `pox-addr` +(define-public (delegate-stack-extend + (stacker principal) + (pox-addr { version: (buff 1), hashbytes: (buff 32) }) + (extend-count uint)) + (let ((stacker-info (stx-account stacker)) + ;; to extend, there must already be an entry in the stacking-state + (stacker-state (unwrap! (get-stacker-info stacker) (err ERR_STACK_EXTEND_NOT_LOCKED))) + (amount-ustx (get locked stacker-info)) + (unlock-height (get unlock-height stacker-info)) + ;; first-extend-cycle will be the cycle in which tx-sender *would have* unlocked + (first-extend-cycle (burn-height-to-reward-cycle unlock-height)) + (cur-cycle (current-pox-reward-cycle)) + ;; new first cycle should be max(cur-cycle, stacker-state.first-reward-cycle) + (cur-first-reward-cycle (get first-reward-cycle stacker-state)) + (first-reward-cycle (if (> cur-cycle cur-first-reward-cycle) cur-cycle cur-first-reward-cycle))) + + ;; must be called with positive extend-count + (asserts! (>= extend-count u1) + (err ERR_STACKING_INVALID_LOCK_PERIOD)) + + (let ((last-extend-cycle (- (+ first-extend-cycle extend-count) u1)) + (lock-period (+ u1 (- last-extend-cycle first-reward-cycle))) + (new-unlock-ht (reward-cycle-to-burn-height (+ u1 last-extend-cycle)))) + + ;; first cycle must be after the current cycle + (asserts! (> first-extend-cycle cur-cycle) (err ERR_STACKING_INVALID_LOCK_PERIOD)) + ;; lock period must be positive + (asserts! (> lock-period u0) (err ERR_STACKING_INVALID_LOCK_PERIOD)) + + ;; must be called directly by the tx-sender or by an allowed contract-caller + (asserts! (check-caller-allowed) + (err ERR_STACKING_PERMISSION_DENIED)) + + ;; stacker must not be directly stacking + (asserts! (is-eq (len (get reward-set-indexes stacker-state)) u0) + (err ERR_STACKING_NOT_DELEGATED)) + + ;; stacker must be delegated to tx-sender + (asserts! (is-eq (unwrap! (get delegated-to stacker-state) + (err ERR_STACKING_NOT_DELEGATED)) + tx-sender) + (err ERR_STACKING_PERMISSION_DENIED)) + + ;; check valid lock period + (asserts! (check-pox-lock-period lock-period) + (err ERR_STACKING_INVALID_LOCK_PERIOD)) + + ;; stacker must be currently locked + (asserts! (> amount-ustx u0) + (err ERR_STACK_EXTEND_NOT_LOCKED)) + + ;; stacker must have delegated to the caller + (let ((delegation-info (unwrap! (get-check-delegation stacker) (err ERR_STACKING_PERMISSION_DENIED)))) + ;; must have delegated to tx-sender + (asserts! (is-eq (get delegated-to delegation-info) tx-sender) + (err ERR_STACKING_PERMISSION_DENIED)) + ;; must have delegated enough stx + (asserts! (>= (get amount-ustx delegation-info) amount-ustx) + (err ERR_DELEGATION_TOO_MUCH_LOCKED)) + ;; if pox-addr is set, must be equal to pox-addr + (asserts! (match (get pox-addr delegation-info) + specified-pox-addr (is-eq pox-addr specified-pox-addr) + true) + (err ERR_DELEGATION_POX_ADDR_REQUIRED)) + ;; delegation must not expire before lock period + (asserts! (match (get until-burn-ht delegation-info) + until-burn-ht (>= until-burn-ht + new-unlock-ht) + true) + (err ERR_DELEGATION_EXPIRES_DURING_LOCK)) + ) + + ;; delegate stacking does minimal-can-stack-stx + (try! (minimal-can-stack-stx pox-addr amount-ustx first-extend-cycle lock-period)) + + ;; register the PoX address with the amount stacked via partial stacking + ;; before it can be included in the reward set, this must be committed! + (add-pox-partial-stacked pox-addr first-extend-cycle extend-count amount-ustx) + + (map-set stacking-state + { stacker: stacker } + { pox-addr: pox-addr, + reward-set-indexes: (list), + first-reward-cycle: first-reward-cycle, + lock-period: lock-period, + delegated-to: (some tx-sender) }) + + ;; return the lock-up information, so the node can actually carry out the lock. + (ok { stacker: stacker, + unlock-burn-height: new-unlock-ht })))) + +;; Add an authorization for a signer key. +;; When an authorization is added, the `signer-sig` argument is not required +;; in the functions that use it as an argument. +;; The `allowed` flag can be used to either enable or disable the authorization. +;; Only the Stacks principal associated with `signer-key` can call this function. +;; +;; Refer to the documentation for `verify-signer-key-sig` for more information +;; regarding the parameters used in an authorization. When the authorization is used +;; in `stack-stx` and `stack-extend`, the `reward-cycle` refers to the reward cycle +;; where the transaction is confirmed, **not** the reward cycle where stacking begins. +;; The `period` parameter must match the exact lock period (or extend count) used +;; in the stacking transaction. The `max-amount` parameter specifies the maximum amount +;; of STX that can be locked in an individual stacking transaction. `auth-id` is a +;; random uint to prevent replays. +;; +;; *New in Stacks 3.0* +(define-public (set-signer-key-authorization (pox-addr { version: (buff 1), hashbytes: (buff 32)}) + (period uint) + (reward-cycle uint) + (topic (string-ascii 14)) + (signer-key (buff 33)) + (allowed bool) + (max-amount uint) + (auth-id uint)) + (begin + ;; must be called directly by the tx-sender or by an allowed contract-caller + (asserts! (check-caller-allowed) + (err ERR_NOT_ALLOWED)) + ;; Validate that `tx-sender` has the same pubkey hash as `signer-key` + (asserts! (is-eq + (unwrap! (principal-construct? (if is-in-mainnet STACKS_ADDR_VERSION_MAINNET STACKS_ADDR_VERSION_TESTNET) (hash160 signer-key)) (err ERR_INVALID_SIGNER_KEY)) + tx-sender) (err ERR_NOT_ALLOWED)) + ;; Must be called with positive period + (asserts! (>= period u1) (err ERR_STACKING_INVALID_LOCK_PERIOD)) + ;; Must be current or future reward cycle + (asserts! (>= reward-cycle (current-pox-reward-cycle)) (err ERR_INVALID_REWARD_CYCLE)) + (map-set signer-key-authorizations { pox-addr: pox-addr, period: period, reward-cycle: reward-cycle, topic: topic, signer-key: signer-key, auth-id: auth-id, max-amount: max-amount } allowed) + (ok allowed))) + +;; Get the _current_ PoX stacking delegation information for a stacker. If the information +;; is expired, or if there's never been such a stacker, then returns none. +;; *New in Stacks 2.1* +(define-read-only (get-delegation-info (stacker principal)) + (get-check-delegation stacker) +) + +;; Get the burn height at which a particular contract is allowed to stack for a particular principal. +;; *New in Stacks 2.1* +;; Returns (some (some X)) if X is the burn height at which the allowance terminates +;; Returns (some none) if the caller is allowed indefinitely +;; Returns none if there is no allowance record +(define-read-only (get-allowance-contract-callers (sender principal) (calling-contract principal)) + (map-get? allowance-contract-callers { sender: sender, contract-caller: calling-contract }) +) + +;; How many PoX addresses in this reward cycle? +;; *New in Stacks 2.1* +(define-read-only (get-num-reward-set-pox-addresses (reward-cycle uint)) + (match (map-get? reward-cycle-pox-address-list-len { reward-cycle: reward-cycle }) + num-addrs + (get len num-addrs) + u0 + ) +) + +;; How many uSTX have been locked up for this address so far, before the delegator commits them? +;; *New in Stacks 2.1* +(define-read-only (get-partial-stacked-by-cycle (pox-addr { version: (buff 1), hashbytes: (buff 32) }) (reward-cycle uint) (sender principal)) + (map-get? partial-stacked-by-cycle { pox-addr: pox-addr, reward-cycle: reward-cycle, sender: sender }) +) diff --git a/.cache/requirements/SP000000000000000000002Q6VF78.pox-4.json b/.cache/requirements/SP000000000000000000002Q6VF78.pox-4.json new file mode 100644 index 0000000..846c60a --- /dev/null +++ b/.cache/requirements/SP000000000000000000002Q6VF78.pox-4.json @@ -0,0 +1,4 @@ +{ + "epoch": "Epoch25", + "clarity_version": "Clarity2" +} \ No newline at end of file diff --git a/.cache/requirements/SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3.clar b/.cache/requirements/SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3.clar new file mode 100644 index 0000000..e7b889a --- /dev/null +++ b/.cache/requirements/SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3.clar @@ -0,0 +1,378 @@ +;; @contract pox-4 Self-Service Pool +;; @version 3 +;; Changelog: update to pox-4, introduce commit admin + +;; Self-service non-custodial stacking pool +;; The pool locks for 1 cycle, amount can be increased at each cycle. +;; Users trust the reward admin that they will receive their share of rewards. +;; Reward admin can be a contract as well. +;; +;; +;; User calls delegate-stx once. +;; For next cycles, users can call delegate-stx +;; or ask automation, friends or family to extend stacking using delegate-stack-stx. + +;; Self-service function "delegate-stx" does the following: +;; 1. Revoke delegation if necessary. +;; 2. Delegates STX. +;; 3. For first time user, stacks the caller's stx tokens for 1 cycle. +;; For stackerd user, extends locking and if needed increases amount. +;; The amount is the minimum of the balance and the delegate amount +;; minus some STX as buffer. +;; The STX buffer is left unlocked for users to call revoke-delegate-stx. + +;; Pool operators function "delegate-stack-stx" does +;; step 3. (for stacked users) +;; This function can be called by anyone when less than 1050 blocks are +;; left until the cycle start. This gives the stacker 1 week to unlock +;; the STX if wanted before it can be locked again for friends and family (or enemies). + +;; Commit admins are trusted users who can commit the partically stacked STX +;; at the end of each cycle. +;; The commit transaction contains a signature from the selected signer node. + +;; +;; Data storage +;; + +;; Map of reward cycle to pox reward set index. +;; Reward set index gives access to the total locked stx of the pool. +(define-map pox-addr-indices uint uint) +;; Map of reward cyle to block height of last commit +(define-map last-aggregation uint uint) +;; Map of users to locked amounts with this pool +;; used to handle pool members swimming in two pools +(define-map locked-amounts principal {amount-ustx: uint, unlock-height: uint}) +;; Map of admins that can change the pox-address +(define-map reward-admins principal bool) +(map-set reward-admins tx-sender true) + +(define-data-var active bool false) +(define-data-var pool-pox-address {hashbytes: (buff 32), version: (buff 1)} + {version: 0x, + hashbytes: 0x}) +(define-data-var stx-buffer uint u1000000) ;; 1 STX + +(define-constant pox-info (unwrap-panic (contract-call? 'SP000000000000000000002Q6VF78.pox-4 get-pox-info))) +;; Half cycle lenght is 1050 for mainnet +(define-constant half-cycle-length (/ (get reward-cycle-length pox-info) u2)) + +(define-constant err-unauthorized (err u401)) +(define-constant err-forbidden (err u403)) +(define-constant err-too-early (err u500)) +(define-constant err-decrease-forbidden (err u503)) +(define-constant err-pox-address-deactivated (err u504)) +;; Error code 3 is used by pox-4 contract for already stacking errors +(define-constant err-already-stacking (err u603)) +;; Error code 9 is used by pox-4 contract for permission denied errors +(define-constant err-stacking-permission-denied (err u609)) +;; Allowed contract-callers handling a user's stacking activity. +(define-map allowance-contract-callers + { sender: principal, contract-caller: principal} + { until-burn-ht: (optional uint)}) + + +;; +;; Helper functions for pox-4 calls +;; + +;; Revokes and delegates stx +(define-private (delegate-stx-inner (amount-ustx uint) (delegate-to principal) (until-burn-ht (optional uint))) + (let ((result-revoke + ;; Calls revoke and ignores result + (contract-call? 'SP000000000000000000002Q6VF78.pox-4 revoke-delegate-stx))) + ;; Calls delegate-stx, converts any error to uint + (match (contract-call? 'SP000000000000000000002Q6VF78.pox-4 delegate-stx amount-ustx delegate-to until-burn-ht none) + success (ok success) + error (err (* u1000 (to-uint error)))))) + +;; Tries to lock delegated stx (delegate-stack-stx). +;; If user already stacked then extend and increase +(define-private (lock-delegated-stx (user principal)) + (let ((start-burn-ht (+ burn-block-height u1)) + (pox-address (var-get pool-pox-address)) + (buffer-amount (var-get stx-buffer)) + (user-account (stx-account user)) + (allowed-amount (min (get-delegated-amount user) + (+ (get locked user-account) (get unlocked user-account)))) + ;; Amount to lock must be leq allowed-amount and geq locked amount. + ;; Increase the locked amount if possible, but leave a buffer for revoke tx fees if possible. + ;; Decreasing the locked amount requires a cool down cycle. + (amount-ustx (if (> allowed-amount buffer-amount) + (max (get locked user-account) (- allowed-amount buffer-amount)) + allowed-amount))) + (asserts! (var-get active) err-pox-address-deactivated) + (match (contract-call? 'SP000000000000000000002Q6VF78.pox-4 delegate-stack-stx + user amount-ustx + pox-address start-burn-ht u1) + stacker-details (begin + (map-set locked-amounts user {amount-ustx: amount-ustx, unlock-height: (get unlock-burn-height stacker-details)}) + (ok stacker-details)) + error (if (is-eq error 3) ;; check whether user is already stacked + (delegate-stack-extend-increase user amount-ustx pox-address) + (err (* u1000 (to-uint error))))))) + +(define-private (lock-delegated-stx-fold (user principal) (result (list 30 (response {lock-amount: uint, stacker: principal, unlock-burn-height: uint} uint)))) + (let ((stack-result (lock-delegated-stx user))) + (unwrap-panic (as-max-len? (append result stack-result) u30)))) + +;; Calls pox-4 delegate-stack-extend and delegate-stack-increase. +;; parameter amount-ustx must be lower or equal the stx balance and the delegated amount +(define-private (delegate-stack-extend-increase (user principal) + (amount-ustx uint) + (pox-address {hashbytes: (buff 32), version: (buff 1)})) + (let ((status (stx-account user)) + (locked-amount (get locked status))) + (asserts! (>= amount-ustx locked-amount) err-decrease-forbidden) + (match (maybe-extend-for-next-cycle user pox-address status) + success-extend (let ((unlock-burn-height (get unlock-burn-height success-extend))) + (if (is-eq amount-ustx locked-amount) + ;; do not increase + (begin + ;; update locked-amounts map if necessary + (asserts! (> unlock-burn-height (get unlock-height status)) err-already-stacking) + (map-extend-locked-amount user unlock-burn-height) + (ok {lock-amount: locked-amount, + stacker: user, + unlock-burn-height: unlock-burn-height})) + ;; else increase + (let ((increase-by (- amount-ustx locked-amount))) + (match (contract-call? 'SP000000000000000000002Q6VF78.pox-4 delegate-stack-increase + user pox-address increase-by) + success-increase (begin + (map-extend-increase-locked-amount user increase-by unlock-burn-height) + (ok {lock-amount: (get total-locked success-increase), + stacker: user, + unlock-burn-height: unlock-burn-height})) + error-increase (err (* u1000000000 (to-uint error-increase))))))) + error (err (* u1000000 (to-uint error)))))) + +;; Tries to extend the user's locking to the next cycle +;; if not yet locked until the end of the next cycle. +(define-private (maybe-extend-for-next-cycle + (user principal) + (pox-address {hashbytes: (buff 32), version: (buff 1)}) + (status {locked: uint, unlocked: uint, unlock-height: uint}) + ) + (let ((current-cycle (contract-call? 'SP000000000000000000002Q6VF78.pox-4 current-pox-reward-cycle)) + (unlock-height (get unlock-height status))) + (if (not-locked-for-cycle unlock-height (+ u1 current-cycle)) + (contract-call? 'SP000000000000000000002Q6VF78.pox-4 delegate-stack-extend + user pox-address u1) ;; one cycle only + (ok {stacker: user, unlock-burn-height: unlock-height})))) + +(define-private (map-extend-locked-amount (user principal) (unlock-height uint)) + (match (map-get? locked-amounts user) + locked-amount (map-set locked-amounts user (merge locked-amount {unlock-height: unlock-height})) + true)) + +(define-private (map-extend-increase-locked-amount (user principal) (increase-by uint) (unlock-height uint)) + (match (map-get? locked-amounts user) + locked-amount (map-set locked-amounts user {amount-ustx: (+ (get amount-ustx locked-amount) increase-by), unlock-height: unlock-height}) + true)) + +;; +;; Public functions +;; + +;; @desc User calls this function to delegate and lock their tokens to the self-service pool. +;; Users can revoke delegation and stx tokens will unlock at the end of the locking period. +;; +;; @param amount-ustx; amount to delegate. Can be higher than current stx balance. +(define-public (delegate-stx (amount-ustx uint)) + (let ((user tx-sender) + (current-cycle (current-pox-reward-cycle))) + ;; Must be called directly by the tx-sender or by an allowed contract-caller + (asserts! (check-caller-allowed) err-stacking-permission-denied) + ;; Do 1. and 2. + (try! (delegate-stx-inner amount-ustx (as-contract tx-sender) none)) + ;; Do 3. + (as-contract (lock-delegated-stx user)))) + +;; Stacks the delegated amount for the given user for the next cycle. +;; This function can be called by automation, friends or family for user that have delegated once. +;; This function can be called only after the current cycle is half through +(define-public (delegate-stack-stx (user principal)) + (let ((current-cycle (current-pox-reward-cycle))) + (asserts! (can-lock-now current-cycle) err-too-early) + ;; Do 3. + (as-contract (lock-delegated-stx user)))) + +;; Stacks the delegated amount for the given users for the next cycle. +;; This function can be called by automation, friends or family for users that have delegated once. +;; This function can be called only after the current cycle is half through +(define-public (delegate-stack-stx-many (users (list 30 principal))) + (let ((current-cycle (current-pox-reward-cycle)) + (start-burn-ht (+ burn-block-height u1))) + (asserts! (can-lock-now current-cycle) err-too-early) + ;; Do 3. for users + (ok (as-contract (fold lock-delegated-stx-fold users (list)))))) + +;; Tries to calls stack aggregation commit. If the minimum is met, +;; subsequent calls increase the total amount using +;; the index of the first successful call. +;; This index gives access to the internal map of the pox-4 contract +;; that handles the reward addresses. +(define-public (maybe-stack-aggregation-commit (current-cycle uint) + (signer-sig (optional (buff 65))) (signer-key (buff 33)) + (max-amount uint) (auth-id uint)) + (let ((reward-cycle (+ u1 current-cycle))) + (match (map-get? pox-addr-indices reward-cycle) + ;; Total stacked already reached minimum. + ;; Call stack-aggregate-increase. + ;; It might fail because called in the same cycle twice. + index (match (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-4 stack-aggregation-increase (var-get pool-pox-address) reward-cycle index signer-sig signer-key max-amount auth-id)) + success (begin (map-set last-aggregation reward-cycle block-height) (ok true)) + error (begin (print {err-increase-ignored: error}) (ok false))) + ;; Total stacked is still below minimum. + ;; Just try to commit, it might fail because minimum not yet met + (match (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-4 stack-aggregation-commit-indexed (var-get pool-pox-address) reward-cycle signer-sig signer-key max-amount auth-id)) + index (begin + (map-set pox-addr-indices reward-cycle index) + (map-set last-aggregation reward-cycle block-height) + (ok true)) + error (begin (print {err-commit-ignored: error}) (ok false)))))) ;; ignore errors + +;; +;; Admin functions +;; + +(define-public (set-active (is-active bool)) + (begin + (asserts! (default-to false (map-get? reward-admins contract-caller)) err-unauthorized) + (ok (var-set active is-active)))) + +(define-public (set-pool-pox-address (pox-addr {hashbytes: (buff 32), version: (buff 1)})) + (begin + (asserts! (default-to false (map-get? reward-admins contract-caller)) err-unauthorized) + (ok (var-set pool-pox-address pox-addr)))) + +(define-public (set-pool-pox-address-active (pox-addr {hashbytes: (buff 32), version: (buff 1)})) + (begin + (asserts! (default-to false (map-get? reward-admins contract-caller)) err-unauthorized) + (var-set pool-pox-address pox-addr) + (ok (var-set active true)))) + +(define-public (set-stx-buffer (amount-ustx uint)) + (begin + (asserts! (default-to false (map-get? reward-admins contract-caller)) err-unauthorized) + (ok (var-set stx-buffer amount-ustx)))) + +(define-public (set-reward-admin (new-admin principal) (enable bool)) + (begin + (asserts! (default-to false (map-get? reward-admins contract-caller)) err-unauthorized) + (asserts! (not (is-eq contract-caller new-admin)) err-forbidden) + (ok (map-set reward-admins new-admin enable)))) + +;; +;; Read-only functions +;; + +;; What's the reward cycle number of the burnchain block height? +;; Will runtime-abort if height is less than the first burnchain block (this is intentional) +(define-read-only (burn-height-to-reward-cycle (height uint)) + (/ (- height (get first-burnchain-block-height pox-info)) (get reward-cycle-length pox-info))) + +;; What's the block height at the start of a given reward cycle? +(define-read-only (reward-cycle-to-burn-height (cycle uint)) + (+ (get first-burnchain-block-height pox-info) (* cycle (get reward-cycle-length pox-info)))) + +;; What's the current PoX reward cycle? +(define-read-only (current-pox-reward-cycle) + (burn-height-to-reward-cycle burn-block-height)) + +;; Total of locked stacked by cycle. +;; Function get-reward-set-pox-address contains the information but +;; is deleted when stx unlock. +;; Therefore, we look at the value at the end of that cycle, more +;; precisely at the last stack-aggregation-* call for the next cycle (that happens +;; during the request cycle). +(define-read-only (get-reward-set (reward-cycle uint)) + (match (print (map-get? last-aggregation (+ reward-cycle u1))) + stacks-height (get-reward-set-at-block reward-cycle stacks-height) + none)) + +(define-read-only (get-reward-set-at-block (reward-cycle uint) (stacks-height uint)) + (at-block (unwrap! (get-block-info? id-header-hash stacks-height) none) + (get-reward-set-from-pox reward-cycle))) + +(define-read-only (get-reward-set-from-pox (reward-cycle uint)) + (match (map-get? pox-addr-indices reward-cycle) + index (contract-call? 'SP000000000000000000002Q6VF78.pox-4 get-reward-set-pox-address reward-cycle index) + none)) + +;; Returns currently delegated amount for a given user +(define-read-only (get-delegated-amount (user principal)) + (default-to u0 (get amount-ustx (contract-call? 'SP000000000000000000002Q6VF78.pox-4 get-delegation-info user)))) + +(define-read-only (get-pox-addr-index (cycle uint)) + (map-get? pox-addr-indices cycle)) + +(define-read-only (not-locked-for-cycle (unlock-burn-height uint) (cycle uint)) + (<= unlock-burn-height (reward-cycle-to-burn-height cycle))) + +(define-read-only (get-last-aggregation (cycle uint)) + (map-get? last-aggregation cycle)) + +(define-read-only (is-admin-enabled (admin principal)) + (map-get? reward-admins admin)) + +(define-read-only (get-pool-pox-address) + (var-get pool-pox-address)) + +(define-read-only (can-lock-now (cycle uint)) + (> burn-block-height (+ (reward-cycle-to-burn-height cycle) half-cycle-length))) + +;; Returns minimum +(define-private (min (amount-1 uint) (amount-2 uint)) + (if (< amount-1 amount-2) + amount-1 + amount-2)) + +;; Returns maximum +(define-private (max (amount-1 uint) (amount-2 uint)) + (if (> amount-1 amount-2) + amount-1 + amount-2)) + +;; +;; Functions about allowance of delegation/stacking contract calls +;; + +;; Give a contract-caller authorization to call stacking methods +;; normally, stacking methods may only be invoked by _direct_ transactions +;; (i.e., the tx-sender issues a direct contract-call to the stacking methods) +;; by issuing an allowance, the tx-sender may call through the allowed contract +(define-public (allow-contract-caller (caller principal) (until-burn-ht (optional uint))) + (begin + (asserts! (is-eq tx-sender contract-caller) err-stacking-permission-denied) + (ok (map-set allowance-contract-callers + { sender: tx-sender, contract-caller: caller} + { until-burn-ht: until-burn-ht})))) + +;; Revokes contract-caller authorization to call stacking methods +(define-public (disallow-contract-caller (caller principal)) + (begin + (asserts! (is-eq tx-sender contract-caller) err-stacking-permission-denied) + (ok (map-delete allowance-contract-callers { sender: tx-sender, contract-caller: caller})))) + +;; Verifies that the contract caller has allowance to handle the tx-sender's stacking +(define-read-only (check-caller-allowed) + (or (is-eq tx-sender contract-caller) + (let ((caller-allowed + ;; if not in the caller map, return false + (unwrap! (map-get? allowance-contract-callers + { sender: tx-sender, contract-caller: contract-caller}) + false)) + (expires-at + ;; if until-burn-ht not set, then return true (because no expiry) + (unwrap! (get until-burn-ht caller-allowed) true))) + ;; is the caller allowance still valid + (< burn-block-height expires-at)))) + +;; Returns the burn height at which a particular contract is allowed to stack for a particular principal. +;; The result is (some (some X)) if X is the burn height at which the allowance terminates. +;; The result is (some none) if the caller is allowed indefinitely. +;; The result is none if there is no allowance record. +(define-read-only (get-allowance-contract-callers (sender principal) (calling-contract principal)) + (map-get? allowance-contract-callers { sender: sender, contract-caller: calling-contract})) diff --git a/.cache/requirements/SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3.json b/.cache/requirements/SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3.json new file mode 100644 index 0000000..846c60a --- /dev/null +++ b/.cache/requirements/SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3.json @@ -0,0 +1,4 @@ +{ + "epoch": "Epoch25", + "clarity_version": "Clarity2" +} \ No newline at end of file diff --git a/Clarinet.toml b/Clarinet.toml index 07959d7..779a6a6 100644 --- a/Clarinet.toml +++ b/Clarinet.toml @@ -10,6 +10,12 @@ path = ".requirements" # MAINNET REQUIREMENTS +[[project.requirements]] +contract_id = "SP000000000000000000002Q6VF78.pox-4" + +[[project.requirements]] +contract_id = "SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3" + [[project.requirements]] contract_id = "SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard" diff --git a/contracts/extensions/ccd002-treasury-v3.clar b/contracts/extensions/ccd002-treasury-v3.clar index a5802bd..5f80450 100644 --- a/contracts/extensions/ccd002-treasury-v3.clar +++ b/contracts/extensions/ccd002-treasury-v3.clar @@ -157,9 +157,7 @@ delegate: to, sender: tx-sender }) - ;; MAINNET: 'SP000000000000000000002Q6VF78.pox-4 - ;; TESTNET: 'ST000000000000000000002AMW42H.pox-4 - (match (as-contract (contract-call? 'ST000000000000000000002AMW42H.pox-4 delegate-stx maxAmount to none none)) + (match (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-4 delegate-stx maxAmount to none none)) success (ok success) err (err (to-uint err)) ) @@ -174,9 +172,7 @@ caller: contract-caller, sender: tx-sender }) - ;; MAINNET: 'SP000000000000000000002Q6VF78.pox-4 - ;; TESTNET: 'ST000000000000000000002AMW42H.pox-4 - (match (as-contract (contract-call? 'ST000000000000000000002AMW42H.pox-4 revoke-delegate-stx)) + (match (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-4 revoke-delegate-stx)) success (begin (print success) (ok true)) err (err (to-uint err)) ) diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index 557ed33..484052c 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -79,14 +79,12 @@ )) ;; allow MIA in treasuries - ;; MAINNET: 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 (try! (contract-call? .ccd002-treasury-mia-mining-v3 set-allowed 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 true)) ;; transfer funds to new treasury extensions (try! (contract-call? .ccd002-treasury-mia-mining-v2 withdraw-stx miaBalance .ccd002-treasury-mia-mining-v3)) ;; delegate stack the STX in the mining and rewards treasuries (up to 50M STX each) - ;; MAINNET: SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3 (try! (contract-call? .ccd002-treasury-mia-mining-v3 delegate-stx u50000000000000 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3)) (try! (contract-call? .ccd002-treasury-mia-rewards-v3 delegate-stx u50000000000000 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3)) From 212c65a82e6b4839073b321c53850d198ea38fff Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Wed, 7 Aug 2024 15:57:13 -0700 Subject: [PATCH 21/27] fix: update simulation until it passes --- simulations/stxer-ccip019.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/simulations/stxer-ccip019.ts b/simulations/stxer-ccip019.ts index 904b9b5..a7c0db9 100644 --- a/simulations/stxer-ccip019.ts +++ b/simulations/stxer-ccip019.ts @@ -107,25 +107,26 @@ async function main() { executeTxs.push(await directExecute("SP3YYGCGX1B62CYAH4QX7PQE63YXG7RDTXD8BQHJQ", 17)); executeTxs.push(await directExecute("SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X", 813)); + /* commenting this out as it's a transfer from the pool operator to the treasury + // this is not required for the simulation to work? address = "SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X"; - nonce = 813; const transferStxTx = await makeUnsignedSTXTokenTransfer({ amount: 10000000, recipient: "SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-rewards-v3", - nonce: nonce++, + nonce: 814, ...common_params, }); [, addressHash] = c32addressDecode(address); transferStxTx.auth.spendingCondition.signer = addressHash; + */ address = "SPN4Y5QPGQA8882ZXW90ADC2DHYXMSTN8VAR8C3X"; - nonce = nonce++; const lockStxTx = await makeUnsignedContractCall({ contractAddress: "SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP", contractName: "pox4-fast-pool-v3", functionName: "delegate-stack-stx-many", functionArgs: [listCV([principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-mining-v3"), principalCV("SP8A9HZ3PKST0S42VM9523Z9NV42SZ026V4K39WH.ccd002-treasury-mia-rewards-v3")])], - nonce: nonce++, + nonce: 814, ...common_params, }); [, addressHash] = c32addressDecode(address); @@ -134,7 +135,7 @@ async function main() { const req = tupleCV({ block_height: uintCV(block_height), block_hash: bufferCV(Buffer.from(block_hash, "hex")), - steps: listCV([deployTx1, deployTx2, deployTx3, ...voteTxs, ...executeTxs, transferStxTx, lockStxTx].map((t) => runTx(t))), + steps: listCV([deployTx1, deployTx2, deployTx3, ...voteTxs, ...executeTxs, /*transferStxTx,*/ lockStxTx].map((t) => runTx(t))), }); const body = serializeCV(req); const rs: any = await fetch(SIMULATION_API_ENDPOINT, { From 2840622dd4e371adc4831251657e45daa0a09636 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Wed, 7 Aug 2024 15:57:33 -0700 Subject: [PATCH 22/27] fix: print voter info after succesful vote --- contracts/proposals/ccip019-pox-4-stacking.clar | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index 484052c..0cb3a13 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -121,6 +121,11 @@ ) ;; update vote stats for each city (update-city-votes MIA_ID miaVoteAmount vote true) + ;; print voter info + (print { + notification: "vote-on-ccip-019", + payload: (get-voter-info voterId) + }) (ok true) ) ;; if the voterRecord does not exist @@ -137,6 +142,11 @@ }) ERR_SAVING_VOTE) ;; update vote stats for each city (update-city-votes MIA_ID miaVoteAmount vote false) + ;; print voter info + (print { + notification: "vote-on-ccip-019", + payload: (get-voter-info voterId) + }) (ok true) ) ) From b24364f6f03971de5bf5fbaea1adae6e0fa8c794 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Thu, 8 Aug 2024 14:21:24 -0700 Subject: [PATCH 23/27] fix: update link and hash for ccip-019 --- contracts/proposals/ccip019-pox-4-stacking.clar | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index 0cb3a13..79fb808 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -18,8 +18,8 @@ (define-constant SELF (as-contract tx-sender)) (define-constant CCIP_019 { name: "PoX-4 Stacking", - link: "https://github.com/citycoins/protocol/pull/67", - hash: "", + link: "https://github.com/citycoins/governance/blob/feat/add-ccip-019/ccips/ccip-019/ccip-019-stack-mia-mining-treasury.md", + hash: "214fb59a81d3d63c8e1e32100cda3bc5ca91b413", }) (define-constant VOTE_SCALE_FACTOR (pow u10 u16)) ;; 16 decimal places From 84ac617fcb1d55180b2199e1f7c5542540af14c4 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Thu, 8 Aug 2024 16:36:54 -0700 Subject: [PATCH 24/27] fix: update name to match ccip, default cityId --- contracts/proposals/ccip019-pox-4-stacking.clar | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index 79fb808..0c65220 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -17,14 +17,14 @@ (define-constant SELF (as-contract tx-sender)) (define-constant CCIP_019 { - name: "PoX-4 Stacking", + name: "Stack MIA Mining Treasury with PoX 4", link: "https://github.com/citycoins/governance/blob/feat/add-ccip-019/ccips/ccip-019/ccip-019-stack-mia-mining-treasury.md", hash: "214fb59a81d3d63c8e1e32100cda3bc5ca91b413", }) (define-constant VOTE_SCALE_FACTOR (pow u10 u16)) ;; 16 decimal places -(define-constant MIA_ID (default-to u2 (contract-call? .ccd004-city-registry get-city-id "mia"))) +(define-constant MIA_ID (default-to u1 (contract-call? .ccd004-city-registry get-city-id "mia"))) ;; DATA VARS From a2db1187d1a1d0e67f0f7dda2963824e7cd0da15 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Thu, 8 Aug 2024 16:44:19 -0700 Subject: [PATCH 25/27] fix: use MIA_ID constant instead of fetching again during execution --- contracts/proposals/ccip019-pox-4-stacking.clar | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index 0c65220..e8099b0 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -61,7 +61,6 @@ (define-public (execute (sender principal)) (let ( - (miaId (unwrap! (contract-call? .ccd004-city-registry get-city-id "mia") ERR_PANIC)) (miaBalance (contract-call? .ccd002-treasury-mia-mining-v2 get-balance-stx)) ) @@ -89,8 +88,8 @@ (try! (contract-call? .ccd002-treasury-mia-rewards-v3 delegate-stx u50000000000000 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox4-fast-pool-v3)) ;; add treasuries to ccd005-city-data - (try! (contract-call? .ccd005-city-data add-treasury miaId .ccd002-treasury-mia-mining-v3 "mining-v3")) - (try! (contract-call? .ccd005-city-data add-treasury miaId .ccd002-treasury-mia-rewards-v3 "rewards-v3")) + (try! (contract-call? .ccd005-city-data add-treasury MIA_ID .ccd002-treasury-mia-mining-v3 "mining-v3")) + (try! (contract-call? .ccd005-city-data add-treasury MIA_ID .ccd002-treasury-mia-rewards-v3 "rewards-v3")) (ok true) ) From 417b7f59705103b3948bbb30a04c1c7a95702fe4 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Thu, 8 Aug 2024 16:45:09 -0700 Subject: [PATCH 26/27] fix: remove allow call for MIA in treasury Only STX will be stored as part of this proposal. --- contracts/proposals/ccip019-pox-4-stacking.clar | 3 --- 1 file changed, 3 deletions(-) diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index e8099b0..d96ffd8 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -77,9 +77,6 @@ ) )) - ;; allow MIA in treasuries - (try! (contract-call? .ccd002-treasury-mia-mining-v3 set-allowed 'SP1H1733V5MZ3SZ9XRW9FKYGEZT0JDGEB8Y634C7R.miamicoin-token-v2 true)) - ;; transfer funds to new treasury extensions (try! (contract-call? .ccd002-treasury-mia-mining-v2 withdraw-stx miaBalance .ccd002-treasury-mia-mining-v3)) From c85f110943d4709e7bd689263a59ce9f29204655 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Thu, 8 Aug 2024 16:47:11 -0700 Subject: [PATCH 27/27] chore: consistent spacing --- contracts/proposals/ccip019-pox-4-stacking.clar | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/proposals/ccip019-pox-4-stacking.clar b/contracts/proposals/ccip019-pox-4-stacking.clar index d96ffd8..d2180a9 100644 --- a/contracts/proposals/ccip019-pox-4-stacking.clar +++ b/contracts/proposals/ccip019-pox-4-stacking.clar @@ -13,6 +13,7 @@ (define-constant ERR_PROPOSAL_NOT_ACTIVE (err u19005)) (define-constant ERR_PROPOSAL_STILL_ACTIVE (err u19006)) (define-constant ERR_VOTE_FAILED (err u19007)) + ;; CONSTANTS (define-constant SELF (as-contract tx-sender))