(impl-trait .extension-trait.extension-trait)
(impl-trait .proposal-trait.proposal-trait)
(use-trait ft-trait .trait-sip-010.sip-010-trait)
(define-constant ERR-NOT-AUTHORIZED (err u1000))
(define-constant ERR-CANNOT-STAKE (err u10016))
(define-map blocklist principal bool)
(define-read-only (is-dao-or-extension)
(ok (asserts! (or (is-eq tx-sender .executor-dao) (contract-call? .executor-dao is-extension contract-caller)) ERR-NOT-AUTHORIZED)))
(define-read-only (is-blocklisted-or-default (sender principal))
(default-to false (map-get? blocklist sender)))
(define-read-only (get-reward-cycle-length)
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-reward-cycle-length))
(define-read-only (get-apower-multiplier-in-fixed-or-default)
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-apower-multiplier-in-fixed-or-default 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token))
(define-read-only (get-staking-stats-at-cycle (reward-cycle uint))
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-staking-stats-at-cycle 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token reward-cycle))
(define-read-only (get-staking-stats-at-cycle-or-default (reward-cycle uint))
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-staking-stats-at-cycle-or-default 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token reward-cycle))
(define-read-only (get-user-id (user principal))
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-user-id 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token user))
(define-read-only (get-user (user-id uint))
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-user 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token user-id))
(define-read-only (get-registered-users-nonce)
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-registered-users-nonce 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token))
(define-read-only (get-registered-users-nonce-or-default)
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-registered-users-nonce-or-default 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token))
(define-read-only (get-staker-at-cycle (reward-cycle uint) (user-id uint))
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-staker-at-cycle 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token reward-cycle user-id))
(define-read-only (get-staker-at-cycle-or-default (reward-cycle uint) (user-id uint))
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-staker-at-cycle-or-default 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token reward-cycle user-id))
(define-read-only (get-reward-cycle (burn-height uint))
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-reward-cycle 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token burn-height))
(define-read-only (staking-active-at-cycle (reward-cycle uint))
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool staking-active-at-cycle 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token reward-cycle))
(define-read-only (get-first-stacks-block-in-reward-cycle (reward-cycle uint))
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-first-stacks-block-in-reward-cycle 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token reward-cycle))
(define-read-only (get-staking-reward (user-id uint) (target-cycle uint))
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-staking-reward 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token user-id target-cycle))
(define-read-only (get-token-halving-cycle)
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-token-halving-cycle))
(define-read-only (get-coinbase-thresholds)
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-coinbase-thresholds))
(define-read-only (get-coinbase-amount-or-default (reward-cycle uint))
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool get-coinbase-amount-or-default 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token reward-cycle))
(define-read-only (get-staker-at-cycle-or-default-by-tx-sender (reward-cycle uint))
(get-staker-at-cycle-or-default reward-cycle (default-to u0 (get-user-id tx-sender))))
(define-read-only (get-staking-reward-by-tx-sender (target-cycle uint))
(get-staking-reward (default-to u0 (get-user-id tx-sender)) target-cycle))
(define-read-only (get-staking-stats-coinbase (reward-cycle uint))
{ staking-stats: (get-staking-stats-at-cycle-or-default reward-cycle), coinbase-amount: (get-coinbase-amount-or-default reward-cycle) })
(define-read-only (get-staked-many (target-cycles (list 1000 uint)))
(map get-staker-at-cycle-or-default-by-tx-sender target-cycles))
(define-read-only (get-staking-rewards-many (target-cycles (list 1000 uint)))
(map get-staking-reward-by-tx-sender target-cycles))
(define-public (stake-tokens (amount-token uint) (lock-period uint))
(let (
(sender tx-sender))
(asserts! (not (is-blocklisted-or-default sender)) ERR-NOT-AUTHORIZED)
(asserts! (> amount-token u0) ERR-CANNOT-STAKE)
(as-contract (try! (contract-call? .token-alex burn-fixed amount-token sender)))
(as-contract (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token mint-fixed amount-token sender)))
(contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool stake-tokens 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token amount-token lock-period)))
(define-public (claim-staking-reward (target-cycle uint))
(let (
(sender tx-sender)
(claimed (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool claim-staking-reward 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token target-cycle)))
(total-claimed (+ (get to-return claimed) (get entitled-token claimed))))
(asserts! (not (is-blocklisted-or-default sender)) ERR-NOT-AUTHORIZED)
(and (> total-claimed u0) (as-contract (try! (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token burn-fixed total-claimed sender))))
(and (> total-claimed u0) (as-contract (try! (contract-call? .token-alex mint-fixed total-claimed sender))))
(ok claimed)))
(define-public (claim-staking-reward-many (target-cycles (list 1000 uint)))
(ok (map claim-staking-reward target-cycles)))
(define-public (callback (sender principal) (payload (buff 2048)))
(ok true))
(define-public (execute (sender principal))
(begin
(try! (contract-call? .executor-dao set-extensions (list { extension: .alex-staking, enabled: false } )))
(try! (contract-call? .executor-dao set-extensions (list { extension: .alex-staking-v2, enabled: true } )))
(ok true)))
(define-public (set-blocklist-many (blocked-many (list 1000 { sender: principal, blocked: bool })))
(begin
(try! (is-dao-or-extension))
(ok (map set-blocklist blocked-many))))
(define-public (set-reward-cycle-length (new-reward-cycle-length uint))
(begin
(try! (is-dao-or-extension))
(as-contract (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool set-reward-cycle-length new-reward-cycle-length))))
(define-public (set-apower-multiplier-in-fixed (new-apower-multiplier-in-fixed uint))
(begin
(try! (is-dao-or-extension))
(as-contract (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool set-apower-multiplier-in-fixed 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token new-apower-multiplier-in-fixed))))
(define-public (set-token-halving-cycle (new-token-halving-cycle uint))
(begin
(try! (is-dao-or-extension))
(as-contract (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool set-token-halving-cycle new-token-halving-cycle))))
(define-public (set-coinbase-amount (coinbase-1 uint) (coinbase-2 uint) (coinbase-3 uint) (coinbase-4 uint) (coinbase-5 uint))
(begin
(try! (is-dao-or-extension))
(as-contract (contract-call? 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.alex-reserve-pool set-coinbase-amount 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.age000-governance-token coinbase-1 coinbase-2 coinbase-3 coinbase-4 coinbase-5))))
(define-private (set-blocklist (blocked { sender: principal, blocked: bool }))
(begin
(print { object: "alex-staking", action: "set-blocklist", payload: blocked })
(ok (map-set blocklist (get sender blocked) (get blocked blocked)))))