;; SatGuard Governance Timelock
(define-constant admin tx-sender)
(define-data-var timelock-delay uint u144)
(define-map queued-actions uint {action: (string-utf8 32), execute-after: uint, executed: bool})
(define-data-var action-count uint u0)
(define-read-only (get-delay) (var-get timelock-delay))
(define-read-only (get-action (id uint)) (map-get? queued-actions id))
(define-public (queue-action (action (string-utf8 32)))
(let ((id (var-get action-count)))
(asserts! (is-eq tx-sender admin) (err u401))
(map-set queued-actions id {action: action, execute-after: (+ block-height (var-get timelock-delay)), executed: false})
(var-set action-count (+ id u1)) (ok id)))
(define-public (execute-action (id uint))
(let ((a (unwrap! (map-get? queued-actions id) (err u404))))
(asserts! (is-eq tx-sender admin) (err u401))
(asserts! (>= block-height (get execute-after a)) (err u425))
(asserts! (not (get executed a)) (err u409))
(map-set queued-actions id (merge a {executed: true})) (ok true)))
(define-public (set-delay (d uint))
(begin (asserts! (is-eq tx-sender admin) (err u401)) (var-set timelock-delay d) (ok true)))