Source Code

;; title: treasury
;; version: 0.1.0
;; summary: Treasury contract for managing fees
(define-map contract-managers principal bool)

(define-constant ERR-PERMISSION-DENIED (err u1000))
(define-constant ERR-INSUFFICIENT-FUND (err u1001))
(define-constant ERR-PRECONDITION (err u1002))

(define-data-var treasury-balance uint u0)

(define-map comission uint uint)

(define-map fee uint uint)

(define-read-only (get-treasury-balance)
    (var-get treasury-balance))

(define-read-only (get-comission (c-id uint))
    (default-to u0 
        (map-get? comission c-id)
    ))

(define-read-only (get-fee (fee-id uint))
    (default-to u0 
        (map-get? fee fee-id)
    ))

(define-read-only (is-contract-manager)
	(default-to false (map-get? contract-managers tx-sender)))

(define-public (add-contract-manager (contract principal))
    (begin 
        (asserts! (is-contract-manager) ERR-PERMISSION-DENIED)
        (map-set contract-managers contract true)
        (ok true)
    ))

(define-public (remove-contract-manager (contract principal))
    (begin 
        (asserts! (is-contract-manager) ERR-PERMISSION-DENIED)
        (map-delete contract-managers contract)
        (ok true)
    ))

(define-public (update-comission (c-id uint) (value uint))
    (begin 
        (asserts! (is-contract-manager) ERR-PERMISSION-DENIED)
        (map-set comission c-id value)
        (ok true)
    ))

(define-public (update-fee (fee-id uint) (value uint))
    (begin 
        (asserts! (is-contract-manager) ERR-PERMISSION-DENIED)
        (map-set fee fee-id value)
        (ok true)
    ))

(define-public (deposit-fund (amount uint))
    (begin 
        (asserts! (> amount u0) ERR-PRECONDITION)
        (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
        (ok true)))


(define-public (withdraw-deposit-fund (amount uint) (recipient principal) (fee-id uint) )
    (begin 
        (asserts! (> amount u0) ERR-PRECONDITION)
        (asserts! (is-contract-manager) ERR-PERMISSION-DENIED)
        (let (
                (fee-s (get-comission fee-id))
                (tax (/ (* amount fee-s) u100))
                (amount-to-send (- amount tax))
            )
            (try! (as-contract (stx-transfer? amount-to-send tx-sender recipient)))
            (var-set treasury-balance (+ (var-get treasury-balance) tax))
            (ok amount-to-send)
        )))

(define-public (pay-tax (fee-id uint))
        (let (
                (tax (get-fee fee-id))
            )
            (if (> tax u0)
                (begin
                    (try! (stx-transfer? tax tx-sender (as-contract tx-sender)))
                    (var-set treasury-balance (+ (var-get treasury-balance) tax))
                    (ok tax)
                    )
                (ok u0)
                )
        ))

(define-public (collect-treasure (amount uint) (recipient principal))
    (begin 
        (asserts! (> amount u0) ERR-PRECONDITION)
        (asserts! (is-contract-manager) ERR-PERMISSION-DENIED)
        (let (
                (balance (var-get treasury-balance))
            )
            (asserts! (>= balance amount) ERR-INSUFFICIENT-FUND)
            (try! (as-contract (stx-transfer? amount tx-sender recipient)))
            (var-set treasury-balance (- balance amount))
            (ok true)
        )))

(map-set contract-managers .auction-store true)
(map-set contract-managers .promoter-rank true)
(map-set contract-managers tx-sender true)

(map-set comission u0 u5)
(map-set comission u1 u0)

(map-set fee u0 u1000000)
(map-set fee u1 u2000000)
(map-set fee u2 u5000000)
(map-set fee u3 u1500000)
(map-set fee u4 u4000000)
(map-set fee u5 u6000000)

Functions (11)

FunctionAccessArgs
get-treasury-balanceread-only
get-comissionread-onlyc-id: uint
get-feeread-onlyfee-id: uint
is-contract-managerread-only
add-contract-managerpubliccontract: principal
remove-contract-managerpubliccontract: principal
update-comissionpublicc-id: uint, value: uint
update-feepublicfee-id: uint, value: uint
deposit-fundpublicamount: uint
pay-taxpublicfee-id: uint
collect-treasurepublicamount: uint, recipient: principal