(define-constant O tx-sender)
(define-constant E1 (err u890))
(define-constant E2 (err u891))
(define-data-var balance uint u0)
(define-data-var spend-count uint u0)
(define-map spending uint {to: principal, amount: uint, reason: (string-ascii 64), block: uint})
(define-public (fund (amt uint))
(begin (asserts! (> amt u0) E2)
(try! (stx-transfer? amt tx-sender (as-contract tx-sender)))
(var-set balance (+ (var-get balance) amt))
(ok amt)))
(define-public (spend (to principal) (amt uint) (reason (string-ascii 64)))
(begin (asserts! (is-eq tx-sender O) E1)
(asserts! (<= amt (var-get balance)) E2)
(try! (as-contract (stx-transfer? amt tx-sender to)))
(var-set balance (- (var-get balance) amt))
(let ((id (var-get spend-count)))
(var-set spend-count (+ id u1))
(ok (map-set spending id
{to: to, amount: amt, reason: reason, block: stacks-block-height})))))
(define-read-only (get-balance) (var-get balance))
(define-read-only (get-spend (id uint)) (map-get? spending id))
(define-read-only (get-spend-count) (var-get spend-count))