;; SatGuard Staking Core
(define-constant err-amt (err u500))
(define-constant err-bal (err u501))
(define-constant err-nf (err u502))
(define-data-var total-staked uint u0)
(define-map stakes {who: principal} {amt: uint,sa: uint})
(define-read-only (get-stake (who principal)) (default-to {amt: u0,sa: u0} (map-get? stakes {who: who})))
(define-read-only (get-total-staked) (var-get total-staked))
(define-public (stake (amt uint))
(let ((bal (get amt (contract-call? .sg-token-core get-balance tx-sender)))
(ex (get amt (get-stake tx-sender))))
(asserts! (> amt u0) err-amt)
(asserts! (>= bal amt) err-bal)
(try! (contract-call? .sg-token-core burn amt))
(map-set stakes {who: tx-sender} {amt: (+ ex amt),sa: block-height})
(var-set total-staked (+ (var-get total-staked) amt))
(print {e: "staked",who: tx-sender,amt: amt})
(ok true)))
(define-public (unstake (amt uint))
(let ((ex (get amt (get-stake tx-sender))))
(asserts! (> amt u0) err-amt)
(asserts! (>= ex amt) err-bal)
(try! (contract-call? .sg-token-core mint amt tx-sender))
(map-set stakes {who: tx-sender} {amt: (- ex amt),sa: block-height})
(var-set total-staked (- (var-get total-staked) amt))
(print {e: "unstaked",who: tx-sender,amt: amt})
(ok true)))