Source Code

;; Title: Champion's Faucet
;; Author: rozar.btc

(impl-trait .dao-traits-v2.extension-trait)

(use-trait nft-trait .dao-traits-v2.nft-trait)

(define-constant err-unauthorized (err u3100))
(define-constant err-insufficient-balance (err u3102))
(define-constant err-not-belt-holder (err u4010))

(define-data-var nft-contract principal .dme023-wooo-title-belt-nft)
(define-data-var drip-amount uint u0)
(define-data-var last-claim uint block-height)
(define-data-var total-issued uint u0)

(define-map guestlist principal bool)

;; --- Authorization check

(define-public (is-dao-or-extension)
	(ok (asserts! (or (is-eq tx-sender 'SP2D5BGGJ956A635JG7CJQ59FTRFRB0893514EZPJ.dungeon-master) (contract-call? 'SP2D5BGGJ956A635JG7CJQ59FTRFRB0893514EZPJ.dungeon-master is-extension contract-caller)) err-unauthorized))
)

;; --- Internal DAO functions

(define-public (set-drip-amount (amount uint))
	(begin
		(try! (is-dao-or-extension))
		(ok (var-set drip-amount amount))
	)
)

(define-public (set-guestlist (user principal) (status bool))
	(begin
		(try! (is-dao-or-extension))
		(ok (map-set guestlist user status))
	)
)

(define-public (set-nft-contract (new-nft-contract <nft-trait>))
	(begin
		(try! (is-dao-or-extension))
		(ok (var-set nft-contract (contract-of new-nft-contract)))
	)
)

;; --- Public functions

(define-public (claim (nft-gate <nft-trait>))
	(let
		(
			(sender tx-sender)
      (tokens-available (* (var-get drip-amount) (- block-height (var-get last-claim))))
			(holds-belt (check-for-belt sender nft-gate))
		)
		(asserts! holds-belt err-not-belt-holder)
    (asserts! (> tokens-available u0) err-insufficient-balance)
    (var-set last-claim block-height)
    (var-set total-issued (+ (var-get total-issued) tokens-available))		
    (as-contract (contract-call? 'SP2D5BGGJ956A635JG7CJQ59FTRFRB0893514EZPJ.dme000-governance-token dmg-mint tokens-available sender))
	)
)

(define-read-only (get-nft-contract)
	(ok (var-get nft-contract))
)

(define-read-only (get-drip-amount)
	(ok (var-get drip-amount))
)

(define-read-only (get-last-claim)
	(ok (var-get last-claim))
)

;; --- Utility functions

(define-private (get-belt-holder (nft-gate <nft-trait>))
	(begin
		(asserts! (is-eq (contract-of nft-gate) (var-get nft-contract)) err-unauthorized)
		(contract-call? nft-gate get-owner u0)
	)
)

(define-private (check-for-belt (user principal) (nft-gate <nft-trait>))
	(is-eq user (unwrap-panic (unwrap-panic (get-belt-holder nft-gate))))
)

;; --- Extension callback

(define-public (callback (sender principal) (memo (buff 34)))
	(ok true)
)

Functions (11)

FunctionAccessArgs
is-dao-or-extensionpublic
set-drip-amountpublicamount: uint
set-guestlistpublicuser: principal, status: bool
set-nft-contractpublicnew-nft-contract: <nft-trait>
claimpublicnft-gate: <nft-trait>
get-nft-contractread-only
get-drip-amountread-only
get-last-claimread-only
get-belt-holderprivatenft-gate: <nft-trait>
check-for-beltprivateuser: principal, nft-gate: <nft-trait>
callbackpublicsender: principal, memo: (buff 34