Source Code

(define-constant ERR_ALL_REWARDS_CLAIMED (err u450))
(define-constant ERR_SENDER_ALREADY_CLAIMED_REWARD (err u451))

(define-constant ERR_LOWER_THAN_25 (err u461))
(define-constant ERR_REGISTERED_TOO_SOON (err u642))

;; The start time of the reward compaign
;; Translates to Monday Dec 22 2025 14:00:00 UTC
;; Players must register their ATA factory (aka Miner) after this date
(define-constant START u1766412000)

;; Rewards values in sats
;; Will be delivered as sbtc
;; The first three players that fulfill the following conditions will be able to
;; claim the rewards in order, 1, 2, 3;
;; - registered after `START` Monday Dec 22 2025 14:00:00 UTC
;; - have ATA miner level 25
(define-constant REWARD_1 u112000) ;; ~$100
(define-constant REWARD_2 u67000) ;; ~$60
(define-constant REWARD_3 u45000) ;; ~$40

(define-data-var winner1 (optional principal) none)
(define-data-var winner2 (optional principal) none)
(define-data-var winner3 (optional principal) none)

(define-read-only (is-level-25)
  (match (contract-call? 'SP1EF9EHG1JNX84RGA8Z8F8HYTSCAHWE21273RCJ4.ata-store-v0
    get-ata-lvl tx-sender
  )
    lvl (>= lvl u25)
    r false
  )
)

(define-read-only (registered-after-start-date)
  (let (
      ;; the `coords` are `{ x: <burn-block-height>, y: <stacks-block-height> }`
      (coords (unwrap!
        (contract-call? 'SP1EF9EHG1JNX84RGA8Z8F8HYTSCAHWE21273RCJ4.ata-store-v0
          get-coords tx-sender
        )
        false
      ))
      (registration-block-height (get y coords))
      (registration-time (unwrap! (get-stacks-block-info? time registration-block-height) false))
    )
    (>= registration-time START)
  )
)

(define-private (send-reward
    (amount uint)
    (to principal)
  )
  (as-contract?
    ((with-ft 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token "sbtc-token"
      amount
    ))
    (try! (contract-call? 'SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token
      transfer amount current-contract to none
    ))
  )
)

(define-private (claim-1)
  (begin
    (var-set winner1 (some tx-sender))
    (send-reward REWARD_1 tx-sender)
  )
)

(define-private (claim-2)
  (begin
    (asserts! (not (is-eq (some tx-sender) (var-get winner1)))
      ERR_SENDER_ALREADY_CLAIMED_REWARD
    )
    (var-set winner2 (some tx-sender))
    (send-reward REWARD_2 tx-sender)
  )
)

(define-private (claim-3)
  (begin
    (asserts! (not (is-eq (some tx-sender) (var-get winner1)))
      ERR_SENDER_ALREADY_CLAIMED_REWARD
    )
    (asserts! (not (is-eq (some tx-sender) (var-get winner2)))
      ERR_SENDER_ALREADY_CLAIMED_REWARD
    )
    (var-set winner3 (some tx-sender))
    (send-reward REWARD_3 tx-sender)
  )
)

(define-public (claim)
  (begin
    (asserts! (is-level-25) ERR_LOWER_THAN_25)
    (asserts! (registered-after-start-date) ERR_REGISTERED_TOO_SOON)
    (asserts! (is-some (var-get winner1)) (claim-1))
    (asserts! (is-some (var-get winner2)) (claim-2))
    (asserts! (is-some (var-get winner3)) (claim-3))
    ERR_ALL_REWARDS_CLAIMED
  )
)

Functions (6)

FunctionAccessArgs
is-level-25read-only
registered-after-start-dateread-only
claim-1private
claim-2private
claim-3private
claimpublic