lqstx-mint

This commit is contained in:
fiftyeightandeight
2024-01-30 19:38:11 +08:00
parent 3e7bfbe2fd
commit 2dfde1681c
7 changed files with 26 additions and 255 deletions

View File

@@ -1,46 +0,0 @@
(define-constant err-unauthorised (err u1000))
(define-constant err-invalid-request-id (err u1001))
(define-data-var withdrawal-requests-nonce uint u0)
(define-map withdrawal-requests uint {recipient: principal, amount: uint})
(define-public (is-dao-or-extension)
(ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised))
)
(define-public (deposit-stx (amount uint))
(begin
(try! (stx-transfer? amount tx-sender .vault))
(contract-call? .token-lqstx dao-mint amount tx-sender)
)
)
(define-public (request-withdraw-stx (amount uint))
(let ((vault-balance (stx-get-balance .vault)))
(try! (contract-call? .token-lqstx dao-burn amount tx-sender))
(if (>= vault-balance amount)
(begin
(try! (contract-call? .vault dynamic-transfer .stx-transfer-provider (unwrap-panic (to-consensus-buff? { ustx: amount, recipient: tx-sender }))))
(ok none)
)
;;else
(let ((nonce (var-get withdrawal-requests-nonce)))
(map-set withdrawal-requests nonce {recipient: tx-sender, amount: amount})
(var-set withdrawal-requests-nonce (+ nonce u1))
(ok (some nonce))
)
)
)
)
(define-public (settle-withdraw-stx (request-id uint))
(let ((request (unwrap! (map-get? withdrawal-requests request-id) err-invalid-request-id)))
(map-delete withdrawal-requests request-id)
(contract-call? .vault dynamic-transfer .stx-transfer-provider (unwrap-panic (to-consensus-buff? { ustx: (get amount request), recipient: (get recipient request) })))
)
)
(define-public (settle-withdraw-stx-many (request-ids (list 200 uint)))
(ok (map settle-withdraw-stx request-ids))
)

View File

