Call a Contract
A common blockchain operation is communication between smart contracts.
Example
To perform a call there are three steps that we must take:
- Provide an interface to call
- Create a type that allows us to make a call
- Call a function on our interface
Defining the Interface
Let's take the example of a Vault
to demonstrate how a call can be performed.
library;
abi Vault {
#[payable]
fn deposit();
fn withdraw(amount: u64, asset: ContractId);
}
Creating a Callable Type
To call a function on our Vault
we must create a type that can perform calls. The syntax for creating a callable type is: abi(<interface-name>, <b256-address>)
.
Calling a Contract
The following snippet uses a script
to call our Vault
contract.
script;
use contract_interface::Vault;
fn main(amount: u64, asset_id: ContractId, vault_id: b256) -> bool {
let caller = abi(Vault, vault_id);
// Optional arguments are wrapped in `{}`
caller.deposit {
// `u64` that represents the gas being forwarded to the contract
gas: 10000,
// `u64` that represents how many coins are being forwarded
coins: amount,
// `b256` that represents the asset ID of the forwarded coins
asset_id: asset_id.into(),
}();
caller.withdraw(amount, asset_id);
true
}
The deposit()
function uses pre-defined optional arguments provided by the Sway
language.