1 个不稳定版本
| 0.1.0-alpha.1 | 2023年2月1日 |
|---|
#101 在 #original
用于 bs721-base
19KB
294 行
BS721 规范:非同质化代币
BS721 是基于 CosmWasm 721 的非同质化代币规范。名称和设计基于以太坊的 ERC721 标准,并进行了一些增强。这里的类型可以被希望实现此规范的合约或调用任何标准 bs721 合约的合约导入。
规范分为多个部分,合约可能只实现其中的一些功能,但必须实现基础部分。
基础
这处理所有权、转移和许可。所有 BS721 合约都必须支持这些功能。注意,所有代币都必须有一个所有者,以及一个 ID。ID 是一个任意字符串,在合约内是唯一的。
消息
TransferNft{recipient, token_id} - 这将代币的所有权转移给 recipient 账户。这旨在发送给由私钥控制的地址,并且如果它是合约,则不会触发接收方的任何操作。
需要 token_id 指向一个有效的代币,以及 env.sender 是其所有者,或者有转移它的许可。
SendNft{contract, token_id, msg} - 这将代币的所有权转移给 contract 账户。 contract 必须是一个由智能合约控制的地址,该智能合约实现了 Bs721Receiver 接口。 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 权限。
查询
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,任何希望管理 BS721 令牌的合约都必须实现它。这通常 不会 由任何 BS721 合约实现。
ReceiveNft{sender, token_id, msg} - 这个设计用于处理 SendNft 消息。合约的地址存储在 env.sender 中,因此无法伪造。合约应确保发送者与它期望处理的令牌合约相匹配,并不允许任意地址。
sender 是请求移动令牌的原始账户,而 msg 是可以解码为合约特定消息的 Binary 数据。如果没有默认操作,它可以是空的;或者它可能是一个 ReceiveMsg 变体,以明确意图。例如,如果我将令牌发送到交易所,我可以指定我想为令牌列出的价格。
元数据
查询
ContractInfo{} - 这返回关于合约的高级元数据。具体来说,是 name、symbol 和 uri。
NftInfo{token_id} - 这返回一个特定令牌的元数据。返回值基于 ERC721 Metadata JSON Schema,但直接来自合约,而不是作为 Uri。只有图片链接是 Uri。
AllNftInfo{token_id} - 这返回 NftInfo 和 OwnerOf 的结果,作为一个查询优化,以便客户端可以显示一个 NFT 的所有信息。
可枚举的
查询
分页通过 start_after 和 limit 实现。Limit 是客户端设置的一个请求,如果未设置,合约将自动将其设置为 DefaultLimit(建议 10)。如果设置了,它将使用到 MaxLimit 值(建议 30)。合约可以定义其他的 DefaultLimit 和 MaxLimit 值,而不会违反 BS721 规范,客户端不应依赖于任何特定的值。
如果未设置 start_after,查询将返回第一个结果,按 token_id 的字典顺序排序。如果设置了 start_after,则返回给定令牌之后的第一个 limit 个令牌。这允许通过取返回的最后一个结果(一个 token_id)并将其用作未来查询的 start_after 值来实现简单的分页。
Tokens{owner, start_after, limit} - 列出属于给定所有者的所有 token_id。返回类型是 TokensResponse{tokens: Vec<token_id>}。
AllTokens{start_after, limit} - 需要分页。列出合约控制的所有 token_id。
依赖关系
~4–6MB
~124K SLoC