6个版本 (破坏性)
0.10.0 | 2023年10月18日 |
---|---|
0.9.0 | 2023年6月4日 |
0.7.0 | 2022年12月18日 |
0.6.0 | 2022年10月25日 |
0.2.0 | 2022年1月16日 |
#2396 in 魔法豆
每月134次 下载
在 secret-toolkit 中使用
225KB
4K SLoC
秘密合约开发工具包 - SNIP-721接口
⚠️ 此包是 secret-toolkit
包的子包。请参阅其crate页面以获取更多上下文。
这些函数旨在帮助您轻松与符合SNIP-721标准的NFT合约交互。
处理消息
您可以创建一个HandleMsg变体,并调用 to_cosmos_msg
函数来生成应推送到InitResponse或HandleResponse messages
Vec的CosmosMsg。
或者您可以直接调用每个Handle消息的函数来生成适当的回调CosmosMsg。
示例
# use cosmwasm_std::{Uint128, StdError, StdResult, CosmosMsg, Response};
# use secret_toolkit_snip721::transfer_nft_msg;
# fn main() -> StdResult<()> {
let recipient = "ADDRESS_TO_TRANSFER_TO".to_string();
let token_id = "TOKEN_ID".to_string();
let memo = Some("TRANSFER_MEMO".to_string());
let padding = None;
let block_size = 256;
let callback_code_hash = "TOKEN_CONTRACT_CODE_HASH".to_string();
let contract_addr = "TOKEN_CONTRACT_ADDRESS".to_string();
let cosmos_msg = transfer_nft_msg(
recipient,
token_id,
memo,
padding,
block_size,
callback_code_hash,
contract_addr,
)?;
let response = Ok(Response::new().add_message(cosmos_msg));
# response.map(|_r| ())
# }
要调用SNIP-721 Handle函数,只需调用相应的工具函数,并将生成的 CosmosMsg
放入InitResponse或HandleResponse的 messages
Vec中。在这个示例中,我们将一个名为"TOKEN_ID"的NFT转移给接收者地址。我们不使用Transfer消息的padding字段,而是将整个消息填充到256字节的块中。
您可能也注意到CreateViewingKey不支持。这是因为合约在调用CreateViewingKey时已经执行完毕,因此无法看到返回的观看密钥。如果合约需要观看密钥,它必须创建自己的足够复杂的观看密钥,并将其作为参数传递给SetViewingKey。您可以在Snip20参考实现中看到创建复杂观看密钥的示例。还强烈建议您使用block_size填充选项来隐藏合约生成的观看密钥的长度。
查询
这些都是SNIP-721工具箱查询可以返回的类型
# use secret_toolkit_snip721::{Expiration};
pub struct ContractInfo {
pub name: String,
pub symbol: String,
}
pub struct NumTokens {
pub count: u32,
}
pub struct TokenList {
pub tokens: Vec<String>,
}
pub struct Cw721Approval {
pub spender: String,
pub expires: Expiration,
}
pub struct OwnerOf {
pub owner: Option<String>,
pub approvals: Vec<Cw721Approval>,
}
pub struct Metadata {
pub name: Option<String>,
pub description: Option<String>,
pub image: Option<String>,
}
pub struct AllNftInfo {
pub access: OwnerOf,
pub info: Option<Metadata>,
}
pub struct Snip721Approval {
pub address: String,
pub view_owner_expiration: Option<Expiration>,
pub view_private_metadata_expiration: Option<Expiration>,
pub transfer_expiration: Option<Expiration>,
}
pub struct NftDossier {
pub owner: Option<String>,
pub public_metadata: Option<Metadata>,
pub private_metadata: Option<Metadata>,
pub display_private_metadata_error: Option<String>,
pub owner_is_public: bool,
pub public_ownership_expiration: Option<Expiration>,
pub private_metadata_is_public: bool,
pub private_metadata_is_public_expiration: Option<Expiration>,
pub token_approvals: Option<Vec<Snip721Approval>>,
pub inventory_approvals: Option<Vec<Snip721Approval>>,
}
pub struct TokenApprovals {
pub owner_is_public: bool,
pub public_ownership_expiration: Option<Expiration>,
pub private_metadata_is_public: bool,
pub private_metadata_is_public_expiration: Option<Expiration>,
pub token_approvals: Vec<Snip721Approval>,
}
pub struct ApprovedForAll {
pub operators: Vec<Cw721Approval>,
}
pub struct InventoryApprovals {
pub owner_is_public: bool,
pub public_ownership_expiration: Option<Expiration>,
pub private_metadata_is_public: bool,
pub private_metadata_is_public_expiration: Option<Expiration>,
pub inventory_approvals: Vec<Snip721Approval>,
}
pub enum TxAction {
Transfer {
from: String,
sender: Option<String>,
recipient: String,
},
Mint {
minter: String,
recipient: String,
},
Burn {
owner: String,
burner: Option<String>,
},
}
pub struct Tx {
pub tx_id: u64,
pub block_height: u64,
pub block_time: u64,
pub token_id: String,
pub action: TxAction,
pub memo: Option<String>,
}
pub struct TransactionHistory {
pub total: u64,
pub txs: Vec<Tx>,
}
pub struct Minters {
pub minters: Vec<String>,
}
pub struct IsUnwrapped {
pub token_is_unwrapped: bool,
}
pub struct VerifyTransferApproval {
pub approved_for_all: bool,
pub first_unapproved_token: Option<String>,
}
您可以通过创建QueryMsg变体并调用query
函数来查询SNIP-721代币合约。
或者您可以调用每个查询的单独函数。
示例
# use cosmwasm_std::{StdError, testing::mock_dependencies};
# use secret_toolkit_snip721::{nft_dossier_query, ViewerInfo};
# let mut deps = mock_dependencies();
#
let token_id = "TOKEN_ID".to_string();
let viewer = Some(ViewerInfo {
address: "VIEWER'S_ADDRESS".to_string(),
viewing_key: "VIEWER'S_KEY".to_string(),
});
let include_expired = None;
let block_size = 256;
let callback_code_hash = "TOKEN_CONTRACT_CODE_HASH".to_string();
let contract_addr = "TOKEN_CONTRACT_ADDRESS".to_string();
let nft_dossier = nft_dossier_query(
deps.as_ref().querier,
token_id,
viewer,
include_expired,
block_size,
callback_code_hash,
contract_addr
);
#
# assert_eq!(
# nft_dossier.unwrap_err().to_string(),
# "Generic error: Error performing NftDossier query: Generic error: Querier system error: No such contract: TOKEN_CONTRACT_ADDRESS"
# );
在这个示例中,我们正在对名为"TOKEN_ID"的代币进行NftDossier查询,提供查询者的地址和观看密钥,并将响应存储在上述定义的NftDossier类型的nft_dossier变量中。因为没有指定include_expired
,所以响应默认只显示未过期的批准,但如果查看者不是代币的所有者,则不会显示批准。查询消息填充为256字节的块。
依赖项
~2–3.5MB
~79K SLoC