(define-constant O tx-sender)
(define-constant E1 (err u870))
(define-constant E2 (err u871))
(define-constant E3 (err u872))
(define-data-var drip-amount uint u1000000)
(define-data-var cooldown uint u144)
(define-data-var faucet-active bool true)
(define-map last-drip principal uint)
(define-public (drip)
(begin
(asserts! (var-get faucet-active) E1)
(let ((last (default-to u0 (map-get? last-drip tx-sender))))
(asserts! (>= (- stacks-block-height last) (var-get cooldown)) E2)
(map-set last-drip tx-sender stacks-block-height)
(as-contract (stx-transfer? (var-get drip-amount) tx-sender contract-caller)))))
(define-public (fund-faucet (amt uint))
(stx-transfer? amt tx-sender (as-contract tx-sender)))
(define-public (set-drip (amt uint) (cd uint))
(begin (asserts! (is-eq tx-sender O) E1)
(var-set drip-amount amt) (var-set cooldown cd) (ok true)))
(define-public (toggle-faucet)
(begin (asserts! (is-eq tx-sender O) E1)
(ok (var-set faucet-active (not (var-get faucet-active))))))
(define-read-only (get-faucet-info)
{drip: (var-get drip-amount), cooldown: (var-get cooldown), active: (var-get faucet-active)})
(define-read-only (can-drip (u principal))
(let ((last (default-to u0 (map-get? last-drip u))))
(>= (- stacks-block-height last) (var-get cooldown))))