Source Code

(use-trait ft-trait 'SP3FBR2AGK5H9QBDH3EEN6DF8EK8JY7RX8QJ5SVTE.sip-010-trait-ft-standard.sip-010-trait)
(use-trait sft-trait 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.trait-semi-fungible.semi-fungible-trait)

;; ERRS
(define-constant ERR-NOT-AUTHORIZED (err u1000))
(define-constant ERR-PAUSED (err u1001))
(define-constant ERR-INVALID-BALANCE (err u1002))
(define-constant ERR-INVALID-TOKEN (err u2026))
(define-constant ERR-AMOUNT-EXCEED-RESERVE (err u2024))

;; STORAGE
(define-map approved-tokens principal bool)
(define-data-var paused bool false)

;; READ ONLY CALLS
(define-read-only (is-dao-or-extension)
	(ok (asserts! (or (is-eq tx-sender .memegoat-community-dao) (contract-call? .memegoat-community-dao is-extension contract-caller)) ERR-NOT-AUTHORIZED))
)

(define-read-only (is-paused)
	(var-get paused)
)

;; DAO CALLS
(define-public (pause (new-paused bool))
	(begin
		(try! (is-dao-or-extension))
		(ok (var-set paused new-paused))
  )
)

(define-public (set-approval-status (token-trait principal) (id uint) (status bool))
	(begin
		(try! (is-dao-or-extension))
		(ok (map-set approved-tokens token-trait status))
  )
)

(define-public (transfer-ft (token-trait <ft-trait>) (amount uint) (recipient principal))
	(begin
		(asserts! (not (is-paused)) ERR-PAUSED)
		(asserts! (and (is-ok (is-dao-or-extension)) (is-ok (check-is-approved-token (contract-of token-trait)))) ERR-NOT-AUTHORIZED)
		(as-contract (contract-call? token-trait transfer amount tx-sender recipient none))
  )
)

(define-public (transfer-ft-two (token-x-trait <ft-trait>) (dx uint) (token-y-trait <ft-trait>) (dy uint) (recipient principal))
	(begin
		(try! (transfer-ft token-x-trait dx recipient))
		(transfer-ft token-y-trait dy recipient)
  )
)

(define-public (transfer-sft (token-trait <sft-trait>) (token-id uint) (amount uint) (recipient principal))
	(begin
		(asserts! (not (is-paused)) ERR-PAUSED)
		(asserts! (and (is-ok (is-dao-or-extension)) (is-ok (check-is-approved-token (contract-of token-trait)))) ERR-NOT-AUTHORIZED)
		(as-contract (contract-call? token-trait transfer token-id amount tx-sender recipient))
  )
)

(define-private (check-is-approved-token (token principal))
	(ok (asserts! (default-to false (map-get? approved-tokens token)) ERR-NOT-AUTHORIZED))
)

Functions (8)

FunctionAccessArgs
is-dao-or-extensionread-only
is-pausedread-only
pausepublicnew-paused: bool
set-approval-statuspublictoken-trait: principal, id: uint, status: bool
transfer-ftpublictoken-trait: <ft-trait>, amount: uint, recipient: principal
transfer-ft-twopublictoken-x-trait: <ft-trait>, dx: uint, token-y-trait: <ft-trait>, dy: uint, recipient: principal
transfer-sftpublictoken-trait: <sft-trait>, token-id: uint, amount: uint, recipient: principal
check-is-approved-tokenprivatetoken: principal