;; title: asset-manager-state
;; version:
;; summary:
;; description:
(use-trait ft-trait .sip-010-trait.sip-010-trait)
(use-trait connection-contract .connection-trait.connection-trait)
;; constants
(define-constant err-not-asset-manager (err u2000))
(define-constant err-not-admin (err u2001))
(define-constant err-not-standard-principal (err u2002))
(define-constant err-not-proposed-admin (err u2003))
;;
;; data vars
(define-data-var asset-manager-impl principal tx-sender)
(define-data-var admin principal tx-sender)
(define-data-var proposed-admin (optional principal) none)
(define-data-var connection-impl principal tx-sender)
(define-data-var rate-limit-impl principal tx-sender)
(define-data-var hub-chain-id uint u0)
(define-data-var hub-asset-manager (optional (buff 256)) none)
(define-data-var next bool true)
;;
;; public functions
(define-public (set-asset-manager-impl (who principal))
(begin
(try! (is-dapp))
(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-dapp))
(try! (is-standard-principal connection))
(ok (var-set connection-impl connection))))
(define-public (set-rate-limit-impl (who principal))
(begin
(try! (is-dapp))
(try! (is-standard-principal who))
(ok (var-set rate-limit-impl who))))
(define-public (set-hub-chain-id (id uint))
(begin
(try! (is-dapp))
(ok (var-set hub-chain-id id))))
(define-public (set-hub-asset-manager (asset-manager (buff 256)))
(begin
(try! (is-dapp))
(ok (var-set hub-asset-manager (some asset-manager)))))
(define-public (set-next (n bool))
(begin
(asserts! (is-eq contract-caller (var-get admin)) err-not-admin)
(ok (var-set next n))))
(define-public (deposit (token (optional <ft-trait>)) (amount uint) (sender principal))
(begin
(try! (is-dapp))
(match token ft-token
(try! (contract-call? ft-token transfer amount sender current-contract none))
(try! (stx-transfer? amount sender current-contract))
)
(ok true)
))
(define-public (withdraw (token (optional <ft-trait>)) (amount uint) (receiver principal))
(begin
(try! (is-dapp))
(try! (is-standard-principal receiver))
(match token
;; if token trait is passed
ft-token
(try! (as-contract? ((with-ft (contract-of ft-token) "*" amount))
(try! (contract-call? ft-token transfer amount current-contract receiver none))
))
;; if no token trait
(try! (as-contract? ((with-stx amount))
(try! (stx-transfer? amount current-contract receiver))
))
)
(ok true)
))
(define-public (get-token-balance (token (optional <ft-trait>)))
(let (
(balance (match token ft-token
(unwrap-panic (contract-call? ft-token get-balance current-contract))
(stx-get-balance current-contract)))
)
(ok balance)
)
)
;; connection functions
(define-public (send-message (dst-chain-id uint) (dst-address (buff 256)) (message (buff 4096)) (connection <connection-contract>))
(begin
(try! (is-dapp))
(contract-call? connection send-message dst-chain-id dst-address message)
))
(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-dapp))
(contract-call? connection verify-message src-chain-id src-address connection-sn payload signatures)
))
;;
;; read only functions
(define-read-only (is-dapp)
(ok (asserts! (is-eq contract-caller (var-get asset-manager-impl)) err-not-asset-manager))
)
(define-read-only (is-standard-principal (who principal))
(ok (asserts! (is-standard who) err-not-standard-principal))
)
(define-read-only (get-admin) (var-get admin))
(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-asset-manager) (var-get hub-asset-manager))
(define-read-only (get-token-bank) current-contract)
(define-read-only (get-native-balance) (stx-get-balance current-contract))
(define-read-only (get-rate-limit-impl) (var-get rate-limit-impl))
(define-read-only (get-asset-manager-impl) (var-get asset-manager-impl))
(define-read-only (get-impl-params)
{
impl: (var-get asset-manager-impl),
rate-limit: (var-get rate-limit-impl),
next: (var-get next)
}
)