⌘K

Icon Link调用参数

合约调用的参数包括:

  1. 金额
  2. 资产 ID
  3. 转发的 Gas

您可以使用这些参数将资金转发到合约。您可以通过创建 CallParameters Icon Link 的实例并将其传递给名为 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")));
Icon InfoCircle

注意: 无论合约方法是否为非可支付,都可以向合约调用转发 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 限制。