mirror of
https://github.com/zhigang1992/liquid-stacking.git
synced 2026-01-12 17:23:23 +08:00
lqstx-mint
This commit is contained in:
@@ -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))
|
||||
)
|
||||
@@ -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))
|
||||
|
||||
@@ -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))))
|
||||
|
||||
@@ -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))
|
||||
@@ -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)))
|
||||
@@ -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))
|
||||
)
|
||||
)
|
||||
@@ -1,30 +0,0 @@
|
||||
|
||||
;; title: wstx
|
||||
;; version:
|
||||
;; summary:
|
||||
;; description:
|
||||
|
||||
;; traits
|
||||
;;
|
||||
|
||||
;; token definitions
|
||||
;;
|
||||
|
||||
;; constants
|
||||
;;
|
||||
|
||||
;; data vars
|
||||
;;
|
||||
|
||||
;; data maps
|
||||
;;
|
||||
|
||||
;; public functions
|
||||
;;
|
||||
|
||||
;; read only functions
|
||||
;;
|
||||
|
||||
;; private functions
|
||||
;;
|
||||
|
||||
Reference in New Issue
Block a user