import { createBaseAccountSDK, getCryptoKeyAccount, base } from '@base-org/account';
import { numberToHex, parseUnits, encodeFunctionData } from 'viem';
// ERC-20 ABI for approve and transfer functions
const erc20Abi = [
{
name: 'approve',
type: 'function',
stateMutability: 'nonpayable',
inputs: [
{ name: 'spender', type: 'address' },
{ name: 'amount', type: 'uint256' }
],
outputs: [{ name: '', type: 'bool' }]
},
{
name: 'transfer',
type: 'function',
stateMutability: 'nonpayable',
inputs: [
{ name: 'to', type: 'address' },
{ name: 'amount', type: 'uint256' }
],
outputs: [{ name: '', type: 'bool' }]
}
] as const;
async function approveAndTransfer() {
const sdk = createBaseAccountSDK({
appName: 'ERC-20 Batch Demo',
appLogoUrl: 'https://base.org/logo.png',
appChainIds: [base.constants.CHAIN_IDS.base],
});
const provider = sdk.getProvider();
const cryptoAccount = await getCryptoKeyAccount();
const fromAddress = cryptoAccount?.account?.address;
const tokenAddress = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'; // USDC on Base
const spenderAddress = '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad'; // Example spender
const recipientAddress = '0xd8da6bf26964af9d7eed9e03e53415d37aa96045';
const amount = parseUnits('10', 6); // 10 USDC (6 decimals)
const calls = [
{
to: tokenAddress,
value: '0x0',
data: encodeFunctionData({
abi: erc20Abi,
functionName: 'approve',
args: [spenderAddress, amount]
})
},
{
to: tokenAddress,
value: '0x0',
data: encodeFunctionData({
abi: erc20Abi,
functionName: 'transfer',
args: [recipientAddress, amount]
})
}
];
const result = await provider.request({
method: 'wallet_sendCalls',
params: [{
version: '2.0.0',
from: fromAddress,
chainId: numberToHex(base.constants.CHAIN_IDS.base),
atomicRequired: true,
calls: calls
}]
});
return result;
}