;; title: intent-filler-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-intent-filler (err u3000))
(define-constant err-not-admin (err u3001))
(define-constant err-not-standard-principal (err u3002))
(define-constant err-not-proposed-admin (err u3003))
;;
;; data vars
(define-data-var admin principal tx-sender)
(define-data-var proposed-admin (optional principal) none)
(define-data-var intent-filler-impl principal tx-sender)
(define-data-var connection-impl principal tx-sender)
(define-data-var hub-chain-id uint u0)
(define-data-var hub-intent (optional (buff 256)) none)
(define-data-var next bool true)
(define-map fills (buff 32) bool)
(define-map fillers (buff 32) principal)
;;
;; public functions
(define-public (set-intent-filler-impl (who principal))
(begin
(try! (is-dapp))
(try! (is-standard-principal who))
(ok (var-set intent-filler-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-hub-chain-id (id uint))
(begin
(try! (is-dapp))
(ok (var-set hub-chain-id id))))
(define-public (set-hub-intent (intents (buff 256)))
(begin
(try! (is-dapp))
(ok (var-set hub-intent (some intents)))))
(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))
(begin
(try! (is-dapp))
(match token ft-token
(try! (contract-call? ft-token transfer amount tx-sender current-contract none))
(try! (stx-transfer? amount tx-sender current-contract))
)
(ok true)
))
(define-public (withdraw (token (optional <ft-trait>)) (amount uint) (receiver principal))
(begin
(try! (is-dapp))
(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)
))
;; (restrict-assets? tx-sender
;; ((with-ft (contract-of token-trait) "stackaroo" u50))
;; (try! (contract-call? token-trait transfer u100 tx-sender 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM none))
;; )
(define-public (set-fill (filler (buff 32)) (filled bool))
(begin
(try! (is-dapp))
(ok (map-set fills filler filled))
))
(define-public (set-filler (filler (buff 32)) (who principal))
(begin
(try! (is-dapp))
(ok (map-set fillers filler who))
))
(define-public (delete-fill (filler (buff 32)))
(begin
(try! (is-dapp))
(ok (map-delete fills filler))
))
(define-public (delete-filler (filler (buff 32)))
(begin
(try! (is-dapp))
(ok (map-delete fillers filler))
))
;; connection functions
(define-public (send-message (dst-chain-id uint) (dst-address (buff 256)) (message (buff 4096)) (connection <connection-contract>))
(begin
(try! (is-dapp))
(ok (try! (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))
(ok (try! (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 intent-filler-impl)) err-not-intent-filler))
)
(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-intent) (var-get hub-intent))
(define-read-only (get-intent-filler-impl) (var-get intent-filler-impl))
(define-read-only (is-hash-filled (hash (buff 32))) (match (map-get? fills hash) filled filled false))
(define-read-only (get-filler (hash (buff 32))) (map-get? fillers hash))
(define-read-only (get-impl-params)
{
impl: (var-get intent-filler-impl),
next: (var-get next)
}
)