Source Code

;; fidya-calc -- Fidya (fasting compensation) calculator and payment tracker
(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-AUTH (err u401))
(define-constant ERR-NONE (err u404))
(define-data-var payment-count uint u0)
(define-data-var total-collected uint u0)
(define-data-var rate-per-day uint u10)
(define-map payments uint { payer: principal, days-missed: uint, amount: uint, year: uint, block: uint })
(define-map payer-history principal uint)

(define-public (pay-fidya (days-missed uint) (year uint))
  (let ((id (+ (var-get payment-count) u1))
        (amount (* days-missed (var-get rate-per-day)))
        (prev (default-to u0 (map-get? payer-history tx-sender))))
    (var-set payment-count id)
    (var-set total-collected (+ (var-get total-collected) amount))
    (map-set payments id { payer: tx-sender, days-missed: days-missed, amount: amount, year: year, block: stacks-block-height })
    (map-set payer-history tx-sender (+ prev amount))
    (ok id)))

(define-public (update-rate (new-rate uint))
  (begin (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-AUTH)
    (var-set rate-per-day new-rate) (ok new-rate)))

(define-read-only (get-payment (id uint)) (map-get? payments id))
(define-read-only (get-rate) (var-get rate-per-day))
(define-read-only (get-total-collected) (var-get total-collected))

Functions (5)

FunctionAccessArgs
pay-fidyapublicdays-missed: uint, year: uint
update-ratepublicnew-rate: uint
get-paymentread-onlyid: uint
get-rateread-only
get-total-collectedread-only