;; 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)
}
)