mirror of
https://github.com/alexgo-io/alex-v1.git
synced 2026-01-12 22:21:10 +08:00
143 lines
8.1 KiB
Plaintext
143 lines
8.1 KiB
Plaintext
(use-trait ft-trait .trait-sip-010.sip-010-trait)
|
|
|
|
(define-constant err-not-authorised (err u1000))
|
|
(define-constant err-token-mismatch (err u1001))
|
|
(define-constant err-token-not-approved (err u1002))
|
|
(define-constant err-insufficient-balance (err u1003))
|
|
(define-constant err-request-not-found (err u1004))
|
|
(define-constant err-request-not-approved (err u1005))
|
|
(define-constant err-request-already-processed (err u1006))
|
|
|
|
(define-constant MAX_UINT u340282366920938463463374607431768211455)
|
|
|
|
(define-constant PENDING 0x00)
|
|
(define-constant APPROVED 0x01)
|
|
(define-constant REJECTED 0x02)
|
|
(define-constant FINALIZED 0x03)
|
|
|
|
(define-data-var contract-owner principal tx-sender)
|
|
(define-map approved-operators principal bool)
|
|
|
|
(define-map approved-tokens principal { approved: bool, min-x: uint })
|
|
|
|
(define-data-var request-nonce uint u0)
|
|
(define-map requests uint {
|
|
requested-by: principal, requested-at: uint,
|
|
token-x: principal, token-y: principal, factor: uint,
|
|
bal-x: uint, bal-y: uint,
|
|
fee-rate-x: uint, fee-rate-y: uint,
|
|
max-in-ratio: uint, max-out-ratio: uint,
|
|
threshold-x: uint, threshold-y: uint,
|
|
oracle-enabled: bool, oracle-average: uint,
|
|
start-block: uint,
|
|
memo: (optional (buff 256)),
|
|
status: (buff 1), status-memo: (optional (buff 256))
|
|
})
|
|
|
|
;; read-only calls
|
|
|
|
(define-read-only (get-approved-tokens-or-default (token principal))
|
|
(default-to { approved: false, min-x: MAX_UINT } (map-get? approved-tokens token)))
|
|
|
|
(define-read-only (get-approved-operator-default (operator principal))
|
|
(default-to false (map-get? approved-operators operator)))
|
|
|
|
(define-read-only (get-request-or-fail (request-id uint))
|
|
(ok (unwrap! (map-get? requests request-id) err-request-not-found)))
|
|
|
|
;; public calls
|
|
|
|
(define-public (request-create
|
|
(request-details {
|
|
token-x: principal, token-y: principal, factor: uint,
|
|
bal-x: uint, bal-y: uint,
|
|
fee-rate-x: uint, fee-rate-y: uint,
|
|
max-in-ratio: uint, max-out-ratio: uint,
|
|
threshold-x: uint, threshold-y: uint,
|
|
oracle-enabled: bool, oracle-average: uint,
|
|
start-block: uint,
|
|
memo: (optional (buff 256)) }) (token-x-trait <ft-trait>))
|
|
(let (
|
|
(next-nonce (+ (var-get request-nonce) u1))
|
|
(token-details (get-approved-tokens-or-default (get token-x request-details)))
|
|
(updated-request-details (merge request-details { requested-by: tx-sender, requested-at: block-height, status: PENDING, status-memo: none })))
|
|
(asserts! (is-eq (get token-x request-details) (contract-of token-x-trait)) err-token-mismatch)
|
|
(asserts! (get approved token-details) err-token-not-approved)
|
|
(asserts! (>= (get bal-x request-details) (get min-x token-details)) err-insufficient-balance)
|
|
(try! (contract-call? token-x-trait transfer-fixed (get bal-x request-details) tx-sender (as-contract tx-sender) none))
|
|
(map-set requests next-nonce updated-request-details)
|
|
(var-set request-nonce next-nonce)
|
|
(print { notification: "request-create", payload: updated-request-details })
|
|
(ok next-nonce)))
|
|
|
|
(define-public (finalize-request (request-id uint) (token-x-trait <ft-trait>) (token-y-trait <ft-trait>))
|
|
(let (
|
|
(request-details (try! (get-request-or-fail request-id)))
|
|
(updated-request-details (merge request-details { requested-by: tx-sender, status: FINALIZED })))
|
|
(asserts! (is-eq (get requested-by request-details) tx-sender) err-not-authorised)
|
|
(asserts! (is-eq (get status request-details) APPROVED) err-request-not-approved)
|
|
(asserts! (is-eq (get token-x request-details) (contract-of token-x-trait)) err-token-mismatch)
|
|
(asserts! (is-eq (get token-y request-details) (contract-of token-y-trait)) err-token-mismatch)
|
|
(as-contract (try! (contract-call? token-x-trait transfer-fixed (get bal-x request-details) tx-sender (get requested-by request-details) none)))
|
|
(try! (contract-call? .amm-swap-pool-v1-1 create-pool token-x-trait token-y-trait (get factor request-details) (get requested-by request-details) (get bal-x request-details) (get bal-y request-details)))
|
|
(try! (contract-call? .amm-swap-pool-v1-1 set-fee-rate-x (get token-x request-details) (get token-y request-details) (get factor request-details) (get fee-rate-x request-details)))
|
|
(try! (contract-call? .amm-swap-pool-v1-1 set-fee-rate-y (get token-x request-details) (get token-y request-details) (get factor request-details) (get fee-rate-y request-details)))
|
|
(try! (contract-call? .amm-swap-pool-v1-1 set-max-in-ratio (get token-x request-details) (get token-y request-details) (get factor request-details) (get max-in-ratio request-details)))
|
|
(try! (contract-call? .amm-swap-pool-v1-1 set-max-out-ratio (get token-x request-details) (get token-y request-details) (get factor request-details) (get max-out-ratio request-details)))
|
|
(try! (contract-call? .amm-swap-pool-v1-1 set-threshold-x (get token-x request-details) (get token-y request-details) (get factor request-details) (get threshold-x request-details)))
|
|
(try! (contract-call? .amm-swap-pool-v1-1 set-threshold-y (get token-x request-details) (get token-y request-details) (get factor request-details) (get threshold-y request-details)))
|
|
(try! (contract-call? .amm-swap-pool-v1-1 set-oracle-enabled (get token-x request-details) (get token-y request-details) (get factor request-details) (get oracle-enabled request-details)))
|
|
(try! (contract-call? .amm-swap-pool-v1-1 set-oracle-average (get token-x request-details) (get token-y request-details) (get factor request-details) (get oracle-average request-details)))
|
|
(try! (contract-call? .amm-swap-pool-v1-1 set-start-block (get token-x request-details) (get token-y request-details) (get factor request-details) (get start-block request-details)))
|
|
(map-set requests request-id updated-request-details)
|
|
(print { notification: "finalize-request", payload: updated-request-details })
|
|
(ok true)))
|
|
|
|
;; priviliged calls
|
|
|
|
(define-public (approve-request (request-id uint) (wrapped-token-y principal) (memo (optional (buff 256))))
|
|
(let (
|
|
(request-details (try! (get-request-or-fail request-id)))
|
|
(updated-request-details (merge request-details { token-y: wrapped-token-y, status: APPROVED, status-memo: memo })))
|
|
(try! (check-is-approved))
|
|
(map-set requests request-id updated-request-details)
|
|
(print { notification: "approve-request", payload: updated-request-details })
|
|
(ok true)))
|
|
|
|
(define-public (reject-request (request-id uint) (token-x-trait <ft-trait>) (memo (optional (buff 256))))
|
|
(let (
|
|
(request-details (try! (get-request-or-fail request-id)))
|
|
(updated-request-details (merge request-details { status: REJECTED, status-memo: memo })))
|
|
(try! (check-is-approved))
|
|
(asserts! (is-eq (get status request-details) PENDING) err-request-already-processed)
|
|
(asserts! (is-eq (get token-x request-details) (contract-of token-x-trait)) err-token-mismatch)
|
|
(as-contract (try! (contract-call? token-x-trait transfer-fixed (get bal-x request-details) tx-sender (get requested-by request-details) none)))
|
|
(map-set requests request-id updated-request-details)
|
|
(print { notification: "approve-request", payload: updated-request-details })
|
|
(ok true)))
|
|
|
|
;; governance calls
|
|
|
|
(define-public (set-owner (owner principal))
|
|
(begin
|
|
(try! (check-is-owner))
|
|
(ok (var-set contract-owner owner))))
|
|
|
|
(define-public (approve-operator (operator principal) (approved bool))
|
|
(begin
|
|
(try! (check-is-owner))
|
|
(ok (map-set approved-operators operator approved))))
|
|
|
|
(define-public (approve-token (operator principal) (approved bool) (min-x uint))
|
|
(begin
|
|
(try! (check-is-owner))
|
|
(ok (map-set approved-tokens operator { approved: approved, min-x: min-x }))))
|
|
|
|
;; private calls
|
|
|
|
(define-private (check-is-approved)
|
|
(ok (asserts! (or (get-approved-operator-default tx-sender) (is-ok (check-is-owner))) err-not-authorised)))
|
|
|
|
(define-private (check-is-owner)
|
|
(ok (asserts! (is-eq tx-sender (var-get contract-owner)) err-not-authorised)))
|