@@ -2,21 +2,18 @@
;; lqstx-mint-endpoint
;;
(impl-trait .extension-trait.extension-trait)
(use-trait sip-010-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait)
(define-constant err-unauthorised (err u1000))
(define-constant ERR-PAUSED (err u1001))
(define-constant ERR-INVALID-AMOUNT (err u1002))
(define-constant ERR-TOKEN-MISMATCH (err u1003))
(define-constant ERR-SENDER-MISMATCH (err u1004))
(define-constant ERR-REQUEST-NOT-PENDING (err u1005))
(define-constant ERR-REQUEST-PENDING (err u1006))
(define-constant err-paused (err u1001))
(define-constant err-request-pending (err u1006))
(define-data-var paused bool true)
(define-public (is-dao-or-extension)
(ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised))
)
(ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised)))
;; read-only calls
@@ -24,7 +21,7 @@
(var-get paused))
(define-read-only (is-paused-or-fail)
(ok (asserts! (not (is-paused)) ERR-PAUSED)))
(ok (asserts! (not (is-paused)) err-paused)))
(define-read-only (get-pending)
(contract-call? .lqstx-mint-registry get-pending))
@@ -47,33 +44,31 @@
(define-read-only (validate-mint-request (request-id uint))
(let (
(request-details (try! (contract-call? .lqstx-mint-registry get-mint-request-or-fail request-id))))
(ok (asserts! (>= (get-rewards-paid-upto) (get requested-at request-details)) ERR-REQUEST-PENDING))))
(ok (asserts! (>= (get-rewards-paid-upto) (get requested-at request-details)) err-request-pending))))
;; @dev it favours smaller amounts as we do not allow partial burn
(define-read-only (validate-burn-request (request-id uint))
(let (
(request-details (try! (contract-call? .lqstx-mint-registry get-burn-request-or-fail request-id)))
(vaulted-amount (contract-call? .token-wlqstx convert-to-tokens (get amount request-details)))
(balance (stx-account .lqstx-mint-registry)))
(asserts! (>= (get unlocked balance) vaulted-amount) ERR-REQUEST-PENDING)
(balance (stx-account .vault)))
(asserts! (>= (* (get unlocked balance) u100) vaulted-amount) err-request-pending)
(ok { vaulted-amount: vaulted-amount, balance: balance })))
;; governance calls
(define-public (set-paused (new-paused bool))
(begin
(try! (is-dao-or-extension))
(ok (var-set paused new-paused))))
;; public calls
(define-public (request-mint (amount uint))
(define-public (request-mint (amount-in-fixed uint))
(let (
(cycle (contract-call? 'SP000000000000000000002Q6VF78.pox-3 current-pox-reward-cycle))
(request-details { requested-by: tx-sender, amount: amount, requested-at: cycle, status: (get-pending) })
(request-id (as-contract (try! (contract-call? .lqstx-mint-registry set-mint-request u0 request-details)))))
(try! (is-paused-or-fail))
(try! (contract-call? .token-wstx transfer-fixed amount tx-sender .lqstx-mint-registry none))
(try! (stx-transfer? (/ amount-in-fixed u100) tx-sender .vault))
(print { type: "mint-request", id: request-id, details: request-details})
(ok request-id)))
@@ -100,16 +95,19 @@
(print { type: "burn-request", id: request-id, details: request-details })
(ok request-id)))
;; (define-public (finalize-burn (request-id uint))
;; (let (
;; (request-details (try! (get-burn-request-or-fail request-id)))
;; (transfer-wlqstx (as-contract (try! (contract-call? .lqstx-mint-registry transfer-fixed (get amount request-details) tx-sender .token-wlqstx))))
;; (validation-data (try! (validate-burn-request request-id))))
;; (try! (is-paused-or-fail))
;; (as-contract (try! (contract-call? .token-wlqstx burn-fixed (get amount request-details) tx-sender)))
;; (as-contract (try! (contract-call? .token-lqstx burn-fixed (get vaulted-amount validation-data) tx-sender)))
;; (as-contract (try! (contract-call? .lqstx-mint-registry transfer-fixed (get vaulted-amount validation-data) (get requested-by request-details) .token-wstx)))
;; (as-contract (contract-call? .lqstx-mint-registry set-burn-request request-id (merge request-details { status: (get-finalized) })))))
(define-public (finalize-burn (request-id uint))
(let (
(request-details (try! (get-burn-request-or-fail request-id)))
(transfer-wlqstx (as-contract (try! (contract-call? .lqstx-mint-registry transfer-fixed (get amount request-details) tx-sender .token-wlqstx))))
(validation-data (try! (validate-burn-request request-id))))
(try! (is-paused-or-fail))
(as-contract (try! (contract-call? .token-wlqstx burn-fixed (get amount request-details) tx-sender)))
(as-contract (try! (contract-call? .token-lqstx burn-fixed (get vaulted-amount validation-data) tx-sender)))
(try! (contract-call? .vault dynamic-transfer .stx-transfer-provider (unwrap-panic (to-consensus-buff? { ustx: (/ (get vaulted-amount validation-data) u100), recipient: (get requested-by request-details) }))))
(as-contract (contract-call? .lqstx-mint-registry set-burn-request request-id (merge request-details { status: (get-finalized) })))))
(define-public (revoke-burn (request-id uint))
(ok true))
(define-public (callback (extension principal) (payload (buff 34)))
(ok true))

View File

@@ -4,7 +4,6 @@
(use-trait sip-010-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait)
(use-trait sip-010-extensions-trait .sip-010-extensions-trait.sip-010-extensions-trait)
(use-trait stacking-trait .trait-stacking.stacking-trait)
(define-constant err-unauthorised (err u1000))
(define-constant ERR-UNKNOWN-REQUEST-ID (err u1008))
@@ -14,8 +13,6 @@
(define-constant FINALIZED u1)
(define-constant REVOKED u2)
(define-map approved-stacking-vault principal bool)
(define-data-var rewards-paid-upto uint u0)
(define-data-var mint-request-nonce uint u0)
@@ -25,8 +22,7 @@
(define-map burn-requests uint { requested-by: principal, amount: uint, requested-at: uint, status: uint })
(define-public (is-dao-or-extension)
(ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised))
)
(ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised)))
;; read-only calls
@@ -54,14 +50,6 @@
;; governance calls
;; @dev other pools can be added by adding stacking vault that implements stacking-trait
(define-public (set-approved-stacking-vault (vault-trait <stacking-trait>) (approved bool))
(begin
(try! (is-dao-or-extension))
(ok (map-set approved-stacking-vault (contract-of vault-trait) approved))))
;; privileged calls
(define-public (set-rewards-paid-upto (cycle uint))
(begin
(try! (is-dao-or-extension))
@@ -91,28 +79,4 @@
(begin
(try! (is-dao-or-extension))
(as-contract (contract-call? token-trait transfer-fixed amount tx-sender recipient none))))
(define-public (delegate-stx (amount uint) (vault-trait <stacking-trait>))
(begin
(try! (is-dao-or-extension))
(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)))))
(define-public (delegate-stack-stx (vault-trait <stacking-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 (revoke-delegate-stx (vault-trait <stacking-trait>))
(begin
(try! (is-dao-or-extension))
(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 (transfer-from-vault (amount uint) (vault-trait <stacking-trait>))
(begin
(try! (is-dao-or-extension))
(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))))

View File

@@ -1,48 +0,0 @@
;; FAST Pool vault
(use-trait sip-010-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait)
(define-constant err-unauthorised (err u1000))
;; read-only calls
(define-public (is-dao-or-extension)
(ok (asserts! (or (is-eq tx-sender .lisa-dao) (contract-call? .lisa-dao is-extension contract-caller)) err-unauthorised))
)
;; governance calls
(define-public (transfer-fixed (amount uint) (recipient principal))
(begin
(try! (is-dao-or-extension))
;;(as-contract (contract-call? .token-wstx transfer-fixed amount tx-sender recipient none))
(ok true)
))
;; @dev other pools can be added by upgrading registry
(define-public (delegate-stx (amount uint))
(begin
(try! (is-dao-or-extension))
(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-fast-pool (caller principal))
(begin
(try! (is-dao-or-extension))
(to-response-uint (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-3 disallow-contract-caller 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox-fast-pool-v2)))))
(define-public (revoke-delegate-stx)
(begin
(try! (is-dao-or-extension))
(to-response-uint (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-3 revoke-delegate-stx)))))
(define-private (to-response-uint (resp (response bool int)))
(match resp success (ok success) err (err (to-uint err))))
;; initialisation
(as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-3 allow-contract-caller 'SP21YTSM60CAY6D011EZVEVNKXVW8FVZE198XEFFP.pox-fast-pool-v2 none))

View File

@@ -1,59 +0,0 @@
(impl-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait)
(define-constant err-unauthorised (err u100))
(define-constant ONE_8 u100000000)
(define-public (transfer (amount uint) (from principal) (to principal) (memo (optional (buff 34))))
(begin
(asserts! (is-eq tx-sender from) err-unauthorised)
(match memo m
(stx-transfer-memo? amount from to m)
(stx-transfer? amount from to))
))
(define-public (transfer-fixed (amount uint) (from principal) (to principal) (memo (optional (buff 34))))
(transfer (decimals-to-fixed amount) from to memo))
(define-read-only (get-name)
(ok "WSTX"))
(define-read-only (get-symbol)
(ok "WSTX"))
(define-read-only (get-decimals)
(ok u8))
(define-read-only (get-balance (who principal))
(ok (stx-get-balance who)))
(define-read-only (get-total-supply)
(ok stx-liquid-supply))
(define-read-only (get-token-uri)
(ok none))
(define-read-only (get-total-supply-fixed)
(ok (decimals-to-fixed (unwrap-panic (get-total-supply)))))
(define-read-only (get-balance-fixed (account principal))
(ok (decimals-to-fixed (unwrap-panic (get-balance account)))))
;; private functions
(define-private (pow-decimals)
(pow u10 (unwrap-panic (get-decimals))))
(define-private (decimals-to-fixed (amount uint))
(/ (* amount ONE_8) (pow-decimals)))
(define-private (fixed-to-decimals (amount uint))
(/ (* amount (pow-decimals)) ONE_8))
(define-private (mul-down (a uint) (b uint))
(/ (* a b) ONE_8))
(define-private (div-down (a uint) (b uint))
(if (is-eq a u0)
u0
(/ (* a ONE_8) b)))

View File

@@ -1,8 +0,0 @@
(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))
)
)

View File

@@ -1,30 +0,0 @@
;; title: wstx
;; version:
;; summary:
;; description:
;; traits
;;
;; token definitions
;;
;; constants
;;
;; data vars
;;
;; data maps
;;
;; public functions
;;
;; read only functions
;;
;; private functions
;;