UNPKG

@btr-supply/swap

Version:

Generic Bridge+Swap aggregator for compatible EVMs

1,118 lines (1,112 loc) 114 kB
// @bun // packages/core/src/types.ts var AggId; ((AggId2) => { AggId2["LIFI"] = "LIFI"; AggId2["SOCKET"] = "SOCKET"; AggId2["SQUID"] = "SQUID"; AggId2["RANGO"] = "RANGO"; AggId2["UNIZEN"] = "UNIZEN"; AggId2["ROCKETX"] = "ROCKETX"; AggId2["ONE_INCH"] = "ONE_INCH"; AggId2["ZERO_X"] = "ZERO_X"; AggId2["PARASWAP"] = "PARASWAP"; AggId2["ODOS"] = "ODOS"; AggId2["KYBERSWAP"] = "KYBERSWAP"; AggId2["OPENOCEAN"] = "OPENOCEAN"; AggId2["FIREBIRD"] = "FIREBIRD"; AggId2["BEBOP"] = "BEBOP"; AggId2["DEBRIDGE"] = "DEBRIDGE"; AggId2["COWSWAP"] = "COWSWAP"; AggId2["HASHFLOW"] = "HASHFLOW"; AggId2["AIRSWAP"] = "AIRSWAP"; AggId2["ONE_INCH_FUSION"] = "ONE_INCH_FUSION"; AggId2["PARASWAP_DELTA"] = "PARASWAP_DELTA"; AggId2["UNIZEN_GASLESS"] = "UNIZEN_GASLESS"; })(AggId ||= {}); var SerializationMode; ((SerializationMode2) => { SerializationMode2["JSON"] = "JSON"; SerializationMode2["CSV"] = "CSV"; SerializationMode2["TABLE"] = "TABLE"; SerializationMode2["SQLITE"] = "SQLITE"; })(SerializationMode ||= {}); var DisplayMode; ((DisplayMode2) => { DisplayMode2["ALL"] = "ALL"; DisplayMode2["BEST"] = "BEST"; DisplayMode2["ALL_COMPACT"] = "ALL_COMPACT"; DisplayMode2["BEST_COMPACT"] = "BEST_COMPACT"; DisplayMode2["RANK"] = "RANK"; })(DisplayMode ||= {}); // packages/core/src/constants.ts var aggregatorsWithContractCalls = ["LIFI" /* LIFI */, "SOCKET" /* SOCKET */, "SQUID" /* SQUID */]; var defaultAggregators = [ "LIFI" /* LIFI */, "SOCKET" /* SOCKET */, "UNIZEN" /* UNIZEN */, "RANGO" /* RANGO */, "SQUID" /* SQUID */ ]; var zeroAddress = "0x0000000000000000000000000000000000000000"; var nativeTokenAddress = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"; var MAX_SLIPPAGE_BPS = 500; var addresses = { 1: { accounts: { impersonate: "0xf977814e90da44bfa03b6295a0616a897441acec" }, tokens: { USDC: ["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "USDC", 6], USDT: ["0xdAC17F958D2ee523a2206206994597C13D831ec7", "USDT", 6], frxUSD: ["0xcacd6fd266af91b8aed52accc382b4e165586e29", "frxUSD", 18], FRAX: ["0x853d955aCEf822Db058eb8505911ED77F175b99e", "FRAX", 18], sFRAX: ["0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32", "sFRAX", 18], FDUSD: ["0xc5f0f7b66764F6ec8C8Dff7BA683102295E16409", "FDUSD", 18], LUSD: ["0x5f98805A4E8be255a32880FDeC7F6728C6568bA0", "LUSD", 18], DAI: ["0x6B175474E89094C44Da98b954EedeAC495271d0F", "DAI", 18], USDS: ["0xdC035D45d973E3EC169d2276DDab16f1e407384F", "USDS", 18], sUSDS: ["0xa3931d71877C0E7a3148CB7Eb4463524FEc27fbD", "sUSDS", 18], BUSD: ["0x4Fabb145d64652a948d72533023f6E7A623C7C53", "BUSD", 18], DOLA: ["0x865377367054516e17014CcdED1e7d814EDC9ce4", "DOLA", 18], sDOLA: ["0xb45ad160634c528Cc3D2926d9807104FA3157305", "sDOLA", 18], crvUSD: ["0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E", "crvUSD", 18], scrvUSD: ["0x0655977FEb2f289A4aB78af67BAB0d17aAb84367", "scrvUSD", 18], USDe: ["0x4c9EDD5852cd905f086C759E8383e09bff1E68B3", "USDe", 18], sUSDe: ["0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", "sUSDe", 18], PYUSD: ["0x6c3ea9036406852006290770BEdFcAbA0e23A0e8", "PYUSD", 18], USDD: ["0x0C10bF8FcB7Bf5412187A595ab97a3609160b5c6", "USDD", 18], TUSD: ["0x0000000000085d4780B73119b644AE5ecd22b376", "TUSD", 18], USDP: ["0x8E870D67F660D95d5be530380D0eC0bd388289E1", "USDP", 18], BUIDL: ["0x7712c34205737192402172409a8f7ccef8aa2aec", "BUIDL", 6], USD0: ["0x73A15FeD60Bf67631dC6cd7Bc5B6e8da8190aCF5", "USD0", 18], USDX: ["0xf3527ef8de265eaa3716fb312c12847bfba66cef", "USDX", 18], USR: ["0x66a1E37c9b0eAddca17d3662D6c05F4DECf3e110", "USR", 18], USDY: ["0x96F6eF951840721AdBF46Ac996b59E0235CB985C", "USDY", 18], RLUSD: ["0x8292Bb45bf1Ee4d140127049757C2E0fF06317eD", "RLUSD", 18], USDa: ["0x8A60E489004Ca22d775C5F2c657598278d17D9c2", "USDa", 18], sUSDa: ["0x2b66aade1e9c062ff411bd47c44e0ad696d43bd9", "sUSDa", 18], deUSD: ["0x15700b564ca08d9439c58ca5053166e8317aa138", "deUSD", 18], sdeUSD: ["0x5c5b196abe0d54485975d1ec29617d42d9198326", "sdeUSD", 18], EURC: ["0x1aBaEA1f7C830bD89Acc67eC4af516284b1bC33c", "EURC", 6], GHO: ["0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f", "GHO", 18], WETH: ["0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "WETH", 18], WGAS: ["0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "WGAS", 18], WBTC: ["0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", "WBTC", 8], cbBTC: ["0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf", "cbBTC", 8], wSOL: ["0xD31a59c85aE9D8edEFeC411D448f90841571b89c", "wSOL", 9], wAVAX: ["0x85f138bfEE4ef8e540890CFb48F620571d67Eda3", "wAVAX", 18], BNB: ["0xB8c77482e45F1F44dE1745F52C74426C631bDD52", "BNB", 18], ARB: ["0xB50721BCf8d664c30412Cfbc6cf7a15145234ad1", "ARB", 18], POL: ["0x455e53CBB86018Ac2B8092FdCd39d8444aFFC3F6", "POL", 10], TON: ["0x582d872a1b094fc48f5de31d3b73f2d9be47def1", "TON", 9], DOT: ["0x21c2c96dbfa137e23946143c71ac8330f9b44001", "POL", 10], MNT: ["0x3c3a81e81dc49a522a592e7622a7e711c06bf354", "MNTL", 18], MOVE: ["0x3073f7aaa4db83f95e9fff17424f71d4751a3073", "MOVE", 18], GNO: ["0x6810e776880c02933d47db1b9fc05908e5386b96", "GNO", 18], stETH: ["0xae7ab96520de3a18e5e111b5eaab095312d7fe84", "stETH", 18], wstETH: ["0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", "wstETH", 18], rETH: ["0xae78736cd615f374d3085123a210448e74fc6393", "rETH", 18], weETH: ["0xcd5fe23c85820f7b72d0926fc9b05b43e359b7ee", "weETH", 18], rsETH: ["0xa1290d69c65a6fe4df752f95823fae25cb99e5a7", "rsETH", 18], ezETH: ["0x2416092f143378750bb29b79ed961ab195cceea5", "ezETH", 18], SolvBTCBBN: ["0xd9d920aa40f578ab794426f5c90f6c731d159def", "SolvBTCBBN", 18], mETH: ["0xd5f7838f5c461feff7fe49ea5ebaf7728bb0adfa", "mETH", 18], cmETH: ["0xe6829d9a7ee3040e1276fa75293bde931859e8fa", "cmETH", 18], osETH: ["0xf1c9acdc66974dfb6decb12aa385b9cd01190e38", "osETH", 18], eETH: ["0x35fa164735182de50811e8e2e824cfb9b6118ac2", "eETH", 18], eBTC: ["0x657e8c867d8b37dcc18fa4caead9c45eb088c642", "eBTC", 8], ETHx: ["0xA35b1B31Ce002FBF2058D22F30f95D405200A15b", "ETHx", 18], cbETH: ["0xBe9895146f7AF43049ca1c1AE358B0541Ea49704", "cbETH", 18], wBETH: ["0xa2e3356610840701bdf5611a53974510ae27e2e1", "wBETH", 18], stBTC: ["0xf6718b2701D4a6498eF77D7c152b2137Ab28b8A3", "stBTC", 18], OETH: ["0x856c4Efb76C1D1AE02e20CEB03A2A6a08b0b8dC3", "OETH", 18], rswETH: ["0xFAe103DC9cf190eD75350761e95403b7b8aFa6c0", "rswETH", 18], UNI: ["0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", "UNI", 18], SUSHI: ["0x6B3595068778DD592e39A122f4f5a5cF09C90fE2", "SUSHI", 18], CRV: ["0xD533a949740bb3306d119CC777fa900bA034cd52", "CRV", 18], CAKE: ["0x152649eA73beAb28c5b49B26eb48f7EAD6d4c898", "CAKE", 18], BAL: ["0xba100000625a3754423978a60c9317c58a424e3d", "BAL", 18], PENDLE: ["0x808507121b80c02388fad14726482e061b8da827", "PENDLE", 18] } }, 10: { accounts: { impersonate: "0x2e44e174f7D53F0212823acC11C01A11d58c5bCB" }, tokens: { USDC: ["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", "USDC", 6], USDCe: ["0x7F5c764cBc14f9669B88837ca1490cCa17c31607", "USDC.e", 6], axlUSDC: ["0xEB466342C4d449BC9f53A865D5Cb90586f405215", "axlUSDC", 6], USDT: ["0x94b008aA00579c1307B0EF2c499aD98a8ce58e58", "USDT", 6], frxUSD: ["0x80eede496655fb9047dd39d9f418d5483ed600df", "frxUSD", 18], FRAX: ["0x2E3D870790dC77A83DD1d18184Acc7439A53f475", "FRAX", 18], LUSD: ["0xc40F949F8a4e094D1b49a23ea9241D289B7b2819", "LUSD", 18], DAI: ["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", "DAI", 18], BUSD: ["0x9C9e5fD8bbc25984B178FdCE6117Defa39d2db39", "BUSD", 18], DOLA: ["0x8aE125E8653821E851F12A49F7765db9a9ce7384", "DOLA", 18], crvUSD: ["0xC52D7F23a2e460248Db6eE192Cb23dD12bDDCbf6", "crvUSD", 18], USDe: ["0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34", "USDe", 18], sUSDe: ["0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2", "sUSDe", 18], USDD: ["0x7113370218f31764C1B6353BDF6004d86fF6B9cc", "USDD", 18], TUSD: ["0xcB59a0A753fDB7491d5F3D794316F1adE197B21E", "TUSD", 18], sUSD: ["0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9", "sUSD", 18], USDplus: ["0x73cb180bf0521828d8849bc8cf2b920918e23032", "USD+", 6], BUIDL: ["0xa1cdab15bba75a80df4089cafba013e376957cf5", "BUIDL", 18], WETH: ["0x4200000000000000000000000000000000000006", "WETH", 18], WGAS: ["0x4200000000000000000000000000000000000006", "WGAS", 18], WBTC: ["0x68f180fcCe6836688e9084f035309E29Bf0A2095", "WBTC", 8], tBTC: ["0x6c84a8f1c29108f47a79964b5fe888d4f4d0de40", "tBTC", 8], wSOL: ["0xba1Cf949c382A32a09A17B2AdF3587fc7fA664f1", "wSOL", 9], OP: ["0x4200000000000000000000000000000000000042", "OP", 18], WLD: ["0xdc6ff44d5d932cbd77b52e5612ba0529dc6226f1", "WLD", 18], stETH: ["0x1F32b1c2345538c0c6f582fCB022739c4A194Ebb", "stETH", 18], wstETH: ["0x1f32b1c2345538c0c6f582fcb022739c4a194ebb", "wstETH", 18], rETH: ["0x9bcef72be871e61ed4fbbc7630889bee758eb81d", "rETH", 18], frxETH: ["0x6806411765af15bddd26f8f544a34cc40cb9838b", "frxETH", 18], sfrxETH: ["0x484c2d6e3cdd945a8b2df735e079178c1036578c", "sfrxETH", 18], sETH: ["0xe405de8f52ba7559f9df3c368500b6e6ae6cee49", "sETH", 18], sBTC: ["0x298b9b95708152ff6968aafd889c6586e9169f1d", "sBTC", 18], cbETH: ["0xaddb6a0412de1ba0f936dcaeb8aaa24578dcf3b2", "cbETH", 18], UNI: ["0x6fd9d7AD17242c41f7131d257212c54A0e816691", "UNI", 18], SUSHI: ["0x3eaEb77b03dBc0F6321AE1b72b2E9aDb0F60112B", "SUSHI", 18], CRV: ["0x0994206dfE8De6Ec6920FF4D779B0d950605Fb53", "CRV", 18], VELO: ["0x3c8B650257cFb5f272f799F5e2b4e65093a11a05", "VELO", 18], VELOv2: ["0x9560e827aF36c94D2Ac33a39bCE1Fe78631088Db", "VELOv2", 18], BAL: ["0xfe8b128ba8c78aabc59d4c64cee7ff28e9379921", "BAL", 18], PENDLE: ["0xbc7b1ff1c6989f006a1185318ed4e7b5796e66e1", "PENDLE", 18] } }, 56: { accounts: { impersonate: "0x8894E0a0c962CB723c1976a4421c95949bE2D4E3" }, tokens: { USDC: ["0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d", "USDC", 18], USDT: ["0x55d398326f99059ff775485246999027b3197955", "USDT", 18], frxUSD: ["0x80eede496655fb9047dd39d9f418d5483ed600df", "frxUSD", 18], FRAX: ["0x90c97f71e18723b0cf0dfa30ee176ab653e89f40", "FRAX", 18], BUSD: ["0xe9e7cea3dedca5984780bafc599bd69add087d56", "BUSD", 18], FDUSD: ["0xc5f0f7b66764F6ec8C8Dff7BA683102295E16409", "FDUSD", 18], lisUSD: ["0x0782b6d8c4551B9760e74c0545a9bCD90bdc41E5", "lisUSD", 18], DAI: ["0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3", "DAI", 18], USDe: ["0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34", "USDe", 18], sUSDe: ["0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2", "sUSDe", 18], USD0: ["0x758a3e0b1f842c9306b783f8a4078c6c8c03a270", "USD0", 18], crvUSD: ["0xe2fb3F127f5450DeE44afe054385d74C392BdeF4", "crvUSD", 18], USDX: ["0xf3527ef8dE265eAa3716FB312c12847bFBA66Cef", "USDX", 18], sUSDX: ["0x7788A3538C5fc7F9c7C8A74EAC4c898fC8d87d92", "sUSDX", 18], TUSD: ["0x40af3827F39D0EAcBF4A168f8D4ee67c121D11c9", "TUSD", 18], USDD: ["0x392004BEe213F1FF580C867359C246924f21E6Ad", "USDD", 18], USDplus: ["0xe80772eaf6e2e18b651f160bc9158b2a5cafca65", "USD+", 6], MAI: ["0x3F56e0c36d275367b8C502090EDF38289b3dEa0d", "MAI", 18], WETH: ["0x2170ed0880ac9a755fd29b2688956bd959f933f8", "WETH", 18], XRP: ["0x1d2f0da169ceb9fc7b3144628db156f3f6c60dbe", "XRP", 18], DOGE: ["0xba2ae424d960c26247dd6c32edc70b295c744c43", "DOGE", 18], ADA: ["0x3ee2200efb3400fabb9aacf31297cbdd1d435d47", "ADA", 18], WBNB: ["0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", "WBNB", 18], WGAS: ["0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", "WGAS", 18], WBTC: ["0x0555e30da8f98308edb960aa94c0db47230d2b9c", "WBTC", 8], TON: ["0x76A797A59Ba2C17726896976B7B3747BfD1d220f", "TON", 9], AVAX: ["0x1ce0c2827e2ef14d5c4f29a091d735a204794041", "WBTC", 18], POL: ["0xcc42724c6683b7e57334c4e856f4c9965ed682bd", "POL", 10], DOT: ["0x7083609fce4d1d8dc0c979aab8c869ea2c873402", "DOT", 18], LTC: ["0x4338665cbb7b2485a8855a139b75d5e34ab0db94", "LTC", 18], BCH: ["0x8ff795a6f4d97e7887c79bea79aba5cc76444adf", "BCH", 18], BTCB: ["0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c", "BTCB", 18], LBTC: ["0xecac9c5f704e954931349da37f60e39f515c11c1", "LBTC", 8], ARB: ["0xa050ffb3eeb8200eeb7f61ce34ff644420fd3522", "ARB", 18], OP: ["0x170C84E3b1D282f9628229836086716141995200", "OP", 18], SolvBTC: ["0x4aae823a6a0b376de6a78e74ecc5b079d38cbcf7", "SolvBTC", 18], ezETH: ["0x2416092f143378750bb29b79ed961ab195cceea5", "ezETH", 18], frxETH: ["0x64048a7eecf3a2f1ba9e144aac3d7db6e58f555e", "frxETH", 18], SolvBTCCORE: ["0xb9f59cab0d6aa9d711ace5c3640003bc09c15faf", "SolbBTC.CORE", 18], UNI: ["0xBf5140A22578168FD562DCcF235E5D43A02ce9B1", "UNI", 18], SUSHI: ["0x947950BcC74888a40Ffa2593C5798F11Fc9124C4", "SUSHI", 18], THE: ["0xf4c8e32eadec4bfe97e0f595add0f4450a863a11", "THE", 18], BSW: ["0x965f527d9159dce6288a2219db51fc6eef120dd1", "BSW", 18], CRV: ["0x9996D0276612d23b35f90C51EE935520B3d7355B", "CRV", 18], BAL: ["0xd4ed60d8368a92b5f1ca33af61ef2a94714b2d46", "BAL", 18], JOE: ["0x371c7ec6d8039ff7933a2aa28eb827ffe1f52f07", "JOE", 18], DODO: ["0x67ee3Cb086F8a16f34beE3ca72FAD36F7Db929e2", "DODO", 18], PENDLE: ["0xb3ed0a426155b79b898849803e3b36552f7ed507", "PENDLE", 18] } }, 100: { accounts: {}, tokens: { USDT: ["0x4ecaba5870353805a9f068101a40e0f32ed605c6", "USDT", 6], USDCe: ["0x2a22f9c3b484c3629090feed35f17ff8f88f76f0", "USDC.e", 6], USDC: ["0xddafbb505ad214d7b80b1f830fccc89b60fb7a83", "USDC", 6], GYD: ["0xca5d8f8a8d49439357d3cf46ca2e720702f132b8", "GYD", 18], sDAI: ["0xaf204776c7245bf4147c2612bf6e5972ee483701", "sDAI", 18], EURe: ["0x420CA0f9B9b604cE0fd9C18EF134C705e5Fa3430", "EURe", 18], WXDAI: ["0xe91d153e0b41518a2ce8dd3d7944fa863463a97d", "WXDAI", 18], WGAS: ["0xe91d153e0b41518a2ce8dd3d7944fa863463a97d", "WGAS", 18], WBTC: ["0x8e5bbbb09ed1ebde8674cda39a0c169401db4252", "WBTC", 8], WETH: ["0x4537e328bf7e4efa29d05caea260d7fe26af9d74", "WETH", 18], GNO: ["0x9c58bacc331c9aa871afd802db6379a98e80cedb", "GNO", 18], wstETH: ["0x6c76971f98945ae98dd7d4dfca8711ebea946ea6", "wstETH", 18], rETH: ["0xc791240d1f2def5938e2031364ff4ed887133c3d", "rETH", 18] } }, 146: { accounts: { impersonate: "0xBA12222222228d8Ba445958a75a0704d566BF2C8" }, tokens: { USDCe: ["0x29219dd400f2Bf60E5a23d13Be72B486D4038894", "USDC.e", 6], USDT: ["0x6047828dc181963ba44974801FF68e538dA5eaF9", "USDT", 6], frxUSD: ["0x80eede496655fb9047dd39d9f418d5483ed600df", "frxUSD", 18], scUSD: ["0xd3DCe716f3eF535C5Ff8d041c1A41C3bd89b97aE", "scUSD", 18], wS: ["0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38", "wS", 18], WGAS: ["0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38", "WGAS", 18], WETH: ["0x50c42dEAcD8Fc9773493ED674b675bE577f2634b", "WETH", 18], WBTC: ["0x0555E30da8f98308EdB960aa94C0Db47230d2B9c", "WBTC", 8], wSOL: ["0xba1Cf949c382A32a09A17B2AdF3587fc7fA664f1", "wSOL", 9], frxETH: ["0x43eDD7f3831b08FE70B7555ddD373C8bF65a9050", "frxETH", 18], OS: ["0xb1e25689d55734fd3fffc939c4c3eb52dff8a794", "OS", 18], LBTC: ["0xecac9c5f704e954931349da37f60e39f515c11c1", "LBTC", 8], EQUAL: ["0xddF26B42C1d903De8962d3F79a74a501420d5F19", "EQUAL", 18], SHADOW: ["0x3333b97138D4b086720b5aE8A7844b1345a33333", "SHADOW", 18], SWPx: ["0xa04bc7140c26fc9bb1f36b1a604c7a5a88fb0e70", "SWPx", 18], METRO: ["0x71E99522EaD5E21CF57F1f542Dc4ad2E841F7321", "METRO", 18], BEETS: ["0x2d0e0814e62d80056181f5cd932274405966e4f0", "BEETS", 18], WAGMI: ["0x0e0ce4d450c705f8a0b6dd9d5123e3df2787d16b", "WAGMI", 18], FIVE: ["0xb0695ce12c56aae40894235e2d1888d0b62dd110", "FIVE", 18], UNI: ["0x2fb960611bdc322a9a4a994252658cae9fe2eea1", "UNI", 18], CRV: ["0x5af79133999f7908953e94b7a5cf367740ebee35", "CRV", 18], PENDLE: ["0xf1eF7d2D4C0c881cd634481e0586ed5d2871A74B", "PENDLE", 18] } }, 8453: { accounts: { impersonate: "0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb" }, tokens: { USDC: ["0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", "USDC", 6], USDbC: ["0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca", "USDbC", 6], USDe: ["0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34", "USDe", 18], sUSDe: ["0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2", "sUSDe", 18], USDS: ["0x820c137fa70c8691f0e44dc420a5e53c168921dc", "USDS", 18], sUSDS: ["0x5875eee11cf8398102fdad704c9e96607675467a", "sUSDS", 18], DAI: ["0x50c5725949a6f0c72e6c4a641f24049a917db0cb", "DAI", 18], USD0: ["0x758a3e0b1f842c9306b783f8a4078c6c8c03a270", "USD0", 18], USDX: ["0xf3527ef8de265eaa3716fb312c12847bfba66cef", "USDX", 18], agEUR: ["0xa61beb4a3d02decb01039e378237032b351125b4", "agEUR", 18], USDplus: ["0xb79dd08ea68a908a97220c76d19a6aa9cbde4376", "USD+", 6], MIM: ["0x4A3A6Dd60A34bB2Aba60D73B4C88315E9CeB6A3D", "MIM", 18], DOLA: ["0x4621b7a9c75199271f773ebd9a499dbd165c3191", "DOLA", 18], USDz: ["0x04D5ddf5f3a8939889F11E97f8c4BB48317F1938", "USDz", 18], EURC: ["0x60a3e35cc302bfa44cb288bc5a4f316fdb1adb42", "EURC", 6], WETH: ["0x4200000000000000000000000000000000000006", "WETH", 18], WGAS: ["0x4200000000000000000000000000000000000006", "WGAS", 18], WBTC: ["0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf", "WBTC", 8], cbBTC: ["0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf", "cbBTC", 8], wstETH: ["0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452", "wstETH", 18], weETH: ["0x04c0599ae5a44757c0af6f9ec3b93da8976c150a", "weETH", 18], eBTC: ["0x657e8c867d8b37dcc18fa4caead9c45eb088c642", "eBTC", 8], LBTC: ["0xecac9c5f704e954931349da37f60e39f515c11c1", "LBTC", 8], SolvBTC: ["0x3b86ad95859b6ab773f55f8d94b4b9d443ee931f", "SolvBTC", 18], rETH: ["0xb6fe221fe9eef5aba221c348ba20a1bf5e73624c", "rETH", 18], ezETH: ["0x2416092f143378750bb29b79ed961ab195cceea5", "ezETH", 18], LsETH: ["0xb29749498954a3a821ec37bde86e386df3ce30b6", "LsETH", 18], superOETH: ["0xdbfefd2e8460a6ee4955a68582f85708baea60a3", "superOETH", 18], rsETH: ["0x1Bc71130A0e39942a7658878169764Bbd8A45993", "rsETH", 18], AERO: ["0x940181a94a35a4569e4529a3cdfb74e38fd98631", "AERO", 18], ALB: ["0x1dd2d631c92b1acdfcdd51a0f7145a50130050c4", "ALB", 18], CRV: ["0x8Ee73c484A26e0A5df2Ee2a4960B789967dd0415", "CRV", 18], CAKE: ["0x3055913c90Fcc1A6CE9a358911721eEb942013A1", "CAKE", 18], PENDLE: ["0xa99f6e6785da0f5d6fb42495fe424bce029eeb3e", "PENDLE", 18] } }, 42161: { accounts: { impersonate: "0x489ee077994B6658eAfA855C308275EAd8097C4A" }, tokens: { USDT: ["0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", "USDT", 6], USDCe: ["0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8", "USDC.e", 6], USDC: ["0xaf88d065e77c8cC2239327C5EDb3A432268e5831", "USDC", 6], frxUSD: ["0x80eede496655fb9047dd39d9f418d5483ed600df", "frxUSD", 18], FRAX: ["0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F", "FRAX", 18], USDS: ["0x6491c05a82219b8d1479057361ff1654749b876b", "USDS", 18], sUSDS: ["0xddb46999f8891663a8f2828d25298f70416d7610", "sUSDS", 18], DAI: ["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", "DAI", 18], USDe: ["0x5d3a1ff2b6bab83b63cd9ad0787074081a52ef34", "USDe", 18], sUSDe: ["0x211cc4dd073734da055fbf44a2b4667d5e5fe5d2", "sUSDe", 18], TUSD: ["0x4D15a3A2286D883AF0AA1B3f21367843FAc63E07", "TUSD", 18], MIM: ["0xFEa7a6a0B346362BF88A9e4A88416B77a57D6c2A", "MIM", 18], USDD: ["0x680447595e8b7b3Aa1B43beB9f6098C79ac2Ab3f", "USDD", 18], agEUR: ["0xFA5Ed56A203466CbBC2430a43c66b9D8723528E7", "agEUR", 18], MAI: ["0x3F56e0c36d275367b8C502090EDF38289b3dEa0d", "MAI", 18], USDX: ["0xf3527ef8de265eaa3716fb312c12847bfba66cef", "USDX", 18], sUSDX: ["0x7788A3538C5fc7F9c7C8A74EAC4c898fC8d87d92", "sUSDX", 18], USD0: ["0x35f1C5cB7Fb977E669fD244C567Da99d8a3a6850", "USD0", 18], USD0pp: ["0x2B65F9d2e4B84a2dF6ff0525741b75d1276a9C2F", "USD0++", 18], USDx: ["0xb2f30a7c980f052f02563fb518dcc39e6bf38175", "USDx", 18], EURC: ["0xaddfd192daa492b772ea5c180e79570dec92ff5c", "EURC", 18], BUIDL: ["0xa6525ae43edcd03dc08e775774dcabd3bb925872", "BUIDL", 6], USDY: ["0x35e050d3C0eC2d29D269a8EcEa763a183bDF9A9D", "USDY", 18], GHO: ["0x7dff72693f6a4149b17e7c6314655f6a9f7c8b33", "GHO", 18], USDL: ["0x7f850b0ab1988dd17b69ac564c1e2857949e4dee", "USDL", 18], DOLA: ["0x6a7661795c374c0bfc635934efaddff3a7ee23b6", "DOLA", 18], WETH: ["0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", "WETH", 18], WGAS: ["0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", "WGAS", 18], WBTC: ["0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", "WBTC", 8], ARB: ["0x912CE59144191C1204E64559FE8253a0e49E6548", "ARB", 18], cbBTC: ["0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf", "cbBTC", 8], tBTC: ["0x6c84a8f1c29108F47a79964b5Fe888D4f4D0dE40", "tBTC", 18], GNO: ["0xa0b862f60edef4452f25b4160f177db44deb6cf1", "GNO", 18], wstETH: ["0x5979D7b546E38E414F7E9822514be443A4800529", "wstETH", 18], frxETH: ["0x178412e79c25968a32e89b11f63B33F733770c2A", "frxETH", 18], sfrxETH: ["0x95ab45875cffdba1e5f451b950bc2e42c0053f39", "sfrxETH", 18], SolvBTCENA: ["0xafafd68afe3fe65d376eec9eab1802616cfaccb8", "SolvBTC.ENA", 18], SolvBTC: ["0x3647c54c4c2c65bc7a2d63c0da2809b399dbbdc0", "SolvBTC", 18], ezETH: ["0x2416092f143378750bb29b79ed961ab195cceea5", "ezETH", 18], weETH: ["0x35751007a407ca6feffe80b3cb397736d2cf4dbe", "weETH", 18], eBTC: ["0x657e8c867d8b37dcc18fa4caead9c45eb088c642", "eBTC", 8], stBTC: ["0xf6718b2701d4a6498ef77d7c152b2137ab28b8a3", "stBTC", 8], rETH: ["0xEC70Dcb4A1EFa46b8F2D97C310C9c4790ba5ffA8", "rETH", 18], UNI: ["0xfa7f8980b0f1e64a2062791cc3b0871572f1f7f0", "UNI", 18], SUSHI: ["0xd4d42F0b6DEF4CE0383636770eF773390d85c61A", "SUSHI", 18], CRV: ["0x11cDb42B0EB46D95f990BeDD4695A6e3fA034978", "CRV", 18], GMX: ["0xfc5A1A6EB076a2C7aD06eD22C90d7E710E35ad0a", "GMX", 18], PENDLE: ["0x0c880f6761f1af8d9aa9c466984b80dab9a8c9e8", "PENDLE", 18], BAL: ["0x040d1EdC9569d4Bab2D15287Dc5A4F10F56a56B8", "BAL", 18], JOE: ["0x371c7ec6d8039ff7933a2aa28eb827ffe1f52f07", "JOE", 18], DODO: ["0x69eb4fa4a2fbd498c257c57ea8b7655a2559a581", "DODO", 18], GRAIL: ["0x3d9907F9a368ad0a51Be60f7Da3b97cf940982D8", "GRAIL", 18], VELA: ["0x088cd8f5eF3652623c22D48b1605DCfE860Cd704", "VELA", 18] } } }; Object.values(addresses).forEach((chainData) => { Object.entries(chainData.tokens).forEach(([_symbol, tokenInfo]) => { const [address] = tokenInfo; if (address && !chainData.tokens[address]) { chainData.tokens[address] = tokenInfo; } }); }); // packages/core/src/utils.ts var sanitize = (val) => { if (val === undefined) return "undefined"; if (val instanceof Date) return val.toISOString(); if (["bigint", "function", "symbol"].includes(typeof val)) return val.toString(); if (typeof val === "number" && !Number.isFinite(val)) return val.toString(); return val; }; var flatten = (o, prefix = "", out = {}) => { Object.entries(o).forEach(([k, v]) => { const path = prefix ? `${prefix}.${k}` : k; if (v && typeof v === "object" && !(v instanceof Date)) { if (Array.isArray(v)) { if (v.some((item) => item && typeof item === "object" && !(item instanceof Date))) { v.forEach((item, index) => flatten(item, `${path}[${index}]`, out)); } else { out[path] = v; } } else { flatten(v, path, out); } } else { out[path] = v; } }); return out; }; var toJSON = (o, spaces = 2) => JSON.stringify(o, (_, val) => sanitize(val), spaces); function toCSVData(rows, includeHeaders = true, headers) { if (!rows.length) return includeHeaders ? [[]] : []; const flattenedRows = rows.map((r) => flatten(r)); let displayHeaders; let dataKeys; if (Array.isArray(headers)) { displayHeaders = headers; dataKeys = headers; } else if (headers) { displayHeaders = Object.values(headers); dataKeys = Object.keys(headers); } else { displayHeaders = [...new Set(flattenedRows.flatMap(Object.keys))]; dataKeys = displayHeaders; } const dataRows = flattenedRows.map((r) => dataKeys.map((key) => { let value = r[key]; if (value != null) { if (typeof value === "number") { value = Number.isInteger(value) ? value : value.toFixed(3); } if (Array.isArray(value)) { value = value.join("|"); } } return sanitize(value ?? ""); })); return includeHeaders ? [displayHeaders, ...dataRows] : dataRows; } function toCSV(rows, includeHeaders = true, headers, separator = ",") { const data = toCSVData(rows, includeHeaders, headers); if (!data.length) return ""; const escape = (val) => { const str = String(val ?? ""); return new RegExp(`["${separator} ]`).test(str) ? `"${str.replace(/"/g, '""')}"` : str; }; return data.map((row) => row.map(escape).join(separator)).join(` `); } function toTable(rows, options = {}) { const { includeHeaders = true, headers, columnWidths = 12, padding = 1 } = options; const data = toCSVData(rows, includeHeaders, headers); if (!data.length || !data[0].length) return ""; const widths = Array.isArray(columnWidths) ? data[0].map((_, i) => columnWidths[i] ?? 12) : Array(data[0].length).fill(columnWidths); const formatCell = (v, w) => { const s = String(v ?? ""); const pad = " ".repeat(padding); const contentWidth = w - padding * 2; return s.length > contentWidth ? `${pad}${s.slice(0, contentWidth - 1)}\u2026${pad}` : `${pad}${s.padEnd(contentWidth)}${pad}`; }; const makeDiv = (start, mid, end) => start + widths.map((w) => "\u2500".repeat(w)).join(mid) + end; const divider = makeDiv("\u250C", "\u252C", "\u2510"); const bottomDiv = makeDiv("\u2514", "\u2534", "\u2518"); const midDiv = includeHeaders && data.length > 1 ? makeDiv("\u251C", "\u253C", "\u2524") : ""; const tableRows = data.map((r) => `\u2502${r.map((c, i) => formatCell(c, widths[i])).join("\u2502")}\u2502`); return [ divider, includeHeaders ? tableRows[0] : null, midDiv || null, ...includeHeaders ? tableRows.slice(1) : tableRows, bottomDiv ].filter(Boolean).join(` `); } function serialize(o, options = {}) { const { mode = "JSON" /* JSON */, spaces = 2, includeHeaders = true, headers, separator = ",", columnWidths = 12, padding = 1 } = options; const wrappedObject = Array.isArray(o) ? o : [typeof o === "object" && o !== null ? o : { value: o }]; switch (mode) { case "JSON" /* JSON */: return toJSON(typeof o === "object" && o !== null ? o : { value: o }, spaces); case "CSV" /* CSV */: return toCSV(wrappedObject, includeHeaders, headers, separator); case "TABLE" /* TABLE */: return toTable(wrappedObject, { includeHeaders, headers, columnWidths, padding }); default: throw new Error(`Unsupported serialization mode: ${mode}`); } } var isAddress = (s) => !!s && /^0x[a-fA-F0-9]{40}$/.test(s); var getToken = (t, chainId = 1) => { if (typeof t === "string") { if (t.includes(":")) { const parts = t.split(":"); if (parts.length < 2) { throw new Error(`Invalid token format: ${t}. Expected chainId:address(:symbol(:decimals))`); } chainId = Number(parts[0]); const address = parts[1].startsWith("0x") ? parts[1] : addresses[chainId].tokens[parts[1]]?.[0]; const symbol = parts[2] || addresses[chainId].tokens?.[address]?.[1]; const decimals = Number(parts[3] || 18); t = [address, symbol, decimals]; } else { t = addresses[chainId].tokens[t]; } } if (!t) throw new Error(`Token not found: ${t}`); return { chainId, address: t[0], name: t[1], symbol: t[1], decimals: t[2] || 18 }; }; var shortenAddress = (address, start = 4, end = 4, sep = ".") => { const safeStart = Math.max(0, start); const safeEnd = Math.max(0, end); return 2 + safeStart + safeEnd >= address.length ? address : address.slice(0, 2 + safeStart) + sep + address.slice(-safeEnd); }; var toBigInt = (value) => { try { if (typeof value === "bigint") return value; if (typeof value === "number") return BigInt(Math.floor(value)); if (typeof value === "string") return BigInt(value.trim()); if (typeof value === "boolean") return BigInt(value ? 1 : 0); if (value?.toString) { const str = value.toLocaleString("en-US", { useGrouping: false, maximumFractionDigits: 20 }); if (str && !isNaN(Number(str))) return BigInt(str); } } catch (e) { console.error(`Error converting value to BigInt: ${value}`, e); } return 0n; }; var weiToString = (wei) => { if (typeof wei === "string") return wei; if (typeof wei === "number") return BigInt(Math.round(wei)).toString(); return wei.toString(); }; var envOrNull = (key) => process.env[key] ?? null; var envInt = (key, defaultValue) => { const value = envOrNull(key); const parsed = value === null ? NaN : parseInt(value, 10); return isNaN(parsed) ? defaultValue : parsed; }; var envApiRoot = (key, fallbackRoot) => { const value = process.env[key]; const urlToUse = value?.trim() || fallbackRoot; const url = /^https?:\/\//.test(urlToUse) ? urlToUse : `https://${urlToUse}`; return url.replace(/\/$/, ""); }; var mapKToKV = (o, fn = (k) => k) => Object.fromEntries(Object.keys(o).map((k) => [k, fn(k)])); var emptyCostEstimate = () => ({ gasCostUsd: 0, gasCostWei: 0n, feeCostUsd: 0, feeCostWei: 0n }); var emptySwapEstimate = () => ({ input: 0, inputWei: 0n, output: 0, outputWei: 0n, slippage: 0, exchangeRate: 0 }); var emptyEstimate = () => ({ ...emptySwapEstimate(), ...emptyCostEstimate() }); var formatError = (msg, status, data) => { const statusText = status ? `(HTTP ${status})` : ""; const dataText = data ? (() => { try { const d = typeof data === "string" ? data.slice(0, 100) : JSON.stringify(data)?.slice(0, 100); return `: ${d}${d.length > 100 ? "..." : ""}`; } catch { return `: [${typeof data} data]`; } })() : ""; return new Error([msg, statusText, dataText].filter(Boolean).join(" ")); }; async function fetchJson(url, options, method, verbose = false) { if (Number(process.env.VERBOSE) >= 2) verbose = true; const effectiveMethod = method ?? options?.method ?? "GET"; try { if (verbose) console.log(`>>>req [${effectiveMethod}] ${url}`); const response = await fetch(url, { ...options, method: effectiveMethod }); if (!response.ok) { const errorData = await response.json().catch(() => response.text().catch(() => "Could not read error response body")); throw formatError(`API error ${response.status} calling ${effectiveMethod} ${url}`, response.status, errorData); } return await response.json(); } catch (error) { throw error instanceof Error ? error : new Error(`Error calling ${effectiveMethod} ${url}: ${error instanceof Error ? error.message : "Network error"}`); } } function buildQueryParams(params) { const searchParams = new URLSearchParams; Object.entries(params).forEach(([key, value]) => { if (value != null) searchParams.append(key, String(value)); }); return searchParams.toString(); } var compactTr = (tr) => ({ nonce: tr.nonce, to: tr.to, approveTo: tr.approveTo, value: tr.value, data: tr.data }); var compactTrs = (trs) => trs.map(compactTr); function paramsToString(o, callData) { const aggId = o.aggIds.length > 2 ? `Meta:${o.aggIds.length}` : o.aggIds.join(","); const inputAmount = Number(o.inputAmountWei) / 10 ** o.input.decimals; return `[${aggId}] ${inputAmount} ${o.input.symbol} (${o.input.chainId}:${shortenAddress(o.input.address)}) \u2192 ${o.output.symbol} (${o.output.chainId}:${shortenAddress(o.output.address)})${callData ? ` [data: ${callData.substring(0, 10)}...${callData.length}b]` : ""}`; } function addEstimatesToTr(o) { const { params, steps, to } = o; if (!params || !steps || !to) throw new Error("Missing required transaction request fields"); const { input: { decimals: inputDecimals }, output: { decimals: outputDecimals }, inputAmountWei } = params; const lastStep = steps[steps.length - 1]; const inputAmountWeiBig = BigInt(inputAmountWei.toString()); const outputAmountWeiBig = BigInt(lastStep?.estimates?.outputWei?.toString() ?? "0"); const calculateDecimalValue = (amountWei, decimals) => amountWei > 0n && decimals > 0 ? Number(amountWei / 10n ** BigInt(Math.max(decimals - 6, 0))) / 10 ** (decimals - Math.max(decimals - 6, 0)) : 0; const globalEstimates = { ...emptyEstimate(), gasCostUsd: steps.reduce((sum, s) => sum + (Number(s.estimates?.gasCostUsd) || 0), 0), gasCostWei: steps.reduce((sum, s) => sum + toBigInt(s.estimates?.gasCostWei || 0), 0n), feeCostUsd: steps.reduce((sum, s) => sum + (Number(s.estimates?.feeCostUsd) || 0), 0), feeCostWei: steps.reduce((sum, s) => sum + toBigInt(s.estimates?.feeCostWei || 0), 0n), slippage: steps.reduce((max, s) => Math.max(max, Number(s.estimates?.slippage) || 0), 0), input: calculateDecimalValue(inputAmountWeiBig, inputDecimals), inputWei: inputAmountWeiBig, output: calculateDecimalValue(outputAmountWeiBig, outputDecimals), outputWei: outputAmountWeiBig, exchangeRate: 0 }; globalEstimates.exchangeRate = globalEstimates.input > 0 ? globalEstimates.output / globalEstimates.input : 0; return { ...o, approveTo: to, globalEstimates }; } var validateParams = (o) => { if (typeof o?.input?.address !== "string") return false; const validAddresses = [o.input?.address, o.output?.address, o.payer].every(isAddress); const validChainIds = !isNaN(Number(o.input.chainId)) && Number(o.input.chainId) > 0 && (o.output.chainId === undefined || Number(o.output.chainId) > 0); try { return validAddresses && validChainIds && toBigInt(o.inputAmountWei) > 0n; } catch { return false; } }; var getExchangeRate = (tr) => Number(tr.globalEstimates?.exchangeRate ?? tr.steps?.slice(-1)[0]?.estimates?.exchangeRate ?? 0); var sortTrsByRate = (trs) => !trs?.length ? trs : [...trs].sort((a, b) => getExchangeRate(b) - getExchangeRate(a)); async function withLatency(fn) { const start = performance.now(); return [await fn(), Math.round(performance.now() - start)]; } function getPerformance(tr) { const estimates = tr.globalEstimates || { exchangeRate: 0, output: 0, gasCostUsd: 0, feeCostUsd: 0 }; const protocols = tr.steps.filter((step) => step.protocol?.name).map((step) => step.protocol.name); return { aggId: tr.aggId || "???", exchangeRate: Number(estimates.exchangeRate) || NaN, output: Number(estimates.output) || NaN, gasCostUsd: Number(estimates.gasCostUsd) || NaN, feeCostUsd: Number(estimates.feeCostUsd) || NaN, latencyMs: tr.latencyMs || NaN, steps: tr.steps?.length || NaN, protocols }; } function getPerformanceTable(trs) { if (!trs?.length) return "No transaction requests found."; const table = trs.map(getPerformance); const p = { ...trs[0].params, aggIds: [`Meta:${trs.length}`] }; return paramsToString(p) + ` ` + serialize(table, { mode: "TABLE" /* TABLE */, headers: { aggId: "Agg ID", exchangeRate: "Rate", output: "Output", gasCostUsd: "Gas USD", feeCostUsd: "Fee USD", latencyMs: "Latency", steps: "Steps", protocols: "Protocols" }, columnWidths: [8, 10, 12, 9, 9, 9, 7, 20], padding: 1 }); } // packages/core/src/config.ts var createConfig = (aggId, fallbackApiRoot, apiKeyDefault = null, integratorDefault = null, referrerDefault = null, feeBpsDefault = 0) => { const apiRoot = envApiRoot(`${aggId}_API_BASE_URL`, fallbackApiRoot); const apiKey = envOrNull(`${aggId}_API_KEY`) || apiKeyDefault; const integrator = envOrNull(`${aggId}_INTEGRATOR`) || integratorDefault || "astrolab"; const referrer = envOrNull(`${aggId}_REFERRER`) || referrerDefault; const feeBps = envInt(`${aggId}_FEE_BPS`, feeBpsDefault); return { apiRoot, apiKey, integrator, referrer, feeBps }; }; var c = {}; var configs = [ ["LIFI" /* LIFI */, "li.quest/v1"], ["SOCKET" /* SOCKET */, "api.socket.tech/v2"], ["SQUID" /* SQUID */, "v2.api.squidrouter.com/v2"], ["RANGO" /* RANGO */, "api.rango.exchange/basic"], ["UNIZEN" /* UNIZEN */, "api.unizen.io"], ["ROCKETX" /* ROCKETX */, "api.rocketx.exchange/v1"], ["ONE_INCH" /* ONE_INCH */, "api.1inch.dev/swap/v6.0"], ["ZERO_X" /* ZERO_X */, "api.0x.org"], ["PARASWAP" /* PARASWAP */, "api.paraswap.io"], ["ODOS" /* ODOS */, "api.odos.xyz"], ["KYBERSWAP" /* KYBERSWAP */, "aggregator-api.kyberswap.com"], ["OPENOCEAN" /* OPENOCEAN */, "ethapi.openocean.finance/v2"], ["FIREBIRD" /* FIREBIRD */, "router.firebird.finance/aggregator/v2"], ["BEBOP" /* BEBOP */, "api.bebop.xyz"], ["DEBRIDGE" /* DEBRIDGE */, "api.debridge.io"], ["COWSWAP" /* COWSWAP */, "api.cow.fi"], ["HASHFLOW" /* HASHFLOW */, "api.hashflow.com"], ["AIRSWAP" /* AIRSWAP */, "api.airswap.io"], ["ONE_INCH_FUSION" /* ONE_INCH_FUSION */, "api.1inch.dev/swap/v6.0"], ["PARASWAP_DELTA" /* PARASWAP_DELTA */, "api.paraswap.io"], ["UNIZEN_GASLESS" /* UNIZEN_GASLESS */, "api.zcx.com/trade/v1"] ]; configs.forEach(([id, apiRoot, feeBps]) => { c[id] = createConfig(id, apiRoot, null, null, null, feeBps); }); var config_default = c; // packages/core/src/abstract.ts class BaseAggregator { id; apiKey; baseApiUrl; integrator; referrer; feeBps = 0; routerByChainId = {}; aliasByChainId = {}; approvalAddressByChainId = {}; signatureReceiverByChainId = {}; constructor(aggId) { this.id = aggId; const aggregatorConfig = config_default[this.id]; if (!aggregatorConfig) { throw new Error(`No configuration found for aggregator ID: ${this.id}`); } if (!aggregatorConfig.apiRoot) { throw new Error(`[${this.id}] Missing base API URL`); } this.baseApiUrl = aggregatorConfig.apiRoot; this.apiKey = aggregatorConfig.apiKey ?? ""; this.integrator = aggregatorConfig.integrator ?? "astrolab"; this.referrer = String(aggregatorConfig.referrer ?? ""); this.feeBps = aggregatorConfig.feeBps ?? 0; } overloadParams = (p) => { if (p.overloaded) return p; if (!validateParams(p)) { throw new Error(`[${this.id}] Invalid quote parameters: ${JSON.stringify(p)}`); } p.output.chainId ||= p.input.chainId; p.receiver ||= p.payer; p.aggIds = p.aggIds ? p.aggIds.includes(this.id) ? p.aggIds : [...p.aggIds, this.id] : [this.id]; p.maxSlippage ||= MAX_SLIPPAGE_BPS; p.overloaded = true; return p; }; getApiRoot(chainId) { this.ensureChainSupported(chainId); return this.baseApiUrl; } async getTimedTr(params) { const [tr, latencyMs] = await withLatency(() => this.getTransactionRequest(params)); if (tr) { tr.latencyMs = latencyMs; } return tr; } async getStatus(_params) { console.warn(`[${this.id}] getStatus is not implemented.`); return; } isChainSupported(chainId) { return chainId in this.routerByChainId || chainId in this.aliasByChainId; } ensureChainSupported(chainId) { if (!this.isChainSupported(chainId)) { throw new Error(`[${this.id}] Chain ${chainId} not supported`); } } handleError(error, context) { console.error(`[${this.id}] ${context} error:`, error instanceof Error ? error.message : String(error)); if (error && typeof error === "object" && "stack" in error) { console.debug(`[${this.id}] Error stack:`, error.stack); } } getRouterAddress(chainId) { return this.routerByChainId[chainId]; } getApprovalAddress(chainId) { if (chainId in this.approvalAddressByChainId) { return this.approvalAddressByChainId[chainId]; } return this.getRouterAddress(chainId); } } // packages/core/src/Firebird/index.ts class Firebird extends BaseAggregator { constructor() { super("FIREBIRD" /* FIREBIRD */); this.routerByChainId = { 1: "0xe0C38b2a8D09aAD53f1C67734B9A95E43d5981c0", 10: "0x0c6134Abc08A1EafC3E2Dc9A5AD023Bb08Da86C3", 56: "0x92e4F29Be975C1B1eB72E77De24Dccf11432a5bd", 137: "0xb31D1B1eA48cE4Bf10ed697d44B747287E785Ad4", 250: "0xe0C38b2a8D09aAD53f1C67734B9A95E43d5981c0", 324: "0xc593dcfD1E4605a6Cd466f5C6807D444414dBc97", 42161: "0x0c6134Abc08A1EafC3E2Dc9A5AD023Bb08Da86C3", 43114: "0xe0C38b2a8D09aAD53f1C67734B9A95E43d5981c0", 8453: "0x20f0b18BDDe8e3dd0e42C173062eBdd05C421151" }; this.aliasByChainId = mapKToKV(this.routerByChainId, (k) => k.toString()); this.approvalAddressByChainId = this.routerByChainId; } convertParams(p) { const isNativeSell = p.input.address === zeroAddress; const isNativeBuy = p.output.address === zeroAddress; return { chainId: Number(p.input.chainId), from: isNativeSell ? nativeTokenAddress : p.input.address, to: isNativeBuy ? nativeTokenAddress : p.output.address, amount: p.inputAmountWei.toString(), receiver: p.receiver ?? p.payer, slippage: (p.maxSlippage ?? 50) / 1e4, source: p.integrator || this.integrator, ref: p.referrer ?? this.referrer }; } apiRequest = async (url, params, method = "GET", body) => { const fetchOptions = { method, headers: { "content-type": "application/json", ...this.apiKey ? { "api-key": this.apiKey } : {} }, body: method === "POST" && body ? JSON.stringify(body) : undefined }; let finalUrl = url; if (method === "GET" && params) { const urlObj = new URL(url); urlObj.search = buildQueryParams(params); finalUrl = urlObj.toString(); } return fetchJson(finalUrl, fetchOptions); }; async getQuote(p) { p = this.overloadParams(p); try { const quoteParams = this.convertParams(p); const apiRoot = this.getApiRoot(Number(p.input.chainId)); const quoteUrl = `${apiRoot}/quote`; const quoteResponse = await this.apiRequest(quoteUrl, quoteParams); if (!quoteResponse?.quoteData?.maxReturn) { throw formatError("Invalid quote response from Firebird", 500, quoteResponse); } return quoteResponse; } catch (error) { this.handleError(error, "[Firebird] getQuote"); return; } } async getTransactionRequest(p) { p = this.overloadParams(p); try { const isNativeSell = p.input.address === zeroAddress; const quote = await this.getQuote(p); if (!quote?.quoteData) throw new Error("Invalid quote response from Firebird (missing quoteData)"); const encodeParams = quote; const apiRoot = this.getApiRoot(Number(p.input.chainId)); const encodeResponse = await this.apiRequest(`${apiRoot}/encode`, undefined, "POST", encodeParams); if (!encodeResponse?.encodedData) { throw formatError("Invalid encode response from Firebird", 500, encodeResponse); } const { encodedData } = encodeResponse; const tx = { approveTo: encodedData.router, from: p.payer, to: encodedData.router, data: encodedData.data, value: isNativeSell ? encodedData.value : "0", chainId: Number(p.input.chainId) }; return this.processTransactionRequest(tx, p, quote, encodedData); } catch (error) { this.handleError(error, "[Firebird] getTransactionRequest"); return; } } getApiRoot(chainId) { if (!this.aliasByChainId[chainId]) throw new Error(`Unsupported chain: ${chainId}`); return `${this.baseApiUrl}/${this.aliasByChainId[chainId]}`; } processTransactionRequest = (tx, params, quote, _encodedData) => { const outputAmountWei = quote.quoteData?.maxReturn?.totalTo ?? "0"; const inputAmount = Number(params.inputAmountWei) / 10 ** params.input.decimals; const outputAmount = Number(outputAmountWei) / 10 ** params.output.decimals; const steps = [ { type: "SWAP" /* SWAP */, description: "Firebird Swap", input: params.input, output: params.output, inputChainId: Number(params.input.chainId), outputChainId: Number(params.output.chainId || params.input.chainId), protocol: { id: "firebird", name: "Firebird", logo: "", type: "AGGREGATOR" /* AGGREGATOR */ }, estimates: { ...emptyEstimate(), input: inputAmount, inputWei: params.inputAmountWei.toString(), output: outputAmount, outputWei: outputAmountWei, exchangeRate: outputAmount / inputAmount } } ]; return addEstimatesToTr({ ...tx, params, steps }); }; } var firebirdAggregator = new Firebird; // packages/core/src/KyberSwap/index.ts class KyberSwap extends BaseAggregator { constructor() { super("KYBERSWAP" /* KYBERSWAP */); this.routerByChainId = { 1: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5", 10: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5", 56: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5", 137: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5", 250: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5", 42161: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5", 43114: "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5" }; this.aliasByChainId = mapKToKV(this.routerByChainId); this.approvalAddressByChainId = this.routerByChainId; } getHeaders = () => ({ "x-client-id": this.integrator || "btr-swap-sdk" }); apiRequest = async (url, params, method = "GET", body) => { const fetchOptions = { method, headers: this.getHeaders(), body: method === "POST" && body ? JSON.stringify(body) : undefined }; let finalUrl = url; if (method === "GET" && params) { const urlObj = new URL(url); urlObj.search = buildQueryParams(params); finalUrl = urlObj.toString(); } return fetchJson(finalUrl, fetchOptions); }; getApiRoot(chainId) { this.ensureChainSupported(chainId); return `${this.baseApiUrl}/v1/${this.aliasByChainId[chainId]}`; } convertParams = (p) => { const isNativeSell = p.input.address === zeroAddress; const isNativeBuy = p.output.address === zeroAddress; return { tokenIn: isNativeSell ? nativeTokenAddress : p.input.address, tokenOut: isNativeBuy ? nativeTokenAddress : p.output.address, amountIn: p.inputAmountWei.toString(), to: p.receiver ?? p.payer, slippageTolerance: (p.maxSlippage ?? 50).toString(), clientData: `{"source":"${this.integrator || "btr-swap-sdk"}"}`, gasInclude: "1", saveGas: "0" }; }; processTransactionRequest = (tx, params, routeSummary) => { const inputAmount = Number(params.inputAmountWei) / 10 ** params.input.decimals; const outputAmount = Number(routeSummary?.amountOut) / 10 ** params.output.decimals; const estimates = { ...emptyEstimate(), gasCostWei: toBigInt(routeSummary?.gasLeft ?? "0"), input: inputAmount, inputWei: params.inputAmountWei.toString(), output: outputAmount, outputWei: routeSummary?.amountOut ?? "0", exchangeRate: outputAmount / inputAmount }; const chainId = Number(params.input.chainId); const steps = [ { type: "SWAP" /* SWAP */, description: "Swap via KyberSwap", input: params.input, output: params.output, inputChainId: chainId, outputChainId: Number(params.output.chainId || params.input.chainId), protocol: { id: "kyberswap", name: "KyberSwap", logo: "", type: "AGGREGATOR" /* AGGREGATOR */ }, estimates } ]; return addEstimatesToTr({ ...tx, params, steps }); }; async getQuote(_p) { console.warn("[KyberSwap] getQuote not implemented, use getTransactionRequest."); return; } async getTransactionRequest(p) { p = this.overloadParams(p); try { const isNativeSell = p.input.address === zeroAddress; const isNativeBuy = p.output.address === zeroAddress; const queryParams = { tokenIn: isNativeSell ? nativeTokenAddress : p.input.address, tokenOut: isNativeBuy ? nativeTokenAddress : p.output.address, amountIn: p.inputAmountWei.toString(), to: p.receiver ?? p.payer, saveGas: "0", gasInclude: "1", slippageTolerance: (p.maxSlippage ?? 50).toString(), clientData: `{"source":"${this.integrator || "btr-swap-sdk"}"}` }; const apiRoot = this.getApiRoot(Number(p.input.chainId)); const url = `${apiRoot}/route/encode`; const swapData = await this.apiRequest(url, queryParams); const encodedSwapData = swapData?.data?.encodedSwapData; const routeSummary = swapData?.data?.routeSummary; const routerAddress = swapData?.data?.routerAddress; if (!encodedSwapData || !routeSummary || !routerAddress) { throw formatError("Invalid response from KyberSwap API", 500, swapData); } const expectedRouter = this.getRouterAddress(Number(p.input.chainId)); if (!expectedRouter) { throw new Error(`[KyberSwap] Router addr