Prerequisites
You need a deployed smart account configured with your AA provider.Create Smart Account
Batch Transactions
- Alchemy
- ZeroDev
- Biconomy
- Pimlico
- Safe
Copy
Ask AI
import { encodeFunctionData } from "viem";
async function batchTransactions(
client: any,
operations: Array<{
target: string;
data?: string;
value?: bigint;
}>
) {
try {
const { hash } = await client.sendUserOperation({
uo: operations.map(op => ({
target: op.target,
data: op.data || "0x",
value: op.value || 0n
}))
});
console.log("Batch UserOp Hash:", hash);
const receipt = await client.waitForUserOperationReceipt({
hash
});
console.log("Batch executed:", receipt.receipt.transactionHash);
return receipt;
} catch (error) {
console.error("Batch operation failed:", error);
throw error;
}
}
Copy
Ask AI
async function batchTransactions(
kernelClient: any,
operations: Array<{
to: string;
data?: string;
value?: bigint;
}>
) {
try {
const userOpHash = await kernelClient.sendUserOperation({
callData: await kernelClient.account.encodeCalls(
operations.map(op => ({
to: op.to,
value: op.value || 0n,
data: op.data || "0x"
}))
)
});
console.log("Batch UserOp Hash:", userOpHash);
const receipt = await kernelClient.waitForUserOperationReceipt({
hash: userOpHash
});
console.log("Batch executed:", receipt.receipt.transactionHash);
return receipt;
} catch (error) {
console.error("Batch operation failed:", error);
throw error;
}
}
Copy
Ask AI
import { Transaction } from "@biconomy/account";
async function batchTransactions(
smartAccount: any,
transactions: Transaction[]
) {
try {
const userOpResponse = await smartAccount.sendTransaction(
transactions,
{
paymasterServiceData: {
mode: "SPONSORED"
}
}
);
console.log("UserOp Hash:", userOpResponse.userOpHash);
const transactionDetails = await userOpResponse.wait();
console.log("Batch executed:", transactionDetails.receipt.transactionHash);
console.log("Gas Used:", transactionDetails.receipt.gasUsed);
return transactionDetails;
} catch (error) {
console.error("Batch operation failed:", error);
throw error;
}
}
Copy
Ask AI
async function batchTransactions(
smartAccountClient: any,
calls: Array<{
to: string;
data?: string;
value?: bigint;
}>
) {
try {
const userOpHash = await smartAccountClient.sendUserOperation({
calls: calls.map(call => ({
to: call.to,
data: call.data || "0x",
value: call.value || 0n
}))
});
console.log("Batch UserOp Hash:", userOpHash);
const receipt = await smartAccountClient.waitForUserOperationReceipt({
hash: userOpHash
});
console.log("Batch executed:", receipt.receipt.transactionHash);
return receipt;
} catch (error) {
console.error("Batch operation failed:", error);
throw error;
}
}
Copy
Ask AI
async function batchTransactions(
safe4337Pack: any,
transactions: Array<{
to: string;
data: string;
value: string;
}>
) {
try {
const safeTransaction = await safe4337Pack.createTransaction({
transactions
});
const signedTransaction = await safe4337Pack.signTransaction(
safeTransaction
);
const userOpHash = await safe4337Pack.executeTransaction({
executable: signedTransaction
});
console.log("Batch UserOp Hash:", userOpHash);
const userOpReceipt = await safe4337Pack.getUserOperationReceipt(
userOpHash
);
console.log("Batch executed:", userOpReceipt);
return userOpReceipt;
} catch (error) {
console.error("Batch operation failed:", error);
throw error;
}
}
ERC-20 Token Operations
- Alchemy
- ZeroDev
- Biconomy
Copy
Ask AI
import { encodeFunctionData, parseAbi } from "viem";
const erc20Abi = parseAbi([
"function transfer(address to, uint256 amount) returns (bool)",
"function approve(address spender, uint256 amount) returns (bool)"
]);
async function batchTokenOperations(
client: any,
tokenAddress: string,
operations: Array<{
type: "transfer" | "approve";
to: string;
amount: bigint;
}>
) {
const batchOps = operations.map(op => ({
target: tokenAddress,
data: encodeFunctionData({
abi: erc20Abi,
functionName: op.type,
args: [op.to, op.amount]
})
}));
const { hash } = await client.sendUserOperation({
uo: batchOps
});
const receipt = await client.waitForUserOperationReceipt({ hash });
return receipt;
}
Copy
Ask AI
import { encodeFunctionData, parseAbi } from "viem";
const erc20Abi = parseAbi([
"function transfer(address to, uint256 amount) returns (bool)",
"function approve(address spender, uint256 amount) returns (bool)"
]);
async function batchTokenOperations(
kernelClient: any,
tokenAddress: string,
operations: Array<{
type: "transfer" | "approve";
to: string;
amount: bigint;
}>
) {
const calls = operations.map(op => ({
to: tokenAddress,
data: encodeFunctionData({
abi: erc20Abi,
functionName: op.type,
args: [op.to, op.amount]
}),
value: 0n
}));
const userOpHash = await kernelClient.sendUserOperation({
callData: await kernelClient.account.encodeCalls(calls)
});
return await kernelClient.waitForUserOperationReceipt({
hash: userOpHash
});
}
Copy
Ask AI
import { ethers } from "ethers";
const erc20Interface = new ethers.utils.Interface([
"function transfer(address to, uint256 amount)",
"function approve(address spender, uint256 amount)"
]);
async function batchTokenOperations(
smartAccount: any,
tokenAddress: string,
operations: Array<{
type: "transfer" | "approve";
to: string;
amount: string;
}>
) {
const transactions = operations.map(op => ({
to: tokenAddress,
data: erc20Interface.encodeFunctionData(op.type, [
op.to,
op.amount
])
}));
const userOpResponse = await smartAccount.sendTransaction(
transactions
);
return await userOpResponse.wait();
}
NFT Batch Minting
- Alchemy
- ZeroDev
Copy
Ask AI
import { encodeFunctionData, parseAbi } from "viem";
const nftAbi = parseAbi([
"function mint(address to, uint256 tokenId)"
]);
async function batchMintNFTs(
client: any,
nftAddress: string,
recipients: Array<{ to: string; tokenId: bigint }>
) {
const mintOps = recipients.map(r => ({
target: nftAddress,
data: encodeFunctionData({
abi: nftAbi,
functionName: "mint",
args: [r.to, r.tokenId]
})
}));
const { hash } = await client.sendUserOperation({
uo: mintOps
});
console.log(`Minting ${recipients.length} NFTs...`);
const receipt = await client.waitForUserOperationReceipt({ hash });
console.log("Batch mint completed!");
return receipt;
}
Copy
Ask AI
import { encodeFunctionData, parseAbi } from "viem";
const nftAbi = parseAbi([
"function mint(address to, uint256 tokenId)"
]);
async function batchMintNFTs(
kernelClient: any,
nftAddress: string,
recipients: Array<{ to: string; tokenId: bigint }>
) {
const calls = recipients.map(r => ({
to: nftAddress,
data: encodeFunctionData({
abi: nftAbi,
functionName: "mint",
args: [r.to, r.tokenId]
}),
value: 0n
}));
const userOpHash = await kernelClient.sendUserOperation({
callData: await kernelClient.account.encodeCalls(calls)
});
console.log(`Minting ${recipients.length} NFTs...`);
const receipt = await kernelClient.waitForUserOperationReceipt({
hash: userOpHash
});
console.log("Batch mint completed!");
return receipt;
}