Transaction Builder
By default, all transactions initiated using the SDK perform every step of the process for a transaction; From preparing and building the transaction all the way to waiting until it has been mined and the data is available to be read from the blockchain.
To gain more granular control over the transaction process,
all transactions come with a prepare
method that gives you full control over each step of this transaction journey.
Usage
// Prepare a transaction, but DON'T send it
const quantity = 1;
const tx = await contract.erc721.claim.prepare(quantity);
// Some example use cases for the transaction
const gasCost = await tx.estimateGasCost(); // Estimate the gas cost
const simulatedTx = await tx.simulate(); // Simulate the transaction
const signedTx = await tx.sign(); // Sign the transaction for later use
Examples
Sending a transaction without waiting for confirmations, and show a "view on block explorer" UI instead:
// Prepare an ERC20 transfer
const tx = await contract.erc20.transfer.prepare(receiver, amount);
// Submit the tx, but don't wait for confirmations
const sentTx = await tx.send();
const txHash = sentTx.hash;
// ... show a "view on block explorer" UI with the hash
Encoding two transactions to multicall them into a single transaction:
// Prepare an ERC721 burn and a erc721 mint to be executed in one tx
const tx1 = await contract.erc721.burn.prepare(tokenId);
const tx2 = await contract.erc721.mint.prepare(nftMetadata);
// Encode both transactions and execute them via multicall
// this will only prompt the user for 1 transaction to sign instead of 2
await contract.call("multicall", [tx1.encode(), tx2.encode()]);
Simulating a deploy transaction to get the deployed contract address before it's deployed:
// Prepare an deploy transaction
const tx = await sdk.deployer.deployNFTCollection.prepare(contractMetadata);
// Simulate the transaction to get the address without deploying it
const predictedAddress = await tx.simulate();
encode
Encode the function data for this transaction.
const encodedTx = tx.encode();
Configuration
estimateGasCost
Estimate the gas cost for a transaction.
const gasCost = await tx.estimateGasCost();
Configuration
Return Value
Returns the gas cost for this transaction in both ether
and wei
.
{
ether: string;
wei: BigNumber;
}
estimateGasLimit
Estimate the gas limit for a transaction.
const gasLimit = await tx.estimateGasLimit();
Configuration
execute
Send the transaction and wait for it to be mined.
const txReceipt = await tx.execute();
Configuration
Return Value
Some transactions return specific data about the mined transaction.
For example when minting a new NFT, the data returned will contain information about the NFT.
In most cases however, the transaction will return the transaction receipt.
TransactionResult;
getArgs
Get the arguments for this transaction.
const args = tx.getArgs();
Configuration
getGasPrice
Calculates the gas price for transactions (adding a 10% tip buffer)
const gasPrice = await tx.getGasPrice();
Configuration
getGaslessOptions
Get the gasless transaction options for this transaction.
This reads from either the gasless
option of the ThirdwebSDK
, or the value set
by setGaslessOptions
.
const gaslessOptions = tx.getGaslessOptions();
Configuration
Return Value
Returns undefined
if no gasless options are set.
Otherwise, returns the openzeppelin
or biconomy
gasless configuration.
{
openzeppelin: {
relayerForwarderAddress?: string | undefined;
relayerUrl: string;
useEOAForwarder: boolean;
};
experimentalChainlessSupport: boolean;
} | {
biconomy: {
apiId: string;
apiKey: string;
deadlineSeconds: number;
};
} | undefined
getMethod
Get the method name for this transaction.
const method = tx.getMethod();
Configuration
getOverrides
Get the CallOverrides
for this transaction.
const overrides = tx.getOverrides();
Configuration
Return Value
{
blockTag?: BlockTag | Promise<BlockTag>;
from?: string | Promise<string>;
}
getValue
Get the value for this transaction.
const value = await tx.getValue();
Configuration
send
Send the transaction without waiting for it to be mined.
This is useful for when you want the transaction to be executed, but don’t need the data returned.
const sentTransaction = await tx.send(); // Send the transaction
Configuration
Return Value
Returns a ContractTransaction
object.
{
hash: string;
blockNumber?: number,
blockHash?: string,
timestamp?: number,
confirmations: number,
from: string;
raw?: string,
// This function waits until the transaction has been mined
wait(confirmations?: number): Promise<ContractReceipt>;
};
setAccessList
The AccessList
to include; only available for EIP-2930 and EIP-1559 transactions.
Provide an array of objects containing address
and storageKey
values that the transaction plans to access.
tx.setAccessList([
{
address: "0x...",
storageKeys: ["0x..."],
},
]);
setArgs
Set the arguments for this transaction.
Provide an array of arguments that will be passed to the transaction.
tx.setArgs(["arg1", "arg2"]);
setCcipReadEnabled
Learn more about use of CCIP read for transactions.
tx.setCcipReadEnabled(true);
setCustomData
Provide custom data to be included in the transaction.
tx.setCustomData({
hello: "world",
});
setGasLimit
Set the gas limit for this transaction.
Value provided must be a string
, number
, or BigNumber
.
tx.setGasLimit(1000000);
setGasPrice
Set the gas price for this transaction.
Value provided must be a string
, number
, or BigNumber
.
tx.setGasPrice(1000000000);
setGaslessOptions
Provide a gasless configuration for this transaction, using either openzeppelin
or biconomy
.
tx.setGaslessOptions({
// Use Biconomy: https://blog.thirdweb.com/guides/biconomy-gasless-guide/
biconomy: {
apiId: "xxx",
apiKey: "xxx",
deadlineSeconds: 60,
},
// Use OpenZeppelin: https://blog.thirdweb.com/guides/setup-gasless-transactions/
openzeppelin: {
relayerUrl: "xxx",
useEOAForwarder: true,
relayerForwarderAddress: "0x...",
},
// Experimental (beta)
experimentalChainlessSupport: true,
});
setMaxFeePerGas
Set the maximum price (in wei) per unit of gas this transaction will pay.
Value provided must be a string
, number
, or BigNumber
.
tx.setMaxFeePerGas(1000000000);
setMaxPriorityFeePerGas
Set the price (in wei) per unit of gas this transaction will allow in addition to the block's base fee.
Value provided must be a string
, number
, or BigNumber
.
tx.setMaxPriorityFeePerGas(1000000000);
setNonce
Set the nonce for this transaction.
Value provided must be a string
, number
, or BigNumber
.
tx.setNonce(0);
setOverrides
Set the CallOverrides
for this transaction.
tx.setOverrides({
accessList: [], // The AccessList to include; only available for EIP-2930 and EIP-1559 transactions.
blockTag: "latest", // A BlockTag specifies a specific block location in the Blockchain.
ccipReadEnabled: false, // https://eips.ethereum.org/EIPS/eip-3668#use-of-ccip-read-for-transactions
customData: {}, // The transaction data.
from: "0x...", // The address this transaction is from.
gasLimit: 100000, // The maximum amount of gas this transaction is permitted to use.
gasPrice: 100000, // The price (in wei) per unit of gas this transaction will pay.
maxFeePerGas: 100000, // The maximum price (in wei) per unit of gas this transaction will pay
maxPriorityFeePerGas: 0, // The price (in wei) per unit of gas this transaction will allow in addition to the block's base fee
nonce: 0, // The nonce used as part of the proof-of-work to mine this block.
type: 0, // The EIP-2718 type of this transaction envelope, or undefined for to use the network default
value: ethers.utils.parseEther("0.1"), // send 0.1 ether with the contract call
});
setType
Set the EIP-2718 type of this transaction envelope, or undefined for to use the network default.
tx.setType(undefined);
sign
Sign a transaction from the connected wallet, and return a string containing the signature.
const signedTx = await tx.sign();
simulate
Simulate a transaction’s execution.
const simulatedTx = await tx.simulate();
updateOverrides
Update the CallOverrides
for this transaction.
tx.updateOverrides({
accessList: [], // The AccessList to include; only available for EIP-2930 and EIP-1559 transactions.
blockTag: "latest", // A BlockTag specifies a specific block location in the Blockchain.
ccipReadEnabled: false, // https://eips.ethereum.org/EIPS/eip-3668#use-of-ccip-read-for-transactions
customData: {}, // The transaction data.
from: "0x...", // The address this transaction is from.
gasLimit: 100000, // The maximum amount of gas this transaction is permitted to use.
gasPrice: 100000, // The price (in wei) per unit of gas this transaction will pay.
maxFeePerGas: 100000, // The maximum price (in wei) per unit of gas this transaction will pay
maxPriorityFeePerGas: 0, // The price (in wei) per unit of gas this transaction will allow in addition to the block's base fee
nonce: 0, // The nonce used as part of the proof-of-work to mine this block.
type: 0, // The EIP-2718 type of this transaction envelope, or undefined for to use the network default
value: ethers.utils.parseEther("0.1"), // send 0.1 ether with the contract call
});