This guide covers Ethereum integration with SwapKit, including wallet connections, token transfers, cross-chain swaps, and EVM-specific features.
Ethereum is the leading smart contract blockchain and the foundation of DeFi. SwapKit provides comprehensive Ethereum support through:
Ethereum Toolbox : Core blockchain operations (transfers, contract calls, gas estimation) 
EVM Plugin : Enhanced features for decentralized exchanges and cross-chain operations 
ERC-20 Support : Full support for Ethereum’s token standard 
Multi-Wallet Support : Compatible with MetaMask, WalletConnect, Coinbase Wallet, and hardware wallets 
Gas Optimization : EIP-1559 support with dynamic fee estimation 
 
# Individual packages for smaller bundles 
bun   add   @swapkit/toolboxes   @swapkit/plugins 
 
   import  { createSwapKit, Chain }  from   ' @swapkit/sdk ' ; 
const  swapKit  =  createSwapKit (); 
const  ethWallet  = await  swapKit . getWallet (Chain . Ethereum ); 
    import  { getEthereumToolbox }  from   ' @swapkit/toolboxes/evm ' ; 
const  ethToolbox  = await  getEthereumToolbox ( { 
   phrase:  " your twelve word mnemonic phrase here " , 
   derivationPath:  [ 44 ,  60 ,  0 ,  0 ,  0 ] 
const  ethToolbox  = await  getEthereumToolbox ( { 
   signer:  customEthereumSigner , 
        
Connect to Ethereum using various wallet types:
import  { Chain, FeeOption }  from   " @swapkit/sdk " ; 
await  swapKit . connectKeystore ([Chain . Ethereum ],  " your mnemonic phrase " ); 
await  swapKit . connectBrowserWallet (Chain . Ethereum ); 
await  swapKit . connectWalletConnect ([Chain . Ethereum ]); 
await  swapKit . connectLedger ([Chain . Ethereum ]); 
 
import  { AssetValue }  from   " @swapkit/sdk " ; 
const  txHash  = await  swapKit . transfer ( { 
   recipient:  " 0x742c4B4F3e0b5b069F5DCF8A65Eaf8d3E888a3E7 " , 
   assetValue:  AssetValue . from ( { 
   feeOptionKey:  FeeOption . Fast , 
console . log ( ` Transaction hash:  ${ txHash } ` ); 
 
const  usdcTransfer  = await  swapKit . transfer ( { 
   recipient:  " 0x742c4B4F3e0b5b069F5DCF8A65Eaf8d3E888a3E7 " , 
   assetValue:  AssetValue . from ( { 
     address:  " 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 " , 
   feeOptionKey:  FeeOption . Average , 
const  toolbox  = await  getEthereumToolbox ( { phrase:  " ... "  } ); 
const  balance  = await  toolbox . getBalance ( 
   " 0x742c4B4F3e0b5b069F5DCF8A65Eaf8d3E888a3E7 " , 
   " 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 " 
const  tokenInfo  = await  toolbox . getTokenInfo ( 
   " 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 " 
 
The Ethereum toolbox provides multiple ways to interact with smart contracts:
const  result  = await  toolbox . call ( { 
   contractAddress:  " 0x... " , 
   funcParams:  [ " 0x742c4B4F3e0b5b069F5DCF8A65Eaf8d3E888a3E7 " ] , 
const  txHash  = await  toolbox . call ( { 
   contractAddress:  " 0x... " , 
   funcParams:  [ " 0x742c4B4F3e0b5b069F5DCF8A65Eaf8d3E888a3E7 " ,  " 1000000 " ] , 
const  gasEstimate  = await  toolbox . estimateCall ( { 
   contractAddress:  " 0x... " , 
   funcName:  " complexOperation " , 
 
ERC-20 tokens require approvals before they can be spent by contracts:
const  isApproved  = await  toolbox . isApproved ( { 
   contractAddress:  " 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 " , 
   const  approveTx  = await  toolbox . approve ( { 
     contractAddress:  " 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 " , 
   console . log ( ` Approval transaction:  ${ approveTx } ` ); 
   await  toolbox . waitForTransaction (approveTx); 
 
Ethereum supports both legacy and EIP-1559 fee structures:
const  txParams  = await  toolbox . buildTransaction ( { 
   recipient:  " 0x742c4B4F3e0b5b069F5DCF8A65Eaf8d3E888a3E7 " , 
   amount:  AssetValue . from ( { chain:  Chain . Ethereum , value:  " 0.1 "  } ) , 
   feeOptionKey:  FeeOption . Fast , 
   maxFeePerGas:  " 20000000000 " , 
   maxPriorityFeePerGas:  " 2000000000 " , 
const  legacyTx  = await  toolbox . buildTransaction ( { 
   recipient:  " 0x742c4B4F3e0b5b069F5DCF8A65Eaf8d3E888a3E7 " , 
   amount:  AssetValue . from ( { chain:  Chain . Ethereum , value:  " 0.1 "  } ) , 
   feeOptionKey:  FeeOption . Fast , 
const  gasInfo  = await  toolbox . getGasPrices (); 
 
Use Ethereum as source or destination for cross-chain swaps via THORChain:
const  ethToBtcQuote  = await  swapKit . getQuote ( { 
   senderAddress:  swapKit . getAddress (Chain . Ethereum ) , 
   recipientAddress:  swapKit . getAddress (Chain . Bitcoin ) , 
const  swapTx  = await  swapKit . swap ( { 
   route:  ethToBtcQuote . routes [ 0 ] , 
   feeOptionKey:  FeeOption . Fast , 
const  usdcToRuneQuote  = await  swapKit . getQuote ( { 
   sellAsset:  " ETH.USDC-0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 " , 
   senderAddress:  swapKit . getAddress (Chain . Ethereum ) , 
   recipientAddress:  swapKit . getAddress (Chain . THORChain ) , 
const  swapResult  = await  swapKit . swap ( { 
   route:  usdcToRuneQuote . routes [ 0 ] , 
   feeOptionKey:  FeeOption . Average , 
 
SwapKit supports major Ethereum DEXs through integrated routing:
const  uniswapQuote  = await  swapKit . getQuote ( { 
   buyAsset:  " ETH.USDC-0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 " , 
   senderAddress:  swapKit . getAddress (Chain . Ethereum ) , 
   recipientAddress:  swapKit . getAddress (Chain . Ethereum ) , 
   providers:  [ " UNISWAPV3 " ] , 
const  oneinchQuote  = await  swapKit . getQuote ( { 
   sellAsset:  " ETH.DAI-0x6B175474E89094C44Da98b954EedeAC495271d0F " , 
   buyAsset:  " ETH.WBTC-0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599 " , 
   senderAddress:  swapKit . getAddress (Chain . Ethereum ) , 
   recipientAddress:  swapKit . getAddress (Chain . Ethereum ) , 
const  dexSwap  = await  swapKit . swap ( { 
   route:  oneinchQuote . routes [ 0 ] , 
   feeOptionKey:  FeeOption . Fast , 
 
import  { validateEthereumAddress }  from   " @swapkit/toolboxes/evm " ; 
const  isValidAddress  =  validateEthereumAddress ( 
   " 0x742c4B4F3e0b5b069F5DCF8A65Eaf8d3E888a3E7 " 
console . log (isValidAddress); 
import  { getAddress }  from   " ethers " ; 
   const  checksumAddress  =  getAddress ( 
     " 0x742c4b4f3e0b5b069f5dcf8a65eaf8d3e888a3e7 " 
   console . log (checksumAddress); 
   console . error ( " Invalid address " ); 
 
Configure gas fees based on network conditions:
import  { FeeOption }  from   " @swapkit/sdk " ; 
   [FeeOption . Average ] :  1.0 , 
   [FeeOption . Fastest ] :  2.0 , 
const  customTx  = await  swapKit . transfer ( { 
   recipient:  " 0x742c4B4F3e0b5b069F5DCF8A65Eaf8d3E888a3E7 " , 
   assetValue:  AssetValue . from ( { chain:  Chain . Ethereum , value:  " 0.1 "  } ) , 
   maxFeePerGas:  " 30000000000 " , 
   maxPriorityFeePerGas:  " 2000000000 " , 
 
Handle Ethereum-specific errors appropriately:
import  { SwapKitError }  from   " @swapkit/sdk " ; 
   if  (error  instanceof   SwapKitError ) { 
       case   " toolbox_evm_insufficient_funds " : 
         console . error ( " Insufficient ETH for transaction " ); 
       case   " toolbox_evm_gas_estimation_failed " : 
         console . error ( " Could not estimate gas " ); 
       case   " toolbox_evm_transaction_failed " : 
         console . error ( " Transaction failed: " , error . cause ); 
       case   " toolbox_evm_invalid_address " : 
         console . error ( " Invalid Ethereum address " ); 
       case   " toolbox_evm_token_not_approved " : 
         console . error ( " Token approval required " ); 
         console . error ( " Unknown error: " , error); 
 
import  { JsonRpcProvider }  from   ' ethers ' ; 
const  customProvider  =  new   JsonRpcProvider ( " https : 
const   toolbox  = await  getEthereumToolbox ( { 
import  {  SKConfig  }  from   ' @swapkit/sdk ' ; 
SKConfig . setRpcUrl (Chain . Ethereum ,  [ 
 
SKConfig . setRpcUrl (Chain . Ethereum ,  " https : 
SKConfig . setEnv ( ' isMainnet ' ,  false ); 
const testToolbox  =   await   getEthereumToolbox ({ phrase:  " ... "  }); 
 
const  txHash  = await  swapKit . transfer ( { 
const  receipt  = await  toolbox . waitForTransaction (txHash); 
console . log ( ` Confirmed in block  ${ receipt . blockNumber } ` ); 
const  status  = await  toolbox . getTransactionStatus (txHash); 
const  txDetails  = await  toolbox . getTransaction (txHash); 
   blockNumber: txDetails . blockNumber , 
   gasUsed: txDetails . gasUsed , 
   status: txDetails . status , 
 
Always validate addresses  before sending transactions:
import  { isAddress }  from   " ethers " ; 
if  ( ! isAddress (recipient)) { 
   throw   new   Error ( " Invalid Ethereum address " ); 
 
 
Check balances  before transactions:
const  balance  = await  toolbox . getBalance (senderAddress); 
const  requiredAmount  =  AssetValue . from ( { 
if  (balance . lt (requiredAmount . add (estimatedGas))) { 
   throw   new   Error ( " Insufficient balance " ); 
 
 
Use appropriate gas limits  for different operations:
   contractCall:  " 100000-500000 " , 
 
 
Handle network congestion :
const  gasInfo  = await  toolbox . getGasPrices (); 
if  (gasInfo . fast   >   50000000000 ) { 
   console . warn ( " Network is congested, consider waiting " ); 
 
 
Batch operations  when possible:
const  multicallResults  = await  toolbox . multicall ([ 
   { target:  " 0x... " , callData:  " 0x... "  }, 
   { target:  " 0x... " , callData:  " 0x... "  }, 
 
 
 
const  address  = await  toolbox . resolveName ( " vitalik.eth " ); 
const  ensName  = await  toolbox . lookupAddress ( 
   " 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 " 
 
const  protectedProvider  =  new   JsonRpcProvider ( " https : 
const   privateTx  = await  toolbox . sendPrivateTransaction ( { 
   /* transaction parameters */ 
 
“Insufficient funds for gas” 
Ensure you have enough ETH to cover transaction gas costs 
Check gas price isn’t set too high 
 
 
“Transaction underpriced” 
Increase gas price or use EIP-1559 with higher maxFeePerGas 
Use FeeOption.Fast or FeeOption.Fastest 
 
 
“Nonce too low” 
Transaction nonce conflicts with pending transaction 
Wait for previous transactions to confirm 
 
 
Token transfer fails 
Check token approval status 
Verify token contract address is correct 
Ensure recipient address can receive tokens 
 
 
 
import  { SKConfig }  from   " @swapkit/sdk " ; 
SKConfig . setEnv ( " debug " ,  true ); 
const  txParams  = await  toolbox . buildTransaction ( { 
   amount:  AssetValue . from ( { chain:  Chain . Ethereum , value:  " 0.1 "  } ) , 
console . log ( " Transaction parameters: " , txParams); 
 
getBalance() - Get ETH or token balance 
transfer() - Send ETH or tokens 
buildTransaction() - Construct transaction parameters 
call() - Execute smart contract functions 
estimateCall() - Estimate gas for contract calls 
 
approve() - Approve token spending 
isApproved() - Check approval status 
getTokenInfo() - Get token metadata 
 
getGasPrices() - Get current gas prices 
waitForTransaction() - Wait for confirmation 
getTransaction() - Get transaction details 
validateAddress() - Validate address format 
 
 
New to SwapKit?  Start with Getting Started  to learn the basics.
Building multi-chain apps?  Explore Bitcoin  and Cosmos  integrations.
Need help?  Join our [Discord community](https: