UNPKG

@0x/0x-parser

Version:

🧾 Designed for 0x integrators: This library parses 0x transactions on EVM blockchains into a format that is both user-friendly and easy to understand.

1,568 lines (1,363 loc) • 44.6 kB
import { http, createPublicClient, type PublicClient, type Transport, type Chain, } from "viem"; import { base, mode, blast, linea, scroll, polygon, mainnet, arbitrum, optimism, mantle, worldchain, berachain, bsc, celo, abstract, } from "viem/chains"; import { vi, test, expect } from "vitest"; import { parseSwap } from "../index"; import { NATIVE_TOKEN_ADDRESS } from "../constants"; require("dotenv").config(); if (!process.env.ALCHEMY_API_KEY) { throw new Error("An Alchemy API key is required."); } const publicClient = createPublicClient({ chain: mainnet, transport: http( `https://eth-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }); // https://etherscan.io/tx/0x2fc205711fc933ef6e5bcc0bf6e6a9bfc220b2d8073aea4f41305882f485669d test("parses swapped amounts case 0 (default)", async () => { const transactionHash = "0x2fc205711fc933ef6e5bcc0bf6e6a9bfc220b2d8073aea4f41305882f485669d"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "KAI", amount: "12124969884.736401754", address: "0xA045Fe936E26e1e1e1Fb27C1f2Ae3643acde0171", }, tokenOut: { symbol: "USDC", amount: "340.919143", address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", }, }); }); // https://etherscan.io/tx/0x2b9a12398613887e9813594e8583f488f0e8392d8e6e0ba8d9e140065826dd00 test("parses swapped amounts case 1 (default)", async () => { const transactionHash = "0x2b9a12398613887e9813594e8583f488f0e8392d8e6e0ba8d9e140065826dd00"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "30.084159", address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", }, tokenOut: { symbol: "USDT", amount: "30.069172", address: "0xdAC17F958D2ee523a2206206994597C13D831ec7", }, }); }); // https://etherscan.io/tx/0x761521a243ca56338b8bcbcf0d4bfc230ff349bb36e31472ac1d850977bdc484 test("parses swapped amounts for meta transaction", async () => { const transactionHash = "0x761521a243ca56338b8bcbcf0d4bfc230ff349bb36e31472ac1d850977bdc484"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "ZRX", amount: "833.3332", address: "0xE41d2489571d322189246DaFA5ebDe1F4699F498", }, tokenOut: { symbol: "ETH", amount: "0.08832649392868776", address: NATIVE_TOKEN_ADDRESS, }, }); }); // https://etherscan.io/tx/0x76b744ab42b05b30624bd5027b4f7da841cdc357bb1d6ee74e3d9e049dd8a126 test("parses swapped amounts case 2 (default)", async () => { const transactionHash = "0x76b744ab42b05b30624bd5027b4f7da841cdc357bb1d6ee74e3d9e049dd8a126"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "1", address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", }, tokenOut: { symbol: "WETH", amount: "0.000280757770903965", address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", }, }); }); // https://etherscan.io/tx/0x565e8e0582b620ee06618ee0b7705dc0e7f56dfd88b5eb3e008c0858f6f806d8 test("parses swapped amounts case 3 (default)", async () => { const transactionHash = "0x565e8e0582b620ee06618ee0b7705dc0e7f56dfd88b5eb3e008c0858f6f806d8"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "8.15942", address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", }, tokenOut: { symbol: "WBTC", amount: "0.00013188", address: "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", }, }); }); // https://etherscan.io/tx/0xd024750c7dcb99ace02c6b083c68d73dcfebdee252ccbeb1b83981b609693271 test("parses swapped amounts case 4 (default)", async () => { const transactionHash = "0xd024750c7dcb99ace02c6b083c68d73dcfebdee252ccbeb1b83981b609693271"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "335.142587", address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", }, tokenOut: { symbol: "WETH", amount: "0.105662100963455883", address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", }, }); }); // https://etherscan.io/tx/0x4cbcf2e2512adb7e28f19f8cf28ddc29a9f9fea93c842cf3b735eeb526fe34b3 test("parses swapped amounts case 5 (native sell token)", async () => { const transactionHash = "0x4cbcf2e2512adb7e28f19f8cf28ddc29a9f9fea93c842cf3b735eeb526fe34b3"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "ETH", amount: "0.04", address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", }, tokenOut: { symbol: "USDC", amount: "126.580558", address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", }, }); }); // https://etherscan.io/tx/0x28c5bb3768bb64e81e1f3753ed1a8c30f0484a434d6c2b4af825d258ecb3bcf0 test("parses swapped amounts case 6 (buy DNT 404 token)", async () => { const transactionHash = "0x28c5bb3768bb64e81e1f3753ed1a8c30f0484a434d6c2b4af825d258ecb3bcf0"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "95", address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", }, tokenOut: { symbol: "CHIB", amount: "10.527633901274097318", address: "0x7068263EDa099fB93BB3215c05e728c0b54b3137", }, }); }); // https://etherscan.io/tx/0xb8beef6bf857f2fc22905b2872120abc634900b45941478aa9cf0ad1ceffcd67 // https://gopluslabs.io/token-security/1/0xcf0c122c6b73ff809c693db761e7baebe62b6a2e test("parses swapped amounts case 6 (buy FoT token, FLOKI)", async () => { const transactionHash = "0xb8beef6bf857f2fc22905b2872120abc634900b45941478aa9cf0ad1ceffcd67"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "31.580558", address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", }, tokenOut: { symbol: "FLOKI", amount: "172036.330384861", address: "0xcf0C122c6b73ff809C693DB761e7BaeBe62b6a2E", }, }); }); // Gasless RFQ // https://etherscan.io/tx/0x5dd4579b5709b405d6df935d516563e1db09453f37431639ae7e1358ec8f834d test("parses swapped amounts from tx settled by gasless rfq)", async () => { const transactionHash = "0x5dd4579b5709b405d6df935d516563e1db09453f37431639ae7e1358ec8f834d"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "20", address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", }, tokenOut: { symbol: "USDT", amount: "11.604822", address: "0xdAC17F958D2ee523a2206206994597C13D831ec7", }, }); }); // https://explorer.celo.org/tx/0x615c5089f772a8f2074750e8c6070013d288af7681435aba1771f6bfc63d1286 test("throws an error for unsupported chains)", async () => { const transactionHash = "0x615c5089f772a8f2074750e8c6070013d288af7681435aba1771f6bfc63d1286"; const publicClient = createPublicClient({ chain: celo, transport: http("https://rpc.ankr.com/celo"), }) as unknown as PublicClient<Transport, Chain>; await expect(async () => { await parseSwap({ publicClient, transactionHash, }); }).rejects.toThrowError("chainId 42220 is unsupported…"); }); // https://basescan.org/tx/0x314ea35ef3120934ee4714f4815dc3b08dc2ab0e32e0662bfba3cdbcff14d79b test("parse a gasless swap on Base (DAI for USDC)", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0x314ea35ef3120934ee4714f4815dc3b08dc2ab0e32e0662bfba3cdbcff14d79b"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "DAI", amount: "1.998484821908329022", address: "0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb", }, tokenOut: { symbol: "USDC", amount: "1.982641", address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", }, }); }); // https://basescan.org/tx/0xb1ac9977d28e750add3b1a1ebdc95e56a51a9af7fc3d66fa7c011686eac455e6 test("parse a gasless swap on Base (USDC for BRETT) via metaTxn multicall", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0xb1ac9977d28e750add3b1a1ebdc95e56a51a9af7fc3d66fa7c011686eac455e6"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "1000", address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", }, tokenOut: { symbol: "BRETT", amount: "18260.873189681406728218", address: "0x532f27101965dd16442E59d40670FaF5eBB142E4", }, }); }); // https://basescan.org/tx/0xa09cb1606e30c3aed8a842723fd6c23cecd838a59f750ab3dbc5ef2c7486e696 test("parse a swap on Base (USDC for DAI)", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0xa09cb1606e30c3aed8a842723fd6c23cecd838a59f750ab3dbc5ef2c7486e696"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "17.834287", address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", }, tokenOut: { symbol: "DAI", amount: "17.843596331665784515", address: "0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb", }, }); }); // https://basescan.org/tx/0xea8bca6e13f2c3e6c1e956308003b8d5da5fca44e03eac7ddbdcea271186ab37 test("parse a swap on Base (DEGEN for ETH)", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0xea8bca6e13f2c3e6c1e956308003b8d5da5fca44e03eac7ddbdcea271186ab37"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "DEGEN", amount: "3173.454530222930443426", address: "0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed", }, tokenOut: { symbol: "ETH", amount: "0.006410046715601835", address: NATIVE_TOKEN_ADDRESS, }, }); }); // https://basescan.org/tx/0x9e81eee3f09b79fe1e3700fdb79bf78098b6073ec17e3524498177407ac33a00 test("parse a swap on Base (ETH for BRETT)", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0x9e81eee3f09b79fe1e3700fdb79bf78098b6073ec17e3524498177407ac33a00"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "ETH", amount: "0.027500863104380774", address: NATIVE_TOKEN_ADDRESS, }, tokenOut: { symbol: "BRETT", amount: "698.405912537092209301", address: "0x532f27101965dd16442E59d40670FaF5eBB142E4", }, }); }); // https://polygonscan.com/tx/0x438517b81f50858035f4b8e0870f5d797616509b5102c28814bcc378559c213d test("parse a gasless approval + gasless swap on Polygon (USDC for POL)", async () => { const publicClient = createPublicClient({ chain: polygon, transport: http( `https://polygon-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }); const transactionHash = "0x438517b81f50858035f4b8e0870f5d797616509b5102c28814bcc378559c213d"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "7.79692", address: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", }, tokenOut: { symbol: "POL", amount: "15.513683571865599415", address: NATIVE_TOKEN_ADDRESS, }, }); }); // https://basescan.org/tx/0x40fc248824e11c11debb307a68ba04ff0f068c67de07e6817f5405e055b91c44 test("parse a gasless swap on Base (USDC for DEGEN)", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0x40fc248824e11c11debb307a68ba04ff0f068c67de07e6817f5405e055b91c44"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "42.001841", address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", }, tokenOut: { symbol: "DEGEN", amount: "6570.195174245277347697", address: "0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed", }, }); }); // https://basescan.org/tx/0x14416958953850c5c5a572d6e8cb832c032d0678b3ce9da6cdce891a20864b99 test("parse a gasless swap on Base (USDC for ETH) for SettlerMetaTxn", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0x14416958953850c5c5a572d6e8cb832c032d0678b3ce9da6cdce891a20864b99"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "21.27865", address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", }, tokenOut: { symbol: "ETH", amount: "0.006847116541535933", address: NATIVE_TOKEN_ADDRESS, }, }); }); // https://basescan.org/tx/0x29b3f7bcd154e20e050793aa62d90309a860296aa846fd1158dc21356d1a3deb test("parse a gasless swap on Base (weirdo for ETH) for SettlerMetaTxn", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0x29b3f7bcd154e20e050793aa62d90309a860296aa846fd1158dc21356d1a3deb"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "weirdo", amount: "3145398.30971883", address: "0x76734B57dFe834F102fB61E1eBF844Adf8DD931e", }, tokenOut: { symbol: "ETH", amount: "0.039633073597929391", address: NATIVE_TOKEN_ADDRESS, }, }); }); // https://basescan.org/tx/0xe595dec22a7e2c2c5bdb0c1a7e59b2302ede72e5d2210c6cd7071222ea6dc2b2 test("parse a gasless swap on Base (DEGEN for USDC) for SettlerMetaTxn", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0xe595dec22a7e2c2c5bdb0c1a7e59b2302ede72e5d2210c6cd7071222ea6dc2b2"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "DEGEN", amount: "1392.424785087824779911", address: "0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed", }, tokenOut: { symbol: "USDC", amount: "9.915288", address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", }, }); }); // https://basescan.org/tx/0x3d032fdd216315c3dce7bcafeac0805ec18d27c7c9fdf43836cab7fb61332a6d test("parse a swap on Base (KEIRA for ETH) for Settler", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0x3d032fdd216315c3dce7bcafeac0805ec18d27c7c9fdf43836cab7fb61332a6d"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "KEIRA", amount: "27538.512122127777968652", address: "0x710eEc215b3bB653d42fC6e70E0531eA13F51A7A", }, tokenOut: { symbol: "ETH", amount: "0.035509880980229712", address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", }, }); }); // https://arbiscan.io/tx/0xb2c05194e4ec9ae0f82098ec82a606df544e87c8d6b7726bbb4b1dcc023cb9d7 test("parse a gasless swap on on Arbitrum (ARB for ETH)", async () => { const publicClient = createPublicClient({ chain: arbitrum, transport: http( `https://arb-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }); const transactionHash = "0xb2c05194e4ec9ae0f82098ec82a606df544e87c8d6b7726bbb4b1dcc023cb9d7"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "ARB", amount: "1.337", address: "0x912CE59144191C1204E64559FE8253a0e49E6548", }, tokenOut: { symbol: "ETH", amount: "0.000304461782666722", address: NATIVE_TOKEN_ADDRESS, }, }); }); // https://optimistic.etherscan.io/tx/0xdfd5180c9f84d8f7381f48550dd14df86dd704489c251a10a67bd3cfdb0ae626 test("parse a gasless swap on Optimism (USDC for OP) for executeMetaTxn", async () => { const publicClient = createPublicClient({ chain: optimism, transport: http( `https://opt-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0xdfd5180c9f84d8f7381f48550dd14df86dd704489c251a10a67bd3cfdb0ae626"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "5", address: "0x7F5c764cBc14f9669B88837ca1490cCa17c31607", }, tokenOut: { symbol: "OP", amount: "2.744026666231502743", address: "0x4200000000000000000000000000000000000042", }, }); }); // https://optimistic.etherscan.io/tx/0x9abc33ffc67ff9348af9a29f109c4f27b36ee5bc80dd81ae3814e69309449a61 test("parse a gasless swap on Optimism (USDC for OP) for execute", async () => { const publicClient = createPublicClient({ chain: optimism, transport: http( `https://opt-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0x9abc33ffc67ff9348af9a29f109c4f27b36ee5bc80dd81ae3814e69309449a61"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "5", address: "0x7F5c764cBc14f9669B88837ca1490cCa17c31607", }, tokenOut: { symbol: "OP", amount: "2.73214427938472425", address: "0x4200000000000000000000000000000000000042", }, }); }); test("parse a swap on BNB Chain (ETH for USDC) for execute", async () => { const publicClient = createPublicClient({ chain: bsc, transport: http( `https://attentive-twilight-flower.bsc.quiknode.pro/${process.env.QUICKNODE_BNB_CHAIN_API_KEY}/` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0xdda12da1e32c3320082355c985d6f2c6559169989de51e3cc83123395516c057"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "ETH", amount: "0.728252933682622857", address: "0x2170Ed0880ac9A755fd29B2688956BD959F933F8", }, tokenOut: { symbol: "USDC", amount: "2260.511889276471849176", address: "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", }, }); }); test("throws when smart contract wallet is not passed", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0x756289cdedd4c007268ef208fe2758a9fb6efd49fb241397b67089512b497662"; await expect(async () => { await parseSwap({ publicClient, transactionHash, }); }).rejects.toThrowError( "This is an ERC-4337 transaction. You must provide a smart contract wallet address to 0x-parser." ); }); // https://basescan.org/tx/0x756289cdedd4c007268ef208fe2758a9fb6efd49fb241397b67089512b497662 test("parse a swap on Base (DEGEN for BRETT) with smart contract wallet", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0x756289cdedd4c007268ef208fe2758a9fb6efd49fb241397b67089512b497662`; const result = await parseSwap({ publicClient, transactionHash, smartContractWallet: "0x3F6dAB60Cc16377Df9684959e20962f44De20988", }); expect(result).toEqual({ tokenIn: { symbol: "DEGEN", amount: "882.414233540058884907", address: "0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed", }, tokenOut: { symbol: "BRETT", amount: "48.014669721245576995", address: "0x532f27101965dd16442E59d40670FaF5eBB142E4", }, }); }); // https://basescan.org/tx/0xaa09479aafdb1a33815fb3842c350ccedf5e3f9eaec31b8cba1f41eea674a8f3 test("parse a swap on Base (BRETT for ETH) with smart contract wallet", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0xaa09479aafdb1a33815fb3842c350ccedf5e3f9eaec31b8cba1f41eea674a8f3`; const result = await parseSwap({ publicClient, transactionHash, smartContractWallet: "0x3F6dAB60Cc16377Df9684959e20962f44De20988", }); expect(result).toEqual({ tokenIn: { symbol: "BRETT", amount: "48.014669721245576995", address: "0x532f27101965dd16442E59d40670FaF5eBB142E4", }, tokenOut: { symbol: "ETH", amount: "0.001482901054900327", address: NATIVE_TOKEN_ADDRESS, }, }); }); // https://basescan.org/tx/0x283e2034885c34d2e2a5755e8ec77517c5eb8a2bf859a1a74b6dafec6f7ec73b test("parse a meta transaction swap on Base (WETH for USDC)", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0x283e2034885c34d2e2a5755e8ec77517c5eb8a2bf859a1a74b6dafec6f7ec73b`; const result = await parseSwap({ publicClient, transactionHash, smartContractWallet: "0x3F6dAB60Cc16377Df9684959e20962f44De20988", }); expect(result).toEqual({ tokenIn: { symbol: "WETH", amount: "0.0076565", address: "0x4200000000000000000000000000000000000006", }, tokenOut: { symbol: "USDC", amount: "19.977303", address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", }, }); }); // https://basescan.org/tx/0xe289a22987dcedfacb13584211c1d723ef5c42ea6e0dfd5c4d3271d20dec9ddc test("parse a swap on Base (ETH for USDC) with smart contract wallet", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0xe289a22987dcedfacb13584211c1d723ef5c42ea6e0dfd5c4d3271d20dec9ddc`; const result = await parseSwap({ publicClient, transactionHash, smartContractWallet: "0x3F6dAB60Cc16377Df9684959e20962f44De20988", }); expect(result).toEqual({ tokenIn: { symbol: "ETH", amount: "0.001", address: NATIVE_TOKEN_ADDRESS, }, tokenOut: { symbol: "USDC", amount: "2.600807", address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", }, }); }); // https://polygonscan.com/tx/0xc624eb3ea779d1645571b5a538683eee1fb1bd9afdb1d0cb470de2b8755353a9 test("parse a swap on Polygon (WPOL for USDC) with smart contract wallet", async () => { const publicClient = createPublicClient({ chain: polygon, transport: http( `https://polygon-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }); const transactionHash = `0xc624eb3ea779d1645571b5a538683eee1fb1bd9afdb1d0cb470de2b8755353a9`; const result = await parseSwap({ publicClient, transactionHash, smartContractWallet: "0x3F6dAB60Cc16377Df9684959e20962f44De20988", }); expect(result).toEqual({ tokenIn: { symbol: "POL", amount: "5", address: NATIVE_TOKEN_ADDRESS, }, tokenOut: { symbol: "USDC", amount: "2.04366", address: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", }, }); }); // https://polygonscan.com/tx/0x6ec07b99b37695a60915b3886476a86efdd4c60420ddcd158efd62f9c3fba074 test("parse a swap on Polygon (USDC for WPOL) with smart contract wallet", async () => { const publicClient = createPublicClient({ chain: polygon, transport: http( `https://polygon-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }); const transactionHash = `0x6ec07b99b37695a60915b3886476a86efdd4c60420ddcd158efd62f9c3fba074`; const result = await parseSwap({ publicClient, transactionHash, smartContractWallet: "0x3F6dAB60Cc16377Df9684959e20962f44De20988", }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "2.04366", address: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", }, tokenOut: { symbol: "WPOL", amount: "4.996808166219061944", address: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", }, }); }); // https://bscscan.com/tx/0xfd4730866f81a7007a586c21b97f56d3f1e62bbba7ebb65e52032676466a8ec1 test("parse a swap on BNB Chain (BNB for USDT) with smart contract wallet", async () => { const publicClient = createPublicClient({ chain: bsc, transport: http( `https://attentive-twilight-flower.bsc.quiknode.pro/${process.env.QUICKNODE_BNB_CHAIN_API_KEY}/` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0xfd4730866f81a7007a586c21b97f56d3f1e62bbba7ebb65e52032676466a8ec1`; const result = await parseSwap({ publicClient, transactionHash, smartContractWallet: "0x3F6dAB60Cc16377Df9684959e20962f44De20988", }); expect(result).toEqual({ tokenIn: { symbol: "BNB", amount: "0.001", address: NATIVE_TOKEN_ADDRESS, }, tokenOut: { symbol: "USDT", amount: "0.537528100143963945", address: "0x55d398326f99059fF775485246999027B3197955", }, }); }); // https://bscscan.com/tx/0x5f8839d369b61c5325a4f5406f55e26310722744aa3177b62924e077cb705432 test("parse a swap on BNB Chain (USDT for BNB) with smart contract wallet", async () => { const publicClient = createPublicClient({ chain: bsc, transport: http( `https://attentive-twilight-flower.bsc.quiknode.pro/${process.env.QUICKNODE_BNB_CHAIN_API_KEY}/` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0x5f8839d369b61c5325a4f5406f55e26310722744aa3177b62924e077cb705432`; const result = await parseSwap({ publicClient, transactionHash, smartContractWallet: "0x3F6dAB60Cc16377Df9684959e20962f44De20988", }); expect(result).toEqual({ tokenIn: { symbol: "USDT", amount: "1.874528100143963945", address: "0x55d398326f99059fF775485246999027B3197955", }, tokenOut: { symbol: "BNB", amount: "0.003467772175199184", address: NATIVE_TOKEN_ADDRESS, }, }); }); // https://basescan.org/tx/0x47b4e55bfaee712775a2181f0219db02647d1a2f97eeac6b4f6f2465aac64d86 test("gracefully handles a revert in a erc-4337 transaction", async () => { const publicClient = createPublicClient({ chain: base, transport: http( `https://base-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0x47b4e55bfaee712775a2181f0219db02647d1a2f97eeac6b4f6f2465aac64d86`; const result = await parseSwap({ publicClient, transactionHash, smartContractWallet: "0x3F6dAB60Cc16377Df9684959e20962f44De20988", }); expect(result).toEqual(null); }); // https://scrollscan.com/tx/0x84b07445a1a868b4338df8aed67c9ea330e771596bf603dbef8c12b3cb9970e5 test("parse a swap on Scroll (USDC for USDT) with execute", async () => { const publicClient = createPublicClient({ chain: scroll, transport: http( `https://scroll-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }); const transactionHash = `0x84b07445a1a868b4338df8aed67c9ea330e771596bf603dbef8c12b3cb9970e5`; const result = await parseSwap({ publicClient, transactionHash, smartContractWallet: "0x3F6dAB60Cc16377Df9684959e20962f44De20988", }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "1", address: "0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4", }, tokenOut: { symbol: "USDT", amount: "0.998168", address: "0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df", }, }); }); // https://lineascan.build/tx/0x3506d4cd4b434ec3e6fb2ec5473069471257a9436c4e8e576e0eca2a02816a75 test("parse a swap on Linea (USDC for WETH) with execute", async () => { const publicClient = createPublicClient({ chain: linea, transport: http( `https://linea-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }); const transactionHash = `0x3506d4cd4b434ec3e6fb2ec5473069471257a9436c4e8e576e0eca2a02816a75`; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "22.314511", address: "0x176211869cA2b568f2A7D4EE941E073a821EE1ff", }, tokenOut: { symbol: "ETH", amount: "0.008646502734906467", address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", }, }); }); // https://blastscan.io/tx/0x2cdcf1c74ff01657a2d8540be3e820e21312fd5b929ae1dc887f1a45418a4bf4 test("parse a swap on Blast (YOLO for USDB) with execute", async () => { const publicClient = createPublicClient({ chain: blast, transport: http( `https://blast-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0x2cdcf1c74ff01657a2d8540be3e820e21312fd5b929ae1dc887f1a45418a4bf4`; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "YOLO", amount: "10004.483202235712364987", address: "0xf77dd21c5ce38ac08786BE35Ef1d1DeC1a6a15F3", }, tokenOut: { symbol: "USDB", amount: "22.673803957148435593", address: "0x4300000000000000000000000000000000000003", }, }); }); // https://blastscan.io/tx/0x62b094c45cc2506d60d44afa50bc54e699c09278be5050d8510a42ab1c8fa31f test("parse a swap on Blast (ETH for ezETH) with execute", async () => { const publicClient = createPublicClient({ chain: blast, transport: http( `https://blast-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0x62b094c45cc2506d60d44afa50bc54e699c09278be5050d8510a42ab1c8fa31f`; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "ETH", amount: "0.0005", address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", }, tokenOut: { symbol: "ezETH", amount: "0.000491534297265178", address: "0x2416092f143378750bb29b79eD961ab195CcEea5", }, }); }); // https://mantlescan.xyz/tx/0xbd89bd8f580e5606c046feac8b0d72e321009cfed361c9919eb4845999ea79a4 test("parse a swap on Mantle (WETH for mETH) with execute", async () => { const publicClient = createPublicClient({ chain: mantle, transport: http( `https://blissful-snowy-owl.mantle-mainnet.quiknode.pro/${process.env.QUICKNODE_MANTLE_API_KEY}/` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0xbd89bd8f580e5606c046feac8b0d72e321009cfed361c9919eb4845999ea79a4`; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "WETH", amount: "0.0001", address: "0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111", }, tokenOut: { symbol: "mETH", amount: "0.000097870496599353", address: "0xcDA86A272531e8640cD7F1a92c01839911B90bb0", }, }); }); // https://mantlescan.xyz/tx/0x504118136b57d7a1ef7b3674505c32bf9d8d3df9c7991a9ee627f9883257dc38 test("parse a swap on Mantle (USDC for MNT) with SettlerMetaTxn", async () => { const publicClient = createPublicClient({ chain: mantle, transport: http( `https://blissful-snowy-owl.mantle-mainnet.quiknode.pro/${process.env.QUICKNODE_MANTLE_API_KEY}/` ), }); const transactionHash = `0x504118136b57d7a1ef7b3674505c32bf9d8d3df9c7991a9ee627f9883257dc38`; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "2", address: "0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9", }, tokenOut: { symbol: "MNT", amount: "1.737346835463007796", address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", }, }); }); // https://explorer.mode.network/tx/0xd84a08f6d48b5c34cde908452602088cdb42beceef29074b8a8d5c7e45f2a3dc test("parse a swap on Mode (ETH for BEAST) with Settler", async () => { const publicClient = createPublicClient({ chain: mode, transport: http( `https://nameless-still-sound.mode-mainnet.quiknode.pro/${process.env.QUICKNODE_MODE_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0xd84a08f6d48b5c34cde908452602088cdb42beceef29074b8a8d5c7e45f2a3dc`; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "ETH", amount: "0.001", address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", }, tokenOut: { symbol: "BEAST", amount: "273191.79887332631998981", address: "0x6a660e56FA3b630A786CC4Ae98859f8532D03dE9", }, }); }); // https://explorer.mode.network/tx/0xd10163ac93593667d3922a05c09580856b1b4c1dc015738c67968912a42c46dc test("parse a swap on Mode (BEAST for ezETH) with Settler", async () => { const publicClient = createPublicClient({ chain: mode, transport: http( `https://nameless-still-sound.mode-mainnet.quiknode.pro/${process.env.QUICKNODE_MODE_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0xd10163ac93593667d3922a05c09580856b1b4c1dc015738c67968912a42c46dc`; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "BEAST", amount: "238973", address: "0x6a660e56FA3b630A786CC4Ae98859f8532D03dE9", }, tokenOut: { symbol: "ezETH", amount: "0.000846925725410518", address: "0x2416092f143378750bb29b79eD961ab195CcEea5", }, }); }); // https://explorer.mode.network/tx/0xbdd6288ff42ccdd63779214c911c0e86debf02ee3bbf1e6f0355d40a8fba1a1f test("parse a swap on Mode (ezETH for MODE) with SettlerMetaTxn", async () => { const publicClient = createPublicClient({ chain: mode, transport: http( `https://nameless-still-sound.mode-mainnet.quiknode.pro/${process.env.QUICKNODE_MODE_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0xbdd6288ff42ccdd63779214c911c0e86debf02ee3bbf1e6f0355d40a8fba1a1f`; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "ezETH", amount: "0.000846925725410518", address: "0x2416092f143378750bb29b79eD961ab195CcEea5", }, tokenOut: { symbol: "MODE", amount: "60.488654650393620538", address: "0xDfc7C877a950e49D2610114102175A06C2e3167a", }, }); }); // https://worldscan.org/tx/0xc6b6a747910ff6ff6262f3a7067db5d48fb83d774f3556bee7654b020f0e875d test("parse a swap on Worldchain (USDC.e for WLD) with Settler", async () => { const publicClient = createPublicClient({ chain: worldchain, transport: http( `https://worldchain-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0xc6b6a747910ff6ff6262f3a7067db5d48fb83d774f3556bee7654b020f0e875d`; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "0.8", address: "0x79A02482A880bCE3F13e09Da970dC34db4CD24d1", }, tokenOut: { symbol: "WLD", amount: "0.382406307673532742", address: "0x2cFc85d8E48F8EAB294be644d9E25C3030863003", }, }); }); // https://worldscan.org/tx/0x4c095630a5b87cd2c04fcc2cf08940ed8251f6d451efc61e1e90b42775d4f051 test("parse a swap on Worldchain (ETH for USDC.e) with Settler", async () => { const publicClient = createPublicClient({ chain: worldchain, transport: http( `https://worldchain-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0x4c095630a5b87cd2c04fcc2cf08940ed8251f6d451efc61e1e90b42775d4f051`; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "ETH", amount: "0.001", address: NATIVE_TOKEN_ADDRESS, }, tokenOut: { symbol: "USDC", amount: "3.332454", address: "0x79A02482A880bCE3F13e09Da970dC34db4CD24d1", }, }); }); // https://unichain.blockscout.com/tx/0xa0129a4f97833aefb12b85594a9bbe1861be0a207ac14f423588b7b5dbe1a6a6 test("parse a swap on Unichain (WETH for USDC) with AllowanceHolder", async () => { const publicClient = createPublicClient({ chain: worldchain, transport: http( `https://unichain-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0xa0129a4f97833aefb12b85594a9bbe1861be0a207ac14f423588b7b5dbe1a6a6`; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "WETH", amount: "0.003", address: "0x4200000000000000000000000000000000000006", }, tokenOut: { symbol: "USDC", amount: "7.812884", address: "0x078D782b760474a361dDA0AF3839290b0EF57AD6", }, }); }); // https://berascan.com/tx/0xaf644cef00ca79ee0365218d02cf238c2b4a5e9a1b1e7cfccaee1542fb19211b test("parse a swap on Berachain (WETH for WBERA) with AllowanceHolder", async () => { const publicClient = createPublicClient({ chain: berachain, transport: http( `https://berachain-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = `0xaf644cef00ca79ee0365218d02cf238c2b4a5e9a1b1e7cfccaee1542fb19211b`; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "WETH", amount: "0.0025", address: "0x2F6F07CDcf3588944Bf4C42aC74ff24bF56e7590", }, tokenOut: { symbol: "WBERA", amount: "1.116831193710334426", address: "0x6969696969696969696969696969696969696969", }, }); }); // https://etherscan.io/tx/0x25f24a7e6ec93abc99dca56a0ef2de1999deb17f67e6ed91cad1271757fff810 test("logs a warning for reverted transactions)", async () => { const warnSpy = vi.spyOn(console, "warn"); const transactionHash = `0x25f24a7e6ec93abc99dca56a0ef2de1999deb17f67e6ed91cad1271757fff810`; await parseSwap({ publicClient, transactionHash }); expect(warnSpy).toHaveBeenCalled(); expect(warnSpy).toHaveBeenCalledWith( `Unable to parse. Transaction ${transactionHash} on Ethereum has reverted.` ); warnSpy.mockRestore(); }); //https://etherscan.io/tx/0x7eea91c5c715ef4bb1e39ddf4c7832113693e87c18392740353d5ae669406a46 test("parse a swap on Ethereum (USDC for WMON) with SettlerIntent", async () => { const transactionHash = "0x7eea91c5c715ef4bb1e39ddf4c7832113693e87c18392740353d5ae669406a46"; const result = await parseSwap({ publicClient: publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "USDC", amount: "1000.080833", address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", }, tokenOut: { symbol: "WMON", amount: "22204.573291811240325155", address: "0x6917037F8944201b2648198a89906Edf863B9517", }, }); }); // https://optimistic.etherscan.io/tx/0xdee6f4fea0250f297ed9663c4ca4479e8a253c62e16faa60759e25832cd1f34f test("parse a swap on Optimism (wstETH for ETH) via Balancer pool", async () => { const publicClient = createPublicClient({ chain: optimism, transport: http( `https://opt-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_API_KEY}` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0xdee6f4fea0250f297ed9663c4ca4479e8a253c62e16faa60759e25832cd1f34f"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "wstETH", amount: "0.008868", address: "0x1F32b1c2345538c0c6f582fCB022739c4A194Ebb", }, tokenOut: { symbol: "ETH", amount: "0.010671015314389981", address: NATIVE_TOKEN_ADDRESS, }, }); }); // https://etherscan.io/tx/0x967cb342227a2541a845058862e70833d638bf5bb7ce229c6506466dbb43a004 test("parse a swap on Mainnet (TRG for SHITCOIN)", async () => { const transactionHash = "0x967cb342227a2541a845058862e70833d638bf5bb7ce229c6506466dbb43a004" as `0x${string}`; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "TRG", amount: "5053634.405791388940070628", address: "0x93eEB426782BD88fCD4B48D7b0368CF061044928", }, tokenOut: { symbol: "SHITCOIN", amount: "881342.949331124", address: "0x4fD1b29d1aAFeA37A2d19E7d912b6eda44dBd82C", }, }); }); // https://abscan.org/tx/0x89d0b2806d53d06a9b7f8105c041ec2d114f6b75ce3ea85a8c7bdb4ce8ae3d5a test("parse a swap on Abstract (PENGU for USDC.e)", async () => { const publicClient = createPublicClient({ chain: abstract, transport: http( `https://serene-convincing-replica.abstract-mainnet.quiknode.pro/${process.env.QUICKNODE_ABSTRACT_API_KEY}/` ), }) as PublicClient<Transport, Chain>; const transactionHash = "0x89d0b2806d53d06a9b7f8105c041ec2d114f6b75ce3ea85a8c7bdb4ce8ae3d5a"; const result = await parseSwap({ publicClient, transactionHash, }); expect(result).toEqual({ tokenIn: { symbol: "PENGU", amount: "313.635629165192342644", address: "0x9eBe3A824Ca958e4b3Da772D2065518F009CBa62", }, tokenOut: { symbol: "USDC.e", amount: "2.98552", address: "0x84A71ccD554Cc1b02749b35d22F684CC8ec987e1", }, }); });