Instant Token Swap
Execute token swaps with immediate confirmation.
instant-swap.ts
import { createWalletClient, createPublicClient, http, parseEther, maxUint256, encodeFunctionData } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
import { riseTestnet } from 'viem/chains'
import { sendRawTransactionSync } from 'shreds/viem'
// Uniswap V2 Router ABI (simplified)
const routerAbi = [
{
inputs: [
{ name: 'amountIn', type: 'uint256' },
{ name: 'amountOutMin', type: 'uint256' },
{ name: 'path', type: 'address[]' },
{ name: 'to', type: 'address' },
{ name: 'deadline', type: 'uint256' }
],
name: 'swapExactTokensForTokens',
outputs: [{ name: 'amounts', type: 'uint256[]' }],
type: 'function'
}
] as const
const erc20Abi = [
{
inputs: [
{ name: 'spender', type: 'address' },
{ name: 'amount', type: 'uint256' }
],
name: 'approve',
outputs: [{ name: '', type: 'bool' }],
type: 'function'
}
] as const
const account = privateKeyToAccount('0x...')
const walletClient = createWalletClient({
account,
chain: riseTestnet,
transport: http()
})
const publicClient = createPublicClient({
chain: riseTestnet,
transport: http()
})
async function instantSwap(
tokenIn: `0x${string}`,
tokenOut: `0x${string}`,
amountIn: bigint,
minAmountOut: bigint
) {
const routerAddress = '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D'
// Step 1: Approve router (instant)
console.log('Approving router...')
const approvalRequest = await walletClient.prepareTransactionRequest({
to: tokenIn,
data: encodeFunctionData({
abi: erc20Abi,
functionName: 'approve',
args: [routerAddress, maxUint256]
})
})
const approvalSerialized = await walletClient.signTransaction(approvalRequest)
const approvalReceipt = await sendRawTransactionSync(publicClient, {
serializedTransaction: approvalSerialized
})
console.log('[SUCCESS] Approval confirmed instantly!')
// Step 2: Execute swap (instant)
console.log('Executing swap...')
const swapRequest = await walletClient.prepareTransactionRequest({
to: routerAddress,
data: encodeFunctionData({
abi: routerAbi,
functionName: 'swapExactTokensForTokens',
args: [
amountIn,
minAmountOut,
[tokenIn, tokenOut],
account.address,
BigInt(Math.floor(Date.now() / 1000) + 3600) // 1 hour deadline
]
})
})
const swapSerialized = await walletClient.signTransaction(swapRequest)
const swapReceipt = await sendRawTransactionSync(publicClient, {
serializedTransaction: swapSerialized
})
console.log('[SUCCESS] Swap confirmed instantly!')
console.log('Gas used:', swapReceipt.gasUsed)
return {
approvalHash: approvalReceipt.transactionHash,
swapHash: swapReceipt.transactionHash
}
}
Key Features
- Two-Step Process: Approval and swap both confirmed instantly
- No Waiting: Traditional swaps take 30+ seconds, this takes milliseconds
- Gas Efficient: Same gas costs as regular transactions
- MEV Protection: Instant confirmation reduces MEV opportunities
Usage Example
// Swap 100 USDC for at least 0.05 ETH
const usdcAddress = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'
const wethAddress = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'
const result = await instantSwap(
usdcAddress,
wethAddress,
100000000n, // 100 USDC (6 decimals)
50000000000000000n // 0.05 ETH minimum
)
console.log('Swap completed:', result)
Benefits
- Instant Execution: No waiting for block confirmations
- Better Prices: Execute at exact moment of best price
- Reduced Slippage: Less time for price movement
- User Experience: Seamless, app-like trading
Advanced Features
- Add slippage protection
- Implement multi-hop swaps
- Calculate optimal routes
- Add price impact warnings
Next Steps
- Build a trading interface
- Add limit order functionality
- Implement automated trading strategies
- Create a DEX aggregator