资讯动态

如何在 fuels-rs 合约调用交易中随调用一并转出自定义资产

发布时间:2026/9/11 5:57:06 来源:尧图企业网站定制
如何在 fuels-rs 合约调用交易中随调用一并转出自定义资产【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs在 fuels-rs 中调用已部署合约时你通常希望这一次交易除了执行业务方法外还顺带把某种资产基础资产或合约资产转给另一个地址而不必再单独发一笔转账交易。fuels-rs 为此提供了add_custom_asset()构建方法在构造合约调用的同时指定资产 ID、数量和目标地址转账与合约调用会在同一笔交易里一起提交。本文适用的前提是你已经有部署好的合约和对应的合约实例如通过setup_program_test!或abigen!Contract::load_from部署得到并且发起方钱包持有待转出资产的余额。add_custom_asset()的签名与用法该方法定义在调用处理器的源码 call_handler.rs 中pub fn add_custom_asset(mut self, asset_id: AssetId, amount: u64, to: OptionAddress) - Self它不是独立的交易入口而是调用链上的一个构建方法。源码注释中给出的形态是把它接在方法调用之后、.call()之前let asset_id AssetId::from([3u8; 32]); let amount 5000; my_contract_instance.my_method(...).add_custom_asset(asset_id, amount, None).call()三个参数分别是资产 IDAssetId、数量u64、目标地址OptionAddress。仓库示例里实际传递目标地址时使用的都是Some(address)形式。准备调用环境仓库示例 examples/contracts/src/lib.rs 使用setup_program_test!宏一次完成启动本地节点、创建钱包、生成绑定和部署合约。该宏的Abigen命令要求对应的 forc 项目已用 release 模式编译见 setup_program_test! 宏文档use fuels::prelude::*; setup_program_test!( Wallets(wallet, wallet_2), Abigen(Contract( name MyContract, project e2e/sway/contracts/contract_test )), Deploy( name contract_instance, contract MyContract, wallet wallet ) );其中project指向你的 forc 项目根目录示例中指向的是仓库自带的contract_test测试合约使用时替换为你自己的项目路径。如果你不走这个宏也可以用launch_provider_and_get_wallet()加Contract::load_from(...).deploy(...)手工完成同一套准备仓库多处示例采用了这种写法。在合约调用中附带转出资产仓库给出的最小示例来自 custom-asset-transfer.mdlet some_addr: Address thread_rng().r#gen(); let amount 1000; let _ contract_instance .methods() .initialize_counter(42) .add_custom_asset(AssetId::zeroed(), amount, Some(some_addr)) .call() .await?;拆开看各部分的作用initialize_counter(42)是本次随交易一起执行的合约业务方法示例用的这个来自contract_test合约替换为你自己合约的方法即可AssetId::zeroed()表示基础资产base asset转合约资产时换成对应合约的AssetIdSome(some_addr)是接收地址。示例里some_addr是随机生成的地址只用于演示编译通过实际使用时必须是真实接收方地址.call().await?提交交易并等待返回。如果需要在一笔交易里转多种资产可以链式多次调用add_custom_asset。仓库集成测试 test_add_custom_assets 就是这样做的let amount_1 5000; let amount_2 3000; let response contract_instance .methods() .get(5, 6) .add_custom_asset(asset_id_1, amount_1, Some(wallet_2.address())) .add_custom_asset(asset_id_2, amount_2, Some(wallet_2.address())) .call() .await?;注意调用本身照常返回合约方法的返回值该测试中get(5, 6)的返回值为11说明转账没有改变业务调用自身的响应。验证转账结果验证方式是分别查询发起方和接收方钱包的资产余额。在 Fuel 网络中每个 UTXO 对应一枚 coin查询某资产余额就是对该资产所有未花费 coin 的数量求和见 Checking balances and coins。上面集成测试的验证断言如下数值来自测试本身每个资产初始100_000分别转出5000和3000// 发起方余额应减少转出的数量 let balance_asset_1 wallet_1.get_asset_balance(asset_id_1).await?; assert_eq!(balance_asset_1, (initial_amount - amount_1) as u128); // 接收方余额应增加转出的数量 let balance_asset_1 wallet_2.get_asset_balance(asset_id_1).await?; assert_eq!(balance_asset_1, (initial_amount amount_1) as u128);该测试的测试环境准备也很说明问题用AssetConfig声明每种资产及其初始数量再通过WalletsConfig::new_multiple_assets为两个钱包同时配置多资产let initial_amount 100_000; let asset_base AssetConfig { id: AssetId::zeroed(), num_coins: 1, coin_amount: initial_amount, }; let asset_id_1 AssetId::from([3u8; 32]); let asset_1 AssetConfig { id: asset_id_1, num_coins: 1, coin_amount: initial_amount, }; let assets vec![asset_base, asset_1, asset_2]; let wallet_config WalletsConfig::new_multiple_assets(num_wallets, assets); let mut wallets launch_custom_provider_and_get_wallets(wallet_config, None, None).await?;按这套流程你可以得到一条完整可核对的路径配置资产 → 发起带add_custom_asset的调用 → 用get_asset_balance核对双方余额变化。与 CallParameters 的区别调用合约时向合约转发币用的是另一套机制Call parameters 文档说明CallParameters通过call_params传入用于把 amount、asset ID、gas 转发给合约本身。add_custom_asset()则是在同一笔交易中把资产转给指定的目标地址两者解决的是不同目标不要混用。参考文档docs/src/calling-contracts/custom-asset-transfer.mddocs/src/calling-contracts/call-params.mdexamples/contracts/src/lib.rse2e/tests/contracts.rs【免费下载链接】fuels-rsFuel Network Rust SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-rs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价