1个不稳定版本

0.1.0 2023年1月19日

#1 in #mint

Apache-2.0

1MB
22K SLoC

HMIP-721实现

实例化Token合约

请求
{
	“name”: “name_of_the_token”,
	“symbol”: “token_symbol”,
	“admin”: “optional_admin_address”,
	“entropy”: “string_used_as_entropy_when_generating_random_viewing_keys”,
	"royalty_info": {
		"decimal_places_in_rates": 4,
		"royalties": [
			{
				"recipient": "address_that_should_be_paid_this_royalty",
				"rate": 100,
			},
			{
				"...": "..."
			}
		],
	},
	“config”: {
		“public_token_supply”: true | false,
		“public_owner”: true | false,
		“enable_sealed_metadata”: true | false,
		“unwrapped_metadata_is_private”: true | false,
		“minter_may_update_metadata”: true | false,
		“owner_may_update_metadata”: true | false,
		“enable_burn”: true | false
	},
	“post_init_callback”: {
		“msg”: “base64_encoded_Binary_representing_the_msg_to_perform_after_initialization”,
		“contract_address”: “address_of_the_contract_being_called_after_initialization”,
		“code_hash”: “code_hash_of_the_contract_being_called_after_initialization”,
		“send”: [
			{
				“denom”: “denom_string_for_native_coin_being_sent_with_this_message”,
				“amount”: “amount_of_native_coin_being_sent”
			},
			{
				"...": "..."
			}
		]
	}
}
Name Type Description 可选 省略时的值
name string Token合约的名称
symbol string Token合约的符号
admin string (HumanAddr) 赋予管理员权限的地址 env.message.sender
entropy string 生成随机观看密钥时用作熵的字符串
royalty_info RoyaltyInfo (见下文) 合约的默认RoyaltyInfo nothing
config Config (见下文) 合约的隐私配置 定义如下
post_init_callback PostInitCallback (见下文) 用于在初始化后执行回调消息的信息 nothing

合约的默认RoyaltyInfo是将在没有显式定义其自己的RoyaltyInfo的情况下铸造的任何token分配的RoyaltyInfo。应注意的是,默认RoyaltyInfo仅适用于在默认情况下铸造的新token,并且不会更改任何现有NFT的版税。这是因为token创建者不应能够以仅1%的广告版税出售token,然后在购买后将其更改到100%。如果铸造了一个SNIP-722不可转让的token,它将不会继承默认版税,因为不可转让的token永远不会作为销售的一部分转让,使版税变得没有意义。

RoyaltyInfo

RoyaltyInfo用于定义在出售NFT时支付的版税。此实现仅当查询者有权转让token时才显示token的版税接收者地址,并且如果查询者是授权铸造者,则仅显示合约的默认版税接收者地址。

{
	"decimal_places_in_rates": 4,
	"royalties": [
		{
			"recipient": "address_that_should_be_paid_this_royalty_(optional_in_query_responses)",
			"rate": 100,
		},
		{
			"...": "..."
		}
	]
}
Name Type Description 可选
decimal_places_in_rates number (u8) 在《版权费用》中使用的所有费率的小数位数(例如,整数的2位小数)
版权费用 版权费用的数组(见下文) 销售时需支付的版权费用列表

版权费用

版权费用定义了NFT出售时的支付地址和费用率。此实现仅会在查询者有权限转让代币时显示代币的版权收益接收地址,如果查询者是授权的铸造者,则仅显示合约的默认版权收益接收地址。

{
	"recipient": "address_that_should_be_paid_this_royalty_(optional_in_query_responses)",
	"rate": 100,
}
Name Type Description 消息中为可选 查询响应中为可选
接收方 string (HumanAddr) 应支付此版权费用的地址
费率 数字(u16) 使用包含此《版权费用》的《版权信息》中指定的小数位数支付的版权费率

配置

配置是合约的隐私配置。

  • public_token_supply - 此配置值表示合约控制的代币ID和代币数量是否公开。如果代币供应是私有的,则只有铸造者可以查看合约控制的代币ID和代币数量(默认:False)
  • public_owner - 此配置值表示代币所有权是否默认为公开或私有。无论此设置如何,用户都有能力更改其代币所有权的公开或私有状态(默认:False)
  • enable_sealed_metadata - 此配置值表示是否启用密封元数据。如果启用密封元数据,则新铸造代币的私有元数据在所有者调用揭示消息之前不可由任何人查看,即使是所有者。当调用揭示时,密封元数据将不可逆地解封并移动到公共元数据(默认)。如果将unwrapped_metadata_is_private设置为true,则解封后的密封元数据将保持为私有元数据,但所有者(以及所有者已白名单的人)现在将能够看到它。任何人都可以查询代币以了解它是否已被解封。这模拟了购买/出售密封卡片,直到解封之前无人知道其中是哪张卡片。如果未启用密封元数据,则所有代币在铸造时都视为已解封(默认:False)
  • unwrapped_metadata_is_private - 此配置值表示揭示消息是否在解封后保持密封元数据为私有。如果未启用密封元数据,则忽略此配置值(默认:False)
  • minter_may_update_metadata - 此配置值表示是否允许铸造者更新代币的元数据(默认:True)
  • owner_may_update_metadata - 此配置值表示代币的所有者是否允许更新代币的元数据(默认:False)
  • enable_burn - 此配置值表示是否启用燃烧功能。即使禁用了燃烧功能,SNIP-722不可转让的代币也可以随时燃烧。这是因为所有者必须有一种方法来处理不想要的、不可转让的代币(默认:False)
{
	“public_token_supply”: true | false,
	“public_owner”: true | false,
	“enable_sealed_metadata”: true | false,
	“unwrapped_metadata_is_private”: true | false,
	“minter_may_update_metadata”: true | false,
	“owner_may_update_metadata”: true | false,
	“enable_burn”: true | false
}
Name Type 可选 省略时的值
public_token_supply 布尔值 false
public_owner 布尔值 false
enable_sealed_metadata 布尔值 false
unwrapped_metadata_is_private 布尔值 false
minter_may_update_metadata 布尔值 true
owner_may_update_metadata 布尔值 false
enable_burn 布尔值 false

初始化后回调

PostInitCallback对象用于在合约初始化后执行可选的回调消息。如果另一个合约实例化此代币合约,并需要代币合约通知创建合约其地址,这非常有用。

{
	“msg”: “base64_encoded_Binary_representing_the_msg_to_perform_after_initialization”,
	“contract_address”: “address_of_the_contract_being_called_after_initialization”,
	“code_hash”: “code_hash_of_the_contract_being_called_after_initialization”,
	“send”: [
		{
			“denom”: “denom_string_for_native_coin_being_sent_with_this_message”,
			“amount”: “amount_of_native_coin_being_sent”
		},
		{
			"...": "..."
		}
	]
}
Name Type Description 可选 省略时的值
msg 字符串(base64编码的二进制数据) 回调消息的Base64编码二进制表示,该消息在合约初始化后执行
contract_address string (HumanAddr) 初始化后要调用的合约地址
code_hash string 32字节十六进制编码的字符串,包含初始化后要调用的合约的code hash
send 一组Coin(见下文) 与回调消息一起发送的本地Coin数量的列表

Coin

Coin是与post-init回调消息一起发送的付款。尽管send不是PostInitCallback的可选字段,因为它是一个数组,所以你可以使用[]来不通过回调消息发送任何付款

{
	“denom”: “denom_string_for_native_coin_being_sent_with_this_message”,
	“amount”: “amount_of_native_coin_being_sent”
}
Name Type Description 可选 省略时的值
denom string 本地Coin的货币单位(SCRT为uscrt)
amount 字符串(Uint128) 与PostInitCallback消息一起发送的本地Coin数量

消息

MintNft

MintNft创建单个代币。只有授权的铸造地址可以执行MintNft。

SNIP-722增加了可选铸造不可转让代币的能力,这些代币是NFT,其所有者永远不会是除了铸造给它的地址之外的其他地址。

请求
{
	"mint_nft": {
		"token_id": "optional_ID_of_new_token",
		"owner": "optional_address_the_new_token_will_be_minted_to",
		"public_metadata": {
			"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
			"extension": {
				"...": "..."
			}
		},
		"private_metadata": {
			"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
			"extension": {
				"...": "..."
			}
		},
		"serial_number": {
			"mint_run": 3,
			"serial_number": 67,
			"quantity_minted_this_run": 1000,
		},
		"royalty_info": {
			"decimal_places_in_rates": 4,
			"royalties": [
				{
					"recipient": "address_that_should_be_paid_this_royalty",
					"rate": 100,
				},
				{
					"...": "..."
				}
			],
		},
		"transferable": true | false,
		"memo": "optional_memo_for_the_mint_tx",
		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
token_id string 要铸造的代币的标识符 铸造顺序号
owner string (HumanAddr) 铸造代币的所有者的地址 env.message.sender
public_metadata 元数据(见下文) 公开可查看的元数据 nothing
private_metadata 元数据(见下文) 只有代币所有者和所有已列入白名单的地址可以查看的元数据 nothing
serial_number SerialNumber(见下文) 此代币的SerialNumber nothing
royalty_info RoyaltyInfo(见上文) 此代币的RoyaltyInfo 默认RoyaltyInfo
transferable 布尔值 如果铸造的代币应该是可转让的,则为True true
memo string 铸造交易中的memo,只有参与铸造的地址(铸造者、所有者)可见 nothing
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing

为不可转让的代币设置版税没有意义,因为它永远不能作为销售的一部分转让,因此此实现不会为不可转让的代币存储任何RoyaltyInfo。

响应
{
	"mint_nft": {
		"token_id": "ID_of_minted_token",
	}
}

铸造的代币ID也将作为具有密钥minted的LogAttribute返回。

元数据

这是遵循基于ERC721元数据JSON模式的CW-721元数据规范代币的元数据。如果同时提供token_uriextension,此实现将抛出错误。

{
	"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
	"extension": {
		"...": "..."
	}
}
Name Type Description 可选 省略时的值
token_uri string 指向链下JSON元数据的URI nothing
extension 扩展(见下文) 定义链上元数据的数据结构 nothing
如果同时提供token_uriextension,此实现将抛出错误。

扩展

这是一个符合Stashh元数据标准的链上元数据扩展结构(该标准反过来又实现了https://docs.opensea.io/docs/metadata-standards)。URL应使用前缀http://https://ipfs://ar://。如有必要,可随意添加或删除任何字段。

SNIP-722在扩展中添加了一个可选的token_subtype字段,用于Badges/POAPs。该字段旨在由应用程序使用,以区分用作Badges/POAPs的NFT,以便它们可以以这种方式显示,因为它们将被用于像奖杯、成就、出勤证明等...

{
	"image": "optional_image_url",
	"image_data": "optional_raw_svg_image_data",
	"external_url": "optional_url_to_view_token_on_your_site",
	"description": "optional_token_description",
	"name": "optional_token_name",
	"attributes": [
		{
			"display_type": "optional_display_format_for_numerical_traits",
			"trait_type": "optional_name_of_the_trait",
			"value": "trait value",
			"max_value": "optional_max_value_for_numerical_traits"
		},
		{
			"...": "...",
		},
	],
	"background_color": "optional_six-character_hexadecimal_background_color_(without_pre-pended_`#`)",
	"animation_url": "optional_url_to_multimedia_file",
	"youtube_url": "optional_url_to_a_YouTube_video",
	"media": [
		{
			"file_type": "optional_file_type",
			"extension": "optional_file_extension",
			"authentication": {
				"key": "optional_decryption_key_or_password",
				"user": "optional_username_for_authentication"
			},
			"url": "url_pointing_to_the_multimedia_file"
		},
		{
			"...": "...",
		},
	],
	"protected_attributes": [ "list", "of_attributes", "whose_types", "are_public", "but_values", "are_private" ],
	"token_subtype": "badge"
}
Name Type Description 可选 省略时的值
image string 令牌图像的URL nothing
image_data string 仅在没有image字段时才应使用的原始SVG图像数据 nothing
external_url string 查看令牌的网站URL nothing
description string 令牌的文本描述 nothing
name string 令牌的名称 nothing
attributes 一组特质(见下文) 令牌的属性 nothing
background_color string 表示为不带前缀#的六字符十六进制数的背景颜色 nothing
animation_url string 多媒体文件的URL nothing
youtube_url string YouTube视频的URL nothing
media 一组MediaFile(见下文) 使用Stashh规范的多媒体文件列表 nothing
protected_attributes 字符串数组 类型为公共但值为私有的属性列表 nothing
token_subtype string 用于表示NFT用途的令牌子类型,例如“徽章” nothing

特质

特质描述了令牌属性,如https://docs.opensea.io/docs/metadata-standards中定义的。

{
	"display_type": "optional_display_format_for_numerical_traits",
	"trait_type": "optional_name_of_the_trait",
	"value": "trait value",
	"max_value": "optional_max_value_for_numerical_traits"
}
Name Type Description 可选 省略时的值
display_type string 数值特质的显示格式 nothing
trait_type string 特质的名称 nothing
value string 特质值
max_value string 此数值特质的最大值 nothing

MediaFile

MediaFile是Stashh用于引用链外多媒体文件的数据结构。它允许托管文件使用基本身份验证进行加密或验证,并且解密密钥或用户名/密码也可以包含在链上私有元数据中。URL应使用前缀http://https://ipfs://ar://

{
	"file_type": "optional_file_type",
	"extension": "optional_file_extension",
	"authentication": {
		"key": "optional_decryption_key_or_password",
		"user": "optional_username_for_authentication"
	},
	"url": "url_pointing_to_the_multimedia_file"
}
Name Type Description 可选 省略时的值
file_type string 文件类型。Stashh目前使用:"image","video","audio","text","font","application"。 nothing
extension string 文件扩展名 nothing
authentication 身份验证(见下文) 受保护文件的凭证或解密密钥 nothing
url string 多媒体文件的URL

身份验证

身份验证用于提供受保护文件的解密密钥或用户名/密码。

{
	"key": "optional_decryption_key_or_password",
	"user": "optional_username_for_authentication"
}
Name Type Description 可选 省略时的值
key string 解密密钥或密码 nothing
user string 基本身份验证的用户名 nothing

序列号

序列号用于序列化相同的NFT。

{
	"mint_run": 3,
	"serial_number": 67,
	"quantity_minted_this_run": 1000,
}
Name Type Description 可选 省略时的值
mint_run 数字(u32) 此令牌铸造的铸造运行次数。这表示同一时间发布的NFT批 nothing
serial_number 数字(u32) 此令牌的序列号
此运行中铸造的数量 数字(u32) 本铸造轮次中铸造的代币数量。 nothing

铸造轮次是指同时发布的一组NFT。例如,如果一个创作者决定制作100份副本,那么它们都将属于第1个铸造轮次。如果它们销量好,并且创作者想要重新发布该NFT,他可以再制作100份副本,这些副本都将属于第2个铸造轮次。通过组合使用mint_run(铸造轮次)、serial_number(序列号)和quantity_minted_this_run(本轮次铸造数量),可以用来表示,例如,这个代币是第3个铸造轮次中铸造的1000个代币中的第67个。

BatchMintNft

BatchMintNft用于铸造一组代币。只有授权的铸造地址可以执行BatchMintNft。

SNIP-722增加了可选铸造不可转让代币的能力,这些代币是NFT,其所有者永远不会是除了铸造给它的地址之外的其他地址。

请求
{
	"batch_mint_nft": {
		"mints": [
			{
				"token_id": "optional_ID_of_new_token",
				"owner": "optional_address_the_new_token_will_be_minted_to",
				"public_metadata": {
					"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
					"extension": {
						"...": "..."
					}
				},
				"private_metadata": {
					"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
					"extension": {
						"...": "..."
					}
				},
				"serial_number": {
					"mint_run": 3,
					"serial_number": 67,
					"quantity_minted_this_run": 1000,
				},
				"royalty_info": {
					"decimal_places_in_rates": 4,
					"royalties": [
						{
							"recipient": "address_that_should_be_paid_this_royalty",
							"rate": 100,
						},
						{
							"...": "..."
						}
					],
				},
				"transferable": true | false,
				"memo": "optional_memo_for_the_mint_tx"
			},
			{
				"...": "..."
			}
		],
		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
铸造 一个Mint(见下文)的数组 要执行的所有铸造操作列表
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"batch_mint_nft": {
		"token_ids": [
			"IDs", "of", "tokens", "that", "were", "minted", "..."
		]
	}
}

铸造的代币ID也会以键minted返回到LogAttribute中。

Mint

Mint对象定义了铸造一个代币所需的数据。

{
	"token_id": "optional_ID_of_new_token",
	"owner": "optional_address_the_new_token_will_be_minted_to",
	"public_metadata": {
		"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
		"extension": {
			"...": "..."
		}
	},
	"private_metadata": {
		"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
		"extension": {
			"...": "..."
		}
	},
	"serial_number": {
		"mint_run": 3,
		"serial_number": 67,
		"quantity_minted_this_run": 1000,
	},
	"royalty_info": {
		"decimal_places_in_rates": 4,
		"royalties": [
			{
				"recipient": "address_that_should_be_paid_this_royalty",
				"rate": 100,
			},
			{
				"...": "..."
			}
		],
	},
	"transferable": true | false,
	"memo": "optional_memo_for_the_mint_tx"
}
Name Type Description 可选 省略时的值
token_id string 要铸造的代币的标识符 铸造顺序号
owner string (HumanAddr) 铸造代币的所有者的地址 env.message.sender
public_metadata 元数据(见上文) 公开可查看的元数据 nothing
private_metadata 元数据(见上文) 只有代币所有者和所有已列入白名单的地址可以查看的元数据 nothing
serial_number 序列号(见上文) 此代币的SerialNumber nothing
royalty_info RoyaltyInfo(见上文) 此代币的RoyaltyInfo 默认RoyaltyInfo
transferable 布尔值 如果铸造的代币应该是可转让的,则为True true
memo string 铸造交易中的memo,只有参与铸造的地址(铸造者、所有者)可见 nothing

为不可转让的代币设置版税没有意义,因为它永远不能作为销售的一部分转让,因此此实现不会为不可转让的代币存储任何RoyaltyInfo。

MintNftClones

MintNftClones用于铸造NFT的副本,为每个副本提供一个MintRunInfo,该信息表明其序列号以及与其一起铸造的相同NFT的数量。如果提供了可选的mint_run_id,合同还将表明这些代币是在哪个铸造轮次中铸造的,其中第一次使用mint_run_id将是铸造轮次1,第二次调用MintNftClones时使用该mint_run_id将是铸造轮次2,依此类推。如果没有提供mint_run_id,则MintRunInfo将不包含mint_run

SNIP-722增加了可选铸造不可转让代币的能力,这些代币是NFT,其所有者永远不会是除了铸造给它的地址之外的其他地址。

请求
{
	"mint_nft_clones": {
		"mint_run_id": "optional_ID_used_to_track_mint_run_numbers_over_multiple_calls",
		"quantity": 100,
		"owner": "optional_address_the_new_tokens_will_be_minted_to",
		"public_metadata": {
			"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
			"extension": {
				"...": "..."
			}
		},
		"private_metadata": {
			"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
			"extension": {
				"...": "..."
			}
		},
		"royalty_info": {
			"decimal_places_in_rates": 4,
			"royalties": [
				{
					"recipient": "address_that_should_be_paid_this_royalty",
					"rate": 100,
				},
				{
					"...": "..."
				}
			],
		},
		"transferable": true | false,
		"memo": "optional_memo_for_the_mint_tx",
		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
mint_run_id string 用于跟踪这些克隆在多次MintNftClones调用中铸造轮次数量的标识符 nothing
quantity 数字(u32) 本轮次要铸造的克隆数量
owner string (HumanAddr) 已铸造代币的所有者地址 env.message.sender
public_metadata 元数据(见上文) 公开可查看的元数据 nothing
private_metadata 元数据(见上文) 只有代币所有者和所有已列入白名单的地址可以查看的元数据 nothing
royalty_info RoyaltyInfo(见上文) 这些代币的版税信息 默认RoyaltyInfo
transferable 布尔值 如果铸造的代币应该是可转让的,则为True true
memo string 铸造交易中的memo,只有参与铸造的地址(铸造者、所有者)可见 nothing
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing

为不可转让的代币设置版税没有意义,因为它永远不能作为销售的一部分转让,因此此实现不会为不可转让的代币存储任何RoyaltyInfo。

响应
{
	"mint_nft_clones": {
		"first_minted": "token_id_of_the_first_minted_token",
		"last_minted": "token_id_of_the_last_minted_token"
	}
}

铸造的代币ID也将以键first_mintedlast_minted返回到LogAttributes中。由于代币ID是连续的,其他已铸造代币的ID可以很容易地推断出来。

SetMetadata

如果消息发送者是代币所有者或经批准的铸造者,并且他们在实例化时选择的配置值赋予了这个权限,则SetMetadata将设置公共和/或私有元数据到相应的输入。密封代币的私有元数据在拆封之前可能不会被更改。

请求
{
	"set_metadata": {
		"token_id": "ID_of_token_whose_metadata_should_be_updated",
		"public_metadata": {
			"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
			"extension": {
				"...": "..."
			}
		},
		"private_metadata": {
			"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
			"extension": {
				"...": "..."
			}
		},
		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
token_id string 应更新元数据的代币ID
public_metadata 元数据(见上文) 代币的新公共元数据 nothing
private_metadata 元数据(见上文) 代币的新私有元数据 nothing
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"set_metadata": {
		"status": "success"
	}
}

SetRoyaltyInfo

如果提供了token_id,则SetRoyaltyInfo将更新指定代币的RoyaltyInfo到输入。如果没有提供RoyaltyInfo,则将删除RoyaltyInfo,并用合同的默认RoyaltyInfo(如果有)替换它。如果没有提供token_id,则SetRoyaltyInfo将更新合同的默认RoyaltyInfo到输入,或者如果没有提供RoyaltyInfo,则删除它。
只有授权的铸造者可以更新合同的默认RoyaltyInfo。
只有代币的创作者可以更新其RoyaltyInfo,并且只有当他们是当前所有者时。

此实现将在尝试设置SNIP-722不可转让代币的版税时抛出错误,因为它们永远不能作为销售的一部分进行转让。

请求
{
	"set_royalty_info": {
		"token_id": "optional_ID_of_token_whose_royalty_info_should_be_updated",
		"royalty_info": {
			"decimal_places_in_rates": 4,
			"royalties": [
				{
					"recipient": "address_that_should_be_paid_this_royalty",
					"rate": 100,
				},
				{
					"...": "..."
				}
			],
		},
		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
token_id string 可选的应更新RoyaltyInfo的代币ID 见上文
royalty_info RoyaltyInfo(见上文) 新的RoyaltyInfo 见上文
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"set_royalty_info": {
		"status": "success"
	}
}

Reveal

Reveal 解锁私有的 密封 元数据,不可逆地标记令牌为已解锁。如果 unwrapped_metadata_is_private 配置值 为 true,则之前密封的元数据将保持私有,否则将公开。

请求
{
	"reveal": {
		"token_id": "ID_of_the_token_to_unwrap",
		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
token_id string 要解锁的令牌的 ID
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"reveal": {
		"status": "success"
	}
}

MakeOwnershipPrivate

MakeOwnershipPrivate 在令牌合约使用 public_owner 配置值设置为 true 时使用。它允许地址默认使所有令牌拥有私有所有权。所有者仍然可以使用 SetGlobalApprovalSetWhitelistedApproval 将所有权公开。

请求
{
	"make_ownership_private": {
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"make_ownership_private": {
		"status": "success"
	}
}

SetGlobalApproval

令牌的所有者可以使用 SetGlobalApproval 使所有权和/或私有元数据对每个人可见。这可以针对单个令牌或所有者的整个令牌库存进行设置,方法是选择适当的 AccessLevel。SetGlobalApproval 还可以用来撤销之前授予的任何全局批准。

请求
{
	"set_global_approval": {
		"token_id": "optional_ID_of_the_token_to_grant_or_revoke_approval_on",
		"view_owner": "approve_token" | "all" | "revoke_token" | "none",
		"view_private_metadata": "approve_token" | "all" | "revoke_token" | "none",
		"expires": "never" | {"at_height": 999999} | {"at_time":999999},
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
token_id string 如果提供 approve_tokenrevoke_token 访问权限,则设置隐私的令牌 nothing
view_owner AccessLevel(见下文) 授予或撤销查看令牌/库存所有权的每个人的权限 nothing
view_private_metadata AccessLevel(见下文) 授予或撤销查看令牌/库存的私有元数据的每个人的权限 nothing
expires 过期时间(见下文) 此消息中授予的任何批准的过期时间。可以是区块高度、时间或永不 "never"
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"set_global_approval": {
		"status": "success"
	}
}

AccessLevel

AccessLevel 确定在 SetWhitelistedApproval 消息中对指定地址授予或撤销的访问类型,或在 SetGlobalApproval 消息中对每个人授予或撤销的访问类型。库存级别的批准和特定令牌的批准是互斥的访问级别。这些级别是:

  • "approve_token" - 仅在消息中指定的令牌上授予批准
  • "revoke_token" - 撤销指定令牌的先前批准
  • "all" - 为消息签名者的库存中的所有令牌授予批准。此批准还将应用于签名者在授予 all 批准后获得的任何令牌
  • "none" - 撤销之前授予指定地址的任何批准(如果使用 SetGlobalApproval 则为每个人撤销)

如果消息签名者授予地址(在SetGlobalApproval的情况下为所有人)all(库存范围)批准,它将取消之前授予该地址(或在SetGlobalApproval的情况下授予所有人)的任何单个代币批准,并授予该地址all(库存范围)批准。如果地址(或在SetGlobalApproval的情况下为所有人)已经具有all批准,并且消息签名者授予它approve_token批准,如果新的approve_token批准的过期时间与之前的all批准的过期时间相同,它将保留现有的all批准。如果过期时间不同,它将为输入代币授予具有指定过期的approve_token批准,并将所有其他代币更改为具有之前all批准过期时间的approve_token批准,并将all(库存范围)批准取消。如果消息签名者向具有库存范围批准的地址应用revoke_token访问权限,它将取消库存范围批准,并在签名者的库存中每个代币上为该地址创建approve_token批准,除了使用revoke_token消息指定的代币。换句话说,它只会取消该单个代币的批准。

过期时间

过期对象用于设置消息中授予的任何批准的过期时间。过期时间可以设置为指定的区块高度、自1970年1月1日以来的秒数或“永不”。区块高度和时间的值指定为u64。如果没有指定过期时间,它将默认为“永不”。

应该注意的是,当前区块高度和时间在此时不可用于秘密网络上的查询,但有计划在未来的硬分叉中使BlockInfo可用于查询。为了克服这一限制,合约在每次执行消息时保存BlockInfo,并使用最后一次消息执行的区块高度和时间来检查查询期间的查看权限过期。因此,如果自过期之前没有人执行任何合约消息,白名单地址可能仍然能够查看已过期的代币的所有者或元数据。然而,由于转账/销毁代币是执行消息,它确实具有当前的区块高度和时间,并且转账批准过期时无法发生。

  • "never" - 批准将永远不会过期
  • {"at_time": 1700000000} - 批准将在1970年1月1日后1700000000秒过期(时间值是u64)
  • {"at_height": 3000000} - 批准将在区块高度3000000时过期(高度值是u64)

设置白名单批准

代币的所有者可以使用SetWhitelistedApproval授予地址查看所有权、查看私有元数据以及/或转让单个代币或所有代币的权限。SetWhitelistedApproval还可以用于取消之前授予地址的任何批准。

请求
{
	"set_whitelisted_approval": {
		"address": "address_being_granted_or_revoked_approval",
		"token_id": "optional_ID_of_the_token_to_grant_or_revoke_approval_on",
		"view_owner": "approve_token" | "all" | "revoke_token" | "none",
		"view_private_metadata": "approve_token" | "all" | "revoke_token" | "none",
		"transfer": "approve_token" | "all" | "revoke_token" | "none",
		"expires": "never" | {"at_height": 999999} | {"at_time":999999},
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
地址 string (HumanAddr) 授权或撤销地址的权限
token_id string 如果提供 approve_tokenrevoke_token 访问权限,则设置隐私的令牌 nothing
view_owner 访问级别(见上方) 授权或撤销地址查看代币/库存所有权的权限 nothing
view_private_metadata 访问级别(见上方) 授权或撤销地址查看代币/库存的私有元数据的权限 nothing
转移 访问级别(见上方) 授权或撤销地址转移代币/库存的权限 nothing
expires 到期时间(见上方) 本消息中授权的任何批准的到期时间。可以是区块高度、时间或永不。 "never"
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"set_whitelisted_approval": {
		"status": "success"
	}
}

Approve

批准用于授予地址转移单个代币的权限。这只能由代币的所有者或,在遵守CW-721的情况下,具有转移所有者代币的库存级授权的地址执行。批准是为了遵守CW-721,但所有者可以使用SetWhitelistedApproval来达到相同的效果,如果指定了token_idapprove_token 访问级别用于transfer

请求
{
	"approve": {
		"spender": "address_being_granted_approval_to_transfer_the_specified_token",
		"token_id": "ID_of_the_token_that_can_now_be_transferred_by_the_spender",
		"expires": "never" | {"at_height": 999999} | {"at_time":999999},
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
花费者 string (HumanAddr) 被授权转移代币的地址
token_id string 花费者现在可以转移的代币的ID
expires 到期时间(见上方) 此代币转移批准的到期时间。可以是区块高度、时间或永不。 "never"
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"approve": {
		"status": "success"
	}
}

Revoke

撤销用于从地址撤销转移此单个代币的权限。这只能由代币的所有者或在遵守CW-721的情况下,具有转移所有者代币的库存级授权的地址(后来称为操作员)执行。然而,一个操作员不能撤销从另一个操作员那里转移代币的转移权限。撤销是为了遵守CW-721,但所有者可以使用SetWhitelistedApproval来达到相同的效果,如果指定了token_idrevoke_token 访问级别用于transfer

请求
{
	"revoke": {
		"spender": "address_being_revoked_approval_to_transfer_the_specified_token",
		"token_id": "ID_of_the_token_that_can_no_longer_be_transferred_by_the_spender",
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
花费者 string (HumanAddr) 不再被允许转移代币的地址
token_id string 花费者不能再转移的代币的ID
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"revoke": {
		"status": "success"
	}
}

ApproveAll

ApproveAll用于授予地址转移消息发送者库存中所有代币的权限。这将包括转移发送者在授予此库存级批准后获得的任何代币的能力。这也使地址能够授予另一个地址转移单个代币的批准。ApproveAll是为了遵守CW-721,但消息发送者可以使用SetWhitelistedApproval通过使用all 访问级别transfer达到相同的效果。

请求
{
	"approve_all": {
		"operator": "address_being_granted_inventory-wide_approval_to_transfer_tokens",
		"expires": "never" | {"at_height": 999999} | {"at_time":999999},
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
操作员 string (HumanAddr) 被授权转移消息发送者所有代币的地址
expires 到期时间(见上方) 此库存级转移批准的到期时间。可以是区块高度、时间或永不。 "never"
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"approve_all": {
		"status": "success"
	}
}

RevokeAll

RevokeAll用于撤销授予地址的所有转移批准。RevokeAll是为了遵守CW-721,但消息发送者可以使用SetWhitelistedApproval通过使用none 访问级别transfer达到相同的效果。

请求
{
	"revoke_all": {
		"operator": "address_being_revoked_all_approvals_to_transfer_tokens",
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
操作员 string (HumanAddr) 被撤销所有转移消息发送者代币批准的地址
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"revoke_all": {
		"status": "success"
	}
}

TransferNft

TransferNft用于将代币的所有权转移到recipient地址。这需要一个有效的token_id,并且消息发送者必须是所有者或具有有效转移批准的地址。如果recipient地址与当前所有者相同,合约将抛出错误。如果代币被转移到新所有者,其单个代币的批准将被清除。

如果尝试转移一个SNIP-722不可转移的代币,此实现将抛出错误。

请求
{
	"transfer_nft": {
		"recipient": "address_receiving_the_token",
		"token_id": "ID_of_the_token_being_transferred",
		"memo": "optional_memo_for_the_transfer_tx",
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
接收方 string (HumanAddr) 接收代币的地址
token_id string 要转移的代币的标识符
memo string 仅涉及转移交易(接收方、发送方、前所有者)的地址可见的 memo nothing
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"transfer_nft": {
		"status": "success"
	}
}

BatchTransferNft

BatchTransferNft 用于执行多个代币转移。消息发送者可以在每个 Transfer 对象中指定要转移给一个 recipient 地址的代币列表,并且提供的任何 memo 都将应用于该 Transfer 对象中转移的每个代币。消息发送者可以提供多个 Transfer 对象以执行对多个地址的转移,如果需要,可以为每个地址提供不同的 memo。代币的每个单独转移都会在交易历史中单独显示。消息发送者必须有权转移所有列出的代币(可以是所有者或被授予转移批准),并且每个列出的 token_id 必须有效。合同可以使用 VerifyTransferApproval 查询来验证它是否有权转移所有代币。

如果消息发送者没有权限转移列出的任何一种代币,整个消息将失败(不会转移任何代币),并且错误将提供发送者没有所需权限的第一个代币的 ID。如果任何代币转移涉及与当前所有者相同的 recipient 地址,合同将抛出错误。任何转移给新所有者的代币将清除其单个代币批准。

如果尝试转移一个SNIP-722不可转移的代币,此实现将抛出错误。

请求
{
	"batch_transfer_nft": {
		"transfers": [
			{
				"recipient": "address_receiving_the_tokens",
				"token_ids": [
					"list", "of", "token", "IDs", "to", "transfer"
				],
				"memo": "optional_memo_applied_to_the_transfer_tx_for_every_token_listed_in_this_Transfer_object"
			},
			{
				"...": "..."
			}
		],
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
转移 一个 Transfer 对象的数组(见下文) 要处理的 Transfer 对象列表
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"batch_transfer_nft": {
		"status": "success"
	}
}

Transfer

Transfer 对象提供要转移给一个 recipient 地址的代币列表,以及一个可选的 memo,该 memo 将包含在每个记录的代币转移中。

{
	"recipient": "address_receiving_the_tokens",
	"token_ids": [
		"list", "of", "token", "IDs", "to", "transfer", "..."
	],
	"memo": "optional_memo_applied_to_the_transfer_tx_for_every_token_listed_in_this_Transfer_object"
}
Name Type Description 可选 省略时的值
接收方 string (HumanAddr) 接收列出的代币的地址
token_ids 字符串数组 要转移给 recipient 的代币 ID 列表
memo string 仅涉及转移交易的 memo,仅涉及转移的地址可见(接收方、发送方、前所有者) nothing

SendNft

SendNft 用于将代币的所有权转移到 contract 地址,然后调用接收者的 BatchReceiveNft(或 ReceiveNft),如果接收者合同已将接收器接口注册到 NFT 合同,或者如果已提供其 ReceiverInfo。如果接收者合同注册(或如果 ReceiverInfo 指示)它实现了 BatchReceiveNft,则将仅使用 token_ids 数组中的单个代币 ID 执行 BatchReceiveNft 回调。

虽然 SendNft 保持 contract 字段名称以保持 CW-721 兼容性,但 Secret Network 不像 Cosmos 那样有限制,并且可以使用 SendNft 将代币所有权转移到个人地址(不是合同)或接收器接口未实现任何 Receiver Interface 的合同。

SendNft 需要有效的 token_id,并且消息发送者必须是所有者或具有有效转移批准的地址。如果接收者地址与当前所有者相同,合同将抛出错误。如果代币转移到新所有者,其单个代币批准将被清除。如果 BatchReceiveNft(或 ReceiveNft)回调失败,则整个交易将回滚(甚至转移也不会发生)。

此实现如果在尝试发送SNIP-722不可转让令牌时会引发错误。

请求
{
	"send_nft": {
		"contract": "address_receiving_the_token",
		"receiver_info": {
			"recipient_code_hash": "code_hash_of_the_recipient_contract",
			"also_implements_batch_receive_nft": true | false,
		},
		"token_id": "ID_of_the_token_being_transferred",
		"msg": "optional_base64_encoded_Binary_message_sent_with_the_BatchReceiveNft_callback",
		"memo": "optional_memo_for_the_transfer_tx",
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
合约 string (HumanAddr) 接收代币的地址
接收者信息 ReceiverInfo(见下文) 接收者合约的代码哈希和BatchReceiveNft实现状态 nothing
token_id string 要转移的代币的标识符
msg 字符串(base64编码的二进制数据) 在调用接收者合约的BatchReceiveNft(或ReceiveNft)时包含的msg nothing
memo string 仅涉及地址(接收者、发送者、前所有者)可见的交易tx的memo nothing
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"send_nft": {
		"status": "success"
	}
}

ReceiverInfo

可选的ReceiverInfo对象可用于提供从SendNftBatchSendNft接收令牌的合约的代码哈希。它还可以可选地指示接收者合约是否实现了BatchReceiveNft以及ReceiveNft。如果没有提供also_implements_batch_receive_nft字段,则默认为false

{
	"recipient_code_hash": "code_hash_of_the_recipient_contract",
	"also_implements_batch_receive_nft": true | false,
}
Name Type Description 可选 省略时的值
recipient_code_hash string 接收者合约的代码哈希
also_implements_batch_receive_nft 布尔值 如果接收者合约除了ReceiveNft之外还实现了BatchReceiveNft,则为true false

BatchSendNft

BatchSendNft用于执行多个令牌转移,并在接收者合约已将接收器接口注册到NFT合约或提供了ReceiverInfo的情况下调用接收者合约的BatchReceiveNft(或ReceiveNft)。消息发送者可以为每个Send对象指定要发送到单个接收者地址的令牌列表,如果需要,可以为每个地址提供不同的memomsg。每个令牌的单独转移将在交易历史中单独显示。消息发送者必须有权转移所列的所有令牌(无论是作为所有者还是被授予转移批准)并且每个令牌ID必须有效。合约可以使用VerifyTransferApproval查询来验证它是否有权转移所有令牌。如果消息发送者没有权限转移所列的任何令牌,整个消息将失败(不会转移任何令牌)并且错误将提供第一个遇到且发送者没有所需权限的令牌ID。如果任何令牌转移涉及与当前所有者相同的接收者地址,合约将引发错误。任何转移到新所有者的令牌将清除其单令牌批准。如果任何BatchReceiveNft(或ReceiveNft)回调失败,整个交易将被回滚(甚至转移也不会发生)。

消息发送者可以提供多个Send对象以执行对多个地址的发送,如果需要,可以为每个地址提供不同的memomsg。每个令牌的单独转移将在交易历史中单独显示。消息发送者必须有权转移所列的所有令牌(无论是作为所有者还是被授予转移批准)并且每个令牌ID必须有效。合约可以使用VerifyTransferApproval查询来验证它是否有权转移所有令牌。如果消息发送者没有权限转移任何所列令牌,整个消息将失败(不会转移任何令牌)并且错误将提供第一个遇到且发送者没有所需权限的令牌ID。如果任何令牌转移涉及与当前所有者相同的接收者地址,合约将引发错误。任何转移到新所有者的令牌将清除其单令牌批准。如果任何BatchReceiveNft(或ReceiveNft)回调失败,整个交易将被回滚(甚至转移也不会发生)。

此实现如果在尝试发送SNIP-722不可转让令牌时会引发错误。

请求
{
	"batch_send_nft": {
		"sends": [
			{
				"contract": "address_receiving_the_tokens",
				"receiver_info": {
					"recipient_code_hash": "code_hash_of_the_recipient_contract",
					"also_implements_batch_receive_nft": true | false,
				},
				"token_ids": [
					"list", "of", "token", "IDs", "to", "transfer", "..."
				],
				"msg": "optional_base64_encoded_Binary_message_sent_with_every_BatchReceiveNft_callback_made_for_this_one_Send_object",
				"memo": "optional_memo_applied_to_the_transfer_tx_for_every_token_listed_in_this_Send_object"
			},
			{
				"...": "..."
			}
		],
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
sends 发送数组(见下文)发送(见下文) 待处理的 Send 对象列表
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"batch_send_nft": {
		"status": "success"
	}
}

发送

Send 对象提供了一组要转给一个收件人地址的代币,可选地提供了收件人合约的 ReceiverInfo,以及一个可选的 memo,它将包含在每次记录的代币转移中,以及一个可选的 msg,它将包含在每次由此 Send 对象触发的 BatchReceiveNftReceiveNft 回调中。虽然 Send 保留了 contract 字段名称以保持与 CW-721 规范的一致性,但 Secret Network 没有像 Cosmos 那样相同的限制,可以使用 BatchSendNft 将代币所有权转移给个人地址(而不是合约)或未实现任何 Receiver 接口 的合约。

{
	"contract": "address_receiving_the_tokens",
	"receiver_info": {
		"recipient_code_hash": "code_hash_of_the_recipient_contract",
		"also_implements_batch_receive_nft": true | false,
	},
	"token_ids": [
		"list", "of", "token", "IDs", "to", "transfer", "..."
	],
	"msg": "optional_base64_encoded_Binary_message_sent_with_every_BatchReceiveNft_callback_made_for_this_one_Send_object",
	"memo": "optional_memo_applied_to_the_transfer_tx_for_every_token_listed_in_this_Send_object"
}
Name Type Description 可选 省略时的值
合约 string (HumanAddr) 接收代币的地址
接收者信息 ReceiverInfo(见上文) 接收者合约的代码哈希和BatchReceiveNft实现状态 nothing
token_ids 字符串数组 要发送给收件人的代币 ID 列表
msg 字符串(base64编码的二进制数据) 在调用接收者合约的BatchReceiveNft(或ReceiveNft)时包含的msg nothing
memo string 仅涉及地址(接收者、发送者、前所有者)可见的交易tx的memo nothing

BurnNft

BurnNft 用于销毁单个代币,如果需要,可以提供可选的 memo 以包含在销毁事务历史记录中。如果合约未通过 init 配置启用 burn 功能,则 BurnNft 会产生错误,除非正在销毁的代币是 SNIP-722 不可转移代币。这是因为所有者应该总是能够处置不受欢迎的不可转移代币。只有代币所有者和任何拥有有效转移批准的人才能销毁此代币。

请求
{
	"burn_nft": {
		"token_id": "ID_of_the_token_to_burn",
		"memo": "optional_memo_for_the_burn_tx",
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
token_id string 要销毁的代币标识符
memo string 销毁事务的 memo,仅由参与销毁的地址(信息发送者和前所有者,如果不同)可见 nothing
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"burn_nft": {
		"status": "success"
	}
}

BatchBurnNft

BatchBurnNft 用于销毁多个代币。信息发送者可以在每个 Burn 对象中指定要销毁的代币列表,并且提供的任何 memo 都将应用于该 Burn 对象中销毁的每个代币。信息发送者通常会列出要销毁的每个代币,但如果有不同的 memo 需要用于销毁的不同代币,则可以列出多个 Burn 对象。每次销毁代币都会在事务历史记录中单独显示。信息发送者必须有权转移/销毁列出的所有代币(要么是所有者,要么被授予转移批准)。合约可以使用 VerifyTransferApproval 查询来验证它是否有权转移/销毁所有代币。如果信息发送者没有权限转移/销毁列出的任何代币,整个消息将失败(不会销毁任何代币),并且错误将提供发送者没有所需权限的第一个代币的 ID。

即使在禁用 burn 功能后,SNIP-722 不可转移代币也可以始终销毁。这是因为所有者应该总是能够处置不受欢迎的不可转移代币。

请求
{
	"batch_burn_nft": {
		"burns": [
			{
				"token_ids": [
					"list", "of", "token", "IDs", "to", "burn"
				],
				"memo": "optional_memo_applied_to_the_burn_tx_for_every_token_listed_in_this_Burn_object"
			},
			{
				"...": "..."
			}
		],
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
销毁 Burn(见下文) 数组 待处理的 Burn 对象列表
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"batch_burn_nft": {
		"status": "success"
	}
}

Burn

Burn 对象提供了一组要销毁的代币,以及一个可选的 memo,它将包含在每次代币销毁事务历史记录中。

{
	"token_ids": [
		"list", "of", "token", "IDs", "to", "burn", "..."
	],
	"memo": "optional_memo_applied_to_the_burn_tx_for_every_token_listed_in_this_Burn_object"
}
Name Type Description 可选 省略时的值
token_ids 字符串数组 要销毁的代币 ID 列表
memo string memo 仅对参与销毁交易(信息发送者和前所有者,如果不同)的地址可见的销毁交易 nothing

CreateViewingKey

使用CreateViewingKey生成用于验证账户特定查询的随机查看密钥。字段entropy是客户端提供的字符串,用作向生成查看密钥的随机数生成器提供的熵的一部分。

请求
{
	"create_viewing_key": {
		"entropy": "string_used_as_part_of_the_entropy_supplied_to_the_rng",
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
entropy string 用作向随机查看密钥生成器提供的熵的一部分的字符串
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"viewing_key": {
		"key": "the_created_viewing_key"
	}
}

SetViewingKey

使用SetViewingKey将查看密钥设置为预定义的字符串。它将替换任何现有的密钥。最好让用户调用CreateViewingKey以确保强密钥,但此功能提供以便合约也能利用查看密钥。

请求
{
	"set_viewing_key": {
		"key": "the_new_viewing_key",
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
key string 信息发送者的新查看密钥
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"viewing_key": {
		"key": "the_message_sender's_viewing_key"
	}
}

AddMinters

AddMinters将提供的地址添加到授权铸造者列表中。只能由管理员地址调用。

请求
{
	"add_minters": {
		"minters": [
			"list", "of", "addresses", "to", "add", "to", "the", "list", "of", "minters", "..."
		],
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
铸造者 字符串数组(HumanAddr) 要添加到授权铸造者列表中的地址列表
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"add_minters": {
		"status": "success"
	}
}

RemoveMinters

使用RemoveMinters将从授权铸造者列表中删除提供的地址。只能由管理员地址调用。

请求
{
	"remove_minters": {
		"minters": [
			"list", "of", "addresses", "to", "remove", "from", "the", "list", "of", "minters", "..."
		],
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
铸造者 字符串数组(HumanAddr) 要从授权铸造者列表中删除的地址列表
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"remove_minters": {
		"status": "success"
	}
}

SetMinters

使用SetMinters精确定义授权铸造者列表。只能由管理员地址调用。

请求
{
	"set_minters": {
		"minters": [
			"list", "of", "addresses", "that", "have", "minting", "authority", "..."
		],
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
铸造者 字符串数组(HumanAddr) 允许铸造的地址列表
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"set_minters": {
		"status": "success"
	}
}

SetContractStatus

使用SetContractStatus允许合约管理员定义合约将执行哪些消息。只能由管理员地址调用。

请求
{
	"set_contract_status": {
		"level": "normal" | "stop_transactions" | "stop_all",
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
级别 合约状态(见下文) 定义合约将执行哪些消息的级别
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"set_contract_status": {
		"status": "success"
	}
}

合约状态

合约状态指示合约将执行哪些消息。可能的值有

  • "normal" - 合约将执行所有消息
  • "stop_transactions" - 合约将不允许任何铸造、销毁、发送或代币转让
  • "stop_all" - 合约将只执行一个SetContractStatus消息

ChangeAdmin

使用ChangeAdmin允许当前管理员将管理员权限转移到另一个地址(这将成为唯一的管理员地址)。只能由当前管理员地址调用。

请求
{
	"change_admin": {
		"address": "address_of_the_new_contract_admin",
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
地址 string (HumanAddr) 新的合约管理员地址
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"change_admin": {
		"status": "success"
	}
}

注册接收NFT

合约将使用RegisterReceiveNft通知它实现的NFT合约,并且可能还会通知BatchReceiveNft (见下文)。这使NFT合约能够在发送代币(或代币)时调用已注册的合约。为了遵守CW-721,ReceiveNft仅通知接收合约它已收到一个代币,并且它只通知接收合约代币的前所有者是谁,而不是发送代币的地址(可能不同)尽管它调用前所有者sender见下文)。另一方面,BatchReceiveNft可以用来通知合约它已收到多个代币,并通知接收者代币的前所有者和发送者。如果一个合约实现了BatchReceiveNft,即使只发送一个代币,NFT合约也会始终调用BatchReceiveNft,在这种情况下,token_ids数组将只有一个元素。

请求
{
	"register_receive_nft": {
		"code_hash": "code_hash_of_the_contract_implementing_a_receiver_interface",
		"also_implements_batch_receive_nft": true | false,
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
code_hash string 一个32字节十六进制编码的字符串,包含消息发送者的代码哈希,该代码哈希是一个实现了接收方的合约
also_implements_batch_receive_nft 布尔值 如果消息发送者合约也实现了BatchReceiveNft,则可以通知它已发送了一串代币 false
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"register_receive_nft": {
		"status": "success"
	}
}

RevokePermit

RevokePermit允许用户禁用用于认证查询的许可。

请求
{
	"revoke_permit": {
		"permit_name": "name_of_the_permit_that_is_no_longer_valid",
 		"padding": "optional_ignored_string_that_can_be_used_to_maintain_constant_message_length"
	}
}
Name Type Description 可选 省略时的值
permit_name string 不再有效的许可的名称
padding string 一个被忽略的字符串,可用于保持消息长度不变 nothing
响应
{
	"revoke_permit": {
		"status": "success"
	}
}

查询

查询是链外请求,未经密码学验证;因此,此合约使用查看密钥来验证特定地址的查询。这使得查看密钥验证资源密集型,以抵御离线暴力尝试猜测查看密钥。此外,即使用户尚未设置查看密钥,它也将执行相同资源密集型的处理,以防止攻击者知道未设置密钥,并在没有查看密钥或输入密钥不匹配的情况下提供相同的错误响应。

如果输入代币ID不存在,任何询问特定代币的查询将返回错误。如果代币供应是公开的,则错误将指示代币不存在。如果代币供应是私有的,无论代币是否存在或查询者是否没有权限查看请求的信息,查询都将返回相同的错误响应。

应注意到,当前区块高度和时间对Secret Network上的查询不可用,但计划在未来的分叉中使BlockInfo可用于查询。为了克服这一限制,合约每次执行消息时都会保存BlockInfo,并在查询期间使用最后一条消息执行的区块高度和时间来检查查看批准的过期。因此,如果自过期之前没有人执行任何合约消息,白名单地址可能能够查看已过期的代币的所有者或元数据。但是,因为转移/销毁代币是执行消息,它确实有当前区块高度和时间可用,并可以强制执行精确的过期。

ContractInfo

ContractInfo返回合约的名称和符号。此查询未经过认证。

请求
{
	"contract_info": {}
}
响应
{
	"contract_info": {
		"name": "contract_name",
		"symbol": "contract_symbol"
	}
}

ContractConfig

ContractConfig返回在实例化合约时选择的配置值。有关配置选项的解释,请参阅配置。此查询未经过认证。

请求
{
	"contract_config": {}
}
响应
{
	"contract_config": {
		“token_supply_is_public”: true | false,
		“owner_is_public”: true | false,
		“sealed_metadata_is_enabled”: true | false,
		“unwrapped_metadata_is_private”: true | false,
		“minter_may_update_metadata”: true | false,
		“owner_may_update_metadata”: true | false,
		“burn_is_enabled”: true | false
	}
}
Name Type Description 可选
token_supply_is_public 布尔值 如果代币ID和合约控制的代币数量是公开的,则为True
owner_is_public 布尔值 如果新铸造的代币默认具有公开所有权,则为True
sealed_metadata_is_enabled 布尔值 如果新铸造的代币具有密封元数据,则为True
unwrapped_metadata_is_private 布尔值 如果解密后密封元数据保持私有,则为True
minter_may_update_metadata 布尔值 如果授权铸造者可以更改代币的元数据,则为True
owner_may_update_metadata 布尔值 如果代币所有者可以更改其元数据,则为True
burn_is_enabled 布尔值 如果启用销毁功能,则为True

Minters

Minters返回被授权铸造代币的地址列表。此查询未经过认证。

请求
{
	"minters": {}
}
响应
{
	"minters": {
		“minters”: [
			"list", "of", "authorized", "minters", "..."
		]
	}
}
Name Type Description 可选
铸造者 字符串数组(HumanAddr) 具有铸造权限的地址列表

RegisteredCodeHash

RegisteredCodeHash将显示已注册其接收器接口的指定合约的代码哈希,并将指示合约是否实现了BatchReceiveNft

请求
{
	"registered_code_hash": {
		"contract": "address_of_the_contract_whose_registration_is_being_queried"
	}
}
Name Type Description 可选 省略时的值
合约 string (HumanAddr) 正在查询其注册信息的合约的地址
响应
{
	"registered_code_hash": {
		"code_hash": "code_hash_of_the_registered_contract",
		"also_implements_batch_receive_nft": true | false
	}
}
Name Type Description 可选
code_hash string 一个32字节十六进制编码的字符串,包含已注册合约的代码哈希
also_implements_batch_receive_nft 布尔值 如果已注册合约也实现了BatchReceiveNft,则为True

NumTokens

NumTokens返回合约控制的代币数量。如果合约的代币供应是私有的,则只有经过认证的铸造者地址被允许执行此查询。

请求
{
	"num_tokens": {
		"viewer": {
			"address": "address_of_the_querier_if_supplying_optional_ViewerInfo",
			"viewing_key": "viewer's_key_if_supplying_optional_ViewerInfo"
		}
	}
}
Name Type Description 可选 省略时的值
viewer ViewerInfo(见下文) 执行此查询的地址和查看密钥 nothing
响应
{
	"num_tokens": {
		"count": 99999
	}
}
Name Type Description 可选
count 数字(u32) 此合约控制的代币数量

ViewerInfo

ViewerInfo对象提供了查询者的地址和查看密钥。在查询中,如果公共响应和特定地址的响应不同,则可以提供此对象。

{
	"address": "address_of_the_querier_if_supplying_optional_ViewerInfo",
	"viewing_key": "viewer's_key_if_supplying_optional_ViewerInfo"
}
Name Type Description 可选 省略时的值
地址 string (HumanAddr) 执行查询的地址
viewing_key string 查询地址的查看密钥

AllTokens

AllTokens返回由合约控制的所有令牌ID的可选分页列表。如果合约的令牌供应是私有的,则只有经过身份验证的铸造者地址才能执行此查询。在分页时,将响应中接收到的最后一个令牌ID作为下一个查询的start_after令牌ID,以继续列出上一个查询停止的位置。

请求
{
	"all_tokens": {
		"viewer": {
			"address": "address_of_the_querier_if_supplying_optional_ViewerInfo",
			"viewing_key": "viewer's_key_if_supplying_optional_ViewerInfo"
		},
		"start_after": "optionally_display_only_token_ids_that_come_after_this_one_in_the_list",
		"limit": 10
	}
}
Name Type Description 可选 省略时的值
viewer ViewerInfo(见上文) 执行此查询的地址和查看密钥 nothing
start_after string 结果将仅列出列表中此令牌ID之后的令牌ID nothing
limit 数字(u32) 要返回的令牌ID数量 300
响应
{
	"token_list": {
		"tokens": [
			"list", "of", "token", "IDs", "controlled", "by", "the", "contract", "..."
		]
	}
}
Name Type Description 可选
tokens 字符串数组 由本合约控制的令牌ID列表

IsUnwrapped

IsUnwrapped指示令牌是否已解包。如果密封元数据未启用,则所有令牌都视为已解包。此查询未经身份验证。

请求
{
	"is_unwrapped": {
		"token_id": "ID_of_the_token_whose_unwrapped_status_is_being_queried"
	}
}
Name Type Description 可选 省略时的值
token_id string 正在查询解包状态的令牌ID
响应
{
	"is_unwrapped": {
		"token_is_unwrapped": true | false
	}
}
Name Type Description 可选
token_is_unwrapped 布尔值 如果令牌已解包(或密封元数据未启用),则为true

IsTransferable

IsTransferable是一个SNIP-722查询,指示令牌是否可转让。此查询未经身份验证。

请求
{
	"is_transferable": {
		"token_id": "ID_of_the_token_whose_transferability_is_being_queried"
	}
}
Name Type Description 可选 省略时的值
token_id string 正在查询转让能力的令牌ID
响应
{
	"is_transferable": {
		"token_is_transferable": true | false
	}
}
Name Type Description 可选
token_is_transferable 布尔值 如果令牌可转让,则为true

OwnerOf

OwnerOf在查询者是所有者或已被授权查看所有者的情况下,返回指定令牌的所有者。如果查询者是所有者,OwnerOf还将显示所有已被授予转让权限的地址。转让批准列表是作为CW-721合规性的一部分提供的;然而,令牌所有者建议使用NftDossier来获取更完整的列表,该列表包括view_owner和view_private_metadata批准(CW-721无法保留私有的)。如果没有提供查看者,OwnerOf将仅在令牌的拥有权是公开的情况下显示所有者。

请求
{
	"owner_of": {
		"token_id": "ID_of_the_token_being_queried",
		"viewer": {
			"address": "address_of_the_querier_if_supplying_optional_ViewerInfo",
			"viewing_key": "viewer's_key_if_supplying_optional_ViewerInfo"
		},
		"include_expired": true | false
	}
}
Name Type Description 可选 省略时的值
token_id string 正在查询的令牌ID
viewer ViewerInfo(见上文) 执行此查询的地址和查看密钥 nothing
include_expired 布尔值 如果应将已过期的转让批准包含在响应中,则为true false
响应
{
	"owner_of": {
		"owner": "address_of_the_token_owner",
		"approvals": [
			{
				"spender": "address_with_transfer_approval",
				"expires": "never" | {"at_height": 999999} | {"at_time":999999}
			},
			{
				"...": "..."
			}
		]
	}
}
Name Type Description 可选
owner string (HumanAddr) 令牌所有者的地址
approvals 数组Cw721Approval(见下文) 转让此令牌的批准列表

Cw721Approval

Cw721Approval对象用于显示CW-721风格的批准,仅限于仅允许转让的权限,因为CW-721不支持所有权或元数据隐私。

{
	"spender": "address_with_transfer_approval",
	"expires": "never" | {"at_height": 999999} | {"at_time":999999}
}
Name Type Description 可选
花费者 string (HumanAddr) 白名单中的地址,可转让令牌
expires 到期时间(见上方) 此转让批准的过期时间。可以是区块高度、时间或永不

NftInfo

NftInfo返回令牌的公共元数据。它遵循CW-721规范,该规范基于ERC-721元数据JSON模式。最多定义一个字段token_uriextension

请求
{
	"nft_info": {
		"token_id": "ID_of_the_token_being_queried"
	}
}
Name Type Description 可选 省略时的值
token_id string 正在查询的令牌ID
响应
{
	"nft_info": {
		"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
		"extension": {
			"...": "..."
		}
	}
}
Name Type Description 可选
token_uri string 指向链下JSON元数据的URI
extension 扩展(见上文) 定义链上元数据的数据结构
最多定义一个字段token_uriextension

AllNftInfo

所有NftInfo显示OwnerOfNftInfo的查询结果。这是为了满足CW-721规范,但为了获取有关代币的更完整信息,请使用NftDossier,它将包括私人元数据和如果查询者被允许查看此信息,还将包括view_owner和view_private_metadata批准。

请求
{
	"all_nft_info": {
		"token_id": "ID_of_the_token_being_queried",
		"viewer": {
			"address": "address_of_the_querier_if_supplying_optional_ViewerInfo",
			"viewing_key": "viewer's_key_if_supplying_optional_ViewerInfo"
		},
		"include_expired": true | false
	}
}
Name Type Description 可选 省略时的值
token_id string 正在查询的令牌ID
viewer ViewerInfo(见上文) 执行此查询的地址和查看密钥 nothing
include_expired 布尔值 如果应将已过期的转让批准包含在响应中,则为true false
响应
{
	"all_nft_info": {
		"access": {
			"owner": "address_of_the_token_owner",
			"approvals": [
				{
					"spender": "address_with_transfer_approval",
					"expires": "never" | {"at_height": 999999} | {"at_time":999999}
				},
				{
					"...": "..."
				}
			]
		},
		"info": {
			"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
			"extension": {
				"...": "..."
			}
		}
	}
}
Name Type Description 可选
访问 Cw721OwnerOfResponse(见下文) 如果允许查看此信息,则显示代币的所有者和其转让批准
信息 元数据(见上文) 代币的公共元数据

Cw721OwnerOfResponse

Cw721OwnerOfResponse对象用于显示如果查询者有view_owner权限,则显示代币的所有者,如果查询者是代币的所有者,则显示代币的转让批准。

{
	"owner": "address_of_the_token_owner",
	"approvals": [
		{
			"spender": "address_with_transfer_approval",
			"expires": "never" | {"at_height": 999999} | {"at_time":999999}
		},
		{
			"...": "..."
		}
	]
}
Name Type Description 可选
owner string (HumanAddr) 令牌所有者的地址
approvals Cw721Approval(见上文)数组 转让此令牌的批准列表

PrivateMetadata

如果查询者被允许查看,则PrivateMetadata返回代币的私人元数据。它遵循CW-721元数据规范,该规范基于ERC-721元数据JSON模式。最多只能定义字段token_uriextension中的一个。如果元数据是密封的,则不允许任何人查看,直到它被揭示。如果没有提供查看者,则PrivateMetadata只会显示如果私人元数据对此代币是公开的,则显示私人元数据。

请求
{
	"private_metadata": {
		"token_id": "ID_of_the_token_being_queried",
		"viewer": {
			"address": "address_of_the_querier_if_supplying_optional_ViewerInfo",
			"viewing_key": "viewer's_key_if_supplying_optional_ViewerInfo"
		},
	}
}
Name Type Description 可选 省略时的值
token_id string 正在查询的令牌ID
viewer ViewerInfo(见上文) 执行此查询的地址和查看密钥 nothing
响应
{
	"private_metadata": {
		"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
		"extension": {
			"...": "..."
		}
	}
}
Name Type Description 可选
token_uri string 指向链下JSON元数据的URI
extension 扩展(见上文) 定义链上元数据的数据结构
最多定义一个字段token_uriextension

NftDossier

NftDossier返回查看者被允许查看的关于代币的所有信息。如果没有提供查看者,则NftDossier将只显示已公开的信息。响应可能包括所有者、公共元数据、私人元数据、私人元数据不可查看的原因、版税信息、铸造运行信息、代币是否可转让、所有权是否公开、私人元数据是否公开以及(如果查询者是所有者)此代币的批准以及所有者的库存级批准。如果查询者有权转让代币,则该实现将仅显示代币的版税接收者地址。

SNIP-722将一个transferable字段添加到NftDossier响应中。

SNIP-723(待编写规范)添加一个unwrapped字段,如果此代币的私人元数据是密封的,则为false。

请求
{
	"nft_dossier": {
		"token_id": "ID_of_the_token_being_queried",
		"viewer": {
			"address": "address_of_the_querier_if_supplying_optional_ViewerInfo",
			"viewing_key": "viewer's_key_if_supplying_optional_ViewerInfo"
		},
		"include_expired": true | false
	}
}
Name Type Description 可选 省略时的值
token_id string 正在查询的令牌ID
viewer ViewerInfo(见上文) 执行此查询的地址和查看密钥 nothing
include_expired 布尔值 如果应在响应中包含已过期的批准,则为true false
响应
{
	"nft_dossier": {
		"owner": "address_of_the_token_owner",
		"public_metadata": {
			"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
			"extension": {
				"...": "..."
			}
		},
		"private_metadata": {
			"token_uri": "optional_uri_pointing_to_off-chain_JSON_metadata",
			"extension": {
				"...": "..."
			}
		},
		"display_private_metadata_error": "optional_error_describing_why_private_metadata_is_not_viewable_if_applicable",
		"royalty_info": {
			"decimal_places_in_rates": 4,
			"royalties": [
				{
					"recipient": "optional_address_that_should_be_paid_this_royalty",
					"rate": 100,
				},
				{
					"...": "..."
				}
			],
		},
		"mint_run_info": {
			"collection_creator": "optional_address_that_instantiated_this_contract",
			"token_creator": "optional_address_that_minted_this_token",
			"time_of_minting": 999999,
			"mint_run": 3,
			"serial_number": 67,
			"quantity_minted_this_run": 1000,
		},
		"transferable": true | false,
		"unwrapped": true | false,
		"owner_is_public": true | false,
		"public_ownership_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
		"private_metadata_is_public": true | false,
		"private_metadata_is_public_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
		"token_approvals": [
			{
				"address": "whitelisted_address",
				"view_owner_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
				"view_private_metadata_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
				"transfer_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
			},
			{
				"...": "..."
			}
		],
		"inventory_approvals": [
			{
				"address": "whitelisted_address",
				"view_owner_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
				"view_private_metadata_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
				"transfer_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
			},
			{
				"...": "..."
			}
		]
	}
}
Name Type Description 可选
owner string (HumanAddr) 令牌所有者的地址
public_metadata 元数据(见上文) 代币的公共元数据
private_metadata 元数据(见上文) 代币的私人元数据
display_private_metadata_error string 如果私人元数据未显示,则相应的错误消息
royalty_info RoyaltyInfo(见上文) 代币的RoyaltyInfo
mint_run_info MintRunInfo(见下文) 代币的MintRunInfo
transferable 布尔值 如果此代币是可转让的,则为true no*
unwrapped 布尔值 如果此代币的私人元数据是密封的,则为false no*
owner_is_public 布尔值 如果此代币的所有权是公开的,则为true
public_ownership_expiration 到期时间(见上方) 此代币公开所有权的到期时间。可以是区块高度、时间或永不
private_metadata_is_public 布尔值 如果私人元数据对此代币是公开的,则为true
private_metadata_is_public_expiration 到期时间(见上方) 私人元数据公开显示的到期时间。可以是区块高度、时间或永不
token_approvals 数组Snip721Approval(见下文) 此代币的批准列表
inventory_approvals 数组Snip721Approval(见下文) 所有者库存级批准的列表

对于符合SNIP-722规范的合约,transferable字段是必需的,但由于SNIP-722是SNIP-721的可选扩展,任何不包含该字段的NftDossier响应可以被认为是仅实现可转让代币(相当于transferable = true)的合约生成的。对于符合SNIP-723(待编写规范)规范的合约,unwrapped字段是必需的,但由于SNIP-723是SNIP-721的可选扩展,NftDossier响应可能不包含该字段。在这种情况下,如果查询者有权正常查看私有元数据,display_private_metadata_error字段可能表明私有元数据已被密封。或者可以进行IsUnwrapped查询以了解代币的密封状态。

MintRunInfo

MintRunInfo包含关于此代币铸造的信息。

{
	"collection_creator": "optional_address_that_instantiated_this_contract",
	"token_creator": "optional_address_that_minted_this_token",
	"time_of_minting": 999999,
	"mint_run": 3,
	"serial_number": 67,
	"quantity_minted_this_run": 1000,
}
Name Type Description 可选
collection_creator string (HumanAddr) 实例化此合约的地址
token_creator string (HumanAddr) 铸造此代币的地址
time_of_minting 数字(u64) 自1970年1月1日以来此代币铸造的秒数
mint_run 数字(u32) 此令牌铸造的铸造运行次数。这表示同一时间发布的NFT批
serial_number 数字(u32) 此令牌的序列号
此运行中铸造的数量 数字(u32) 本铸造轮次中铸造的代币数量。

铸造轮次是指同时发布的一组NFT。例如,如果一个创作者决定制作100份副本,那么它们都将属于第1个铸造轮次。如果它们销量好,并且创作者想要重新发布该NFT,他可以再制作100份副本,这些副本都将属于第2个铸造轮次。通过组合使用mint_run(铸造轮次)、serial_number(序列号)和quantity_minted_this_run(本轮次铸造数量),可以用来表示,例如,这个代币是第3个铸造轮次中铸造的1000个代币中的第67个。

Snip721Approval

Snip721Approval对象用于显示授予白名单地址的所有批准(及其过期时间)。如果白名单地址没有相应的权限类型,过期字段将为null。

{
	"address": "whitelisted_address",
	"view_owner_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
	"view_private_metadata_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
	"transfer_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
}
Name Type Description 可选
地址 string (HumanAddr) 白名单地址
view_owner_expiration 到期时间(见上方) 查看所有者权限的过期时间。可以是区块高度、时间或永不
view_private_metadata_expiration 到期时间(见上方) 查看__私有元数据权限的过期时间。可以是区块高度、时间或永不
transfer_expiration 到期时间(见上方) 转让权限的过期时间。可以是区块高度、时间或永不

RoyaltyInfo (查询)

如果请求中提供了token_id,RoyaltyInfo将返回该代币的版税信息。此实现仅在查询者有权转让代币时显示代币的版税接收者地址。如果没有请求token_id,RoyaltyInfo将显示合约的默认版税信息。此实现仅在查询者是授权铸造者时显示合约的默认版税接收者地址。

请求
{
	"royalty_info": {
		"token_id": "optional_ID_of_the_token_being_queried",
		"viewer": {
			"address": "address_of_the_querier_if_supplying_optional_ViewerInfo",
			"viewing_key": "viewer's_key_if_supplying_optional_ViewerInfo"
		},
	}
}
Name Type Description 可选 省略时的值
token_id string 正在查询的令牌ID 查询合约的默认RoyaltyInfo
viewer ViewerInfo(见上文) 执行此查询的地址和查看密钥 nothing
响应
{
	"royalty_info": {
		"decimal_places_in_rates": 4,
		"royalties": [
			{
				"recipient": "optional_address_that_should_be_paid_this_royalty",
				"rate": 100,
			},
			{
				"...": "..."
			}
		],
	}
}
Name Type Description 可选
royalty_info RoyaltyInfo(见上文) 根据请求返回的代币或默认RoyaltyInfo

TokenApprovals

TokenApprovals返回代币的所有者和私有元数据是否公开,并列出针对此代币的所有特定批准。只有代币的所有者才能执行TokenApprovals。

请求
{
	"token_approvals": {
		"token_id": "ID_of_the_token_being_queried",
		"viewing_key": "the_token_owner's_viewing_key",
		"include_expired": true | false
	}
}
Name Type Description 可选 省略时的值
token_id string 正在查询的令牌ID
viewing_key string 代币所有者的查看密钥
include_expired 布尔值 如果应在响应中包含已过期的批准,则为true false
响应
{
	"token_approvals": {
		"owner_is_public": true | false,
		"public_ownership_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
		"private_metadata_is_public": true | false,
		"private_metadata_is_public_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
		"token_approvals": [
			{
				"address": "whitelisted_address",
				"view_owner_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
				"view_private_metadata_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
				"transfer_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
			},
			{
				"...": "..."
			}
		],
	}
}
Name Type Description 可选
owner_is_public 布尔值 如果此代币的所有权是公开的,则为true
public_ownership_expiration 到期时间(见上方) 此代币公开所有权的到期时间。可以是区块高度、时间或永不
private_metadata_is_public 布尔值 如果私人元数据对此代币是公开的,则为true
private_metadata_is_public_expiration 到期时间(见上方) 私人元数据公开显示的到期时间。可以是区块高度、时间或永不
token_approvals 包含Snip721Approval(见上方)的数组 此代币的批准列表

ApprovedForAll

ApprovedForAll显示所有具有转让指定所有者所有代币批准的地址。这是为了符合CW-721规范,但由于在Secret Network上批准是私有的,如果未提供owner的查看密钥,则不会显示任何批准。对于更完整的库存范围批准列表,所有者应使用InventoryApprovals,它还包括view_owner和view_private_metadata批准。

请求
{
	"approved_for_all": {
		"owner": "address_whose_approvals_are_being_queried",
		"viewing_key": "owner's_viewing_key"
		"include_expired": true | false
	}
}
Name Type Description 可选 省略时的值
owner string (HumanAddr) 正在查询批准的地址
viewing_key string 所有者的查看密钥 nothing
include_expired 布尔值 如果应在响应中包含已过期的批准,则为true false
响应
{
	"approved_for_all": {
		"operators": [
				{
					"spender": "address_with_transfer_approval",
					"expires": "never" | {"at_height": 999999} | {"at_time":999999}
				},
				{
					"...": "..."
				}
		]
	}
}
Name Type Description 可选
operators Cw721Approval(见上文)数组 转让所有者所有代币的批准列表

InventoryApprovals

InventoryApprovals返回地址的所有代币是否具有公开所有权和/或公开显示私有元数据,并列出地址已授予的所有库存范围批准。仅接受此指定地址的查看密钥。

请求
{
	"inventory_approvals": {
		"address": "address_whose_approvals_are_being_queried",
		"viewing_key": "the_viewing_key_associated_with_this_address",
		"include_expired": true | false
	}
}
Name Type Description 可选 省略时的值
地址 string (HumanAddr) 正在查询库存范围批准的地址
viewing_key string 与此地址关联的查看密钥
include_expired 布尔值 如果应在响应中包含已过期的批准,则为true false
响应
{
	"inventory_approvals": {
		"owner_is_public": true | false,
		"public_ownership_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
		"private_metadata_is_public": true | false,
		"private_metadata_is_public_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
		"inventory_approvals": [
			{
				"address": "whitelisted_address",
				"view_owner_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
				"view_private_metadata_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
				"transfer_expiration": "never" | {"at_height": 999999} | {"at_time":999999},
			},
			{
				"...": "..."
			}
		],
	}
}
Name Type Description 可选
owner_is_public 布尔值 如果此地址的所有代币的拥有权都是公开的,则为真
public_ownership_expiration 到期时间(见上方) 当所有代币的公开拥有权到期时。可以是区块高度、时间或永不
private_metadata_is_public 布尔值 如果此地址的所有代币的私有元数据是公开的,则为真
private_metadata_is_public_expiration 到期时间(见上方) 私人元数据公开显示的到期时间。可以是区块高度、时间或永不
inventory_approvals 包含Snip721Approval(见上方)的数组 此地址的库存范围内的批准列表

Tokens

显示所有属于指定 owner 的代币 ID 的可选分页列表。它只会显示查询者具有 view_owner 权限的所有者代币。如果没有提供查看密钥,它将只显示所有者具有公开拥有权的代币。在分页时,将响应中接收到的最后一个代币 ID 作为下一个查询的 start_after 字符串,以继续列出上一个查询停止的位置。

请求
{
	"tokens": {
		"owner": "address_whose_inventory_is_being_queried",
		"viewer": "address_of_the_querier_if_different_from_owner",
		"viewing_key": "querier's_viewing_key"
		"start_after": "optionally_display_only_token_ids_that_come_after_this_one_in_the_list",
		"limit": 10
	}
}
Name Type Description 可选 省略时的值
owner string (HumanAddr) 正在查询库存的地址
viewer string (HumanAddr) 如果与 owner 不同,则为查询者的地址 nothing
viewing_key string 查询者的查看密钥 nothing
start_after string 结果将仅列出列表中此令牌ID之后的令牌ID nothing
limit 数字(u32) 要返回的令牌ID数量 30
响应
{
	"token_list": {
		"tokens": [
			"list", "of", "the", "owner's", "tokens", "..."
		]
	}
}
Name Type Description 可选
tokens 字符串数组 指定 owner 拥有的代币 ID 列表

VerifyTransferApproval

VerifyTransferApproval 将验证指定地址是否有权转移提供的整个代币列表。如上所述,查询可能会在显示已过期批准时延迟,因此即使在 VerifyTransferApproval 验证之后,尝试转移也可能仍然失败。如果地址没有对所有代币的转移批准,则响应将指示地址无法转移的第一个代币。

因为 VerifyTransferApproval 的目的是为合约提供一种在尝试转移代币之前知道是否失败的方法,所以此实现将考虑任何 SNIP-722 不可转移的代币为未批准转移。

请求
{
	"verify_transfer_approval": {
		"token_ids": [
			"list", "of", "tokens", "to", "check", "for", "transfer", "approval", "..."
		],
		"address": "address_to_use_for_approval_checking",
		"viewing_key": "address'_viewing_key"
	}
}
Name Type Description 可选 省略时的值
token_ids 字符串数组 要检查地址转移批准的代币列表
地址 string (HumanAddr) 正在检查转移批准的地址
viewing_key string 地址的查看密钥
响应
{
	"verify_transfer_approval": {
		"approved_for_all": true | false,
		"first_unapproved_token": "token_id"
	}
}
Name Type Description 可选
approved_for_all 布尔值 如果 address 对所有 token_ids 具有转移批准,则为真
first_unapproved_token string 列表中地址没有转移批准的第一个代币

ImplementsTokenSubtype

ImplementsTokenSubtype 是一个 SNIP-722 查询,它指示合约是否实现了 token_subtype 扩展字段。因为旧版 SNIP-721 合约不实现此查询且不实现代币子类型,所以任何使用此查询的应用程序都应该始终检查错误响应,并且如果响应是错误,则可以认为该合约没有实现子类型。因为消息解析会忽略合约不期望的输入字段,所以应该在尝试使用 token_subtype 扩展 字段的消息之前使用此查询。如果消息发送到不实现 token_subtype 的 SNIP-721 合约,该字段将被忽略,并且生成的 NFT 仍然会创建/更新,但不会包含 token_subtype

请求
{
	"implements_token_subtype": {}
}
响应
{
	"implements_token_subtype": {
		"is_enabled": true | false
	}
}
Name Type Description 可选
is_enabled 布尔值 如果合约实现了代币子类型,则为真

ImplementsNonTransferableTokens

ImplementsNonTransferableTokens是一个SNIP-722查询,用于判断合约是否实现了不可转让代币。由于旧版SNIP-721合约不实现此查询且不实现不可转让代币,因此在使用此查询时,应始终检查错误响应。如果响应为错误,则可认为合约未实现不可转让代币。因为消息解析会忽略合约不期望的输入字段,所以在尝试铸造不可转让代币之前应使用此查询。如果消息发送到未实现不可转让代币的SNIP-721合约,则transferable字段将被忽略,并且生成的NFT仍然会被创建,但始终可转让。

请求
{
	"implements_non_transferable_tokens": {}
}
响应
{
	"implements_non_transferable_tokens": {
		"is_enabled": true | false
	}
}
Name Type Description 可选
is_enabled 布尔值 如果合约实现了不可转让代币则为真

TransactionHistory

TransactionHistory显示涉及指定地址的交易(铸造、销毁和转让)的按时间倒序的列表,该列表可以是可选分页的。

请求
{
	"transaction_history": {
		"address": "address_whose_tx_history_is_being_queried",
		"viewing_key": "address'_viewing_key"
		"page": "optional_page_to_display",
		"page_size": 10
	}
}
Name Type Description 可选 省略时的值
地址 string (HumanAddr) 正在查询交易历史的地址
viewing_key string 地址的查看密钥
页码 数字(u32) 要显示的页码,其中第一笔显示的交易跳过了page * page_size最近的交易 0
page_size 数字(u32) 要返回的交易数量 30
响应
{
	"transaction_history": {
		"total": 99,
		"txs": [
			{
				"tx_id": 9999,
				"block_height": 999999,
				"block_time": 1610000012,
				"token_id": "token_involved_in_the_tx",
				"action": {
					"transfer": {
						"from": "previous_owner_of_the_token",
						"sender": "address_that_sent_the_token_if_different_than_the_previous_owner",
						"recipient": "new_owner_of_the_token"
					}
				},
				"memo": "optional_memo_for_the_tx"
			},
			{
				"tx_id": 9998,
				"block_height": 999998,
				"block_time": 1610000006,
				"token_id": "token_involved_in_the_tx",
				"action": {
					"mint": {
						"minter": "address_that_minted_the_token",
						"recipient": "owner_of_the_newly_minted_token"
					}
				},
				"memo": "optional_memo_for_the_tx"
			},
			{
				"tx_id": 9997,
				"block_height": 999997,
				"block_time": 1610000000,
				"token_id": "token_involved_in_the_tx",
				"action": {
					"burn": {
						"owner": "previous_owner_of_the_token",
						"burner": "address_that_burned_the_token_if_different_than_the_previous_owner",
					}
				},
				"memo": "optional_memo_for_the_tx"
			},
			{
				"...": "..."
			}
		],
	}
}
Name Type Description 可选
total 数字(u64) 涉及指定地址的交易总数
txs 包含Tx(见下文)的数组 涉及指定地址的按时间倒序的交易列表

Tx

Tx对象包含有关铸造销毁转让交易的所有相关信息。

{
	"tx_id": 9999,
	"block_height": 999999,
	"block_time": 1610000000,
	"token_id": "token_involved_in_the_tx",
	"action": { TxAction::Transfer | TxAction::Mint | TxAction::Burn },
	"memo": "optional_memo_for_the_tx"
}
Name Type Description 可选
tx_id 数字(u64) 交易标识符
block_height 数字(u64) 包含交易的分块编号
block_time 数字(u64) 包含交易的分块的1970年1月1日以来的秒数
token_id string 涉及交易代币
action TxAction(见下文) 交易类型及其特定信息
memo string 只有参与交易地址可见的交易memo

TxAction

TxAction对象定义了交易类型并持有该类型的特定信息。

  • TxAction::Mint
{
	"minter": "address_that_minted_the_token",
	"recipient": "owner_of_the_newly_minted_token"
}

Name Type Description 可选
minter string (HumanAddr) 铸造代币的地址
接收方 string (HumanAddr) 新铸造代币所有者的地址
  • TxAction::Transfer
{
	"from": "previous_owner_of_the_token",
	"sender": "address_that_sent_the_token_if_different_than_the_previous_owner",
	"recipient": "new_owner_of_the_token"
}

Name Type Description 可选
from string (HumanAddr) 代币的前所有者
sender string (HumanAddr) 如果不同于前所有者,发送代币的地址
接收方 string (HumanAddr) 代币的新所有者
  • TxAction::Burn
{
	"owner": "previous_owner_of_the_token",
	"burner": "address_that_burned_the_token_if_different_than_the_previous_owner",
}

Name Type Description 可选
owner string (HumanAddr) 代币的前所有者
burner string (HumanAddr) 如果不同于前所有者,销毁代币的地址

WithPermit

SNIP-721合约可以可选实现SNIP-24中指定的查询许可。它们在查看密钥方面有所改进,因为许可允许用户在不首先需要发送交易来设置或创建查看密钥的情况下查询私有信息(有关更多详细信息,请参阅此处)。

因为SNIP-721s已经提供了白名单功能,允许其他地址查看私有信息,所以SNIP-721许可通常使用owner权限类型来验证查询,以显示许可创建者地址被授权查看的所有私有信息。因此,通常建议您不要将带有owner权限的SNIP-721许可授予任何人。如果您需要某人查看您拥有的代币的私有信息,您应该将他们的地址列入白名单,然后他们将使用自己创建的许可来查看您批准的内容。这消除了提供许可的需要,消除了跟踪许可名称以撤销查看权限的需要,并提供了查询网络的简单方法,以查看目前拥有查看权限的每个人。尽管如此,合约开发者不受限制,如果适合他们的用例,可以选择实现具有更细粒度权限的许可,以便用户与他人共享。

WithPermit以与SNIP-24相同的方式封装许可查询。

请求
{
	"with_permit": {
		"permit": {
			"params": {
				"permit_name": "some_name",
				"allowed_tokens": ["collection_address_1", "collection_address_2", "..."],
				"chain_id": "some_chain_id",
				"permissions": ["owner"]
			},
			"signature": {
				"pub_key": {
					"type": "tendermint/PubKeySecp256k1",
					"value": "33_bytes_of_secp256k1_pubkey_as_base64"
				},
				"signature": "64_bytes_of_secp256k1_signature_as_base64"
			}
		},
		"query": {
			"QueryWithPermit_variant_defined_below": { "...": "..." }
		}
	}
}
Name Type Description 可选 省略时的值
许可 许可 遵循SNIP-24标准的许可
查询 QueryWithPermit(见下文) 要执行的查询及其输入参数

QueryWithPermit

QueryWithPermit是一个枚举,其变体与所有需要身份验证的SNIP-721查询相关联。输入参数与相应查询相同,只是没有ViewerInfo和查看密钥,因为WithPermit查询中提供的许可提供了地址和身份验证。

WithPermit 查询参数
"query": {
	"num_tokens": {}
}
WithPermit 查询参数
"query": {
	"all_tokens": {
		"start_after": "optionally_display_only_token_ids_that_come_after_this_one_in_the_list",
		"limit": 10
	}
}
WithPermit 查询参数
"query": {
	"owner_of": {
		"token_id": "ID_of_the_token_being_queried",
		"include_expired": true | false
	}
}
WithPermit 查询参数
"query": {
	"all_nft_info": {
		"token_id": "ID_of_the_token_being_queried",
		"include_expired": true | false
	}
}
WithPermit 查询参数
"query": {
	"private_metadata": {
		"token_id": "ID_of_the_token_being_queried",
	}
}
WithPermit 查询参数
"query": {
	"nft_dossier": {
		"token_id": "ID_of_the_token_being_queried",
		"include_expired": true | false
	}
}
WithPermit 查询参数
"query": {
	"batch_nft_dossier": {
		"token_ids": ["ID_of", "the_tokens", "being_queried"],
		"include_expired": true | false
	}
}
WithPermit 查询参数
"query": {
	"royalty_info": {
		"token_id": "optional_ID_of_the_token_being_queried",
	}
}
WithPermit 查询参数
"query": {
	"token_approvals": {
		"token_id": "ID_of_the_token_being_queried",
		"include_expired": true | false
	}
}
WithPermit 查询参数
"query": {
	"approved_for_all": {
		"include_expired": true | false
	}
}
WithPermit 查询参数
"query": {
	"inventory_approvals": {
		"include_expired": true | false
	}
}
WithPermit 查询参数
"query": {
	"num_tokens_of_owner": {
		"owner": "address_whose_token_count_is_being_queried",
	}
}
WithPermit 查询参数
"query": {
	"tokens": {
		"owner": "address_whose_inventory_is_being_queried",
		"start_after": "optionally_display_only_token_ids_that_come_after_this_one_in_the_list",
		"limit": 10
	}
}
WithPermit 查询参数
"query": {
	"verify_transfer_approval": {
		"token_ids": [
			"list", "of", "tokens", "to", "check", "for", "transfer", "approval", "..."
		],
	}
}
WithPermit 查询参数
"query": {
	"transaction_history": {
		"page": "optional_page_to_display",
		"page_size": 10
	}
}

接收器接口

当令牌合约执行 SendNftBatchSendNft 消息时,如果合约已使用 RegisterReceiveNft 注册其代码哈希,则会对接收合约的接收接口进行回调。与 ReceiveNft 相比,BatchReceiveNft 更受青睐,因为 ReceiveNft 不允许接收方知道谁发送了代币,只有其前所有者,且 ReceiveNft 只能处理一个代币。因此,当向同一合约(例如一副游戏卡牌)发送多个代币时,效率不高。ReceiveNft 主要存在只是为了保持 CW-721 兼容性,如果接收合约注册了它实现了 BatchReceiveNft,即使消息中只有一个 token_id,也会调用 BatchReceiveNft。

还应注意的是,CW-721 的 sender 字段名称不准确,因为它用于存储代币来源的地址,而不是发送地址(这通常不是同一个地址)。为了保持 CW-721 兼容性,名称被勉强保留在 ReceiveNft 中,但 BatchReceiveNft 使用 sender 来存储发送地址(这符合其真实角色和 SNIP-20 Receive 对应方)。任何实现这两个接收接口的合约都必须确保 ReceiveNft 的 sender 字段实际上被处理得像 BatchReceiveNft 的 from 字段一样。再次为由于传播不准确信息而造成的任何混淆表示歉意,但鉴于 InterNFT 计划使用 CW-721 标准,遵守 CW-721 可能是必要的。

ReceiveNft

ReceiveNft 可能是任何想要实现接收接口的合约的 HandleMsg 变体。BatchReceiveNft,它更具有信息性和效率,比 ReceiveNft 更受青睐。

{
	"receive_nft": {
		"sender": "address_of_the_previous_owner_of_the_token",
		"token_id": "ID_of_the_sent_token",
		"msg": "optional_base64_encoded_Binary_message_used_to_control_receiving_logic"
	}
}
Name Type Description 可选 省略时的值
sender string (HumanAddr) 代币的前所有者地址(有关此不准确的命名约定,请参阅上方内容)
token_id string 发送的代币 ID
msg 字符串(base64编码的二进制数据) 用于控制接收逻辑的消息 nothing

BatchReceiveNft

BatchReceiveNft 可能是任何想要实现接收接口的合约的 HandleMsg 变体。BatchReceiveNft,它更具有信息性和效率,比 ReceiveNft 更受青睐。

{
	"batch_receive_nft": {
		"sender": "address_that_sent_the_tokens",
		"from": "address_of_the_previous_owner_of_the_tokens",
		"token_ids": [
			"list", "of", "tokens", "sent", "..."
		],
		"msg": "optional_base64_encoded_Binary_message_used_to_control_receiving_logic"
	}
}
Name Type Description 可选 省略时的值
sender string (HumanAddr) 发送代币的地址(此字段在 ReceiveNft 中没有等效项,请参阅上方内容)
from string (HumanAddr) 代币的前所有者地址(此字段等同于 ReceiveNft 的 sender 字段,请参阅上方内容)
token_ids 字符串数组 发送的代币列表
msg 字符串(base64编码的二进制数据) 用于控制接收逻辑的消息 nothing

依赖项

~4–5.5MB
~110K SLoC