Source Code

(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))
(define-constant err-insufficient-balance (err u101))
(define-constant err-invalid-amount (err u102))

(define-fungible-token liquid-stx)

(define-data-var total-staked uint u0)
(define-data-var total-rewards uint u0)
(define-data-var exchange-rate uint u1000000)

(define-map staker-info principal {staked: uint, rewards: uint})

(define-read-only (get-balance (account principal))
  (ok (ft-get-balance liquid-stx account)))

(define-read-only (get-total-staked)
  (ok (var-get total-staked)))

(define-read-only (get-exchange-rate)
  (ok (var-get exchange-rate)))

(define-read-only (get-staker-info (staker principal))
  (ok (map-get? staker-info staker)))

(define-public (stake (amount uint))
  (let ((lstx-amount (/ (* amount u1000000) (var-get exchange-rate))))
    (asserts! (> amount u0) err-invalid-amount)
    (try! (stx-transfer? amount tx-sender (as-contract tx-sender)))
    (try! (ft-mint? liquid-stx lstx-amount tx-sender))
    (var-set total-staked (+ (var-get total-staked) amount))
    (ok lstx-amount)))

(define-public (unstake (lstx-amount uint))
  (let ((stx-amount (/ (* lstx-amount (var-get exchange-rate)) u1000000)))
    (asserts! (> lstx-amount u0) err-invalid-amount)
    (try! (ft-burn? liquid-stx lstx-amount tx-sender))
    (try! (stx-transfer? stx-amount tx-sender (as-contract tx-sender)))
    (var-set total-staked (- (var-get total-staked) stx-amount))
    (ok stx-amount)))

(define-public (distribute-rewards (amount uint))
  (begin
    (asserts! (is-eq tx-sender contract-owner) err-owner-only)
    (var-set total-rewards (+ (var-get total-rewards) amount))
    (var-set exchange-rate
      (/ (* (+ (var-get total-staked) (var-get total-rewards)) u1000000)
         (var-get total-staked)))
    (ok true)))

(define-public (claim-rewards)
  (let ((info (default-to {staked: u0, rewards: u0} (map-get? staker-info tx-sender))))
    (asserts! (> (get rewards info) u0) err-insufficient-balance)
    (try! (as-contract (stx-transfer? (get rewards info) tx-sender tx-sender)))
    (ok (map-set staker-info tx-sender (merge info {rewards: u0})))))

Functions (8)

FunctionAccessArgs
get-balanceread-onlyaccount: principal
get-total-stakedread-only
get-exchange-rateread-only
get-staker-inforead-onlystaker: principal
stakepublicamount: uint
unstakepubliclstx-amount: uint
distribute-rewardspublicamount: uint
claim-rewardspublic