(define-constant ERR_NOT_AUTHORIZED (err "err-not-authorized"))
(define-constant ERR_CONTRACT_STATUS (err "err-contract-status"))
(define-constant ERR_TOKEN_TRANSFER_FAILED (err "err-token-transfer-failed"))
(define-constant ERR_INVALID_AMOUNT (err "err-invalid-amount"))
(define-constant ERR_INVALID_CYCLE (err "err-invalid-cycle"))
(define-constant ERR_NO_CYCLE_DATA (err "err-no-cycle-data"))
(define-constant ERR_NO_CYCLE_USER_DATA (err "err-no-cycle-user-data"))
(define-constant ERR_NO_CYCLE_DATA_EXTERNAL (err "err-no-cycle-data-external"))
(define-constant ERR_NO_CYCLE_USER_DATA_EXTERNAL (err "err-no-cycle-user-data-external"))
(define-constant ERR_CYCLE_REWARDS_NOT_EXPIRED (err "err-cycle-not-expired"))
(define-constant ERR_CYCLE_FINISHED (err "err-cycle-finished"))
(define-constant ERR_ALL_CYCLE_REWARDS_CLAIMED (err "err-all-cycle-rewards-claimed"))
(define-constant ERR_CYCLE_USER_REWARDS_CLAIMED (err "err-cycle-user-rewards-claimed"))
(define-constant ERR_CYCLE_NO_USER_REWARDS (err "err-cycle-no-user-rewards"))
(define-constant DEPLOYMENT_HEIGHT u825735)
(define-constant CYCLE_LENGTH u144)
(define-data-var contract-owner principal tx-sender)
(define-data-var contract-status bool true)
(define-map cycles uint {total-rewards: uint, claimed-rewards: uint, unclaimed-rewards: uint})
(define-map user-at-cycle {user: principal, cycle: uint} {claimed: bool})
(define-read-only (get-contract-owner)
(ok (var-get contract-owner))
)
(define-read-only (get-contract-status)
(ok (var-get contract-status))
)
(define-read-only (get-cycle (cycle uint))
(ok (map-get? cycles cycle))
)
(define-read-only (get-user-at-cycle (user principal) (cycle uint))
(ok (map-get? user-at-cycle {user: user, cycle: cycle}))
)
(define-public (set-contract-owner (address principal))
(let (
(caller tx-sender)
)
(begin
(asserts! (is-eq caller (var-get contract-owner)) ERR_NOT_AUTHORIZED)
(var-set contract-owner address)
(print {action: "set-contract-owner", caller: caller, address: address})
(ok true)
)
)
)
(define-public (set-contract-status (status bool))
(let (
(caller tx-sender)
)
(begin
(asserts! (is-eq caller (var-get contract-owner)) ERR_NOT_AUTHORIZED)
(var-set contract-status status)
(print {action: "set-contract-status", caller: caller, status: status})
(ok true)
)
)
)
(define-public (set-cycle-rewards (cycle uint) (amount uint))
(let (
(current-cycle (/ (- burn-block-height DEPLOYMENT_HEIGHT) CYCLE_LENGTH))
(caller tx-sender)
)
(begin
(asserts! (is-eq caller (var-get contract-owner)) ERR_NOT_AUTHORIZED)
(asserts! (> cycle current-cycle) ERR_CYCLE_FINISHED)
(map-set cycles cycle {total-rewards: amount, claimed-rewards: u0, unclaimed-rewards: amount})
(print {action: "set-cycle-rewards", caller: caller, cycle: cycle, amount: amount})
(ok true)
)
)
)
(define-public (clear-expired-cycle-rewards (cycle uint))
(let (
(current-cycle (/ (- burn-block-height DEPLOYMENT_HEIGHT) CYCLE_LENGTH))
(cycle-data (unwrap! (map-get? cycles cycle) ERR_NO_CYCLE_DATA))
(caller tx-sender)
)
(begin
(asserts! (is-eq caller (var-get contract-owner)) ERR_NOT_AUTHORIZED)
(asserts! (>= (- current-cycle cycle) u60) ERR_CYCLE_REWARDS_NOT_EXPIRED)
(map-set cycles cycle (merge cycle-data {unclaimed-rewards: u0}))
(print {action: "clear-expired-cycle-rewards", caller: caller, cycle: cycle})
(ok true)
)
)
)
(define-public (withdraw-cycle-rewards (amount uint) (recipient principal))
(let (
(caller tx-sender)
)
(begin
(asserts! (is-eq caller (var-get contract-owner)) ERR_NOT_AUTHORIZED)
(asserts! (> amount u0) ERR_INVALID_AMOUNT)
(unwrap! (as-contract (contract-call? 'SPEXN2X0M0CJ55K8GAJZEEH3A0JP64ZE7XD9XMKY.test-token transfer amount tx-sender recipient none)) ERR_TOKEN_TRANSFER_FAILED)
(print {action: "withdraw-cycle-rewards", caller: caller, amount: amount, recipient: recipient})
(ok true)
)
)
)
(define-public (claim-cycle-rewards (cycle uint))
(let (
(current-cycle (/ (- burn-block-height DEPLOYMENT_HEIGHT) CYCLE_LENGTH))
(cycle-data (unwrap! (map-get? cycles cycle) ERR_NO_CYCLE_DATA))
(cycle-user-data (unwrap! (map-get? user-at-cycle {user: tx-sender, cycle: cycle}) ERR_NO_CYCLE_USER_DATA))
(cycle-user-claimed (get claimed cycle-user-data))
(cycle-user-data-external (unwrap! (contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.earn-stx-ststx-v-1-2 get-user-data-at-cycle 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.ststx-token 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stx-ststx-lp-token-v-1-2 tx-sender cycle) ERR_NO_CYCLE_USER_DATA_EXTERNAL))
(cycle-user-lp-staked (get lp-token-staked cycle-user-data-external))
(cycle-total-lp-staked-external (unwrap! (contract-call? 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.earn-stx-ststx-v-1-2 get-data-at-cycle 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.ststx-token 'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M.stx-ststx-lp-token-v-1-2 cycle) ERR_NO_CYCLE_DATA_EXTERNAL))
(cycle-rewards (/ (* (get total-rewards cycle-data) cycle-user-lp-staked) cycle-total-lp-staked-external))
(caller tx-sender)
)
(begin
(asserts! (is-eq (var-get contract-status) true) ERR_CONTRACT_STATUS)
(asserts! (< cycle current-cycle) ERR_INVALID_CYCLE)
(asserts! (> (get unclaimed-rewards cycle-data) u0) ERR_ALL_CYCLE_REWARDS_CLAIMED)
(asserts! (not cycle-user-claimed) ERR_CYCLE_USER_REWARDS_CLAIMED)
(asserts! (> cycle-rewards u0) ERR_CYCLE_NO_USER_REWARDS)
(unwrap! (as-contract (contract-call? 'SPEXN2X0M0CJ55K8GAJZEEH3A0JP64ZE7XD9XMKY.test-token transfer cycle-rewards tx-sender caller none)) ERR_TOKEN_TRANSFER_FAILED)
(map-set user-at-cycle {user: caller, cycle: cycle} (merge cycle-user-data {claimed: true}))
(map-set cycles cycle (merge cycle-data {claimed-rewards: (+ (get claimed-rewards cycle-data) cycle-rewards), unclaimed-rewards: (- (get unclaimed-rewards cycle-data) cycle-rewards)}))
(print {action: "claim-cycle-rewards", caller: caller, cycle: cycle, cycle-rewards: cycle-rewards})
(ok true)
)
)
)
(define-public (set-cycle-rewards-multi (cycles-list (list 120 uint)) (amount (list 120 uint)))
(ok (map set-cycle-rewards cycles-list amount))
)
(define-public (clear-expired-cycle-rewards-multi (cycles-list (list 120 uint)))
(ok (map clear-expired-cycle-rewards cycles-list))
)
(define-public (claim-cycle-rewards-multi (cycles-list (list 120 uint)))
(ok (map claim-cycle-rewards cycles-list))
)