Contract Balance

Icon Link合约余额

在处理合约时,了解资产的可用合约余额在支付高成本操作时至关重要。本指南将解释 Contract 类中的 getBalance 方法,该方法允许你检查合约的可用余额。

Icon LinkgetBalance 方法

Contract 类包括一个名为 getBalance 的方法,用于检索合约的特定资产的可用余额。该方法特别适用于确定向合约发送资产并执行合约调用后的剩余余额。

getBalance(assetId: BytesLike) {
  return this.provider.getContractBalance(this.id, assetId);
}

Icon Link检查合约余额

考虑一个简单的合约,它将指定数量的给定资产转移给一个地址:

contract;
 
use std::asset::transfer;
 
abi TransferToAddress {
    #[payable]
    fn transfer(amount_to_transfer: u64, asset_id: AssetId, recipient: b256);
}
 
impl TransferToAddress for Contract {
    #[payable]
    fn transfer(amount_to_transfer: u64, asset_id: AssetId, recipient: b256) {
        let recipient_address = Address::from(recipient);
 
        transfer(
            Identity::Address(recipient_address),
            asset_id,
            amount_to_transfer,
        );
    }
}

transfer 函数有三个参数:

  1. amount_to_transfer:正在转移的数量。

  2. asset:已部署合约 Token 的地址。

  3. recipient:接收者钱包的地址。

transfer 函数调用了内置的 Sway 函数 transfer_to_address,其名称正是其所做的事情。

让我们执行这个合约,并使用 getBalance 方法验证合约剩余资产量。

// #import { AssetId, Wallet, BN };
 
const amountToForward = 40;
const amountToTransfer = 10;
const baseAssetId = provider.getBaseAssetId();
 
const recipient = Wallet.generate({
  provider,
});
 
const asset: AssetId = {
  bits: baseAssetId,
};
 
await contract.functions
  .transfer(amountToTransfer, asset, recipient.address.toB256())
  .callParams({
    forward: [amountToForward, baseAssetId],
  })
  .call();
 
const contractBalance = await contract.getBalance(baseAssetId);
 
const expectedBalance = amountToForward - amountToTransfer;
 
expect(new BN(contractBalance).toNumber()).toBe(expectedBalance);

在这个示例中,我们首先转发一个大于转移所需金额的资产数量,然后执行合约调用。

最后,我们使用 getBalance 方法确认合约余额正是总转发金额减去转移金额。

重要提示:该方法返回合约的总可用余额,无论资产已发送多少次或在昂贵操作上花费了多少。