#secret-toolkit #secret-contracts #secret-network

secret-toolkit-snip721

Secret Network上使用SNIP-20合约的模板

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 魔法豆

Download history 107/week @ 2024-03-31 40/week @ 2024-04-07 55/week @ 2024-04-14 57/week @ 2024-04-21 48/week @ 2024-04-28 32/week @ 2024-05-05 46/week @ 2024-05-12 86/week @ 2024-05-19 136/week @ 2024-05-26 66/week @ 2024-06-02 31/week @ 2024-06-09 46/week @ 2024-06-16 64/week @ 2024-06-23 12/week @ 2024-06-30 23/week @ 2024-07-07 30/week @ 2024-07-14

每月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