;; title: mock-dex
;; version: 1.0.0
;; summary: Mock DEX for testing
;; description: Simple DEX mock for testing swaps - Clarity 4
;; Constants
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-SLIPPAGE (err u7500))
;; Swap fee (30 basis points = 0.3%)
(define-constant SWAP-FEE u30)
;; Data Variables
(define-data-var total-swaps uint u0)
(define-data-var exchange-rate uint u1000000) ;; 1:1 with 6 decimals
;; Data Maps - Using stacks-block-time for Clarity 4
(define-map swap-history uint {
user: principal,
amount-in: uint,
amount-out: uint,
timestamp: uint ;; Clarity 4: Unix timestamp
})
;; Public Functions
(define-public (swap-exact-in
(amount-in uint)
(min-amount-out uint))
(let (
(swap-id (var-get total-swaps))
(fee (/ (* amount-in SWAP-FEE) u10000))
(amount-after-fee (- amount-in fee))
(amount-out (/ (* amount-after-fee (var-get exchange-rate)) u1000000))
)
(asserts! (>= amount-out min-amount-out) ERR-SLIPPAGE)
(map-set swap-history swap-id {
user: tx-sender,
amount-in: amount-in,
amount-out: amount-out,
timestamp: stacks-block-time
})
(var-set total-swaps (+ swap-id u1))
(print {
event: "swap-executed",
swap-id: swap-id,
amount-out: amount-out,
timestamp: stacks-block-time
})
(ok amount-out)
)
)
(define-public (set-exchange-rate (new-rate uint))
(begin
(asserts! (is-eq tx-sender CONTRACT-OWNER) (err u401))
(var-set exchange-rate new-rate)
(ok true)
)
)
(define-public (add-liquidity (amount uint))
(ok true)
)
(define-public (remove-liquidity (lp-tokens uint))
(ok true)
)
;; Read-Only Functions
(define-read-only (get-amount-out (amount-in uint))
(let (
(fee (/ (* amount-in SWAP-FEE) u10000))
(amount-after-fee (- amount-in fee))
)
(ok (/ (* amount-after-fee (var-get exchange-rate)) u1000000))
)
)
(define-read-only (get-swap-history (swap-id uint))
(map-get? swap-history swap-id)
)
(define-read-only (get-total-swaps)
(var-get total-swaps)
)
(define-read-only (get-exchange-rate)
(var-get exchange-rate)
)
;; Clarity 4 Enhanced Functions
;; 1. Clarity 4: principal-destruct? - Validate trader principals
(define-read-only (validate-trader (trader principal))
(principal-destruct? trader)
)
;; 2. Clarity 4: int-to-utf8 - Format exchange rates
(define-read-only (format-exchange-rate)
(ok (int-to-utf8 (var-get exchange-rate)))
)
;; 3. Clarity 4: string-to-uint? - Parse swap amounts
(define-read-only (parse-swap-amount (amount-str (string-ascii 30)))
(match (string-to-uint? amount-str)
amount (ok amount)
(err u998)
)
)
;; 4. Clarity 4: burn-block-height - Track DEX operations
(define-read-only (get-dex-timestamps)
(ok {
stacks-time: stacks-block-time,
burn-time: burn-block-height
})
)