Source Code

;; title: smart-wallet-standard
;; version:
;; summary:
;; description:
(use-trait extension-trait 'SP28AJ75697ZM2A8819A5WTTZSZZWNXN4JB3JQRC1.extension-trait.extension-trait)

(use-trait sip-010-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait)
(use-trait sip-009-trait 'SP2PABAF9FTAJYNFZH93XENAJ8FVY99RRM50D2JG9.nft-trait.nft-trait)

(define-constant err-unauthorised (err u4001))
(define-constant err-forbidden (err u4003))
(define-fungible-token ect )
(define-read-only (is-admin-calling)
	(ok (asserts! (default-to false (map-get? admins contract-caller)) err-unauthorised))
)

;;
;; calls with context switching
;;
(define-public (stx-transfer (amount uint) (recipient principal) (memo (optional (buff 34))))
	(begin
		(try! (is-admin-calling))
		(print {a: "stx-transfer", payload: {amount: amount, recipient: recipient, memo: memo}})
		(as-contract (match memo
			to-print (stx-transfer-memo? amount tx-sender recipient to-print)
			(stx-transfer? amount tx-sender recipient)
		))
	)
)

(define-public (extension-call (extension <extension-trait>) (payload (buff 2048)))
	(begin
		(try! (is-admin-calling))
		(try! (ft-mint? ect u1 (as-contract tx-sender)))
		(try! (ft-burn? ect u1 (as-contract tx-sender)))
		(print {a: "extension-call", payload: {extension: extension, payload: payload}})
		(as-contract (contract-call? extension call payload))
	)
)

;;
;; calls without context switching
;;

(define-public (sip010-transfer (amount uint) (recipient principal) (memo (optional (buff 34))) (sip010 <sip-010-trait>))
	(begin
		(try! (is-admin-calling))
		(print {a: "sip010-transfer", payload: {amount: amount, recipient: recipient, memo: memo, sip010: sip010}})
		(contract-call? sip010 transfer amount (as-contract tx-sender) recipient memo)
	)
)


(define-public (sip009-transfer (nft-id uint) (recipient principal) (sip009 <sip-009-trait>))
	(begin
		(try! (is-admin-calling))
		(print {a: "sip009-transfer", payload: {nft-id: nft-id, recipient: recipient, sip009: sip009}})
		(contract-call? sip009 transfer nft-id (as-contract tx-sender) recipient)
	)
)

;;
;; admin functions
;;
(define-map admins principal bool)

(define-public (enable-admin (admin principal) (enabled bool))
	(begin
		(try! (is-admin-calling))
		(asserts! (not (is-eq admin contract-caller)) err-forbidden)
		(print {a: "enable-admin", payload: {admin: admin, enabled: enabled}})
		(ok (map-set admins admin enabled))
	)
)

(define-public (transfer-wallet (new-admin principal))
	(begin
		(try! (is-admin-calling))
		(try! (enable-admin new-admin true))
		(try! (as-contract (enable-admin contract-caller false)))
		(print {a: "transfer-wallet", payload: {new-admin: new-admin}})
		(ok true)
	)
)

;; init
(map-set admins tx-sender true)
(map-set admins (as-contract tx-sender) true)

Functions (7)

FunctionAccessArgs
is-admin-callingread-only
stx-transferpublicamount: uint, recipient: principal, memo: (optional (buff 34
extension-callpublicextension: <extension-trait>, payload: (buff 2048
sip010-transferpublicamount: uint, recipient: principal, memo: (optional (buff 34
sip009-transferpublicnft-id: uint, recipient: principal, sip009: <sip-009-trait>
enable-adminpublicadmin: principal, enabled: bool
transfer-walletpublicnew-admin: principal