If your Circle Wallet is a smart contract account (SCA), set
allowanceStrategy: "approve". USDC permit signatures use ecrecover, which
does not accept the SCA’s ERC-1271 signature, so the SDK uses an onchain
approve.Prerequisites
Before you begin, ensure that you’ve:- Installed Node.js v22+.
- Obtained the following from the Circle Console:
- Created a developer-controlled wallet on Base.
- Funded your Base wallet with USDC for the swap amount and ETH for gas.
Step 1. Set up the project
1.1. Create the project and install dependencies
Create a new directory and install the App Kit SDK with the Circle Wallets adapter and supporting tools:Shell
1.2. Configure TypeScript (optional)
This step is optional. It helps prevent missing types in your IDE or editor.
tsconfig.json file:
Shell
tsconfig.json file:
Shell
1.3. Set environment variables
Create an.env file in the project directory:
Shell
YOUR_API_KEY with your Circle
Developer API key, YOUR_ENTITY_SECRET with your entity secret, and
YOUR_KIT_KEY with your kit key from the Circle Console:
.env
Step 2. Swap tokens
Create a script that estimates the route, submits the source-chain swap, waits for crosschain delivery, and prints the final swap status.Unlike same-chain swaps, crosschain swaps return immediately with
progress.status: 'PENDING'. The destination-chain leg lands shortly after. Use
kit.waitForSwap() to poll until the swap reaches a terminal status: DONE,
FAILED, or NOT_FOUND.2.1. Create the script
Create anindex.ts file in the project directory and add the following code.
This code swaps 1.00 USDC on Base for native POL delivered to your wallet on
Polygon.
Replace YOUR_SOURCE_WALLET_ADDRESS with your Base wallet address and
YOUR_RECIPIENT_ADDRESS with your Polygon recipient address. The recipient
address does not need POL to receive the swapped tokens.
Using other tokens
or blockchains? Change the source
chain, tokenIn, tokenOut, to.chain, and recipientAddress values in
swapParams. Both blockchains must support crosschain swap.TypeScript
2.2. Run the script
Save theindex.ts file and run the script in your terminal:
Shell
Providers enforce route-specific minimum amounts. If
estimateSwap() throws a
KitError with code INPUT_AMOUNT_OUT_OF_RANGE, increase amountIn and
estimate again (inside a try/catch) before calling swap().2.3. Verify the transactions
After the script finishes, find the returned status object in the terminal output:- Use the source
txHashandchainInto verify the source-chain swap on the Base block explorer. - Use
status.destination.txHashto verify the destination-chain delivery on the Polygon block explorer.