;; SatGuard Staking Lock
(define-constant err-nf (err u520))
(define-constant err-locked (err u521))
(define-constant err-owner (err u522))
(define-constant err-amt (err u523))
(define-data-var admin principal tx-sender)
(define-map locks {who: principal} {amt: uint,until: uint,mult: uint})
(define-read-only (get-lock-info (who principal)) (map-get? locks {who: who}))
(define-public (lock-stake (duration uint))
(let ((s (contract-call? .sg-staking-core get-stake tx-sender))
(sa (get amt s))
(mult (if (>= duration u12960) u3 (if (>= duration u8640) u2 u1))))
(asserts! (> sa u0) err-amt)
(asserts! (is-none (map-get? locks {who: tx-sender})) err-locked)
(map-set locks {who: tx-sender} {amt: sa,until: (+ block-height duration),mult: mult})
(print {e: "stake-locked",who: tx-sender,until: (+ block-height duration),mult: mult})
(ok mult)))
(define-read-only (check-unlock (who principal))
(let ((lk (map-get? locks {who: who})))
(match lk
l (ok (>= block-height (get until l)))
(ok true))))
(define-public (unlock-stake)
(let ((lk (unwrap! (map-get? locks {who: tx-sender}) err-nf)))
(asserts! (>= block-height (get until lk)) err-locked)
(map-delete locks {who: tx-sender})
(print {e: "stake-unlocked",who: tx-sender})
(ok true)))