From 002f6109cb7907ebf8991cf5de74863636e2ff91 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Tue, 14 Jan 2025 06:05:27 -0700 Subject: [PATCH 1/3] fix: default payments to treasury not bank account --- contracts/dao/extensions/aibtc-payments-invoices.clar | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/dao/extensions/aibtc-payments-invoices.clar b/contracts/dao/extensions/aibtc-payments-invoices.clar index e9a66779..034e2e79 100644 --- a/contracts/dao/extensions/aibtc-payments-invoices.clar +++ b/contracts/dao/extensions/aibtc-payments-invoices.clar @@ -42,7 +42,7 @@ (define-data-var totalRevenue uint u0) ;; dao can update payment address -(define-data-var paymentAddress principal .aibtc-bank-account) +(define-data-var paymentAddress principal .aibtc-treasury) ;; data maps ;; From b194f44f51262ca6a313369991fab3864c09eb21 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Tue, 14 Jan 2025 06:27:54 -0700 Subject: [PATCH 2/3] fix: hardcode token contract instead of init This simplifies the code we have to test per dao, and we can insert this contract reference using the templates when generating, so the init was an extra step that wasn't needed. Every dao is focused around one token, so we can directly reference it and let other values change, like which treasury is compared for voting. --- Clarinet.toml | 10 --- .../extensions/aibtc-action-proposals.clar | 68 ++++--------------- ...btc-action-proposals-set-voting-token.clar | 5 -- ...aibtc-core-proposals-set-voting-token.clar | 5 -- .../dao/traits/aibtcdev-dao-traits-v1.clar | 13 +--- 5 files changed, 15 insertions(+), 86 deletions(-) delete mode 100644 contracts/dao/proposals/aibtc-action-proposals-set-voting-token.clar delete mode 100644 contracts/dao/proposals/aibtc-core-proposals-set-voting-token.clar diff --git a/Clarinet.toml b/Clarinet.toml index 7de28da9..089074c5 100644 --- a/Clarinet.toml +++ b/Clarinet.toml @@ -282,21 +282,11 @@ path = 'contracts/dao/proposals/aibtc-action-proposals-set-protocol-treasury.cla clarity_version = 2 epoch = 3.0 -[contracts.aibtc-action-proposals-set-voting-token] -path = 'contracts/dao/proposals/aibtc-action-proposals-set-voting-token.clar' -clarity_version = 2 -epoch = 3.0 - [contracts.aibtc-core-proposals-set-protocol-treasury] path = 'contracts/dao/proposals/aibtc-core-proposals-set-protocol-treasury.clar' clarity_version = 2 epoch = 3.0 -[contracts.aibtc-core-proposals-set-voting-token] -path = 'contracts/dao/proposals/aibtc-core-proposals-set-voting-token.clar' -clarity_version = 2 -epoch = 3.0 - # dao traits [contracts.aibtcdev-dao-traits-v1] diff --git a/contracts/dao/extensions/aibtc-action-proposals.clar b/contracts/dao/extensions/aibtc-action-proposals.clar index 009304a4..895adc04 100644 --- a/contracts/dao/extensions/aibtc-action-proposals.clar +++ b/contracts/dao/extensions/aibtc-action-proposals.clar @@ -30,11 +30,8 @@ (define-constant ERR_TREASURY_CANNOT_BE_SAME (err u1202)) ;; error messages - voting token -(define-constant ERR_TOKEN_ALREADY_INITIALIZED (err u1300)) -(define-constant ERR_TOKEN_MISMATCH (err u1301)) -(define-constant ERR_INSUFFICIENT_BALANCE (err u1302)) -(define-constant ERR_TOKEN_CANNOT_BE_SELF (err u1303)) -(define-constant ERR_TOKEN_CANNOT_BE_SAME (err u1304)) +(define-constant ERR_INSUFFICIENT_BALANCE (err u1300)) +(define-constant ERR_FETCHING_TOKEN_DATA (err u1301)) ;; error messages - proposals (define-constant ERR_PROPOSAL_NOT_FOUND (err u1400)) @@ -56,7 +53,6 @@ ;; data vars ;; (define-data-var protocolTreasury principal SELF) ;; the treasury contract for protocol funds -(define-data-var votingToken principal SELF) ;; the FT contract used for voting (define-data-var proposalCount uint u0) ;; total number of proposals ;; data maps @@ -113,40 +109,16 @@ ) ) -(define-public (set-voting-token (token )) +(define-public (propose-action (action ) (parameters (buff 2048))) (let ( - (tokenContract (contract-of token)) - ) - (try! (is-dao-or-extension)) - ;; cannot set token to self - (asserts! (not (is-eq tokenContract SELF)) ERR_TOKEN_CANNOT_BE_SELF) - ;; cannot set token to same value - (asserts! (not (is-eq tokenContract (var-get votingToken))) ERR_TOKEN_CANNOT_BE_SAME) - ;; cannot set token if already set once - (asserts! (is-eq (var-get votingToken) SELF) ERR_TOKEN_ALREADY_INITIALIZED) - (print { - notification: "set-voting-token", - payload: { - token: tokenContract - } - }) - (ok (var-set votingToken tokenContract)) - ) -) - -(define-public (propose-action (action ) (parameters (buff 2048)) (token )) - (let - ( - (tokenContract (contract-of token)) (newId (+ (var-get proposalCount) u1)) + (voterBalance (unwrap! (contract-call? .aibtc-token get-balance tx-sender) ERR_FETCHING_TOKEN_DATA)) ) ;; required variables must be set (asserts! (is-initialized) ERR_NOT_INITIALIZED) - ;; token matches set voting token - (asserts! (is-eq tokenContract (var-get votingToken)) ERR_TOKEN_MISMATCH) ;; caller has the required balance - (asserts! (> (try! (contract-call? token get-balance tx-sender)) u0) ERR_INSUFFICIENT_BALANCE) + (asserts! (> voterBalance u0) ERR_INSUFFICIENT_BALANCE) ;; print proposal creation event (print { notification: "propose-action", @@ -178,23 +150,19 @@ ) ) -(define-public (vote-on-proposal (proposalId uint) (token ) (vote bool)) +(define-public (vote-on-proposal (proposalId uint) (vote bool)) (let ( (proposalRecord (unwrap! (map-get? Proposals proposalId) ERR_PROPOSAL_NOT_FOUND)) (proposalBlock (get startBlock proposalRecord)) (proposalBlockHash (unwrap! (get-block-hash proposalBlock) ERR_RETRIEVING_START_BLOCK_HASH)) - (tokenContract (contract-of token)) - (senderBalanceResponse (at-block proposalBlockHash (contract-call? .aibtc-token get-balance tx-sender))) - (senderBalance (unwrap-panic senderBalanceResponse)) + (senderBalance (unwrap! (at-block proposalBlockHash (contract-call? .aibtc-token get-balance tx-sender)) ERR_FETCHING_TOKEN_DATA)) ) ;; required variables must be set (asserts! (is-initialized) ERR_NOT_INITIALIZED) - ;; token matches set voting token - (asserts! (is-eq tokenContract (var-get votingToken)) ERR_TOKEN_MISMATCH) ;; caller has the required balance (asserts! (> senderBalance u0) ERR_INSUFFICIENT_BALANCE) - ;; proposal is still active + ;; proposal not still active (asserts! (>= burn-block-height (get startBlock proposalRecord)) ERR_VOTE_TOO_SOON) (asserts! (< burn-block-height (get endBlock proposalRecord)) ERR_VOTE_TOO_LATE) ;; proposal not already concluded @@ -222,14 +190,13 @@ ) ) -(define-public (conclude-proposal (proposalId uint) (action ) (treasury ) (token )) +(define-public (conclude-proposal (proposalId uint) (action ) (treasury )) (let ( (proposalRecord (unwrap! (map-get? Proposals proposalId) ERR_PROPOSAL_NOT_FOUND)) - (tokenContract (contract-of token)) - (tokenTotalSupply (try! (contract-call? token get-total-supply))) + (tokenTotalSupply (unwrap! (contract-call? .aibtc-token get-total-supply) ERR_FETCHING_TOKEN_DATA)) (treasuryContract (contract-of treasury)) - (treasuryBalance (try! (contract-call? token get-balance treasuryContract))) + (treasuryBalance (unwrap! (contract-call? .aibtc-token get-balance treasuryContract) ERR_FETCHING_TOKEN_DATA)) (votePassed (> (get votesFor proposalRecord) (* tokenTotalSupply (- u100 treasuryBalance) VOTING_QUORUM))) ) ;; required variables must be set @@ -277,13 +244,6 @@ ) ) -(define-read-only (get-voting-token) - (if (is-eq (var-get votingToken) SELF) - none - (some (var-get votingToken)) - ) -) - (define-read-only (get-proposal (proposalId uint)) (map-get? Proposals proposalId) ) @@ -293,11 +253,7 @@ ) (define-read-only (is-initialized) - ;; check if the required variables are set - (not (or - (is-eq (var-get votingToken) SELF) - (is-eq (var-get protocolTreasury) SELF) - )) + (not (is-eq (var-get protocolTreasury) SELF)) ) (define-read-only (get-voting-period) diff --git a/contracts/dao/proposals/aibtc-action-proposals-set-voting-token.clar b/contracts/dao/proposals/aibtc-action-proposals-set-voting-token.clar deleted file mode 100644 index 9b15d611..00000000 --- a/contracts/dao/proposals/aibtc-action-proposals-set-voting-token.clar +++ /dev/null @@ -1,5 +0,0 @@ -(impl-trait .aibtcdev-dao-traits-v1.proposal) - -(define-public (execute (sender principal)) - (contract-call? .aibtc-action-proposals set-voting-token .aibtc-token) -) diff --git a/contracts/dao/proposals/aibtc-core-proposals-set-voting-token.clar b/contracts/dao/proposals/aibtc-core-proposals-set-voting-token.clar deleted file mode 100644 index 9b15d611..00000000 --- a/contracts/dao/proposals/aibtc-core-proposals-set-voting-token.clar +++ /dev/null @@ -1,5 +0,0 @@ -(impl-trait .aibtcdev-dao-traits-v1.proposal) - -(define-public (execute (sender principal)) - (contract-call? .aibtc-action-proposals set-voting-token .aibtc-token) -) diff --git a/contracts/dao/traits/aibtcdev-dao-traits-v1.clar b/contracts/dao/traits/aibtcdev-dao-traits-v1.clar index 055c2f46..6c6c7d86 100644 --- a/contracts/dao/traits/aibtcdev-dao-traits-v1.clar +++ b/contracts/dao/traits/aibtcdev-dao-traits-v1.clar @@ -30,29 +30,22 @@ ;; @param treasury the treasury contract principal ;; @returns (response bool uint) (set-protocol-treasury () (response bool uint)) - ;; set the voting token contract - ;; @param token the token contract principal - ;; @returns (response bool uint) - (set-voting-token () (response bool uint)) ;; propose a new action ;; @param action the action contract ;; @param parameters encoded action parameters - ;; @param token the voting token contract ;; @returns (response bool uint) - (propose-action ( (buff 2048) ) (response bool uint)) + (propose-action ( (buff 2048)) (response bool uint)) ;; vote on an existing proposal ;; @param proposal the proposal id - ;; @param token the voting token contract ;; @param vote true for yes, false for no ;; @returns (response bool uint) - (vote-on-proposal (uint bool) (response bool uint)) + (vote-on-proposal (uint bool) (response bool uint)) ;; conclude a proposal after voting period ;; @param proposal the proposal id ;; @param action the action contract ;; @param treasury the treasury contract - ;; @param token the voting token contract ;; @returns (response bool uint) - (conclude-proposal (uint ) (response bool uint)) + (conclude-proposal (uint ) (response bool uint)) )) (define-trait bank-account ( From 0726495d1a267cd003a858b0a221990b20e23721 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Tue, 14 Jan 2025 06:35:35 -0700 Subject: [PATCH 3/3] fix: update bootstrap to cover full init --- .../aibtc-base-bootstrap-initialization.clar | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/contracts/dao/proposals/aibtc-base-bootstrap-initialization.clar b/contracts/dao/proposals/aibtc-base-bootstrap-initialization.clar index 36c021dd..d8f372b0 100644 --- a/contracts/dao/proposals/aibtc-base-bootstrap-initialization.clar +++ b/contracts/dao/proposals/aibtc-base-bootstrap-initialization.clar @@ -4,7 +4,7 @@ (define-public (execute (sender principal)) (begin - ;; set initial extensions + ;; set initial extensions list (try! (contract-call? .aibtcdev-base-dao set-extensions (list {extension: .aibtc-action-proposals, enabled: true} @@ -12,14 +12,18 @@ {extension: .aibtc-core-proposals, enabled: true} {extension: .aibtc-onchain-messaging, enabled: true} {extension: .aibtc-payments-invoices, enabled: true} + {extension: .aibtc-token-owner, enabled: true} {extension: .aibtc-treasury, enabled: true} - {extension: .set-account-holder, enabled: true} - {extension: .send-message, enabled: true} ) )) - + ;; initialize action proposals (try! (contract-call? .aibtc-action-proposals set-protocol-treasury .aibtc-treasury)) - (try! (contract-call? .aibtc-action-proposals set-voting-token .aibtc-token)) + ;; initialize core proposals + (try! (contract-call? .aibtc-core-proposals set-protocol-treasury .aibtc-treasury)) + ;; send DAO manifest as onchain message + (try! (contract-call? .aibtc-onchain-messaging send DAO_MANIFEST true)) + ;; allow assets in treasury + (try! (contract-call? .aibtc-treasury allow-asset .aibtc-token true)) ;; print manifest (print DAO_MANIFEST) (ok true)