Source Code

(define-constant ERR-PERMISSION-DENIED (err u2000))
(define-constant ERR-CONTRACT-LOCKED (err u2999))
(define-constant ERR-INVALID-PERCENTAGE (err u2001))
(define-constant ERR-INSUFFICIENT-BALANCE (err u2002))
(define-constant ERR-INVALID-LOCKED-OPERATION (err u2003))
(define-constant ERR-ZERO-AMOUNT (err u2004))
(define-data-var team-percentage uint u50) 
(define-data-var team-balance uint u0)        
(define-data-var protocol-balance uint u0)    
(define-data-var protocol-locked-balance uint u0)  
(define-public (pay-fee (amount uint))
    (let 
        ((shares (calculate-fee-shares amount)))
        (begin
        (try! (contract-call? .btf-token-001 transfer amount tx-sender (as-contract tx-sender) none))
            (var-set team-balance (+ (get team-share shares) (var-get team-balance)))
            (var-set protocol-balance (+ (get protocol-share shares) (var-get protocol-balance)))
            (ok true)
        )
    )
)
(define-public (mint-and-pay-fee (amount uint))
    (begin
        (asserts! (as-contract (contract-call? .btf-protocol-cpc-001 is-contract-unlocked tx-sender)) ERR-CONTRACT-LOCKED)
        (asserts! (contract-call? .btf-protocol-cpc-001 has-permission tx-sender u1) ERR-PERMISSION-DENIED)
        (asserts! (> amount u0) ERR-ZERO-AMOUNT)
        (try! (as-contract (contract-call? .btf-token-001 mint amount tx-sender)))
        (let 
            ((shares (calculate-fee-shares amount)))
            (begin
            (var-set team-balance (+ (get team-share shares) (var-get team-balance)))
            (var-set protocol-balance (+ (get protocol-share shares) (var-get protocol-balance)))
            )
        )
        (ok true)
    )
)
(define-private (calculate-fee-shares (amount uint))
    (let
        (
            (team-share (/ (* amount (var-get team-percentage)) u100))
            (protocol-share (- amount team-share))
        )
        {
            team-share: team-share,
            protocol-share: protocol-share
        }
    )
)
(define-public (pay-fee-from-locked (amount uint))
    (begin
        (asserts! (as-contract (contract-call? .btf-protocol-cpc-001 is-contract-unlocked tx-sender)) ERR-CONTRACT-LOCKED)
        (asserts! (contract-call? .btf-protocol-cpc-001 has-permission tx-sender u1) ERR-PERMISSION-DENIED)
        (let 
            (
                (locked-balance (var-get protocol-locked-balance))
                (team-share (/ (* amount (var-get team-percentage)) u100))
                (protocol-share (- amount team-share))
            )
            (asserts! (<= amount locked-balance) ERR-INSUFFICIENT-BALANCE)
            (var-set protocol-locked-balance (- locked-balance amount))
            (var-set team-balance (+ (var-get team-balance) team-share))
            (var-set protocol-balance (+ (var-get protocol-balance) protocol-share))
            (ok true)
        )
    )
)
(define-public (lock-protocol-balance (amount uint))
    (begin
        (asserts! (as-contract (contract-call? .btf-protocol-cpc-001 is-contract-unlocked tx-sender)) ERR-CONTRACT-LOCKED)
        (asserts! (contract-call? .btf-protocol-cpc-001 has-permission tx-sender u1) ERR-PERMISSION-DENIED)
        (asserts! (<= amount (var-get protocol-balance)) ERR-INSUFFICIENT-BALANCE)
        (var-set protocol-balance (- (var-get protocol-balance) amount))
        (var-set protocol-locked-balance (+ (var-get protocol-locked-balance) amount))
        (ok true)
    )
)
(define-public (unlock-protocol-balance (amount uint))
    (begin
        (asserts! (as-contract (contract-call? .btf-protocol-cpc-001 is-contract-unlocked tx-sender)) ERR-CONTRACT-LOCKED)
        (asserts! (contract-call? .btf-protocol-cpc-001 has-permission tx-sender u1) ERR-PERMISSION-DENIED)
        (asserts! (<= amount (var-get protocol-locked-balance)) ERR-INSUFFICIENT-BALANCE)
        (var-set protocol-locked-balance (- (var-get protocol-locked-balance) amount))
        (var-set protocol-balance (+ (var-get protocol-balance) amount))
        (ok true)
    )
)
(define-public (deposit-to-locked (amount uint))
    (begin
        (asserts! (as-contract (contract-call? .btf-protocol-cpc-001 is-contract-unlocked tx-sender)) ERR-CONTRACT-LOCKED)
        (asserts! (contract-call? .btf-protocol-cpc-001 has-permission tx-sender u1) ERR-PERMISSION-DENIED)
        (try! (contract-call? .btf-token-001 transfer amount tx-sender (as-contract tx-sender) none))
        (var-set protocol-locked-balance (+ (var-get protocol-locked-balance) amount))
        (ok true)
    )
)
(define-public (withdraw-protocol (amount uint) (recipient principal))
    (begin
        (asserts! (as-contract (contract-call? .btf-protocol-cpc-001 is-contract-unlocked tx-sender)) ERR-CONTRACT-LOCKED)
        (asserts! (contract-call? .btf-protocol-cpc-001 has-permission tx-sender u1) ERR-PERMISSION-DENIED)
        (asserts! (<= amount (var-get protocol-balance)) ERR-INSUFFICIENT-BALANCE)
        (try! (as-contract (contract-call? .btf-token-001 transfer amount tx-sender recipient none)))
        (var-set protocol-balance (- (var-get protocol-balance) amount))
        (ok true)
    )
)
(define-public (withdraw-team (amount uint) (recipient principal))
    (begin
        (asserts! (as-contract (contract-call? .btf-protocol-cpc-001 is-contract-unlocked tx-sender)) ERR-CONTRACT-LOCKED)
        (asserts! (contract-call? .btf-protocol-cpc-001 has-permission tx-sender u50) ERR-PERMISSION-DENIED)
        (asserts! (<= amount (var-get team-balance)) ERR-INSUFFICIENT-BALANCE)
        (try! (as-contract (contract-call? .btf-token-001 transfer amount tx-sender recipient none)))
        (var-set team-balance (- (var-get team-balance) amount))
        (ok true)
    )
)
(define-public (withdraw-from-locked (amount uint) (recipient principal))
    (begin
        (asserts! (as-contract (contract-call? .btf-protocol-cpc-001 is-contract-unlocked tx-sender)) ERR-CONTRACT-LOCKED)
        (asserts! (contract-call? .btf-protocol-cpc-001 has-permission tx-sender u1) ERR-PERMISSION-DENIED)
        (let 
            ((locked-balance (var-get protocol-locked-balance)))
            (asserts! (<= amount locked-balance) ERR-INSUFFICIENT-BALANCE)
            (try! (as-contract (contract-call? .btf-token-001 transfer amount tx-sender recipient none)))
            (var-set protocol-locked-balance (- locked-balance amount))
            (ok true)
        )
    )
)
(define-read-only (get-treasury-balance)
    (contract-call? .btf-token-001 get-balance (as-contract tx-sender))
)
(define-read-only (get-team-percentage)
    (ok (var-get team-percentage))
)
(define-read-only (get-treasury-protocol-balance)
    (ok {
        total: (+ (var-get protocol-balance) (var-get protocol-locked-balance)),
        locked: (var-get protocol-locked-balance),
        available: (var-get protocol-balance)
    })
)
(define-read-only (get-treasury-team-balance)
    (ok (var-get team-balance))
)
(define-read-only (get-protocol-locked-balance)
    (ok (var-get protocol-locked-balance))
)
(define-public (set-team-percentage (new-percentage uint))
    (begin
        (asserts! (as-contract (contract-call? .btf-protocol-cpc-001 is-contract-unlocked tx-sender)) ERR-CONTRACT-LOCKED)
        (asserts! (contract-call? .btf-protocol-cpc-001 has-permission tx-sender u50) ERR-PERMISSION-DENIED)
        (asserts! (<= new-percentage u100) ERR-INVALID-PERCENTAGE)
        (var-set team-percentage new-percentage)
        (ok true)
    )
)
(contract-call? .btf-protocol-cpc-001 add-manager 'SP3QZNX3CGT6V7PE1PBK17FCRK1TP1AT02ZHQCMVJ.btf-treasury-002 u1)

Functions (16)

FunctionAccessArgs
pay-feepublicamount: uint
mint-and-pay-feepublicamount: uint
calculate-fee-sharesprivateamount: uint
pay-fee-from-lockedpublicamount: uint
lock-protocol-balancepublicamount: uint
unlock-protocol-balancepublicamount: uint
deposit-to-lockedpublicamount: uint
withdraw-protocolpublicamount: uint, recipient: principal
withdraw-teampublicamount: uint, recipient: principal
withdraw-from-lockedpublicamount: uint, recipient: principal
get-treasury-balanceread-only
get-team-percentageread-only
get-treasury-protocol-balanceread-only
get-treasury-team-balanceread-only
get-protocol-locked-balanceread-only
set-team-percentagepublicnew-percentage: uint