5个稳定版本
1.0.5 | 2023年12月15日 |
---|---|
1.0.4 | 2023年12月14日 |
1.0.1 | 2023年8月3日 |
#11 in #cw721
每月51次下载
用于 4 crates
21KB
305 行
CW721规范:非同质化代币
CW721是基于CosmWasm的非同质化代币规范。其名称和设计基于以太坊的ERC721标准,并进行了一些增强。这里定义的类型可以被希望实现此规范的合约或调用任何标准cw721合约的合约导入。
规范分为多个部分,合约可能只实现其中一些功能,但必须实现基础部分。
基础
这处理所有权、转让和允许。所有CW721合约都必须支持这些功能。注意,所有代币都必须有一个所有者,以及一个ID。ID是一个在合约中唯一的任意字符串。
消息
TransferNft{recipient, token_id}
- 这将代币的所有权转让给 recipient
账户。这旨在发送到一个由私钥控制的地址,如果它是一个合约,则不会触发任何接收方的操作。
需要 token_id
指向一个有效的代币,以及 env.sender
是它的所有者或具有转让它的允许。
SendNft{contract, token_id, msg}
- 这将代币的所有权转让给 contract
账户。 contract
必须是一个由智能合约控制的地址,该智能合约实现了CW721Receiver接口。 msg
将与token_id一起传递给接收方合约。
需要 token_id
指向一个有效的代币,以及 env.sender
是它的所有者或具有转让它的允许。
Approve{spender, token_id, expires}
- 授予 spender
转移或发送指定代币的权限。这只能在 env.sender
是指定 token_id
的所有者或操作者时执行。每个代币可以有多个支出账户,一旦代币被转移或发送,它们就会被清除。
Revoke{spender, token_id}
- 撤销之前授予的转移指定 token_id
的权限。这只能在 env.sender
是指定 token_id
的所有者或操作者时授予。
ApproveAll{operator, expires}
- 授予 operator
转移或发送 env.sender
所拥有所有代币的权限。此批准与所有者相关,而不是与代币相关,并且适用于所有者收到的任何未来代币。
RevokeAll{operator}
- 撤销之前授予指定 operator
的 ApproveAll
权限。
UpdateMetadata{token_id, extension}
- 通过 token_id
更新代币的 extension
元数据。虽然消息类型已包含,但实现留给开发者。
查询
OwnerOf{token_id, include_expired}
- 返回给定代币的所有者,以及任何拥有此特定代币批准的人。如果代币未知,则返回错误。返回类型是 OwnerOfResponse
。如果设置了 include_expired
,则在结果中显示已过期的所有者,否则忽略它们。
Approval{token_id, spender, include_expired}
- 返回有关给定 token_id
的 spender
的批准。返回类型是 ApprovalResponse
。如果设置了 include_expired
,则在结果中显示已过期的所有者,否则忽略它们。
Approvals{token_id, include_expired}
- 返回所有所有者授予访问权限的批准。返回类型是 ApprovalsResponse
。如果设置了 include_expired
,则在结果中显示已过期的所有者,否则忽略它们。
AllOperators{owner, include_expired, start_after, limit}
- 列出可以访问所有所有者代币的所有操作员。返回类型是 OperatorsResponse
。如果设置了 include_expired
,则结果中会显示已过期的所有者,否则忽略它们。如果设置了 start_after
,则返回给定操作员之后的第一个 limit
个操作员。
NumTokens{}
- 发行代币的总数
接收者
SendNft
的对应操作是 ReceiveNft
,任何希望管理 CW721 代币的合约都必须实现它。这通常 不是 由任何 CW721 合约实现的。
ReceiveNft{sender, token_id, msg}
- 这是为了处理 SendNft
消息。合约的地址存储在 env.sender
中,因此不能被伪造。合约应确保发送者与它期望处理的代币合约相匹配,不允许任意地址。
sender
是请求移动代币的原始账户,而 msg
是可以解码为特定合约消息的 Binary
数据。这可能为空,如果我们只有一个默认动作,或者它可能是一个 ReceiveMsg
变体,以阐明意图。例如,如果我们发送到一个交易所,我们可以指定我们想要列出代币的价格。
元数据
查询
ContractInfo{}
- 这返回关于合约的最高级元数据。即,name
和 symbol
。
NftInfo{token_id}
- 这返回一个特定代币的元数据。返回值基于 ERC721 Metadata JSON Schema,但直接来自合约,而不是作为 Uri。只有图像链接是 Uri。
AllNftInfo{token_id}
- 这返回了 NftInfo
和 OwnerOf
的结果,作为一个查询返回,这是为了优化客户端,可能希望显示一个 NFT 的所有信息。
可枚举的
查询
分页是通过 start_after
和 limit
实现的。限制是客户端设置的请求,如果没有设置,合约将自动将其设置为 DefaultLimit
(建议值为 10)。如果设置了,它将使用到 MaxLimit
值(建议值为 30)。合约可以定义其他 DefaultLimit
和 MaxLimit
值,而不违反 CW721 规范,客户端不应依赖于任何特定值。
如果 start_after
没有设置,查询将返回第一个结果,按照 token_id
的字典顺序排序。如果设置了 start_after
,则返回给定一个之后的第一个 limit
个代币。这允许通过取返回的最后一个结果(一个 token_id
)并将其用作未来查询中的 start_after
值来实现简单的分页。
Tokens{owner, start_after, limit}
- 列出属于指定所有者的所有token_ids。返回类型为 TokensResponse{tokens: Vec<token_id>}
。
AllTokens{start_after, limit}
- 需要分页。列出由合约控制的全部token_ids。
依赖项
~3.5–5MB
~111K SLoC