Skip to content

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

  1. Instant Execution: No waiting for block confirmations
  2. Better Prices: Execute at exact moment of best price
  3. Reduced Slippage: Less time for price movement
  4. 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