Source Code

;; Title: USDA-USDC DEX Wrapper
;; Description: Wraps stableswap with Dexterity interface

;; Traits
;; (impl-trait 'SP2ZNGJ85ENDY6QRHQ5P2D4FXKGZWCKTB2T0Z55KS.dexterity-traits-v0.liquidity-pool-trait)
(impl-trait 'SP2ZNGJ85ENDY6QRHQ5P2D4FXKGZWCKTB2T0Z55KS.charisma-traits-v1.sip010-ft-trait)

;; Constants
(define-constant CONTRACT_OWNER tx-sender)
(define-constant ERR_INVALID_OPERATION (err u400))
(define-constant ERR_UNAUTHORIZED (err u403))
(define-constant BPS u10000)

(define-constant TOKEN-NAME "Old Faithful")
(define-constant TOKEN-SYMBOL "FAITH")
(define-constant TOKEN-URI (some u"https://charisma.rocks/api/v0/metadata/SP2D5BGGJ956A635JG7CJQ59FTRFRB0893514EZPJ.old-faithful"))

;; Opcodes
(define-constant OP_SWAP_A_TO_B 0x00)       ;; Swap token A for B
(define-constant OP_SWAP_B_TO_A 0x01)       ;; Swap token B for A
(define-constant OP_LOOKUP_RESERVES 0x04)   ;; Read pool reserves

;; Data Variables
(define-data-var price-impact-estimate uint u250) ;; Price impact estimate in bps

;; Admin Functions
(define-public (set-price-impact-estimate (new-rate uint))
    (begin
        (asserts! (is-eq tx-sender CONTRACT_OWNER) ERR_UNAUTHORIZED)
        (asserts! (<= new-rate BPS) ERR_INVALID_OPERATION)
        (ok (var-set price-impact-estimate new-rate))))

;; SIP-010 Functions
(define-public (transfer (amount uint) (sender principal) (recipient principal) (memo (optional (buff 34))))
    (begin
        (asserts! (is-eq tx-sender sender) ERR_UNAUTHORIZED)
        (contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.usda-aeusdc-lp-token-v-1-4 
            transfer amount sender recipient memo)))

(define-read-only (get-name)
    (ok TOKEN-NAME))

(define-read-only (get-symbol)
    (ok TOKEN-SYMBOL))

(define-read-only (get-decimals)
    (contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.usda-aeusdc-lp-token-v-1-4 get-decimals))

(define-read-only (get-balance (who principal))
    (contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.usda-aeusdc-lp-token-v-1-4 get-balance who))

(define-read-only (get-total-supply)
    (contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.usda-aeusdc-lp-token-v-1-4 get-total-supply))

(define-read-only (get-token-uri)
    (ok TOKEN-URI))

;; ;; Core Functions
;; (define-public (execute (amount uint) (opcode (optional (buff 16))))
;;     (let (
;;         (operation (get-byte opcode u0)))
;;         (if (is-eq operation OP_SWAP_A_TO_B) (ok (swap-a-to-b amount))
;;         (if (is-eq operation OP_SWAP_B_TO_A) (ok (swap-b-to-a amount))
;;         ERR_INVALID_OPERATION))))

;; (define-read-only (quote (amount uint) (opcode (optional (buff 16))))
;;     (let (
;;         (operation (get-byte opcode u0)))
;;         (if (is-eq operation OP_SWAP_A_TO_B) (ok (get-quote amount opcode))
;;         (if (is-eq operation OP_SWAP_B_TO_A) (ok (get-quote amount opcode))
;;         (if (is-eq operation OP_LOOKUP_RESERVES) (ok (get-reserves))
;;         ERR_INVALID_OPERATION)))))

;; Helper Functions
(define-private (swap-a-to-b (amount uint))
    (let (
        (dy (unwrap-panic (contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-usda-aeusdc-v-1-4 swap-x-for-y 
            'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.usda-token
            'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc
            'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.usda-aeusdc-lp-token-v-1-4
            amount 
            u1))))
        {
            dx: amount,
            dy: dy,
            dk: u0
        }))

(define-private (swap-b-to-a (amount uint))
    (let (
        (dy (unwrap-panic (contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-usda-aeusdc-v-1-4 swap-y-for-x
            'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc
            'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.usda-token
            'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.usda-aeusdc-lp-token-v-1-4
            amount 
            u1))))
        {
            dx: amount,
            dy: dy,
            dk: u0
        }))

(define-private (get-byte (opcode (optional (buff 16))) (position uint))
    (default-to 0x00 (element-at? (default-to 0x00 opcode) position)))

(define-read-only (get-pool)
    (contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stableswap-usda-aeusdc-v-1-4 get-pair-data
      'SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.usda-token
      'SP3Y2ZSH8P7D50B0VBTSX11S7XSG24M1VB9YFQA4K.token-aeusdc
      'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.usda-aeusdc-lp-token-v-1-4
    ))

(define-read-only (quote-a-to-b (x-amount uint))
    (/ (* x-amount (- BPS (var-get price-impact-estimate))) BPS))

(define-read-only (quote-b-to-a (y-amount uint))
    (/ (* y-amount (+ BPS (var-get price-impact-estimate))) BPS))

;; (define-private (get-quote (amount uint) (opcode (optional (buff 16))))
;;     (let (
;;         (operation (get-byte opcode u0))
;;         (amt-out (if (is-eq operation OP_SWAP_A_TO_B)
;;             (quote-a-to-b amount)
;;             (quote-b-to-a amount))))
;;         {
;;             dx: amount,
;;             dy: amt-out,
;;             dk: u0
;;         }))

;; (define-read-only (get-reserves)
;;     (let ((pool (get-pool)))
;;         {
;;             dx: (get balance-x pool),
;;             dy: (get balance-y pool),
;;             dk: (get total-shares pool)
;;         }))

Functions (18)

FunctionAccessArgs
set-price-impact-estimatepublicnew-rate: uint
transferpublicamount: uint, sender: principal, recipient: principal, memo: (optional (buff 34
get-nameread-only
get-symbolread-only
get-decimalsread-only
get-balanceread-onlywho: principal
get-total-supplyread-only
get-token-uriread-only
executepublicamount: uint, opcode: (optional (buff 16
quoteread-onlyamount: uint, opcode: (optional (buff 16
swap-a-to-bprivateamount: uint
swap-b-to-aprivateamount: uint
get-byteprivateopcode: (optional (buff 16
get-poolread-only
quote-a-to-bread-onlyx-amount: uint
quote-b-to-aread-onlyy-amount: uint
get-quoteprivateamount: uint, opcode: (optional (buff 16
get-reservesread-only