CosmWasm跨合约铸造NFT失败排查及跨合约查询调用咨询
CosmWasm跨合约铸造NFT问题及跨合约调用指南
问题分析与修复
你提供的代码编译通过但无法运行,核心问题出在token_id的格式错误:
token_id: "\"\"123\"\"" .to_string(),
这里生成的token_id是""123"",包含多余的双引号,不符合NFT合约对token_id的格式要求(通常为纯字符串或数字格式的字符串)。修复方式是直接使用纯字符串:
token_id: "123".to_string(),
此外还需排查以下常见问题:
- 确认
state.nft_address存储的是正确的NFT合约地址,且当前合约拥有该NFT合约的铸造权限(示例NFT合约通常会限制调用者权限,比如仅管理员或授权合约可执行mint操作)。 - 确保
ExecuteMsg和MintMsg的结构与目标NFT合约的定义完全一致,字段名称、类型必须严格匹配(检查是否有必填字段被错误设为None)。 - 调用
wasm_execute后,需要将返回的CosmosMsg加入合约的响应消息列表,否则跨合约调用不会实际执行:Ok(Response::new() .add_message(res) .add_attribute("action", "mint_nft") .add_attribute("token_id", "123"))
跨合约调用查询或入口点的方法
1. 跨合约执行(调用入口点)
使用wasm_execute,和你当前的方式逻辑一致,但需注意:
- 目标合约的
ExecuteMsg必须在当前合约中正确定义或导入。 - 如果需要传递资金,在第三个参数中添加
Coin类型的向量,示例:let funds = vec![Coin::new(1000, "uatom")]; let res = wasm_execute( nft_contract_addr, &ExecuteMsg::SomeAction {}, funds, )?; - 最终一定要将
res添加到Response的消息集合中,否则调用不会生效。
2. 跨合约查询
使用wasm_query函数调用目标合约的查询入口点,示例代码:
use cosmwasm_std::WasmQuery; // 定义目标合约的查询消息结构 #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub enum NftQueryMsg { OwnerOf { token_id: String, include_expired: Option<bool> }, // 其他查询类型... } // 执行查询 let owner_query = NftQueryMsg::OwnerOf { token_id: "123".to_string(), include_expired: None, }; let query_result = wasm_query( state.nft_address.ok_or(ContractError::EmptyNftMinter {})?, &owner_query, )?; // 解析查询结果 let owner_info: OwnerResponse = deps.querier.query(&query_result)?;
注意:查询是只读操作,不会改变链上状态,因此不需要添加到Response中,直接解析结果即可。
内容的提问来源于stack exchange,提问作者user22306396
相关产品推荐
相关产品推荐

