2 个版本

0.9.3 2022 年 5 月 5 日
0.9.2 2022 年 5 月 4 日

#11 in #terra


cw721-base-terra 中使用

Apache-2.0 许可协议

25KB
434 代码行

Terra 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} - 撤销之前授予指定 operatorApproveAll 权限。

查询

OwnerOf{token_id} - 返回指定代币的所有者以及任何拥有此特定代币批准的人。如果代币未知,则返回错误。返回类型是 OwnerResponse{owner}

ApprovedForAll{owner, include_expired} - 列出可以访问所有所有者代币的操作员。返回类型是 ApprovedForAllResponse。如果 include_expired 被设置,则显示结果中的过期所有者,否则忽略它们。

NumTokens{} - 已发行的代币总数

接收者

ReceiveNft 的对应操作是 SendNft,任何希望管理 CW721 代币的合约都必须实现。这通常 不是 由任何 CW721 合约实现。

ReceiveNft{sender, token_id, msg} - 此操作旨在处理 SendNft 消息。合约地址存储在 env.sender 中,因此不能伪造。合约应确保发送者与它期望处理的代币合约匹配,不允许任意地址。

sender 是请求移动代币的原始账户,而 msg 是可以解码为特定合约消息的 Binary 数据。这可能为空,如果我们只有一个默认操作,或者它可能是一个 ReceiveMsg 变体以明确意图。例如,如果我将代币发送到交易所,我可以指定我希望列出代币的价格。

元数据

查询

ContractInfo{} - 此函数返回合约的顶层元数据。具体包括 namesymbol

NftInfo{token_id} - 此函数返回一个特定代币的元数据。返回值基于 ERC721 Metadata JSON Schema,但直接从合约中获取,而不是作为 Uri。只有图片链接是 Uri。

AllNftInfo{token_id} - 此函数将 NftInfoOwnerOf 的结果作为一次查询返回,以优化客户端,可能希望显示一个 NFT 的所有信息。

可枚举

查询

分页通过 start_afterlimit 实现。Limit 是客户端设置的请求,如果没有设置,合约将自动将其设置为 DefaultLimit(建议值为 10)。如果设置了,它将使用到 MaxLimit 值(建议值为 30)。合约可以定义其他 DefaultLimitMaxLimit 值,而不违反 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。

依赖项

~2.9–4.5MB
~95K SLoC