Circle's Smart Contract Platform Enables Seamless ETH to USDC Swaps
Circle's Smart Contract Platform now offers a streamlined method for swapping Ethereum (ETH) to USD Coin (USDC) via a smart contract. This development simplifies the process of deploying and interacting with smart contracts, leveraging an SDK that includes wallet and gas abstraction infrastructure, according to Circle.com.
Prerequisites
To use Circle's platform for ETH to USDC swaps, ensure you have:
- Remix IDE for writing and compiling smart contracts.
- Circle Web3 Services Account for managing smart contract interactions.
- Developer Controlled Wallet for deploying and executing contract functions.
Writing the Smart Contract
The smart contract interacts with Uniswap to perform token swaps. When ETH is deposited, it is converted to Wrapped ETH (WETH), which can be swapped for USDC using Uniswap's protocol. Below is the contract code:
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.20;
import '@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol';
import '@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol';
contract SwapExamples {
ISwapRouter public immutable swapRouter;
address public constant WETH9 = 0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619;
address public constant USDC = 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359;
uint24 public constant poolFee = 3000;
constructor(ISwapRouter _swapRouter) {
swapRouter = _swapRouter;
}
function swapExactInputSingle(uint256 amountIn) external returns (uint256 amountOut) {
TransferHelper.safeTransferFrom(WETH9, msg.sender, address(this), amountIn);
TransferHelper.safeApprove(WETH9, address(swapRouter), amountIn);
ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
tokenIn: WETH9,
tokenOut: USDC,
fee: poolFee,
recipient: msg.sender,
deadline: block.timestamp,
amountIn: amountIn,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
});
amountOut = swapRouter.exactInputSingle(params);
}
function swapExactOutputSingle(uint256 amountOut, uint256 amountInMaximum) external returns (uint256 amountIn) {
TransferHelper.safeTransferFrom(WETH9, msg.sender, address(this), amountInMaximum);
TransferHelper.safeApprove(WETH9, address(swapRouter), amountInMaximum);
ISwapRouter.ExactOutputSingleParams memory params = ISwapRouter.ExactOutputSingleParams({
tokenIn: WETH9,
tokenOut: USDC,
fee: poolFee,
recipient: msg.sender,
deadline: block.timestamp,
amountOut: amountOut,
amountInMaximum: amountInMaximum,
sqrtPriceLimitX96: 0
});
amountIn = swapRouter.exactOutputSingle(params);
if (amountIn < amountInMaximum) {
TransferHelper.safeApprove(WETH9, address(swapRouter), 0);
TransferHelper.safeTransfer(WETH9, msg.sender, amountInMaximum - amountIn);
}
}
}
Compiling the Smart Contract
Use Remix IDE to compile the contract to obtain the ABI (Application Binary Interface) and bytecode:
- Create a new file in Remix IDE and paste the smart contract code.
- Select the appropriate Solidity compiler version (0.8.20) and compile the contract.
- Copy the ABI JSON and bytecode from the "Compilation Details" section.
Deploying the Smart Contract
Deploy the compiled contract using Circle's SDK:
npm install @circle-fin/smart-contract-platform @circle-fin/developer-controlled-wallets --save
const circleContractSdk = require('@circle-fin/smart-contract-platform');
const developerControlledWallets = require('@circle-fin/developer-controlled-wallets');
const response = await circleContractSdk.deployContract({
name: 'Swap Contract',
description: 'Contract for swapping WETH9 to USDC using Uniswap',
walletId: '046b6c7f-0b8a-43b9-b35d-6489e6daee91',
blockchain: 'MATIC-AMOY',
fee: { type: 'level', config: { feeLevel: 'MEDIUM' } },
constructorParameters: ['0xYourWalletAddress'],
entitySecretCiphertext: '0NtD3d3+nmgb4GqYQXzAjKF8h5Zq6sHM2k/...',
abiJSON: '[...]',
bytecode: '0x...'
});
Upon successful deployment, you will receive a contractId and transactionId for reference.
Interacting with the Deployed Contract
To perform token swaps using the deployed contract:
const response = await circleDeveloperSdk.createContractExecutionTransaction({
walletId: 'ce714f5b-0d8e-4062-9454-61aa1154869b',
contractAddress: '0x2f3A40A3db8a7e3D09B0adfEfbCe4f6F81927557',
abiFunctionSignature: 'swapExactInputSingle(uint256)',
abiParameters: [1000],
fee: { type: 'level', config: { feeLevel: 'MEDIUM' } }
});
Conclusion
Circle's Smart Contract Platform provides an efficient solution for deploying and managing smart contracts to swap ETH to USDC. By leveraging Circle's SDK, developers can easily execute transactions on the blockchain.