合约调用的参数包括:
您可以使用这些参数将资金转发到合约。您可以通过创建 CallParameters
的实例并将其传递给名为 call_params
的链式方法来配置这些参数。
例如,假设以下合约使用 Sway 的 msg_amount()
返回在该交易中发送的金额。
#[payable]
fn get_msg_amount() -> u64 {
msg_amount()
}
然后,在 Rust 中,在设置和部署上述合约后,您可以像这样配置发送交易中的金额:
let contract_methods = MyContract::new(contract_id, wallet.clone()).methods();
let tx_policies = TxPolicies::default();
// Forward 1_000_000 coin amount of base asset_id
// this is a big number for checking that amount can be a u64
let call_params = CallParameters::default().with_amount(1_000_000);
let response = contract_methods
.get_msg_amount() // Our contract method.
.with_tx_policies(tx_policies) // Chain the tx policies.
.call_params(call_params)? // Chain the call parameters.
.call() // Perform the contract call.
.await?;
call_params
返回一个结果以确保您不会向一个非可支付的合约方法转发资产。
在以下示例中,我们尝试向 non_payable
转发 100
个基本资产。正如其名称所示,non_payable
在合约代码中未被注释为 #[payable]
。使用除 0
外的金额传递 CallParameters
会导致错误:
let err = contract_methods
.non_payable()
.call_params(CallParameters::default().with_amount(100))
.expect_err("should return error");
assert!(matches!(err, Error::Other(s) if s.contains("assets forwarded to non-payable method")));
注意: 无论合约方法是否为非可支付,都可以向合约调用转发 Gas。
您还可以使用 CallParameters::default()
来使用默认值:
pub const DEFAULT_CALL_PARAMS_AMOUNT: u64 = 0;
这样:
let response = contract_methods
.initialize_counter(42)
.call_params(CallParameters::default())?
.call()
.await?;
gas_forwarded
参数定义了实际合约调用的限制,而不是整个交易的 gas 限制。这意味着它受到交易限制的约束。如果设置为大于可用 gas 的金额,则会转发所有可用 gas。
// Set the transaction `gas_limit` to 1_000_000 and `gas_forwarded` to 4300 to specify that
// the contract call transaction may consume up to 1_000_000 gas, while the actual call may
// only use 4300 gas
let tx_policies = TxPolicies::default().with_script_gas_limit(1_000_000);
let call_params = CallParameters::default().with_gas_forwarded(4300);
let response = contract_methods
.get_msg_amount() // Our contract method.
.with_tx_policies(tx_policies) // Chain the tx policies.
.call_params(call_params)? // Chain the call parameters.
.call() // Perform the contract call.
.await?;
如果您没有设置调用参数或使用 CallParameters::default()
,则会转发交易的 gas 限制。