Source Code

;; Charisma Redemption Vault
;; https://charisma.rocks

(define-constant err-unauthorized (err u401))
(define-constant err-liquidity-lock (err u402))
(define-constant err-not-blue-pilled (err u403))
(define-constant err-insufficient-ious (err u404))

(define-constant contract (as-contract tx-sender))
(define-constant max-claim-amount-welsh u10000)
(define-constant max-claim-amount-roo u100)

(define-data-var lock-enabled bool false)

;; --- Authorization checks

(define-read-only (is-dao-or-extension)
  (or (is-eq tx-sender 'SP2D5BGGJ956A635JG7CJQ59FTRFRB0893514EZPJ.dungeon-master) (contract-call? 'SP2D5BGGJ956A635JG7CJQ59FTRFRB0893514EZPJ.dungeon-master is-extension contract-caller))
)

(define-read-only (is-authorized)
  (ok (asserts! (is-dao-or-extension) err-unauthorized))
)

(define-read-only (is-blue-pilled)
  (ok (asserts! (contract-call? .blue-pill-nft has-balance tx-sender) err-not-blue-pilled))
)

(define-read-only (get-available-welsh)
  (contract-call? 'SP3NE50GEXFG9SZGTT51P40X2CKYSZ5CC4ZTZ7A2G.welshcorgicoin-token get-balance contract)
)

(define-read-only (get-available-roo)
  (contract-call? 'SP2C1WREHGM75C7TGFAEJPFKTFTEGZKF6DFT6E2GE.kangaroo get-balance contract)
)

(define-read-only (is-locked)
  (ok (var-get lock-enabled))
)

(define-public (toggle-lock)
  (begin
    (try! (is-authorized))
    (ok (var-set lock-enabled (not (var-get lock-enabled))))
  )
)

(define-public (redeem-welsh (amount uint))
  (let (
    (sender tx-sender)
    (available-tokens (unwrap-panic (get-available-welsh)))
    (claim-amount (if (> amount max-claim-amount-welsh) max-claim-amount-welsh amount))
    (final-amount (if (> claim-amount available-tokens) available-tokens claim-amount))
  )
    (asserts! (or (not (var-get lock-enabled)) (try! (is-blue-pilled))) err-not-blue-pilled)
    (asserts! (>= (unwrap-panic (contract-call? .synthetic-welsh get-balance sender)) final-amount) err-insufficient-ious)
    
    ;; Burn synthetic-welsh tokens
    (try! (contract-call? .synthetic-welsh burn final-amount))
    
    ;; Transfer welshcorgicoin tokens
    (as-contract (contract-call? 'SP3NE50GEXFG9SZGTT51P40X2CKYSZ5CC4ZTZ7A2G.welshcorgicoin-token transfer final-amount contract sender none))
  )
)

(define-public (redeem-roo (amount uint))
  (let (
    (sender tx-sender)
    (available-tokens (unwrap-panic (get-available-roo)))
    (claim-amount (if (> amount max-claim-amount-roo) max-claim-amount-roo amount))
    (final-amount (if (> claim-amount available-tokens) available-tokens claim-amount))
  )
    (asserts! (or (not (var-get lock-enabled)) (try! (is-blue-pilled))) err-not-blue-pilled)
    (asserts! (>= (unwrap-panic (contract-call? .synthetic-roo get-balance sender)) final-amount) err-insufficient-ious)
    
    ;; Burn synthetic-roo tokens
    (try! (contract-call? .synthetic-roo burn final-amount))
    
    ;; Transfer roo tokens
    (as-contract (contract-call? 'SP2C1WREHGM75C7TGFAEJPFKTFTEGZKF6DFT6E2GE.kangaroo transfer final-amount contract sender none))
  )
)

(define-public (deposit-welsh (amount uint))
  (contract-call? 'SP3NE50GEXFG9SZGTT51P40X2CKYSZ5CC4ZTZ7A2G.welshcorgicoin-token transfer amount tx-sender contract none)
)

(define-public (deposit-roo (amount uint))
  (contract-call? 'SP2C1WREHGM75C7TGFAEJPFKTFTEGZKF6DFT6E2GE.kangaroo transfer amount tx-sender contract none)
)

Functions (11)

FunctionAccessArgs
is-dao-or-extensionread-only
is-authorizedread-only
is-blue-pilledread-only
get-available-welshread-only
get-available-rooread-only
is-lockedread-only
toggle-lockpublic
redeem-welshpublicamount: uint
redeem-roopublicamount: uint
deposit-welshpublicamount: uint
deposit-roopublicamount: uint