-
Notifications
You must be signed in to change notification settings - Fork 94
Description
There should be a SIP that define extensions that can be implemented by SIP-9 and SIP-10(?) assets. These extension should use the uint parameter either as id or as amount.
Trait Transferable
This trait is compatible with SIP-9, but not with SIP-10.
The function transfer-memo is the corresponding function to stx-transfer-memo? defined in Stacks 2.1.
define-trait transferable
(
;; Transfer from the sender to a new principal
;; must return `(ok true)` on success, never `(ok false)`
;; @param id-or-amount; identifier of NFT or amount of FTs
;; @param sender: owner of asset
;; @param recipient: new owner of asset after tx
(transfer (uint principal principal) (response bool uint))
;; Transfer from the sender to a new principal
;; must return `(ok true)` on success, never `(ok false)`
;; must emit an event with `memo`
;; @param id-or-amount; identifier of NFT or amount of FTs
;; @param sender: owner of asset
;; @param recipient: new owner of asset after tx
;; @param memo: message attached to the transfer
(transfer-memo (uint principal principal (buff 34) (response bool uint))
Example contract: https://github.com/MarvinJanssen/stx-atomic-swap/blob/master/stx/contracts/sip009-sip010-htlc.clar
Trait Operable
This trait should be implemented by transferable asset contracts. It provides functions to defined operators that are approved to transfer assets in the name of the user. Examples of operators are trusted marketplaces.
Security
In #40, some proposals have been made to improve the security of these functions
- allow to specify guards for
as-contract?calls: Trait for Tradables/Marketplace functions #40 (comment) - use an asset representing operation rights: Trait for Tradables/Marketplace functions #40 (comment)
See also mijoco-btc/clarity-market#6
Trait definition
define-trait operable
(
;; set approval for an operator to handle a specified id or amount of the asset
;; must return `(ok true)` on success, never `(ok false)`
;; @param id-or-amount; identifier of NFT or amount of FTs
;; @param operator: principal that wants top operate the asset
;; @param bool: if true operator can transfer id or up to amount
(set-approved (uint principal bool) (response bool uint))
;; read-only function to return the current status of given operator
;; if returned `(ok true)` the operator can transfer the NFT with the given id or up to the requested amount of FT
;; @param id-or-amount; identifier of NFT or amount of FTs
;; @param operator: principal that wants top operate the asset
;; @param bool: if true operator can transfer id or up to amount
(is-approved (uint principal) (response bool uint))
Related Work
https://github.com/radicleart/clarity-market/blob/main/contracts/loopbomb.clar#L195