Source Code

;; @contract HQ
;; @version 1

;;-------------------------------------
;; Constants
;;-------------------------------------

(define-constant ERR_NOT_OWNER (err u1001))
(define-constant ERR_NOT_ADMIN (err u1002))
(define-constant ERR_NOT_GUARDIAN (err u1003))
(define-constant ERR_CONTRACTS_DISABLED (err u1004))
(define-constant ERR_MINTING_DISABLED (err u1005))
(define-constant ERR_INACTIVE_CONTRACT (err u1006))
(define-constant ERR_NO_ENTRY (err u1007))
(define-constant ERR_ACTIVATION (err u1008))

(define-constant activation-delay u1)

;;-------------------------------------
;; Variables
;;-------------------------------------

(define-data-var contracts-enabled bool true)
(define-data-var minting-enabled bool true)

(define-data-var owner principal tx-sender)

(define-data-var next-owner
  {
    address: principal,
    burn-block-height: uint
  }
  {
    address: tx-sender,
    burn-block-height: burn-block-height
  }
)

;;-------------------------------------
;; Maps
;;-------------------------------------

(define-map admins
  {
    address: principal
  }
  {
    active: bool,
    burn-block-height: (optional uint)
  }
)

(define-map guardians
  {
    address: principal
  }
  {
    active: bool,
  }
)

(define-map minting-contracts 
  {
    address: principal
  }
  {
    active: bool,
    burn-block-height: (optional uint)
  }
)

(define-map contracts
  {
    address: principal
  }
  {
    active: bool,
  }
)

;;-------------------------------------
;; Getters
;;-------------------------------------

(define-read-only (get-contracts-enabled)
  (var-get contracts-enabled)
)
(define-read-only (get-minting-enabled)
  (var-get minting-enabled)
)

(define-read-only (get-owner)
  (var-get owner)
)

(define-read-only (get-next-owner)
  (var-get next-owner)
)

(define-read-only (get-admin (address principal))
  (default-to 
    { active: false, burn-block-height: none }
    (map-get? admins { address: address })
  )
)

(define-read-only (get-guardian (address principal))
  (get active
    (default-to
      { active: false }
      (map-get? guardians { address: address })
    )
  )
)

(define-read-only (get-minting-contract (address principal))
  (default-to
    { active: false, burn-block-height: none }
    (map-get? minting-contracts { address: address })
  )
)

(define-read-only (get-contract-active (address principal))
  (get active
    (default-to
      { active: false }
      (map-get? contracts { address: address })
    )
  )
)

;;-------------------------------------
;; Checks
;;-------------------------------------

(define-read-only (check-is-enabled)
  (ok (asserts! (var-get contracts-enabled) ERR_CONTRACTS_DISABLED))
)

(define-read-only (check-is-owner (contract principal))
  (ok (asserts! (is-eq contract (get-owner)) ERR_NOT_OWNER))
)

(define-read-only (check-is-admin (contract principal))
  (ok (asserts! (get active (get-admin contract)) ERR_NOT_ADMIN))
)

(define-read-only (check-is-guardian (contract principal))
  (ok (asserts! (get-guardian contract) ERR_NOT_GUARDIAN))
)

(define-read-only (check-is-minting-contract (contract principal))
  (begin
    (asserts! (get-minting-enabled) ERR_MINTING_DISABLED)
    (ok (asserts! (get active (get-minting-contract contract)) ERR_INACTIVE_CONTRACT))
  )
)

(define-read-only (check-is-protocol (contract principal))
  (ok (asserts! (get-contract-active contract) ERR_INACTIVE_CONTRACT))
)

;;-------------------------------------
;; Set
;;-------------------------------------

(define-public (set-contracts-enabled (enabled bool))
  (begin
    (try! (check-is-owner tx-sender))
    (ok (var-set contracts-enabled enabled))
  )
)

(define-public (disable-contracts)
  (begin
    (try! (check-is-guardian tx-sender))
    (ok (var-set contracts-enabled false))
  )
)

(define-public (set-minting-enabled (enabled bool))
  (begin
    (try! (check-is-owner tx-sender))
    (ok (var-set minting-enabled enabled))
  )
)

(define-public (disable-minting)
  (begin
    (try! (check-is-guardian tx-sender))
    (ok (var-set minting-enabled false))
  )
)

(define-public (request-owner-update (address principal))
  (begin
    (try! (check-is-owner tx-sender))
    (ok (var-set next-owner { address: address, burn-block-height: burn-block-height }))
  )
)

