Source Code


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



Functions (24)

FunctionAccessArgs
set-asset-manager-implpublicwho: principal
propose-adminpublicnew-admin: principal
accept-adminpublic
set-connection-implpublicconnection: principal
set-rate-limit-implpublicwho: principal
set-hub-chain-idpublicid: uint
set-hub-asset-managerpublicasset-manager: (buff 256
set-nextpublicn: bool
depositpublictoken: (optional <ft-trait>
withdrawpublictoken: (optional <ft-trait>
get-token-balancepublictoken: (optional <ft-trait>
send-messagepublicdst-chain-id: uint, dst-address: (buff 256
verify-messagepublicsrc-chain-id: uint, src-address: (buff 256
is-dappread-only
is-standard-principalread-onlywho: principal
get-adminread-only
get-connection-implread-only
get-hub-chain-idread-only
get-hub-asset-managerread-only
get-token-bankread-only
get-native-balanceread-only
get-rate-limit-implread-only
get-asset-manager-implread-only
get-impl-paramsread-only