From 721eae7e35bce01df411e7e48761c804f6cc97a5 Mon Sep 17 00:00:00 2001 From: fiftyeightandeight Date: Mon, 22 Jan 2024 22:17:12 +0800 Subject: [PATCH] stacking-vault --- Clarinet.toml | 7 +++ contracts/lqstx-mint-registry.clar | 48 ++++++++++++-------- contracts/stacking-vault.clar | 68 ++++++++++++++++++++++++++++ contracts/traits/trait-stacking.clar | 8 ++++ 4 files changed, 111 insertions(+), 20 deletions(-) create mode 100644 contracts/stacking-vault.clar create mode 100644 contracts/traits/trait-stacking.clar diff --git a/Clarinet.toml b/Clarinet.toml index 691cfad..99fc4dc 100644 --- a/Clarinet.toml +++ b/Clarinet.toml @@ -15,6 +15,9 @@ path = "contracts_modules/alex_v1/traits/trait-sip-010.clar" [contracts.trait-ownable] path = "contracts_modules/alex_v1/traits/trait-ownable.clar" +[contracts.trait-stacking] +path = "contracts/traits/trait-stacking.clar" + [contracts.token-wstx] path = "contracts_modules/alex_v1/wrapped-token/token-wstx.clar" @@ -34,6 +37,10 @@ epoch = 2.4 path = "contracts/token-wlqstx.clar" epoch = 2.4 +[contracts.stacking-vault] +path = "contracts/stacking-vault.clar" +epoch = 2.4 + # [repl.analysis] # passes = ["check_checker"] diff --git a/contracts/lqstx-mint-registry.clar b/contracts/lqstx-mint-registry.clar index 793232d..acb2b41 100644 --- a/contracts/lqstx-mint-registry.clar +++ b/contracts/lqstx-mint-registry.clar @@ -3,9 +3,11 @@ ;; (use-trait sip010-trait .trait-sip-010.sip-010-trait) +(use-trait stacking-trait .trait-stacking.stacking-trait) (define-constant ERR-NOT-AUTHORIZED (err u1000)) (define-constant ERR-UNKNOWN-REQUEST-ID (err u1008)) +(define-constant ERR-UNKNOWN-VAULT (err u1009)) (define-constant PENDING u0) (define-constant FINALIZED u1) @@ -14,6 +16,8 @@ (define-data-var contract-owner principal tx-sender) (define-map approved-operators principal bool) +(define-map approved-stacking-vault principal bool) + (define-data-var rewards-paid-upto uint u0) (define-data-var mint-request-nonce uint u0) @@ -49,6 +53,9 @@ (define-read-only (is-approved-operator) (ok (asserts! (or (get-approved-operator-or-default tx-sender) (is-ok (check-is-owner))) ERR-NOT-AUTHORIZED))) +(define-read-only (get-approved-stacking-vault-or-default (vault principal)) + (default-to false (map-get? approved-stacking-vault vault))) + ;; governance calls (define-public (set-contract-owner (owner principal)) @@ -61,6 +68,12 @@ (try! (check-is-owner)) (ok (map-set approved-operators operator approved)))) +;; @dev other pools can be added by adding stacking vault that implements stacking-trait +(define-public (set-approved-stacking-vault (vault-trait ) (approved bool)) + (begin + (try! (check-is-owner)) + (ok (map-set approved-stacking-vault (contract-of vault-trait) approved)))) + ;; privileged calls (define-public (set-rewards-paid-upto (cycle uint)) @@ -93,36 +106,31 @@ (try! (is-approved-operator)) (as-contract (contract-call? token-trait transfer-fixed amount tx-sender recipient none)))) -;; @dev other pools can be added by upgrading registry -(define-public (delegate-stx (amount uint)) +(define-public (delegate-stx (amount uint) (vault-trait )) (begin (try! (is-approved-operator)) - (as-contract (contract-call? 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox-fast-pool-v2 delegate-stx (/ amount u100))))) + (asserts! (get-approved-stacking-vault-or-default (contract-of vault-trait)) ERR-UNKNOWN-VAULT) + (as-contract (try! (contract-call? .token-wstx transfer-fixed amount tx-sender (contract-of vault-trait) none))) + (as-contract (contract-call? vault-trait delegate-stx (/ amount u100))))) -;; @dev other pools can be added by upgrading registry -(define-public (delegate-stack-stx) - (contract-call? 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox-fast-pool-v2 delegate-stack-stx (as-contract tx-sender))) +(define-public (delegate-stack-stx (vault-trait )) + (begin + (asserts! (get-approved-stacking-vault-or-default (contract-of vault-trait)) ERR-UNKNOWN-VAULT) + (contract-call? vault-trait delegate-stack-stx))) -(define-public (disallow-contract-caller (caller principal)) +(define-public (revoke-delegate-stx (vault-trait )) (begin (try! (is-approved-operator)) - (to-response-uint (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-3 disallow-contract-caller caller))))) + (asserts! (get-approved-stacking-vault-or-default (contract-of vault-trait)) ERR-UNKNOWN-VAULT) + (as-contract (contract-call? vault-trait revoke-delegate-stx)))) -(define-public (allow-contract-caller (caller principal) (until-burn-ht (optional uint))) +(define-public (transfer-from-vault (amount uint) (vault-trait )) (begin (try! (is-approved-operator)) - (to-response-uint (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-3 allow-contract-caller caller until-burn-ht))))) - -(define-public (revoke-delegate-stx) - (begin - (try! (is-approved-operator)) - (to-response-uint (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-3 revoke-delegate-stx))))) + (asserts! (get-approved-stacking-vault-or-default (contract-of vault-trait)) ERR-UNKNOWN-VAULT) + (as-contract (contract-call? vault-trait transfer-fixed amount tx-sender)))) ;; private calls (define-private (check-is-owner) - (ok (asserts! (is-eq tx-sender (var-get contract-owner)) ERR-NOT-AUTHORIZED))) - - -(define-read-only (to-response-uint (resp (response bool int))) - (match resp success (ok success) err (err (to-uint err)))) \ No newline at end of file + (ok (asserts! (is-eq tx-sender (var-get contract-owner)) ERR-NOT-AUTHORIZED))) \ No newline at end of file diff --git a/contracts/stacking-vault.clar b/contracts/stacking-vault.clar new file mode 100644 index 0000000..1178667 --- /dev/null +++ b/contracts/stacking-vault.clar @@ -0,0 +1,68 @@ +;; FAST Pool vault + +(use-trait sip010-trait .trait-sip-010.sip-010-trait) + +(define-constant ERR-NOT-AUTHORIZED (err u1000)) + +(define-data-var contract-owner principal tx-sender) +(define-map approved-operators principal bool) + +;; read-only calls + +(define-read-only (get-approved-operator-or-default (operator principal)) + (default-to false (map-get? approved-operators operator))) + +(define-read-only (is-approved-operator) + (ok (asserts! (or (get-approved-operator-or-default tx-sender) (is-ok (check-is-owner))) ERR-NOT-AUTHORIZED))) + +;; governance calls + +(define-public (set-contract-owner (owner principal)) + (begin + (try! (check-is-owner)) + (ok (var-set contract-owner owner)))) + +(define-public (set-approved-operator (operator principal) (approved bool)) + (begin + (try! (check-is-owner)) + (ok (map-set approved-operators operator approved)))) + +;; previliged calls + +(define-public (transfer-fixed (amount uint) (recipient principal)) + (begin + (try! (is-approved-operator)) + (as-contract (contract-call? .token-wstx transfer-fixed amount tx-sender recipient none)))) + +;; @dev other pools can be added by upgrading registry +(define-public (delegate-stx (amount uint)) + (begin + (try! (is-approved-operator)) + (as-contract (contract-call? 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox-fast-pool-v2 delegate-stx (/ amount u100))))) + +;; @dev other pools can be added by upgrading registry +(define-public (delegate-stack-stx) + (contract-call? 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox-fast-pool-v2 delegate-stack-stx (as-contract tx-sender))) + +(define-public (disallow-contract-caller (caller principal)) + (begin + (try! (is-approved-operator)) + (to-response-uint (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-3 disallow-contract-caller caller))))) + +(define-public (allow-contract-caller (caller principal) (until-burn-ht (optional uint))) + (begin + (try! (is-approved-operator)) + (to-response-uint (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-3 allow-contract-caller caller until-burn-ht))))) + +(define-public (revoke-delegate-stx) + (begin + (try! (is-approved-operator)) + (to-response-uint (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-3 revoke-delegate-stx))))) + +;; private calls + +(define-private (check-is-owner) + (ok (asserts! (is-eq tx-sender (var-get contract-owner)) ERR-NOT-AUTHORIZED))) + +(define-private (to-response-uint (resp (response bool int))) + (match resp success (ok success) err (err (to-uint err)))) \ No newline at end of file diff --git a/contracts/traits/trait-stacking.clar b/contracts/traits/trait-stacking.clar new file mode 100644 index 0000000..027bab1 --- /dev/null +++ b/contracts/traits/trait-stacking.clar @@ -0,0 +1,8 @@ +(define-trait stacking-trait + ( + (delegate-stx (uint) (response bool uint)) + (delegate-stack-stx () (response { stacker: principal, lock-amount: uint, unlock-burn-height: uint } uint)) + (revoke-delegate-stx () (response bool uint)) + (transfer-fixed (uint principal) (response bool uint)) + ) +)