There are 4 ways to interact with contracts: get
, dryRun
, simulate
, call
.
get
The get
method should be used to read data from the blockchain without using resources. It can be used with an unfunded wallet or even without a wallet at all:
const contract = new Contract(contractId, abi, provider);
const { value } = await contract.functions.get_count().get();
dryRun
The dryRun
method should be used to dry-run a contract call. It does not spend resources and can be used with an unfunded wallet or even without a wallet at all:
const contract = new Contract(contractId, abi, provider);
const { value } = await contract.functions.increment_count(1).dryRun();
simulate
The simulate
method should be used to dry-run a contract call, ensuring that the wallet used has sufficient funds to cover the transaction fees, without consuming any resources.
A funded wallet it's required:
const contract = new Contract(contractId, abi, fundedWallet);
const { value } = await contract.functions.increment_count(10).simulate();
call
The call
method should be used to submit a real contract call transaction to the node.
Real resources are consumed, and any operations executed by the contract function will be processed on the blockchain.
await contract.functions.increment_count(10).call();
isReadOnly
(utility) If you want to figure out whether a function is read-only, you can use the isReadOnly
method:
const isReadOnly = contract.functions.get_count.isReadOnly();
if (isReadOnly) {
await contract.functions.get_count().get();
} else {
await contract.functions.get_count().call();
}
If the function is read-only, you can use the get
method to retrieve onchain data without spending gas.
If the function is not read-only you will have to use the call
method to submit a transaction onchain which incurs a gas fee.