;; title: sample-dapp
;; version:
;; summary:
;; description:
;; traits
(use-trait connection-contract .connection-trait.connection-trait)
;;
;; constants
(define-constant err-not-admin (err u100))
(define-constant err-not-connection-contract (err u101))
;; public functions
(define-public (init (connection principal))
(begin
(try! (is-admin))
(contract-call? .sample-dapp-state set-connection-impl connection)
))
(define-public (set-sample-dapp-impl (who principal))
(begin
(try! (is-admin))
(contract-call? .sample-dapp-state set-sample-dapp-impl who)
))
(define-public (set-admin (who principal))
(begin
(try! (is-admin))
(contract-call? .sample-dapp-state set-admin who)
))
(define-public (send-message (dst-chain-id uint) (dst-address (buff 256)) (payload (buff 2048)) (connection <connection-contract>))
(let (
(current-connection-contract (contract-call? .sample-dapp-state get-connection-impl))
)
(asserts! (is-eq (contract-of connection) current-connection-contract) err-not-connection-contract)
(unwrap-panic (contract-call? connection send-message dst-chain-id dst-address payload))
(ok true)
)
)
(define-public (receive-message (src-chain-id uint) (src-address (buff 256)) (connection-sn uint) (payload (buff 2048)) (signatures (list 25 (buff 65))) (connection <connection-contract>))
(let (
(current-connection-contract (contract-call? .sample-dapp-state get-connection-impl))
)
(asserts! (is-eq (contract-of connection) current-connection-contract) err-not-connection-contract)
(unwrap-panic (contract-call? connection verify-message src-chain-id src-address connection-sn payload signatures))
(emit-receive-message-event src-chain-id src-address connection-sn payload)
(ok true)
)
)
;; read only functions
(define-read-only (is-admin)
(ok (asserts! (is-eq contract-caller (contract-call? .sample-dapp-state get-admin)) err-not-admin))
)
;; events
(define-private (emit-receive-message-event (src-chain-id uint) (src-address (buff 256)) (nonce uint) (payload (buff 2048)))
(print
{
event: "MessageReceived",
src-chain-id: src-chain-id,
src-address: src-address,
nonce: nonce,
payload: payload
}
)
)