Source Code


      ;; 
      ;; Simple contract to lock meme creator bonus for 9 months

      (use-trait faktory-token 'SP3XXMS38VTAWTVPE5682XSBFXPTH7XCPEBTX8AN2.faktory-trait-v1.sip-010-trait)

      (define-constant ERR-NOT-AUTHORIZED (err u305))
      (define-constant ERR-INVALID-TOKEN (err u404))
      (define-constant ERR-ALREADY-CLAIMED (err u401))
      (define-constant ERR-LOCK-PERIOD (err u400))

      (define-constant DEX-DAO 'SPV9K21TBFAK4KNRJXF5DFP8N7W46G4V9RCJDC22.coldstore-faktory-dex)
      (define-constant TOKEN-DAO 'SPV9K21TBFAK4KNRJXF5DFP8N7W46G4V9RCJDC22.coldstore-faktory)

      (define-constant LOCK_PERIOD u38880)
      (define-constant FAKTORY 'SMH8FRN30ERW1SX26NJTJCKTDR3H27NRJ6W75WQE)
      (define-constant ORIGINATOR 'SP218F71JZ4R2ERQDKEBGA1FKVAQNZBM3HK7W8EA7)

      (define-data-var agent-claim-status bool false)
      (define-data-var originator-claim-status bool false)
      (define-data-var deposit-height uint u0)
      (define-data-var agent-amount uint u0)
      (define-data-var originator-amount uint u0)

      ;; Function to deposit rewards (called by DEX contract)
      (define-public (deposit-bonus (new-agent-amount uint) (new-originator-amount uint))
        (begin
          (asserts! (is-eq contract-caller DEX-DAO) ERR-NOT-AUTHORIZED)
          (var-set deposit-height burn-block-height)
          (var-set agent-amount new-agent-amount)
          (var-set originator-amount new-originator-amount)
          (try! (contract-call? 'SPV9K21TBFAK4KNRJXF5DFP8N7W46G4V9RCJDC22.fakfun-core-v2 log-bonus-deposit new-agent-amount new-originator-amount))
          (ok true)
        )
      )

      ;; Function for agent to claim their rewards after lock period
      (define-public (claim-agent-bonus (ft <faktory-token>))
        (let ((amount (var-get agent-amount)))
          (asserts! (is-eq (contract-of ft) TOKEN-DAO) ERR-INVALID-TOKEN)
          (asserts! (not (var-get agent-claim-status)) ERR-ALREADY-CLAIMED)
          (asserts! (>= burn-block-height (+ (var-get deposit-height) LOCK_PERIOD)) ERR-LOCK-PERIOD)
          (try! (as-contract (contract-call? ft transfer amount tx-sender FAKTORY none)))
          (var-set agent-claim-status true)
          (try! (contract-call? 'SPV9K21TBFAK4KNRJXF5DFP8N7W46G4V9RCJDC22.fakfun-core-v2 log-bonus-claim-agent FAKTORY amount))
          (ok true)
        )
      )

      ;; Function for originator to claim their rewards after lock period
      (define-public (claim-originator-bonus (ft <faktory-token>))
        (let ((amount (var-get originator-amount)))
          (asserts! (is-eq (contract-of ft) TOKEN-DAO) ERR-INVALID-TOKEN)
          (asserts! (not (var-get originator-claim-status)) ERR-ALREADY-CLAIMED)
          (asserts! (>= burn-block-height (+ (var-get deposit-height) LOCK_PERIOD)) ERR-LOCK-PERIOD)
          (try! (as-contract (contract-call? ft transfer amount tx-sender ORIGINATOR none)))
          (var-set originator-claim-status true)
          (try! (contract-call? 'SPV9K21TBFAK4KNRJXF5DFP8N7W46G4V9RCJDC22.fakfun-core-v2 log-bonus-claim-originator ORIGINATOR amount))
          (ok true)
        )
      )

      ;; Read-only function to check if rewards are claimable for agent
      (define-read-only (get-agent-status)
        (let
          (
            (claimed (var-get agent-claim-status))
            (deposit-h (var-get deposit-height))
            (amount (var-get agent-amount))
            (unlock-height (+ deposit-h LOCK_PERIOD))
            (claimable (and (> amount u0) (>= burn-block-height unlock-height) (not claimed)))
          )
          {
            deposit-amount: amount,
            deposit-block: deposit-h,
            unlock-block: unlock-height,
            blocks-remaining: (if (>= burn-block-height unlock-height)
                                 u0
                                 (- unlock-height burn-block-height)),
            claimed: claimed,
            claimable: claimable
          }
        )
      )

      ;; Read-only function to check if rewards are claimable for originator
      (define-read-only (get-originator-status)
        (let
          (
            (claimed (var-get originator-claim-status))
            (deposit-h (var-get deposit-height))
            (amount (var-get originator-amount))
            (unlock-height (+ deposit-h LOCK_PERIOD))
            (claimable (and (> amount u0) (>= burn-block-height unlock-height) (not claimed)))
          )
          {
            deposit-amount: amount,
            deposit-block: deposit-h,
            unlock-block: unlock-height,
            blocks-remaining: (if (>= burn-block-height unlock-height)
                                 u0
                                 (- unlock-height burn-block-height)),
            claimed: claimed,
            claimable: claimable
          }
        )
      )

      (define-read-only (get-info)
        {
          lock-period: LOCK_PERIOD,
          agent-address: FAKTORY,
          originator-address: ORIGINATOR,
          deposit-height: (var-get deposit-height)
        }
      )

Functions (6)

FunctionAccessArgs
deposit-bonuspublicnew-agent-amount: uint, new-originator-amount: uint
claim-agent-bonuspublicft: <faktory-token>
claim-originator-bonuspublicft: <faktory-token>
get-agent-statusread-only
get-originator-statusread-only
get-inforead-only