Source Code

;; Caturday Faktory - Saturday LEO Bonus for BOB Winners
;; Awards LEO tokens to BOB daily winners on Saturdays
(define-constant err-unauthorized (err u401))
(define-constant err-not-saturday (err u402))
(define-constant err-already-claimed (err u403))
(define-constant err-no-bob-winner (err u404))
(define-constant err-transfer-failed (err u405))
(define-constant err-epoch-not-drawn (err u406))
(define-constant err-insufficient-balance (err u407))
(define-constant err-already-set (err u408))

(define-constant admin 'SPV9K21TBFAK4KNRJXF5DFP8N7W46G4V9RCJDC22)
(define-constant SPONSOR_1 'SP2VG7S0R4Z8PYNYCAQ04HCBX1MH75VT11VXCWQ6G)
(define-constant SPONSOR_2 'SP2KZ24AM4X9HGTG8314MS4VSY1CVAFH0G1KBZZ1D)

(define-constant SPONSORS (list  SPONSOR_1 SPONSOR_2 admin))

(define-constant BURN-GENESIS-BLOCK u902351)
(define-constant EPOCH-LENGTH u144)
(define-data-var saturday-offset uint u41) 

(define-map saturday-claims uint bool)
(define-map leo-bonus-amounts uint uint) 
(define-data-var default-leo-bonus uint u1000000000) 

(define-read-only (is-saturday-epoch (epoch uint))
    (if (>= epoch (var-get saturday-offset))
        (is-eq (mod (- epoch (var-get saturday-offset)) u7) u0)
        false))

(define-read-only (calc-epoch (block uint))
    (/ (- block BURN-GENESIS-BLOCK) EPOCH-LENGTH))

(define-read-only (current-epoch)
    (calc-epoch burn-block-height))

(define-public (adjust-saturday-offset (new-offset uint))
    (begin
        (asserts! (is-eq tx-sender admin) err-unauthorized)
        (let ((old-offset (var-get saturday-offset)))
            (var-set saturday-offset new-offset)
            (print {
                event: "saturday-offset-adjusted",
                old-offset: old-offset,
                new-offset: new-offset,
                adjusted-by: tx-sender
            })
            (ok true))))

(define-public (set-saturday-leo-bonus (epoch uint) (leo-amount uint))
    (begin
        (asserts! (is-sponsor tx-sender) err-unauthorized)
        (asserts! (is-saturday-epoch epoch) err-not-saturday)
        (asserts! (map-insert leo-bonus-amounts epoch leo-amount) err-already-set)
        (print {
            event: "saturday-leo-bonus-set",
            epoch: epoch,
            leo-amount: leo-amount
        })
        (ok true)))

(define-public (set-default-leo-bonus (leo-amount uint))
    (begin
        (asserts! (is-eq tx-sender admin) err-unauthorized)
        (var-set default-leo-bonus leo-amount)
        (print {
            event: "default-leo-bonus-updated",
            leo-amount: leo-amount
        })
        (ok true)))

(define-public (claim-saturday-leo-bonus)
    (let ((curr-epoch (current-epoch))                    
          (previous-epoch (- curr-epoch u1))              
          (is-current-saturday (is-saturday-epoch curr-epoch))  
          (bob-winner (unwrap! (contract-call? 'SP29D6YMDNAKN1P045T6Z817RTE1AC0JAA99WAX2B.bob-bonus-faktory get-epoch-bonus-recipient previous-epoch) err-no-bob-winner))
          (is-already-claimed (default-to false (map-get? saturday-claims previous-epoch)))
          (leo-bonus (default-to (var-get default-leo-bonus) (map-get? leo-bonus-amounts previous-epoch)))
          (contract-leo-balance (unwrap-panic (contract-call? 'SP1AY6K3PQV5MRT6R4S671NWW2FRVPKM0BR162CT6.leo-token get-balance (as-contract tx-sender)))))
        
        (asserts! is-current-saturday err-not-saturday)
        (asserts! (not is-already-claimed) err-already-claimed)
        (asserts! (>= contract-leo-balance leo-bonus) err-insufficient-balance)
        
        (map-set saturday-claims previous-epoch true)
        
        (try! (as-contract (contract-call? 'SP1AY6K3PQV5MRT6R4S671NWW2FRVPKM0BR162CT6.leo-token transfer 
                           leo-bonus (as-contract tx-sender) bob-winner none)))
        
        (print {
            event: "saturday-leo-bonus-claimed",
            current-epoch: curr-epoch,              
            winner-epoch: previous-epoch,
            bob-winner: bob-winner,
            leo-bonus: leo-bonus,
            remaining-balance: (- contract-leo-balance leo-bonus)
        })
        
        (ok bob-winner)))

(define-public (fund-leo-bonus (leo-amount uint))
    (begin
        (asserts! (> leo-amount u0) err-transfer-failed)
        
        (try! (contract-call? 'SP1AY6K3PQV5MRT6R4S671NWW2FRVPKM0BR162CT6.leo-token transfer 
               leo-amount tx-sender (as-contract tx-sender) none))
        
        (print {
            event: "contract-funded-leo",
            funder: tx-sender,
            leo-amount: leo-amount
        })
        
        (ok true)))

(define-public (withdraw-leo)
    (let ((withdrawer tx-sender))
        (asserts! (is-sponsor tx-sender) err-unauthorized)
        (let ((leo-balance (unwrap-panic (contract-call? 'SP1AY6K3PQV5MRT6R4S671NWW2FRVPKM0BR162CT6.leo-token get-balance (as-contract tx-sender)))))
            
            (if (> leo-balance u0)
                (try! (as-contract (contract-call? 'SP1AY6K3PQV5MRT6R4S671NWW2FRVPKM0BR162CT6.leo-token transfer
                                            leo-balance (as-contract tx-sender) withdrawer none)))
                true)
            
            (print {
                event: "leo-withdrawn",
                withdrawer: tx-sender,
                amount: leo-balance
            })
            
            (ok leo-balance))))

(define-read-only (get-leo-balance)
    (contract-call? 'SP1AY6K3PQV5MRT6R4S671NWW2FRVPKM0BR162CT6.leo-token get-balance (as-contract tx-sender)))

(define-read-only (get-saturday-offset)
    (var-get saturday-offset))

(define-read-only (get-saturday-claim-status (epoch uint))
    (default-to false (map-get? saturday-claims epoch)))

(define-read-only (get-saturday-leo-bonus (epoch uint))
    (default-to (var-get default-leo-bonus) (map-get? leo-bonus-amounts epoch)))

(define-read-only (get-default-leo-bonus)
    (var-get default-leo-bonus))


(define-read-only (get-current-saturday-info)
    (let ((curr-epoch (current-epoch))          
          (previous-epoch (- curr-epoch u1))     
          (is-current-saturday (is-saturday-epoch curr-epoch))  
          (leo-bonus (get-saturday-leo-bonus previous-epoch))
          (bob-winner (default-to 'SP000000000000000000002Q6VF78 (contract-call? 'SP29D6YMDNAKN1P045T6Z817RTE1AC0JAA99WAX2B.bob-bonus-faktory get-epoch-bonus-recipient previous-epoch))))
        {
            current-epoch: curr-epoch,           
            previous-epoch: previous-epoch,
            is-current-saturday: is-current-saturday,
            leo-bonus: leo-bonus,
            previous-epoch-bob-winner: bob-winner,
            contract-leo-balance: (unwrap-panic (get-leo-balance))
        }))

(define-read-only (is-sponsor (who principal))
  (is-some (index-of SPONSORS who))
)

Functions (16)

FunctionAccessArgs
is-saturday-epochread-onlyepoch: uint
calc-epochread-onlyblock: uint
current-epochread-only
adjust-saturday-offsetpublicnew-offset: uint
set-saturday-leo-bonuspublicepoch: uint, leo-amount: uint
set-default-leo-bonuspublicleo-amount: uint
claim-saturday-leo-bonuspublic
fund-leo-bonuspublicleo-amount: uint
withdraw-leopublic
get-leo-balanceread-only
get-saturday-offsetread-only
get-saturday-claim-statusread-onlyepoch: uint
get-saturday-leo-bonusread-onlyepoch: uint
get-default-leo-bonusread-only
get-current-saturday-inforead-only
is-sponsorread-onlywho: principal