From 576c8637bb5ca9b4e514013ae73541057c97f08f Mon Sep 17 00:00:00 2001 From: Aryan Godara Date: Mon, 17 Nov 2025 15:19:24 +0530 Subject: [PATCH 1/3] feat(contracts): add Balancer V3 BatchRouter support for Plasma chain Add deployment address for BalancerV3BatchRouter on Plasma (chain ID 9745). Plasma only supports Balancer V3, not V2. Changes: - Add BalancerV3BatchRouter deployment for Plasma at 0x85a80afee867aDf27B50BdB7b76DA70f1E853062 (block 782312) - Update all Balancer V2 contract comments to indicate unavailability on Plasma and Linea - Add test assertion for BalancerV3BatchRouter on Plasma Plasma does not have Balancer V2 contracts (Vault, Queries, or any pool factories). Signed-off-by: Aryan Godara --- crates/contracts/src/alloy.rs | 994 ++++++++++++++++++++++++++++++++++ 1 file changed, 994 insertions(+) create mode 100644 crates/contracts/src/alloy.rs diff --git a/crates/contracts/src/alloy.rs b/crates/contracts/src/alloy.rs new file mode 100644 index 0000000000..84df743044 --- /dev/null +++ b/crates/contracts/src/alloy.rs @@ -0,0 +1,994 @@ +pub mod networks { + pub const MAINNET: u64 = 1; + pub const GNOSIS: u64 = 100; + pub const SEPOLIA: u64 = 11155111; + pub const ARBITRUM_ONE: u64 = 42161; + pub const BASE: u64 = 8453; + pub const POLYGON: u64 = 137; + pub const AVALANCHE: u64 = 43114; + pub const BNB: u64 = 56; + pub const OPTIMISM: u64 = 10; + pub const LENS: u64 = 232; + pub const LINEA: u64 = 59144; + pub const PLASMA: u64 = 9745; +} + +crate::bindings!( + ChainalysisOracle, + crate::deployments! { + MAINNET => address!("0x40C57923924B5c5c5455c48D93317139ADDaC8fb"), + ARBITRUM_ONE => address!("0x40C57923924B5c5c5455c48D93317139ADDaC8fb"), + BASE => address!("0x3A91A31cB3dC49b4db9Ce721F50a9D076c8D739B"), + AVALANCHE => address!("0x40C57923924B5c5c5455c48D93317139ADDaC8fb"), + BNB => address!("0x40C57923924B5c5c5455c48D93317139ADDaC8fb"), + OPTIMISM => address!("0x40C57923924B5c5c5455c48D93317139ADDaC8fb"), + POLYGON => address!("0x40C57923924B5c5c5455c48D93317139ADDaC8fb"), + } +); + +crate::bindings!( + IZeroex, + crate::deployments! { + MAINNET => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), + SEPOLIA => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), + ARBITRUM_ONE => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), + BASE => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), + AVALANCHE => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), + BNB => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), + OPTIMISM => address!("0xdef1abe32c034e558cdd535791643c58a13acc10"), + POLYGON => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), + // Not available on Lens + } +); + +crate::bindings!(ERC20Mintable); + +crate::bindings!(GnosisSafe); +crate::bindings!(GnosisSafeCompatibilityFallbackHandler); +crate::bindings!(GnosisSafeProxy); +crate::bindings!(GnosisSafeProxyFactory); + +crate::bindings!(BalancerV2Authorizer); +crate::bindings!(BalancerV2BasePool); +crate::bindings!(BalancerV2BasePoolFactory); +crate::bindings!(BalancerV2WeightedPool); +crate::bindings!(BalancerV2StablePool); +crate::bindings!(BalancerV2ComposableStablePool); +crate::bindings!(BalancerV2LiquidityBootstrappingPool); +crate::bindings!( + BalancerV2WeightedPoolFactory, + // + crate::deployments! { + // + MAINNET => (address!("0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9"), 12272147) + // Not available on Sepolia (only version ≥ 4) + // + // Not available on Lens, Linea and Plasma + } +); +crate::bindings!( + BalancerV2WeightedPoolFactoryV3, + // + crate::deployments! { + // + MAINNET => (address!("0x5Dd94Da3644DDD055fcf6B3E1aa310Bb7801EB8b"), 16520627), + // + GNOSIS => (address!("0xC128a9954e6c874eA3d62ce62B468bA073093F25"), 26226256), + // + AVALANCHE => (address!("0x94f68b54191F62f781Fe8298A8A5Fa3ed772d227"), 26389236), + // + OPTIMISM => (address!("0xA0DAbEBAAd1b243BBb243f933013d560819eB66f"), 72832703), + // + POLYGON => (address!("0x82e4cFaef85b1B6299935340c964C942280327f4"), 39036828), + // + BNB => (address!("0x6e4cF292C5349c79cCd66349c3Ed56357dD11B46"), 25474982), + // Not available on Sepolia (only version ≥ 4) + // + // Not available on Lens, Linea and Plasma + } +); +crate::bindings!( + BalancerV2WeightedPoolFactoryV4, + crate::deployments! { + // + MAINNET => (address!("0x897888115Ada5773E02aA29F775430BFB5F34c51"), 16878323), + // + GNOSIS => (address!("0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7"), 27055829), + // + // + SEPOLIA => (address!("0x7920BFa1b2041911b354747CA7A6cDD2dfC50Cfd"), 3424893), + // + ARBITRUM_ONE => (address!("0xc7E5ED1054A24Ef31D827E6F86caA58B3Bc168d7"), 72222060), + // + BASE => (address!("0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4"), 1204869), + // + AVALANCHE => (address!("0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a"), 27739006), + // + OPTIMISM => (address!("0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a"), 82737545), + // + POLYGON => (address!("0xFc8a407Bba312ac761D8BFe04CE1201904842B76"), 40611103), + // + BNB => (address!("0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a"), 26665331), + // Not available on Base, Lens, Linea and Plasma + // + } +); +crate::bindings!( + BalancerV2WeightedPool2TokensFactory, + // + crate::deployments! { + // + MAINNET => (address!("0xa5bf2ddf098bb0ef6d120c98217dd6b141c74ee0"), 12349891), + ARBITRUM_ONE => (address!("0xCF0a32Bbef8F064969F21f7e02328FB577382018"), 222864), + // + OPTIMISM => (address!("0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca"), 7005512), + // + POLYGON => (address!("0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9"), 15832998), + // Not available on Sepolia, Base, Avalanche, BNB, Lens, Linea and Plasma + // + // + } +); +crate::bindings!( + BalancerV2StablePoolFactoryV2, + // + crate::deployments! { + // + MAINNET => (address!("0x8df6efec5547e31b0eb7d1291b511ff8a2bf987c"), 14934936), + // + GNOSIS => (address!("0xf23b4DB826DbA14c0e857029dfF076b1c0264843"), 25415344), + ARBITRUM_ONE => (address!("0xEF44D6786b2b4d544b7850Fe67CE6381626Bf2D6"), 14244664), + // + OPTIMISM => (address!("0xeb151668006CD04DAdD098AFd0a82e78F77076c3"), 11088891), + // + POLYGON => (address!("0xcA96C4f198d343E251b1a01F3EBA061ef3DA73C1"), 29371951), + // Not available on Sepolia, Base, Avalanche, BNB, Lens, Linea and Plasma + // + // + } +); +crate::bindings!( + BalancerV2LiquidityBootstrappingPoolFactory, + // + crate::deployments! { + // + MAINNET => (address!("0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE"), 12871780), + ARBITRUM_ONE => (address!("0x142B9666a0a3A30477b052962ddA81547E7029ab"), 222870), + // + POLYGON => (address!("0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE"), 17116402), + // Not available on Sepolia, Base, Avalanche, BNB, Optimism, Lens, Linea and Plasma + // + // + } +); +crate::bindings!( + BalancerV2NoProtocolFeeLiquidityBootstrappingPoolFactory, + // + crate::deployments! { + // + MAINNET => (address!("0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e"), 13730248), + // + // + GNOSIS => (address!("0x85a80afee867aDf27B50BdB7b76DA70f1E853062"), 25415236), + // + // + SEPOLIA => (address!("0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B"), 25415236), + ARBITRUM_ONE => (address!("0x1802953277FD955f9a254B80Aa0582f193cF1d77"), 4859669), + // + BASE => (address!("0x0c6052254551EAe3ECac77B01DFcf1025418828f"), 1206531), + // + AVALANCHE => (address!("0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e"), 26386552), + // + BNB => (address!("0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD"), 22691243), + // + OPTIMISM => (address!("0xf302f9F50958c5593770FDf4d4812309fF77414f"), 7005915), + // + POLYGON => (address!("0x41B953164995c11C81DA73D212ED8Af25741b7Ac"), 22067480), + // Not available on Lens, Linea and Plasma + } +); +crate::bindings!( + BalancerV2ComposableStablePoolFactory, + crate::deployments! { + // + MAINNET => (address!("0xf9ac7B9dF2b3454E841110CcE5550bD5AC6f875F"), 15485885), + ARBITRUM_ONE => (address!("0xaEb406b0E430BF5Ea2Dc0B9Fe62E4E53f74B3a33"), 23227044), + // + BNB => (address!("0xf302f9F50958c5593770FDf4d4812309fF77414f"), 22691193), + // + OPTIMISM => (address!("0xf145caFB67081895EE80eB7c04A30Cf87f07b745"), 22182522), + // + POLYGON => (address!("0x136FD06Fa01eCF624C7F2B3CB15742c1339dC2c4"), 32774224), + // Not available on Sepolia, Gnosis Chain, Base, Avalanche, Lens, Linea and Plasma + // + // + } +); +crate::bindings!( + BalancerV2ComposableStablePoolFactoryV3, + crate::deployments! { + // + MAINNET => (address!("0xdba127fBc23fb20F5929C546af220A991b5C6e01"), 16580899), + // + GNOSIS => (address!("0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD"), 26365805), + ARBITRUM_ONE => (address!("0x1c99324EDC771c82A0DCCB780CC7DDA0045E50e7"), 58948370), + // + BNB => (address!("0xacAaC3e6D6Df918Bf3c809DFC7d42de0e4a72d4C"), 25475700), + // + OPTIMISM => (address!("0xe2E901AB09f37884BA31622dF3Ca7FC19AA443Be"), 72832821), + // + POLYGON => (address!("0x7bc6C0E73EDAa66eF3F6E2f27b0EE8661834c6C9"), 39037615), + // Not available on Sepolia (only version ≥ 4) and on Base (only version ≥ 5) + // + // + // Not available on Lens, Linea and Plasma + } +); +crate::bindings!( + BalancerV2ComposableStablePoolFactoryV4, + crate::deployments! { + // + MAINNET => (address!("0xfADa0f4547AB2de89D1304A668C39B3E09Aa7c76"), 16878679), + // + GNOSIS => (address!("0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD"), 27056416), + // + // + SEPOLIA => (address!("0xA3fd20E29358c056B727657E83DFd139abBC9924"), 3425277), + ARBITRUM_ONE => (address!("0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95"), 72235860), + // + AVALANCHE => (address!("0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98"), 29221425), + // + BNB => (address!("0x1802953277FD955f9a254B80Aa0582f193cF1d77"), 26666380), + // + OPTIMISM => (address!("0x1802953277FD955f9a254B80Aa0582f193cF1d77"), 82748180), + // + POLYGON => (address!("0x6Ab5549bBd766A43aFb687776ad8466F8b42f777"), 40613553), + // Not available on Base, Lens, Linea and Plasma + // + } +); +crate::bindings!( + BalancerV2ComposableStablePoolFactoryV5, + crate::deployments! { + // + MAINNET => (address!("0xDB8d758BCb971e482B2C45f7F8a7740283A1bd3A"), 17672478), + // + GNOSIS => (address!("0x4bdCc2fb18AEb9e2d281b0278D946445070EAda7"), 28900564), + // + // + SEPOLIA => (address!("0xa523f47A933D5020b23629dDf689695AA94612Dc"), 3872211), + ARBITRUM_ONE => (address!("0xA8920455934Da4D853faac1f94Fe7bEf72943eF1"), 110212282), + // + BASE => (address!("0x8df317a729fcaA260306d7de28888932cb579b88"), 1204710), + // + AVALANCHE => (address!("0xE42FFA682A26EF8F25891db4882932711D42e467"), 32478827), + // + BNB => (address!("0x4fb47126Fa83A8734991E41B942Ac29A3266C968"), 29877945), + // + OPTIMISM => (address!("0x043A2daD730d585C44FB79D2614F295D2d625412"), 106752707), + // + POLYGON => (address!("0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b"), 44961548), + // Not available on Lens, Linea and Plasma + } +); +crate::bindings!( + BalancerV2ComposableStablePoolFactoryV6, + crate::deployments! { + // + MAINNET => (address!("0x5B42eC6D40f7B7965BE5308c70e2603c0281C1E9"), 19314764), + // + GNOSIS => (address!("0x47B489bf5836f83ABD928C316F8e39bC0587B020"), 32650879), + // + SEPOLIA => (address!("0x05503B3aDE04aCA81c8D6F88eCB73Ba156982D2B"), 5369821), + // + ARBITRUM_ONE => (address!("0x4bdCc2fb18AEb9e2d281b0278D946445070EAda7"), 184805448), + // + BASE => (address!("0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288"), 11099703), + // + AVALANCHE => (address!("0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88"), 42186350), + // + BNB => (address!("0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e"), 36485719), + // + OPTIMISM => (address!("0x4bdCc2fb18AEb9e2d281b0278D946445070EAda7"), 116694338), + // + POLYGON => (address!("0xEAedc32a51c510d35ebC11088fD5fF2b47aACF2E"), 53996258), + // Not available on Lens, Linea and Plasma + } +); +crate::bindings!( + // Balancer addresses can be obtained from: + // + BalancerV2Vault, + crate::deployments! { + // + MAINNET => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 12272146), + // + GNOSIS => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 24821598), + // + SEPOLIA => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 3418831), + // + ARBITRUM_ONE => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 222832), + // + BASE => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 1196036), + // + AVALANCHE => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 26386141), + // + BNB => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 22691002), + // + OPTIMISM => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 7003431), + // + POLYGON => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 15832990), + // Not available on Lens, Linea and Plasma + } +); +crate::bindings!( + BalancerV3BatchRouter, + crate::deployments! { + // + MAINNET => (address!("0x136f1EFcC3f8f88516B9E94110D56FDBfB1778d1"), 21339510), + // + GNOSIS => (address!("0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b"), 37377506), + // + SEPOLIA => (address!("0xC85b652685567C1B074e8c0D4389f83a2E458b1C"), 7219301), + // + ARBITRUM_ONE => (address!("0xaD89051bEd8d96f045E8912aE1672c6C0bF8a85E"), 297828544), + // + BASE => (address!("0x85a80afee867aDf27B50BdB7b76DA70f1E853062"), 25347205), + // + AVALANCHE => (address!("0xc9b36096f5201ea332Db35d6D195774ea0D5988f"), 59965747), + // + OPTIMISM => (address!("0xaD89051bEd8d96f045E8912aE1672c6C0bF8a85E"), 133969588), + // + PLASMA => (address!("0x85a80afee867aDf27B50BdB7b76DA70f1E853062"), 782312), + // Not available on Lens, Polygon, BNB and Linea + } +); + +// UniV2 +crate::bindings!( + BaoswapRouter, + crate::deployments! { + // https://gnosisscan.io/tx/0xdcbfa037f2c6c7456022df0632ec8d6a75d0f9a195238eec679d5d26895eb7b1 + GNOSIS => (address!("0x6093AeBAC87d62b1A5a4cEec91204e35020E38bE")) + } +); +crate::bindings!( + HoneyswapRouter, + crate::deployments! { + GNOSIS => (address!("0x1C232F01118CB8B424793ae03F870aa7D0ac7f77")) + } +); +crate::bindings!( + PancakeRouter, + crate::deployments! { + // + MAINNET => (address!("0xEfF92A263d31888d860bD50809A8D171709b7b1c")), + // + ARBITRUM_ONE => (address!("0x8cFe327CEc66d1C090Dd72bd0FF11d690C33a2Eb")), + // + BASE => (address!("0x8cFe327CEc66d1C090Dd72bd0FF11d690C33a2Eb")), + // + BNB => (address!("0x10ED43C718714eb63d5aA57B78B54704E256024E")) + } +); +crate::bindings!( + SushiSwapRouter, + // + crate::deployments! { + // + MAINNET => (address!("0xd9e1ce17f2641f24ae83637ab66a2cca9c378b9f")), + // + GNOSIS => (address!("0x1b02da8cb0d097eb8d57a175b88c7d8b47997506")), + // + ARBITRUM_ONE => (address!("0x1b02da8cb0d097eb8d57a175b88c7d8b47997506")), + // + BASE => (address!("0x6bded42c6da8fbf0d2ba55b2fa120c5e0c8d7891")), + // + AVALANCHE => (address!("0x1b02da8cb0d097eb8d57a175b88c7d8b47997506")), + // + BNB => (address!("0x1b02da8cb0d097eb8d57a175b88c7d8b47997506")), + // + OPTIMISM => (address!("0x2abf469074dc0b54d793850807e6eb5faf2625b1")), + // + POLYGON => (address!("0x1b02da8cb0d097eb8d57a175b88c7d8b47997506")), + // Not available on Lens + } +); +crate::bindings!( + SwaprRouter, + // + crate::deployments! { + // + MAINNET => address!("0xb9960d9bca016e9748be75dd52f02188b9d0829f"), + // + GNOSIS => address!("0xE43e60736b1cb4a75ad25240E2f9a62Bff65c0C0"), + // + ARBITRUM_ONE => address!("0x530476d5583724A89c8841eB6Da76E7Af4C0F17E"), + // Not available on Base and Lens + } +); +crate::bindings!(ISwaprPair); +crate::bindings!( + TestnetUniswapV2Router02, + crate::deployments! { + // + SEPOLIA => address!("0x86dcd3293C53Cf8EFd7303B57beb2a3F671dDE98"), + } +); +crate::bindings!( + UniswapV2Factory, + // + crate::deployments! { + // + MAINNET => address!("0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f"), + // + GNOSIS => address!("0xA818b4F111Ccac7AA31D0BCc0806d64F2E0737D7"), + // + ARBITRUM_ONE => address!("0xf1D7CC64Fb4452F05c498126312eBE29f30Fbcf9"), + // + BASE => address!("0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6"), + // + SEPOLIA => address!("0xF62c03E08ada871A0bEb309762E260a7a6a880E6"), + // + AVALANCHE => address!("0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C"), + // + BNB => address!("0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6"), + // + OPTIMISM => address!("0x0c3c1c532F1e39EdF36BE9Fe0bE1410313E074Bf"), + // + POLYGON => address!("0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C"), + // Not available on Lens + } +); +crate::bindings!( + UniswapV2Router02, + // + crate::deployments! { + // + MAINNET => address!("0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D"), + // + GNOSIS => address!("0x1C232F01118CB8B424793ae03F870aa7D0ac7f77"), + // + ARBITRUM_ONE => address!("0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24"), + // + BASE => address!("0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24"), + // + SEPOLIA => address!("0xeE567Fe1712Faf6149d80dA1E6934E354124CfE3"), + // + AVALANCHE => address!("0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24"), + // + BNB => address!("0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24"), + // + OPTIMISM => address!("0x4A7b5Da61326A6379179b40d00F57E5bbDC962c2"), + // + POLYGON => address!("0xedf6066a2b290C185783862C7F4776A2C8077AD1"), + // Not available on Lens + } +); +crate::bindings!(IUniswapLikeRouter); +crate::bindings!(IUniswapLikePair); +crate::bindings!(UniswapV3Pool); +crate::bindings!( + UniswapV3QuoterV2, + crate::deployments! { + // + MAINNET => address!("0x61fFE014bA17989E743c5F6cB21bF9697530B21e"), + ARBITRUM_ONE => address!("0x61fFE014bA17989E743c5F6cB21bF9697530B21e"), + BASE => address!("0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a"), + AVALANCHE => address!("0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F"), + BNB => address!("0x78D78E420Da98ad378D7799bE8f4AF69033EB077"), + OPTIMISM => address!("0x61fFE014bA17989E743c5F6cB21bF9697530B21e"), + POLYGON => address!("0x61fFE014bA17989E743c5F6cB21bF9697530B21e"), + LENS => address!("0x1eEA2B790Dc527c5a4cd3d4f3ae8A2DDB65B2af1"), + LINEA => address!("0x42bE4D6527829FeFA1493e1fb9F3676d2425C3C1"), + // Not listed on Gnosis and Sepolia chains + } +); +crate::bindings!( + UniswapV3SwapRouterV2, + crate::deployments! { + // + ARBITRUM_ONE => address!("0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"), + MAINNET => address!("0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"), + POLYGON => address!("0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"), + OPTIMISM => address!("0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"), + BASE => address!("0x2626664c2603336E57B271c5C0b26F421741e481"), + AVALANCHE => address!("0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE"), + BNB => address!("0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2"), + LENS => address!("0x6ddD32cd941041D8b61df213B9f515A7D288Dc13"), + LINEA => address!("0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a"), + // Not available on Gnosis Chain + } +); +crate::bindings!( + IUniswapV3Factory, + crate::deployments! { + // + MAINNET => address!( "0x1F98431c8aD98523631AE4a59f267346ea31F984"), + SEPOLIA => address!( "0x1F98431c8aD98523631AE4a59f267346ea31F984"), + ARBITRUM_ONE => address!( "0x1F98431c8aD98523631AE4a59f267346ea31F984"), + BASE => address!( "0x33128a8fC17869897dcE68Ed026d694621f6FDfD"), + AVALANCHE => address!( "0x740b1c1de25031C31FF4fC9A62f554A55cdC1baD"), + BNB => address!( "0xdB1d10011AD0Ff90774D0C6Bb92e5C5c8b4461F7"), + OPTIMISM => address!( "0x1F98431c8aD98523631AE4a59f267346ea31F984"), + POLYGON => address!( "0x1F98431c8aD98523631AE4a59f267346ea31F984"), + // not official + LENS => address!( "0xc3A5b857Ba82a2586A45a8B59ECc3AA50Bc3D0e3"), + LINEA => address!("0x31FAfd4889FA1269F7a13A66eE0fB458f27D72A9"), + // Not available on Gnosis Chain + } +); + +crate::bindings!( + HooksTrampoline, + // + crate::deployments! { + MAINNET => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), + // Gnosis is using the old instance of the hook trampoline since it's hardcoded in gnosis pay rebalance integration. + GNOSIS => address!("0x01DcB88678aedD0C4cC9552B20F4718550250574"), + SEPOLIA => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), + ARBITRUM_ONE => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), + BASE => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), + AVALANCHE => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), + BNB => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), + OPTIMISM => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), + POLYGON => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), + LENS => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), + // compiled with an older, linea-compatible evm version + LINEA => address!("0xeFcf0d30DB41Ae0b136c5E3B4340dFeE2D099Ada"), + PLASMA => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), + } +); + +crate::bindings!( + CoWSwapEthFlow, + crate::deployments! { + // + MAINNET => (address!("0x40a50cf069e992aa4536211b23f286ef88752187"), 16169866), + // + GNOSIS => (address!("0x40a50cf069e992aa4536211b23f286ef88752187"), 25414331), + // + // + SEPOLIA => (address!("0x0b7795E18767259CC253a2dF471db34c72B49516"), 4718739), + // + ARBITRUM_ONE => (address!("0x6DFE75B5ddce1ADE279D4fa6BD6AeF3cBb6f49dB"), 204747458), + // + BASE => (address!("0x3C3eA1829891BC9bEC3d06A81d5d169e52a415e3"), 21490258), + // + AVALANCHE => (address!("0x04501b9b1d52e67f6862d157e00d13419d2d6e95"), 60496408), + // + BNB => (address!("0x04501b9b1d52e67f6862d157e00d13419d2d6e95"), 48411237), + // + OPTIMISM => (address!("0x04501b9b1d52e67f6862d157e00d13419d2d6e95"), 134607215), + // + POLYGON => (address!("0x04501b9b1d52e67f6862d157e00d13419d2d6e95"), 71296258), + // + LENS => (address!("0xFb337f8a725A142f65fb9ff4902d41cc901de222"), 3007173), + // + LINEA => (address!("0x04501b9b1d52e67f6862d157e00d13419d2d6e95"), 24522097), + // + PLASMA => (address!("0x04501b9b1d52e67f6862d157e00d13419d2d6e95"), 3521855), + } +); +crate::bindings!(CoWSwapOnchainOrders); +crate::bindings!(ERC1271SignatureValidator); + +// Used in the gnosis/solvers repo for the balancer solver +crate::bindings!( + BalancerQueries, + crate::deployments! { + // + MAINNET => (address!("0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5"), 15188261), + // + ARBITRUM_ONE => (address!("0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5"), 18238624), + // + OPTIMISM => (address!("0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5"), 15288107), + // + BASE => (address!("0x300Ab2038EAc391f26D9F895dc61F8F66a548833"), 1205869), + // + GNOSIS => (address!("0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e"), 24821845), + // + POLYGON => (address!("0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5"), 30988035), + // + AVALANCHE => (address!("0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD"), 26387068), + // Not available on Lens, Linea and Plasma + } +); + +crate::bindings!( + LiquoriceSettlement, + crate::deployments! { + // + MAINNET => address!("0x0448633eb8B0A42EfED924C42069E0DcF08fb552"), + ARBITRUM_ONE => address!("0x0448633eb8B0A42EfED924C42069E0DcF08fb552"), + } +); + +crate::bindings!( + FlashLoanRouter, + crate::deployments! { + MAINNET => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), + GNOSIS => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), + SEPOLIA => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), + ARBITRUM_ONE => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), + BASE => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), + POLYGON => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), + AVALANCHE => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), + } +); + +crate::bindings!(ICowWrapper); + +// Only used in +crate::bindings!( + Permit2, + crate::deployments! { + // + MAINNET => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 15986406), + // + GNOSIS => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 27338672), + // + SEPOLIA => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 2356287), + // + ARBITRUM_ONE => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 38692735), + // + BASE => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 1425180), + // + AVALANCHE => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 28844415), + // + BNB => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 25343783), + // + OPTIMISM => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 38854427), + // + POLYGON => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 35701901), + } +); + +crate::bindings!( + GPv2AllowListAuthentication, + crate::deployments! { + // + MAINNET => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 12593263), + // + GNOSIS => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 16465099), + // + SEPOLIA => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 4717469), + // + ARBITRUM_ONE => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 204702129), + // + BASE => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 21407137), + // + AVALANCHE => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 59891351), + // + BNB => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 48173639), + // + OPTIMISM => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 134254466), + // + POLYGON => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 45854728), + // + LENS => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 2612937), + // + LINEA => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 24333100), + // + PLASMA => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 3439709), + } +); + +crate::bindings!( + GPv2Settlement, + crate::deployments! { + // + MAINNET => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 12593265), + // + GNOSIS => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 16465100), + // + SEPOLIA => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 4717488), + // + ARBITRUM_ONE => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 204704802), + // + BASE => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 21407238), + // + AVALANCHE => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 59891356), + // + BNB => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 48173641), + // + OPTIMISM => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 134254624), + // + POLYGON => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 45859743), + // + LENS => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 2621745), + // + LINEA => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 24333100), + // + PLASMA => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 3439711), + } +); + +crate::bindings!( + WETH9, + crate::deployments! { + // Note: the WETH address must be consistent with the one used by the ETH-flow + // contract + MAINNET => address!("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"), + GNOSIS => address!("0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d"), + SEPOLIA => address!("0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14"), + ARBITRUM_ONE => address!("0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"), + BASE => address!("0x4200000000000000000000000000000000000006"), + AVALANCHE => address!("0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7"), + BNB => address!("0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"), + OPTIMISM => address!("0x4200000000000000000000000000000000000006"), + POLYGON => address!("0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270"), + LENS => address!("0x6bDc36E20D267Ff0dd6097799f82e78907105e2F"), + LINEA => address!("0xe5d7c2a44ffddf6b295a15c148167daaaf5cf34f"), + PLASMA => address!("0x6100E367285b01F48D07953803A2d8dCA5D19873"), + } +); + +crate::bindings!(ERC20); + +pub mod cow_amm { + crate::bindings!(CowAmm); + crate::bindings!( + CowAmmConstantProductFactory, + crate::deployments! { + // + MAINNET => (address!("0x40664207e3375FB4b733d4743CE9b159331fd034"), 19861952), + // + GNOSIS => (address!("0xdb1cba3a87f2db53b6e1e6af48e28ed877592ec0"), 33874317), + // + SEPOLIA => (address!("0xb808e8183e3a72d196457d127c7fd4befa0d7fd3"), 5874562), + } + ); + crate::bindings!( + CowAmmLegacyHelper, + crate::deployments! { + // + MAINNET => (address!("0x3705ceee5eaa561e3157cf92641ce28c45a3999c"), 20332745), + // + GNOSIS => (address!("0xd9ec06b001957498ab1bc716145515d1d0e30ffb"), 35026999), + } + ); + crate::bindings!(CowAmmUniswapV2PriceOracle); + crate::bindings!(CowAmmFactoryGetter); +} + +pub mod support { + // Support contracts used for trade and token simulations. + crate::bindings!(AnyoneAuthenticator); + crate::bindings!(Solver); + crate::bindings!(Spardose); + crate::bindings!(Trader); + // Support contract used for solver fee simulations in the gnosis/solvers repo. + crate::bindings!(Swapper); + crate::bindings!( + Signatures, + crate::deployments! { + MAINNET => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), + ARBITRUM_ONE => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), + BASE => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), + AVALANCHE => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), + BNB => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), + OPTIMISM => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), + POLYGON => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), + LENS => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), + GNOSIS => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), + SEPOLIA => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), + // built with evm=London, because deployment reverts on Linea otherwise + LINEA => address!("0xf6E57e72F7dB3D9A51a8B4c149C00475b94A37e4"), + PLASMA => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), + } + ); + // Support contracts used for various order simulations. + crate::bindings!( + Balances, + crate::deployments! { + MAINNET => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), + ARBITRUM_ONE => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), + BASE => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), + AVALANCHE => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), + BNB => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), + OPTIMISM => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), + POLYGON => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), + LENS => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), + GNOSIS => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), + SEPOLIA => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), + PLASMA => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), + // built with evm=London, because deployment reverts on Linea otherwise + LINEA => address!("0x361350f708f7c0c63c8a505226592c3e5d1faa29"), + } + ); +} + +pub mod test { + // Test Contract for using up a specified amount of gas. + crate::bindings!(GasHog); + // Test Contract for incrementing arbitrary counters. + crate::bindings!(Counter); + // Token with support for `permit` (for pre-interaction tests) + crate::bindings!( + CowProtocolToken, + crate::deployments! { + MAINNET => address!("0xDEf1CA1fb7FBcDC777520aa7f396b4E015F497aB"), + GNOSIS => address!("0x177127622c4A00F3d409B75571e12cB3c8973d3c"), + SEPOLIA => address!("0x0625aFB445C3B6B7B929342a04A22599fd5dBB59"), + ARBITRUM_ONE => address!("0xcb8b5CD20BdCaea9a010aC1F8d835824F5C87A04"), + BASE => address!("0xc694a91e6b071bF030A18BD3053A7fE09B6DaE69"), + } + ); +} + +pub use alloy::providers::DynProvider as Provider; + +/// Extension trait to attach some useful functions to the contract instance. +pub trait InstanceExt: Sized { + /// Crates a contract instance at the expected address for the current + /// network. + fn deployed( + provider: &Provider, + ) -> impl std::future::Future> + Send; +} + +/// Build a `HashMap)>` from entries like: +/// `CHAIN_ID => address!("0x…")` // block = None +/// `CHAIN_ID => (address!("0x…"), 12_345_678)` // block = Some(…) +#[macro_export] +macro_rules! deployments { + (@acc $m:ident; ) => {}; + + // Tuple form with trailing comma: CHAIN => (addr, block), + (@acc $m:ident; $chain:expr => ( $addr:expr, $block:expr ), $($rest:tt)* ) => { + $m.insert($chain, ($addr, Some($block))); + $crate::deployments!(@acc $m; $($rest)*); + }; + + // Address-only form with trailing comma: CHAIN => addr, + (@acc $m:ident; $chain:expr => $addr:expr, $($rest:tt)* ) => { + $m.insert($chain, ($addr, None::)); + $crate::deployments!(@acc $m; $($rest)*); + }; + + // Tuple form without trailing comma (last entry). + (@acc $m:ident; $chain:expr => ( $addr:expr, $block:expr ) ) => { + $m.insert($chain, ($addr, Some($block))); + }; + + // Address-only form without trailing comma (last entry). + (@acc $m:ident; $chain:expr => $addr:expr ) => { + $m.insert($chain, ($addr, None::)); + }; + + ( $($rest:tt)* ) => {{ + let mut m = ::std::collections::HashMap::new(); + $crate::deployments!(@acc m; $($rest)*); + m + }}; +} + +#[macro_export] +macro_rules! bindings { + ($contract:ident $(, $deployment_info:expr)?) => { + paste::paste! { + // Generate the main bindings in a private module. That allows + // us to re-export all items in our own module while also adding + // some items ourselves. + #[expect(non_snake_case)] + mod [<$contract Private>] { + alloy::sol!( + #[allow(missing_docs, clippy::too_many_arguments)] + #[sol(rpc, all_derives)] + $contract, + concat!("./artifacts/", stringify!($contract), ".json"), + ); + } + + #[expect(non_snake_case)] + pub mod $contract { + use alloy::providers::DynProvider; + + pub use super::[<$contract Private>]::*; + pub type Instance = $contract::[<$contract Instance>]; + + $( + use { + std::sync::LazyLock, + anyhow::Result, + std::collections::HashMap, + alloy::{ + providers::Provider, + primitives::{address, Address}, + }, + anyhow::Context, + $crate::alloy::networks::*, + }; + + static DEPLOYMENT_INFO: LazyLock)>> = LazyLock::new(|| { + $deployment_info + }); + + /// Returns the contract's deployment block (if one exists) for the given chain. + pub fn deployment_block(chain_id: &u64) -> Option { + DEPLOYMENT_INFO.get(chain_id).map(|(_, block)| *block).flatten() + } + + /// Returns the contract's deployment address (if one exists) for the given chain. + pub fn deployment_address(chain_id: &u64) -> Option { + DEPLOYMENT_INFO.get(chain_id).map(|(addr, _)| *addr) + } + + impl $crate::alloy::InstanceExt for Instance { + fn deployed(provider: &DynProvider) -> impl Future> + Send { + async move { + let chain_id = provider + .get_chain_id() + .await + .context("could not fetch current chain id")?; + + let (address, _deployed_block) = *DEPLOYMENT_INFO + .get(&chain_id) + .with_context(|| format!("no deployment info for chain {chain_id:?}"))?; + + Ok(Instance::new( + address, + provider.clone(), + )) + } + } + } + )* + } + } + }; +} + +#[cfg(test)] +mod tests { + use super::networks::*; + use super::*; + + #[test] + fn test_has_address() { + assert!(BaoswapRouter::deployment_address(&GNOSIS).is_some()); + assert!(HoneyswapRouter::deployment_address(&GNOSIS).is_some()); + + for chain_id in &[MAINNET, ARBITRUM_ONE, BASE, BNB] { + assert!(PancakeRouter::deployment_address(chain_id).is_some()); + } + + for chain_id in &[ + MAINNET, + GNOSIS, + ARBITRUM_ONE, + BASE, + AVALANCHE, + BNB, + OPTIMISM, + POLYGON, + ] { + assert!(SushiSwapRouter::deployment_address(chain_id).is_some()); + } + + for chain_id in &[MAINNET, GNOSIS, ARBITRUM_ONE] { + assert!(SwaprRouter::deployment_address(chain_id).is_some()); + } + + assert!(TestnetUniswapV2Router02::deployment_address(&SEPOLIA).is_some()); + + for chain_id in &[ + MAINNET, + GNOSIS, + ARBITRUM_ONE, + BASE, + SEPOLIA, + AVALANCHE, + BNB, + OPTIMISM, + POLYGON, + ] { + assert!(UniswapV2Factory::deployment_address(chain_id).is_some()); + assert!(UniswapV2Router02::deployment_address(chain_id).is_some()); + } + + // Plasma only has Balancer V3, not V2 + assert!(BalancerV3BatchRouter::deployment_address(&PLASMA).is_some()); + } +} From d059ba185e1a0957a8cb960a73dc221842b5c687 Mon Sep 17 00:00:00 2001 From: Aryan Godara Date: Mon, 17 Nov 2025 19:24:38 +0530 Subject: [PATCH 2/3] feat(contracts): add Plasma chain support for DEX routing Add Balancer V3, Uniswap V3, and Permit2 deployments for Plasma (9745). Mark Balancer V2 contracts as unavailable on Plasma and Linea. Signed-off-by: Aryan Godara --- crates/contracts/src/alloy.rs | 82 ++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/crates/contracts/src/alloy.rs b/crates/contracts/src/alloy.rs index 84df743044..17b0343907 100644 --- a/crates/contracts/src/alloy.rs +++ b/crates/contracts/src/alloy.rs @@ -481,6 +481,8 @@ crate::bindings!( POLYGON => address!("0x61fFE014bA17989E743c5F6cB21bF9697530B21e"), LENS => address!("0x1eEA2B790Dc527c5a4cd3d4f3ae8A2DDB65B2af1"), LINEA => address!("0x42bE4D6527829FeFA1493e1fb9F3676d2425C3C1"), + // not official + PLASMA => address!("0xaa52bB8110fE38D0d2d2AF0B85C3A3eE622CA455"), // Not listed on Gnosis and Sepolia chains } ); @@ -497,6 +499,8 @@ crate::bindings!( BNB => address!("0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2"), LENS => address!("0x6ddD32cd941041D8b61df213B9f515A7D288Dc13"), LINEA => address!("0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a"), + // not official + PLASMA => address!("0x807F4E281B7A3B324825C64ca53c69F0b418dE40"), // Not available on Gnosis Chain } ); @@ -515,6 +519,7 @@ crate::bindings!( // not official LENS => address!( "0xc3A5b857Ba82a2586A45a8B59ECc3AA50Bc3D0e3"), LINEA => address!("0x31FAfd4889FA1269F7a13A66eE0fB458f27D72A9"), + PLASMA => address!("0xcb2436774C3e191c85056d248EF4260ce5f27A9D"), // Contract Name: BulbaV3Factory // Not available on Gnosis Chain } ); @@ -641,6 +646,8 @@ crate::bindings!( OPTIMISM => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 38854427), // POLYGON => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 35701901), + // + PLASMA => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 7808), } ); @@ -988,7 +995,78 @@ mod tests { assert!(UniswapV2Router02::deployment_address(chain_id).is_some()); } - // Plasma only has Balancer V3, not V2 - assert!(BalancerV3BatchRouter::deployment_address(&PLASMA).is_some()); + for chain_id in &[ + MAINNET, + ARBITRUM_ONE, + BASE, + AVALANCHE, + BNB, + OPTIMISM, + POLYGON, + LENS, + LINEA, + PLASMA, + ] { + assert!(UniswapV3QuoterV2::deployment_address(chain_id).is_some()); + } + + for chain_id in &[ + MAINNET, + ARBITRUM_ONE, + BASE, + AVALANCHE, + BNB, + OPTIMISM, + POLYGON, + LENS, + LINEA, + PLASMA, + ] { + assert!(UniswapV3SwapRouterV2::deployment_address(chain_id).is_some()); + } + + for chain_id in &[ + MAINNET, + SEPOLIA, + ARBITRUM_ONE, + BASE, + AVALANCHE, + BNB, + OPTIMISM, + POLYGON, + LENS, + LINEA, + PLASMA, + ] { + assert!(IUniswapV3Factory::deployment_address(chain_id).is_some()); + } + + for chain_id in &[ + MAINNET, + GNOSIS, + SEPOLIA, + ARBITRUM_ONE, + BASE, + AVALANCHE, + BNB, + OPTIMISM, + POLYGON, + PLASMA, + ] { + assert!(Permit2::deployment_address(chain_id).is_some()); + } + + for chain_id in &[ + MAINNET, + GNOSIS, + SEPOLIA, + ARBITRUM_ONE, + BASE, + AVALANCHE, + OPTIMISM, + PLASMA, + ] { + assert!(BalancerV3BatchRouter::deployment_address(chain_id).is_some()); + } } } From 4e190c5c9d015a699dd558dbb8f22ff2ae62ffdd Mon Sep 17 00:00:00 2001 From: Aryan Godara Date: Sat, 29 Nov 2025 14:34:10 +0530 Subject: [PATCH 3/3] feat(contracts): add Plasma chain support for Uniswap V3 and Permit2 Rebase and move changes from alloy.rs to new location at build.rs Signed-off-by: Aryan Godara --- crates/contracts/build.rs | 43 +- crates/contracts/src/alloy.rs | 1072 --------------------------------- 2 files changed, 28 insertions(+), 1087 deletions(-) delete mode 100644 crates/contracts/src/alloy.rs diff --git a/crates/contracts/build.rs b/crates/contracts/build.rs index 29bdab7bef..aa7066a057 100644 --- a/crates/contracts/build.rs +++ b/crates/contracts/build.rs @@ -128,7 +128,7 @@ fn main() { MAINNET => ("0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9", 12272147), // Not available on Sepolia (only version ≥ 4) // - // Not available on Lens + // Not available on Lens, Linea and Plasma ]), ) // @@ -148,7 +148,7 @@ fn main() { BNB => ("0x6e4cF292C5349c79cCd66349c3Ed56357dD11B46", 25474982), // Not available on Sepolia (only version ≥ 4) // - // Not available on Lens + // Not available on Lens, Linea and Plasma ]), ) .add_contract( @@ -172,7 +172,7 @@ fn main() { POLYGON => ("0xFc8a407Bba312ac761D8BFe04CE1201904842B76", 40611103), // BNB => ("0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a", 26665331), - // Not available on Base and Lens + // Not available on Base, Lens, Linea and Plasma // ]), ) @@ -186,7 +186,7 @@ fn main() { OPTIMISM => ("0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca", 7005512), // POLYGON => ("0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9", 15832998), - // Not available on Sepolia, Base, Avalanche, BNB and Lens + // Not available on Sepolia, Base, Avalanche, BNB, Lens, Linea and Plasma // // ]), @@ -203,7 +203,7 @@ fn main() { OPTIMISM => ("0xeb151668006CD04DAdD098AFd0a82e78F77076c3", 11088891), // POLYGON => ("0xcA96C4f198d343E251b1a01F3EBA061ef3DA73C1", 29371951), - // Not available on Sepolia, Base, Avalanche, BNB and Lens + // Not available on Sepolia, Base, Avalanche, BNB, Lens, Linea and Plasma // // ]), @@ -216,7 +216,7 @@ fn main() { ARBITRUM_ONE => ("0x142B9666a0a3A30477b052962ddA81547E7029ab", 222870), // POLYGON => ("0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE", 17116402), - // Not available on Sepolia, Base, Avalanche, BNB, Optimism and Lens + // Not available on Sepolia, Base, Avalanche, BNB, Optimism, Lens, Linea and Plasma // // ]), @@ -244,7 +244,7 @@ fn main() { OPTIMISM => ("0xf302f9F50958c5593770FDf4d4812309fF77414f", 7005915), // POLYGON => ("0x41B953164995c11C81DA73D212ED8Af25741b7Ac", 22067480), - // Not available on Lens + // Not available on Lens, Linea and Plasma ]), ) .add_contract( @@ -258,7 +258,7 @@ fn main() { OPTIMISM => ("0xf145caFB67081895EE80eB7c04A30Cf87f07b745", 22182522), // POLYGON => ("0x136FD06Fa01eCF624C7F2B3CB15742c1339dC2c4", 32774224), - // Not available on Sepolia, Gnosis Chain, Base, Avalanche and Lens + // Not available on Sepolia, Gnosis Chain, Base, Avalanche, Lens, Linea and Plasma // // ]), @@ -279,7 +279,7 @@ fn main() { // Not available on Sepolia (only version ≥ 4) and on Base (only version ≥ 5) // // - // Not available on Lens + // Not available on Lens, Linea and Plasma ]), ) .add_contract( @@ -300,7 +300,7 @@ fn main() { OPTIMISM => ("0x1802953277FD955f9a254B80Aa0582f193cF1d77", 82748180), // POLYGON => ("0x6Ab5549bBd766A43aFb687776ad8466F8b42f777", 40613553), - // Not available on Base and Lens + // Not available on Base, Lens, Linea and Plasma // ]), ) @@ -324,7 +324,7 @@ fn main() { OPTIMISM => ("0x043A2daD730d585C44FB79D2614F295D2d625412", 106752707), // POLYGON => ("0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b", 44961548), - // Not available on Lens + // Not available on Lens, Linea and Plasma ]), ) .add_contract( @@ -347,7 +347,7 @@ fn main() { OPTIMISM => ("0x4bdCc2fb18AEb9e2d281b0278D946445070EAda7", 116694338), // POLYGON => ("0xEAedc32a51c510d35ebC11088fD5fF2b47aACF2E", 53996258), - // Not available on Lens + // Not available on Lens, Linea and Plasma ]), ) // Balancer addresses can be obtained from: @@ -371,7 +371,7 @@ fn main() { OPTIMISM => ("0xBA12222222228d8Ba445958a75a0704d566BF2C8", 7003431), // POLYGON => ("0xBA12222222228d8Ba445958a75a0704d566BF2C8", 15832990), - // Not available on Lens + // Not available on Lens, Linea and Plasma ])) .add_contract( Contract::new("BalancerV3BatchRouter").with_networks(networks![ @@ -389,7 +389,9 @@ fn main() { AVALANCHE => ("0xc9b36096f5201ea332Db35d6D195774ea0D5988f", 59965747), // OPTIMISM => ("0xaD89051bEd8d96f045E8912aE1672c6C0bF8a85E", 133969588), - // Not available on Lens, Polygon, BNB + // + PLASMA => ("0x85a80afee867aDf27B50BdB7b76DA70f1E853062", 782312), + // Not available on Lens, Polygon, BNB and Linea ]), ) // UniV2 @@ -505,6 +507,9 @@ fn main() { POLYGON => "0x61fFE014bA17989E743c5F6cB21bF9697530B21e", LENS => "0x1eEA2B790Dc527c5a4cd3d4f3ae8A2DDB65B2af1", LINEA => "0x42bE4D6527829FeFA1493e1fb9F3676d2425C3C1", + // not official (deployed by oku trade) + // + PLASMA => "0xaa52bB8110fE38D0d2d2AF0B85C3A3eE622CA455", // Not listed on Gnosis and Sepolia chains ])) // @@ -519,6 +524,9 @@ fn main() { BNB => "0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2", LENS => "0x6ddD32cd941041D8b61df213B9f515A7D288Dc13", LINEA => "0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a", + // not official (deployed by oku trade) + // + PLASMA => "0x807F4E281B7A3B324825C64ca53c69F0b418dE40", // Not available on Gnosis Chain ]), ) @@ -535,6 +543,9 @@ fn main() { // not official LENS => "0xc3A5b857Ba82a2586A45a8B59ECc3AA50Bc3D0e3", LINEA => "0x31FAfd4889FA1269F7a13A66eE0fB458f27D72A9", + // not official (deployed by oku trade) + // + PLASMA => "0xcb2436774C3e191c85056d248EF4260ce5f27A9D", // Not available on Gnosis Chain ])) // @@ -598,7 +609,7 @@ fn main() { POLYGON => ("0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5", 30988035), // AVALANCHE => ("0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD", 26387068), - // Not available on Lens + // Not available on Lens, Linea and Plasma ])) // .add_contract( @@ -646,6 +657,8 @@ fn main() { OPTIMISM => ("0x000000000022D473030F116dDEE9F6B43aC78BA3", 38854427), // POLYGON => ("0x000000000022D473030F116dDEE9F6B43aC78BA3", 35701901), + // + PLASMA => ("0x000000000022D473030F116dDEE9F6B43aC78BA3", 7808), ])) .add_contract( Contract::new("GPv2AllowListAuthentication").with_networks(networks![ diff --git a/crates/contracts/src/alloy.rs b/crates/contracts/src/alloy.rs deleted file mode 100644 index 17b0343907..0000000000 --- a/crates/contracts/src/alloy.rs +++ /dev/null @@ -1,1072 +0,0 @@ -pub mod networks { - pub const MAINNET: u64 = 1; - pub const GNOSIS: u64 = 100; - pub const SEPOLIA: u64 = 11155111; - pub const ARBITRUM_ONE: u64 = 42161; - pub const BASE: u64 = 8453; - pub const POLYGON: u64 = 137; - pub const AVALANCHE: u64 = 43114; - pub const BNB: u64 = 56; - pub const OPTIMISM: u64 = 10; - pub const LENS: u64 = 232; - pub const LINEA: u64 = 59144; - pub const PLASMA: u64 = 9745; -} - -crate::bindings!( - ChainalysisOracle, - crate::deployments! { - MAINNET => address!("0x40C57923924B5c5c5455c48D93317139ADDaC8fb"), - ARBITRUM_ONE => address!("0x40C57923924B5c5c5455c48D93317139ADDaC8fb"), - BASE => address!("0x3A91A31cB3dC49b4db9Ce721F50a9D076c8D739B"), - AVALANCHE => address!("0x40C57923924B5c5c5455c48D93317139ADDaC8fb"), - BNB => address!("0x40C57923924B5c5c5455c48D93317139ADDaC8fb"), - OPTIMISM => address!("0x40C57923924B5c5c5455c48D93317139ADDaC8fb"), - POLYGON => address!("0x40C57923924B5c5c5455c48D93317139ADDaC8fb"), - } -); - -crate::bindings!( - IZeroex, - crate::deployments! { - MAINNET => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), - SEPOLIA => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), - ARBITRUM_ONE => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), - BASE => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), - AVALANCHE => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), - BNB => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), - OPTIMISM => address!("0xdef1abe32c034e558cdd535791643c58a13acc10"), - POLYGON => address!("0xdef1c0ded9bec7f1a1670819833240f027b25eff"), - // Not available on Lens - } -); - -crate::bindings!(ERC20Mintable); - -crate::bindings!(GnosisSafe); -crate::bindings!(GnosisSafeCompatibilityFallbackHandler); -crate::bindings!(GnosisSafeProxy); -crate::bindings!(GnosisSafeProxyFactory); - -crate::bindings!(BalancerV2Authorizer); -crate::bindings!(BalancerV2BasePool); -crate::bindings!(BalancerV2BasePoolFactory); -crate::bindings!(BalancerV2WeightedPool); -crate::bindings!(BalancerV2StablePool); -crate::bindings!(BalancerV2ComposableStablePool); -crate::bindings!(BalancerV2LiquidityBootstrappingPool); -crate::bindings!( - BalancerV2WeightedPoolFactory, - // - crate::deployments! { - // - MAINNET => (address!("0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9"), 12272147) - // Not available on Sepolia (only version ≥ 4) - // - // Not available on Lens, Linea and Plasma - } -); -crate::bindings!( - BalancerV2WeightedPoolFactoryV3, - // - crate::deployments! { - // - MAINNET => (address!("0x5Dd94Da3644DDD055fcf6B3E1aa310Bb7801EB8b"), 16520627), - // - GNOSIS => (address!("0xC128a9954e6c874eA3d62ce62B468bA073093F25"), 26226256), - // - AVALANCHE => (address!("0x94f68b54191F62f781Fe8298A8A5Fa3ed772d227"), 26389236), - // - OPTIMISM => (address!("0xA0DAbEBAAd1b243BBb243f933013d560819eB66f"), 72832703), - // - POLYGON => (address!("0x82e4cFaef85b1B6299935340c964C942280327f4"), 39036828), - // - BNB => (address!("0x6e4cF292C5349c79cCd66349c3Ed56357dD11B46"), 25474982), - // Not available on Sepolia (only version ≥ 4) - // - // Not available on Lens, Linea and Plasma - } -); -crate::bindings!( - BalancerV2WeightedPoolFactoryV4, - crate::deployments! { - // - MAINNET => (address!("0x897888115Ada5773E02aA29F775430BFB5F34c51"), 16878323), - // - GNOSIS => (address!("0x6CaD2ea22BFA7F4C14Aae92E47F510Cd5C509bc7"), 27055829), - // - // - SEPOLIA => (address!("0x7920BFa1b2041911b354747CA7A6cDD2dfC50Cfd"), 3424893), - // - ARBITRUM_ONE => (address!("0xc7E5ED1054A24Ef31D827E6F86caA58B3Bc168d7"), 72222060), - // - BASE => (address!("0x4C32a8a8fDa4E24139B51b456B42290f51d6A1c4"), 1204869), - // - AVALANCHE => (address!("0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a"), 27739006), - // - OPTIMISM => (address!("0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a"), 82737545), - // - POLYGON => (address!("0xFc8a407Bba312ac761D8BFe04CE1201904842B76"), 40611103), - // - BNB => (address!("0x230a59F4d9ADc147480f03B0D3fFfeCd56c3289a"), 26665331), - // Not available on Base, Lens, Linea and Plasma - // - } -); -crate::bindings!( - BalancerV2WeightedPool2TokensFactory, - // - crate::deployments! { - // - MAINNET => (address!("0xa5bf2ddf098bb0ef6d120c98217dd6b141c74ee0"), 12349891), - ARBITRUM_ONE => (address!("0xCF0a32Bbef8F064969F21f7e02328FB577382018"), 222864), - // - OPTIMISM => (address!("0xdAE7e32ADc5d490a43cCba1f0c736033F2b4eFca"), 7005512), - // - POLYGON => (address!("0x8E9aa87E45e92bad84D5F8DD1bff34Fb92637dE9"), 15832998), - // Not available on Sepolia, Base, Avalanche, BNB, Lens, Linea and Plasma - // - // - } -); -crate::bindings!( - BalancerV2StablePoolFactoryV2, - // - crate::deployments! { - // - MAINNET => (address!("0x8df6efec5547e31b0eb7d1291b511ff8a2bf987c"), 14934936), - // - GNOSIS => (address!("0xf23b4DB826DbA14c0e857029dfF076b1c0264843"), 25415344), - ARBITRUM_ONE => (address!("0xEF44D6786b2b4d544b7850Fe67CE6381626Bf2D6"), 14244664), - // - OPTIMISM => (address!("0xeb151668006CD04DAdD098AFd0a82e78F77076c3"), 11088891), - // - POLYGON => (address!("0xcA96C4f198d343E251b1a01F3EBA061ef3DA73C1"), 29371951), - // Not available on Sepolia, Base, Avalanche, BNB, Lens, Linea and Plasma - // - // - } -); -crate::bindings!( - BalancerV2LiquidityBootstrappingPoolFactory, - // - crate::deployments! { - // - MAINNET => (address!("0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE"), 12871780), - ARBITRUM_ONE => (address!("0x142B9666a0a3A30477b052962ddA81547E7029ab"), 222870), - // - POLYGON => (address!("0x751A0bC0e3f75b38e01Cf25bFCE7fF36DE1C87DE"), 17116402), - // Not available on Sepolia, Base, Avalanche, BNB, Optimism, Lens, Linea and Plasma - // - // - } -); -crate::bindings!( - BalancerV2NoProtocolFeeLiquidityBootstrappingPoolFactory, - // - crate::deployments! { - // - MAINNET => (address!("0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e"), 13730248), - // - // - GNOSIS => (address!("0x85a80afee867aDf27B50BdB7b76DA70f1E853062"), 25415236), - // - // - SEPOLIA => (address!("0x45fFd460cC6642B8D8Fb12373DFd77Ceb0f4932B"), 25415236), - ARBITRUM_ONE => (address!("0x1802953277FD955f9a254B80Aa0582f193cF1d77"), 4859669), - // - BASE => (address!("0x0c6052254551EAe3ECac77B01DFcf1025418828f"), 1206531), - // - AVALANCHE => (address!("0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e"), 26386552), - // - BNB => (address!("0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD"), 22691243), - // - OPTIMISM => (address!("0xf302f9F50958c5593770FDf4d4812309fF77414f"), 7005915), - // - POLYGON => (address!("0x41B953164995c11C81DA73D212ED8Af25741b7Ac"), 22067480), - // Not available on Lens, Linea and Plasma - } -); -crate::bindings!( - BalancerV2ComposableStablePoolFactory, - crate::deployments! { - // - MAINNET => (address!("0xf9ac7B9dF2b3454E841110CcE5550bD5AC6f875F"), 15485885), - ARBITRUM_ONE => (address!("0xaEb406b0E430BF5Ea2Dc0B9Fe62E4E53f74B3a33"), 23227044), - // - BNB => (address!("0xf302f9F50958c5593770FDf4d4812309fF77414f"), 22691193), - // - OPTIMISM => (address!("0xf145caFB67081895EE80eB7c04A30Cf87f07b745"), 22182522), - // - POLYGON => (address!("0x136FD06Fa01eCF624C7F2B3CB15742c1339dC2c4"), 32774224), - // Not available on Sepolia, Gnosis Chain, Base, Avalanche, Lens, Linea and Plasma - // - // - } -); -crate::bindings!( - BalancerV2ComposableStablePoolFactoryV3, - crate::deployments! { - // - MAINNET => (address!("0xdba127fBc23fb20F5929C546af220A991b5C6e01"), 16580899), - // - GNOSIS => (address!("0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD"), 26365805), - ARBITRUM_ONE => (address!("0x1c99324EDC771c82A0DCCB780CC7DDA0045E50e7"), 58948370), - // - BNB => (address!("0xacAaC3e6D6Df918Bf3c809DFC7d42de0e4a72d4C"), 25475700), - // - OPTIMISM => (address!("0xe2E901AB09f37884BA31622dF3Ca7FC19AA443Be"), 72832821), - // - POLYGON => (address!("0x7bc6C0E73EDAa66eF3F6E2f27b0EE8661834c6C9"), 39037615), - // Not available on Sepolia (only version ≥ 4) and on Base (only version ≥ 5) - // - // - // Not available on Lens, Linea and Plasma - } -); -crate::bindings!( - BalancerV2ComposableStablePoolFactoryV4, - crate::deployments! { - // - MAINNET => (address!("0xfADa0f4547AB2de89D1304A668C39B3E09Aa7c76"), 16878679), - // - GNOSIS => (address!("0xD87F44Df0159DC78029AB9CA7D7e57E7249F5ACD"), 27056416), - // - // - SEPOLIA => (address!("0xA3fd20E29358c056B727657E83DFd139abBC9924"), 3425277), - ARBITRUM_ONE => (address!("0x2498A2B0d6462d2260EAC50aE1C3e03F4829BA95"), 72235860), - // - AVALANCHE => (address!("0x3B1eb8EB7b43882b385aB30533D9A2BeF9052a98"), 29221425), - // - BNB => (address!("0x1802953277FD955f9a254B80Aa0582f193cF1d77"), 26666380), - // - OPTIMISM => (address!("0x1802953277FD955f9a254B80Aa0582f193cF1d77"), 82748180), - // - POLYGON => (address!("0x6Ab5549bBd766A43aFb687776ad8466F8b42f777"), 40613553), - // Not available on Base, Lens, Linea and Plasma - // - } -); -crate::bindings!( - BalancerV2ComposableStablePoolFactoryV5, - crate::deployments! { - // - MAINNET => (address!("0xDB8d758BCb971e482B2C45f7F8a7740283A1bd3A"), 17672478), - // - GNOSIS => (address!("0x4bdCc2fb18AEb9e2d281b0278D946445070EAda7"), 28900564), - // - // - SEPOLIA => (address!("0xa523f47A933D5020b23629dDf689695AA94612Dc"), 3872211), - ARBITRUM_ONE => (address!("0xA8920455934Da4D853faac1f94Fe7bEf72943eF1"), 110212282), - // - BASE => (address!("0x8df317a729fcaA260306d7de28888932cb579b88"), 1204710), - // - AVALANCHE => (address!("0xE42FFA682A26EF8F25891db4882932711D42e467"), 32478827), - // - BNB => (address!("0x4fb47126Fa83A8734991E41B942Ac29A3266C968"), 29877945), - // - OPTIMISM => (address!("0x043A2daD730d585C44FB79D2614F295D2d625412"), 106752707), - // - POLYGON => (address!("0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b"), 44961548), - // Not available on Lens, Linea and Plasma - } -); -crate::bindings!( - BalancerV2ComposableStablePoolFactoryV6, - crate::deployments! { - // - MAINNET => (address!("0x5B42eC6D40f7B7965BE5308c70e2603c0281C1E9"), 19314764), - // - GNOSIS => (address!("0x47B489bf5836f83ABD928C316F8e39bC0587B020"), 32650879), - // - SEPOLIA => (address!("0x05503B3aDE04aCA81c8D6F88eCB73Ba156982D2B"), 5369821), - // - ARBITRUM_ONE => (address!("0x4bdCc2fb18AEb9e2d281b0278D946445070EAda7"), 184805448), - // - BASE => (address!("0x956CCab09898C0AF2aCa5e6C229c3aD4E93d9288"), 11099703), - // - AVALANCHE => (address!("0xb9F8AB3ED3F3aCBa64Bc6cd2DcA74B7F38fD7B88"), 42186350), - // - BNB => (address!("0x6B5dA774890Db7B7b96C6f44e6a4b0F657399E2e"), 36485719), - // - OPTIMISM => (address!("0x4bdCc2fb18AEb9e2d281b0278D946445070EAda7"), 116694338), - // - POLYGON => (address!("0xEAedc32a51c510d35ebC11088fD5fF2b47aACF2E"), 53996258), - // Not available on Lens, Linea and Plasma - } -); -crate::bindings!( - // Balancer addresses can be obtained from: - // - BalancerV2Vault, - crate::deployments! { - // - MAINNET => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 12272146), - // - GNOSIS => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 24821598), - // - SEPOLIA => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 3418831), - // - ARBITRUM_ONE => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 222832), - // - BASE => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 1196036), - // - AVALANCHE => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 26386141), - // - BNB => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 22691002), - // - OPTIMISM => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 7003431), - // - POLYGON => (address!("0xBA12222222228d8Ba445958a75a0704d566BF2C8"), 15832990), - // Not available on Lens, Linea and Plasma - } -); -crate::bindings!( - BalancerV3BatchRouter, - crate::deployments! { - // - MAINNET => (address!("0x136f1EFcC3f8f88516B9E94110D56FDBfB1778d1"), 21339510), - // - GNOSIS => (address!("0xe2fa4e1d17725e72dcdAfe943Ecf45dF4B9E285b"), 37377506), - // - SEPOLIA => (address!("0xC85b652685567C1B074e8c0D4389f83a2E458b1C"), 7219301), - // - ARBITRUM_ONE => (address!("0xaD89051bEd8d96f045E8912aE1672c6C0bF8a85E"), 297828544), - // - BASE => (address!("0x85a80afee867aDf27B50BdB7b76DA70f1E853062"), 25347205), - // - AVALANCHE => (address!("0xc9b36096f5201ea332Db35d6D195774ea0D5988f"), 59965747), - // - OPTIMISM => (address!("0xaD89051bEd8d96f045E8912aE1672c6C0bF8a85E"), 133969588), - // - PLASMA => (address!("0x85a80afee867aDf27B50BdB7b76DA70f1E853062"), 782312), - // Not available on Lens, Polygon, BNB and Linea - } -); - -// UniV2 -crate::bindings!( - BaoswapRouter, - crate::deployments! { - // https://gnosisscan.io/tx/0xdcbfa037f2c6c7456022df0632ec8d6a75d0f9a195238eec679d5d26895eb7b1 - GNOSIS => (address!("0x6093AeBAC87d62b1A5a4cEec91204e35020E38bE")) - } -); -crate::bindings!( - HoneyswapRouter, - crate::deployments! { - GNOSIS => (address!("0x1C232F01118CB8B424793ae03F870aa7D0ac7f77")) - } -); -crate::bindings!( - PancakeRouter, - crate::deployments! { - // - MAINNET => (address!("0xEfF92A263d31888d860bD50809A8D171709b7b1c")), - // - ARBITRUM_ONE => (address!("0x8cFe327CEc66d1C090Dd72bd0FF11d690C33a2Eb")), - // - BASE => (address!("0x8cFe327CEc66d1C090Dd72bd0FF11d690C33a2Eb")), - // - BNB => (address!("0x10ED43C718714eb63d5aA57B78B54704E256024E")) - } -); -crate::bindings!( - SushiSwapRouter, - // - crate::deployments! { - // - MAINNET => (address!("0xd9e1ce17f2641f24ae83637ab66a2cca9c378b9f")), - // - GNOSIS => (address!("0x1b02da8cb0d097eb8d57a175b88c7d8b47997506")), - // - ARBITRUM_ONE => (address!("0x1b02da8cb0d097eb8d57a175b88c7d8b47997506")), - // - BASE => (address!("0x6bded42c6da8fbf0d2ba55b2fa120c5e0c8d7891")), - // - AVALANCHE => (address!("0x1b02da8cb0d097eb8d57a175b88c7d8b47997506")), - // - BNB => (address!("0x1b02da8cb0d097eb8d57a175b88c7d8b47997506")), - // - OPTIMISM => (address!("0x2abf469074dc0b54d793850807e6eb5faf2625b1")), - // - POLYGON => (address!("0x1b02da8cb0d097eb8d57a175b88c7d8b47997506")), - // Not available on Lens - } -); -crate::bindings!( - SwaprRouter, - // - crate::deployments! { - // - MAINNET => address!("0xb9960d9bca016e9748be75dd52f02188b9d0829f"), - // - GNOSIS => address!("0xE43e60736b1cb4a75ad25240E2f9a62Bff65c0C0"), - // - ARBITRUM_ONE => address!("0x530476d5583724A89c8841eB6Da76E7Af4C0F17E"), - // Not available on Base and Lens - } -); -crate::bindings!(ISwaprPair); -crate::bindings!( - TestnetUniswapV2Router02, - crate::deployments! { - // - SEPOLIA => address!("0x86dcd3293C53Cf8EFd7303B57beb2a3F671dDE98"), - } -); -crate::bindings!( - UniswapV2Factory, - // - crate::deployments! { - // - MAINNET => address!("0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f"), - // - GNOSIS => address!("0xA818b4F111Ccac7AA31D0BCc0806d64F2E0737D7"), - // - ARBITRUM_ONE => address!("0xf1D7CC64Fb4452F05c498126312eBE29f30Fbcf9"), - // - BASE => address!("0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6"), - // - SEPOLIA => address!("0xF62c03E08ada871A0bEb309762E260a7a6a880E6"), - // - AVALANCHE => address!("0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C"), - // - BNB => address!("0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6"), - // - OPTIMISM => address!("0x0c3c1c532F1e39EdF36BE9Fe0bE1410313E074Bf"), - // - POLYGON => address!("0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C"), - // Not available on Lens - } -); -crate::bindings!( - UniswapV2Router02, - // - crate::deployments! { - // - MAINNET => address!("0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D"), - // - GNOSIS => address!("0x1C232F01118CB8B424793ae03F870aa7D0ac7f77"), - // - ARBITRUM_ONE => address!("0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24"), - // - BASE => address!("0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24"), - // - SEPOLIA => address!("0xeE567Fe1712Faf6149d80dA1E6934E354124CfE3"), - // - AVALANCHE => address!("0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24"), - // - BNB => address!("0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24"), - // - OPTIMISM => address!("0x4A7b5Da61326A6379179b40d00F57E5bbDC962c2"), - // - POLYGON => address!("0xedf6066a2b290C185783862C7F4776A2C8077AD1"), - // Not available on Lens - } -); -crate::bindings!(IUniswapLikeRouter); -crate::bindings!(IUniswapLikePair); -crate::bindings!(UniswapV3Pool); -crate::bindings!( - UniswapV3QuoterV2, - crate::deployments! { - // - MAINNET => address!("0x61fFE014bA17989E743c5F6cB21bF9697530B21e"), - ARBITRUM_ONE => address!("0x61fFE014bA17989E743c5F6cB21bF9697530B21e"), - BASE => address!("0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a"), - AVALANCHE => address!("0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F"), - BNB => address!("0x78D78E420Da98ad378D7799bE8f4AF69033EB077"), - OPTIMISM => address!("0x61fFE014bA17989E743c5F6cB21bF9697530B21e"), - POLYGON => address!("0x61fFE014bA17989E743c5F6cB21bF9697530B21e"), - LENS => address!("0x1eEA2B790Dc527c5a4cd3d4f3ae8A2DDB65B2af1"), - LINEA => address!("0x42bE4D6527829FeFA1493e1fb9F3676d2425C3C1"), - // not official - PLASMA => address!("0xaa52bB8110fE38D0d2d2AF0B85C3A3eE622CA455"), - // Not listed on Gnosis and Sepolia chains - } -); -crate::bindings!( - UniswapV3SwapRouterV2, - crate::deployments! { - // - ARBITRUM_ONE => address!("0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"), - MAINNET => address!("0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"), - POLYGON => address!("0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"), - OPTIMISM => address!("0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45"), - BASE => address!("0x2626664c2603336E57B271c5C0b26F421741e481"), - AVALANCHE => address!("0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE"), - BNB => address!("0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2"), - LENS => address!("0x6ddD32cd941041D8b61df213B9f515A7D288Dc13"), - LINEA => address!("0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a"), - // not official - PLASMA => address!("0x807F4E281B7A3B324825C64ca53c69F0b418dE40"), - // Not available on Gnosis Chain - } -); -crate::bindings!( - IUniswapV3Factory, - crate::deployments! { - // - MAINNET => address!( "0x1F98431c8aD98523631AE4a59f267346ea31F984"), - SEPOLIA => address!( "0x1F98431c8aD98523631AE4a59f267346ea31F984"), - ARBITRUM_ONE => address!( "0x1F98431c8aD98523631AE4a59f267346ea31F984"), - BASE => address!( "0x33128a8fC17869897dcE68Ed026d694621f6FDfD"), - AVALANCHE => address!( "0x740b1c1de25031C31FF4fC9A62f554A55cdC1baD"), - BNB => address!( "0xdB1d10011AD0Ff90774D0C6Bb92e5C5c8b4461F7"), - OPTIMISM => address!( "0x1F98431c8aD98523631AE4a59f267346ea31F984"), - POLYGON => address!( "0x1F98431c8aD98523631AE4a59f267346ea31F984"), - // not official - LENS => address!( "0xc3A5b857Ba82a2586A45a8B59ECc3AA50Bc3D0e3"), - LINEA => address!("0x31FAfd4889FA1269F7a13A66eE0fB458f27D72A9"), - PLASMA => address!("0xcb2436774C3e191c85056d248EF4260ce5f27A9D"), // Contract Name: BulbaV3Factory - // Not available on Gnosis Chain - } -); - -crate::bindings!( - HooksTrampoline, - // - crate::deployments! { - MAINNET => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), - // Gnosis is using the old instance of the hook trampoline since it's hardcoded in gnosis pay rebalance integration. - GNOSIS => address!("0x01DcB88678aedD0C4cC9552B20F4718550250574"), - SEPOLIA => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), - ARBITRUM_ONE => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), - BASE => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), - AVALANCHE => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), - BNB => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), - OPTIMISM => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), - POLYGON => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), - LENS => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), - // compiled with an older, linea-compatible evm version - LINEA => address!("0xeFcf0d30DB41Ae0b136c5E3B4340dFeE2D099Ada"), - PLASMA => address!("0x60Bf78233f48eC42eE3F101b9a05eC7878728006"), - } -); - -crate::bindings!( - CoWSwapEthFlow, - crate::deployments! { - // - MAINNET => (address!("0x40a50cf069e992aa4536211b23f286ef88752187"), 16169866), - // - GNOSIS => (address!("0x40a50cf069e992aa4536211b23f286ef88752187"), 25414331), - // - // - SEPOLIA => (address!("0x0b7795E18767259CC253a2dF471db34c72B49516"), 4718739), - // - ARBITRUM_ONE => (address!("0x6DFE75B5ddce1ADE279D4fa6BD6AeF3cBb6f49dB"), 204747458), - // - BASE => (address!("0x3C3eA1829891BC9bEC3d06A81d5d169e52a415e3"), 21490258), - // - AVALANCHE => (address!("0x04501b9b1d52e67f6862d157e00d13419d2d6e95"), 60496408), - // - BNB => (address!("0x04501b9b1d52e67f6862d157e00d13419d2d6e95"), 48411237), - // - OPTIMISM => (address!("0x04501b9b1d52e67f6862d157e00d13419d2d6e95"), 134607215), - // - POLYGON => (address!("0x04501b9b1d52e67f6862d157e00d13419d2d6e95"), 71296258), - // - LENS => (address!("0xFb337f8a725A142f65fb9ff4902d41cc901de222"), 3007173), - // - LINEA => (address!("0x04501b9b1d52e67f6862d157e00d13419d2d6e95"), 24522097), - // - PLASMA => (address!("0x04501b9b1d52e67f6862d157e00d13419d2d6e95"), 3521855), - } -); -crate::bindings!(CoWSwapOnchainOrders); -crate::bindings!(ERC1271SignatureValidator); - -// Used in the gnosis/solvers repo for the balancer solver -crate::bindings!( - BalancerQueries, - crate::deployments! { - // - MAINNET => (address!("0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5"), 15188261), - // - ARBITRUM_ONE => (address!("0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5"), 18238624), - // - OPTIMISM => (address!("0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5"), 15288107), - // - BASE => (address!("0x300Ab2038EAc391f26D9F895dc61F8F66a548833"), 1205869), - // - GNOSIS => (address!("0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e"), 24821845), - // - POLYGON => (address!("0xE39B5e3B6D74016b2F6A9673D7d7493B6DF549d5"), 30988035), - // - AVALANCHE => (address!("0xC128468b7Ce63eA702C1f104D55A2566b13D3ABD"), 26387068), - // Not available on Lens, Linea and Plasma - } -); - -crate::bindings!( - LiquoriceSettlement, - crate::deployments! { - // - MAINNET => address!("0x0448633eb8B0A42EfED924C42069E0DcF08fb552"), - ARBITRUM_ONE => address!("0x0448633eb8B0A42EfED924C42069E0DcF08fb552"), - } -); - -crate::bindings!( - FlashLoanRouter, - crate::deployments! { - MAINNET => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), - GNOSIS => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), - SEPOLIA => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), - ARBITRUM_ONE => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), - BASE => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), - POLYGON => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), - AVALANCHE => address!("0x9da8b48441583a2b93e2ef8213aad0ec0b392c69"), - } -); - -crate::bindings!(ICowWrapper); - -// Only used in -crate::bindings!( - Permit2, - crate::deployments! { - // - MAINNET => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 15986406), - // - GNOSIS => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 27338672), - // - SEPOLIA => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 2356287), - // - ARBITRUM_ONE => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 38692735), - // - BASE => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 1425180), - // - AVALANCHE => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 28844415), - // - BNB => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 25343783), - // - OPTIMISM => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 38854427), - // - POLYGON => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 35701901), - // - PLASMA => (address!("0x000000000022D473030F116dDEE9F6B43aC78BA3"), 7808), - } -); - -crate::bindings!( - GPv2AllowListAuthentication, - crate::deployments! { - // - MAINNET => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 12593263), - // - GNOSIS => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 16465099), - // - SEPOLIA => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 4717469), - // - ARBITRUM_ONE => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 204702129), - // - BASE => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 21407137), - // - AVALANCHE => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 59891351), - // - BNB => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 48173639), - // - OPTIMISM => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 134254466), - // - POLYGON => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 45854728), - // - LENS => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 2612937), - // - LINEA => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 24333100), - // - PLASMA => (address!("0x2c4c28DDBdAc9C5E7055b4C863b72eA0149D8aFE"), 3439709), - } -); - -crate::bindings!( - GPv2Settlement, - crate::deployments! { - // - MAINNET => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 12593265), - // - GNOSIS => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 16465100), - // - SEPOLIA => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 4717488), - // - ARBITRUM_ONE => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 204704802), - // - BASE => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 21407238), - // - AVALANCHE => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 59891356), - // - BNB => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 48173641), - // - OPTIMISM => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 134254624), - // - POLYGON => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 45859743), - // - LENS => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 2621745), - // - LINEA => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 24333100), - // - PLASMA => (address!("0x9008D19f58AAbD9eD0D60971565AA8510560ab41"), 3439711), - } -); - -crate::bindings!( - WETH9, - crate::deployments! { - // Note: the WETH address must be consistent with the one used by the ETH-flow - // contract - MAINNET => address!("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"), - GNOSIS => address!("0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d"), - SEPOLIA => address!("0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14"), - ARBITRUM_ONE => address!("0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"), - BASE => address!("0x4200000000000000000000000000000000000006"), - AVALANCHE => address!("0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7"), - BNB => address!("0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"), - OPTIMISM => address!("0x4200000000000000000000000000000000000006"), - POLYGON => address!("0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270"), - LENS => address!("0x6bDc36E20D267Ff0dd6097799f82e78907105e2F"), - LINEA => address!("0xe5d7c2a44ffddf6b295a15c148167daaaf5cf34f"), - PLASMA => address!("0x6100E367285b01F48D07953803A2d8dCA5D19873"), - } -); - -crate::bindings!(ERC20); - -pub mod cow_amm { - crate::bindings!(CowAmm); - crate::bindings!( - CowAmmConstantProductFactory, - crate::deployments! { - // - MAINNET => (address!("0x40664207e3375FB4b733d4743CE9b159331fd034"), 19861952), - // - GNOSIS => (address!("0xdb1cba3a87f2db53b6e1e6af48e28ed877592ec0"), 33874317), - // - SEPOLIA => (address!("0xb808e8183e3a72d196457d127c7fd4befa0d7fd3"), 5874562), - } - ); - crate::bindings!( - CowAmmLegacyHelper, - crate::deployments! { - // - MAINNET => (address!("0x3705ceee5eaa561e3157cf92641ce28c45a3999c"), 20332745), - // - GNOSIS => (address!("0xd9ec06b001957498ab1bc716145515d1d0e30ffb"), 35026999), - } - ); - crate::bindings!(CowAmmUniswapV2PriceOracle); - crate::bindings!(CowAmmFactoryGetter); -} - -pub mod support { - // Support contracts used for trade and token simulations. - crate::bindings!(AnyoneAuthenticator); - crate::bindings!(Solver); - crate::bindings!(Spardose); - crate::bindings!(Trader); - // Support contract used for solver fee simulations in the gnosis/solvers repo. - crate::bindings!(Swapper); - crate::bindings!( - Signatures, - crate::deployments! { - MAINNET => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), - ARBITRUM_ONE => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), - BASE => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), - AVALANCHE => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), - BNB => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), - OPTIMISM => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), - POLYGON => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), - LENS => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), - GNOSIS => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), - SEPOLIA => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), - // built with evm=London, because deployment reverts on Linea otherwise - LINEA => address!("0xf6E57e72F7dB3D9A51a8B4c149C00475b94A37e4"), - PLASMA => address!("0x8262d639c38470F38d2eff15926F7071c28057Af"), - } - ); - // Support contracts used for various order simulations. - crate::bindings!( - Balances, - crate::deployments! { - MAINNET => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), - ARBITRUM_ONE => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), - BASE => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), - AVALANCHE => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), - BNB => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), - OPTIMISM => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), - POLYGON => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), - LENS => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), - GNOSIS => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), - SEPOLIA => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), - PLASMA => address!("0x3e8C6De9510e7ECad902D005DE3Ab52f35cF4f1b"), - // built with evm=London, because deployment reverts on Linea otherwise - LINEA => address!("0x361350f708f7c0c63c8a505226592c3e5d1faa29"), - } - ); -} - -pub mod test { - // Test Contract for using up a specified amount of gas. - crate::bindings!(GasHog); - // Test Contract for incrementing arbitrary counters. - crate::bindings!(Counter); - // Token with support for `permit` (for pre-interaction tests) - crate::bindings!( - CowProtocolToken, - crate::deployments! { - MAINNET => address!("0xDEf1CA1fb7FBcDC777520aa7f396b4E015F497aB"), - GNOSIS => address!("0x177127622c4A00F3d409B75571e12cB3c8973d3c"), - SEPOLIA => address!("0x0625aFB445C3B6B7B929342a04A22599fd5dBB59"), - ARBITRUM_ONE => address!("0xcb8b5CD20BdCaea9a010aC1F8d835824F5C87A04"), - BASE => address!("0xc694a91e6b071bF030A18BD3053A7fE09B6DaE69"), - } - ); -} - -pub use alloy::providers::DynProvider as Provider; - -/// Extension trait to attach some useful functions to the contract instance. -pub trait InstanceExt: Sized { - /// Crates a contract instance at the expected address for the current - /// network. - fn deployed( - provider: &Provider, - ) -> impl std::future::Future> + Send; -} - -/// Build a `HashMap)>` from entries like: -/// `CHAIN_ID => address!("0x…")` // block = None -/// `CHAIN_ID => (address!("0x…"), 12_345_678)` // block = Some(…) -#[macro_export] -macro_rules! deployments { - (@acc $m:ident; ) => {}; - - // Tuple form with trailing comma: CHAIN => (addr, block), - (@acc $m:ident; $chain:expr => ( $addr:expr, $block:expr ), $($rest:tt)* ) => { - $m.insert($chain, ($addr, Some($block))); - $crate::deployments!(@acc $m; $($rest)*); - }; - - // Address-only form with trailing comma: CHAIN => addr, - (@acc $m:ident; $chain:expr => $addr:expr, $($rest:tt)* ) => { - $m.insert($chain, ($addr, None::)); - $crate::deployments!(@acc $m; $($rest)*); - }; - - // Tuple form without trailing comma (last entry). - (@acc $m:ident; $chain:expr => ( $addr:expr, $block:expr ) ) => { - $m.insert($chain, ($addr, Some($block))); - }; - - // Address-only form without trailing comma (last entry). - (@acc $m:ident; $chain:expr => $addr:expr ) => { - $m.insert($chain, ($addr, None::)); - }; - - ( $($rest:tt)* ) => {{ - let mut m = ::std::collections::HashMap::new(); - $crate::deployments!(@acc m; $($rest)*); - m - }}; -} - -#[macro_export] -macro_rules! bindings { - ($contract:ident $(, $deployment_info:expr)?) => { - paste::paste! { - // Generate the main bindings in a private module. That allows - // us to re-export all items in our own module while also adding - // some items ourselves. - #[expect(non_snake_case)] - mod [<$contract Private>] { - alloy::sol!( - #[allow(missing_docs, clippy::too_many_arguments)] - #[sol(rpc, all_derives)] - $contract, - concat!("./artifacts/", stringify!($contract), ".json"), - ); - } - - #[expect(non_snake_case)] - pub mod $contract { - use alloy::providers::DynProvider; - - pub use super::[<$contract Private>]::*; - pub type Instance = $contract::[<$contract Instance>]; - - $( - use { - std::sync::LazyLock, - anyhow::Result, - std::collections::HashMap, - alloy::{ - providers::Provider, - primitives::{address, Address}, - }, - anyhow::Context, - $crate::alloy::networks::*, - }; - - static DEPLOYMENT_INFO: LazyLock)>> = LazyLock::new(|| { - $deployment_info - }); - - /// Returns the contract's deployment block (if one exists) for the given chain. - pub fn deployment_block(chain_id: &u64) -> Option { - DEPLOYMENT_INFO.get(chain_id).map(|(_, block)| *block).flatten() - } - - /// Returns the contract's deployment address (if one exists) for the given chain. - pub fn deployment_address(chain_id: &u64) -> Option { - DEPLOYMENT_INFO.get(chain_id).map(|(addr, _)| *addr) - } - - impl $crate::alloy::InstanceExt for Instance { - fn deployed(provider: &DynProvider) -> impl Future> + Send { - async move { - let chain_id = provider - .get_chain_id() - .await - .context("could not fetch current chain id")?; - - let (address, _deployed_block) = *DEPLOYMENT_INFO - .get(&chain_id) - .with_context(|| format!("no deployment info for chain {chain_id:?}"))?; - - Ok(Instance::new( - address, - provider.clone(), - )) - } - } - } - )* - } - } - }; -} - -#[cfg(test)] -mod tests { - use super::networks::*; - use super::*; - - #[test] - fn test_has_address() { - assert!(BaoswapRouter::deployment_address(&GNOSIS).is_some()); - assert!(HoneyswapRouter::deployment_address(&GNOSIS).is_some()); - - for chain_id in &[MAINNET, ARBITRUM_ONE, BASE, BNB] { - assert!(PancakeRouter::deployment_address(chain_id).is_some()); - } - - for chain_id in &[ - MAINNET, - GNOSIS, - ARBITRUM_ONE, - BASE, - AVALANCHE, - BNB, - OPTIMISM, - POLYGON, - ] { - assert!(SushiSwapRouter::deployment_address(chain_id).is_some()); - } - - for chain_id in &[MAINNET, GNOSIS, ARBITRUM_ONE] { - assert!(SwaprRouter::deployment_address(chain_id).is_some()); - } - - assert!(TestnetUniswapV2Router02::deployment_address(&SEPOLIA).is_some()); - - for chain_id in &[ - MAINNET, - GNOSIS, - ARBITRUM_ONE, - BASE, - SEPOLIA, - AVALANCHE, - BNB, - OPTIMISM, - POLYGON, - ] { - assert!(UniswapV2Factory::deployment_address(chain_id).is_some()); - assert!(UniswapV2Router02::deployment_address(chain_id).is_some()); - } - - for chain_id in &[ - MAINNET, - ARBITRUM_ONE, - BASE, - AVALANCHE, - BNB, - OPTIMISM, - POLYGON, - LENS, - LINEA, - PLASMA, - ] { - assert!(UniswapV3QuoterV2::deployment_address(chain_id).is_some()); - } - - for chain_id in &[ - MAINNET, - ARBITRUM_ONE, - BASE, - AVALANCHE, - BNB, - OPTIMISM, - POLYGON, - LENS, - LINEA, - PLASMA, - ] { - assert!(UniswapV3SwapRouterV2::deployment_address(chain_id).is_some()); - } - - for chain_id in &[ - MAINNET, - SEPOLIA, - ARBITRUM_ONE, - BASE, - AVALANCHE, - BNB, - OPTIMISM, - POLYGON, - LENS, - LINEA, - PLASMA, - ] { - assert!(IUniswapV3Factory::deployment_address(chain_id).is_some()); - } - - for chain_id in &[ - MAINNET, - GNOSIS, - SEPOLIA, - ARBITRUM_ONE, - BASE, - AVALANCHE, - BNB, - OPTIMISM, - POLYGON, - PLASMA, - ] { - assert!(Permit2::deployment_address(chain_id).is_some()); - } - - for chain_id in &[ - MAINNET, - GNOSIS, - SEPOLIA, - ARBITRUM_ONE, - BASE, - AVALANCHE, - OPTIMISM, - PLASMA, - ] { - assert!(BalancerV3BatchRouter::deployment_address(chain_id).is_some()); - } - } -}