Source Code

;; Title: Hooter Farm Rewards
;; Description: Wraps Hooter Farm with standardized interface

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

;; Constants
(define-constant ERR_INVALID_OPERATION (err u400))
(define-constant ERR_INVALID_AMOUNT (err u401))
(define-constant ERR_UNAUTHORIZED (err u403))

(define-constant TOKEN-NAME "Hooter Farm Rewards")
(define-constant TOKEN-SYMBOL "HOOTFARM")
(define-constant TOKEN-URI (some u"https://charisma.rocks/api/v0/metadata/SP2ZNGJ85ENDY6QRHQ5P2D4FXKGZWCKTB2T0Z55KS.hooter-farm-rewards"))
(define-constant BURN-AMOUNT u100000000)

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

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

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

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

(define-read-only (get-decimals)
    (ok u6))

(define-read-only (get-balance (who principal))
    (ok u0))

(define-read-only (get-total-supply)
    (ok u0))

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

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

;; 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) (spend-energy amount)
        (if (is-eq operation OP_SWAP_B_TO_A) (ok {dx: u0, dy: u0, dk: u0})  ;; Return zeros for B->A
        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)
            (if (>= amount BURN-AMOUNT)
                (ok {dx: BURN-AMOUNT, dy: BURN-AMOUNT, dk: u0})
                (ok {dx: u0, dy: u0, dk: u0}))
            (if (is-eq operation OP_SWAP_B_TO_A) (ok {dx: u0, dy: u0, dk: u0})  ;; Return zeros for B->A
            (if (is-eq operation OP_LOOKUP_RESERVES) (ok (get-reserves-quote))
            ERR_INVALID_OPERATION)))))

(define-private (spend-energy (amount uint))
    (begin
        (asserts! (>= amount BURN-AMOUNT) ERR_INVALID_AMOUNT)
        (match (contract-call? .hooter-farm execute .charisma-rulebook-v0 "CLAIM_TOKENS") 
            success true 
            error false)
        (ok {dx: BURN-AMOUNT, dy: BURN-AMOUNT, dk: u0})))

(define-read-only (get-reserves-quote)
    {dx: (unwrap-panic (contract-call? .energy get-total-supply)), dy: (unwrap-panic (contract-call? .hooter-the-owl get-balance .hooter-farm)), dk: u0})

Functions (12)

FunctionAccessArgs
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
get-byteprivateopcode: (optional (buff 16
executepublicamount: uint, opcode: (optional (buff 16
quoteread-onlyamount: uint, opcode: (optional (buff 16
spend-energyprivateamount: uint
get-reserves-quoteread-only