Source Code


;; title: rate-limit-state
;; version:
;; summary:
;; description:

;; traits
(use-trait connection-contract .connection-trait.connection-trait)

;; constants
(define-constant err-not-rate-limit (err u4000))
(define-constant err-not-admin-or-rate-limit (err u4001))
(define-constant err-not-admin (err u4002))
(define-constant err-not-standard-principal (err u4003))
(define-constant err-not-proposed-admin (err u4004))
;;

;; data vars
(define-data-var rate-limit-impl principal tx-sender)
(define-data-var admin principal tx-sender)
(define-data-var proposed-admin (optional principal) none)
(define-data-var paused bool false)

;; contracts
(define-data-var connection-impl principal tx-sender)
(define-data-var asset-manager-impl principal tx-sender)

;; hub data
(define-data-var hub-chain-id uint u0)
(define-data-var hub-manager (buff 256) 0x)
(define-data-var hub-admin (buff 33) 0x)
(define-data-var hub-signers (list 10 (buff 33)) (list))

(define-data-var next bool false)

;; data maps
(define-map limit-map principal {
  rate-per-second: uint,
  last-updated: uint,
  available: uint,
  max-available: uint
})
;;

;; admin functions

(define-public (set-rate-limit-impl (who principal))
    (begin
        (try! (is-admin-or-rate-limit))
        (try! (is-standard-principal who))
        (ok (var-set rate-limit-impl who))
    )
)

(define-public (set-asset-manager-impl (who principal))
    (begin
        (try! (is-admin-or-rate-limit))
        (try! (is-standard-principal who))
        (ok (var-set asset-manager-impl who))
    )
)
(define-public (propose-admin (new-admin principal))
    (begin
        (asserts! (is-eq contract-caller (var-get admin)) err-not-admin)
        (asserts! (is-standard new-admin) err-not-standard-principal)
        (ok (var-set proposed-admin (some new-admin)))
))

(define-public (accept-admin)
    (let
        ((new-admin (unwrap! (var-get proposed-admin) err-not-proposed-admin)))
        (asserts! (is-eq contract-caller new-admin) err-not-proposed-admin)
        (var-set admin new-admin)
        (ok (var-set proposed-admin none))
    )
)
(define-public (set-connection-impl (connection principal))
  (begin
    (try! (is-admin-or-rate-limit))
    (try! (is-standard-principal connection))
    (ok (var-set connection-impl connection))))

(define-public (set-hub-configs (id uint) (manager (buff 256)))
    (begin
        (try! (is-rate-limit))
        (var-set hub-chain-id id)
        (ok (var-set hub-manager manager))
    )
)

;; hub admin functions
(define-public (set-hub-admin (h-admin (buff 33)))
    (begin
        (try! (is-rate-limit))
        (ok (var-set hub-admin h-admin))
    )
)

(define-public (set-hub-signers (signers (list 10 (buff 33))))
  (begin
    (try! (is-rate-limit))
    (ok (var-set hub-signers signers))
  )
)

;; pause function
(define-public (pause)
  (begin
    (try! (is-admin-or-rate-limit))
    (ok (var-set paused true))
  )
)

(define-public (unpause)
  (begin
    (try! (is-admin-or-rate-limit))
    (ok (var-set paused false))
  )
)

;; rate limit functions
(define-public (set-rate-limit (token principal) (rate-per-second uint) (available uint) (last-updated uint) (max-available uint))
  (begin
    (try! (is-rate-limit))
    (ok (map-set limit-map token { rate-per-second: rate-per-second, available: available, last-updated: last-updated, max-available: max-available }))
  )
)

(define-public (set-next (n bool))
  (begin
    (asserts! (is-eq contract-caller (var-get admin)) err-not-admin)
    (ok (var-set next n))))


(define-read-only (is-hub-admin-or-signer (pub-key (buff 33)))
  (let (
        (h-admin (var-get hub-admin))
        (signers (var-get hub-signers))
        )
    (if (is-eq pub-key h-admin)
      true
      (match (index-of signers pub-key)
        index true
        false
      )
    )
  )
)

(define-read-only (is-hub-admin (pub-key (buff 33)))
  (is-eq pub-key (var-get hub-admin))
)


;; connection functions
(define-public (verify-message (src-chain-id uint) (src-address (buff 256)) (connection-sn uint) (payload (buff 4096)) (signatures (list 50 (buff 65))) (connection <connection-contract>))
  (begin
    (try! (is-rate-limit))
    (contract-call? connection verify-message src-chain-id src-address connection-sn payload signatures)
))

;; read only functions
(define-read-only (is-rate-limit)
    (ok (asserts! (is-eq contract-caller (var-get rate-limit-impl)) err-not-rate-limit))
)

(define-read-only (is-standard-principal (who principal))
  (ok (asserts! (is-standard who) err-not-standard-principal))
)

(define-read-only (is-admin-or-rate-limit)
    (ok (asserts! (or (is-eq contract-caller (var-get admin))
            (is-eq contract-caller (var-get rate-limit-impl))) err-not-admin-or-rate-limit))
)

(define-read-only (get-admin) (var-get admin))
(define-read-only (get-asset-manager-impl) (var-get asset-manager-impl))
(define-read-only (get-connection-impl) (var-get connection-impl))
(define-read-only (get-hub-chain-id) (var-get hub-chain-id))
(define-read-only (get-hub-manager) (var-get hub-manager))
(define-read-only (get-hub-admin) (var-get hub-admin))
(define-read-only (get-hub-signers) (var-get hub-signers))
(define-read-only (get-rate-limit-impl) (var-get rate-limit-impl))
(define-read-only (is-paused) (var-get paused))
(define-read-only (get-rate-limit (token principal))
  (default-to
    {
      rate-per-second: u0,
      available: u0,
      last-updated: u0,
      max-available: u0
    }
    (map-get? limit-map token)
))

(define-read-only (get-impl-params) 
  {
    impl: (var-get rate-limit-impl),
    next: (var-get next)
  }
)


Functions (29)

FunctionAccessArgs
get-impl-paramsread-only
set-rate-limit-implpublicwho: principal
set-asset-manager-implpublicwho: principal
propose-adminpublicnew-admin: principal
accept-adminpublic
set-connection-implpublicconnection: principal
set-hub-configspublicid: uint, manager: (buff 256
set-hub-adminpublich-admin: (buff 33
set-hub-signerspublicsigners: (list 10 (buff 33
pausepublic
unpausepublic
set-rate-limitpublictoken: principal, rate-per-second: uint, available: uint, last-updated: uint, max-available: uint
set-nextpublicn: bool
is-hub-admin-or-signerread-onlypub-key: (buff 33
is-hub-adminread-onlypub-key: (buff 33
verify-messagepublicsrc-chain-id: uint, src-address: (buff 256
is-rate-limitread-only
is-standard-principalread-onlywho: principal
is-admin-or-rate-limitread-only
get-adminread-only
get-asset-manager-implread-only
get-connection-implread-only
get-hub-chain-idread-only
get-hub-managerread-only
get-hub-adminread-only
get-hub-signersread-only
get-rate-limit-implread-only
is-pausedread-only
get-rate-limitread-onlytoken: principal