Source Code

;; 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
  })
)

Functions (12)

FunctionAccessArgs
swap-exact-inpublicamount-in: uint, min-amount-out: uint
set-exchange-ratepublicnew-rate: uint
add-liquiditypublicamount: uint
remove-liquiditypubliclp-tokens: uint
get-amount-outread-onlyamount-in: uint
get-swap-historyread-onlyswap-id: uint
get-total-swapsread-only
get-exchange-rateread-only
validate-traderread-onlytrader: principal
format-exchange-rateread-only
parse-swap-amountread-onlyamount-str: (string-ascii 30
get-dex-timestampsread-only