(define-public (activate-next-owner)
  (begin
    (try! (check-is-owner tx-sender))
    (asserts! (>= burn-block-height (+ (get burn-block-height (get-next-owner)) activation-delay)) ERR_ACTIVATION)
    (ok (var-set owner (get address (get-next-owner))))
  )
)

(define-public (request-admin-update (address principal))
  (begin
    (try! (check-is-owner tx-sender))
    (ok (map-set admins { address: address } { active: false, burn-block-height: (some burn-block-height) }))
  )
)

(define-public (remove-admin (address principal))
  (begin
    (try! (check-is-owner tx-sender))
    (ok (map-delete admins { address: address }))
  )
)

(define-public (activate-admin (address principal))
  (let (
    (admin-entry (get-admin address))
    (admin-burn-block-height (unwrap! (get burn-block-height admin-entry) ERR_NO_ENTRY))
  )
    (asserts! (or (is-eq tx-sender (get-owner)) (is-eq address tx-sender)) ERR_NOT_OWNER)
    (asserts! (>= burn-block-height (+ admin-burn-block-height activation-delay)) ERR_ACTIVATION)
    (ok (map-set admins { address: address } (merge admin-entry { active: true })))
  )
)

(define-public (set-guardian (address principal) (active bool))
  (begin
    (try! (check-is-admin tx-sender))
    (ok (map-set guardians { address: address } { active: active }))
  )
)

(define-public (request-minting-contract-update (address principal))
  (begin
    (try! (check-is-owner tx-sender))
    (ok (map-set minting-contracts { address: address } { active: false, burn-block-height: (some burn-block-height) }))
  )
)

(define-public (remove-minting-contract (address principal))
  (begin
    (try! (check-is-owner tx-sender))
    (ok (map-delete minting-contracts { address: address }))
  )
)

(define-public (activate-minting-contract (address principal))
  (let (
    (contract-entry (get-minting-contract address))
    (contract-burn-block-height (unwrap! (get burn-block-height contract-entry) ERR_NO_ENTRY))
  )
    (try! (check-is-owner tx-sender))
    (asserts! (>= burn-block-height (+ contract-burn-block-height activation-delay)) ERR_ACTIVATION)
    (ok (map-set minting-contracts {address: address} (merge contract-entry { active: true})))
  )
)

(define-public (set-contract-active (address principal) (active bool))
  (begin
    (try! (check-is-admin tx-sender))
    (ok (map-set contracts { address: address } { active: active }))
  )
)

;;-------------------------------------
;; Init
;;-------------------------------------

(map-set admins { address: tx-sender } { active: true, burn-block-height: none })
(map-set minting-contracts { address: .test-minting-otc-v1 } { active: true, burn-block-height: (some burn-block-height) })
(map-set minting-contracts { address: .test-minting-otc-v1 } { active: true, burn-block-height: (some burn-block-height) })
(map-set minting-contracts { address: .test-controller-v1 } { active: true, burn-block-height: (some burn-block-height) })
(map-set minting-contracts { address: .test-emergency-recover-v1 } { active: true, burn-block-height: (some burn-block-height) })
(map-set minting-contracts { address: .test-staking-v1-1 } { active: true, burn-block-height: (some burn-block-height) })

Functions (28)

FunctionAccessArgs
check-is-protocolread-onlycontract: principal
get-contracts-enabledread-only
get-minting-enabledread-only
get-ownerread-only
get-next-ownerread-only
get-adminread-onlyaddress: principal
get-guardianread-onlyaddress: principal
get-minting-contractread-onlyaddress: principal
get-contract-activeread-onlyaddress: principal
check-is-enabledread-only
check-is-ownerread-onlycontract: principal
check-is-adminread-onlycontract: principal
check-is-guardianread-onlycontract: principal
check-is-minting-contractread-onlycontract: principal
set-contracts-enabledpublicenabled: bool
disable-contractspublic
set-minting-enabledpublicenabled: bool
disable-mintingpublic
request-owner-updatepublicaddress: principal
activate-next-ownerpublic
request-admin-updatepublicaddress: principal
remove-adminpublicaddress: principal
activate-adminpublicaddress: principal
set-guardianpublicaddress: principal, active: bool
request-minting-contract-updatepublicaddress: principal
remove-minting-contractpublicaddress: principal
activate-minting-contractpublicaddress: principal
set-contract-activepublicaddress: principal, active: bool