Source Code

;; Constants
(define-constant contributor-contract (as-contract tx-sender))

(ok {   balance: u819186,   burnchain-unlock-height: u0,   data: {     amount-ustx: u3000000000000,     delegate-to: 'SP249RRK1HD531X0ZSMWYKKP4T94YBQT1NSYVFWPQ.contributor,     end-cycle-id: none,     pox-addr: none,     start-cycle-id: u109,     unlock-burn-height: none   },   locked: u0,   name: "delegate-stx",   stacker: 'SP280DRZXAH0KA8C1CCPEHD5Q0XTF9SFC5M7BRKXX })
;; Error codes
(define-constant err-not-admin (err u101))
(define-constant err-allow-pool-in-pox-first (err u102))
(define-constant err-fund-to-commit (err u103))

;; Data vars
(define-data-var contributor-admin principal tx-sender)
(define-data-var funds-to-commit bool false)

(define-data-var rewards-address {version: (buff 1), hashbytes: (buff 32) } 
    {
        version: 0x04,
        hashbytes: 0x6408bf89b8038c618c4ad6e03d0d33cf6581c978})

;; Public functions
(define-public (update-contributor-admin (new-admin principal))
    (begin 
        (asserts! (is-eq contract-caller (var-get contributor-admin)) err-not-admin)
        (ok (var-set contributor-admin new-admin))))

(define-public (update-rewards-address (new-rewards-address {version: (buff 1), hashbytes: (buff 32)}))
    (begin 
        (asserts! (is-eq contract-caller (var-get contributor-admin)) err-not-admin)
        (asserts! (not (var-get funds-to-commit)) err-fund-to-commit)
        (ok (var-set rewards-address new-rewards-address))))

(define-public (contributor-delegate (amount-ustx uint))
    (let ((current-cycle (contract-call? 'SP000000000000000000002Q6VF78.pox-4 current-pox-reward-cycle)))
    (asserts! (check-contributor-SC-pox-allowance) err-allow-pool-in-pox-first)
    (try! (contributor-delegate-inner amount-ustx contributor-contract none))
    (ok true)))

(define-public (contributor-revoke-delegation)
    (contract-call? 'SP000000000000000000002Q6VF78.pox-4 revoke-delegate-stx))

(define-public (admin-stack (stacker principal) (amount-ustx uint) (lock-period uint))
    (begin
        (asserts! (is-eq (var-get contributor-admin) contract-caller) err-not-admin)
        (match (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-4 delegate-stack-stx stacker amount-ustx (var-get rewards-address) burn-block-height lock-period))
            stacker-details 
                (begin 
                    (var-set funds-to-commit true)
                    (ok stacker-details))
            error (err (to-uint error)))))

(define-public (admin-stack-extend (stacker principal) (extend-count uint))
    (begin
        (asserts! (is-eq (var-get contributor-admin) contract-caller) err-not-admin)
        (match (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-4 delegate-stack-extend stacker (var-get rewards-address) extend-count))
            extend-details 
                (begin 
                    (var-set funds-to-commit true)
                    (ok extend-details))
            error (err (to-uint error)))))

(define-public (admin-stack-increase (stacker principal) (increase-by uint))
    (begin
        (asserts! (is-eq (var-get contributor-admin) contract-caller) err-not-admin)
        (match (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-4 delegate-stack-increase stacker (var-get rewards-address) increase-by))
            stacker-details 
                (begin 
                    (var-set funds-to-commit true)
                    (ok stacker-details))
            error (err (to-uint error)))))

(define-public (admin-aggregation-commit (reward-cycle uint) 
                                         (signer-sig (optional (buff 65)))
                                         (signer-pubkey (buff 33))
                                         (max-allowed-amount uint)
                                         (auth-id uint))
    (begin 
        (asserts! (is-eq (var-get contributor-admin) contract-caller) err-not-admin)
        (match (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-4 stack-aggregation-commit-indexed (var-get rewards-address) reward-cycle signer-sig signer-pubkey max-allowed-amount auth-id))
            index 
                (begin 
                    (var-set funds-to-commit false)
                    (ok index))
            error 
                (begin 
                    (print {err-commit-ignored: error})
                    (err (to-uint error))))))

(define-public (admin-aggregation-increase (reward-cycle uint) 
                                           (index uint)
                                           (signer-sig (optional (buff 65)))
                                           (signer-pubkey (buff 33))
                                           (max-allowed-amount uint)
                                           (auth-id uint))
    (begin 
        (asserts! (is-eq (var-get contributor-admin) contract-caller) err-not-admin)
        (match (as-contract (contract-call? 'SP000000000000000000002Q6VF78.pox-4 stack-aggregation-increase (var-get rewards-address) reward-cycle index signer-sig signer-pubkey max-allowed-amount auth-id))
            success 
                (begin 
                    (var-set funds-to-commit false)
                    (ok true))
            error 
                (begin 
                    (print {err-increase-ignored: error})
                    (ok false)))))

;; Private functions
(define-private (contributor-delegate-inner (amount-ustx uint) (delegate-to principal) (until-burn-ht (optional uint)))
(let ((result-revoke
        ;; Calls revoke and ignores result
        (contract-call? 'SP000000000000000000002Q6VF78.pox-4 revoke-delegate-stx)))
  ;; Calls delegate-stx, converts any error to uint
  (match (contract-call? 'SP000000000000000000002Q6VF78.pox-4 delegate-stx amount-ustx delegate-to until-burn-ht none)
    success (ok success)
    error (err (* u1000 (to-uint error))))))

;; Read-only functions
(define-read-only (check-contributor-SC-pox-allowance)
    (is-some 
        (contract-call? 'SP000000000000000000002Q6VF78.pox-4 get-allowance-contract-callers contract-caller contributor-contract)))

(define-read-only (get-contributor-admin)
    (var-get contributor-admin))

(define-read-only (get-rewards-address)
    (var-get rewards-address))

Functions (12)

FunctionAccessArgs
update-contributor-adminpublicnew-admin: principal
contributor-delegatepublicamount-ustx: uint
contributor-revoke-delegationpublic
admin-stackpublicstacker: principal, amount-ustx: uint, lock-period: uint
admin-stack-extendpublicstacker: principal, extend-count: uint
admin-stack-increasepublicstacker: principal, increase-by: uint
admin-aggregation-commitpublicreward-cycle: uint, signer-sig: (optional (buff 65
admin-aggregation-increasepublicreward-cycle: uint, index: uint, signer-sig: (optional (buff 65
contributor-delegate-innerprivateamount-ustx: uint, delegate-to: principal, until-burn-ht: (optional uint
check-contributor-SC-pox-allowanceread-only
get-contributor-adminread-only
get-rewards-addressread-only