(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)