diff --git a/.gitmodules b/.gitmodules index a0f64b060..32ecc6a68 100644 --- a/.gitmodules +++ b/.gitmodules @@ -47,3 +47,9 @@ [submodule "protocol-units/settlement/mcr/contracts/lib/solidity-bytes-utils"] path = protocol-units/settlement/mcr/contracts/lib/solidity-bytes-utils url = https://github.com/GNSPS/solidity-bytes-utils.git +[submodule "protocol-units/tokens/mainnet/hyperliquid/lib/forge-std"] + path = protocol-units/tokens/mainnet/hyperliquid/lib/forge-std + url = https://github.com/foundry-rs/forge-std +[submodule "protocol-units/tokens/mainnet/hyperliquid/lib/devtools"] + path = protocol-units/tokens/mainnet/hyperliquid/lib/devtools + url = https://github.com/LayerZero-Labs/devtools diff --git a/package.json b/package.json index b7bb72125..9d78b1c3f 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "dependencies": { + "dotenv": "^17.2.3", "pnpm": "^9.4.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b11ff3d9a..832ae622b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,19 @@ importers: .: dependencies: + dotenv: + specifier: ^17.2.3 + version: 17.2.3 pnpm: specifier: ^9.4.0 version: 9.4.0 packages: + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + engines: {node: '>=12'} + pnpm@9.4.0: resolution: {integrity: sha512-9Um4pSydK4U2di+ZwHIiBe/Fr5E+d4NdvMw7CwssqefcgCK3gGLBcpHEjoh0nHDOiOtadPH6jEv14Yu0bIvYOg==} engines: {node: '>=18.12'} @@ -21,4 +28,6 @@ packages: snapshots: + dotenv@17.2.3: {} + pnpm@9.4.0: {} diff --git a/protocol-units/settlement/mcr/contracts/layerzero_book/LZAddresses.sol b/protocol-units/settlement/mcr/contracts/layerzero_book/LZAddresses.sol new file mode 100644 index 000000000..ae4aa5ce8 --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/layerzero_book/LZAddresses.sol @@ -0,0 +1,6684 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +// Auto-generated from LayerZero metadata - do not edit manually +// Source: https://metadata.layerzero-api.com/v1/metadata/deployments +// Generated: 2025-11-14T18:53:15.208645 +// DATA_HASH: 0xcff32e017b042a79cd390676510f0f99a7770899405b9b76c8c5a0bf0a184702 + +import {ILayerZeroEndpointV2} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import {IMessageLib} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLib.sol"; + +// DATA_HASH for provenance tracking (LZIP spec requirement) +bytes32 constant LZ_ADDRESSES_DATA_HASH = 0xcff32e017b042a79cd390676510f0f99a7770899405b9b76c8c5a0bf0a184702; + + +library LayerZeroV2AbstractMainnet { + // Chain metadata + uint32 internal constant EID = 30324; + uint256 internal constant CHAIN_ID = 2741; + string internal constant CHAIN_KEY = "abstract-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x5c6cfF4b7C49805F8295Ff73C204ac83f3bC4AE7); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x2B79f3C2EE059E465a24bf5A2F4FE989546053B1); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x166CAb679EBDB0853055522D3B523621b94029a1); + address internal constant BLOCKED_MESSAGE_LIB = 0x3258287147FB7887d8A643006e26E19368057377; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x9d799c1935c51CA399e6465Ed9841DEbCcEc413E); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x52fFEeaE5Ffa89D4b31c72F87ead3699FCB79e40; + address internal constant EXECUTOR = 0x643E1471f37c4680Df30cF0C540Cd379a0fF58A5; + address internal constant DEAD_DVN = 0x06e56abD0cb3C88880644bA3C534A498cA18E5C8; + address internal constant LZ_EXECUTOR = 0x068EC1f0bd53cf86923BbB0986046be6af3f5922; +} + +library LayerZeroV2DVNAbstractMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xCB773CAf620D2A6703d2cd30C567A6c2906ccfbb; + // Frax [frax] + address internal constant DVN_FRAX = 0xA8c83FEbAb692d6F08cfA303e5D53B3B34F9046d; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xD45174e7654977e8bc3D0648D06c89401978A65a; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x264fE346Fcd0A89E3B41A6499BAC80dEa7e908D2; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x06e56abD0cb3C88880644bA3C534A498cA18E5C8; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x02A7Bf7298D17C12181578fF474c17C922aAd75A; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0xF4DA94b4EE9D8e209e3bf9f469221CE2731A7112; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x022dA66B230da7EFdEEd802DFC77EE8dD258E2C8; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x05Db3a229293C09F639a16526bB2481704716Df0; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xc4A1F52fDA034A9A5E1B3b27D14451d15776Fef6; + // P2P [p2p] + address internal constant DVN_P2P = 0x52B7E1958F6Ad3E195DC30578dA5Fa7ac5827A2A; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xCec9f0A49073ac4a1C439D06cb9448512389a64E; + // Ubisoft [ubisoft] + address internal constant DVN_UBISOFT = 0x62aA89bAd332788021F6F4F4Fb196D5Fe59C27a6; +} + +library LayerZeroV2AnimechainMainnet { + // Chain metadata + uint32 internal constant EID = 30372; + uint256 internal constant CHAIN_ID = 69000; + string internal constant CHAIN_KEY = "animechain-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNAnimechainMainnet { + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x9E0E95Ede70F680f74480b510FF9f45C70e3da80; +} + +library LayerZeroV2ApeMainnet { + // Chain metadata + uint32 internal constant EID = 30312; + uint256 internal constant CHAIN_ID = 33139; + string internal constant CHAIN_KEY = "ape-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x1641D737e97916f1400CB6BA032eceE765484D9C); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNApeMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x9bB011796fC3604D3a4FaA5863f587a33F6224AF; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x452646362D5Fe81CFdA49bBF620bE480358c0663; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x965A80Dc87cec5848310E612DeAD84B543AeF874; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x07653d28b0f53D4c54b70eb1f9025795B23a9D6e; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xb2e6E01a5BeF9Bf25F00105Dc7E47542f750DE68; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x794C0b0071D4A926c443468f027912e693678151; + // TSS [tss] + address internal constant DVN_TSS = 0xA2Eb037Ee6AABa1547fCa8804392EB8EF9c33976; +} + +library LayerZeroV2ApexfusionnexusMainnet { + // Chain metadata + uint32 internal constant EID = 30384; + uint256 internal constant CHAIN_ID = 9069; + string internal constant CHAIN_KEY = "apexfusionnexus-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNApexfusionnexusMainnet { + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x70BF42C69173d6e33b834f59630DAC592C70b369; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x313328609a9C38459CaE56625FFf7F2AD6dcde3b; +} + +library LayerZeroV2ArbitrumMainnet { + // Chain metadata + uint32 internal constant EID = 30110; + uint256 internal constant CHAIN_ID = 42161; + string internal constant CHAIN_KEY = "arbitrum-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0xbcd4CADCac3F767C57c4F402932C4705DF62BEFf); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x975bcD720be66659e3EB3C0e4F1866a3020E493A); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x7B9E184e07a6EE1aC23eAe0fe8D6Be2f663f05e6); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x5440E2097C41F8e0a8551521d569c71de70fDe23; + address internal constant EXECUTOR = 0x31CAe3B7fB82d847621859fb1585353c5720660D; + address internal constant DEAD_DVN = 0x758C419533ad64Ce9D3413BC8d3A97B026098EC1; + address internal constant LZ_EXECUTOR = 0x6862dEd20594DA16B7cbB282894FaE23043A32BC; +} + +library LayerZeroV2DVNArbitrumMainnet { + // 01node [01node] + address internal constant DVN_01NODE = 0x7A205ED4e3d7f9d0777594501705D8CD405c3B05; + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB = 0xF0e40968e27F63B3b0a0b3BAAC4A274149376591; + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB_2 = 0xddaa92ce2d2faC3f7c5eae19136E438902Ab46cc; + // AltLayer [altlayer] + address internal constant DVN_ALTLAYER = 0x8Ede21203E062D7D1EAeC11c4c72Ad04cDc15658; + // Axelar [axelar] + address internal constant DVN_AXELAR = 0x9D3979c7E3DD26653C52256307709C09f47741e0; + // BCW [bcw] + address internal constant DVN_BCW = 0x78203678D264063815Dac114eA810E9837Cd80f7; + // BCW [bcw] + address internal constant DVN_BCW_2 = 0x05ce650134d943c5E336dc7990e84FB4e69Fdf29; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0x9bCd17A654bffAa6f8fEa38D19661a7210e22196; + // Bera [bera] + address internal constant DVN_BERA = 0xf2e89Ed7E342c708BA8CD79b293AD9244f5FCcb3; + // Bitgo (deprecated) [bitgo] + address internal constant DVN_BITGO = 0x4A6B9962945D866F53fd114bB76B38B8791B8C1d; + // Bitgo [bitgo] + address internal constant DVN_BITGO_2 = 0x0711dd777AE626ef5E0a4F50e199C7a0E0666857; + // Blockhunters [blockhunters] + address internal constant DVN_BLOCKHUNTERS = 0xD074B6bbCBEC2f2B4c4265DE3D95e521f82bF669; + // Canary [canary] + address internal constant DVN_CANARY = 0xf2E380c90e6c09721297526dbC74f870e114dfCb; + // Chainlink [ccip] + address internal constant DVN_CHAINLINK = 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539; + // Curve [curve] + address internal constant DVN_CURVE = 0x4066b6e7BfD761B579902E7e8D03F4feb9B9536E; + // Delegate [delegate] + address internal constant DVN_DELEGATE = 0xdf30C9f6A70cE65A152c5Bd09826525D7E97Ba49; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0xEae839784e5F6C79bBaf34b6023a2f62e134AB39; + // Flowdesk [flowdesk] + address internal constant DVN_FLOWDESK = 0xc07125d75BfA05A0108De0f64c4D6Ebb12B357F6; + // Frax [frax] + address internal constant DVN_FRAX = 0xB42726e41dBE96fc4ea6d73Cd792167608353698; + // Gitcoin (deprecated) [gitcoin] + address internal constant DVN_GITCOIN = 0x313328609a9C38459CaE56625FFf7F2AD6dcde3b; + // Gitcoin [gitcoin] + address internal constant DVN_GITCOIN_2 = 0x82c1D3209E32BEB7A55069B2C8AF5b6F62e2DBD1; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x19670Df5E16bEa2ba9b9e68b48C054C5bAEa06B8; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x5cfF49d69D79d677Dd3E5B38E048A0DCB6d86aaf; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x758C419533ad64Ce9D3413BC8d3A97B026098EC1; + // Lagrange [lagrange-labs] + address internal constant DVN_LAGRANGE = 0x021e401C2a1A60618c5E6353A40524971Eba1E8D; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x2f55C492897526677C5B68fb199ea31E2c126416; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x1308151a7ebaC14f435d3Ad5fF95c34160D539A5; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x54dD79f5cE72b51FCBbcb170Dd01E32034323565; + // MIM [mim] + address internal constant DVN_MIM = 0x9E930731cb4A6bf7eCc11F695A295c60bDd212eB; + // Mantle Bank [mantle-bank] + address internal constant DVN_MANTLE_BANK = 0x50fF206140CadADA2d9d510F1A184Be9221d86cF; + // Muon [muon] + address internal constant DVN_MUON = 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0x01F9aAD7c53626bF8807d640D9Ddf852254D6f63; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x14E570a1684c7ca883b35e1B25D2F7CEc98a16cd; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xa7b5189bcA84Cd304D8553977c7C614329750d99; + // Nocturnal [nocturnal-labs] + address internal constant DVN_NOCTURNAL = 0xfDd2e77A6adDC1e18862f43297500d2eBFbD94ac; + // Nodesguru [nodes-guru] + address internal constant DVN_NODESGURU = 0xD954bF7968eF68875c9100c9ec890f969504d120; + // Nodit [nodit] + address internal constant DVN_NODIT = 0x4c41b4EDf85DEe828C2cFcc80019CB2BbCFb69a5; + // Omnicat [omnicat] + address internal constant DVN_OMNICAT = 0xd1C70192CC0eb9a89e3D9032b9FAcab259A0a1e9; + // Omnix [omni-x] + address internal constant DVN_OMNIX = 0xabEa0b6B9237b589e676dC16f6D74Bf7612591f4; + // Ondo (deprecated) [ondo] + address internal constant DVN_ONDO = 0x4708a19824bfe71262A91cDefA36ce21CBFfafE1; + // Ondo Staging [ondo-staging] + address internal constant DVN_ONDO_STAGING = 0x2f2F1c6025E8Da125e2Afd73BA17d3cBDfE3d093; + // P2P [p2p] + address internal constant DVN_P2P = 0xB3Ce0A5D132Cd9Bf965aBa435E650c55Edce0062; + // POPS [p-ops-team] + address internal constant DVN_POPS = 0x8fa9eEf18c2A1459024f0B44714e5aCc1Ce7f5e8; + // Paxos [paxos] + address internal constant DVN_PAXOS = 0x8E5f5825602Bc5db725974Bb9e60677d4adC5fbe; + // Planetarium [planetarium-labs] + address internal constant DVN_PLANETARIUM = 0xe6CD8c2E46Ef396DF88048449e5B1C75172b40C3; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Restake [restake] + address internal constant DVN_RESTAKE = 0x969A0bdd86A230345AD87A6a381DE5ED9E6cda85; + // Shrapnel [mercury] + address internal constant DVN_SHRAPNEL = 0x7B8a0fD9D6ae5011d5cBD3E85Ed6D5510F98c9Bf; + // Stablelab [stablelab] + address internal constant DVN_STABLELAB = 0xcd37CA043f8479064e10635020c65FfC005d36f6; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0xb0646Fb9028364aC1f04477271375EF32A8A5e62; + // Stakingcabin (deprecated) [stakingcabin] + address internal constant DVN_STAKINGCABIN_2 = 0x6268950B2d11AA0516007b6361f6ee3faCb3Cb14; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x5756a74e8e18D8392605bA667171962B2b2826B5; + // Superduper [portal] + address internal constant DVN_SUPERDUPER = 0x539008c98B17803A273eDf98aBA2d4414Ee3f4D7; + // Superform [superform] + address internal constant DVN_SUPERFORM = 0x5496d03d9065B08e5677E1c5D1107110Bb05d445; + // Switchboard [switchboard] + address internal constant DVN_SWITCHBOARD = 0xcced05c3667877B545285B25f19F794436A1c481; + // TSS [tss] + address internal constant DVN_TSS = 0xA0Cc33Dd6f4819D473226257792AFe230EC3c67f; + // Tapioca [pearlnet] + address internal constant DVN_TAPIOCA = 0xabC9b1819cc4D9846550F928B985993cF6240439; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0xa8b8575fA41c305953F519C7D288cd7741727C7b; + // Ubisoft [ubisoft] + address internal constant DVN_UBISOFT = 0x77aAF86B4466A67869667BaBe02c6Ebe7E7791d6; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0xeCB3ac94976F11a53ae74Af1f36FB89E247FAEEF; + // Wyoming [wyoming] + address internal constant DVN_WYOMING = 0xcB1b1d524D013a32E976A5963bd541C388Ec0517; + // Zeeve [zeeve] + address internal constant DVN_ZEEVE = 0x7151c89f6ba70d6aB845289E4ec706530FfAF3CB; + // Zenrock (deprecated) [zenrock] + address internal constant DVN_ZENROCK = 0x3b65E87E2A4690f14cae0483014259DeD8215adc; +} + +library LayerZeroV2AstarMainnet { + // Chain metadata + uint32 internal constant EID = 30210; + uint256 internal constant CHAIN_ID = 592; + string internal constant CHAIN_KEY = "astar-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x30C3074669d866933db74DF1Fbe4b3703e6ec139); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xF08f13c080fcc530B1C21DE827C27B7b66874DDc); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x62b2Ff8D0F725f5529F277F115084EBf9B4A5FAA; + address internal constant EXECUTOR = 0x3C5575898f59c097681d1Fc239c2c6Ad36B7b41c; + address internal constant DEAD_DVN = 0x6626D0739b2B04b70b372394274EB77CAd0824b2; + address internal constant LZ_EXECUTOR = 0x1b8ec4C50b0905334f6F73D1C1a64bA6e15BDaB8; +} + +library LayerZeroV2DVNAstarMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7A7dDC46882220a075934f40380d3A7e1e87d409; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Canary [canary] + address internal constant DVN_CANARY = 0x31B8c7CD7226eA79E833FaBDcCbcA0fa38d6E0a1; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6626D0739b2B04b70b372394274EB77CAd0824b2; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xE1975c47779EdAaABa31F64934A33Affd3CE15c2; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xB19A9370D404308040A9760678c8Ca28aFfbbb76; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2AuroraMainnet { + // Chain metadata + uint32 internal constant EID = 30211; + uint256 internal constant CHAIN_ID = 1313161554; + string internal constant CHAIN_KEY = "aurora-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x1aCe9DD1BC743aD036eF2D92Af42Ca70A1159df5); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x000CC1A759bC3A15e664Ed5379E321Be5de1c9B6); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4f8B7a7a346Da5c467085377796e91220d904c15; + address internal constant EXECUTOR = 0xA2b402FFE8dd7460a8b425644B6B9f50667f0A61; + address internal constant DEAD_DVN = 0x412CEc9FC5044bCba04ED6875729540cE35C6C6f; + address internal constant LZ_EXECUTOR = 0x0b5E5452d0c9DA1Bb5fB0664F48313e9667d7820; +} + +library LayerZeroV2DVNAuroraMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x70BF42C69173d6e33b834f59630DAC592C70b369; + // Canary [canary] + address internal constant DVN_CANARY = 0xb4CaA217dD195B3B40eEe24b82c8093c2ea659cd; + // Curve [curve] + address internal constant DVN_CURVE = 0x315b0e76A510607bB0F706B17716F426D5b385b8; + // Frax [frax] + address internal constant DVN_FRAX = 0x045d70bf1939aF0489cb44533750A2E15c92D7D4; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x412CEc9FC5044bCba04ED6875729540cE35C6C6f; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xD4a903930f2c9085586cda0b11D9681EECb20D2f; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x34730f2570E6cff8B1C91FaaBF37D0DD917c4367; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xE11c808bC6099Abc9bE566C9017aa2Ab0f131d35; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2AvalancheMainnet { + // Chain metadata + uint32 internal constant EID = 30106; + uint256 internal constant CHAIN_ID = 43114; + string internal constant CHAIN_KEY = "avalanche-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x8839D3f169f473193423b402BDC4B5c51daAABDc); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x197D1333DEA5Fe0D6600E9b396c7f1B1cFCc558a); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xbf3521d309642FA9B1c91A08609505BA09752c61); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x5cDc927876031B4Ef910735225c425A7Fc8efed9; + address internal constant EXECUTOR = 0x90E595783E43eb89fF07f63d27B8430e6B44bD9c; + address internal constant DEAD_DVN = 0x90cCA24D1338Bd284C25776D9c12f96764Bde5e1; + address internal constant LZ_EXECUTOR = 0x45d7C6808De24F70480d5947cE2081BA8C9C57F5; +} + +library LayerZeroV2DVNAvalancheMainnet { + // 01node [01node] + address internal constant DVN_01NODE = 0xA80AA110f05C9C6140018aAE0C4E08A70f43350d; + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB = 0xab82E9b24004b954985528dAc14D1B020722a3c8; + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB_2 = 0xFfe42DC3927A240f3459e5ec27EAaBD88727173E; + // AltLayer [altlayer] + address internal constant DVN_ALTLAYER = 0x8EfB6b7dC61C6B6638714747d5E6B81a3512b5C3; + // Axelar [axelar] + address internal constant DVN_AXELAR = 0xc390Fd7Ca590a505655eB6c454ed0783C99a2Ea9; + // BCW [bcw] + address internal constant DVN_BCW = 0x7B8a0fD9D6ae5011d5cBD3E85Ed6D5510F98c9Bf; + // BCW [bcw] + address internal constant DVN_BCW_2 = 0x7a42a1C1deBa75756F9Af12bee6B29CFC2BE3d70; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xcFf5b0608Fa638333f66e0dA9d4f1eB906Ac18e3; + // Bera [bera] + address internal constant DVN_BERA = 0xF18F2C3d86Ec9A350D5E10Cb67c614201f210D3D; + // Bitgo (deprecated) [bitgo] + address internal constant DVN_BITGO = 0x07ff86c392588254Ad10F0811dbBcad45f4C7d87; + // Bitgo [bitgo] + address internal constant DVN_BITGO_2 = 0xc18d69d1a83294d0886E1b79f241405F1fA86cB6; + // Blockhunters [blockhunters] + address internal constant DVN_BLOCKHUNTERS = 0xD074B6bbCBEC2f2B4c4265DE3D95e521f82bF669; + // CCIP [ccip] + address internal constant DVN_CCIP = 0xd46270746acBcA85Dab8dE1CE1d71c46C2F2994C; + // Canary [canary] + address internal constant DVN_CANARY = 0xcC49E6fca014c77E1Eb604351cc1E08C84511760; + // Chainlink [ccip] + address internal constant DVN_CHAINLINK = 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539; + // Curve [curve] + address internal constant DVN_CURVE = 0x6821Ea3d3a52421D2b7DF330f2316eD157314d7f; + // Delegate [delegate] + address internal constant DVN_DELEGATE = 0x83d06212b6647B0d0865e730270751e3FDF5036E; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0xbe57e9E7d9eB16B92C6383792aBe28D64a18c0F1; + // EigenZero [eigenzero] + address internal constant DVN_EIGENZERO = 0xD3333aA4fA669D3eB036676ec01CB0ACaaEc0cc0; + // Flowdesk [flowdesk] + address internal constant DVN_FLOWDESK = 0x795c62387ef3022b61F2C705BfBE5d94a78B971d; + // Frax [frax] + address internal constant DVN_FRAX = 0xfe4c37cd401F58eE0bF4D214447bF306C2BBd41B; + // Gitcoin (deprecated) [gitcoin] + address internal constant DVN_GITCOIN = 0xcced05c3667877B545285B25f19F794436A1c481; + // Gitcoin [gitcoin] + address internal constant DVN_GITCOIN_2 = 0xe9d8f20AE42E4634B07b9c994e23CE71c266D205; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x1a5Df1367F21d55B13D5E2f8778AD644BC97aC6d; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x07C05EaB7716AcB6f83ebF6268F8EECDA8892Ba1; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x90cCA24D1338Bd284C25776D9c12f96764Bde5e1; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x0Ffe02DF012299A370D5dd69298A5826EAcaFdF8; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x962F502A63F5FBeB44DC9ab932122648E8352959; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0xE4193136B92bA91402313e95347c8e9FAD8d27d0; + // MIM [mim] + address internal constant DVN_MIM = 0xF45742BbfaBCEe739eA2a2d0BA2dd140F1f2C6A3; + // Muon [muon] + address internal constant DVN_MUON = 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0xc816Afa2f1C4Ab615fE735270D1831fa7D067D15; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xa59BA433ac34D2927232918Ef5B2eaAfcF130BA5; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0x1308151a7ebaC14f435d3Ad5fF95c34160D539A5; + // Nocturnal [nocturnal-labs] + address internal constant DVN_NOCTURNAL = 0xbD836C4c9d2c3fF94718173b463054c3e2c11CF4; + // Nodesguru [nodes-guru] + address internal constant DVN_NODESGURU = 0xD251D8a85cDfC84518b9454EE6a8D017E503F56C; + // Nodit [nodit] + address internal constant DVN_NODIT = 0x0F56cE0cA0595792Db727A21596edc2fd39be444; + // Omnix [omni-x] + address internal constant DVN_OMNIX = 0x21cAF0BCE846AAA78C9f23C5A4eC5988EcBf9988; + // P2P [p2p] + address internal constant DVN_P2P = 0xE94aE34DfCC87A61836938641444080B98402c75; + // POPS [p-ops-team] + address internal constant DVN_POPS = 0x2b8CBEa81315130A4C422e875063362640ddFeB0; + // Paxos (deprecated) [paxos] + address internal constant DVN_PAXOS = 0x41eF29F974FC9F6772654F005271C64210425391; + // Planetarium [planetarium-labs] + address internal constant DVN_PLANETARIUM = 0x2AC038606fff3FB00317B8F0CcFB4081694aCDD0; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Republic [republic-crypto] + address internal constant DVN_REPUBLIC = 0x1feB08B1A53A9710AfcE82D380B8c2833C69a37e; + // Restake [restake] + address internal constant DVN_RESTAKE = 0x377B51593a03B82543c1508fE7e75Aba6acDE008; + // Shrapnel [mercury] + address internal constant DVN_SHRAPNEL = 0x6A110d94e1baA6984A3d904bab37Ae49b90E6B4f; + // Stablelab [stablelab] + address internal constant DVN_STABLELAB = 0x5fddD320a1e29bB466Fa635661b125D51D976f92; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0xb6323Aa5A3FC07d93A3cf0F1044447F2a88B7dAb; + // Stakingcabin (deprecated) [stakingcabin] + address internal constant DVN_STAKINGCABIN_2 = 0x54dD79f5cE72b51FCBbcb170Dd01E32034323565; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x252B234545e154543Ad2784c7111Eb90406be836; + // Superduper [portal] + address internal constant DVN_SUPERDUPER = 0x0E95cf21aD9376A26997c97f326C5A0a267bB8FF; + // Superform [superform] + address internal constant DVN_SUPERFORM = 0x8fb0B7D74B557e4b45EF89648BAc197EAb2E4325; + // Switchboard [switchboard] + address internal constant DVN_SWITCHBOARD = 0x92ef4381a03372985985E70fb15E9F081E2e8D14; + // TSS [tss] + address internal constant DVN_TSS = 0x5a54fe5234E811466D5366846283323c954310B2; + // Tapioca [pearlnet] + address internal constant DVN_TAPIOCA = 0xD24972c11F91c1bB9eaEe97ec96bB9c33cF7af24; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x375C76c6E8ec55A358e6A8c72fe233d0D4a96bEE; + // Ubisoft [ubisoft] + address internal constant DVN_UBISOFT = 0xc86D023C11c5e8aA731F40b65158590624d242aF; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0x6995acD4AE604f8f334F5309A75232544F78E0c9; + // Wyoming [wyoming] + address internal constant DVN_WYOMING = 0xDa4428ff0f15B9D92C39aE08c4fc2F1216662c2f; + // Zeeve [zeeve] + address internal constant DVN_ZEEVE = 0x65c41255c7f49A4B728676A0Ede4a1329Ff6911A; + // Zenrock (deprecated) [zenrock] + address internal constant DVN_ZENROCK = 0xe552485d02EDd3067FE7FCbD4dd56BB1D3A998D2; +} + +library LayerZeroV2BahamutMainnet { + // Chain metadata + uint32 internal constant EID = 30363; + uint256 internal constant CHAIN_ID = 5165; + string internal constant CHAIN_KEY = "bahamut-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNBahamutMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x4FE90e0f2A99e464d6E97B161d72101CD03C20fe; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; +} + +library LayerZeroV2BaseMainnet { + // Chain metadata + uint32 internal constant EID = 30184; + uint256 internal constant CHAIN_ID = 8453; + string internal constant CHAIN_KEY = "base-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x1273141a3f7923AA2d9edDfA402440cE075ed8Ff); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xB5320B0B3a13cC860893E2Bd79FCd7e13484Dda2); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xc70AB6f32772f59fBfc23889Caf4Ba3376C84bAf); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x5e2A88c385B86f00eb8F4d9f861649a6feB93F24; + address internal constant EXECUTOR = 0x2CCA08ae69E0C44b18a57Ab2A87644234dAebaE4; + address internal constant DEAD_DVN = 0x6498b0632f3834D7647367334838111c8C889703; + address internal constant LZ_EXECUTOR = 0x125BD5c6C5066dcb4BB448b6eA8b9234Ed60e160; +} + +library LayerZeroV2DVNBaseMainnet { + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB = 0x41eF29F974FC9F6772654F005271C64210425391; + // AltLayer (deprecated) [altlayer] + address internal constant DVN_ALTLAYER = 0x8dEEC5B3DEb8640Bf79b334B59227454e0901953; + // BCW [bcw] + address internal constant DVN_BCW = 0xB3Ce0A5D132Cd9Bf965aBa435E650c55Edce0062; + // BCW [bcw] + address internal constant DVN_BCW_2 = 0xD77a62b54EE18bCd667b6CD158d5A000182AF5cf; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Bitgo [bitgo] + address internal constant DVN_BITGO = 0x133e9fB2D339D8428476A714B1113B024343811E; + // Bitgo (deprecated) [bitgo] + address internal constant DVN_BITGO_2 = 0x7A3D18E2324536294CD6F054cDde7c994f40391A; + // Canary [canary] + address internal constant DVN_CANARY = 0x554833698Ae0FB22ECC90B01222903fD62CA4B47; + // Curve [curve] + address internal constant DVN_CURVE = 0x1a3A8421e48b7536f3F71d8B14A1449c90eFA909; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0xc2A0C36f5939A14966705c7Cec813163FaEEa1F0; + // Frax [frax] + address internal constant DVN_FRAX = 0x187cF227F81c287303ee765eE001e151347FAaA2; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x3a4636E9AB975d28d3Af808b4e1c9fd936374E30; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0xa7b5189bcA84Cd304D8553977c7C614329750d99; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6498b0632f3834D7647367334838111c8C889703; + // Lagrange [lagrange-labs] + address internal constant DVN_LAGRANGE = 0xC50a49186aA80427aA3b0d3C2Cec19BA64222A29; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xB1473AC9f58FB27597a21710da9D1071841E8163; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x9e059a54699a285714207b43B055483E78FAac25; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0xa0AF56164F02bDf9d75287ee77c568889F11d5f2; + // Mantle Bank [mantle-bank] + address internal constant DVN_MANTLE_BANK = 0x761bC869351293c5572Ed5581E23e7D5D9C6D3d1; + // Muon [muon] + address internal constant DVN_MUON = 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0x93aC538152E1BC4F093aE5666Ee9FD1d84f4f4bF; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xcd37CA043f8479064e10635020c65FfC005d36f6; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0x658947BC7956aea0067a62Cf87ab02ae199Ef3f3; + // Nocturnal [nocturnal-labs] + address internal constant DVN_NOCTURNAL = 0xF4c489AfD83625F510947e63ff8F90dfEE0aE46C; + // Omnicat [omnicat] + address internal constant DVN_OMNICAT = 0xe6CD8c2E46Ef396DF88048449e5B1C75172b40C3; + // Omnix [omni-x] + address internal constant DVN_OMNIX = 0xeEdE111103535e473451311e26C3E6660b0F77e1; + // P2P [p2p] + address internal constant DVN_P2P = 0x5b6735c66d97479cCD18294fc96B3084EcB2fa3f; + // POPS [p-ops-team] + address internal constant DVN_POPS = 0xA9d11632eC5f9502D39afF28d66415F6CCa37544; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xcdF31d62140204C08853b547E64707110fBC6680; + // Superform [superform] + address internal constant DVN_SUPERFORM = 0xEb62f578497Bdc351dD650853a751135212fAF49; + // TSS [tss] + address internal constant DVN_TSS = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + // Ubisoft [ubisoft] + address internal constant DVN_UBISOFT = 0x505E855810cb243b2f23e95fdbb8F28d22F87a8C; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0x4873d56816F45eF341a8819d7039E4746Ed77C21; + // Wyoming [wyoming] + address internal constant DVN_WYOMING = 0xF80285eFb7518d5c79F4e98E3bAA59dA5eE79621; + // Zeeve [zeeve] + address internal constant DVN_ZEEVE = 0x6b34E842175C701F488E2Dd335A98caAEc49593F; + // Zenrock (deprecated) [zenrock] + address internal constant DVN_ZENROCK = 0x9E930731cb4A6bf7eCc11F695A295c60bDd212eB; +} + +library LayerZeroV2Bb1Mainnet { + // Chain metadata + uint32 internal constant EID = 30234; + uint256 internal constant CHAIN_ID = 2525; + string internal constant CHAIN_KEY = "bb1-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x000CC1A759bC3A15e664Ed5379E321Be5de1c9B6); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe9AE261D3aFf7d3fCCF38Fa2d612DD3897e07B2d); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xe9bA4C1e76D874a43942718Dafc96009ec9D9917; + address internal constant EXECUTOR = 0xB041cd355945627BDb7281f613B6E29623ab0110; + address internal constant DEAD_DVN = 0x3aA71d4C322eD650a78BC3A8BAB292e47a214A2c; + address internal constant LZ_EXECUTOR = 0x15feEA944A7F4eE4835c59ABC488C1935f2301b4; +} + +library LayerZeroV2DVNBb1Mainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x2A22804Cfa992D5cb1324863ec4aDa920256B908; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xC9c1B26505bf3f4D6562159a119f6eDe1e245DeB; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x3aA71d4C322eD650a78BC3A8BAB292e47a214A2c; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xb21f945e8917c6Cd69FcFE66ac6703B90f7fe004; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // TSS [tss] + address internal constant DVN_TSS = 0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9; +} + +library LayerZeroV2BeraMainnet { + // Chain metadata + uint32 internal constant EID = 30362; + uint256 internal constant CHAIN_ID = 80094; + string internal constant CHAIN_KEY = "bera-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0xA79c7375fE2B68F56825C221e5Ea9fBbB5d42EDC); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNBeraMainnet { + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB = 0xa2d10677441230C4AeD58030e4EA6Ba7Bfd80393; + // Bera [bera] + address internal constant DVN_BERA = 0x10473BD2f7320476B5E5E59649e3Dc129d9d0029; + // Bitgo [bitgo] + address internal constant DVN_BITGO = 0xdfF3F73C260b3361d4F006B02972c6aF6C5c5417; + // Canary [canary] + address internal constant DVN_CANARY = 0x06e8042729CeF3aE6D6DB5350f48F9D736C3675d; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x0273fbfF931704884668a9eFe50e7a2b3FC30505; + // FBTC [fbtc] + address internal constant DVN_FBTC = 0xE900e073BADaFdC6F72541F34E6b701bde835487; + // Frax [frax] + address internal constant DVN_FRAX = 0x559A194dAe0508342e7CE1aD96e7E90A77F8BC4c; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xeCbaA45c33ce6Fa284995e5F8314f5bC7F1C2008; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x59B5042691BD2Fd3700cEB9A4c7630be3eCF9484; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x5933A371EA26E11318389Ee3322aE3ec16463502; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0xFd4d23EB5CeA65f6CC7eEC8f3b394e55AED68299; + // MIM [mim] + address internal constant DVN_MIM = 0x73DDc92E39aEdA95FEb8D3E0008016d9F1268c76; + // Mantle Bank [mantle-bank] + address internal constant DVN_MANTLE_BANK = 0x88a8b858c7fCB3Fe0052c9b7bcC69183a9cebD76; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0x00A979a5D306E9c5F8Cf473659e75f8002E06fc8; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x2Da965594E1F2D7d42569Ab9127847D7A4Bf38FF; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // P2P [p2p] + address internal constant DVN_P2P = 0x3b247F1B48F055EbF2DB593672B98C9597E3081E; + // POPS [p-ops-team] + address internal constant DVN_POPS = 0x4055fAd06ded1F57A1b4D07455665a9Bbc33C700; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x6E70FCdc42D3d63748B7d8883399Dcb16BBB5c8c; + // TSS [tss] + address internal constant DVN_TSS = 0x306B9a8953B9462F8b826e6768a93C8EA7454965; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0xd01ae6905d48315f7bE10C7330aeCF8360Ef5b12; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0x575d0De08426223896d9Cd4bBaF4C02C9a7Dc8c6; +} + +library LayerZeroV2BevmMainnet { + // Chain metadata + uint32 internal constant EID = 30317; + uint256 internal constant CHAIN_ID = 11501; + string internal constant CHAIN_KEY = "bevm-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x26463a4aF811c256f669524Ec2dC1ba7e7a83C37; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNBevmMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x4FE90e0f2A99e464d6E97B161d72101CD03C20fe; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // TSS [tss] + address internal constant DVN_TSS = 0x6c47E59BC0600942146BF37668fc92b369C85ab7; +} + +library LayerZeroV2BitlayerMainnet { + // Chain metadata + uint32 internal constant EID = 30314; + uint256 internal constant CHAIN_ID = 200901; + string internal constant CHAIN_KEY = "bitlayer-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNBitlayerMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x95729Ea44326f8adD8A9b1d987279DBdC1DD3dFf; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; +} + +library LayerZeroV2Bl4Mainnet { + // Chain metadata + uint32 internal constant EID = 30337; + string internal constant CHAIN_KEY = "bl4-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNBl4Mainnet { + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; +} + +library LayerZeroV2Bl5Mainnet { + // Chain metadata + uint32 internal constant EID = 30338; + string internal constant CHAIN_KEY = "bl5-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNBl5Mainnet { + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; +} + +library LayerZeroV2BlastMainnet { + // Chain metadata + uint32 internal constant EID = 30243; + uint256 internal constant CHAIN_ID = 81457; + string internal constant CHAIN_KEY = "blast-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x3b4453D9e884dA5A8C917Ab7679D66c92069e7F7); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xc1B621b18187F74c8F6D52a6F709Dd2780C09821); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x377530cdA84DFb2673bF4d145DCF0C4D7fdcB5b6); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x73Dd395E80A2dD6D88dB11E69f15d534D182F019; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNBlastMainnet { + // Axelar [axelar] + address internal constant DVN_AXELAR = 0xB830a5AfCBEBb936c30C607a18BbbA9f5B0a592f; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xabC9b1819cc4D9846550F928B985993cF6240439; + // Canary [canary] + address internal constant DVN_CANARY = 0x6398E91001Cc1682bBA103E6B2489Fa5675a5a64; + // Frax [frax] + address internal constant DVN_FRAX = 0xfa06f93ad99825114C8f8738943734b07FdD162F; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x70BF42C69173d6e33b834f59630DAC592C70b369; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x73Dd395E80A2dD6D88dB11E69f15d534D182F019; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Omnicat [omnicat] + address internal constant DVN_OMNICAT = 0x25e0e650a78e6304A3983Fc4b7Ffc6544b1bEea6; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x0ff4cc28826356503BB79c00637bec0eE006f237; + // Superform [superform] + address internal constant DVN_SUPERFORM = 0x0E95cf21aD9376A26997c97f326C5A0a267bB8FF; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; + // Zenrock (deprecated) [zenrock] + address internal constant DVN_ZENROCK = 0x1383981c78393b36f59c4F8F4f12f1B4eB249eBF; +} + +library LayerZeroV2BobMainnet { + // Chain metadata + uint32 internal constant EID = 30279; + uint256 internal constant CHAIN_ID = 60808; + string internal constant CHAIN_KEY = "bob-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0x0000000000000000000000000000000000000000; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant DEAD_DVN = 0x11bA0F5c3832044A416B2E177EA773eceBCCEE1f; + address internal constant LZ_EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; +} + +library LayerZeroV2DVNBobMainnet { + // BWare [bware-labs] + address internal constant DVN_BWARE = 0x58DfF8622759eA75910a08DBA5D060579271dcD7; + // Bitgo [bitgo] + address internal constant DVN_BITGO = 0xaA391622e42aE501371CD745CE0BAD588a8C65fd; + // Canary [canary] + address internal constant DVN_CANARY = 0x46d6E532A913cDf688fb7863Ce1CF360a81Ec5E4; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xf2067660520F79eB7a8326Dc1266DCE0167D64E7; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x11bA0F5c3832044A416B2E177EA773eceBCCEE1f; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // TSS [tss] + address internal constant DVN_TSS = 0xbB2753C1B940363d278c81D6402fA89E79Ab4ebc; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0x8bAFe0299CB4D3fF75d3f7045554474Bf414FD11; +} + +library LayerZeroV2BotanixMainnet { + // Chain metadata + uint32 internal constant EID = 30376; + uint256 internal constant CHAIN_ID = 3637; + string internal constant CHAIN_KEY = "botanix-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNBotanixMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xbCefdAdB8d24b1d36c26B522235012Cd4cf162f6; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x7A3D18E2324536294CD6F054cDde7c994f40391A; + // Frax [frax] + address internal constant DVN_FRAX = 0xf835Af1DceA24C255149E0ad7C9FF1a5E8611Fa2; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x713d826aaa1f974c1dc0472fC71219e93c3B1614; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xA4281c1c88F0278FF696eDeb517052153190FC9E; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; +} + +library LayerZeroV2BouncebitMainnet { + // Chain metadata + uint32 internal constant EID = 30293; + uint256 internal constant CHAIN_ID = 6001; + string internal constant CHAIN_KEY = "bouncebit-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x1F7E674143031e74bc48a0c570c174A07aA9C5d0; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNBouncebitMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x1F7E674143031e74bc48a0c570c174A07aA9C5d0; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; +} + +library LayerZeroV2BscMainnet { + // Chain metadata + uint32 internal constant EID = 30102; + uint256 internal constant CHAIN_ID = 56; + string internal constant CHAIN_KEY = "bsc-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x37375049CDc522Bd6bAeEbf527A42D54688d784c); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x9F8C645f2D0b2159767Bd6E0839DE4BE49e823DE); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xB217266c3A98C8B2709Ee26836C98cf12f6cCEC1); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x40B36b785A6872b40Cd6957Ce211E515E1be1081; + address internal constant EXECUTOR = 0x3ebD570ed38B1b3b4BC886999fcF507e9D584859; + address internal constant DEAD_DVN = 0xe9b5E4f9395a60799F4F608Ba3ABebDfC0ee6D9C; + address internal constant LZ_EXECUTOR = 0x821A99C061C00f6C9da0302AAec348945Ba40284; +} + +library LayerZeroV2DVNBscMainnet { + // 01node [01node] + address internal constant DVN_01NODE = 0x8Fc629aa400D4D9c0B118F2685a49316552ABf27; + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB = 0x313328609a9C38459CaE56625FFf7F2AD6dcde3b; + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB_2 = 0xD4925B81f62457caCA368412315D230535b9a48a; + // AltLayer [altlayer] + address internal constant DVN_ALTLAYER = 0xDb979D0A36aF0525AFa60Fc265B1525505c55D79; + // Axelar [axelar] + address internal constant DVN_AXELAR = 0x878c20D3685cdBc5e2680A8a0E7FB97389344fe1; + // BCW [bcw] + address internal constant DVN_BCW = 0xd36246C322Ee102A2203bCA9cafb84c179D306F6; + // BCW [bcw] + address internal constant DVN_BCW_2 = 0x5246D80e5673251Eb1977ae9D07a93fbd8649963; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xfE1cD27827E16b07E61A4AC96b521bDB35e00328; + // Bera [bera] + address internal constant DVN_BERA = 0x8ed0A851964604BB1b6b1a703F4c8234EE684d76; + // Bitgo (deprecated) [bitgo] + address internal constant DVN_BITGO = 0xD791948db16AB4373FA394B74C727DDb7FB02520; + // Bitgo [bitgo] + address internal constant DVN_BITGO_2 = 0xa2CEB887f545400B8247Dfb7E9cCAda7abAbBDE8; + // Blockhunters [blockhunters] + address internal constant DVN_BLOCKHUNTERS = 0x547bF6889B1095b7CC6e525A1F8E8Fdb26134a38; + // CCIP [ccip] + address internal constant DVN_CCIP = 0x53561BcfE6B3F23BC72E5b9919c12322729942e8; + // Canary [canary] + address internal constant DVN_CANARY = 0xfA9bA83C102283958B997Adc8B44ED3A3CdB5dDa; + // Chainlink [ccip] + address internal constant DVN_CHAINLINK = 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539; + // Curve [curve] + address internal constant DVN_CURVE = 0xc6e1f0fc326913bD31fB11699c61F6f1F2A5e6d2; + // Delegate [delegate] + address internal constant DVN_DELEGATE = 0x9EEee79F5dBC4D99354b5CB547c138Af432F937b; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0xf0a5C5306adbFd4e3dfD5d4B148B451c411d3878; + // EigenZero [eigenzero] + address internal constant DVN_EIGENZERO = 0x9188B373378D284C9174AE474C2B0A937924B34B; + // Flowdesk [flowdesk] + address internal constant DVN_FLOWDESK = 0x00E91548787Caf130D811EF1872f2Bc2C0583d90; + // Frax [frax] + address internal constant DVN_FRAX = 0xd4Bf35cE3BfC7F7D7dfC0694a7d4aA8b8c60a38c; + // Gitcoin (deprecated) [gitcoin] + address internal constant DVN_GITCOIN = 0x2afa3787cd95fee5D5753cd717EF228eb259f4ea; + // Gitcoin [gitcoin] + address internal constant DVN_GITCOIN_2 = 0xE4b64c3a70cD7F7C38D48F66BA5Db9A41C485f64; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x81D8516Adae92b655aCaf6A04c9526716baeB849; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x247624e2143504730aeC22912ed41F092498bEf2; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xe9b5E4f9395a60799F4F608Ba3ABebDfC0ee6D9C; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x509889389cfB7A89850017425810116A44676F58; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0xfD6865c841c2d64565562fCc7e05e619A30615f0; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x2c7185f5B0976397d9eB5c19d639d4005e6708f0; + // MIM [mim] + address internal constant DVN_MIM = 0x25e0e650a78e6304A3983Fc4b7Ffc6544b1bEea6; + // Mantle03 [mantle03] + address internal constant DVN_MANTLE03 = 0xEc65a0245c19A084650cB5B85FD1a2Bc7B0FD452; + // Muon [muon] + address internal constant DVN_MUON = 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0x534C6b3e6805E9287ff1D49C349d5f7a01B9b7F5; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x31F748a368a893Bdb5aBB67ec95F232507601A73; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0x0321A1B9e48cCdc5a8A32C524b858E10072ef798; + // Nocturnal [nocturnal-labs] + address internal constant DVN_NOCTURNAL = 0x48EcF6d66045aad8d75E72109489Ac29DA6066A9; + // Nodesguru [nodes-guru] + address internal constant DVN_NODESGURU = 0x1bab20E7FDc79257729CB596BEF85db76C44915E; + // Nodit [nodit] + address internal constant DVN_NODIT = 0xEeCE50190806fA57016028d31D8631419882401c; + // Omnicat [omnicat] + address internal constant DVN_OMNICAT = 0xdfF3F73C260b3361d4F006B02972c6aF6C5c5417; + // Omnix [omni-x] + address internal constant DVN_OMNIX = 0x5a4c666E9C7aA86FD4fBFDFbfd04646DcC45C6c5; + // Ondo (deprecated) [ondo] + address internal constant DVN_ONDO = 0x00efECF8714C2bC9376f8391f47a2fFce8BCDFEa; + // Ondo Staging [ondo-staging] + address internal constant DVN_ONDO_STAGING = 0x089E70BC883Ad0b6551e513bF7A71Ffd2059f9F1; + // P2P [p2p] + address internal constant DVN_P2P = 0x439264FB87581a70Bb6D7bEFd16b636521B0Ad2D; + // POPS [p-ops-team] + address internal constant DVN_POPS = 0x33E5fcC13D7439cC62d54c41AA966197145b3Cd7; + // Paxos (deprecated) [paxos] + address internal constant DVN_PAXOS = 0x82F6Ad698f3116Ca1B71836A7f1303628FA855DB; + // Planetarium [planetarium-labs] + address internal constant DVN_PLANETARIUM = 0x05AaEfDf9dB6E0f7d27FA3b6EE099EDB33dA029E; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Republic [republic-crypto] + address internal constant DVN_REPUBLIC = 0xF7DDEE427507cdb6885E53CAAaa1973b1Fe29357; + // Restake [restake] + address internal constant DVN_RESTAKE = 0x4D52f5bc932cf1A854381A85ad9ED79B8497c153; + // Shrapnel [mercury] + address internal constant DVN_SHRAPNEL = 0xb4FA7f1C67E5Ec99B556Ec92CbDdBCdd384106F2; + // Stablelab [stablelab] + address internal constant DVN_STABLELAB = 0xabC9b1819cc4D9846550F928B985993cF6240439; + // Stakingcabin (deprecated) [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0xd841A741Addcb6Dea735D3B8C9Faf96BA3f3d30D; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN_2 = 0xcCF6ee53aA0B7c7f190D2a7B273e7b04CCE14D21; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xac8de74CE0A44A5e73BBc709fe800406F58431e0; + // Superduper [portal] + address internal constant DVN_SUPERDUPER = 0xBD40c9047980500C46B8aed4462e2f889299FEbE; + // Superform [superform] + address internal constant DVN_SUPERFORM = 0xF4c489AfD83625F510947e63ff8F90dfEE0aE46C; + // Switchboard [switchboard] + address internal constant DVN_SWITCHBOARD = 0xf0809F6e760a5452Ee567975EdA7a28dA4a83D38; + // TSS [tss] + address internal constant DVN_TSS = 0x5a54fe5234E811466D5366846283323c954310B2; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x72F697797aC173F09eDa73Dd9C11a141376d2b57; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0xd29dCf66E264aA7d6833BdaC6b9279791a7c246B; + // Zeeve [zeeve] + address internal constant DVN_ZEEVE = 0x92453Ce02159F774f1c846a4A0693008ED020F59; + // Zenrock (deprecated) [zenrock] + address internal constant DVN_ZENROCK = 0xE5491Fac6965Aa664EFD6d1aE5e7D1d56Da4FDDa; +} + +library LayerZeroV2CampMainnet { + // Chain metadata + uint32 internal constant EID = 30381; + uint256 internal constant CHAIN_ID = 484; + string internal constant CHAIN_KEY = "camp-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0xfd76d9CB0Bac839725aB79127E7411fe71b1e3CA; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNCampMainnet { + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xfd76d9CB0Bac839725aB79127E7411fe71b1e3CA; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x15e51701F245F6D5bd0FEE87bCAf55B0841451B3; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x2F29D3d12fc2d1961Ad8B5397c0f878003c35e20; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x64a344a15e4DE73F393E345E6Bfe937F34ee1f90; +} + +library LayerZeroV2CantoMainnet { + // Chain metadata + uint32 internal constant EID = 30159; + uint256 internal constant CHAIN_ID = 7700; + string internal constant CHAIN_KEY = "canto-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x61Ab01Ce58D1dFf3562bb25870020d555e39D849); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x6BD792911F4B3714E88FbDf32B351632e7d22c70); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x087ceBBd85A161A50F91b9d7743e8b89fC384e2e; + address internal constant EXECUTOR = 0x8E721E1930B4559AcAfDf06eE591af2FFCB93b8D; + address internal constant DEAD_DVN = 0x8B84482bd8BdD718DEa9b791eA76997EBb4F2D0E; + address internal constant LZ_EXECUTOR = 0xef32f931ac53808e695B7eF3D1b6C5016024a68f; +} + +library LayerZeroV2DVNCantoMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Canary [canary] + address internal constant DVN_CANARY = 0x73DDc92E39aEdA95FEb8D3E0008016d9F1268c76; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x8B84482bd8BdD718DEa9b791eA76997EBb4F2D0E; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x1BAcC2205312534375c8d1801C27D28370656cFf; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x809CDE2AfcF8627312E87a6a7bbFFaB3F8F347c7; + // Omnicat [omnicat] + address internal constant DVN_OMNICAT = 0x25e0e650a78e6304A3983Fc4b7Ffc6544b1bEea6; + // TSS [tss] + address internal constant DVN_TSS = 0x377530cdA84DFb2673bF4d145DCF0C4D7fdcB5b6; +} + +library LayerZeroV2CeloMainnet { + // Chain metadata + uint32 internal constant EID = 30125; + uint256 internal constant CHAIN_ID = 42220; + string internal constant CHAIN_KEY = "celo-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x14a6A3d612A04225df4825A365688F33DA4969De); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x42b4E9C6495B4cFDaE024B1eC32E09F28027620e); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xaDDed4478B423d991C21E525Cd3638FBce1AaD17); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x6c47E59BC0600942146BF37668fc92b369C85ab7; + address internal constant EXECUTOR = 0x1dDbaF8b75F2291A97C22428afEf411b7bB19e28; + address internal constant DEAD_DVN = 0xc67f8f84d00A4908581B235F1Abe0FE3aFC8126F; + address internal constant LZ_EXECUTOR = 0x552661d1C85F256E008eE2315103c80fd1E298DF; +} + +library LayerZeroV2DVNCeloMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x94AAfe0A92A8300f0A2100A7f3DE47d6845747A9; + // Curve [curve] + address internal constant DVN_CURVE = 0xc4305B4a16cb631CBd34b33380FB8c221cdf63Ab; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0xEa928f8E62F3DAc51288056015B1D4e3eCfacdAC; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x391A2021483cB476D059a78130f95165C79604b7; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x31F748a368a893Bdb5aBB67ec95F232507601A73; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xc67f8f84d00A4908581B235F1Abe0FE3aFC8126F; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x75b073994560A5c03Cd970414d9170be0C6e5c36; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0xD4925B81f62457caCA368412315D230535b9a48a; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x82F6Ad698f3116Ca1B71836A7f1303628FA855DB; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x6CDe6B51d91e9D81B639Abb6552E5b1b04D98A0B; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // P2P [p2p] + address internal constant DVN_P2P = 0x7E65BDd15C8Db8995F80aBf0D6593b57dc8BE437; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // TSS [tss] + address internal constant DVN_TSS = 0x071c3F1bc3046c693c3ABBC03a87ca9A30e43bE2; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x18f76f0d8CCD176BbE59B3870fa486d1Fff87026; + // Zenrock (deprecated) [zenrock] + address internal constant DVN_ZENROCK = 0x1383981c78393b36f59c4F8F4f12f1B4eB249eBF; +} + +library LayerZeroV2CodexMainnet { + // Chain metadata + uint32 internal constant EID = 30323; + uint256 internal constant CHAIN_ID = 81224; + string internal constant CHAIN_KEY = "codex-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x26463a4aF811c256f669524Ec2dC1ba7e7a83C37; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNCodexMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x391A2021483cB476D059a78130f95165C79604b7; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x5131E3A44C499B11Bd694d1070635cf49EBFeBf3; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xabC9b1819cc4D9846550F928B985993cF6240439; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; +} + +library LayerZeroV2ConcreteMainnet { + // Chain metadata + uint32 internal constant EID = 30366; + uint256 internal constant CHAIN_ID = 12739; + string internal constant CHAIN_KEY = "concrete-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x26463a4aF811c256f669524Ec2dC1ba7e7a83C37; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2DVNConcreteMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x047d9DBe4fC6B5c916F37237F547f9F42809935a; +} + +library LayerZeroV2ConfluxMainnet { + // Chain metadata + uint32 internal constant EID = 30212; + uint256 internal constant CHAIN_ID = 1030; + string internal constant CHAIN_KEY = "conflux-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xb360A579Dc6f77d6a3E8710A9d983811129C428d); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x16Cc4EF7c128d7FEa96Cf46FFD9dD20f76170347); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x367766BD34572400C7a49B65F56efd5a4707A069; + address internal constant EXECUTOR = 0x07Dd1bf9F684D81f59B6a6760438d383ad755355; + address internal constant DEAD_DVN = 0x3E7647e24553d486eD1B1Db94B86C7677eA9aB65; + address internal constant LZ_EXECUTOR = 0x3E9a1d9aC31B703Ac86874395a2410e123902AE9; +} + +library LayerZeroV2DVNConfluxMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Canary [canary] + address internal constant DVN_CANARY = 0xE0F0FbBDBF9d398eCA0dd8c86d1F308D895b9Eb7; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x45A7305c65AAd28384F20a80F87a5183772E4F70; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x3E7647e24553d486eD1B1Db94B86C7677eA9aB65; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x8D183A062e99cad6f3723E6d836F9EA13886B173; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x809CDE2AfcF8627312E87a6a7bbFFaB3F8F347c7; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x38179D3BFa6Ef1d69A8A7b0b671BA3D8836B2AE8; +} + +library LayerZeroV2ConvergeMainnet { + // Chain metadata + uint32 internal constant EID = 30400; + uint256 internal constant CHAIN_ID = 432; + string internal constant CHAIN_KEY = "converge-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNConvergeMainnet { + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; +} + +library LayerZeroV2CoredaoMainnet { + // Chain metadata + uint32 internal constant EID = 30153; + uint256 internal constant CHAIN_ID = 1116; + string internal constant CHAIN_KEY = "coredao-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x0BcAC336466ef7F1e0b5c184aAB2867C108331aF); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x8F76bAcC52b5730c1f1A2413B8936D4df12aF4f6); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xF08f13c080fcc530B1C21DE827C27B7b66874DDc; + address internal constant EXECUTOR = 0x1785c94d31E3E3Ab1079e7ca8a9fbDf33EEf9dd5; + address internal constant DEAD_DVN = 0xB872d80dD876FB59085872fB99b1aDE3dbef5390; + address internal constant LZ_EXECUTOR = 0x53490de975969B34E537E541E19F26b15e368895; +} + +library LayerZeroV2DVNCoredaoMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7A7dDC46882220a075934f40380d3A7e1e87d409; + // Canary [canary] + address internal constant DVN_CANARY = 0xC133Fd6b4c44277eD592E903C0585936D7585Fa5; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0xDe79818C75649773Fc462E9d3134b23B81741481; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xB872d80dD876FB59085872fB99b1aDE3dbef5390; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x3C5575898f59c097681d1Fc239c2c6Ad36B7b41c; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xe6CD8c2E46Ef396DF88048449e5B1C75172b40C3; + // TSS [tss] + address internal constant DVN_TSS = 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb; +} + +library LayerZeroV2CronosevmMainnet { + // Chain metadata + uint32 internal constant EID = 30359; + uint256 internal constant CHAIN_ID = 25; + string internal constant CHAIN_KEY = "cronosevm-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + address internal constant BLOCKED_MESSAGE_LIB = 0xf540D892BC671f08E0B1c5B61185c53c2211e8f7; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xc1B621b18187F74c8F6D52a6F709Dd2780C09821); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7; + address internal constant EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; + address internal constant DEAD_DVN = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant LZ_EXECUTOR = 0x2BF2f59d2E318Bb03C8956E7BC4c3E6c28Bd0fC2; +} + +library LayerZeroV2DVNCronosevmMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xF1042Bba248634583d0678d53FB33Bc885E09F11; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xE33de1A8cf9bcdC6b509C44EEF66f47c65dA6d47; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x2Ae36A544b904F2f2960F6Fd1a6084b4b11ba334; +} + +library LayerZeroV2CronoszkevmMainnet { + // Chain metadata + uint32 internal constant EID = 30360; + uint256 internal constant CHAIN_ID = 388; + string internal constant CHAIN_KEY = "cronoszkevm-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x5c6cfF4b7C49805F8295Ff73C204ac83f3bC4AE7); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x01047601DB5E63b1574aae317BAd9C684E3C9056); + address internal constant BLOCKED_MESSAGE_LIB = 0x3258287147FB7887d8A643006e26E19368057377; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x9AB633555E460C01f8c7b8ab24C88dD4986dD5A1); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x52fFEeaE5Ffa89D4b31c72F87ead3699FCB79e40; + address internal constant EXECUTOR = 0x553313dB58dEeFa3D55B1457D27EAB3Fe5EC87E8; + address internal constant DEAD_DVN = 0x04830f6deCF08Dec9eD6C3fCAD215245B78A59e1; + address internal constant LZ_EXECUTOR = 0xcaeB82549Ff641C4aF73505a137B5BeD06FEaf64; +} + +library LayerZeroV2DVNCronoszkevmMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xc4A1F52fDA034A9A5E1B3b27D14451d15776Fef6; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x1253E268Bc04bB43CB96D2F7Ee858b8A1433Cf6D; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x04830f6deCF08Dec9eD6C3fCAD215245B78A59e1; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x07fD0e370B49919cA8dA0CE842B8177263c0E12c; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x3A5a74f863ec48c1769C4Ee85f6C3d70f5655E2A; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x0D1bc4Efd08940eB109Ef3040c1386d09B6334E0; +} + +library LayerZeroV2CyberMainnet { + // Chain metadata + uint32 internal constant EID = 30283; + uint256 internal constant CHAIN_ID = 7560; + string internal constant CHAIN_KEY = "cyber-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant DEAD_DVN = 0x9c8D8A224545c15024cB50C7c02cf3EA9AA1bF36; + address internal constant LZ_EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; +} + +library LayerZeroV2DVNCyberMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x3a855FCE450F7AEf93b14251D94CC4A47F9ff010; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x9885110b909E88bb94f7f767A68ec2558B2AfA73; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9c8D8A224545c15024cB50C7c02cf3EA9AA1bF36; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0x2206ceb6809bD39f8707ED5eE618f8CFA57E40F2; +} + +library LayerZeroV2DegenMainnet { + // Chain metadata + uint32 internal constant EID = 30267; + uint256 internal constant CHAIN_ID = 666666666; + string internal constant CHAIN_KEY = "degen-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant DEAD_DVN = 0xf80cB5F7467B67cBEC77DcE6a13C89f210b554c0; + address internal constant LZ_EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; +} + +library LayerZeroV2DVNDegenMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xf10Ea2c0D43bC4973cfBCc94eBAfC39d1D4aF118; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x01a998260Da061EfB9a85b26d42F8f8662bF3d5F; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xf80cB5F7467B67cBEC77DcE6a13C89f210b554c0; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x80442151791BbDd89117719e508115EBc1Ce2D93; + // TSS [tss] + address internal constant DVN_TSS = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DexalotMainnet { + // Chain metadata + uint32 internal constant EID = 30118; + uint256 internal constant CHAIN_ID = 432204; + string internal constant CHAIN_KEY = "dexalot-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x439C059878fA7A747ead101e2e20A65AcA01C7A8); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe01F3c1CD14F39303D175c31c16f58707B28976b); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x5c824c516bA5FA8dB75738ef5bDac4EfDCa691f1; + address internal constant EXECUTOR = 0xcbD35a9b849342AD34a71e072D9947D4AFb4E164; + address internal constant DEAD_DVN = 0x92918f4AD410517B635a8961A64e77bDF8798dDC; + address internal constant LZ_EXECUTOR = 0x060335db0F285F144388E22e851916D654AB26A0; +} + +library LayerZeroV2DVNDexalotMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x58DfF8622759eA75910a08DBA5D060579271dcD7; + // Canary [canary] + address internal constant DVN_CANARY = 0x9bB011796fC3604D3a4FaA5863f587a33F6224AF; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xd42306DF1a805d8053Bc652cE0Cd9F62BDe80146; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x92918f4AD410517B635a8961A64e77bDF8798dDC; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xB98D764D25d53F803f05d451225612e4A9A3b712; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x70BF42C69173d6e33b834f59630DAC592C70b369; + // TSS [tss] + address internal constant DVN_TSS = 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb; +} + +library LayerZeroV2DfkMainnet { + // Chain metadata + uint32 internal constant EID = 30115; + uint256 internal constant CHAIN_ID = 53935; + string internal constant CHAIN_KEY = "dfk-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xc80233AD8251E668BecbC3B0415707fC7075501e); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x556d7664d5b4Db11f381c714B6b47A8Bf0b494FD); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x11bb2991882a86Dc3E38858d922559A385d506bA; + address internal constant EXECUTOR = 0x1a7CE89220b945e82f80380B14aA6FDC5E5e3B2A; + address internal constant DEAD_DVN = 0x4caC2E674d1c3C4548a00fbeCBBa713C902579cf; + address internal constant LZ_EXECUTOR = 0xE1CC9f508c53277534C62B511Eb1F42607993c1b; +} + +library LayerZeroV2DVNDfkMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x6A110d94e1baA6984A3d904bab37Ae49b90E6B4f; + // Canary [canary] + address internal constant DVN_CANARY = 0xAb6d3d37D8Dc309e7d8086B2e85a953b84Ee5fA9; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xa9Ff468ad000A4D5729826459197a0dB843F433E; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x4caC2E674d1c3C4548a00fbeCBBa713C902579cf; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x1F7E674143031e74bc48a0c570c174A07aA9C5d0; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // TSS [tss] + address internal constant DVN_TSS = 0x88bD5f18a13C22C41Cf5c8cBA12eB371C4bD18D9; +} + +library LayerZeroV2DinariMainnet { + // Chain metadata + uint32 internal constant EID = 30385; + uint256 internal constant CHAIN_ID = 202110; + string internal constant CHAIN_KEY = "dinari-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xc1B621b18187F74c8F6D52a6F709Dd2780C09821); + address internal constant BLOCKED_MESSAGE_LIB = 0x3ADB8D9c040faE1fbAC9B579799cD4cA8c768f8A; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x377530cdA84DFb2673bF4d145DCF0C4D7fdcB5b6); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043; + address internal constant EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; + address internal constant DEAD_DVN = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant LZ_EXECUTOR = 0x2BF2f59d2E318Bb03C8956E7BC4c3E6c28Bd0fC2; +} + +library LayerZeroV2DVNDinariMainnet { + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; +} + +library LayerZeroV2Dm2verseMainnet { + // Chain metadata + uint32 internal constant EID = 30315; + uint256 internal constant CHAIN_ID = 68770; + string internal constant CHAIN_KEY = "dm2verse-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNDm2verseMainnet { + // Horizen (deprecated) [horizen-labs] + address internal constant DVN_HORIZEN = 0x4752239901Aa8d8B99C237dcFb0b02d9871d7a1F; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs (deprecated) [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind (deprecated) [nethermind] + address internal constant DVN_NETHERMIND = 0xF2F6fe29d5B07Bf2eB15846C1331941B9fa06b3C; +} + +library LayerZeroV2DomaMainnet { + // Chain metadata + uint32 internal constant EID = 30393; + uint256 internal constant CHAIN_ID = 97477; + string internal constant CHAIN_KEY = "doma-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNDomaMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xf835Af1DceA24C255149E0ad7C9FF1a5E8611Fa2; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xabC9b1819cc4D9846550F928B985993cF6240439; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xa6F5DDBF0Bd4D03334523465439D301080574742; +} + +library LayerZeroV2DosMainnet { + // Chain metadata + uint32 internal constant EID = 30149; + uint256 internal constant CHAIN_ID = 7979; + string internal constant CHAIN_KEY = "dos-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x72C91c46d7033dfF1707091Ef32D4951a73bD099); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xEF7781FC1C4F7B2Fd3Cf03f4d65b6835b27C1A0d); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xCFc3f9dD0205b76FF04e20243f106465Dd829656; + address internal constant EXECUTOR = 0x5B23E2bAe5C5f00e804EA2C4C9abe601604378fa; + address internal constant DEAD_DVN = 0x4474B891BF3D93e61676912F0739e04B86232dd5; + address internal constant LZ_EXECUTOR = 0xBB967E3A329F4c47F654B82a2F7d11E69E5A7143; +} + +library LayerZeroV2DVNDosMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x2AC038606fff3FB00317B8F0CcFB4081694aCDD0; + // Canary [canary] + address internal constant DVN_CANARY = 0x45A7305c65AAd28384F20a80F87a5183772E4F70; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x33E5fcC13D7439cC62d54c41AA966197145b3Cd7; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x4474B891BF3D93e61676912F0739e04B86232dd5; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x203DFa8CBcbe234821DA01a6e95Fcbf92dA065EA; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7; + // TSS [tss] + address internal constant DVN_TSS = 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb; +} + +library LayerZeroV2EbiMainnet { + // Chain metadata + uint32 internal constant EID = 30282; + uint256 internal constant CHAIN_ID = 98881; + string internal constant CHAIN_KEY = "ebi-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant DEAD_DVN = 0x9F3f929F87b29F07A7026CFbC40e0e6B476D2185; + address internal constant LZ_EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; +} + +library LayerZeroV2DVNEbiMainnet { + // Horizen (deprecated) [horizen-labs] + address internal constant DVN_HORIZEN = 0x3A2d3A2249691809C34FB9733fD0d826D1aee028; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9F3f929F87b29F07A7026CFbC40e0e6B476D2185; + // LayerZero Labs (deprecated) [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind (deprecated) [nethermind] + address internal constant DVN_NETHERMIND = 0x261150AB73528dbD51573A52917eab243bE9729A; + // Stakingcabin (deprecated) [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0x796e526dE6EBB62b006ea680E52175A22EADbFf7; + // Stargate (deprecated) [stargate] + address internal constant DVN_STARGATE = 0x97841D4AB18E9A923322A002d5b8Eb42b31Ccdb5; +} + +library LayerZeroV2EduMainnet { + // Chain metadata + uint32 internal constant EID = 30328; + uint256 internal constant CHAIN_ID = 41923; + string internal constant CHAIN_KEY = "edu-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + address internal constant BLOCKED_MESSAGE_LIB = 0xf540D892BC671f08E0B1c5B61185c53c2211e8f7; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xc1B621b18187F74c8F6D52a6F709Dd2780C09821); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7; + address internal constant EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; + address internal constant DEAD_DVN = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + address internal constant LZ_EXECUTOR = 0x306B9a8953B9462F8b826e6768a93C8EA7454965; +} + +library LayerZeroV2DVNEduMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x73ddc44AA34A838744c53AA23886e784a7B1F734; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xf4672690eF45b46EAa3b688fe2f0Fc09e9366b20; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x97F930a15172F38B7e947778889424e37b5DF316; +} + +library LayerZeroV2EonMainnet { + // Chain metadata + uint32 internal constant EID = 30215; + uint256 internal constant CHAIN_ID = 7332; + string internal constant CHAIN_KEY = "eon-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x5EB6b3Db915d29fc624b8a0e42AC029e36a1D86B); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xF622DFb40bf7340DBCf1e5147D6CFD95d7c5cF1F); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x6f1686189f32e78f1D83e7c6Ed433FCeBc3A5B51; + address internal constant EXECUTOR = 0xA09dB5142654e3eB5Cf547D66833FAe7097B21C3; + address internal constant DEAD_DVN = 0xf9420F9D2552640e242Ad89CD5D3b625F92705C9; + address internal constant LZ_EXECUTOR = 0xF9d24d3AbF64A99C6FcdF19b27eF74B723A6110a; +} + +library LayerZeroV2DVNEonMainnet { + // BCW (deprecated) [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Canary (deprecated) [canary] + address internal constant DVN_CANARY = 0xA1Bc1B9af01A0ec78883AA5DC7DECDCe897E1E76; + // Horizen (deprecated) [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xf9420F9D2552640e242Ad89CD5D3b625F92705C9; + // LayerZero Labs (deprecated) [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xe9AE261D3aFf7d3fCCF38Fa2d612DD3897e07B2d; + // TSS (deprecated) [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2EtherealMainnet { + // Chain metadata + uint32 internal constant EID = 30391; + uint256 internal constant CHAIN_ID = 5064014; + string internal constant CHAIN_KEY = "ethereal-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNEtherealMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x56053A8f4db677e5774F8Ee5BdD9D2dC270075f3; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x2afa3787cd95fee5D5753cd717EF228eb259f4ea; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x6D4fc4bD9f9C29086e2Aa67d4C81F32D2E0F285c; + // Stargate (deprecated) [stargate] + address internal constant DVN_STARGATE = 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd; +} + +library LayerZeroV2EthereumMainnet { + // Chain metadata + uint32 internal constant EID = 30101; + uint256 internal constant CHAIN_ID = 1; + string internal constant CHAIN_KEY = "ethereum-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x74F55Bc2a79A27A0bF1D1A35dB5d0Fc36b9FDB9D); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xbB2Ea70C9E858123480642Cf96acbcCE1372dCe1); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xc02Ab410f0734EFa3F14628780e6e695156024C2); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x8FAFC84cAeA1Cef8475cb5CB344658D160c9CE0b; + address internal constant EXECUTOR = 0x173272739Bd7Aa6e4e214714048a9fE699453059; + address internal constant DEAD_DVN = 0x747C741496a507E4B404b50463e691A8d692f6Ac; + address internal constant LZ_EXECUTOR = 0xbF2E102Fb382d6EC52823C8F81A45e9Caa951320; +} + +library LayerZeroV2DVNEthereumMainnet { + // 01node [01node] + address internal constant DVN_01NODE = 0x58DfF8622759eA75910a08DBA5D060579271dcD7; + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB = 0x864B42ddDC43a610E7506C163048C087F0B406Ef; + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB_2 = 0x7E65BDd15C8Db8995F80aBf0D6593b57dc8BE437; + // AltLayer [altlayer] + address internal constant DVN_ALTLAYER = 0x1E129C36BC3AfC3F0D46a42C9d9cab7586bda94c; + // Axelar [axelar] + address internal constant DVN_AXELAR = 0xCE5B47FA5139fC5f3c8c5f4C278ad5F56A7b2016; + // BCW [bcw] + address internal constant DVN_BCW = 0xe552485d02EDd3067FE7FCbD4dd56BB1D3A998D2; + // BCW [bcw] + address internal constant DVN_BCW_2 = 0x3A283Ed6bcCE8d9dfb673fBfBa6e644C9d02e9Ab; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0x7a23612F07d81F16B26cF0b5a4C3eca0E8668df2; + // Bera [bera] + address internal constant DVN_BERA = 0xE2e558C85E00B4d7529433C1cc78Ab678Cf62538; + // Bitgo (deprecated) [bitgo] + address internal constant DVN_BITGO = 0x05D78174b97cf2EC223eE578CD1f401FF792ca31; + // Bitgo [bitgo] + address internal constant DVN_BITGO_2 = 0xc9ca319f6Da263910fd9B037eC3d817A814ef3d8; + // Blockhunters [blockhunters] + address internal constant DVN_BLOCKHUNTERS = 0x6E70FCdc42D3d63748B7d8883399Dcb16BBB5c8c; + // CCIP [ccip] + address internal constant DVN_CCIP = 0x771D10D0C86E26eA8d3b778ad4d31B30533B9Cbf; + // Canary [canary] + address internal constant DVN_CANARY = 0xa4fE5A5B9A846458a70Cd0748228aED3bF65c2cd; + // Chainlink [ccip] + address internal constant DVN_CHAINLINK = 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539; + // Curve [curve] + address internal constant DVN_CURVE = 0xcc35923c43893CC31F2815e216afD7EFB60f1fB0; + // Delegate [delegate] + address internal constant DVN_DELEGATE = 0x87048402c32632B7c4d0A892d82bC1160E8B2393; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x373a6E5c0C4E89E24819f00AA37ea370917AAfF4; + // EigenZero [eigenzero] + address internal constant DVN_EIGENZERO = 0x4184Dd22692c8B50D8d7ee0d7B6028e45dbf8108; + // FBTC [fbtc] + address internal constant DVN_FBTC = 0x45C09Dc691B0Ad798e10D38B97e9Dfd917d4B680; + // Flowdesk [flowdesk] + address internal constant DVN_FLOWDESK = 0x2fdBb1e2419e13a7e043D07EAf412934B73ad7a8; + // Frax [frax] + address internal constant DVN_FRAX = 0x38654142F5E672Ae86a1b21523AAfC765E6A1e08; + // Gitcoin (deprecated) [gitcoin] + address internal constant DVN_GITCOIN = 0x38179D3BFa6Ef1d69A8A7b0b671BA3D8836B2AE8; + // Gitcoin [gitcoin] + address internal constant DVN_GITCOIN_2 = 0x15FaDad87913c3bb95f8f9f2e2b287E71Ba7817D; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x2f0BA3DbB93CF087e32c15Aab46726FDb4Fb24cf; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x380275805876Ff19055EA900CDb2B46a94ecF20D; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x747C741496a507E4B404b50463e691A8d692f6Ac; + // Lagrange [lagrange-labs] + address internal constant DVN_LAGRANGE = 0x95729Ea44326f8adD8A9b1d987279DBdC1DD3dFf; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x589dEDbD617e0CBcB916A9223F4d1300c294236b; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0xDb979D0A36aF0525AFa60Fc265B1525505c55D79; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x58249a2Ec05c1978bF21DF1f5eC1847e42455CF4; + // MIM [mim] + address internal constant DVN_MIM = 0x0Ae4e6a9a8B01EE22c6A49aF22B674A4E033A23D; + // Mantle Bank [mantle-bank] + address internal constant DVN_MANTLE_BANK = 0x868e6393AEa25E8c7e58BC5d4c90a5237C573ff6; + // Mantle01 [mantle01] + address internal constant DVN_MANTLE01 = 0x7cC59B5062A8291804A21a2a793c6Ce9ea2f0Eb9; + // Mantle02 (deprecated) [mantle02] + address internal constant DVN_MANTLE02 = 0x4d45727d2de5ffC811E6A161c3a7233a2Ea2e0E7; + // Mantle02 [mantle02] + address internal constant DVN_MANTLE02_2 = 0xdd907f5aF01A829Cd65C99A132E8720d3e990D02; + // Mantle03 [mantle03] + address internal constant DVN_MANTLE03 = 0x554833698Ae0FB22ECC90B01222903fD62CA4B47; + // Muon [muon] + address internal constant DVN_MUON = 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8; + // Mysten Labs [mysten-labs] + address internal constant DVN_MYSTEN_LABS = 0x3D68029E411B181FEfA1a8BA60aaf27dbe68636C; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0x3a4636E9AB975d28d3Af808b4e1c9fd936374E30; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xF4064220871e3B94Ca6aB3b0CEE8e29178bF47dE; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xa59BA433ac34D2927232918Ef5B2eaAfcF130BA5; + // Nocturnal [nocturnal-labs] + address internal constant DVN_NOCTURNAL = 0x7C42F598d22E8711998bAc7C3360a7b3a514863D; + // Nodesguru [nodes-guru] + address internal constant DVN_NODESGURU = 0x9F45834F0C8042e36935781b944443e906886a87; + // Nodit [nodit] + address internal constant DVN_NODIT = 0x0Cea5a94F8cd3330c4F84944bF4500F8daCD440C; + // Omnicat [omnicat] + address internal constant DVN_OMNICAT = 0xf10Ea2c0D43bC4973cfBCc94eBAfC39d1D4aF118; + // Omnix [omni-x] + address internal constant DVN_OMNIX = 0xAf75bfD402f3d4EE84978179a6c87D16c4Bd1724; + // Ondo (deprecated) [ondo] + address internal constant DVN_ONDO = 0x241c66a979125f230C239E79D103e0c2128C6618; + // Ondo Staging [ondo-staging] + address internal constant DVN_ONDO_STAGING = 0xF34D1B07c64c4F4d492aE3DdD0AaB0658A2975eb; + // P2P [p2p] + address internal constant DVN_P2P = 0x06559EE34D85a88317Bf0bfE307444116c631b67; + // POPS [p-ops-team] + address internal constant DVN_POPS = 0x94AAfe0A92A8300f0A2100A7f3DE47d6845747A9; + // Paxos [paxos] + address internal constant DVN_PAXOS = 0xb0B2EF168F52F6d1e42f461e11117295eF992daf; + // Planetarium [planetarium-labs] + address internal constant DVN_PLANETARIUM = 0x972ED7bd3d42D9C0bea3632992Ebf7e97186ea4A; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Predicate [predicate] + address internal constant DVN_PREDICATE = 0x006E1248BE5e40B4A4E7099397719Df7aB872De7; + // Quantoz (deprecated) [quantoz] + address internal constant DVN_QUANTOZ = 0x2C97f92eB72DcB3Cf1b13D8A14b9d599482fc90D; + // Quantoz [quantoz] + address internal constant DVN_QUANTOZ_2 = 0x4066b6e7BfD761B579902E7e8D03F4feb9B9536E; + // Republic [republic-crypto] + address internal constant DVN_REPUBLIC = 0xA1Bc1B9af01A0ec78883AA5DC7DECDCe897E1E76; + // Restake [restake] + address internal constant DVN_RESTAKE = 0xE4193136B92bA91402313e95347c8e9FAD8d27d0; + // Shrapnel [mercury] + address internal constant DVN_SHRAPNEL = 0xCe97511db880571A7C31821eB026Ef12fCaC892e; + // Stablelab [stablelab] + address internal constant DVN_STABLELAB = 0x5fddD320a1e29bB466Fa635661b125D51D976f92; + // Stakingcabin (deprecated) [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0xdEb742E71d57603D8F769cE36f4353468007fC02; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN_2 = 0xCd0ca0619fc8dB4d47B19A1f04105312952E5F6D; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x8FafAE7Dd957044088b3d0F67359C327c6200d18; + // Superduper [portal] + address internal constant DVN_SUPERDUPER = 0x92ef4381a03372985985E70fb15E9F081E2e8D14; + // Superform [superform] + address internal constant DVN_SUPERFORM = 0x7518f30bd5867b5fA86702556245Dead173afE46; + // Switchboard [switchboard] + address internal constant DVN_SWITCHBOARD = 0x276e6B1138d2d49C0Cda86658765d12Ef84550c1; + // TSS [tss] + address internal constant DVN_TSS = 0x5a54fe5234E811466D5366846283323c954310B2; + // Tapioca [pearlnet] + address internal constant DVN_TAPIOCA = 0xD24972c11F91c1bB9eaEe97ec96bB9c33cF7af24; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x3b0531eB02Ab4aD72e7a531180beeF9493a00dD2; + // Ubisoft [ubisoft] + address internal constant DVN_UBISOFT = 0xcc9da5B157eD87e24A9cF562E6A7C05D3C3deCD3; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0x89CA15937e1033AF26Fe4C5e976216E8C8179408; + // Wyoming [wyoming] + address internal constant DVN_WYOMING = 0x6C70Db9CE65fA37499C1f1A150A6440fC9c7273A; + // Zeeve [zeeve] + address internal constant DVN_ZEEVE = 0x02041731CB8CBAe90838BB8632c359fC0c2b0775; + // Zenrock (deprecated) [zenrock] + address internal constant DVN_ZENROCK = 0xd42306DF1a805d8053Bc652cE0Cd9F62BDe80146; +} + +library LayerZeroV2EtherlinkMainnet { + // Chain metadata + uint32 internal constant EID = 30292; + uint256 internal constant CHAIN_ID = 42793; + string internal constant CHAIN_KEY = "etherlink-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x12B9C8AbebCE75F00628C8DFa007AE358d8Ed30b); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xc1B621b18187F74c8F6D52a6F709Dd2780C09821); + address internal constant BLOCKED_MESSAGE_LIB = 0x3ADB8D9c040faE1fbAC9B579799cD4cA8c768f8A; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x377530cdA84DFb2673bF4d145DCF0C4D7fdcB5b6); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043; + address internal constant EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; + address internal constant DEAD_DVN = 0x6F95f0e1903BDb57b0761c8EfE9BC3bfB7E416BB; + address internal constant LZ_EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2DVNEtherlinkMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xe7411fca6D67De2aA856570dBD59A19FCde81bD8; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0xeCc3Dc1Cc45B1934CE713F8fb0d3D3852C01a5c1; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6F95f0e1903BDb57b0761c8EfE9BC3bfB7E416BB; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0xf8F34c79d409f96e700158DE041EBb7Fe754FD27; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x7a23612F07d81F16B26cF0b5a4C3eca0E8668df2; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0x4A6B9962945D866F53fd114bB76B38B8791B8C1d; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x31F748a368a893Bdb5aBB67ec95F232507601A73; + // TSS [tss] + address internal constant DVN_TSS = 0xb87396e0d0d8B12169319803B56dB763Cd738E63; + // Zeeve [zeeve] + address internal constant DVN_ZEEVE = 0x1e023Ed98a1236FB30054bA1317bB82c3C37785F; +} + +library LayerZeroV2FantomMainnet { + // Chain metadata + uint32 internal constant EID = 30112; + uint256 internal constant CHAIN_ID = 250; + string internal constant CHAIN_KEY = "fantom-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC17BaBeF02a937093363220b0FB57De04A535D5E); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1Dd69A2D08dF4eA6a30a91cC061ac70F98aAbe3); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x2D45675B4075563d6f4dDf0181Aa8B38Bf1B0E91; + address internal constant EXECUTOR = 0x2957eBc0D2931270d4a539696514b047756b3056; + address internal constant DEAD_DVN = 0xdD8D6cc54Fdb9Ec81Cb8EFb8988ee17aBB8Eecd1; + address internal constant LZ_EXECUTOR = 0x83e72DA23b533b2083eD007223a491ba7EC3CcBe; +} + +library LayerZeroV2DVNFantomMainnet { + // 01node [01node] + address internal constant DVN_01NODE = 0x8Fc629aa400D4D9c0B118F2685a49316552ABf27; + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB = 0x313328609a9C38459CaE56625FFf7F2AD6dcde3b; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0x247624e2143504730aeC22912ed41F092498bEf2; + // Bera [bera] + address internal constant DVN_BERA = 0x1a53015B6b4d88a943Ed512bD179FbD89a768B6b; + // Bitgo [bitgo] + address internal constant DVN_BITGO = 0x3b247F1B48F055EbF2DB593672B98C9597E3081E; + // Bitgo (deprecated) [bitgo] + address internal constant DVN_BITGO_2 = 0xDF44a1594d3D516f7CDFb4DC275a79a5F6e3Db1d; + // Blockhunters [blockhunters] + address internal constant DVN_BLOCKHUNTERS = 0x547bF6889B1095b7CC6e525A1F8E8Fdb26134a38; + // Canary [canary] + address internal constant DVN_CANARY = 0xE5BFfd46776251b70895517D4AB635a640dA61E9; + // Chainlink [ccip] + address internal constant DVN_CHAINLINK = 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539; + // Curve [curve] + address internal constant DVN_CURVE = 0x06a32EFaFC7698c00e87f5225178d7364773E93b; + // Delegate [delegate] + address internal constant DVN_DELEGATE = 0x9EEee79F5dBC4D99354b5CB547c138Af432F937b; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x8181F551c95928c0648d4378Dc4d95E847bc3945; + // Flowdesk [flowdesk] + address internal constant DVN_FLOWDESK = 0x4C4552785d09a422231A1fB3da02b49a3e99426c; + // Gitcoin [gitcoin] + address internal constant DVN_GITCOIN = 0xF4213560F316007082731e8574e1A9630F91f1b1; + // Gitcoin (deprecated) [gitcoin] + address internal constant DVN_GITCOIN_2 = 0x2afa3787cd95fee5D5753cd717EF228eb259f4ea; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x25e0e650a78e6304A3983Fc4b7Ffc6544b1bEea6; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xdD8D6cc54Fdb9Ec81Cb8EFb8988ee17aBB8Eecd1; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xE60A3959Ca23a92BF5aAf992EF837cA7F828628a; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0xa6F5DDBF0Bd4D03334523465439D301080574742; + // MIM [mim] + address internal constant DVN_MIM = 0x1bab20E7FDc79257729CB596BEF85db76C44915E; + // Muon [muon] + address internal constant DVN_MUON = 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0x57555Da46d20F39bC6795BCD6fF50cE425A0E5aF; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x31F748a368a893Bdb5aBB67ec95F232507601A73; + // Nodesguru [nodes-guru] + address internal constant DVN_NODESGURU = 0x05AaEfDf9dB6E0f7d27FA3b6EE099EDB33dA029E; + // Omnix [omni-x] + address internal constant DVN_OMNIX = 0xE0F0FbBDBF9d398eCA0dd8c86d1F308D895b9Eb7; + // P2P [p2p] + address internal constant DVN_P2P = 0x439264FB87581a70Bb6D7bEFd16b636521B0Ad2D; + // POPS [p-ops-team] + address internal constant DVN_POPS = 0x78203678D264063815Dac114eA810E9837Cd80f7; + // Paxos (deprecated) [paxos] + address internal constant DVN_PAXOS = 0x1Cf63A377A66006CB9317920E07F8768bd74309B; + // Planetarium [planetarium-labs] + address internal constant DVN_PLANETARIUM = 0xF7DDEE427507cdb6885E53CAAaa1973b1Fe29357; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Restake [restake] + address internal constant DVN_RESTAKE = 0x4D52f5bc932cf1A854381A85ad9ED79B8497c153; + // Shrapnel [mercury] + address internal constant DVN_SHRAPNEL = 0xb4FA7f1C67E5Ec99B556Ec92CbDdBCdd384106F2; + // Stablelab [stablelab] + address internal constant DVN_STABLELAB = 0xabC9b1819cc4D9846550F928B985993cF6240439; + // Stakingcabin (deprecated) [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0x2b8CBEa81315130A4C422e875063362640ddFeB0; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN_2 = 0x193204535913df3A3b350fcd2e1C97D047AbB409; + // Superduper [portal] + address internal constant DVN_SUPERDUPER = 0xBD40c9047980500C46B8aed4462e2f889299FEbE; + // Superform [superform] + address internal constant DVN_SUPERFORM = 0x2EdfE0220A74d9609c79711a65E3A2F2A85Dc83b; + // Switchboard [switchboard] + address internal constant DVN_SWITCHBOARD = 0xf0809F6e760a5452Ee567975EdA7a28dA4a83D38; + // TSS [tss] + address internal constant DVN_TSS = 0xA0Cc33Dd6f4819D473226257792AFe230EC3c67f; + // Zenrock (deprecated) [zenrock] + address internal constant DVN_ZENROCK = 0xae675d8a97A06dEA4E74253D429bD324606dEd24; +} + +library LayerZeroV2FlareMainnet { + // Chain metadata + uint32 internal constant EID = 30295; + uint256 internal constant CHAIN_ID = 14; + string internal constant CHAIN_KEY = "flare-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x28B6140ead70cb2Fb669705b3598ffB4BEaA060b; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNFlareMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xD791948db16AB4373FA394B74C727DDb7FB02520; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xeAA5a170d2588F84773f965281F8611D61312832; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x28B6140ead70cb2Fb669705b3598ffB4BEaA060b; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x9bCd17A654bffAa6f8fEa38D19661a7210e22196; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0xCe97511db880571A7C31821eB026Ef12fCaC892e; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x7cEc38c06a2FEC9Fd525B1925544110204CbB5f6; +} + +library LayerZeroV2FlowMainnet { + // Chain metadata + uint32 internal constant EID = 30336; + uint256 internal constant CHAIN_ID = 747; + string internal constant CHAIN_KEY = "flow-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x26463a4aF811c256f669524Ec2dC1ba7e7a83C37; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2DVNFlowMainnet { + // Bitgo [bitgo] + address internal constant DVN_BITGO = 0xCCdeBdb5aCFD6Ae062859ac66653b10ED77586C2; + // Canary [canary] + address internal constant DVN_CANARY = 0xe4e65D80DEb0E2c8391215bcBA4b5f7603420407; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x3C61aAd6D402D867c653F603558F4b8f91AbE952; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xd1C70192CC0eb9a89e3D9032b9FAcab259A0a1e9; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0xbbDc8C15936e5ce33FFBcAF1Aba2A8F17e31eFB5; +} + +library LayerZeroV2FraxtalMainnet { + // Chain metadata + uint32 internal constant EID = 30255; + uint256 internal constant CHAIN_ID = 252; + string internal constant CHAIN_KEY = "fraxtal-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x377530cdA84DFb2673bF4d145DCF0C4D7fdcB5b6); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x8bC1e36F015b9902B54b1387A4d733cebc2f5A4e); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x2367325334447C5E1E0f1b3a6fB947b262F58312; + address internal constant EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; + address internal constant DEAD_DVN = 0x6A6991E0bF27E3CcCDe6B73dE94b7DA6e240FF6E; + address internal constant LZ_EXECUTOR = 0x306B9a8953B9462F8b826e6768a93C8EA7454965; +} + +library LayerZeroV2DVNFraxtalMainnet { + // Axelar [axelar] + address internal constant DVN_AXELAR = 0x025BAB5B7271790F9cF188FdcE2c4214857f48D3; + // Canary [canary] + address internal constant DVN_CANARY = 0x6398E91001Cc1682bBA103E6B2489Fa5675a5a64; + // Curve [curve] + address internal constant DVN_CURVE = 0x05dF4949f0B4dC4c4b1ADc0e01700Bc669E935c3; + // Frax [frax] + address internal constant DVN_FRAX = 0x26cD5aBaDf7eC3f0F02b48314bfcA6b2342cddD4; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6A6991E0bF27E3CcCDe6B73dE94b7DA6e240FF6E; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xcCE466a522984415bC91338c232d98869193D46e; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xa7b5189bcA84Cd304D8553977c7C614329750d99; + // TSS [tss] + address internal constant DVN_TSS = 0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9; +} + +library LayerZeroV2FuseMainnet { + // Chain metadata + uint32 internal constant EID = 30138; + uint256 internal constant CHAIN_ID = 122; + string internal constant CHAIN_KEY = "fuse-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x2762409Baa1804D94D8c0bCFF8400B78Bf915D5B); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xB12514e226E50844E4655696c92c0c36B8A53141); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x28A5536cA9F36c45A9d2AC8d2B62Fc46Fde024B6; + address internal constant EXECUTOR = 0xc905E74BEb8229E258c3C6E5bC0D6Cc54C534688; + address internal constant DEAD_DVN = 0xFB01E486d8B2556a70Fe66E4A86d76DEAb4Ba974; + address internal constant LZ_EXECUTOR = 0x07245eEa05826F5984c7c3C8F478b04892e4df89; +} + +library LayerZeroV2DVNFuseMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Canary [canary] + address internal constant DVN_CANARY = 0x7A3D18E2324536294CD6F054cDde7c994f40391A; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xFB01E486d8B2556a70Fe66E4A86d76DEAb4Ba974; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x795F8325aF292Ff6E58249361d1954893BE15Aff; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x809CDE2AfcF8627312E87a6a7bbFFaB3F8F347c7; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x9F45834F0C8042e36935781b944443e906886a87; + // TSS [tss] + address internal constant DVN_TSS = 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb; +} + +library LayerZeroV2GatelayerMainnet { + // Chain metadata + uint32 internal constant EID = 30389; + uint256 internal constant CHAIN_ID = 10088; + string internal constant CHAIN_KEY = "gatelayer-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x26463a4aF811c256f669524Ec2dC1ba7e7a83C37; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x306B9a8953B9462F8b826e6768a93C8EA7454965; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNGatelayerMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x306B9a8953B9462F8b826e6768a93C8EA7454965; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; +} + +library LayerZeroV2GlueMainnet { + // Chain metadata + uint32 internal constant EID = 30342; + uint256 internal constant CHAIN_ID = 1300; + string internal constant CHAIN_KEY = "glue-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x15e51701F245F6D5bd0FEE87bCAf55B0841451B3); + address internal constant BLOCKED_MESSAGE_LIB = 0x26463a4aF811c256f669524Ec2dC1ba7e7a83C37; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xfd76d9CB0Bac839725aB79127E7411fe71b1e3CA); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; + address internal constant DEAD_DVN = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant LZ_EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2DVNGlueMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xe4e65D80DEb0E2c8391215bcBA4b5f7603420407; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xaA3099F91912E07976c2DD1598DC740d81BD3FeA; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xd1C70192CC0eb9a89e3D9032b9FAcab259A0a1e9; +} + +library LayerZeroV2GnosisMainnet { + // Chain metadata + uint32 internal constant EID = 30145; + uint256 internal constant CHAIN_ID = 100; + string internal constant CHAIN_KEY = "gnosis-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x3C156b1f625D2B4E004D43E91aC2c3a719C29c7B); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x9714Ccf1dedeF14BaB5013625DB92746C1358cb4); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xe70cA542A9f2D932aD34efE3a681D83828452666; + address internal constant EXECUTOR = 0x38340337f9ADF5D76029Ab3A667d34E5a032F7BA; + address internal constant DEAD_DVN = 0x8a893567f27893e6E0c7b6bba8769d9ab3E911Ff; + address internal constant LZ_EXECUTOR = 0x2F0788fFbf8fCa58B2ea10c05F0CA9931ffC8978; +} + +library LayerZeroV2DVNGnosisMainnet { + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Canary [canary] + address internal constant DVN_CANARY = 0x90EE303d4743F460B9a38415e09f3799b85a4efc; + // Curve [curve] + address internal constant DVN_CURVE = 0x30c673a1F34B91C4bf4951670A2B7c8C0663b100; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x93d2d7AADC9F2Cf5EbC88e9703E06dB09b8Fd85B; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x6ABdb569Dc985504cCcB541ADE8445E5266e7388; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x8a893567f27893e6E0c7b6bba8769d9ab3E911Ff; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x11bb2991882a86Dc3E38858d922559A385d506bA; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x7cC59B5062A8291804A21a2a793c6Ce9ea2f0Eb9; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0x13feb7234Ff60A97af04477d6421415766753Ba3; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // P2P [p2p] + address internal constant DVN_P2P = 0xf10Ea2c0D43bC4973cfBCc94eBAfC39d1D4aF118; + // POPS [p-ops-team] + address internal constant DVN_POPS = 0x790d7B1E97a086eb0012393b65a5B32cE58a04Dc; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xFCeA5cEF8b1ae3A454577C9444CDD95c1284B0cF; + // TSS [tss] + address internal constant DVN_TSS = 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb; + // Zenrock (deprecated) [zenrock] + address internal constant DVN_ZENROCK = 0x07C05EaB7716AcB6f83ebF6268F8EECDA8892Ba1; +} + +library LayerZeroV2GoatMainnet { + // Chain metadata + uint32 internal constant EID = 30361; + uint256 internal constant CHAIN_ID = 2345; + string internal constant CHAIN_KEY = "goat-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNGoatMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x396dC0A78F789586E2982fCCD830C5954C193F3c; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDF0771128BD4B9b18eD883d5Af41a6C725C51B38; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xe6CD8c2E46Ef396DF88048449e5B1C75172b40C3; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // TSS [tss] + address internal constant DVN_TSS = 0x00961ae3250C2c0dB37a476C0ebA2353Ce800Dae; +} + +library LayerZeroV2GravityMainnet { + // Chain metadata + uint32 internal constant EID = 30294; + uint256 internal constant CHAIN_ID = 1625; + string internal constant CHAIN_KEY = "gravity-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0xc70AB6f32772f59fBfc23889Caf4Ba3376C84bAf; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNGravityMainnet { + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xcced05c3667877B545285B25f19F794436A1c481; + // Canary [canary] + address internal constant DVN_CANARY = 0xe9C24dD582e37FAACa7d44c799530688DE92Da73; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xe95B63C4dA1D94fa5022e7C23c984F278B416ca7; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xc70AB6f32772f59fBfc23889Caf4Ba3376C84bAf; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x4b92BC2A7d681bf5230472C80d92aCFE9A6b9435; + // Nodesguru [nodes-guru] + address internal constant DVN_NODESGURU = 0x4D52f5bc932cf1A854381A85ad9ED79B8497c153; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0x0D155ec1Dfc983E919C318964fD16078408E99CC; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x70BF42C69173d6e33b834f59630DAC592C70b369; +} + +library LayerZeroV2GunzMainnet { + // Chain metadata + uint32 internal constant EID = 30371; + uint256 internal constant CHAIN_ID = 43419; + string internal constant CHAIN_KEY = "gunz-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x26463a4aF811c256f669524Ec2dC1ba7e7a83C37; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2DVNGunzMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x0D7cb4033e0C193F65B3639E61b6986A29Bf1DD4; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xFC977A4e88157B697417aDe965cEF0a2dfA39C70; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x70BF42C69173d6e33b834f59630DAC592C70b369; +} + +library LayerZeroV2HarmonyMainnet { + // Chain metadata + uint32 internal constant EID = 30116; + uint256 internal constant CHAIN_ID = 1666600000; + string internal constant CHAIN_KEY = "harmony-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x795F8325aF292Ff6E58249361d1954893BE15Aff); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x177d36dBE2271A4DdB2Ad8304d82628eb921d790); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xcDF687DdD0e88aBB026910988eB4908BaB86b719; + address internal constant EXECUTOR = 0xd27B2Fe1d0a60E06A0ec7e64501d2f15e6c65Bd9; + address internal constant DEAD_DVN = 0x801BfD947905C337d552F8E30cb4E80435771674; + address internal constant LZ_EXECUTOR = 0xdf3ad32a558578AC0AD1c19AAD41DA1ba5b37d69; +} + +library LayerZeroV2DVNHarmonyMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xa6F5DDBF0Bd4D03334523465439D301080574742; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x462A63dBE8Ca43a57D379c88a382C02862B9A2cE; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x801BfD947905C337d552F8E30cb4E80435771674; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x8363302080e711E0CAb978C081b9e69308d49808; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xD24972c11F91c1bB9eaEe97ec96bB9c33cF7af24; + // TSS [tss] + address internal constant DVN_TSS = 0x3E2EF091D7606E4CA3B8d84bcAf23da0FfA11053; +} + +library LayerZeroV2HederaMainnet { + // Chain metadata + uint32 internal constant EID = 30316; + uint256 internal constant CHAIN_ID = 295; + string internal constant CHAIN_KEY = "hedera-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + address internal constant BLOCKED_MESSAGE_LIB = 0xf540D892BC671f08E0B1c5B61185c53c2211e8f7; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xc1B621b18187F74c8F6D52a6F709Dd2780C09821); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7; + address internal constant EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; + address internal constant DEAD_DVN = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant LZ_EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2DVNHederaMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x97841D4AB18E9A923322A002d5b8Eb42b31Ccdb5; + // Bitgo [bitgo] + address internal constant DVN_BITGO = 0xA83A87a0bDce466edfBB6794404E1D7F556B8F20; + // Canary [canary] + address internal constant DVN_CANARY = 0x4b92BC2A7d681bf5230472C80d92aCFE9A6b9435; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xd0f50363E1aE33feAC8e0E067e42d0070C394525; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xeCc3Dc1Cc45B1934CE713F8fb0d3D3852C01a5c1; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x178D9517FC35633afDA67b8c236e568997a3Ae03; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x9d5D4983C4ed9253E920Aa82bE9436F1FbeAe0c0; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0x8EfB6b7dC61C6B6638714747d5E6B81a3512b5C3; +} + +library LayerZeroV2HemiMainnet { + // Chain metadata + uint32 internal constant EID = 30329; + uint256 internal constant CHAIN_ID = 43111; + string internal constant CHAIN_KEY = "hemi-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNHemiMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x396dC0A78F789586E2982fCCD830C5954C193F3c; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x38179D3BFa6Ef1d69A8A7b0b671BA3D8836B2AE8; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x07C05EaB7716AcB6f83ebF6268F8EECDA8892Ba1; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; +} + +library LayerZeroV2HomeverseMainnet { + // Chain metadata + uint32 internal constant EID = 30265; + uint256 internal constant CHAIN_ID = 19011; + string internal constant CHAIN_KEY = "homeverse-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x980205D352F198748B626f6f7C38A8a5663Ec981); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xFe7C30860D01e28371D40434806F4A8fcDD3A098); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675; + address internal constant EXECUTOR = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant DEAD_DVN = 0x25dCD7AdC3Ab4c00b8bcf78F33d95A19211Eab48; + address internal constant LZ_EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; +} + +library LayerZeroV2DVNHomeverseMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x97841D4AB18E9A923322A002d5b8Eb42b31Ccdb5; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x25dCD7AdC3Ab4c00b8bcf78F33d95A19211Eab48; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0x1294E3347ec64Fd63e1d0594Dc1294247cd237C7; + // TSS [tss] + address internal constant DVN_TSS = 0xcbD35a9b849342AD34a71e072D9947D4AFb4E164; + // Ubisoft [ubisoft] + address internal constant DVN_UBISOFT = 0x60aF1C48AbD2F6013e06269292a77B3285e984b9; +} + +library LayerZeroV2HubbleMainnet { + // Chain metadata + uint32 internal constant EID = 30182; + uint256 internal constant CHAIN_ID = 1992; + string internal constant CHAIN_KEY = "hubble-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xBB967E3A329F4c47F654B82a2F7d11E69E5A7143); + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x6f1686189f32e78f1D83e7c6Ed433FCeBc3A5B51); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x5B23E2bAe5C5f00e804EA2C4C9abe601604378fa; + address internal constant EXECUTOR = 0xe9AE261D3aFf7d3fCCF38Fa2d612DD3897e07B2d; + address internal constant LZ_EXECUTOR = 0xAa76e7DB9D087933Ce06c06f7D0107bA48a96bdb; +} + +library LayerZeroV2DVNHubbleMainnet { + // LayerZero (deprecated) [layerzero-labs] + address internal constant DVN_LAYERZERO = 0xe9bA4C1e76D874a43942718Dafc96009ec9D9917; + // TSS (deprecated) [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2HumanityMainnet { + // Chain metadata + uint32 internal constant EID = 30382; + uint256 internal constant CHAIN_ID = 6985385; + string internal constant CHAIN_KEY = "humanity-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x282b3386571f7f794450d5789911a9804FA346b4; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNHumanityMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x97841D4AB18E9A923322A002d5b8Eb42b31Ccdb5; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x282b3386571f7f794450d5789911a9804FA346b4; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x7cacBe439EaD55fa1c22790330b12835c6884a91; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; +} + +library LayerZeroV2HyperliquidMainnet { + // Chain metadata + uint32 internal constant EID = 30367; + uint256 internal constant CHAIN_ID = 999; + string internal constant CHAIN_KEY = "hyperliquid-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0xefF88eC9555b33A39081231131f0ed001FA9F96C); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xfd76d9CB0Bac839725aB79127E7411fe71b1e3CA); + address internal constant BLOCKED_MESSAGE_LIB = 0xf540D892BC671f08E0B1c5B61185c53c2211e8f7; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x7cacBe439EaD55fa1c22790330b12835c6884a91); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7; + address internal constant EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; + address internal constant DEAD_DVN = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant LZ_EXECUTOR = 0x306B9a8953B9462F8b826e6768a93C8EA7454965; +} + +library LayerZeroV2DVNHyperliquidMainnet { + // Bitgo [bitgo] + address internal constant DVN_BITGO = 0xf55E9dAef79eeC17F76e800F059495F198ef8348; + // Canary [canary] + address internal constant DVN_CANARY = 0x83342EC538dF0460e730a8F543Fe63063e2D44C4; + // Curve [curve] + address internal constant DVN_CURVE = 0x8a41c07623cdF8995aE8769BfC45859D7cA99e82; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x32fFd21260172518A8844feC76A88C8F239C384b; + // Frax [frax] + address internal constant DVN_FRAX = 0x082A08F524C043ec7F6b9a42BAE79A1990D8499a; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xBB83Ecf372CbB6daa629ea9A9A53BEC6d601F229; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0xD88d5C7B1779b54C9228Ce00560913FB99C32ACB; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xcCE466a522984415bC91338c232d98869193D46e; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x7ffD4989882A006Ac51f324b4889B3087d71B716; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x9e451905f65eF78D62b93DAc3513486da8429d0a; + // MIM [mim] + address internal constant DVN_MIM = 0x32B29d6B6cd4A851548A6E888Cc25E39E8a16d86; + // Mantle03 [mantle03] + address internal constant DVN_MANTLE03 = 0xbBD228Fa47A8E80FbBfB778Abc56031Fa2C038ce; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0xcFe987eBFf7612B53D145DD70EE24D00E12d6A1F; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xFFE7244216F46401F541125Bc8349bBbEB666027; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0x8E49eF1DfAe17e547CA0E7526FfDA81FbaCA810A; + // Omnix [omni-x] + address internal constant DVN_OMNIX = 0x3E3A9bC9149Ddf1D3A3ea51c0A49Eb9fe6347043; + // P2P [p2p] + address internal constant DVN_P2P = 0xC7423626016bc40375458bc0277F28681EC91C8e; + // TSS [tss] + address internal constant DVN_TSS = 0xacFC61640598C25bdB273291D889816B2218CD9B; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0xaE016a939935D6fe6185900d4c7C7C9b27366caC; +} + +library LayerZeroV2InjectiveevmMainnet { + // Chain metadata + uint32 internal constant EID = 30394; + uint256 internal constant CHAIN_ID = 1776; + string internal constant CHAIN_KEY = "injectiveevm-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x37aaaf95887624a363effB7762D489E3C05c2a02); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x15e51701F245F6D5bd0FEE87bCAf55B0841451B3); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNInjectiveevmMainnet { + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; +} + +library LayerZeroV2InkMainnet { + // Chain metadata + uint32 internal constant EID = 30339; + uint256 internal constant CHAIN_ID = 57073; + string internal constant CHAIN_KEY = "ink-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xca29f3A6f966Cb2fc0dE625F8f325c0C46dbE958); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x0325D8EcD68c0D6E1fDD7260fF7001478Ad77910); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x76111DE813F83AAAdBD62773Bf41247634e2319a); + address internal constant BLOCKED_MESSAGE_LIB = 0x796862C4849662BfC30FE7559780923D519d3192; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x473132bb594caEF281c68718F4541f73FE14Dc89); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x658fd63Dca9378e3B7DEb49463D0b25336433F91; + address internal constant EXECUTOR = 0xFEbCF17b11376C724AB5a5229803C6e838b6eAe5; + address internal constant DEAD_DVN = 0x5ba261D2b595966A81548B4FbE3851a6dA9Cf92c; + address internal constant LZ_EXECUTOR = 0xAE3C661292bb4D0AEEe0588b4404778DF1799EE6; +} + +library LayerZeroV2DVNInkMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x1E4CE74ccf5498B19900649D9196e64BAb592451; + // Curve [curve] + address internal constant DVN_CURVE = 0x18766cA3fEcDE0C1251922Be6D3a088aDf5f53e6; + // Frax [frax] + address internal constant DVN_FRAX = 0xF007f1Fef50C0aCAF4418741454BCAEaeCB96B87; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x395B14700812cccC38b8e64F0a06ce2045FE9bA3; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x5fc8C440f7B9C7646c2904aC63C1c0ca714c733e; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x5ba261D2b595966A81548B4FbE3851a6dA9Cf92c; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x174F2bA26f8ADeAfA82663bcf908288d5DbCa649; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x2cabF8F2c0AAe35A771a1c19487684E94388B03a; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x0ad6c9Eb13e373154bFB303561b979BAc5FA2302; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0x3a4636E9AB975d28d3Af808b4e1c9fd936374E30; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x96Ca3420BeDD887cAbDAbA29C7dcE6bAD57AF98b; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // P2P [p2p] + address internal constant DVN_P2P = 0x68b6Fb5e728dB92A09BA810595915aE3d7399e40; + // Paxos [paxos] + address internal constant DVN_PAXOS = 0x1C5C9C9b50885319BD3cB7e67294136CD436BeE3; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xE900e073BADaFdC6F72541F34E6b701bde835487; + // TSS [tss] + address internal constant DVN_TSS = 0xf772581dcf3300914D6222C4e6FcF0ed5EF93142; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0xDF44a1594d3D516f7CDFb4DC275a79a5F6e3Db1d; +} + +library LayerZeroV2IntainMainnet { + // Chain metadata + uint32 internal constant EID = 30152; + string internal constant CHAIN_KEY = "intain-mainnet"; + +} + +library LayerZeroV2IotaMainnet { + // Chain metadata + uint32 internal constant EID = 30284; + uint256 internal constant CHAIN_ID = 8822; + string internal constant CHAIN_KEY = "iota-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant DEAD_DVN = 0xE6f1C3c1674d3Bae71ef33300441e7469a0021fF; + address internal constant LZ_EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; +} + +library LayerZeroV2DVNIotaMainnet { + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xD7bB44516b476ca805FB9d6fc5b508ef3Ee9448D; + // Canary [canary] + address internal constant DVN_CANARY = 0xeCbaA45c33ce6Fa284995e5F8314f5bC7F1C2008; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDFC9455F8F86b45Fa3b1116967f740905de6Fe51; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xE6f1C3c1674d3Bae71ef33300441e7469a0021fF; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xf18A7d86917653725aFB7C215E47a24F9D784718; + // TSS [tss] + address internal constant DVN_TSS = 0x59dAE6516D2fA7F21195adC0Cda14d819D21031C; +} + +library LayerZeroV2IslanderMainnet { + // Chain metadata + uint32 internal constant EID = 30330; + uint256 internal constant CHAIN_ID = 1480; + string internal constant CHAIN_KEY = "islander-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x26463a4aF811c256f669524Ec2dC1ba7e7a83C37; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2DVNIslanderMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x45A7305c65AAd28384F20a80F87a5183772E4F70; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xca848BcB059e33Adb260d793EE360924B6Aa8E86; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x70BF42C69173d6e33b834f59630DAC592C70b369; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x9EEee79F5dBC4D99354b5CB547c138Af432F937b; +} + +library LayerZeroV2JocMainnet { + // Chain metadata + uint32 internal constant EID = 30285; + uint256 internal constant CHAIN_ID = 81; + string internal constant CHAIN_KEY = "joc-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0xcC2d3d4B88b87775Bec386d92F6951Ee7f8d52D9; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNJocMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x5488a4ca201421cF100dC1B90D1dE5B26b421f64; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xFb02364E3F5e97d8327dC6e4326E93828a28657d; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xcC2d3d4B88b87775Bec386d92F6951Ee7f8d52D9; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x57eB450b257E6A5d65CDc9A7B95245139975eaCf; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0x34730f2570E6cff8B1C91FaaBF37D0DD917c4367; +} + +library LayerZeroV2KatanaMainnet { + // Chain metadata + uint32 internal constant EID = 30375; + uint256 internal constant CHAIN_ID = 747474; + string internal constant CHAIN_KEY = "katana-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNKatanaMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x53fF818a1c492e667E2cD0b5AFe0FC82c66d33c7; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x7cC59B5062A8291804A21a2a793c6Ce9ea2f0Eb9; + // Frax [frax] + address internal constant DVN_FRAX = 0x5FA12ebC08e183C1F5d44678cF897edEfe68738B; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x84a410A8a912e333B957680998a76e526f98e207; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7; +} + +library LayerZeroV2KavaMainnet { + // Chain metadata + uint32 internal constant EID = 30177; + uint256 internal constant CHAIN_ID = 2222; + string internal constant CHAIN_KEY = "kava-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x83Fb937054918cB7AccB15bd6cD9234dF9ebb357); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xb7e97ad5661134185Fe608b2A31fe8cEf2147Ba9); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x1eeF2Bd32b5827813d97Cd25b6C392154044f453; + address internal constant EXECUTOR = 0x41ED8065dd9bC6c0caF21c39766eDCBA0F21851c; + address internal constant DEAD_DVN = 0x1B3b79f03EE74d4C88f2Bdd84112b58a01EA0167; + address internal constant LZ_EXECUTOR = 0x0a1dF45fCB28616bd2f45512f8Aa6ca958829eF1; +} + +library LayerZeroV2DVNKavaMainnet { + // Axelar [axelar] + address internal constant DVN_AXELAR = 0x80C4c3768dD5A3Dd105cf2BD868fdc50280E398B; + // BCW [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Canary [canary] + address internal constant DVN_CANARY = 0x06b85533967179eD5bC9C754b84aE7d02f7eD830; + // Curve [curve] + address internal constant DVN_CURVE = 0x05dF4949f0B4dC4c4b1ADc0e01700Bc669E935c3; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x1B3b79f03EE74d4C88f2Bdd84112b58a01EA0167; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x2D40A7B66F776345Cf763c8EBB83199Cd285e7a3; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x6a4C9096F162f0ab3C0517B0a40dc1CE44785e16; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x9CbAF815eD62Ef45C59E9F2Cb05106bAbb4d31d3; + // TSS [tss] + address internal constant DVN_TSS = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; +} + +library LayerZeroV2KlaytnMainnet { + // Chain metadata + uint32 internal constant EID = 30150; + uint256 internal constant CHAIN_ID = 8217; + string internal constant CHAIN_KEY = "klaytn-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x9714Ccf1dedeF14BaB5013625DB92746C1358cb4); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x937AbA873827BF883CeD83CA557697427eAA46Ee); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x0a1dF45fCB28616bd2f45512f8Aa6ca958829eF1; + address internal constant EXECUTOR = 0xe149187a987F129FD3d397ED04a60b0b89D1669f; + address internal constant DEAD_DVN = 0xdc58A279Bd69B208a4AdfdA0Aa066f76e33E2901; + address internal constant LZ_EXECUTOR = 0x75b073994560A5c03Cd970414d9170be0C6e5c36; +} + +library LayerZeroV2DVNKlaytnMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x28af4dADbc5066e994986E8bb105240023dC44B6; + // Canary [canary] + address internal constant DVN_CANARY = 0x1154d04d07AEe26ff2C200Bd373eb76a7e5694d6; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0xca29B2be45F1D609189dc467e0f1E48ee202eD0E; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xdc58A279Bd69B208a4AdfdA0Aa066f76e33E2901; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xc80233AD8251E668BecbC3B0415707fC7075501e; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x6a4C9096F162f0ab3C0517B0a40dc1CE44785e16; + // P2P [p2p] + address internal constant DVN_P2P = 0xF7a1963e52b1471d01e320d547b72b05F443C9e6; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x17720E3F361dCc2f70871a2ce3ac51b0Eaa5c2E4; + // TSS [tss] + address internal constant DVN_TSS = 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb; +} + +library LayerZeroV2LensMainnet { + // Chain metadata + uint32 internal constant EID = 30373; + uint256 internal constant CHAIN_ID = 232; + string internal constant CHAIN_KEY = "lens-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x5c6cfF4b7C49805F8295Ff73C204ac83f3bC4AE7); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x01047601DB5E63b1574aae317BAd9C684E3C9056); + address internal constant BLOCKED_MESSAGE_LIB = 0x3258287147FB7887d8A643006e26E19368057377; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x9AB633555E460C01f8c7b8ab24C88dD4986dD5A1); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x52fFEeaE5Ffa89D4b31c72F87ead3699FCB79e40; + address internal constant EXECUTOR = 0x553313dB58dEeFa3D55B1457D27EAB3Fe5EC87E8; + address internal constant DEAD_DVN = 0x04830f6deCF08Dec9eD6C3fCAD215245B78A59e1; + address internal constant LZ_EXECUTOR = 0xcaeB82549Ff641C4aF73505a137B5BeD06FEaf64; +} + +library LayerZeroV2DVNLensMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x27bB790440376dB53c840326263801FAFd9F0EE6; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x04830f6deCF08Dec9eD6C3fCAD215245B78A59e1; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x07fD0e370B49919cA8dA0CE842B8177263c0E12c; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x62aA89bAd332788021F6F4F4Fb196D5Fe59C27a6; +} + +library LayerZeroV2LightlinkMainnet { + // Chain metadata + uint32 internal constant EID = 30309; + uint256 internal constant CHAIN_ID = 1890; + string internal constant CHAIN_KEY = "lightlink-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNLightlinkMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xF1042Bba248634583d0678d53FB33Bc885E09F11; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x18f76f0d8CCD176BbE59B3870fa486d1Fff87026; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x0E95cf21aD9376A26997c97f326C5A0a267bB8FF; +} + +library LayerZeroV2LiskMainnet { + // Chain metadata + uint32 internal constant EID = 30321; + uint256 internal constant CHAIN_ID = 1135; + string internal constant CHAIN_KEY = "lisk-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNLiskMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x0D155ec1Dfc983E919C318964fD16078408E99CC; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x6c5f923B63Fdd52fb9C45dAeFA8695fA6b55a935; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x4b92BC2A7d681bf5230472C80d92aCFE9A6b9435; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x3fe00587a7b2432421d739A68bb890ceE55Bc18F; +} + +library LayerZeroV2LootMainnet { + // Chain metadata + uint32 internal constant EID = 30197; + uint256 internal constant CHAIN_ID = 5151706; + string internal constant CHAIN_KEY = "loot-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xCFf08a35A5f27F306e2DA99ff198dB90f13DEF77); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xBB967E3A329F4c47F654B82a2F7d11E69E5A7143); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x57D9775eE8feC31F1B612a06266f599dA167d211; + address internal constant EXECUTOR = 0x000CC1A759bC3A15e664Ed5379E321Be5de1c9B6; + address internal constant DEAD_DVN = 0x34406a8ef674f133B57F32083656787722aEE4dE; + address internal constant LZ_EXECUTOR = 0x2d24207F9C1F77B2E08F2C3aD430da18e355CF66; +} + +library LayerZeroV2DVNLootMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Canary [canary] + address internal constant DVN_CANARY = 0xA1491AdA1168f04df32F72913fc3F27522950acf; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x34406a8ef674f133B57F32083656787722aEE4dE; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x4f8B7a7a346Da5c467085377796e91220d904c15; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2LyraMainnet { + // Chain metadata + uint32 internal constant EID = 30311; + uint256 internal constant CHAIN_ID = 957; + string internal constant CHAIN_KEY = "lyra-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x26463a4aF811c256f669524Ec2dC1ba7e7a83C37; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNLyraMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x047d9DBe4fC6B5c916F37237F547f9F42809935a; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; +} + +library LayerZeroV2MantaMainnet { + // Chain metadata + uint32 internal constant EID = 30217; + uint256 internal constant CHAIN_ID = 169; + string internal constant CHAIN_KEY = "manta-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xD1654C656455E40E2905E96b6B91088AC2B362a2); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xC1EC25A9e8a8DE5Aa346f635B33e5B74c4c081aF); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xF622DFb40bf7340DBCf1e5147D6CFD95d7c5cF1F; + address internal constant EXECUTOR = 0x8DD9197E51dC6082853aD71D35912C53339777A7; + address internal constant DEAD_DVN = 0xf9420F9D2552640e242Ad89CD5D3b625F92705C9; + address internal constant LZ_EXECUTOR = 0xe767e048221197A2b590CeB5C63C3AAD8ebf87eA; +} + +library LayerZeroV2DVNMantaMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x809CDE2AfcF8627312E87a6a7bbFFaB3F8F347c7; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xabC9b1819cc4D9846550F928B985993cF6240439; + // Canary [canary] + address internal constant DVN_CANARY = 0xDF44a1594d3D516f7CDFb4DC275a79a5F6e3Db1d; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x31F748a368a893Bdb5aBB67ec95F232507601A73; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xf9420F9D2552640e242Ad89CD5D3b625F92705C9; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xA09dB5142654e3eB5Cf547D66833FAe7097B21C3; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x247624e2143504730aeC22912ed41F092498bEf2; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xca848BcB059e33Adb260d793EE360924B6Aa8E86; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2MantleMainnet { + // Chain metadata + uint32 internal constant EID = 30181; + uint256 internal constant CHAIN_ID = 5000; + string internal constant CHAIN_KEY = "mantle-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x0171830E6C8d7f28cbE35A2045919a415B04a5fF); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xde19274c009A22921E3966a1Ec868cEba40A5DaC); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x8da6512De9379fBF4F09BF520Caf7a85435ed93e); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x9BbEb2B2184B9313Cf5ed4a4DDFEa2ef62a2a03B; + address internal constant EXECUTOR = 0x4Fc3f4A38Acd6E4cC0ccBc04B3Dd1CCAeFd7F3Cd; + address internal constant DEAD_DVN = 0x2e2AF282E98bfADed5dd6EC51c7240D818DDBBD9; + address internal constant LZ_EXECUTOR = 0x4E341b9Cf90514A5b7dfec2c9A1f20AA4514C260; +} + +library LayerZeroV2DVNMantleMainnet { + // Axelar [axelar] + address internal constant DVN_AXELAR = 0x6e6359A9abe2E235eF2b82e48f0F93D1eC16aFbb; + // BCW [bcw] + address internal constant DVN_BCW = 0x7A7dDC46882220a075934f40380d3A7e1e87d409; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Canary [canary] + address internal constant DVN_CANARY = 0xa2447e5B58D357c49Bf74B50B14421e6A100e525; + // Curve [curve] + address internal constant DVN_CURVE = 0xF18F2C3d86Ec9A350D5E10Cb67c614201f210D3D; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x45f1d581F704B3203d0a4EAb2A572658d7A2E678; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x28B81e60CeA9889dd51Cbd04B7AfC4e92d048447; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x2e2AF282E98bfADed5dd6EC51c7240D818DDBBD9; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x28B6140ead70cb2Fb669705b3598ffB4BEaA060b; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0xcC49E6fca014c77E1Eb604351cc1E08C84511760; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x315b0e76A510607bB0F706B17716F426D5b385b8; + // Mantle Bank [mantle-bank] + address internal constant DVN_MANTLE_BANK = 0xB797053fBA3D41f5067C4BD74dc334328395C4d2; + // Mantle01 [mantle01] + address internal constant DVN_MANTLE01 = 0x0D7cb4033e0C193F65B3639E61b6986A29Bf1DD4; + // Mantle02 [mantle02] + address internal constant DVN_MANTLE02 = 0x5a4c666E9C7aA86FD4fBFDFbfd04646DcC45C6c5; + // Mantle02 (deprecated) [mantle02] + address internal constant DVN_MANTLE02_2 = 0x18f76f0d8CCD176BbE59B3870fa486d1Fff87026; + // Mantle03 [mantle03] + address internal constant DVN_MANTLE03 = 0x78203678D264063815Dac114eA810E9837Cd80f7; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0x58620C352dd33EaaA2f6513877515453e20e8656; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x3E249F6892aCfeF1922Fc3Bce38FEFeec3896817; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xB19A9370D404308040A9760678c8Ca28aFfbbb76; + // Ondo (deprecated) [ondo] + address internal constant DVN_ONDO = 0xdEb742E71d57603D8F769cE36f4353468007fC02; + // Ondo Staging [ondo-staging] + address internal constant DVN_ONDO_STAGING = 0x377B51593a03B82543c1508fE7e75Aba6acDE008; + // P2P [p2p] + address internal constant DVN_P2P = 0x2206ceb6809bD39f8707ED5eE618f8CFA57E40F2; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xfe809470016196573D64A8D17a745bebEA4ecC41; + // TSS [tss] + address internal constant DVN_TSS = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0xb832B06aB57da86AfBD6a1AF9857703D548fb37d; +} + +library LayerZeroV2MasaMainnet { + // Chain metadata + uint32 internal constant EID = 30263; + uint256 internal constant CHAIN_ID = 13396; + string internal constant CHAIN_KEY = "masa-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x178F93794328C04988bcD52a1B820eC105b17f2f; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNMasaMainnet { + // Horizen (deprecated) [horizen-labs] + address internal constant DVN_HORIZEN = 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x178F93794328C04988bcD52a1B820eC105b17f2f; + // LayerZero Labs (deprecated) [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // Nethermind (deprecated) [nethermind] + address internal constant DVN_NETHERMIND = 0x77D94a239DCA4b8a92A45dD68EC3e31515a807C0; + // TSS (deprecated) [tss] + address internal constant DVN_TSS = 0xF665989B02709006448dD7ebd20B6Ed25F0828c5; +} + +library LayerZeroV2MeritcircleMainnet { + // Chain metadata + uint32 internal constant EID = 30198; + uint256 internal constant CHAIN_ID = 4337; + string internal constant CHAIN_KEY = "meritcircle-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x763BfcE1Ed335885D0EeC1F182fE6E6B85BAbC92); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe767e048221197A2b590CeB5C63C3AAD8ebf87eA); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xF9d24d3AbF64A99C6FcdF19b27eF74B723A6110a; + address internal constant EXECUTOR = 0x9Bdf3aE7E2e3D211811E5e782a808Ca0a75BF1Fc; + address internal constant DEAD_DVN = 0x690b1857EaA8c55850547d7C22148C0B99a71dCd; + address internal constant LZ_EXECUTOR = 0xe01F3c1CD14F39303D175c31c16f58707B28976b; +} + +library LayerZeroV2DVNMeritcircleMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Canary [canary] + address internal constant DVN_CANARY = 0xA1Bc1B9af01A0ec78883AA5DC7DECDCe897E1E76; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x690b1857EaA8c55850547d7C22148C0B99a71dCd; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x5E38c31C28d0F485d6dc3fFAbF8980bBCD882294; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2MerlinMainnet { + // Chain metadata + uint32 internal constant EID = 30266; + uint256 internal constant CHAIN_ID = 4200; + string internal constant CHAIN_KEY = "merlin-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant DEAD_DVN = 0x5EE3Cb252978C2A51671e6AAD109491e62f04d8f; + address internal constant LZ_EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; +} + +library LayerZeroV2DVNMerlinMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x4134190B4CC18A9745ee0422CbC91c94F46a4cc1; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x439264FB87581a70Bb6D7bEFd16b636521B0Ad2D; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x5EE3Cb252978C2A51671e6AAD109491e62f04d8f; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xabC9b1819cc4D9846550F928B985993cF6240439; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0xfd4AD9CDBd06FD4D8cA521307BF63a20239208ef; + // TSS [tss] + address internal constant DVN_TSS = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2MeterMainnet { + // Chain metadata + uint32 internal constant EID = 30176; + uint256 internal constant CHAIN_ID = 82; + string internal constant CHAIN_KEY = "meter-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xef02BacD67C0AB45510927749009F6B9ffCE0631); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xD721315eB3d2e7e8cFDfC7d82C02a1DCe144f8E4); + address internal constant BLOCKED_MESSAGE_LIB = 0x5250cD435254987DE4CB824EC7363507461eFD84; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xffA387da7E7c2d444A78cd9ebcfA89AfBF980d71); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xCADf62C0E78C82C97bDB17c68777B3Ce2482E40e; + address internal constant EXECUTOR = 0x27b7Bf5f95c2DD6Bc07Ce4ed8598b20Fb73fF5c1; + address internal constant DEAD_DVN = 0x6008B58840B2353996797D65f8539d42e01Bb297; + address internal constant LZ_EXECUTOR = 0x8856eE4f4e352487a099BA83A148F0E82bc54229; +} + +library LayerZeroV2DVNMeterMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0xC4e1b199C3B24954022FcE7ba85419B3f0669142; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x3F10b9B75b05f103995eE8B8E2803AA6c7A9dcDf; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6008B58840B2353996797D65f8539d42e01Bb297; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xB792aFc44214B5f910216Bc904633dbD15b31680; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x08095eceD6c0b46D50eE45a6a59C0fD3De0b0855; + // TSS [tss] + address internal constant DVN_TSS = 0x51A6E62D12F2260E697039Ff53bCB102053f5ab7; +} + +library LayerZeroV2MetisMainnet { + // Chain metadata + uint32 internal constant EID = 30151; + uint256 internal constant CHAIN_ID = 1088; + string internal constant CHAIN_KEY = "metis-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x63e39ccB510926d05a0ae7817c8f1CC61C5BdD6c); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x5539Eb17a84E1D59d37C222Eb2CC4C81b502D1Ac); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x810c1d4A310F2d906e47e7D3DF1F1d55B367ed6f; + address internal constant EXECUTOR = 0xE6AB3B3E632f3C65c3cb4c250DcC42f5E915A1cf; + address internal constant DEAD_DVN = 0x4CC028221B4567c7439dC618D2d7f7a22315C1e4; + address internal constant LZ_EXECUTOR = 0xc1b85974F7c2F0Ccb01d763F4a34BFB41a33D612; +} + +library LayerZeroV2DVNMetisMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7A7dDC46882220a075934f40380d3A7e1e87d409; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Canary [canary] + address internal constant DVN_CANARY = 0xAf75bfD402f3d4EE84978179a6c87D16c4Bd1724; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x4CC028221B4567c7439dC618D2d7f7a22315C1e4; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x32d4F92437454829b3Fe7BEBfeCE5D0523DEb475; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x6ABdb569Dc985504cCcB541ADE8445E5266e7388; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x61A1B61A1087be03ABeDC04900Cfcc1C14187237; + // TSS [tss] + address internal constant DVN_TSS = 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb; +} + +library LayerZeroV2ModeMainnet { + // Chain metadata + uint32 internal constant EID = 30260; + uint256 internal constant CHAIN_ID = 34443; + string internal constant CHAIN_KEY = "mode-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x44a32b54E422f8B53eeD3078A632bE69E6ed355E); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xc1B621b18187F74c8F6D52a6F709Dd2780C09821); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x7B9E184e07a6EE1aC23eAe0fe8D6Be2f663f05e6; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNModeMainnet { + // BWare [bware-labs] + address internal constant DVN_BWARE = 0x10901f74caE315f674D3f6FC0645217FE4faD77C; + // Canary [canary] + address internal constant DVN_CANARY = 0x5D8aeD4182A8EcC47386e88Aa8753Dde7423996e; + // Frax [frax] + address internal constant DVN_FRAX = 0x315b0e76A510607bB0F706B17716F426D5b385b8; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x7C42F598d22E8711998bAc7C3360a7b3a514863D; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x7B9E184e07a6EE1aC23eAe0fe8D6Be2f663f05e6; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x47FE112E334F5F766db3c44F7C1813468240EdE9; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xcd37CA043f8479064e10635020c65FfC005d36f6; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xE4ef857900a0ca59BCB903E7b2cCfB050Be7Dc97; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x06559EE34D85a88317Bf0bfE307444116c631b67; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2MonadMainnet { + // Chain metadata + uint32 internal constant EID = 30390; + uint256 internal constant CHAIN_ID = 143; + string internal constant CHAIN_KEY = "monad-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNMonadMainnet { + // Bitgo [bitgo] + address internal constant DVN_BITGO = 0xdD107f9B5209670840f9cD58e241F460651C16C4; + // Canary [canary] + address internal constant DVN_CANARY = 0x493626C5D852B9B187a9eb709D0b0978a3877238; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x2c7185f5B0976397d9eB5c19d639d4005e6708f0; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xdCdd4628F858b45260C31D6ad076bD2C3D3c2f73; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x2DCbD79F38D6871232422db88EC29e8D97135Ac7; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0x6398E91001Cc1682bBA103E6B2489Fa5675a5a64; +} + +library LayerZeroV2MoonbeamMainnet { + // Chain metadata + uint32 internal constant EID = 30126; + uint256 internal constant CHAIN_ID = 1284; + string internal constant CHAIN_KEY = "moonbeam-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xeac136456d078bB76f59DCcb2d5E008b31AfE1cF); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2F4C6eeA955e95e6d65E08620D980C0e0e92211F); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x125BD5c6C5066dcb4BB448b6eA8b9234Ed60e160; + address internal constant EXECUTOR = 0xEC0906949f88f72bF9206E84764163e24a56a499; + address internal constant DEAD_DVN = 0x28eEE23B2b6C5582112037FD43A4d8C359F54D4D; + address internal constant LZ_EXECUTOR = 0x05B52859Adb077a7b7D6277a512aEfEFbaDDc9C8; +} + +library LayerZeroV2DVNMoonbeamMainnet { + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Canary [canary] + address internal constant DVN_CANARY = 0x33E5fcC13D7439cC62d54c41AA966197145b3Cd7; + // Curve [curve] + address internal constant DVN_CURVE = 0x7DEcC6Df3aF9CFc275E25d2f9703eCF7ad800D5D; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x34730f2570E6cff8B1C91FaaBF37D0DD917c4367; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x28eEE23B2b6C5582112037FD43A4d8C359F54D4D; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x8B9b67b22ab2ed6Ee324C2fd43734dBd2dDDD045; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x790d7B1E97a086eb0012393b65a5B32cE58a04Dc; + // POPS [p-ops-team] + address internal constant DVN_POPS = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // TSS [tss] + address internal constant DVN_TSS = 0xdEeF80c12d49e5DA8e01B05636E2d0C776F6b78D; +} + +library LayerZeroV2MoonriverMainnet { + // Chain metadata + uint32 internal constant EID = 30167; + uint256 internal constant CHAIN_ID = 1285; + string internal constant CHAIN_KEY = "moonriver-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x1BAcC2205312534375c8d1801C27D28370656cFf); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe8BAa65CeD8E46DA43520375Af6fAbC31D7bCb8B); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x87794d2f64e076694a153aFdb12cA62eb9C2ea5B; + address internal constant EXECUTOR = 0x1E1E9A04735B9ca509eF8a46255f5104C10C6e99; + address internal constant DEAD_DVN = 0x24D7ff228a81e827Efc29ec45E7b30a99B96C653; + address internal constant LZ_EXECUTOR = 0xb7e97ad5661134185Fe608b2A31fe8cEf2147Ba9; +} + +library LayerZeroV2DVNMoonriverMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7A7dDC46882220a075934f40380d3A7e1e87d409; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Canary [canary] + address internal constant DVN_CANARY = 0x8fa9eEf18c2A1459024f0B44714e5aCc1Ce7f5e8; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x24D7ff228a81e827Efc29ec45E7b30a99B96C653; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x2b3eBE6662Ad402317EE7Ef4e6B25c79a0f91015; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xfE1cD27827E16b07E61A4AC96b521bDB35e00328; + // TSS [tss] + address internal constant DVN_TSS = 0x84070061032F3e7ea4E068f447FB7cDfC98d57Fe; +} + +library LayerZeroV2MorphMainnet { + // Chain metadata + uint32 internal constant EID = 30322; + uint256 internal constant CHAIN_ID = 2818; + string internal constant CHAIN_KEY = "morph-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNMorphMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xf10Ea2c0D43bC4973cfBCc94eBAfC39d1D4aF118; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x6c5f923B63Fdd52fb9C45dAeFA8695fA6b55a935; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xdf30C9f6A70cE65A152c5Bd09826525D7E97Ba49; + // TSS [tss] + address internal constant DVN_TSS = 0xb250B0b2A9891a035080615Ac30f040d2b7E7FAB; +} + +library LayerZeroV2Mp1Mainnet { + // Chain metadata + uint32 internal constant EID = 30331; + uint256 internal constant CHAIN_ID = 21000000; + string internal constant CHAIN_KEY = "mp1-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x26463a4aF811c256f669524Ec2dC1ba7e7a83C37; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2DVNMp1Mainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x5311241a20055f9C0b02d18d6c52F2b711c07B03; + // Curve [curve] + address internal constant DVN_CURVE = 0xDD779AAAd20E62275457Af91b123bB13dd5aFd0B; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xE33de1A8cf9bcdC6b509C44EEF66f47c65dA6d47; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x91f93749e44C7b6510dcD236aeADE39dFc901D49; +} + +library LayerZeroV2NexeraMainnet { + // Chain metadata + uint32 internal constant EID = 30395; + uint256 internal constant CHAIN_ID = 7208; + string internal constant CHAIN_KEY = "nexera-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNNexeraMainnet { + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd; +} + +library LayerZeroV2NibiruMainnet { + // Chain metadata + uint32 internal constant EID = 30369; + uint256 internal constant CHAIN_ID = 6900; + string internal constant CHAIN_KEY = "nibiru-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x2a5E79DEE6E3544588BB3b675B1Cc3354Df2AEFD); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xd1FA2df582C6C986Ec573e1a3B0218049CF1E5c7); + address internal constant BLOCKED_MESSAGE_LIB = 0xf540D892BC671f08E0B1c5B61185c53c2211e8f7; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xeB8b16D080B0FcB0C6A89544f4Dd31e595382E8B); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x2aA258ed5D0FCdb54054e87AB5a33d22008BBc10; + address internal constant EXECUTOR = 0x6A02D83e8d433304bba74EF1c427913958187142; + address internal constant DEAD_DVN = 0x3823094993190Fbb3bFABfEC8365b8C18517566F; + address internal constant LZ_EXECUTOR = 0xCd3F213AD101472e1713C72B1697E727C803885b; +} + +library LayerZeroV2DVNNibiruMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xf0809F6e760a5452Ee567975EdA7a28dA4a83D38; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x3823094993190Fbb3bFABfEC8365b8C18517566F; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD_2 = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // LayerZero Labs (deprecated) [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x5727E81A40015961145330D91cC27b5E189fF3e1; + // MIM [mim] + address internal constant DVN_MIM = 0x53Fa9f0bd34F3f0e80580d1c93168F56c9555cA4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x06D99Ffd7c09Ea72e962a06B6e311e513d7c3d20; +} + +library LayerZeroV2NovaMainnet { + // Chain metadata + uint32 internal constant EID = 30175; + uint256 internal constant CHAIN_ID = 42170; + string internal constant CHAIN_KEY = "nova-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xef32f931ac53808e695B7eF3D1b6C5016024a68f); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xB81F326b95e79eaC4aba800Ae545efb4C602973D); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x8E721E1930B4559AcAfDf06eE591af2FFCB93b8D; + address internal constant EXECUTOR = 0x8Ee02736F8a0c28164a20c25f3d199a74DF7F24B; + address internal constant DEAD_DVN = 0x1BE6093E02A7AbF324053eE3f501CF2c049dA471; + address internal constant LZ_EXECUTOR = 0x02E5fc018fa140eC2eE934f3Bf22a05DF62ba908; +} + +library LayerZeroV2DVNNovaMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x34730f2570E6cff8B1C91FaaBF37D0DD917c4367; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Canary [canary] + address internal constant DVN_CANARY = 0xE4193136B92bA91402313e95347c8e9FAD8d27d0; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x1BE6093E02A7AbF324053eE3f501CF2c049dA471; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xb7e97ad5661134185Fe608b2A31fe8cEf2147Ba9; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // TSS [tss] + address internal constant DVN_TSS = 0x37aaaf95887624a363effB7762D489E3C05c2a02; +} + +library LayerZeroV2OgMainnet { + // Chain metadata + uint32 internal constant EID = 30388; + uint256 internal constant CHAIN_ID = 16661; + string internal constant CHAIN_KEY = "og-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x26463a4aF811c256f669524Ec2dC1ba7e7a83C37; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2DVNOgMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x183940c4855a01da92bc2f96F7e0A8Aecbf797ff; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x2EF2097f8C2467A0e274C9022142dc91aaE457A8; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0xE6655528dbB0f7d1407264aA878A5B5363B8752c; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x95729Ea44326f8adD8A9b1d987279DBdC1DD3dFf; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0xE40D78243074711E21cA5290eE190062BdCe09B5; +} + +library LayerZeroV2OkxMainnet { + // Chain metadata + uint32 internal constant EID = 30155; + uint256 internal constant CHAIN_ID = 66; + string internal constant CHAIN_KEY = "okx-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x7807888fAC5c6f23F6EeFef0E6987DF5449C1BEb); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x51Ae634318E7191C7ffc5778E2D9f860e1e60361); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xCd3207826Cf70d48B74140aBDfB4bF5598B2CceD; + address internal constant EXECUTOR = 0x1658766898B42547297A429a51FDea03BC4a863F; + address internal constant DEAD_DVN = 0x641A8990001199692fd8042dc37445F07355d6CE; + address internal constant LZ_EXECUTOR = 0x89D3F96Cf0E2aE22Cc88f8caCA1ee7bB622b5E68; +} + +library LayerZeroV2DVNOkxMainnet { + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Canary [canary] + address internal constant DVN_CANARY = 0x07653d28b0f53D4c54b70eb1f9025795B23a9D6e; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x641A8990001199692fd8042dc37445F07355d6CE; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x52EEA5c490fB89c7A0084B32FEAB854eefF07c82; + // TSS [tss] + address internal constant DVN_TSS = 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb; +} + +library LayerZeroV2OpbnbMainnet { + // Chain metadata + uint32 internal constant EID = 30202; + uint256 internal constant CHAIN_ID = 204; + string internal constant CHAIN_KEY = "opbnb-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x44289609cc6781fa2C665796b6c5AAbf9FFceDC5); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x9c9e25F9fC4e8134313C2a9f5c719f5c9F4fbD95); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xbBDd27544348636a3FeBe51Df7531Cc1726f3c8B; + address internal constant EXECUTOR = 0xACbD57daAafb7D9798992A7b0382fc67d3E316f3; + address internal constant DEAD_DVN = 0xd0a9ec7544106258c5836121fA032AE65c83f99B; + address internal constant LZ_EXECUTOR = 0x2F64656569c098fdfb0bD0ab2f3616005E295810; +} + +library LayerZeroV2DVNOpbnbMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0x2AC038606fff3FB00317B8F0CcFB4081694aCDD0; + // Canary [canary] + address internal constant DVN_CANARY = 0xE5491Fac6965Aa664EFD6d1aE5e7D1d56Da4FDDa; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xd0a9ec7544106258c5836121fA032AE65c83f99B; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x3eBb618B5c9d09DE770979D552b27D6357Aff73B; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x6a4C9096F162f0ab3C0517B0a40dc1CE44785e16; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // TSS [tss] + address internal constant DVN_TSS = 0xA658742d33ebd2ce2F0bdFf73515Aa797Fd161D9; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0xeFdC8b6E2757118dE5990260D2A4eF39d31f9e49; +} + +library LayerZeroV2OpenledgerMainnet { + // Chain metadata + uint32 internal constant EID = 30392; + uint256 internal constant CHAIN_ID = 1612; + string internal constant CHAIN_KEY = "openledger-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + address internal constant BLOCKED_MESSAGE_LIB = 0xf540D892BC671f08E0B1c5B61185c53c2211e8f7; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xc1B621b18187F74c8F6D52a6F709Dd2780C09821); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7; + address internal constant EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; + address internal constant DEAD_DVN = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + address internal constant LZ_EXECUTOR = 0x306B9a8953B9462F8b826e6768a93C8EA7454965; +} + +library LayerZeroV2DVNOpenledgerMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xCee801c12814a7C5b8d792098f624fb3D7aD8651; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x97841D4AB18E9A923322A002d5b8Eb42b31Ccdb5; +} + +library LayerZeroV2OptimismMainnet { + // Chain metadata + uint32 internal constant EID = 30111; + uint256 internal constant CHAIN_ID = 10; + string internal constant CHAIN_KEY = "optimism-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x01B29c03fAD8F455184573D6624a8136cF6106Fb); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x1322871e4ab09Bc7f5717189434f97bBD9546e95); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x3c4962Ff6258dcfCafD23a814237B7d6Eb712063); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xECEE8B581960634aF89f467AE624Ff468a9Db14B; + address internal constant EXECUTOR = 0x2D2ea0697bdbede3F01553D2Ae4B8d0c486B666e; + address internal constant DEAD_DVN = 0xEbc3065003e67CaaC747836dA272d9E5271A37e1; + address internal constant LZ_EXECUTOR = 0xb02763373589c440Ed6ff32f47cf4b81CA285D01; +} + +library LayerZeroV2DVNOptimismMainnet { + // 01node [01node] + address internal constant DVN_01NODE = 0x969A0bdd86A230345AD87A6a381DE5ED9E6cda85; + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB = 0x3b247F1B48F055EbF2DB593672B98C9597E3081E; + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB_2 = 0x7B8a0fD9D6ae5011d5cBD3E85Ed6D5510F98c9Bf; + // AltLayer [altlayer] + address internal constant DVN_ALTLAYER = 0x06e8042729CeF3aE6D6DB5350f48F9D736C3675d; + // Axelar [axelar] + address internal constant DVN_AXELAR = 0x218B462e19d00c8feD4adbCe78f33aEf88d2ccFc; + // BCW [bcw] + address internal constant DVN_BCW = 0x41f3A349e6AC46CAAD2da04cFceAe3e0dE0E6C0C; + // BCW [bcw] + address internal constant DVN_BCW_2 = 0x73DDc92E39aEdA95FEb8D3E0008016d9F1268c76; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0x19670Df5E16bEa2ba9b9e68b48C054C5bAEa06B8; + // Bera [bera] + address internal constant DVN_BERA = 0x5F5512c760f69A338Cf2758d1E6A957571bB6ee0; + // Bitgo [bitgo] + address internal constant DVN_BITGO = 0xF24Dc834039a1E39F6b99A51Df05Df9c91e35b2d; + // Bitgo (deprecated) [bitgo] + address internal constant DVN_BITGO_2 = 0x90EE303d4743F460B9a38415e09f3799b85a4efc; + // Blockhunters [blockhunters] + address internal constant DVN_BLOCKHUNTERS = 0xB3Ce0A5D132Cd9Bf965aBa435E650c55Edce0062; + // Canary [canary] + address internal constant DVN_CANARY = 0x5b6735c66d97479cCD18294fc96B3084EcB2fa3f; + // Chainlink [ccip] + address internal constant DVN_CHAINLINK = 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539; + // Curve [curve] + address internal constant DVN_CURVE = 0xb908Fc507fE3145e855cf63127349756b9eCF3a6; + // Delegate [delegate] + address internal constant DVN_DELEGATE = 0x7A205ED4e3d7f9d0777594501705D8CD405c3B05; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x427bd19a0463fc4eDc2e247d35eB61323d7E5541; + // Flowdesk [flowdesk] + address internal constant DVN_FLOWDESK = 0x57F61546bd2259Db04EE7132AC385e5447174403; + // Frax [frax] + address internal constant DVN_FRAX = 0x7240264781Aa2f97Cb994C6231297A8606483242; + // Gitcoin [gitcoin] + address internal constant DVN_GITCOIN = 0x37a37d958a43810Ec169eeCE501C525664ddF890; + // Gitcoin (deprecated) [gitcoin] + address internal constant DVN_GITCOIN_2 = 0xb4FA7f1C67E5Ec99B556Ec92CbDdBCdd384106F2; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x9E930731cb4A6bf7eCc11F695A295c60bDd212eB; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0xeb64C44109eDE90CC6E34953AB122A1F09460a44; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xEbc3065003e67CaaC747836dA272d9E5271A37e1; + // Lagrange [lagrange-labs] + address internal constant DVN_LAGRANGE = 0xA4281c1c88F0278FF696eDeb517052153190FC9E; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6A02D83e8d433304bba74EF1c427913958187142; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0xD4925B81f62457caCA368412315D230535b9a48a; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0xd841A741Addcb6Dea735D3B8C9Faf96BA3f3d30D; + // MIM [mim] + address internal constant DVN_MIM = 0xD954bF7968eF68875c9100c9ec890f969504d120; + // Muon [muon] + address internal constant DVN_MUON = 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0x3b0531eB02Ab4aD72e7a531180beeF9493a00dD2; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x6075e53DC2DDcFA81142fBAD52315AE627FfcE75; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xa7b5189bcA84Cd304D8553977c7C614329750d99; + // Nocturnal [nocturnal-labs] + address internal constant DVN_NOCTURNAL = 0x47039f4327f74e755F65821040a7e0adDd596D09; + // Nodesguru [nodes-guru] + address internal constant DVN_NODESGURU = 0xe6CD8c2E46Ef396DF88048449e5B1C75172b40C3; + // Nodit [nodit] + address internal constant DVN_NODIT = 0x1288cDad593856D7672F82e4cC5fdFE1CF59646d; + // Omnix [omni-x] + address internal constant DVN_OMNIX = 0x03d2414476a742Aba715BcC337583C820525E22a; + // P2P [p2p] + address internal constant DVN_P2P = 0x539008c98B17803A273eDf98aBA2d4414Ee3f4D7; + // POPS [p-ops-team] + address internal constant DVN_POPS = 0xe552485d02EDd3067FE7FCbD4dd56BB1D3A998D2; + // Paxos (deprecated) [paxos] + address internal constant DVN_PAXOS = 0xD77a62b54EE18bCd667b6CD158d5A000182AF5cf; + // Planetarium [planetarium-labs] + address internal constant DVN_PLANETARIUM = 0x021e401C2a1A60618c5E6353A40524971Eba1E8D; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Restake [restake] + address internal constant DVN_RESTAKE = 0xcced05c3667877B545285B25f19F794436A1c481; + // Shrapnel [mercury] + address internal constant DVN_SHRAPNEL = 0xd36246C322Ee102A2203bCA9cafb84c179D306F6; + // Stablelab [stablelab] + address internal constant DVN_STABLELAB = 0xcd37CA043f8479064e10635020c65FfC005d36f6; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0x56D675bFd1574fF170723689223c3A93DeE5fA78; + // Stakingcabin (deprecated) [stakingcabin] + address internal constant DVN_STAKINGCABIN_2 = 0xEa0c32623D19D888E926e68667a5e42853FA91B4; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xfe6507F094155caBB4784403Cd784C2DF04122dd; + // Superduper [portal] + address internal constant DVN_SUPERDUPER = 0xdf30C9f6A70cE65A152c5Bd09826525D7E97Ba49; + // Superform [superform] + address internal constant DVN_SUPERFORM = 0xb0B2EF168F52F6d1e42f461e11117295eF992daf; + // Switchboard [switchboard] + address internal constant DVN_SWITCHBOARD = 0x313328609a9C38459CaE56625FFf7F2AD6dcde3b; + // TSS [tss] + address internal constant DVN_TSS = 0xA0Cc33Dd6f4819D473226257792AFe230EC3c67f; + // Tapioca [pearlnet] + address internal constant DVN_TAPIOCA = 0xabC9b1819cc4D9846550F928B985993cF6240439; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x947Bb89919d1E5996d6C46223626AC2E97BcF8A3; + // Ubisoft [ubisoft] + address internal constant DVN_UBISOFT = 0x51ACCFB59e4BDA0F8324934f9789e9Ea19fBEff4; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0x6F798D30577c91E8F9291e82e633Dbe4dCe16b93; + // Wyoming [wyoming] + address internal constant DVN_WYOMING = 0x94eC5934Daa761d7597B76fD0fecf8385De143be; + // Zeeve [zeeve] + address internal constant DVN_ZEEVE = 0x4873d56816F45eF341a8819d7039E4746Ed77C21; + // Zenrock (deprecated) [zenrock] + address internal constant DVN_ZENROCK = 0xAf75bfD402f3d4EE84978179a6c87D16c4Bd1724; +} + +library LayerZeroV2OrderlyMainnet { + // Chain metadata + uint32 internal constant EID = 30213; + uint256 internal constant CHAIN_ID = 291; + string internal constant CHAIN_KEY = "orderly-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x5B23E2bAe5C5f00e804EA2C4C9abe601604378fa); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xCFf08a35A5f27F306e2DA99ff198dB90f13DEF77); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xeDf930Cd8095548f97b21ec4E2dE5455a7382f04; + address internal constant EXECUTOR = 0x1aCe9DD1BC743aD036eF2D92Af42Ca70A1159df5; + address internal constant DEAD_DVN = 0x690b1857EaA8c55850547d7C22148C0B99a71dCd; + address internal constant LZ_EXECUTOR = 0xe9AE261D3aFf7d3fCCF38Fa2d612DD3897e07B2d; +} + +library LayerZeroV2DVNOrderlyMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Canary [canary] + address internal constant DVN_CANARY = 0xd42306DF1a805d8053Bc652cE0Cd9F62BDe80146; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x690b1857EaA8c55850547d7C22148C0B99a71dCd; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xF53857dbc0D2c59D5666006EC200cbA2936B8c35; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x6a4C9096F162f0ab3C0517B0a40dc1CE44785e16; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xD074B6bbCBEC2f2B4c4265DE3D95e521f82bF669; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2PeaqMainnet { + // Chain metadata + uint32 internal constant EID = 30302; + uint256 internal constant CHAIN_ID = 3338; + string internal constant CHAIN_KEY = "peaq-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNPeaqMainnet { + // BWare [bware-labs] + address internal constant DVN_BWARE = 0x790d7B1E97a086eb0012393b65a5B32cE58a04Dc; + // Canary [canary] + address internal constant DVN_CANARY = 0x0C0C8fd5351fd936A987c790d88B137df4E73D64; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x21cAF0BCE846AAA78C9f23C5A4eC5988EcBf9988; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0xc2A0C36f5939A14966705c7Cec813163FaEEa1F0; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x725fAFe20B74FF6f88DAEA0C506190A8f1037635; + // Nodesguru [nodes-guru] + address internal constant DVN_NODESGURU = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // P2P [p2p] + address internal constant DVN_P2P = 0x795720d981C1f4D4d4381682225572c431284592; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0x2EdfE0220A74d9609c79711a65E3A2F2A85Dc83b; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x18f76f0d8CCD176BbE59B3870fa486d1Fff87026; + // TSS [tss] + address internal constant DVN_TSS = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2PgnMainnet { + // Chain metadata + uint32 internal constant EID = 30218; + uint256 internal constant CHAIN_ID = 424; + string internal constant CHAIN_KEY = "pgn-mainnet"; + +} + +library LayerZeroV2DVNPgnMainnet { + // Horizen (deprecated) [horizen-labs] + address internal constant DVN_HORIZEN = 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd; + // TSS (deprecated) [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2PlasmaMainnet { + // Chain metadata + uint32 internal constant EID = 30383; + uint256 internal constant CHAIN_ID = 9745; + string internal constant CHAIN_KEY = "plasma-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0xDa9B06132Dd3B5CdA3cAb2d1516038A8625fef08); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNPlasmaMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x2465eE263149A18d61c9224244c61a5871dc0473; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0xF81da1B0f3ac725503AD0c2c229d1Edc57204787; + // Frax [frax] + address internal constant DVN_FRAX = 0x0a5a808dc5f9280B26EBE11b356D200e34a48517; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xd4CE45957FBCb88b868ad2c759C7DB9BC2741e56; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xE5BFfd46776251b70895517D4AB635a640dA61E9; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xa51cE237FaFA3052D5d3308Df38A024724Bb1274; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0x193204535913df3A3b350fcd2e1C97D047AbB409; + // P2P [p2p] + address internal constant DVN_P2P = 0xfD429433af17c5C75E4c8BC84b8F6dCD1b2C051A; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xabC9b1819cc4D9846550F928B985993cF6240439; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0xdCdd4628F858b45260C31D6ad076bD2C3D3c2f73; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0x3b65E87E2A4690f14cae0483014259DeD8215adc; +} + +library LayerZeroV2PlumeMainnet { + // Chain metadata + uint32 internal constant EID = 30318; + uint256 internal constant CHAIN_ID = 98865; + string internal constant CHAIN_KEY = "plume-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNPlumeMainnet { + // Horizen (deprecated) [horizen-labs] + address internal constant DVN_HORIZEN = 0xd841A741Addcb6Dea735D3B8C9Faf96BA3f3d30D; + // Horizen (deprecated) [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0xD537497b751f1ac77E39F3F53771302cCC11f0e2; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs (deprecated) [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind (deprecated) [nethermind] + address internal constant DVN_NETHERMIND = 0x07C05EaB7716AcB6f83ebF6268F8EECDA8892Ba1; + // Ondo (deprecated) [ondo] + address internal constant DVN_ONDO = 0x54dD79f5cE72b51FCBbcb170Dd01E32034323565; + // Ondo Staging (deprecated) [ondo-staging] + address internal constant DVN_ONDO_STAGING = 0xCBfb74e751052404DcDaB09494e5A502F9bE0438; + // P2P (deprecated) [p2p] + address internal constant DVN_P2P = 0x0BE6682ac7d5841ae8f72e1913a6D74Fb94A43fe; + // Stargate (deprecated) [stargate] + address internal constant DVN_STARGATE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // TSS (deprecated) [tss] + address internal constant DVN_TSS = 0xe2e3A0D9A869dDA2a98FcBa032725cdAe85436DF; +} + +library LayerZeroV2PlumephoenixMainnet { + // Chain metadata + uint32 internal constant EID = 30370; + uint256 internal constant CHAIN_ID = 98866; + string internal constant CHAIN_KEY = "plumephoenix-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xC1b15d3B262bEeC0e3565C11C9e0F6134BdaCB36); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x7155c16E82919Ee77927d3A8cE180930f04d4428); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xFe7C30860D01e28371D40434806F4A8fcDD3A098); + address internal constant BLOCKED_MESSAGE_LIB = 0x9e611dB91aDe3312534064ae6Ae700F5B531844c; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x5B19bd330A84c049b62D5B0FC2bA120217a18C1C); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x38dE71124f7a447a01D67945a51eDcE9FF491251; + address internal constant EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; + address internal constant DEAD_DVN = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant LZ_EXECUTOR = 0x306B9a8953B9462F8b826e6768a93C8EA7454965; +} + +library LayerZeroV2DVNPlumephoenixMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x395B14700812cccC38b8e64F0a06ce2045FE9bA3; + // Curve [curve] + address internal constant DVN_CURVE = 0x8Ede21203E062D7D1EAeC11c4c72Ad04cDc15658; + // Frax [frax] + address internal constant DVN_FRAX = 0x1E4CE74ccf5498B19900649D9196e64BAb592451; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x5E0744f8FBF26446c683BcF4cD405ad56bA76F8A; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0xAf75bfD402f3d4EE84978179a6c87D16c4Bd1724; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x882a1EE8891c7d22310dedf032eF9653785532B8; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xCBfb74e751052404DcDaB09494e5A502F9bE0438; + // Predicate [predicate] + address internal constant DVN_PREDICATE = 0xD7bB44516b476ca805FB9d6fc5b508ef3Ee9448D; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; +} + +library LayerZeroV2PolygonMainnet { + // Chain metadata + uint32 internal constant EID = 30109; + uint256 internal constant CHAIN_ID = 137; + string internal constant CHAIN_KEY = "polygon-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0xc214d690031d3F873365f94d381D6D50c35AA7FA); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x6c26c61a97006888ea9E4FA36584c7df57Cd9dA3); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x1322871e4ab09Bc7f5717189434f97bBD9546e95); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x1Bef2d7C5c60fD826Cc1b1f29cA357Af2d0Ae2c6; + address internal constant EXECUTOR = 0xCd3F213AD101472e1713C72B1697E727C803885b; + address internal constant DEAD_DVN = 0x43CFcc293CdF99F7D021F21FfD443f174AB0e843; + address internal constant LZ_EXECUTOR = 0xe25741bda30bb79a66ADf656E7f2D3f0C4fb3191; +} + +library LayerZeroV2DVNPolygonMainnet { + // 01node [01node] + address internal constant DVN_01NODE = 0xf0809F6e760a5452Ee567975EdA7a28dA4a83D38; + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB = 0xa6F5DDBF0Bd4D03334523465439D301080574742; + // ABDB (deprecated) [animoca-blockdaemon] + address internal constant DVN_ABDB_2 = 0xAb6d3d37D8Dc309e7d8086B2e85a953b84Ee5fA9; + // AltLayer [altlayer] + address internal constant DVN_ALTLAYER = 0xBABbb709b3CefE563f2aB14898a53301686D48b9; + // BCW [bcw] + address internal constant DVN_BCW = 0x66d771B8F938ccb82A1A9cb7a93671cb92016aB0; + // BCW [bcw] + address internal constant DVN_BCW_2 = 0xd410dDB726991f372b69A05b006D2ae5A8CedBD6; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0x247624e2143504730aeC22912ed41F092498bEf2; + // Bera [bera] + address internal constant DVN_BERA = 0xCF46153f01355036bF07E5f7Fb1eb262f25dFeDd; + // Bitgo (deprecated) [bitgo] + address internal constant DVN_BITGO = 0xc30291521305Bc76115de7Bca8034ea7147ABE36; + // Bitgo [bitgo] + address internal constant DVN_BITGO_2 = 0x02152F4624596602dCBB8B8EAD2988Ad44EDc865; + // Blockhunters [blockhunters] + address internal constant DVN_BLOCKHUNTERS = 0xBD40c9047980500C46B8aed4462e2f889299FEbE; + // Canary [canary] + address internal constant DVN_CANARY = 0x13feb7234Ff60A97af04477d6421415766753Ba3; + // Chainlink [ccip] + address internal constant DVN_CHAINLINK = 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539; + // Curve [curve] + address internal constant DVN_CURVE = 0x4066b6e7BfD761B579902E7e8D03F4feb9B9536E; + // Delegate [delegate] + address internal constant DVN_DELEGATE = 0x4D52f5bc932cf1A854381A85ad9ED79B8497c153; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x5CcCb8DE6Cdba9D2Af9d84465653af7390FDf9Dd; + // Flowdesk [flowdesk] + address internal constant DVN_FLOWDESK = 0x2cabF8F2c0AAe35A771a1c19487684E94388B03a; + // Frax [frax] + address internal constant DVN_FRAX = 0xdab6E6ecB3513A8D2614AD75199b4b264A731050; + // Gitcoin [gitcoin] + address internal constant DVN_GITCOIN = 0xeCB3ac94976F11a53ae74Af1f36FB89E247FAEEF; + // Gitcoin (deprecated) [gitcoin] + address internal constant DVN_GITCOIN_2 = 0x047d9DBe4fC6B5c916F37237F547f9F42809935a; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x5cfF49d69D79d677Dd3E5B38E048A0DCB6d86aaf; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x25e0e650a78e6304A3983Fc4b7Ffc6544b1bEea6; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x43CFcc293CdF99F7D021F21FfD443f174AB0e843; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x23DE2FE932d9043291f870324B74F820e11dc81A; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0xA70C51C38D5A9990F3113a403D74EBa01fce4CCb; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0xD1b5493e712081A6FBAb73116405590046668F6b; + // MIM [mim] + address internal constant DVN_MIM = 0x1bab20E7FDc79257729CB596BEF85db76C44915E; + // Muon [muon] + address internal constant DVN_MUON = 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0x0a8618F71dB88AB5D0CAF0610Ede19F0AB8817c5; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x31F748a368a893Bdb5aBB67ec95F232507601A73; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xbCefdAdB8d24b1d36c26B522235012Cd4cf162f6; + // Nocturnal [nocturnal-labs] + address internal constant DVN_NOCTURNAL = 0xf60C89799C85D8FaB79519f7666dcDe2A7C97CCA; + // Nodesguru [nodes-guru] + address internal constant DVN_NODESGURU = 0xF7DDEE427507cdb6885E53CAAaa1973b1Fe29357; + // Nodit [nodit] + address internal constant DVN_NODIT = 0x4c41b4EDf85DEe828C2cFcc80019CB2BbCFb69a5; + // Omnicat [omnicat] + address internal constant DVN_OMNICAT = 0xa2d10677441230C4AeD58030e4EA6Ba7Bfd80393; + // Omnix [omni-x] + address internal constant DVN_OMNIX = 0x06b85533967179eD5bC9C754b84aE7d02f7eD830; + // P2P [p2p] + address internal constant DVN_P2P = 0x9EEee79F5dBC4D99354b5CB547c138Af432F937b; + // POPS [p-ops-team] + address internal constant DVN_POPS = 0xa75ABcC0FAB6aE09c8FD808bEc7bE7E88fe31D6B; + // Paxos (deprecated) [paxos] + address internal constant DVN_PAXOS = 0x7DEcC6Df3aF9CFc275E25d2f9703eCF7ad800D5D; + // Planetarium [planetarium-labs] + address internal constant DVN_PLANETARIUM = 0x2AC038606fff3FB00317B8F0CcFB4081694aCDD0; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Quantoz [quantoz] + address internal constant DVN_QUANTOZ = 0xA773b91c42FC8e77C37d7396B2814b8FA485b2c3; + // Quantoz (deprecated) [quantoz] + address internal constant DVN_QUANTOZ_2 = 0xab98Becd7ED5494E7Da7BD6c698a282f21492D6d; + // Republic [republic-crypto] + address internal constant DVN_REPUBLIC = 0x547bF6889B1095b7CC6e525A1F8E8Fdb26134a38; + // Restake [restake] + address internal constant DVN_RESTAKE = 0x2afa3787cd95fee5D5753cd717EF228eb259f4ea; + // Shrapnel [mercury] + address internal constant DVN_SHRAPNEL = 0x54dD79f5cE72b51FCBbcb170Dd01E32034323565; + // Stablelab [stablelab] + address internal constant DVN_STABLELAB = 0xabC9b1819cc4D9846550F928B985993cF6240439; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0xcd19d26710CACf8241583769f353EA7395159007; + // Stakingcabin (deprecated) [stakingcabin] + address internal constant DVN_STAKINGCABIN_2 = 0x53BDCE6DCcf7505A55813022F53C43FaBfEF7b3A; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xC79F0B1bcb7cDAE9f9BA547dcFc57cBfcd2993A5; + // Superduper [portal] + address internal constant DVN_SUPERDUPER = 0x8Fc629aa400D4D9c0B118F2685a49316552ABf27; + // Superform [superform] + address internal constant DVN_SUPERFORM = 0x1E4CE74ccf5498B19900649D9196e64BAb592451; + // Switchboard [switchboard] + address internal constant DVN_SWITCHBOARD = 0xC6D46F63578635E4a7140cdf4D0eea0fd7bB50eC; + // TSS [tss] + address internal constant DVN_TSS = 0x5a54fe5234E811466D5366846283323c954310B2; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0xdD3d71FF05D9206C69c667D22b3a0970009780e4; + // Wyoming [wyoming] + address internal constant DVN_WYOMING = 0xf6cB110b0334825797B9b733060229C68e5D8bef; + // Zenrock (deprecated) [zenrock] + address internal constant DVN_ZENROCK = 0xCd8ea69BBCa0a2bb221AeD59fA2704f01fC76a9f; +} + +library LayerZeroV2RaribleMainnet { + // Chain metadata + uint32 internal constant EID = 30235; + uint256 internal constant CHAIN_ID = 1380012617; + string internal constant CHAIN_KEY = "rarible-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xA09dB5142654e3eB5Cf547D66833FAe7097B21C3); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x148f693af10ddfaE81cDdb36F4c93B31A90076e1); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x2d24207F9C1F77B2E08F2C3aD430da18e355CF66; + address internal constant EXECUTOR = 0x1E4CAc6c2c955cAED779ef24d5B8C5EE90b1f914; + address internal constant DEAD_DVN = 0xFE9e60eE82C8E800bd48c4fc2aE1B7716528cc56; + address internal constant LZ_EXECUTOR = 0x4740469750ce90fDB73F5fD0a062FFF0b1E4Be5D; +} + +library LayerZeroV2DVNRaribleMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xFE9e60eE82C8E800bd48c4fc2aE1B7716528cc56; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x0b5E5452d0c9DA1Bb5fB0664F48313e9667d7820; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xB53648CA1aA054A80159c1175c03679fdC76bf88; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x2fa870cEE4da57De84d1dB36759d4716AD7E5038; + // TSS [tss] + address internal constant DVN_TSS = 0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9; +} + +library LayerZeroV2RealMainnet { + // Chain metadata + uint32 internal constant EID = 30237; + uint256 internal constant CHAIN_ID = 111188; + string internal constant CHAIN_KEY = "real-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant DEAD_DVN = 0xdA13808dBE60775e9B8B07a7cc9b98DFBd0f769f; + address internal constant LZ_EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; +} + +library LayerZeroV2DVNRealMainnet { + // Canary (deprecated) [canary] + address internal constant DVN_CANARY = 0x4134190B4CC18A9745ee0422CbC91c94F46a4cc1; + // Horizen (deprecated) [horizen-labs] + address internal constant DVN_HORIZEN = 0x439264FB87581a70Bb6D7bEFd16b636521B0Ad2D; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xdA13808dBE60775e9B8B07a7cc9b98DFBd0f769f; + // LayerZero Labs (deprecated) [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind (deprecated) [nethermind] + address internal constant DVN_NETHERMIND = 0xabC9b1819cc4D9846550F928B985993cF6240439; + // Stakingcabin (deprecated) [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0xfd4AD9CDBd06FD4D8cA521307BF63a20239208ef; + // TSS (deprecated) [tss] + address internal constant DVN_TSS = 0xcbD35a9b849342AD34a71e072D9947D4AFb4E164; +} + +library LayerZeroV2ReyaMainnet { + // Chain metadata + uint32 internal constant EID = 30313; + uint256 internal constant CHAIN_ID = 1729; + string internal constant CHAIN_KEY = "reya-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNReyaMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x6c5f923B63Fdd52fb9C45dAeFA8695fA6b55a935; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // TSS [tss] + address internal constant DVN_TSS = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2RootstockMainnet { + // Chain metadata + uint32 internal constant EID = 30333; + uint256 internal constant CHAIN_ID = 30; + string internal constant CHAIN_KEY = "rootstock-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x19a642a780F4cfc27c12c8Ac79e586B5007bA8C5; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2DVNRootstockMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xF1042Bba248634583d0678d53FB33Bc885E09F11; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x54dD79f5cE72b51FCBbcb170Dd01E32034323565; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x05AaEfDf9dB6E0f7d27FA3b6EE099EDB33dA029E; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0xBABbb709b3CefE563f2aB14898a53301686D48b9; +} + +library LayerZeroV2SankoMainnet { + // Chain metadata + uint32 internal constant EID = 30278; + uint256 internal constant CHAIN_ID = 1996; + string internal constant CHAIN_KEY = "sanko-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0x0000000000000000000000000000000000000000; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant DEAD_DVN = 0x10aC9B7EB034fAb1F3bc446E81479D7dC089Be83; + address internal constant LZ_EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; +} + +library LayerZeroV2DVNSankoMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x21cAF0BCE846AAA78C9f23C5A4eC5988EcBf9988; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x5fddD320a1e29bB466Fa635661b125D51D976f92; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x10aC9B7EB034fAb1F3bc446E81479D7dC089Be83; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Omnix [omni-x] + address internal constant DVN_OMNIX = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0x1253CA32712171b5D28115A1346F2B22BB9a41D5; + // TSS [tss] + address internal constant DVN_TSS = 0xbB2753C1B940363d278c81D6402fA89E79Ab4ebc; +} + +library LayerZeroV2ScrollMainnet { + // Chain metadata + uint32 internal constant EID = 30214; + uint256 internal constant CHAIN_ID = 534352; + string internal constant CHAIN_KEY = "scroll-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x48F55d6291856186b7Af73B1B7853db45e54aFad); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x9BbEb2B2184B9313Cf5ed4a4DDFEa2ef62a2a03B); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x8363302080e711E0CAb978C081b9e69308d49808); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xF487E8D03CDa77Ce9a66B35220D6cBB95d4C2877; + address internal constant EXECUTOR = 0x581b26F362AD383f7B51eF8A165Efa13DDe398a4; + address internal constant DEAD_DVN = 0xDB238D5196328b5623612C235062427F2F6792c0; + address internal constant LZ_EXECUTOR = 0x4Fc3f4A38Acd6E4cC0ccBc04B3Dd1CCAeFd7F3Cd; +} + +library LayerZeroV2DVNScrollMainnet { + // Axelar [axelar] + address internal constant DVN_AXELAR = 0x70CEDF51c199Fad12C6c0A71cD876af948059540; + // BCW [bcw] + address internal constant DVN_BCW = 0x7A7dDC46882220a075934f40380d3A7e1e87d409; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Canary [canary] + address internal constant DVN_CANARY = 0xDF44a1594d3D516f7CDFb4DC275a79a5F6e3Db1d; + // Frax [frax] + address internal constant DVN_FRAX = 0x93bB6f93Fa90a18e88A27bcfBcB048F7e14733c6; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0xfA9bA83C102283958B997Adc8B44ED3A3CdB5dDa; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xDB238D5196328b5623612C235062427F2F6792c0; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xbe0d08a85EeBFCC6eDA0A843521f7CBB1180D2e2; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x755B3B6e6BE0747f02cCc0B96001403fc7e8DEF5; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0xf60C89799C85D8FaB79519f7666dcDe2A7C97CCA; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xb212750bC22D26499DAbF3ffe2Ba1931dC3Af3e1; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0x446755349101cB20c582C224462c3912d3584dCE; + // P2P [p2p] + address internal constant DVN_P2P = 0xC6a6324932B399D6A673B7Ed0af671F28033E046; + // POPS [p-ops-team] + address internal constant DVN_POPS = 0x34730f2570E6cff8B1C91FaaBF37D0DD917c4367; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xb87591D8B0b93faE8b631A073577c40e8Dd46A62; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; + // Zenrock (deprecated) [zenrock] + address internal constant DVN_ZENROCK = 0x05AaEfDf9dB6E0f7d27FA3b6EE099EDB33dA029E; +} + +library LayerZeroV2SeiMainnet { + // Chain metadata + uint32 internal constant EID = 30280; + uint256 internal constant CHAIN_ID = 1329; + string internal constant CHAIN_KEY = "sei-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x6A6C548058094e6dFaF95Bb0b5d04e1dd8ec0870); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + address internal constant DEAD_DVN = 0xf772581dcf3300914D6222C4e6FcF0ed5EF93142; + address internal constant LZ_EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; +} + +library LayerZeroV2DVNSeiMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x1feB08B1A53A9710AfcE82D380B8c2833C69a37e; + // Bitgo (deprecated) [bitgo] + address internal constant DVN_BITGO = 0xE40D78243074711E21cA5290eE190062BdCe09B5; + // Bitgo [bitgo] + address internal constant DVN_BITGO_2 = 0x26cD5aBaDf7eC3f0F02b48314bfcA6b2342cddD4; + // Canary [canary] + address internal constant DVN_CANARY = 0x33051Ad47157A50Bb49a646256b854C60f707C86; + // Frax [frax] + address internal constant DVN_FRAX = 0xE016F0f39fb7DCf14E9412D92f2049668d4D2612; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x96Ca3420BeDD887cAbDAbA29C7dcE6bAD57AF98b; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x87048402c32632B7c4d0A892d82bC1160E8B2393; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xf772581dcf3300914D6222C4e6FcF0ed5EF93142; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xf6EDDf89a273b5CbfbC54Cee618762983823C3f4; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x6E01Aa282f058873d28055e07d85f4197E8Db261; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0xf85F51c1d5b4de2446d99b104acFca7Ff63Bd3AD; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xA93D4490444eba60839742859cfDE53bf0967dC9; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xD24972c11F91c1bB9eaEe97ec96bB9c33cF7af24; + // P2P [p2p] + address internal constant DVN_P2P = 0xA83A87a0bDce466edfBB6794404E1D7F556B8F20; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0x93d2d7AADC9F2Cf5EbC88e9703E06dB09b8Fd85B; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xBd00C87850416db0995EF8030b104F875E1bdD15; + // TSS [tss] + address internal constant DVN_TSS = 0xd5C9DFDE96aA0731b3224f8bacf00Cd456188542; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x8EfB6b7dC61C6B6638714747d5E6B81a3512b5C3; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0xf2e89Ed7E342c708BA8CD79b293AD9244f5FCcb3; +} + +library LayerZeroV2ShimmerMainnet { + // Chain metadata + uint32 internal constant EID = 30230; + uint256 internal constant CHAIN_ID = 148; + string internal constant CHAIN_KEY = "shimmer-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x148f693af10ddfaE81cDdb36F4c93B31A90076e1); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xD4a903930f2c9085586cda0b11D9681EECb20D2f); + address internal constant BLOCKED_MESSAGE_LIB = 0x3091cA3aeE13e16c051B03b282163e565296464C; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xb21f945e8917c6Cd69FcFE66ac6703B90f7fe004); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x763BfcE1Ed335885D0EeC1F182fE6E6B85BAbC92; + address internal constant EXECUTOR = 0x868a44F9d9F09331da425539a174a2128b85D672; + address internal constant DEAD_DVN = 0x7D71242e93eD57455C017b92f980B01066E87D22; + address internal constant LZ_EXECUTOR = 0xFD5f54062D0caFda9144A7721d9971710B3D0C5e; +} + +library LayerZeroV2DVNShimmerMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Canary [canary] + address internal constant DVN_CANARY = 0x7E65BDd15C8Db8995F80aBf0D6593b57dc8BE437; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xa59BA433ac34D2927232918Ef5B2eaAfcF130BA5; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x7D71242e93eD57455C017b92f980B01066E87D22; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9Bdf3aE7E2e3D211811E5e782a808Ca0a75BF1Fc; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x5fddD320a1e29bB466Fa635661b125D51D976f92; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2ShrapnelMainnet { + // Chain metadata + uint32 internal constant EID = 30148; + uint256 internal constant CHAIN_ID = 2044; + string internal constant CHAIN_KEY = "shrapnel-mainnet"; + +} + +library LayerZeroV2DVNShrapnelMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xE4193136B92bA91402313e95347c8e9FAD8d27d0; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xabC9b1819cc4D9846550F928B985993cF6240439; + // TSS [tss] + address internal constant DVN_TSS = 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb; +} + +library LayerZeroV2SiliconMainnet { + // Chain metadata + uint32 internal constant EID = 30379; + uint256 internal constant CHAIN_ID = 2355; + string internal constant CHAIN_KEY = "silicon-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNSiliconMainnet { + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x31F748a368a893Bdb5aBB67ec95F232507601A73; +} + +library LayerZeroV2SkaleMainnet { + // Chain metadata + uint32 internal constant EID = 30273; + uint256 internal constant CHAIN_ID = 2046399126; + string internal constant CHAIN_KEY = "skale-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x37aaaf95887624a363effB7762D489E3C05c2a02); + address internal constant BLOCKED_MESSAGE_LIB = 0x0000000000000000000000000000000000000000; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x15e51701F245F6D5bd0FEE87bCAf55B0841451B3); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x377530cdA84DFb2673bF4d145DCF0C4D7fdcB5b6; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0xC8B0B3A95bc6AC3eDA97208556DC7A7820da5bf0; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNSkaleMainnet { + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xC8B0B3A95bc6AC3eDA97208556DC7A7820da5bf0; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; +} + +library LayerZeroV2SomniaMainnet { + // Chain metadata + uint32 internal constant EID = 30380; + uint256 internal constant CHAIN_ID = 50312; + string internal constant CHAIN_KEY = "somnia-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNSomniaMainnet { + // Bitgo [bitgo] + address internal constant DVN_BITGO = 0xdD9B12623ec1C7E744819708B9217b309fDE4080; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x5fddD320a1e29bB466Fa635661b125D51D976f92; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x5488a4ca201421cF100dC1B90D1dE5B26b421f64; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x5FA12ebC08e183C1F5d44678cF897edEfe68738B; + // P2P [p2p] + address internal constant DVN_P2P = 0xE57aF13D6676F7a37d37AB603aaeA6D63B1dEe8E; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xA83A87a0bDce466edfBB6794404E1D7F556B8F20; +} + +library LayerZeroV2SoneiumMainnet { + // Chain metadata + uint32 internal constant EID = 30340; + uint256 internal constant CHAIN_ID = 1868; + string internal constant CHAIN_KEY = "soneium-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x4bCb6A963a9563C33569D7A512D35754221F3A19); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0xF5F7cdcbA94Ad90C6d705b34A93E82b484387C68); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x50351C9dA75CCC6d8Ea2464B26591Bb4bd616dD5); + address internal constant BLOCKED_MESSAGE_LIB = 0xE71ED82cB15850147E9886b770d251BF4C807da4; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x364B548d8e6DB7CA84AaAFA54595919eCcF961eA); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x76111DE813F83AAAdBD62773Bf41247634e2319a; + address internal constant EXECUTOR = 0xAE3C661292bb4D0AEEe0588b4404778DF1799EE6; + address internal constant DEAD_DVN = 0xf90b61aa892ba0433F54D2C1BF594d89d22ed7F6; + address internal constant LZ_EXECUTOR = 0x7D8A496469dcEDa40832CF4d7663ccFbcC4784E3; +} + +library LayerZeroV2DVNSoneiumMainnet { + // Bitgo (deprecated) [bitgo] + address internal constant DVN_BITGO = 0xD251D8a85cDfC84518b9454EE6a8D017E503F56C; + // Bitgo [bitgo] + address internal constant DVN_BITGO_2 = 0x04584d612802A3a26b160E3F90341E6443dDB76A; + // Canary [canary] + address internal constant DVN_CANARY = 0xdd1564F68aa802E30819F9E8043664584A8a3E87; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x8Fc629aa400D4D9c0B118F2685a49316552ABf27; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0xFF78C0d5bBc133615B54d3F7eE45b8E314D38BD2; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xf90b61aa892ba0433F54D2C1BF594d89d22ed7F6; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xb2609ff80cDc626B6A6782366E5B43639E19cB8c; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0xfDfA2330713A8e2EaC6e4f15918F11937fFA4dBE; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x5Cc4E4d2cDf15795Dc5EA383b8768ec91A587719; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0x1a53015B6b4d88a943Ed512bD179FbD89a768B6b; + // P2P [p2p] + address internal constant DVN_P2P = 0xf85D19E8884EB985A7f77BA385409ec7aD2923A5; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // TSS [tss] + address internal constant DVN_TSS = 0xf80cB5F7467B67cBEC77DcE6a13C89f210b554c0; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0x1176B42A5c76b41e0895705af028ff8A75c08156; +} + +library LayerZeroV2SonicMainnet { + // Chain metadata + uint32 internal constant EID = 30332; + uint256 internal constant CHAIN_ID = 146; + string internal constant CHAIN_KEY = "sonic-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x860E8D714944E7accE4F9e6247923ec5d30c0471); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNSonicMainnet { + // Bitgo [bitgo] + address internal constant DVN_BITGO = 0xdfBb5C677dB41b5EF3a180509CDe27B5c9784655; + // Canary [canary] + address internal constant DVN_CANARY = 0xb2c7832aA8DDA878De6f949485f927e9e532E92C; + // Curve [curve] + address internal constant DVN_CURVE = 0x3c4e4c3baA5D883654970fe34Db8c943ebf43ab2; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0xDe79818C75649773Fc462E9d3134b23B81741481; + // Frax [frax] + address internal constant DVN_FRAX = 0x805ed883FA3453E7Ac588667785a4495C573Cd13; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xCA764b512E2d2fD15fcA1c0a38F7cFE9153148F0; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x54dD79f5cE72b51FCBbcb170Dd01E32034323565; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x78f607fc38e071cEB8630B7B12c358eE01C31E96; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0xC8B7744AFd77C3EEcf310383837A07584766A51a; + // Muon [muon] + address internal constant DVN_MUON = 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0x64D684840881b45869B0C72B17aa911A3FC4305e; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x3b0531eB02Ab4aD72e7a531180beeF9493a00dD2; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0x05AaEfDf9dB6E0f7d27FA3b6EE099EDB33dA029E; + // P2P [p2p] + address internal constant DVN_P2P = 0x45A7305c65AAd28384F20a80F87a5183772E4F70; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // TSS [tss] + address internal constant DVN_TSS = 0x01BBb6319c596e70342a0cFD1193CfebE10BBB1D; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0x87a4d47918e83Df0fcF6040dBdC358119f7deb2a; +} + +library LayerZeroV2SophonMainnet { + // Chain metadata + uint32 internal constant EID = 30334; + uint256 internal constant CHAIN_ID = 50104; + string internal constant CHAIN_KEY = "sophon-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x5c6cfF4b7C49805F8295Ff73C204ac83f3bC4AE7); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x01047601DB5E63b1574aae317BAd9C684E3C9056); + address internal constant BLOCKED_MESSAGE_LIB = 0x3258287147FB7887d8A643006e26E19368057377; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x9AB633555E460C01f8c7b8ab24C88dD4986dD5A1); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x52fFEeaE5Ffa89D4b31c72F87ead3699FCB79e40; + address internal constant EXECUTOR = 0x553313dB58dEeFa3D55B1457D27EAB3Fe5EC87E8; + address internal constant DEAD_DVN = 0x04830f6deCF08Dec9eD6C3fCAD215245B78A59e1; + address internal constant LZ_EXECUTOR = 0xcaeB82549Ff641C4aF73505a137B5BeD06FEaf64; +} + +library LayerZeroV2DVNSophonMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x99aA6f70535873AC8167D69893a2CF70ECA544C3; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xCec9f0A49073ac4a1C439D06cb9448512389a64E; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x04830f6deCF08Dec9eD6C3fCAD215245B78A59e1; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x07fD0e370B49919cA8dA0CE842B8177263c0E12c; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xa1A31D9ddf919e87a23A1416b0aa0b600D32435D; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x7cC1A4A700AAb8FbA8160a4e09B04a9A68C6D914; +} + +library LayerZeroV2SpaceMainnet { + // Chain metadata + uint32 internal constant EID = 30341; + uint256 internal constant CHAIN_ID = 8227; + string internal constant CHAIN_KEY = "space-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xc1B621b18187F74c8F6D52a6F709Dd2780C09821); + address internal constant BLOCKED_MESSAGE_LIB = 0x3ADB8D9c040faE1fbAC9B579799cD4cA8c768f8A; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x377530cdA84DFb2673bF4d145DCF0C4D7fdcB5b6); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x282b3386571f7f794450d5789911a9804FA346b4; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNSpaceMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xE4193136B92bA91402313e95347c8e9FAD8d27d0; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x282b3386571f7f794450d5789911a9804FA346b4; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x7cacBe439EaD55fa1c22790330b12835c6884a91; +} + +library LayerZeroV2StableMainnet { + // Chain metadata + uint32 internal constant EID = 30396; + uint256 internal constant CHAIN_ID = 988; + string internal constant CHAIN_KEY = "stable-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x37aaaf95887624a363effB7762D489E3C05c2a02); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x15e51701F245F6D5bd0FEE87bCAf55B0841451B3); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNStableMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x8D6cC20D84FbEb5733c60436CeB8957Da2ac02C8; + // Frax [frax] + address internal constant DVN_FRAX = 0x45A7305c65AAd28384F20a80F87a5183772E4F70; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x965A80Dc87cec5848310E612DeAD84B543AeF874; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x9bCd17A654bffAa6f8fEa38D19661a7210e22196; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd; +} + +library LayerZeroV2StoryMainnet { + // Chain metadata + uint32 internal constant EID = 30364; + uint256 internal constant CHAIN_ID = 1514; + string internal constant CHAIN_KEY = "story-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x3EEfc82105418a2e611161daFCeCfb377DCa40fE); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + address internal constant BLOCKED_MESSAGE_LIB = 0xf540D892BC671f08E0B1c5B61185c53c2211e8f7; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xc1B621b18187F74c8F6D52a6F709Dd2780C09821); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7; + address internal constant EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; + address internal constant DEAD_DVN = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + address internal constant LZ_EXECUTOR = 0x306B9a8953B9462F8b826e6768a93C8EA7454965; +} + +library LayerZeroV2DVNStoryMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x77aAF86B4466A67869667BaBe02c6Ebe7E7791d6; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xdD9B12623ec1C7E744819708B9217b309fDE4080; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x73DDc92E39aEdA95FEb8D3E0008016d9F1268c76; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0xDD779AAAd20E62275457Af91b123bB13dd5aFd0B; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x032959aeC390996b9A82feA8273c76b938E3c861; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xA80AA110f05C9C6140018aAE0C4E08A70f43350d; + // TSS [tss] + address internal constant DVN_TSS = 0xe25741bda30bb79a66ADf656E7f2D3f0C4fb3191; +} + +library LayerZeroV2SubtensorevmMainnet { + // Chain metadata + uint32 internal constant EID = 30374; + uint256 internal constant CHAIN_ID = 964; + string internal constant CHAIN_KEY = "subtensorevm-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNSubtensorevmMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xc71a3d16F00d93c78AB89aAEDde7C0012A3b26Cb; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0x58DfF8622759eA75910a08DBA5D060579271dcD7; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xb3d5Fd1f98510e90bd59BD702eD362622672b97f; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd; + // P2P [p2p] + address internal constant DVN_P2P = 0x6c5f923B63Fdd52fb9C45dAeFA8695fA6b55a935; +} + +library LayerZeroV2SuperpositionMainnet { + // Chain metadata + uint32 internal constant EID = 30327; + uint256 internal constant CHAIN_ID = 55244; + string internal constant CHAIN_KEY = "superposition-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNSuperpositionMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x396dC0A78F789586E2982fCCD830C5954C193F3c; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x38179D3BFa6Ef1d69A8A7b0b671BA3D8836B2AE8; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x07C05EaB7716AcB6f83ebF6268F8EECDA8892Ba1; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // TSS [tss] + address internal constant DVN_TSS = 0xaeA4FB2C28252C8e5f195178820E8791Aa4A4e41; +} + +library LayerZeroV2SwellMainnet { + // Chain metadata + uint32 internal constant EID = 30335; + uint256 internal constant CHAIN_ID = 1923; + string internal constant CHAIN_KEY = "swell-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0xeAdd7f80c6880c03B0a32a36C46aD26e2879B6E5); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xc1B621b18187F74c8F6D52a6F709Dd2780C09821); + address internal constant BLOCKED_MESSAGE_LIB = 0x26463a4aF811c256f669524Ec2dC1ba7e7a83C37; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x377530cdA84DFb2673bF4d145DCF0C4D7fdcB5b6); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x2367325334447C5E1E0f1b3a6fB947b262F58312; + address internal constant EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2DVNSwellMainnet { + // Bitgo [bitgo] + address internal constant DVN_BITGO = 0x1269D1777bA8cF7498FE741869Ed4B73f2A47e93; + // Canary [canary] + address internal constant DVN_CANARY = 0xa2447e5B58D357c49Bf74B50B14421e6A100e525; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xf4672690eF45b46EAa3b688fe2f0Fc09e9366b20; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x7976b969A8E9560C483229FfBB855E8440898c9D; + // TSS [tss] + address internal constant DVN_TSS = 0x275448a4BF72Ab5A560e8A535AAC0c85B99bC896; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0x4d09C99ED8788b191144D6Cdd129014FDe70326f; +} + +library LayerZeroV2SwimmerMainnet { + // Chain metadata + uint32 internal constant EID = 30114; + string internal constant CHAIN_KEY = "swimmer-mainnet"; + +} + +library LayerZeroV2TacMainnet { + // Chain metadata + uint32 internal constant EID = 30377; + uint256 internal constant CHAIN_ID = 239; + string internal constant CHAIN_KEY = "tac-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNTacMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x07ff86c392588254Ad10F0811dbBcad45f4C7d87; + // Curve [curve] + address internal constant DVN_CURVE = 0x4d45727d2de5ffC811E6A161c3a7233a2Ea2e0E7; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xB19A9370D404308040A9760678c8Ca28aFfbbb76; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x58249a2Ec05c1978bF21DF1f5eC1847e42455CF4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x97841D4AB18E9A923322A002d5b8Eb42b31Ccdb5; + // P2P [p2p] + address internal constant DVN_P2P = 0x965A80Dc87cec5848310E612DeAD84B543AeF874; +} + +library LayerZeroV2TaikoMainnet { + // Chain metadata + uint32 internal constant EID = 30290; + uint256 internal constant CHAIN_ID = 167000; + string internal constant CHAIN_KEY = "taiko-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xc1B621b18187F74c8F6D52a6F709Dd2780C09821); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x377530cdA84DFb2673bF4d145DCF0C4D7fdcB5b6); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043; + address internal constant EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; + address internal constant DEAD_DVN = 0xc30Ff4F3182A75C0bE27493fA357886c06c384b6; + address internal constant LZ_EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2DVNTaikoMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xa9Ff468ad000A4D5729826459197a0dB843F433E; + // Curve [curve] + address internal constant DVN_CURVE = 0x8bAFe0299CB4D3fF75d3f7045554474Bf414FD11; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xBD237eF21319E2200487BDF30c188C6c34b16D3B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xc30Ff4F3182A75C0bE27493fA357886c06c384b6; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0x2c7185f5B0976397d9eB5c19d639d4005e6708f0; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x37473676FF697f2Eba29C8A3105309AbF00bA013; + // TSS [tss] + address internal constant DVN_TSS = 0x0EC3Aa6352A0BFA3352523938260e42c212fa8E7; +} + +library LayerZeroV2TelosMainnet { + // Chain metadata + uint32 internal constant EID = 30199; + uint256 internal constant CHAIN_ID = 40; + string internal constant CHAIN_KEY = "telos-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x0BcAC336466ef7F1e0b5c184aAB2867C108331aF); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x8F76bAcC52b5730c1f1A2413B8936D4df12aF4f6); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xF08f13c080fcc530B1C21DE827C27B7b66874DDc; + address internal constant EXECUTOR = 0x1785c94d31E3E3Ab1079e7ca8a9fbDf33EEf9dd5; + address internal constant DEAD_DVN = 0x1DE78bEd411ad03e7f9B4c591D9C80499287Cb04; + address internal constant LZ_EXECUTOR = 0x53490de975969B34E537E541E19F26b15e368895; +} + +library LayerZeroV2DVNTelosMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Bitgo (deprecated) [bitgo] + address internal constant DVN_BITGO = 0x2A22804Cfa992D5cb1324863ec4aDa920256B908; + // Bitgo [bitgo] + address internal constant DVN_BITGO_2 = 0x31B8c7CD7226eA79E833FaBDcCbcA0fa38d6E0a1; + // Canary [canary] + address internal constant DVN_CANARY = 0xae5273d893aD87c8f38D45E822A7b4321cCeFB4c; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x1DE78bEd411ad03e7f9B4c591D9C80499287Cb04; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x3C5575898f59c097681d1Fc239c2c6Ad36B7b41c; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x809CDE2AfcF8627312E87a6a7bbFFaB3F8F347c7; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xA80AA110f05C9C6140018aAE0C4E08A70f43350d; + // TSS [tss] + address internal constant DVN_TSS = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0xd2750419b4a663c8Ff8f7B6067885D82f299aCe9; +} + +library LayerZeroV2TenetMainnet { + // Chain metadata + uint32 internal constant EID = 30173; + uint256 internal constant CHAIN_ID = 1559; + string internal constant CHAIN_KEY = "tenet-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x1785c94d31E3E3Ab1079e7ca8a9fbDf33EEf9dd5); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x16909F77E57CDaaB7BE0fbDF12b6A77d99541605); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x20E48549D5269e9EA5D7347a915F71AcFE88E52d; + address internal constant EXECUTOR = 0xB12514e226E50844E4655696c92c0c36B8A53141; + address internal constant DEAD_DVN = 0x0e557f8F5BfeEDC6905594987Dccc2E10aF33E5C; + address internal constant LZ_EXECUTOR = 0x1A40Cd69966222b2FAec9B1b58e215d49d093A08; +} + +library LayerZeroV2DVNTenetMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Canary [canary] + address internal constant DVN_CANARY = 0xA1491AdA1168f04df32F72913fc3F27522950acf; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x0e557f8F5BfeEDC6905594987Dccc2E10aF33E5C; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x28A5536cA9F36c45A9d2AC8d2B62Fc46Fde024B6; + // TSS [tss] + address internal constant DVN_TSS = 0x282b3386571f7f794450d5789911a9804FA346b4; +} + +library LayerZeroV2TiltyardMainnet { + // Chain metadata + uint32 internal constant EID = 30238; + uint256 internal constant CHAIN_ID = 710420; + string internal constant CHAIN_KEY = "tiltyard-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x62d142E186344C0a2445c822e356E87faF7b8288); + address internal constant BLOCKED_MESSAGE_LIB = 0xf540D892BC671f08E0B1c5B61185c53c2211e8f7; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xd83B25f4Ff6C596380c36C7eD10c225d6B17Dfd7); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x2936aB2dD26Bc42F05BDBC97b4aD52f989D994D7; + address internal constant EXECUTOR = 0xEF7781FC1C4F7B2Fd3Cf03f4d65b6835b27C1A0d; + address internal constant DEAD_DVN = 0xa50d9C4aD49933f7bC0574D8c54427EC42C2B073; + address internal constant LZ_EXECUTOR = 0xb328c2C62E83D3a179646b5c7284A99182735241; +} + +library LayerZeroV2DVNTiltyardMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x0165C910Ea47964a23DC4FB7c7483F6f3ad462aE; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xa50d9C4aD49933f7bC0574D8c54427EC42C2B073; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xCFc3f9dD0205b76FF04e20243f106465Dd829656; + // TSS [tss] + address internal constant DVN_TSS = 0xfDfA2330713A8e2EaC6e4f15918F11937fFA4dBE; +} + +library LayerZeroV2TomoMainnet { + // Chain metadata + uint32 internal constant EID = 30196; + uint256 internal constant CHAIN_ID = 88; + string internal constant CHAIN_KEY = "tomo-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x6f1686189f32e78f1D83e7c6Ed433FCeBc3A5B51); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x7004396C99D5690da76A7C59057C5f3A53e01704); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xCFf08a35A5f27F306e2DA99ff198dB90f13DEF77; + address internal constant EXECUTOR = 0x2d24207F9C1F77B2E08F2C3aD430da18e355CF66; + address internal constant DEAD_DVN = 0x658Ff096EE44e16564beA9E1161eCBC503aE6E75; + address internal constant LZ_EXECUTOR = 0xA09dB5142654e3eB5Cf547D66833FAe7097B21C3; +} + +library LayerZeroV2DVNTomoMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x658Ff096EE44e16564beA9E1161eCBC503aE6E75; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x1aCe9DD1BC743aD036eF2D92Af42Ca70A1159df5; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x790d7B1E97a086eb0012393b65a5B32cE58a04Dc; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2UnichainMainnet { + // Chain metadata + uint32 internal constant EID = 30320; + uint256 internal constant CHAIN_ID = 130; + string internal constant CHAIN_KEY = "unichain-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x178F93794328C04988bcD52a1B820eC105b17f2f); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNUnichainMainnet { + // ABDB [animoca-blockdaemon] + address internal constant DVN_ABDB = 0x1337834fd822065Af36a13657d2E847616129F3f; + // Bitgo [bitgo] + address internal constant DVN_BITGO = 0x6a4C9096F162f0ab3C0517B0a40dc1CE44785e16; + // Bitgo (deprecated) [bitgo] + address internal constant DVN_BITGO_2 = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Canary [canary] + address internal constant DVN_CANARY = 0x00A979a5D306E9c5F8Cf473659e75f8002E06fc8; + // Frax [frax] + address internal constant DVN_FRAX = 0x97faa2a9c9bf8B4082B175A5B894Ce6bac6697a8; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xD8A1e914BDc19Be62d548403303f13663A360C6b; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0xC6a6324932B399D6A673B7Ed0af671F28033E046; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xB85775a6868C1a729447951FD59F9f7F095Cd0B1; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0xF02D0F9ACc2870e12C34aa3816dd86FaC1339f38; + // Nansen [nansen] + address internal constant DVN_NANSEN = 0x144c6a7A17781e165f430b18f0680c5b3e3713E2; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x643923A777570c5377CD0e973d999c00cce55249; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0x25e0e650a78e6304A3983Fc4b7Ffc6544b1bEea6; + // P2P [p2p] + address internal constant DVN_P2P = 0xab82E9b24004b954985528dAc14D1B020722a3c8; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x9885110b909E88bb94f7f767A68ec2558B2AfA73; + // TSS [tss] + address internal constant DVN_TSS = 0x306B9a8953B9462F8b826e6768a93C8EA7454965; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x208894346d2995A26493f8C2a5b04fB1ee41A899; + // WBTC Canary [canary-wbtc] + address internal constant DVN_WBTC_CANARY = 0x148aE5e1df44Cf8b6D258430Eab79b28d0da4Aa6; +} + +library LayerZeroV2WorldchainMainnet { + // Chain metadata + uint32 internal constant EID = 30319; + uint256 internal constant CHAIN_ID = 480; + string internal constant CHAIN_KEY = "worldchain-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0xe57308A83D94276C27232189Db8BdE8E2FFe41a3); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNWorldchainMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xe9C24dD582e37FAACa7d44c799530688DE92Da73; + // Frax [frax] + address internal constant DVN_FRAX = 0xE16561B56BDf003B785347d237905BaE24f5F973; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x95729Ea44326f8adD8A9b1d987279DBdC1DD3dFf; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN_2 = 0x00E91548787Caf130D811EF1872f2Bc2C0583d90; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xF007f1Fef50C0aCAF4418741454BCAEaeCB96B87; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS_2 = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x30aC79B638fFFd3a7F05338249ac6eD371E2dF2b; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND_2 = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x7cEc38c06a2FEC9Fd525B1925544110204CbB5f6; +} + +library LayerZeroV2XaiMainnet { + // Chain metadata + uint32 internal constant EID = 30236; + uint256 internal constant CHAIN_ID = 660279; + string internal constant CHAIN_KEY = "xai-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0xEFf272433131a0077592f58a16B702EE49B04312; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNXaiMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x34730f2570E6cff8B1C91FaaBF37D0DD917c4367; + // Canary [canary] + address internal constant DVN_CANARY = 0x7A3D18E2324536294CD6F054cDde7c994f40391A; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xE94aE34DfCC87A61836938641444080B98402c75; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xEFf272433131a0077592f58a16B702EE49B04312; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7; + // TSS [tss] + address internal constant DVN_TSS = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2XchainMainnet { + // Chain metadata + uint32 internal constant EID = 30291; + uint256 internal constant CHAIN_ID = 94524; + string internal constant CHAIN_KEY = "xchain-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x69fBED8561F829eFBB3c9785f1983641B27887e7; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNXchainMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x0E5c792Ec122cBE89cE0085D7EFcdB151eae3376; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x69fBED8561F829eFBB3c9785f1983641B27887e7; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x56053A8f4db677e5774F8Ee5BdD9D2dC270075f3; +} + +library LayerZeroV2XdcMainnet { + // Chain metadata + uint32 internal constant EID = 30365; + uint256 internal constant CHAIN_ID = 50; + string internal constant CHAIN_KEY = "xdc-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x26463a4aF811c256f669524Ec2dC1ba7e7a83C37; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2DVNXdcMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x307d81ef09c72730f57667bF1e9b62DB4904053f; + // Curve [curve] + address internal constant DVN_CURVE = 0xAb6d3d37D8Dc309e7d8086B2e85a953b84Ee5fA9; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0xdFDB9b369eF5821e9E6cB9B3329C74C38fe93194; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x1294E3347ec64Fd63e1d0594Dc1294247cd237C7; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x4FE90e0f2A99e464d6E97B161d72101CD03C20fe; +} + +library LayerZeroV2XlayerMainnet { + // Chain metadata + uint32 internal constant EID = 30274; + uint256 internal constant CHAIN_ID = 196; + string internal constant CHAIN_KEY = "xlayer-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4514FC667a944752ee8A29F544c1B20b1A315f25; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0xAC9dc8415B2348d8135eC725e8E9B1F1DfAF8e53; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNXlayerMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0x047d9DBe4fC6B5c916F37237F547f9F42809935a; + // Curve [curve] + address internal constant DVN_CURVE = 0x1a92C25Cb7Cd80E1138E8125FC0a0B0642688C0B; + // Frax [frax] + address internal constant DVN_FRAX = 0x2Ae36A544b904F2f2960F6Fd1a6084b4b11ba334; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xAC9dc8415B2348d8135eC725e8E9B1F1DfAF8e53; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x28af4dADbc5066e994986E8bb105240023dC44B6; + // Paxos [paxos] + address internal constant DVN_PAXOS = 0x8bEFB8cd9529e539B095251Ea3a058e710225D30; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // TSS [tss] + address internal constant DVN_TSS = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; + // USDT0 [usdt0] + address internal constant DVN_USDT0 = 0x6De0D56e2d695dB9E2B4FBEcA3D81372c59848BB; +} + +library LayerZeroV2XplaMainnet { + // Chain metadata + uint32 internal constant EID = 30216; + uint256 internal constant CHAIN_ID = 37; + string internal constant CHAIN_KEY = "xpla-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xF622DFb40bf7340DBCf1e5147D6CFD95d7c5cF1F); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x6167caAb5c3DA63311186db4D4E2596B20f557ec); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x5EB6b3Db915d29fc624b8a0e42AC029e36a1D86B; + address internal constant EXECUTOR = 0x148f693af10ddfaE81cDdb36F4c93B31A90076e1; + address internal constant DEAD_DVN = 0xADfAC55b334dE39B3eFBe88Bb1c992765e88Bb60; + address internal constant LZ_EXECUTOR = 0x8DD9197E51dC6082853aD71D35912C53339777A7; +} + +library LayerZeroV2DVNXplaMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Canary [canary] + address internal constant DVN_CANARY = 0x73DDc92E39aEdA95FEb8D3E0008016d9F1268c76; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xADfAC55b334dE39B3eFBe88Bb1c992765e88Bb60; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x2d24207F9C1F77B2E08F2C3aD430da18e355CF66; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x809CDE2AfcF8627312E87a6a7bbFFaB3F8F347c7; + // TSS [tss] + address internal constant DVN_TSS = 0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7; + // Ubisoft [ubisoft] + address internal constant DVN_UBISOFT = 0xa51cE237FaFA3052D5d3308Df38A024724Bb1274; +} + +library LayerZeroV2ZircuitMainnet { + // Chain metadata + uint32 internal constant EID = 30303; + uint256 internal constant CHAIN_ID = 48900; + string internal constant CHAIN_KEY = "zircuit-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0xcCE466a522984415bC91338c232d98869193D46e; + address internal constant DEAD_DVN = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + address internal constant LZ_EXECUTOR = 0xa20DB4Ffe74A31D17fc24BD32a7DD7555441058e; +} + +library LayerZeroV2DVNZircuitMainnet { + // Canary [canary] + address internal constant DVN_CANARY = 0xe552485d02EDd3067FE7FCbD4dd56BB1D3A998D2; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xdCdd4628F858b45260C31D6ad076bD2C3D3c2f73; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Stakingcabin [stakingcabin] + address internal constant DVN_STAKINGCABIN = 0x92ef4381a03372985985E70fb15E9F081E2e8D14; + // TSS [tss] + address internal constant DVN_TSS = 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a; +} + +library LayerZeroV2ZkatanaMainnet { + // Chain metadata + uint32 internal constant EID = 30257; + uint256 internal constant CHAIN_ID = 3776; + string internal constant CHAIN_KEY = "zkatana-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x2367325334447C5E1E0f1b3a6fB947b262F58312); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xc1B621b18187F74c8F6D52a6F709Dd2780C09821); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x01cA5322ce196568a62780C480bb0CC0B595Efec; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNZkatanaMainnet { + // Horizen (deprecated) [horizen-labs] + address internal constant DVN_HORIZEN = 0x0131A4CE592E5F5EabB08E62B1CEeB9bAfEBA036; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x01cA5322ce196568a62780C480bb0CC0B595Efec; + // LayerZero Labs (deprecated) [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887; + // TSS (deprecated) [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2ZkconsensysMainnet { + // Chain metadata + uint32 internal constant EID = 30183; + uint256 internal constant CHAIN_ID = 59144; + string internal constant CHAIN_KEY = "zkconsensys-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x30F776548f9Aaad0935E2c03e930d10F15cE558f); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x32042142DD551b4EbE17B6FEd53131dd4b4eEa06); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xE22ED54177CE1148C557de74E4873619e6c6b205); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x2c83731aa397cd8E6bF8C77d9090b8845581d08c; + address internal constant EXECUTOR = 0x0408804C5dcD9796F22558464E6fE5bDdF16A7c7; + address internal constant DEAD_DVN = 0x1b368a0d7c57080a01054862114B5a42e54CBb98; + address internal constant LZ_EXECUTOR = 0x59dAE6516D2fA7F21195adC0Cda14d819D21031C; +} + +library LayerZeroV2DVNZkconsensysMainnet { + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xF45742BbfaBCEe739eA2a2d0BA2dd140F1f2C6A3; + // Canary [canary] + address internal constant DVN_CANARY = 0xDA63525a0Fc42Bcc2cAD1dD28708d5ed11849347; + // Deutsche Telekom [deutsche-telekom] + address internal constant DVN_DEUTSCHE_TELEKOM = 0xa2d10677441230C4AeD58030e4EA6Ba7Bfd80393; + // Frax [frax] + address internal constant DVN_FRAX = 0xF4064220871e3B94Ca6aB3b0CEE8e29178bF47dE; + // Google [google-cloud] + address internal constant DVN_GOOGLE = 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x1b368a0d7c57080a01054862114B5a42e54CBb98; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x129Ee430Cb2Ff2708CCADDBDb408a88Fe4FFd480; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x08670E326968d18D4fe359080b8E3eeeA552E867; + // Muon [muon] + address internal constant DVN_MUON = 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // P2P [p2p] + address internal constant DVN_P2P = 0x0b239476A771834D846Cb505817baC3C391c338A; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA = 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24; + // Polyhedra [polyhedra-network] + address internal constant DVN_POLYHEDRA_2 = 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0xEf269BBaDB81DE86E4b3278fa1DAe1723545268b; + // Superform [superform] + address internal constant DVN_SUPERFORM = 0x7A205ED4e3d7f9d0777594501705D8CD405c3B05; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} + +library LayerZeroV2ZklinkMainnet { + // Chain metadata + uint32 internal constant EID = 30301; + uint256 internal constant CHAIN_ID = 810180; + string internal constant CHAIN_KEY = "zklink-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x5c6cfF4b7C49805F8295Ff73C204ac83f3bC4AE7); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x01047601DB5E63b1574aae317BAd9C684E3C9056); + address internal constant BLOCKED_MESSAGE_LIB = 0x3258287147FB7887d8A643006e26E19368057377; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x9AB633555E460C01f8c7b8ab24C88dD4986dD5A1); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x52fFEeaE5Ffa89D4b31c72F87ead3699FCB79e40; + address internal constant EXECUTOR = 0x06e56abD0cb3C88880644bA3C534A498cA18E5C8; + address internal constant DEAD_DVN = 0x4c1aC7b3C1223887dB9178d2437200B594EFFCf4; + address internal constant LZ_EXECUTOR = 0xdF7D44c9EfA2DB43152D9F5eD8b755b4BEbd323B; +} + +library LayerZeroV2DVNZklinkMainnet { + // BWare [bware-labs] + address internal constant DVN_BWARE = 0x1253E268Bc04bB43CB96D2F7Ee858b8A1433Cf6D; + // Canary [canary] + address internal constant DVN_CANARY = 0x0D1bc4Efd08940eB109Ef3040c1386d09B6334E0; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x27bB790440376dB53c840326263801FAFd9F0EE6; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x4c1aC7b3C1223887dB9178d2437200B594EFFCf4; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x04830f6deCF08Dec9eD6C3fCAD215245B78A59e1; + // Nodesguru [nodes-guru] + address internal constant DVN_NODESGURU = 0x3A5a74f863ec48c1769C4Ee85f6C3d70f5655E2A; + // TSS (deprecated) [tss] + address internal constant DVN_TSS = 0xb6a4cC4a7d78FB37d668297D4c76fE750De626A3; + // TSS [tss] + address internal constant DVN_TSS_2 = 0x8b82a8DE13aF4bdAC68134494d83A7Aacc113165; +} + +library LayerZeroV2ZkpolygonMainnet { + // Chain metadata + uint32 internal constant EID = 30158; + uint256 internal constant CHAIN_ID = 1101; + string internal constant CHAIN_KEY = "zkpolygon-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x28B6140ead70cb2Fb669705b3598ffB4BEaA060b); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x581b26F362AD383f7B51eF8A165Efa13DDe398a4); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xbe0d08a85EeBFCC6eDA0A843521f7CBB1180D2e2; + address internal constant EXECUTOR = 0xbE4fB271cfB7bcbB47EA9573321c7bfe309fc220; + address internal constant DEAD_DVN = 0xbD8F7f0B165213Aaabb5a9eA0D572d5FD9829664; + address internal constant LZ_EXECUTOR = 0x7eb3f67C1d501872295bC847a1346cB839D3b00f; +} + +library LayerZeroV2DVNZkpolygonMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x12b4E588BeB7154519c0C6f737bB8cBa1D4E5BC7; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // Frax [frax] + address internal constant DVN_FRAX = 0x651b1cf59014420112f8B7fCFDA840a16Ad763e0; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0xbD8F7f0B165213Aaabb5a9eA0D572d5FD9829664; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x488863D609F3A673875a914fBeE7508a1DE45eC6; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x7A7dDC46882220a075934f40380d3A7e1e87d409; + // TSS [tss] + address internal constant DVN_TSS = 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb; + // Ubisoft [ubisoft] + address internal constant DVN_UBISOFT = 0xD074B6bbCBEC2f2B4c4265DE3D95e521f82bF669; +} + +library LayerZeroV2ZksyncMainnet { + // Chain metadata + uint32 internal constant EID = 30165; + uint256 internal constant CHAIN_ID = 324; + string internal constant CHAIN_KEY = "zksync-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0xd07C30aF3Ff30D96BDc9c6044958230Eb797DDBF); + + // Message libraries + IMessageLib internal constant READ_LIB_1002 = IMessageLib(0x2C6FEDD430Be3c916292c3700144D4891c0FFedD); + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0x07fD0e370B49919cA8dA0CE842B8177263c0E12c); + address internal constant BLOCKED_MESSAGE_LIB = 0x0FDdFC529B5912E1cBe38cCEdF8e226566E596D3; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x04830f6deCF08Dec9eD6C3fCAD215245B78A59e1); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x15a95848317CAAf5b83BfA1603497CdC20Fb84C1; + address internal constant EXECUTOR = 0x664e390e672A811c12091db8426cBb7d68D5D8A6; + address internal constant DEAD_DVN = 0x3F80157B0d0025C85f905b75b1Ee2386F6daf168; + address internal constant LZ_EXECUTOR = 0x2Ce5f0d1Bfcb5b86ff94C2C580Ab65459e004D43; +} + +library LayerZeroV2DVNZksyncMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x0D1bc4Efd08940eB109Ef3040c1386d09B6334E0; + // BWare [bware-labs] + address internal constant DVN_BWARE = 0x3A5a74f863ec48c1769C4Ee85f6C3d70f5655E2A; + // Canary [canary] + address internal constant DVN_CANARY = 0x05Db3a229293C09F639a16526bB2481704716Df0; + // Frax [frax] + address internal constant DVN_FRAX = 0x2Eb85384CAd49A67eBd8e2AfB0f72B3F586bAF03; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0x1253E268Bc04bB43CB96D2F7Ee858b8A1433Cf6D; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x3F80157B0d0025C85f905b75b1Ee2386F6daf168; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x620A9DF73D2F1015eA75aea1067227F9013f5C51; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xb183c2b91cf76cAd13602b32ADa2Fd273f19009C; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x62aA89bAd332788021F6F4F4Fb196D5Fe59C27a6; + // TSS [tss] + address internal constant DVN_TSS = 0xCB7aD38D45ab5bcF5880B0fa851263C29582c18a; + // Ubisoft [ubisoft] + address internal constant DVN_UBISOFT = 0x02A7Bf7298D17C12181578fF474c17C922aAd75A; + // Zenrock (deprecated) [zenrock] + address internal constant DVN_ZENROCK = 0xc4A1F52fDA034A9A5E1B3b27D14451d15776Fef6; +} + +library LayerZeroV2ZkverifyMainnet { + // Chain metadata + uint32 internal constant EID = 30386; + uint256 internal constant CHAIN_ID = 1408; + string internal constant CHAIN_KEY = "zkverify-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x6F475642a6e85809B1c36Fa62763669b1b48DD5B); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); + address internal constant BLOCKED_MESSAGE_LIB = 0xC1cE56B2099cA68720592583C7984CAb4B6d7E7a; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0xe1844c5D63a9543023008D332Bd3d2e6f1FE1043); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4; + address internal constant EXECUTOR = 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b; + address internal constant DEAD_DVN = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + address internal constant LZ_EXECUTOR = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; +} + +library LayerZeroV2DVNZkverifyMainnet { + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0x282b3386571f7f794450d5789911a9804FA346b4; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0x38179D3BFa6Ef1d69A8A7b0b671BA3D8836B2AE8; +} + +library LayerZeroV2ZoraMainnet { + // Chain metadata + uint32 internal constant EID = 30195; + uint256 internal constant CHAIN_ID = 7777777; + string internal constant CHAIN_KEY = "zora-mainnet"; + + // Core protocol + ILayerZeroEndpointV2 internal constant ENDPOINT_V2 = ILayerZeroEndpointV2(0x1a44076050125825900e736c501f859c50fE728c); + + // Message libraries + IMessageLib internal constant SEND_ULN_302 = IMessageLib(0xeDf930Cd8095548f97b21ec4E2dE5455a7382f04); + address internal constant BLOCKED_MESSAGE_LIB = 0x1ccBf0db9C192d969de57E25B3fF09A25bb1D862; + IMessageLib internal constant RECEIVE_ULN_302 = IMessageLib(0x57D9775eE8feC31F1B612a06266f599dA167d211); + + // Other contracts + address internal constant ENDPOINT_V2_VIEW = 0x4d91d0Bd09d634A7f5a99b5eeEF3af6241E9Fe07; + address internal constant EXECUTOR = 0x4f8B7a7a346Da5c467085377796e91220d904c15; + address internal constant DEAD_DVN = 0x08aB92e05bA1dEC2C5bb876caa0Af60cAede1D17; + address internal constant LZ_EXECUTOR = 0x1aCe9DD1BC743aD036eF2D92Af42Ca70A1159df5; +} + +library LayerZeroV2DVNZoraMainnet { + // BCW [bcw] + address internal constant DVN_BCW = 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5; + // Canary [canary] + address internal constant DVN_CANARY = 0x3AD8537B6936c596ca36D736063380810f7d3252; + // Horizen [horizen-labs] + address internal constant DVN_HORIZEN = 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B; + // LZDeadDVN (deprecated) [lz-dead-dvn] + address internal constant DVN_LZ_DEAD = 0x08aB92e05bA1dEC2C5bb876caa0Af60cAede1D17; + // LayerZero Labs [layerzero-labs] + address internal constant DVN_LAYERZERO_LABS = 0xC1EC25A9e8a8DE5Aa346f635B33e5B74c4c081aF; + // Luganodes [luganodes] + address internal constant DVN_LUGANODES = 0x9FE36b305120556dbeefab58d58877D87b553DF5; + // Nethermind [nethermind] + address internal constant DVN_NETHERMIND = 0xa7b5189bcA84Cd304D8553977c7C614329750d99; + // P2P [p2p] + address internal constant DVN_P2P = 0xD1b5493e712081A6FBAb73116405590046668F6b; + // Stargate [stargate] + address internal constant DVN_STARGATE = 0x376839ad96f4f0CDfFe10AAF987aBaD3AF0A8901; + // TSS [tss] + address internal constant DVN_TSS = 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa; +} \ No newline at end of file diff --git a/protocol-units/settlement/mcr/contracts/layerzero_book/LZProtocol.sol b/protocol-units/settlement/mcr/contracts/layerzero_book/LZProtocol.sol new file mode 100644 index 000000000..7d7495ffc --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/layerzero_book/LZProtocol.sol @@ -0,0 +1,385 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.22; + +import "./LZAddresses.sol"; +import "./interfaces/ILZProtocol.sol"; + +/// @title LayerZero Protocol Address Provider +/// @notice Provides LayerZero protocol addresses from the generated address book +/// @dev Implements ILZProtocol interface for clean access to core protocol addresses +contract LZProtocol is ILZProtocol { + // Storage for chain data + mapping(uint32 => ProtocolAddresses) private _protocolAddresses; + + // List of registered EIDs for iteration + uint32[] private _registeredEids; + + // Mapping from chain name to EID for reverse lookup + mapping(string => uint32) private _chainNameToEid; + + constructor() { + _registerAllChains(); + } + + /// @notice Register all supported chains from the AddressBook + function _registerAllChains() private { + // Mainnets + _registerChain(LayerZeroV2AbstractMainnet.EID, address(LayerZeroV2AbstractMainnet.ENDPOINT_V2), address(LayerZeroV2AbstractMainnet.SEND_ULN_302), address(LayerZeroV2AbstractMainnet.RECEIVE_ULN_302), LayerZeroV2AbstractMainnet.EXECUTOR, LayerZeroV2AbstractMainnet.CHAIN_ID, "abstract-mainnet"); + _registerChain(LayerZeroV2AnimechainMainnet.EID, address(LayerZeroV2AnimechainMainnet.ENDPOINT_V2), address(LayerZeroV2AnimechainMainnet.SEND_ULN_302), address(LayerZeroV2AnimechainMainnet.RECEIVE_ULN_302), LayerZeroV2AnimechainMainnet.EXECUTOR, LayerZeroV2AnimechainMainnet.CHAIN_ID, "animechain-mainnet"); + _registerChain(LayerZeroV2ApeMainnet.EID, address(LayerZeroV2ApeMainnet.ENDPOINT_V2), address(LayerZeroV2ApeMainnet.SEND_ULN_302), address(LayerZeroV2ApeMainnet.RECEIVE_ULN_302), LayerZeroV2ApeMainnet.EXECUTOR, LayerZeroV2ApeMainnet.CHAIN_ID, "ape-mainnet"); + _registerChain(LayerZeroV2ApexfusionnexusMainnet.EID, address(LayerZeroV2ApexfusionnexusMainnet.ENDPOINT_V2), address(LayerZeroV2ApexfusionnexusMainnet.SEND_ULN_302), address(LayerZeroV2ApexfusionnexusMainnet.RECEIVE_ULN_302), LayerZeroV2ApexfusionnexusMainnet.EXECUTOR, LayerZeroV2ApexfusionnexusMainnet.CHAIN_ID, "apexfusionnexus-mainnet"); + _registerChain(LayerZeroV2ArbitrumMainnet.EID, address(LayerZeroV2ArbitrumMainnet.ENDPOINT_V2), address(LayerZeroV2ArbitrumMainnet.SEND_ULN_302), address(LayerZeroV2ArbitrumMainnet.RECEIVE_ULN_302), LayerZeroV2ArbitrumMainnet.EXECUTOR, LayerZeroV2ArbitrumMainnet.CHAIN_ID, "arbitrum-mainnet"); + _registerChain(LayerZeroV2AstarMainnet.EID, address(LayerZeroV2AstarMainnet.ENDPOINT_V2), address(LayerZeroV2AstarMainnet.SEND_ULN_302), address(LayerZeroV2AstarMainnet.RECEIVE_ULN_302), LayerZeroV2AstarMainnet.EXECUTOR, LayerZeroV2AstarMainnet.CHAIN_ID, "astar-mainnet"); + _registerChain(LayerZeroV2AuroraMainnet.EID, address(LayerZeroV2AuroraMainnet.ENDPOINT_V2), address(LayerZeroV2AuroraMainnet.SEND_ULN_302), address(LayerZeroV2AuroraMainnet.RECEIVE_ULN_302), LayerZeroV2AuroraMainnet.EXECUTOR, LayerZeroV2AuroraMainnet.CHAIN_ID, "aurora-mainnet"); + _registerChain(LayerZeroV2AvalancheMainnet.EID, address(LayerZeroV2AvalancheMainnet.ENDPOINT_V2), address(LayerZeroV2AvalancheMainnet.SEND_ULN_302), address(LayerZeroV2AvalancheMainnet.RECEIVE_ULN_302), LayerZeroV2AvalancheMainnet.EXECUTOR, LayerZeroV2AvalancheMainnet.CHAIN_ID, "avalanche-mainnet"); + _registerChain(LayerZeroV2BahamutMainnet.EID, address(LayerZeroV2BahamutMainnet.ENDPOINT_V2), address(LayerZeroV2BahamutMainnet.SEND_ULN_302), address(LayerZeroV2BahamutMainnet.RECEIVE_ULN_302), LayerZeroV2BahamutMainnet.EXECUTOR, LayerZeroV2BahamutMainnet.CHAIN_ID, "bahamut-mainnet"); + _registerChain(LayerZeroV2BaseMainnet.EID, address(LayerZeroV2BaseMainnet.ENDPOINT_V2), address(LayerZeroV2BaseMainnet.SEND_ULN_302), address(LayerZeroV2BaseMainnet.RECEIVE_ULN_302), LayerZeroV2BaseMainnet.EXECUTOR, LayerZeroV2BaseMainnet.CHAIN_ID, "base-mainnet"); + _registerChain(LayerZeroV2Bb1Mainnet.EID, address(LayerZeroV2Bb1Mainnet.ENDPOINT_V2), address(LayerZeroV2Bb1Mainnet.SEND_ULN_302), address(LayerZeroV2Bb1Mainnet.RECEIVE_ULN_302), LayerZeroV2Bb1Mainnet.EXECUTOR, LayerZeroV2Bb1Mainnet.CHAIN_ID, "bb1-mainnet"); + _registerChain(LayerZeroV2BeraMainnet.EID, address(LayerZeroV2BeraMainnet.ENDPOINT_V2), address(LayerZeroV2BeraMainnet.SEND_ULN_302), address(LayerZeroV2BeraMainnet.RECEIVE_ULN_302), LayerZeroV2BeraMainnet.EXECUTOR, LayerZeroV2BeraMainnet.CHAIN_ID, "bera-mainnet"); + _registerChain(LayerZeroV2BevmMainnet.EID, address(LayerZeroV2BevmMainnet.ENDPOINT_V2), address(LayerZeroV2BevmMainnet.SEND_ULN_302), address(LayerZeroV2BevmMainnet.RECEIVE_ULN_302), LayerZeroV2BevmMainnet.EXECUTOR, LayerZeroV2BevmMainnet.CHAIN_ID, "bevm-mainnet"); + _registerChain(LayerZeroV2BitlayerMainnet.EID, address(LayerZeroV2BitlayerMainnet.ENDPOINT_V2), address(LayerZeroV2BitlayerMainnet.SEND_ULN_302), address(LayerZeroV2BitlayerMainnet.RECEIVE_ULN_302), LayerZeroV2BitlayerMainnet.EXECUTOR, LayerZeroV2BitlayerMainnet.CHAIN_ID, "bitlayer-mainnet"); + _registerChain(LayerZeroV2BlastMainnet.EID, address(LayerZeroV2BlastMainnet.ENDPOINT_V2), address(LayerZeroV2BlastMainnet.SEND_ULN_302), address(LayerZeroV2BlastMainnet.RECEIVE_ULN_302), LayerZeroV2BlastMainnet.EXECUTOR, LayerZeroV2BlastMainnet.CHAIN_ID, "blast-mainnet"); + _registerChain(LayerZeroV2BobMainnet.EID, address(LayerZeroV2BobMainnet.ENDPOINT_V2), address(LayerZeroV2BobMainnet.SEND_ULN_302), address(LayerZeroV2BobMainnet.RECEIVE_ULN_302), LayerZeroV2BobMainnet.EXECUTOR, LayerZeroV2BobMainnet.CHAIN_ID, "bob-mainnet"); + _registerChain(LayerZeroV2BotanixMainnet.EID, address(LayerZeroV2BotanixMainnet.ENDPOINT_V2), address(LayerZeroV2BotanixMainnet.SEND_ULN_302), address(LayerZeroV2BotanixMainnet.RECEIVE_ULN_302), LayerZeroV2BotanixMainnet.EXECUTOR, LayerZeroV2BotanixMainnet.CHAIN_ID, "botanix-mainnet"); + _registerChain(LayerZeroV2BouncebitMainnet.EID, address(LayerZeroV2BouncebitMainnet.ENDPOINT_V2), address(LayerZeroV2BouncebitMainnet.SEND_ULN_302), address(LayerZeroV2BouncebitMainnet.RECEIVE_ULN_302), LayerZeroV2BouncebitMainnet.EXECUTOR, LayerZeroV2BouncebitMainnet.CHAIN_ID, "bouncebit-mainnet"); + _registerChain(LayerZeroV2BscMainnet.EID, address(LayerZeroV2BscMainnet.ENDPOINT_V2), address(LayerZeroV2BscMainnet.SEND_ULN_302), address(LayerZeroV2BscMainnet.RECEIVE_ULN_302), LayerZeroV2BscMainnet.EXECUTOR, LayerZeroV2BscMainnet.CHAIN_ID, "bsc-mainnet"); + _registerChain(LayerZeroV2CampMainnet.EID, address(LayerZeroV2CampMainnet.ENDPOINT_V2), address(LayerZeroV2CampMainnet.SEND_ULN_302), address(LayerZeroV2CampMainnet.RECEIVE_ULN_302), LayerZeroV2CampMainnet.EXECUTOR, LayerZeroV2CampMainnet.CHAIN_ID, "camp-mainnet"); + _registerChain(LayerZeroV2CantoMainnet.EID, address(LayerZeroV2CantoMainnet.ENDPOINT_V2), address(LayerZeroV2CantoMainnet.SEND_ULN_302), address(LayerZeroV2CantoMainnet.RECEIVE_ULN_302), LayerZeroV2CantoMainnet.EXECUTOR, LayerZeroV2CantoMainnet.CHAIN_ID, "canto-mainnet"); + _registerChain(LayerZeroV2CeloMainnet.EID, address(LayerZeroV2CeloMainnet.ENDPOINT_V2), address(LayerZeroV2CeloMainnet.SEND_ULN_302), address(LayerZeroV2CeloMainnet.RECEIVE_ULN_302), LayerZeroV2CeloMainnet.EXECUTOR, LayerZeroV2CeloMainnet.CHAIN_ID, "celo-mainnet"); + _registerChain(LayerZeroV2CodexMainnet.EID, address(LayerZeroV2CodexMainnet.ENDPOINT_V2), address(LayerZeroV2CodexMainnet.SEND_ULN_302), address(LayerZeroV2CodexMainnet.RECEIVE_ULN_302), LayerZeroV2CodexMainnet.EXECUTOR, LayerZeroV2CodexMainnet.CHAIN_ID, "codex-mainnet"); + _registerChain(LayerZeroV2ConcreteMainnet.EID, address(LayerZeroV2ConcreteMainnet.ENDPOINT_V2), address(LayerZeroV2ConcreteMainnet.SEND_ULN_302), address(LayerZeroV2ConcreteMainnet.RECEIVE_ULN_302), LayerZeroV2ConcreteMainnet.EXECUTOR, LayerZeroV2ConcreteMainnet.CHAIN_ID, "concrete-mainnet"); + _registerChain(LayerZeroV2ConfluxMainnet.EID, address(LayerZeroV2ConfluxMainnet.ENDPOINT_V2), address(LayerZeroV2ConfluxMainnet.SEND_ULN_302), address(LayerZeroV2ConfluxMainnet.RECEIVE_ULN_302), LayerZeroV2ConfluxMainnet.EXECUTOR, LayerZeroV2ConfluxMainnet.CHAIN_ID, "conflux-mainnet"); + _registerChain(LayerZeroV2ConvergeMainnet.EID, address(LayerZeroV2ConvergeMainnet.ENDPOINT_V2), address(LayerZeroV2ConvergeMainnet.SEND_ULN_302), address(LayerZeroV2ConvergeMainnet.RECEIVE_ULN_302), LayerZeroV2ConvergeMainnet.EXECUTOR, LayerZeroV2ConvergeMainnet.CHAIN_ID, "converge-mainnet"); + _registerChain(LayerZeroV2CoredaoMainnet.EID, address(LayerZeroV2CoredaoMainnet.ENDPOINT_V2), address(LayerZeroV2CoredaoMainnet.SEND_ULN_302), address(LayerZeroV2CoredaoMainnet.RECEIVE_ULN_302), LayerZeroV2CoredaoMainnet.EXECUTOR, LayerZeroV2CoredaoMainnet.CHAIN_ID, "coredao-mainnet"); + _registerChain(LayerZeroV2CronosevmMainnet.EID, address(LayerZeroV2CronosevmMainnet.ENDPOINT_V2), address(LayerZeroV2CronosevmMainnet.SEND_ULN_302), address(LayerZeroV2CronosevmMainnet.RECEIVE_ULN_302), LayerZeroV2CronosevmMainnet.EXECUTOR, LayerZeroV2CronosevmMainnet.CHAIN_ID, "cronosevm-mainnet"); + _registerChain(LayerZeroV2CronoszkevmMainnet.EID, address(LayerZeroV2CronoszkevmMainnet.ENDPOINT_V2), address(LayerZeroV2CronoszkevmMainnet.SEND_ULN_302), address(LayerZeroV2CronoszkevmMainnet.RECEIVE_ULN_302), LayerZeroV2CronoszkevmMainnet.EXECUTOR, LayerZeroV2CronoszkevmMainnet.CHAIN_ID, "cronoszkevm-mainnet"); + _registerChain(LayerZeroV2CyberMainnet.EID, address(LayerZeroV2CyberMainnet.ENDPOINT_V2), address(LayerZeroV2CyberMainnet.SEND_ULN_302), address(LayerZeroV2CyberMainnet.RECEIVE_ULN_302), LayerZeroV2CyberMainnet.EXECUTOR, LayerZeroV2CyberMainnet.CHAIN_ID, "cyber-mainnet"); + _registerChain(LayerZeroV2DegenMainnet.EID, address(LayerZeroV2DegenMainnet.ENDPOINT_V2), address(LayerZeroV2DegenMainnet.SEND_ULN_302), address(LayerZeroV2DegenMainnet.RECEIVE_ULN_302), LayerZeroV2DegenMainnet.EXECUTOR, LayerZeroV2DegenMainnet.CHAIN_ID, "degen-mainnet"); + _registerChain(LayerZeroV2DexalotMainnet.EID, address(LayerZeroV2DexalotMainnet.ENDPOINT_V2), address(LayerZeroV2DexalotMainnet.SEND_ULN_302), address(LayerZeroV2DexalotMainnet.RECEIVE_ULN_302), LayerZeroV2DexalotMainnet.EXECUTOR, LayerZeroV2DexalotMainnet.CHAIN_ID, "dexalot-mainnet"); + _registerChain(LayerZeroV2DfkMainnet.EID, address(LayerZeroV2DfkMainnet.ENDPOINT_V2), address(LayerZeroV2DfkMainnet.SEND_ULN_302), address(LayerZeroV2DfkMainnet.RECEIVE_ULN_302), LayerZeroV2DfkMainnet.EXECUTOR, LayerZeroV2DfkMainnet.CHAIN_ID, "dfk-mainnet"); + _registerChain(LayerZeroV2DinariMainnet.EID, address(LayerZeroV2DinariMainnet.ENDPOINT_V2), address(LayerZeroV2DinariMainnet.SEND_ULN_302), address(LayerZeroV2DinariMainnet.RECEIVE_ULN_302), LayerZeroV2DinariMainnet.EXECUTOR, LayerZeroV2DinariMainnet.CHAIN_ID, "dinari-mainnet"); + _registerChain(LayerZeroV2Dm2verseMainnet.EID, address(LayerZeroV2Dm2verseMainnet.ENDPOINT_V2), address(LayerZeroV2Dm2verseMainnet.SEND_ULN_302), address(LayerZeroV2Dm2verseMainnet.RECEIVE_ULN_302), LayerZeroV2Dm2verseMainnet.EXECUTOR, LayerZeroV2Dm2verseMainnet.CHAIN_ID, "dm2verse-mainnet"); + _registerChain(LayerZeroV2DomaMainnet.EID, address(LayerZeroV2DomaMainnet.ENDPOINT_V2), address(LayerZeroV2DomaMainnet.SEND_ULN_302), address(LayerZeroV2DomaMainnet.RECEIVE_ULN_302), LayerZeroV2DomaMainnet.EXECUTOR, LayerZeroV2DomaMainnet.CHAIN_ID, "doma-mainnet"); + _registerChain(LayerZeroV2DosMainnet.EID, address(LayerZeroV2DosMainnet.ENDPOINT_V2), address(LayerZeroV2DosMainnet.SEND_ULN_302), address(LayerZeroV2DosMainnet.RECEIVE_ULN_302), LayerZeroV2DosMainnet.EXECUTOR, LayerZeroV2DosMainnet.CHAIN_ID, "dos-mainnet"); + _registerChain(LayerZeroV2EbiMainnet.EID, address(LayerZeroV2EbiMainnet.ENDPOINT_V2), address(LayerZeroV2EbiMainnet.SEND_ULN_302), address(LayerZeroV2EbiMainnet.RECEIVE_ULN_302), LayerZeroV2EbiMainnet.EXECUTOR, LayerZeroV2EbiMainnet.CHAIN_ID, "ebi-mainnet"); + _registerChain(LayerZeroV2EduMainnet.EID, address(LayerZeroV2EduMainnet.ENDPOINT_V2), address(LayerZeroV2EduMainnet.SEND_ULN_302), address(LayerZeroV2EduMainnet.RECEIVE_ULN_302), LayerZeroV2EduMainnet.EXECUTOR, LayerZeroV2EduMainnet.CHAIN_ID, "edu-mainnet"); + _registerChain(LayerZeroV2EonMainnet.EID, address(LayerZeroV2EonMainnet.ENDPOINT_V2), address(LayerZeroV2EonMainnet.SEND_ULN_302), address(LayerZeroV2EonMainnet.RECEIVE_ULN_302), LayerZeroV2EonMainnet.EXECUTOR, LayerZeroV2EonMainnet.CHAIN_ID, "eon-mainnet"); + _registerChain(LayerZeroV2EtherealMainnet.EID, address(LayerZeroV2EtherealMainnet.ENDPOINT_V2), address(LayerZeroV2EtherealMainnet.SEND_ULN_302), address(LayerZeroV2EtherealMainnet.RECEIVE_ULN_302), LayerZeroV2EtherealMainnet.EXECUTOR, LayerZeroV2EtherealMainnet.CHAIN_ID, "ethereal-mainnet"); + _registerChain(LayerZeroV2EthereumMainnet.EID, address(LayerZeroV2EthereumMainnet.ENDPOINT_V2), address(LayerZeroV2EthereumMainnet.SEND_ULN_302), address(LayerZeroV2EthereumMainnet.RECEIVE_ULN_302), LayerZeroV2EthereumMainnet.EXECUTOR, LayerZeroV2EthereumMainnet.CHAIN_ID, "ethereum-mainnet"); + _registerChain(LayerZeroV2EtherlinkMainnet.EID, address(LayerZeroV2EtherlinkMainnet.ENDPOINT_V2), address(LayerZeroV2EtherlinkMainnet.SEND_ULN_302), address(LayerZeroV2EtherlinkMainnet.RECEIVE_ULN_302), LayerZeroV2EtherlinkMainnet.EXECUTOR, LayerZeroV2EtherlinkMainnet.CHAIN_ID, "etherlink-mainnet"); + _registerChain(LayerZeroV2FantomMainnet.EID, address(LayerZeroV2FantomMainnet.ENDPOINT_V2), address(LayerZeroV2FantomMainnet.SEND_ULN_302), address(LayerZeroV2FantomMainnet.RECEIVE_ULN_302), LayerZeroV2FantomMainnet.EXECUTOR, LayerZeroV2FantomMainnet.CHAIN_ID, "fantom-mainnet"); + _registerChain(LayerZeroV2FlareMainnet.EID, address(LayerZeroV2FlareMainnet.ENDPOINT_V2), address(LayerZeroV2FlareMainnet.SEND_ULN_302), address(LayerZeroV2FlareMainnet.RECEIVE_ULN_302), LayerZeroV2FlareMainnet.EXECUTOR, LayerZeroV2FlareMainnet.CHAIN_ID, "flare-mainnet"); + _registerChain(LayerZeroV2FlowMainnet.EID, address(LayerZeroV2FlowMainnet.ENDPOINT_V2), address(LayerZeroV2FlowMainnet.SEND_ULN_302), address(LayerZeroV2FlowMainnet.RECEIVE_ULN_302), LayerZeroV2FlowMainnet.EXECUTOR, LayerZeroV2FlowMainnet.CHAIN_ID, "flow-mainnet"); + _registerChain(LayerZeroV2FraxtalMainnet.EID, address(LayerZeroV2FraxtalMainnet.ENDPOINT_V2), address(LayerZeroV2FraxtalMainnet.SEND_ULN_302), address(LayerZeroV2FraxtalMainnet.RECEIVE_ULN_302), LayerZeroV2FraxtalMainnet.EXECUTOR, LayerZeroV2FraxtalMainnet.CHAIN_ID, "fraxtal-mainnet"); + _registerChain(LayerZeroV2FuseMainnet.EID, address(LayerZeroV2FuseMainnet.ENDPOINT_V2), address(LayerZeroV2FuseMainnet.SEND_ULN_302), address(LayerZeroV2FuseMainnet.RECEIVE_ULN_302), LayerZeroV2FuseMainnet.EXECUTOR, LayerZeroV2FuseMainnet.CHAIN_ID, "fuse-mainnet"); + _registerChain(LayerZeroV2GatelayerMainnet.EID, address(LayerZeroV2GatelayerMainnet.ENDPOINT_V2), address(LayerZeroV2GatelayerMainnet.SEND_ULN_302), address(LayerZeroV2GatelayerMainnet.RECEIVE_ULN_302), LayerZeroV2GatelayerMainnet.EXECUTOR, LayerZeroV2GatelayerMainnet.CHAIN_ID, "gatelayer-mainnet"); + _registerChain(LayerZeroV2GlueMainnet.EID, address(LayerZeroV2GlueMainnet.ENDPOINT_V2), address(LayerZeroV2GlueMainnet.SEND_ULN_302), address(LayerZeroV2GlueMainnet.RECEIVE_ULN_302), LayerZeroV2GlueMainnet.EXECUTOR, LayerZeroV2GlueMainnet.CHAIN_ID, "glue-mainnet"); + _registerChain(LayerZeroV2GnosisMainnet.EID, address(LayerZeroV2GnosisMainnet.ENDPOINT_V2), address(LayerZeroV2GnosisMainnet.SEND_ULN_302), address(LayerZeroV2GnosisMainnet.RECEIVE_ULN_302), LayerZeroV2GnosisMainnet.EXECUTOR, LayerZeroV2GnosisMainnet.CHAIN_ID, "gnosis-mainnet"); + _registerChain(LayerZeroV2GoatMainnet.EID, address(LayerZeroV2GoatMainnet.ENDPOINT_V2), address(LayerZeroV2GoatMainnet.SEND_ULN_302), address(LayerZeroV2GoatMainnet.RECEIVE_ULN_302), LayerZeroV2GoatMainnet.EXECUTOR, LayerZeroV2GoatMainnet.CHAIN_ID, "goat-mainnet"); + _registerChain(LayerZeroV2GravityMainnet.EID, address(LayerZeroV2GravityMainnet.ENDPOINT_V2), address(LayerZeroV2GravityMainnet.SEND_ULN_302), address(LayerZeroV2GravityMainnet.RECEIVE_ULN_302), LayerZeroV2GravityMainnet.EXECUTOR, LayerZeroV2GravityMainnet.CHAIN_ID, "gravity-mainnet"); + _registerChain(LayerZeroV2GunzMainnet.EID, address(LayerZeroV2GunzMainnet.ENDPOINT_V2), address(LayerZeroV2GunzMainnet.SEND_ULN_302), address(LayerZeroV2GunzMainnet.RECEIVE_ULN_302), LayerZeroV2GunzMainnet.EXECUTOR, LayerZeroV2GunzMainnet.CHAIN_ID, "gunz-mainnet"); + _registerChain(LayerZeroV2HarmonyMainnet.EID, address(LayerZeroV2HarmonyMainnet.ENDPOINT_V2), address(LayerZeroV2HarmonyMainnet.SEND_ULN_302), address(LayerZeroV2HarmonyMainnet.RECEIVE_ULN_302), LayerZeroV2HarmonyMainnet.EXECUTOR, LayerZeroV2HarmonyMainnet.CHAIN_ID, "harmony-mainnet"); + _registerChain(LayerZeroV2HederaMainnet.EID, address(LayerZeroV2HederaMainnet.ENDPOINT_V2), address(LayerZeroV2HederaMainnet.SEND_ULN_302), address(LayerZeroV2HederaMainnet.RECEIVE_ULN_302), LayerZeroV2HederaMainnet.EXECUTOR, LayerZeroV2HederaMainnet.CHAIN_ID, "hedera-mainnet"); + _registerChain(LayerZeroV2HemiMainnet.EID, address(LayerZeroV2HemiMainnet.ENDPOINT_V2), address(LayerZeroV2HemiMainnet.SEND_ULN_302), address(LayerZeroV2HemiMainnet.RECEIVE_ULN_302), LayerZeroV2HemiMainnet.EXECUTOR, LayerZeroV2HemiMainnet.CHAIN_ID, "hemi-mainnet"); + _registerChain(LayerZeroV2HomeverseMainnet.EID, address(LayerZeroV2HomeverseMainnet.ENDPOINT_V2), address(LayerZeroV2HomeverseMainnet.SEND_ULN_302), address(LayerZeroV2HomeverseMainnet.RECEIVE_ULN_302), LayerZeroV2HomeverseMainnet.EXECUTOR, LayerZeroV2HomeverseMainnet.CHAIN_ID, "homeverse-mainnet"); + _registerChain(LayerZeroV2HubbleMainnet.EID, address(LayerZeroV2HubbleMainnet.ENDPOINT_V2), address(LayerZeroV2HubbleMainnet.SEND_ULN_302), address(LayerZeroV2HubbleMainnet.RECEIVE_ULN_302), LayerZeroV2HubbleMainnet.EXECUTOR, LayerZeroV2HubbleMainnet.CHAIN_ID, "hubble-mainnet"); + _registerChain(LayerZeroV2HumanityMainnet.EID, address(LayerZeroV2HumanityMainnet.ENDPOINT_V2), address(LayerZeroV2HumanityMainnet.SEND_ULN_302), address(LayerZeroV2HumanityMainnet.RECEIVE_ULN_302), LayerZeroV2HumanityMainnet.EXECUTOR, LayerZeroV2HumanityMainnet.CHAIN_ID, "humanity-mainnet"); + _registerChain(LayerZeroV2HyperliquidMainnet.EID, address(LayerZeroV2HyperliquidMainnet.ENDPOINT_V2), address(LayerZeroV2HyperliquidMainnet.SEND_ULN_302), address(LayerZeroV2HyperliquidMainnet.RECEIVE_ULN_302), LayerZeroV2HyperliquidMainnet.EXECUTOR, LayerZeroV2HyperliquidMainnet.CHAIN_ID, "hyperliquid-mainnet"); + _registerChain(LayerZeroV2InjectiveevmMainnet.EID, address(LayerZeroV2InjectiveevmMainnet.ENDPOINT_V2), address(LayerZeroV2InjectiveevmMainnet.SEND_ULN_302), address(LayerZeroV2InjectiveevmMainnet.RECEIVE_ULN_302), LayerZeroV2InjectiveevmMainnet.EXECUTOR, LayerZeroV2InjectiveevmMainnet.CHAIN_ID, "injectiveevm-mainnet"); + _registerChain(LayerZeroV2InkMainnet.EID, address(LayerZeroV2InkMainnet.ENDPOINT_V2), address(LayerZeroV2InkMainnet.SEND_ULN_302), address(LayerZeroV2InkMainnet.RECEIVE_ULN_302), LayerZeroV2InkMainnet.EXECUTOR, LayerZeroV2InkMainnet.CHAIN_ID, "ink-mainnet"); + _registerChain(LayerZeroV2IotaMainnet.EID, address(LayerZeroV2IotaMainnet.ENDPOINT_V2), address(LayerZeroV2IotaMainnet.SEND_ULN_302), address(LayerZeroV2IotaMainnet.RECEIVE_ULN_302), LayerZeroV2IotaMainnet.EXECUTOR, LayerZeroV2IotaMainnet.CHAIN_ID, "iota-mainnet"); + _registerChain(LayerZeroV2IslanderMainnet.EID, address(LayerZeroV2IslanderMainnet.ENDPOINT_V2), address(LayerZeroV2IslanderMainnet.SEND_ULN_302), address(LayerZeroV2IslanderMainnet.RECEIVE_ULN_302), LayerZeroV2IslanderMainnet.EXECUTOR, LayerZeroV2IslanderMainnet.CHAIN_ID, "islander-mainnet"); + _registerChain(LayerZeroV2JocMainnet.EID, address(LayerZeroV2JocMainnet.ENDPOINT_V2), address(LayerZeroV2JocMainnet.SEND_ULN_302), address(LayerZeroV2JocMainnet.RECEIVE_ULN_302), LayerZeroV2JocMainnet.EXECUTOR, LayerZeroV2JocMainnet.CHAIN_ID, "joc-mainnet"); + _registerChain(LayerZeroV2KatanaMainnet.EID, address(LayerZeroV2KatanaMainnet.ENDPOINT_V2), address(LayerZeroV2KatanaMainnet.SEND_ULN_302), address(LayerZeroV2KatanaMainnet.RECEIVE_ULN_302), LayerZeroV2KatanaMainnet.EXECUTOR, LayerZeroV2KatanaMainnet.CHAIN_ID, "katana-mainnet"); + _registerChain(LayerZeroV2KavaMainnet.EID, address(LayerZeroV2KavaMainnet.ENDPOINT_V2), address(LayerZeroV2KavaMainnet.SEND_ULN_302), address(LayerZeroV2KavaMainnet.RECEIVE_ULN_302), LayerZeroV2KavaMainnet.EXECUTOR, LayerZeroV2KavaMainnet.CHAIN_ID, "kava-mainnet"); + _registerChain(LayerZeroV2KlaytnMainnet.EID, address(LayerZeroV2KlaytnMainnet.ENDPOINT_V2), address(LayerZeroV2KlaytnMainnet.SEND_ULN_302), address(LayerZeroV2KlaytnMainnet.RECEIVE_ULN_302), LayerZeroV2KlaytnMainnet.EXECUTOR, LayerZeroV2KlaytnMainnet.CHAIN_ID, "klaytn-mainnet"); + _registerChain(LayerZeroV2LensMainnet.EID, address(LayerZeroV2LensMainnet.ENDPOINT_V2), address(LayerZeroV2LensMainnet.SEND_ULN_302), address(LayerZeroV2LensMainnet.RECEIVE_ULN_302), LayerZeroV2LensMainnet.EXECUTOR, LayerZeroV2LensMainnet.CHAIN_ID, "lens-mainnet"); + _registerChain(LayerZeroV2LightlinkMainnet.EID, address(LayerZeroV2LightlinkMainnet.ENDPOINT_V2), address(LayerZeroV2LightlinkMainnet.SEND_ULN_302), address(LayerZeroV2LightlinkMainnet.RECEIVE_ULN_302), LayerZeroV2LightlinkMainnet.EXECUTOR, LayerZeroV2LightlinkMainnet.CHAIN_ID, "lightlink-mainnet"); + _registerChain(LayerZeroV2LiskMainnet.EID, address(LayerZeroV2LiskMainnet.ENDPOINT_V2), address(LayerZeroV2LiskMainnet.SEND_ULN_302), address(LayerZeroV2LiskMainnet.RECEIVE_ULN_302), LayerZeroV2LiskMainnet.EXECUTOR, LayerZeroV2LiskMainnet.CHAIN_ID, "lisk-mainnet"); + _registerChain(LayerZeroV2LootMainnet.EID, address(LayerZeroV2LootMainnet.ENDPOINT_V2), address(LayerZeroV2LootMainnet.SEND_ULN_302), address(LayerZeroV2LootMainnet.RECEIVE_ULN_302), LayerZeroV2LootMainnet.EXECUTOR, LayerZeroV2LootMainnet.CHAIN_ID, "loot-mainnet"); + _registerChain(LayerZeroV2LyraMainnet.EID, address(LayerZeroV2LyraMainnet.ENDPOINT_V2), address(LayerZeroV2LyraMainnet.SEND_ULN_302), address(LayerZeroV2LyraMainnet.RECEIVE_ULN_302), LayerZeroV2LyraMainnet.EXECUTOR, LayerZeroV2LyraMainnet.CHAIN_ID, "lyra-mainnet"); + _registerChain(LayerZeroV2MantaMainnet.EID, address(LayerZeroV2MantaMainnet.ENDPOINT_V2), address(LayerZeroV2MantaMainnet.SEND_ULN_302), address(LayerZeroV2MantaMainnet.RECEIVE_ULN_302), LayerZeroV2MantaMainnet.EXECUTOR, LayerZeroV2MantaMainnet.CHAIN_ID, "manta-mainnet"); + _registerChain(LayerZeroV2MantleMainnet.EID, address(LayerZeroV2MantleMainnet.ENDPOINT_V2), address(LayerZeroV2MantleMainnet.SEND_ULN_302), address(LayerZeroV2MantleMainnet.RECEIVE_ULN_302), LayerZeroV2MantleMainnet.EXECUTOR, LayerZeroV2MantleMainnet.CHAIN_ID, "mantle-mainnet"); + _registerChain(LayerZeroV2MasaMainnet.EID, address(LayerZeroV2MasaMainnet.ENDPOINT_V2), address(LayerZeroV2MasaMainnet.SEND_ULN_302), address(LayerZeroV2MasaMainnet.RECEIVE_ULN_302), LayerZeroV2MasaMainnet.EXECUTOR, LayerZeroV2MasaMainnet.CHAIN_ID, "masa-mainnet"); + _registerChain(LayerZeroV2MeritcircleMainnet.EID, address(LayerZeroV2MeritcircleMainnet.ENDPOINT_V2), address(LayerZeroV2MeritcircleMainnet.SEND_ULN_302), address(LayerZeroV2MeritcircleMainnet.RECEIVE_ULN_302), LayerZeroV2MeritcircleMainnet.EXECUTOR, LayerZeroV2MeritcircleMainnet.CHAIN_ID, "meritcircle-mainnet"); + _registerChain(LayerZeroV2MerlinMainnet.EID, address(LayerZeroV2MerlinMainnet.ENDPOINT_V2), address(LayerZeroV2MerlinMainnet.SEND_ULN_302), address(LayerZeroV2MerlinMainnet.RECEIVE_ULN_302), LayerZeroV2MerlinMainnet.EXECUTOR, LayerZeroV2MerlinMainnet.CHAIN_ID, "merlin-mainnet"); + _registerChain(LayerZeroV2MeterMainnet.EID, address(LayerZeroV2MeterMainnet.ENDPOINT_V2), address(LayerZeroV2MeterMainnet.SEND_ULN_302), address(LayerZeroV2MeterMainnet.RECEIVE_ULN_302), LayerZeroV2MeterMainnet.EXECUTOR, LayerZeroV2MeterMainnet.CHAIN_ID, "meter-mainnet"); + _registerChain(LayerZeroV2MetisMainnet.EID, address(LayerZeroV2MetisMainnet.ENDPOINT_V2), address(LayerZeroV2MetisMainnet.SEND_ULN_302), address(LayerZeroV2MetisMainnet.RECEIVE_ULN_302), LayerZeroV2MetisMainnet.EXECUTOR, LayerZeroV2MetisMainnet.CHAIN_ID, "metis-mainnet"); + _registerChain(LayerZeroV2ModeMainnet.EID, address(LayerZeroV2ModeMainnet.ENDPOINT_V2), address(LayerZeroV2ModeMainnet.SEND_ULN_302), address(LayerZeroV2ModeMainnet.RECEIVE_ULN_302), LayerZeroV2ModeMainnet.EXECUTOR, LayerZeroV2ModeMainnet.CHAIN_ID, "mode-mainnet"); + _registerChain(LayerZeroV2MonadMainnet.EID, address(LayerZeroV2MonadMainnet.ENDPOINT_V2), address(LayerZeroV2MonadMainnet.SEND_ULN_302), address(LayerZeroV2MonadMainnet.RECEIVE_ULN_302), LayerZeroV2MonadMainnet.EXECUTOR, LayerZeroV2MonadMainnet.CHAIN_ID, "monad-mainnet"); + _registerChain(LayerZeroV2MoonbeamMainnet.EID, address(LayerZeroV2MoonbeamMainnet.ENDPOINT_V2), address(LayerZeroV2MoonbeamMainnet.SEND_ULN_302), address(LayerZeroV2MoonbeamMainnet.RECEIVE_ULN_302), LayerZeroV2MoonbeamMainnet.EXECUTOR, LayerZeroV2MoonbeamMainnet.CHAIN_ID, "moonbeam-mainnet"); + _registerChain(LayerZeroV2MoonriverMainnet.EID, address(LayerZeroV2MoonriverMainnet.ENDPOINT_V2), address(LayerZeroV2MoonriverMainnet.SEND_ULN_302), address(LayerZeroV2MoonriverMainnet.RECEIVE_ULN_302), LayerZeroV2MoonriverMainnet.EXECUTOR, LayerZeroV2MoonriverMainnet.CHAIN_ID, "moonriver-mainnet"); + _registerChain(LayerZeroV2MorphMainnet.EID, address(LayerZeroV2MorphMainnet.ENDPOINT_V2), address(LayerZeroV2MorphMainnet.SEND_ULN_302), address(LayerZeroV2MorphMainnet.RECEIVE_ULN_302), LayerZeroV2MorphMainnet.EXECUTOR, LayerZeroV2MorphMainnet.CHAIN_ID, "morph-mainnet"); + _registerChain(LayerZeroV2Mp1Mainnet.EID, address(LayerZeroV2Mp1Mainnet.ENDPOINT_V2), address(LayerZeroV2Mp1Mainnet.SEND_ULN_302), address(LayerZeroV2Mp1Mainnet.RECEIVE_ULN_302), LayerZeroV2Mp1Mainnet.EXECUTOR, LayerZeroV2Mp1Mainnet.CHAIN_ID, "mp1-mainnet"); + _registerChain(LayerZeroV2NexeraMainnet.EID, address(LayerZeroV2NexeraMainnet.ENDPOINT_V2), address(LayerZeroV2NexeraMainnet.SEND_ULN_302), address(LayerZeroV2NexeraMainnet.RECEIVE_ULN_302), LayerZeroV2NexeraMainnet.EXECUTOR, LayerZeroV2NexeraMainnet.CHAIN_ID, "nexera-mainnet"); + _registerChain(LayerZeroV2NibiruMainnet.EID, address(LayerZeroV2NibiruMainnet.ENDPOINT_V2), address(LayerZeroV2NibiruMainnet.SEND_ULN_302), address(LayerZeroV2NibiruMainnet.RECEIVE_ULN_302), LayerZeroV2NibiruMainnet.EXECUTOR, LayerZeroV2NibiruMainnet.CHAIN_ID, "nibiru-mainnet"); + _registerChain(LayerZeroV2NovaMainnet.EID, address(LayerZeroV2NovaMainnet.ENDPOINT_V2), address(LayerZeroV2NovaMainnet.SEND_ULN_302), address(LayerZeroV2NovaMainnet.RECEIVE_ULN_302), LayerZeroV2NovaMainnet.EXECUTOR, LayerZeroV2NovaMainnet.CHAIN_ID, "nova-mainnet"); + _registerChain(LayerZeroV2OgMainnet.EID, address(LayerZeroV2OgMainnet.ENDPOINT_V2), address(LayerZeroV2OgMainnet.SEND_ULN_302), address(LayerZeroV2OgMainnet.RECEIVE_ULN_302), LayerZeroV2OgMainnet.EXECUTOR, LayerZeroV2OgMainnet.CHAIN_ID, "og-mainnet"); + _registerChain(LayerZeroV2OkxMainnet.EID, address(LayerZeroV2OkxMainnet.ENDPOINT_V2), address(LayerZeroV2OkxMainnet.SEND_ULN_302), address(LayerZeroV2OkxMainnet.RECEIVE_ULN_302), LayerZeroV2OkxMainnet.EXECUTOR, LayerZeroV2OkxMainnet.CHAIN_ID, "okx-mainnet"); + _registerChain(LayerZeroV2OpbnbMainnet.EID, address(LayerZeroV2OpbnbMainnet.ENDPOINT_V2), address(LayerZeroV2OpbnbMainnet.SEND_ULN_302), address(LayerZeroV2OpbnbMainnet.RECEIVE_ULN_302), LayerZeroV2OpbnbMainnet.EXECUTOR, LayerZeroV2OpbnbMainnet.CHAIN_ID, "opbnb-mainnet"); + _registerChain(LayerZeroV2OpenledgerMainnet.EID, address(LayerZeroV2OpenledgerMainnet.ENDPOINT_V2), address(LayerZeroV2OpenledgerMainnet.SEND_ULN_302), address(LayerZeroV2OpenledgerMainnet.RECEIVE_ULN_302), LayerZeroV2OpenledgerMainnet.EXECUTOR, LayerZeroV2OpenledgerMainnet.CHAIN_ID, "openledger-mainnet"); + _registerChain(LayerZeroV2OptimismMainnet.EID, address(LayerZeroV2OptimismMainnet.ENDPOINT_V2), address(LayerZeroV2OptimismMainnet.SEND_ULN_302), address(LayerZeroV2OptimismMainnet.RECEIVE_ULN_302), LayerZeroV2OptimismMainnet.EXECUTOR, LayerZeroV2OptimismMainnet.CHAIN_ID, "optimism-mainnet"); + _registerChain(LayerZeroV2OrderlyMainnet.EID, address(LayerZeroV2OrderlyMainnet.ENDPOINT_V2), address(LayerZeroV2OrderlyMainnet.SEND_ULN_302), address(LayerZeroV2OrderlyMainnet.RECEIVE_ULN_302), LayerZeroV2OrderlyMainnet.EXECUTOR, LayerZeroV2OrderlyMainnet.CHAIN_ID, "orderly-mainnet"); + _registerChain(LayerZeroV2PeaqMainnet.EID, address(LayerZeroV2PeaqMainnet.ENDPOINT_V2), address(LayerZeroV2PeaqMainnet.SEND_ULN_302), address(LayerZeroV2PeaqMainnet.RECEIVE_ULN_302), LayerZeroV2PeaqMainnet.EXECUTOR, LayerZeroV2PeaqMainnet.CHAIN_ID, "peaq-mainnet"); + _registerChain(LayerZeroV2PlasmaMainnet.EID, address(LayerZeroV2PlasmaMainnet.ENDPOINT_V2), address(LayerZeroV2PlasmaMainnet.SEND_ULN_302), address(LayerZeroV2PlasmaMainnet.RECEIVE_ULN_302), LayerZeroV2PlasmaMainnet.EXECUTOR, LayerZeroV2PlasmaMainnet.CHAIN_ID, "plasma-mainnet"); + _registerChain(LayerZeroV2PlumeMainnet.EID, address(LayerZeroV2PlumeMainnet.ENDPOINT_V2), address(LayerZeroV2PlumeMainnet.SEND_ULN_302), address(LayerZeroV2PlumeMainnet.RECEIVE_ULN_302), LayerZeroV2PlumeMainnet.EXECUTOR, LayerZeroV2PlumeMainnet.CHAIN_ID, "plume-mainnet"); + _registerChain(LayerZeroV2PlumephoenixMainnet.EID, address(LayerZeroV2PlumephoenixMainnet.ENDPOINT_V2), address(LayerZeroV2PlumephoenixMainnet.SEND_ULN_302), address(LayerZeroV2PlumephoenixMainnet.RECEIVE_ULN_302), LayerZeroV2PlumephoenixMainnet.EXECUTOR, LayerZeroV2PlumephoenixMainnet.CHAIN_ID, "plumephoenix-mainnet"); + _registerChain(LayerZeroV2PolygonMainnet.EID, address(LayerZeroV2PolygonMainnet.ENDPOINT_V2), address(LayerZeroV2PolygonMainnet.SEND_ULN_302), address(LayerZeroV2PolygonMainnet.RECEIVE_ULN_302), LayerZeroV2PolygonMainnet.EXECUTOR, LayerZeroV2PolygonMainnet.CHAIN_ID, "polygon-mainnet"); + _registerChain(LayerZeroV2RaribleMainnet.EID, address(LayerZeroV2RaribleMainnet.ENDPOINT_V2), address(LayerZeroV2RaribleMainnet.SEND_ULN_302), address(LayerZeroV2RaribleMainnet.RECEIVE_ULN_302), LayerZeroV2RaribleMainnet.EXECUTOR, LayerZeroV2RaribleMainnet.CHAIN_ID, "rarible-mainnet"); + _registerChain(LayerZeroV2RealMainnet.EID, address(LayerZeroV2RealMainnet.ENDPOINT_V2), address(LayerZeroV2RealMainnet.SEND_ULN_302), address(LayerZeroV2RealMainnet.RECEIVE_ULN_302), LayerZeroV2RealMainnet.EXECUTOR, LayerZeroV2RealMainnet.CHAIN_ID, "real-mainnet"); + _registerChain(LayerZeroV2ReyaMainnet.EID, address(LayerZeroV2ReyaMainnet.ENDPOINT_V2), address(LayerZeroV2ReyaMainnet.SEND_ULN_302), address(LayerZeroV2ReyaMainnet.RECEIVE_ULN_302), LayerZeroV2ReyaMainnet.EXECUTOR, LayerZeroV2ReyaMainnet.CHAIN_ID, "reya-mainnet"); + _registerChain(LayerZeroV2RootstockMainnet.EID, address(LayerZeroV2RootstockMainnet.ENDPOINT_V2), address(LayerZeroV2RootstockMainnet.SEND_ULN_302), address(LayerZeroV2RootstockMainnet.RECEIVE_ULN_302), LayerZeroV2RootstockMainnet.EXECUTOR, LayerZeroV2RootstockMainnet.CHAIN_ID, "rootstock-mainnet"); + _registerChain(LayerZeroV2SankoMainnet.EID, address(LayerZeroV2SankoMainnet.ENDPOINT_V2), address(LayerZeroV2SankoMainnet.SEND_ULN_302), address(LayerZeroV2SankoMainnet.RECEIVE_ULN_302), LayerZeroV2SankoMainnet.EXECUTOR, LayerZeroV2SankoMainnet.CHAIN_ID, "sanko-mainnet"); + _registerChain(LayerZeroV2ScrollMainnet.EID, address(LayerZeroV2ScrollMainnet.ENDPOINT_V2), address(LayerZeroV2ScrollMainnet.SEND_ULN_302), address(LayerZeroV2ScrollMainnet.RECEIVE_ULN_302), LayerZeroV2ScrollMainnet.EXECUTOR, LayerZeroV2ScrollMainnet.CHAIN_ID, "scroll-mainnet"); + _registerChain(LayerZeroV2SeiMainnet.EID, address(LayerZeroV2SeiMainnet.ENDPOINT_V2), address(LayerZeroV2SeiMainnet.SEND_ULN_302), address(LayerZeroV2SeiMainnet.RECEIVE_ULN_302), LayerZeroV2SeiMainnet.EXECUTOR, LayerZeroV2SeiMainnet.CHAIN_ID, "sei-mainnet"); + _registerChain(LayerZeroV2ShimmerMainnet.EID, address(LayerZeroV2ShimmerMainnet.ENDPOINT_V2), address(LayerZeroV2ShimmerMainnet.SEND_ULN_302), address(LayerZeroV2ShimmerMainnet.RECEIVE_ULN_302), LayerZeroV2ShimmerMainnet.EXECUTOR, LayerZeroV2ShimmerMainnet.CHAIN_ID, "shimmer-mainnet"); + _registerChain(LayerZeroV2SiliconMainnet.EID, address(LayerZeroV2SiliconMainnet.ENDPOINT_V2), address(LayerZeroV2SiliconMainnet.SEND_ULN_302), address(LayerZeroV2SiliconMainnet.RECEIVE_ULN_302), LayerZeroV2SiliconMainnet.EXECUTOR, LayerZeroV2SiliconMainnet.CHAIN_ID, "silicon-mainnet"); + _registerChain(LayerZeroV2SkaleMainnet.EID, address(LayerZeroV2SkaleMainnet.ENDPOINT_V2), address(LayerZeroV2SkaleMainnet.SEND_ULN_302), address(LayerZeroV2SkaleMainnet.RECEIVE_ULN_302), LayerZeroV2SkaleMainnet.EXECUTOR, LayerZeroV2SkaleMainnet.CHAIN_ID, "skale-mainnet"); + _registerChain(LayerZeroV2SomniaMainnet.EID, address(LayerZeroV2SomniaMainnet.ENDPOINT_V2), address(LayerZeroV2SomniaMainnet.SEND_ULN_302), address(LayerZeroV2SomniaMainnet.RECEIVE_ULN_302), LayerZeroV2SomniaMainnet.EXECUTOR, LayerZeroV2SomniaMainnet.CHAIN_ID, "somnia-mainnet"); + _registerChain(LayerZeroV2SoneiumMainnet.EID, address(LayerZeroV2SoneiumMainnet.ENDPOINT_V2), address(LayerZeroV2SoneiumMainnet.SEND_ULN_302), address(LayerZeroV2SoneiumMainnet.RECEIVE_ULN_302), LayerZeroV2SoneiumMainnet.EXECUTOR, LayerZeroV2SoneiumMainnet.CHAIN_ID, "soneium-mainnet"); + _registerChain(LayerZeroV2SonicMainnet.EID, address(LayerZeroV2SonicMainnet.ENDPOINT_V2), address(LayerZeroV2SonicMainnet.SEND_ULN_302), address(LayerZeroV2SonicMainnet.RECEIVE_ULN_302), LayerZeroV2SonicMainnet.EXECUTOR, LayerZeroV2SonicMainnet.CHAIN_ID, "sonic-mainnet"); + _registerChain(LayerZeroV2SophonMainnet.EID, address(LayerZeroV2SophonMainnet.ENDPOINT_V2), address(LayerZeroV2SophonMainnet.SEND_ULN_302), address(LayerZeroV2SophonMainnet.RECEIVE_ULN_302), LayerZeroV2SophonMainnet.EXECUTOR, LayerZeroV2SophonMainnet.CHAIN_ID, "sophon-mainnet"); + _registerChain(LayerZeroV2SpaceMainnet.EID, address(LayerZeroV2SpaceMainnet.ENDPOINT_V2), address(LayerZeroV2SpaceMainnet.SEND_ULN_302), address(LayerZeroV2SpaceMainnet.RECEIVE_ULN_302), LayerZeroV2SpaceMainnet.EXECUTOR, LayerZeroV2SpaceMainnet.CHAIN_ID, "space-mainnet"); + _registerChain(LayerZeroV2StableMainnet.EID, address(LayerZeroV2StableMainnet.ENDPOINT_V2), address(LayerZeroV2StableMainnet.SEND_ULN_302), address(LayerZeroV2StableMainnet.RECEIVE_ULN_302), LayerZeroV2StableMainnet.EXECUTOR, LayerZeroV2StableMainnet.CHAIN_ID, "stable-mainnet"); + _registerChain(LayerZeroV2StoryMainnet.EID, address(LayerZeroV2StoryMainnet.ENDPOINT_V2), address(LayerZeroV2StoryMainnet.SEND_ULN_302), address(LayerZeroV2StoryMainnet.RECEIVE_ULN_302), LayerZeroV2StoryMainnet.EXECUTOR, LayerZeroV2StoryMainnet.CHAIN_ID, "story-mainnet"); + _registerChain(LayerZeroV2SubtensorevmMainnet.EID, address(LayerZeroV2SubtensorevmMainnet.ENDPOINT_V2), address(LayerZeroV2SubtensorevmMainnet.SEND_ULN_302), address(LayerZeroV2SubtensorevmMainnet.RECEIVE_ULN_302), LayerZeroV2SubtensorevmMainnet.EXECUTOR, LayerZeroV2SubtensorevmMainnet.CHAIN_ID, "subtensorevm-mainnet"); + _registerChain(LayerZeroV2SuperpositionMainnet.EID, address(LayerZeroV2SuperpositionMainnet.ENDPOINT_V2), address(LayerZeroV2SuperpositionMainnet.SEND_ULN_302), address(LayerZeroV2SuperpositionMainnet.RECEIVE_ULN_302), LayerZeroV2SuperpositionMainnet.EXECUTOR, LayerZeroV2SuperpositionMainnet.CHAIN_ID, "superposition-mainnet"); + _registerChain(LayerZeroV2SwellMainnet.EID, address(LayerZeroV2SwellMainnet.ENDPOINT_V2), address(LayerZeroV2SwellMainnet.SEND_ULN_302), address(LayerZeroV2SwellMainnet.RECEIVE_ULN_302), LayerZeroV2SwellMainnet.EXECUTOR, LayerZeroV2SwellMainnet.CHAIN_ID, "swell-mainnet"); + _registerChain(LayerZeroV2TacMainnet.EID, address(LayerZeroV2TacMainnet.ENDPOINT_V2), address(LayerZeroV2TacMainnet.SEND_ULN_302), address(LayerZeroV2TacMainnet.RECEIVE_ULN_302), LayerZeroV2TacMainnet.EXECUTOR, LayerZeroV2TacMainnet.CHAIN_ID, "tac-mainnet"); + _registerChain(LayerZeroV2TaikoMainnet.EID, address(LayerZeroV2TaikoMainnet.ENDPOINT_V2), address(LayerZeroV2TaikoMainnet.SEND_ULN_302), address(LayerZeroV2TaikoMainnet.RECEIVE_ULN_302), LayerZeroV2TaikoMainnet.EXECUTOR, LayerZeroV2TaikoMainnet.CHAIN_ID, "taiko-mainnet"); + _registerChain(LayerZeroV2TelosMainnet.EID, address(LayerZeroV2TelosMainnet.ENDPOINT_V2), address(LayerZeroV2TelosMainnet.SEND_ULN_302), address(LayerZeroV2TelosMainnet.RECEIVE_ULN_302), LayerZeroV2TelosMainnet.EXECUTOR, LayerZeroV2TelosMainnet.CHAIN_ID, "telos-mainnet"); + _registerChain(LayerZeroV2TenetMainnet.EID, address(LayerZeroV2TenetMainnet.ENDPOINT_V2), address(LayerZeroV2TenetMainnet.SEND_ULN_302), address(LayerZeroV2TenetMainnet.RECEIVE_ULN_302), LayerZeroV2TenetMainnet.EXECUTOR, LayerZeroV2TenetMainnet.CHAIN_ID, "tenet-mainnet"); + _registerChain(LayerZeroV2TiltyardMainnet.EID, address(LayerZeroV2TiltyardMainnet.ENDPOINT_V2), address(LayerZeroV2TiltyardMainnet.SEND_ULN_302), address(LayerZeroV2TiltyardMainnet.RECEIVE_ULN_302), LayerZeroV2TiltyardMainnet.EXECUTOR, LayerZeroV2TiltyardMainnet.CHAIN_ID, "tiltyard-mainnet"); + _registerChain(LayerZeroV2TomoMainnet.EID, address(LayerZeroV2TomoMainnet.ENDPOINT_V2), address(LayerZeroV2TomoMainnet.SEND_ULN_302), address(LayerZeroV2TomoMainnet.RECEIVE_ULN_302), LayerZeroV2TomoMainnet.EXECUTOR, LayerZeroV2TomoMainnet.CHAIN_ID, "tomo-mainnet"); + _registerChain(LayerZeroV2UnichainMainnet.EID, address(LayerZeroV2UnichainMainnet.ENDPOINT_V2), address(LayerZeroV2UnichainMainnet.SEND_ULN_302), address(LayerZeroV2UnichainMainnet.RECEIVE_ULN_302), LayerZeroV2UnichainMainnet.EXECUTOR, LayerZeroV2UnichainMainnet.CHAIN_ID, "unichain-mainnet"); + _registerChain(LayerZeroV2WorldchainMainnet.EID, address(LayerZeroV2WorldchainMainnet.ENDPOINT_V2), address(LayerZeroV2WorldchainMainnet.SEND_ULN_302), address(LayerZeroV2WorldchainMainnet.RECEIVE_ULN_302), LayerZeroV2WorldchainMainnet.EXECUTOR, LayerZeroV2WorldchainMainnet.CHAIN_ID, "worldchain-mainnet"); + _registerChain(LayerZeroV2XaiMainnet.EID, address(LayerZeroV2XaiMainnet.ENDPOINT_V2), address(LayerZeroV2XaiMainnet.SEND_ULN_302), address(LayerZeroV2XaiMainnet.RECEIVE_ULN_302), LayerZeroV2XaiMainnet.EXECUTOR, LayerZeroV2XaiMainnet.CHAIN_ID, "xai-mainnet"); + _registerChain(LayerZeroV2XchainMainnet.EID, address(LayerZeroV2XchainMainnet.ENDPOINT_V2), address(LayerZeroV2XchainMainnet.SEND_ULN_302), address(LayerZeroV2XchainMainnet.RECEIVE_ULN_302), LayerZeroV2XchainMainnet.EXECUTOR, LayerZeroV2XchainMainnet.CHAIN_ID, "xchain-mainnet"); + _registerChain(LayerZeroV2XdcMainnet.EID, address(LayerZeroV2XdcMainnet.ENDPOINT_V2), address(LayerZeroV2XdcMainnet.SEND_ULN_302), address(LayerZeroV2XdcMainnet.RECEIVE_ULN_302), LayerZeroV2XdcMainnet.EXECUTOR, LayerZeroV2XdcMainnet.CHAIN_ID, "xdc-mainnet"); + _registerChain(LayerZeroV2XlayerMainnet.EID, address(LayerZeroV2XlayerMainnet.ENDPOINT_V2), address(LayerZeroV2XlayerMainnet.SEND_ULN_302), address(LayerZeroV2XlayerMainnet.RECEIVE_ULN_302), LayerZeroV2XlayerMainnet.EXECUTOR, LayerZeroV2XlayerMainnet.CHAIN_ID, "xlayer-mainnet"); + _registerChain(LayerZeroV2XplaMainnet.EID, address(LayerZeroV2XplaMainnet.ENDPOINT_V2), address(LayerZeroV2XplaMainnet.SEND_ULN_302), address(LayerZeroV2XplaMainnet.RECEIVE_ULN_302), LayerZeroV2XplaMainnet.EXECUTOR, LayerZeroV2XplaMainnet.CHAIN_ID, "xpla-mainnet"); + _registerChain(LayerZeroV2ZircuitMainnet.EID, address(LayerZeroV2ZircuitMainnet.ENDPOINT_V2), address(LayerZeroV2ZircuitMainnet.SEND_ULN_302), address(LayerZeroV2ZircuitMainnet.RECEIVE_ULN_302), LayerZeroV2ZircuitMainnet.EXECUTOR, LayerZeroV2ZircuitMainnet.CHAIN_ID, "zircuit-mainnet"); + _registerChain(LayerZeroV2ZkatanaMainnet.EID, address(LayerZeroV2ZkatanaMainnet.ENDPOINT_V2), address(LayerZeroV2ZkatanaMainnet.SEND_ULN_302), address(LayerZeroV2ZkatanaMainnet.RECEIVE_ULN_302), LayerZeroV2ZkatanaMainnet.EXECUTOR, LayerZeroV2ZkatanaMainnet.CHAIN_ID, "zkatana-mainnet"); + _registerChain(LayerZeroV2ZkconsensysMainnet.EID, address(LayerZeroV2ZkconsensysMainnet.ENDPOINT_V2), address(LayerZeroV2ZkconsensysMainnet.SEND_ULN_302), address(LayerZeroV2ZkconsensysMainnet.RECEIVE_ULN_302), LayerZeroV2ZkconsensysMainnet.EXECUTOR, LayerZeroV2ZkconsensysMainnet.CHAIN_ID, "zkconsensys-mainnet"); + _registerChain(LayerZeroV2ZklinkMainnet.EID, address(LayerZeroV2ZklinkMainnet.ENDPOINT_V2), address(LayerZeroV2ZklinkMainnet.SEND_ULN_302), address(LayerZeroV2ZklinkMainnet.RECEIVE_ULN_302), LayerZeroV2ZklinkMainnet.EXECUTOR, LayerZeroV2ZklinkMainnet.CHAIN_ID, "zklink-mainnet"); + _registerChain(LayerZeroV2ZkpolygonMainnet.EID, address(LayerZeroV2ZkpolygonMainnet.ENDPOINT_V2), address(LayerZeroV2ZkpolygonMainnet.SEND_ULN_302), address(LayerZeroV2ZkpolygonMainnet.RECEIVE_ULN_302), LayerZeroV2ZkpolygonMainnet.EXECUTOR, LayerZeroV2ZkpolygonMainnet.CHAIN_ID, "zkpolygon-mainnet"); + _registerChain(LayerZeroV2ZksyncMainnet.EID, address(LayerZeroV2ZksyncMainnet.ENDPOINT_V2), address(LayerZeroV2ZksyncMainnet.SEND_ULN_302), address(LayerZeroV2ZksyncMainnet.RECEIVE_ULN_302), LayerZeroV2ZksyncMainnet.EXECUTOR, LayerZeroV2ZksyncMainnet.CHAIN_ID, "zksync-mainnet"); + _registerChain(LayerZeroV2ZkverifyMainnet.EID, address(LayerZeroV2ZkverifyMainnet.ENDPOINT_V2), address(LayerZeroV2ZkverifyMainnet.SEND_ULN_302), address(LayerZeroV2ZkverifyMainnet.RECEIVE_ULN_302), LayerZeroV2ZkverifyMainnet.EXECUTOR, LayerZeroV2ZkverifyMainnet.CHAIN_ID, "zkverify-mainnet"); + _registerChain(LayerZeroV2ZoraMainnet.EID, address(LayerZeroV2ZoraMainnet.ENDPOINT_V2), address(LayerZeroV2ZoraMainnet.SEND_ULN_302), address(LayerZeroV2ZoraMainnet.RECEIVE_ULN_302), LayerZeroV2ZoraMainnet.EXECUTOR, LayerZeroV2ZoraMainnet.CHAIN_ID, "zora-mainnet"); + } + + /// @notice Register a single chain + function _registerChain( + uint32 eid, + address endpoint, + address sendUln, + address receiveUln, + address executor, + uint256 chainId, + string memory chainName + ) private { + _protocolAddresses[eid] = ProtocolAddresses({ + endpointV2: endpoint, + sendUln302: sendUln, + receiveUln302: receiveUln, + executor: executor, + chainId: chainId, + chainName: chainName, + exists: true + }); + _registeredEids.push(eid); + _chainNameToEid[chainName] = eid; + } + + function getProtocolAddresses(uint32 eid) public view override returns (ProtocolAddresses memory) { + ProtocolAddresses memory addresses = _protocolAddresses[eid]; + require(addresses.exists, string.concat("Chain not registered: ", _toString(eid))); + return addresses; + } + + function isChainSupported(uint32 eid) public view override returns (bool) { + return _protocolAddresses[eid].exists; + } + + function getSupportedEids() public view override returns (uint32[] memory) { + return _registeredEids; + } + + /// @notice Get EID by chain name + function getEidByChainName(string memory chainName) public view returns (uint32) { + uint32 eid = _chainNameToEid[chainName]; + require(eid != 0 || _protocolAddresses[0].exists, "Chain name not found"); + return eid; + } + + /// @notice Get EID by chain ID + function getEidByChainId(uint256 chainId) public view returns (uint32) { + // Auto-generated chain ID to EID mappings + if (chainId == 1) return 30101; // ethereum-mainnet + if (chainId == 10) return 30111; // optimism-mainnet + if (chainId == 14) return 30295; // flare-mainnet + if (chainId == 25) return 30359; // cronosevm-mainnet + if (chainId == 30) return 30333; // rootstock-mainnet + if (chainId == 37) return 30216; // xpla-mainnet + if (chainId == 40) return 30199; // telos-mainnet + if (chainId == 50) return 30365; // xdc-mainnet + if (chainId == 56) return 30102; // bsc-mainnet + if (chainId == 66) return 30155; // okx-mainnet + if (chainId == 81) return 30285; // joc-mainnet + if (chainId == 82) return 30176; // meter-mainnet + if (chainId == 88) return 30196; // tomo-mainnet + if (chainId == 100) return 30145; // gnosis-mainnet + if (chainId == 122) return 30138; // fuse-mainnet + if (chainId == 130) return 30320; // unichain-mainnet + if (chainId == 137) return 30109; // polygon-mainnet + if (chainId == 143) return 30390; // monad-mainnet + if (chainId == 146) return 30332; // sonic-mainnet + if (chainId == 148) return 30230; // shimmer-mainnet + if (chainId == 169) return 30217; // manta-mainnet + if (chainId == 196) return 30274; // xlayer-mainnet + if (chainId == 204) return 30202; // opbnb-mainnet + if (chainId == 232) return 30373; // lens-mainnet + if (chainId == 239) return 30377; // tac-mainnet + if (chainId == 250) return 30112; // fantom-mainnet + if (chainId == 252) return 30255; // fraxtal-mainnet + if (chainId == 291) return 30213; // orderly-mainnet + if (chainId == 295) return 30316; // hedera-mainnet + if (chainId == 324) return 30165; // zksync-mainnet + if (chainId == 388) return 30360; // cronoszkevm-mainnet + if (chainId == 424) return 30218; // pgn-mainnet + if (chainId == 432) return 30400; // converge-mainnet + if (chainId == 480) return 30319; // worldchain-mainnet + if (chainId == 484) return 30381; // camp-mainnet + if (chainId == 592) return 30210; // astar-mainnet + if (chainId == 747) return 30336; // flow-mainnet + if (chainId == 957) return 30311; // lyra-mainnet + if (chainId == 964) return 30374; // subtensorevm-mainnet + if (chainId == 988) return 30396; // stable-mainnet + if (chainId == 999) return 30367; // hyperliquid-mainnet + if (chainId == 1030) return 30212; // conflux-mainnet + if (chainId == 1088) return 30151; // metis-mainnet + if (chainId == 1101) return 30158; // zkpolygon-mainnet + if (chainId == 1116) return 30153; // coredao-mainnet + if (chainId == 1135) return 30321; // lisk-mainnet + if (chainId == 1284) return 30126; // moonbeam-mainnet + if (chainId == 1285) return 30167; // moonriver-mainnet + if (chainId == 1300) return 30342; // glue-mainnet + if (chainId == 1329) return 30280; // sei-mainnet + if (chainId == 1408) return 30386; // zkverify-mainnet + if (chainId == 1480) return 30330; // islander-mainnet + if (chainId == 1514) return 30364; // story-mainnet + if (chainId == 1559) return 30173; // tenet-mainnet + if (chainId == 1612) return 30392; // openledger-mainnet + if (chainId == 1625) return 30294; // gravity-mainnet + if (chainId == 1729) return 30313; // reya-mainnet + if (chainId == 1776) return 30394; // injectiveevm-mainnet + if (chainId == 1868) return 30340; // soneium-mainnet + if (chainId == 1890) return 30309; // lightlink-mainnet + if (chainId == 1923) return 30335; // swell-mainnet + if (chainId == 1992) return 30182; // hubble-mainnet + if (chainId == 1996) return 30278; // sanko-mainnet + if (chainId == 2044) return 30148; // shrapnel-mainnet + if (chainId == 2222) return 30177; // kava-mainnet + if (chainId == 2345) return 30361; // goat-mainnet + if (chainId == 2355) return 30379; // silicon-mainnet + if (chainId == 2525) return 30234; // bb1-mainnet + if (chainId == 2741) return 30324; // abstract-mainnet + if (chainId == 2818) return 30322; // morph-mainnet + if (chainId == 3338) return 30302; // peaq-mainnet + if (chainId == 3637) return 30376; // botanix-mainnet + if (chainId == 3776) return 30257; // zkatana-mainnet + if (chainId == 4200) return 30266; // merlin-mainnet + if (chainId == 4337) return 30198; // meritcircle-mainnet + if (chainId == 5000) return 30181; // mantle-mainnet + if (chainId == 5165) return 30363; // bahamut-mainnet + if (chainId == 6001) return 30293; // bouncebit-mainnet + if (chainId == 6900) return 30369; // nibiru-mainnet + if (chainId == 7208) return 30395; // nexera-mainnet + if (chainId == 7332) return 30215; // eon-mainnet + if (chainId == 7560) return 30283; // cyber-mainnet + if (chainId == 7700) return 30159; // canto-mainnet + if (chainId == 7979) return 30149; // dos-mainnet + if (chainId == 8217) return 30150; // klaytn-mainnet + if (chainId == 8227) return 30341; // space-mainnet + if (chainId == 8453) return 30184; // base-mainnet + if (chainId == 8822) return 30284; // iota-mainnet + if (chainId == 9069) return 30384; // apexfusionnexus-mainnet + if (chainId == 9745) return 30383; // plasma-mainnet + if (chainId == 10088) return 30389; // gatelayer-mainnet + if (chainId == 11501) return 30317; // bevm-mainnet + if (chainId == 12739) return 30366; // concrete-mainnet + if (chainId == 13396) return 30263; // masa-mainnet + if (chainId == 16661) return 30388; // og-mainnet + if (chainId == 19011) return 30265; // homeverse-mainnet + if (chainId == 33139) return 30312; // ape-mainnet + if (chainId == 34443) return 30260; // mode-mainnet + if (chainId == 41923) return 30328; // edu-mainnet + if (chainId == 42161) return 30110; // arbitrum-mainnet + if (chainId == 42170) return 30175; // nova-mainnet + if (chainId == 42220) return 30125; // celo-mainnet + if (chainId == 42793) return 30292; // etherlink-mainnet + if (chainId == 43111) return 30329; // hemi-mainnet + if (chainId == 43114) return 30106; // avalanche-mainnet + if (chainId == 43419) return 30371; // gunz-mainnet + if (chainId == 48900) return 30303; // zircuit-mainnet + if (chainId == 50104) return 30334; // sophon-mainnet + if (chainId == 50312) return 30380; // somnia-mainnet + if (chainId == 53935) return 30115; // dfk-mainnet + if (chainId == 55244) return 30327; // superposition-mainnet + if (chainId == 57073) return 30339; // ink-mainnet + if (chainId == 59144) return 30183; // zkconsensys-mainnet + if (chainId == 60808) return 30279; // bob-mainnet + if (chainId == 68770) return 30315; // dm2verse-mainnet + if (chainId == 69000) return 30372; // animechain-mainnet + if (chainId == 80094) return 30362; // bera-mainnet + if (chainId == 81224) return 30323; // codex-mainnet + if (chainId == 81457) return 30243; // blast-mainnet + if (chainId == 94524) return 30291; // xchain-mainnet + if (chainId == 97477) return 30393; // doma-mainnet + if (chainId == 98865) return 30318; // plume-mainnet + if (chainId == 98866) return 30370; // plumephoenix-mainnet + if (chainId == 98881) return 30282; // ebi-mainnet + if (chainId == 111188) return 30237; // real-mainnet + if (chainId == 167000) return 30290; // taiko-mainnet + if (chainId == 200901) return 30314; // bitlayer-mainnet + if (chainId == 202110) return 30385; // dinari-mainnet + if (chainId == 432204) return 30118; // dexalot-mainnet + if (chainId == 534352) return 30214; // scroll-mainnet + if (chainId == 660279) return 30236; // xai-mainnet + if (chainId == 710420) return 30238; // tiltyard-mainnet + if (chainId == 747474) return 30375; // katana-mainnet + if (chainId == 810180) return 30301; // zklink-mainnet + if (chainId == 5064014) return 30391; // ethereal-mainnet + if (chainId == 5151706) return 30197; // loot-mainnet + if (chainId == 6985385) return 30382; // humanity-mainnet + if (chainId == 7777777) return 30195; // zora-mainnet + if (chainId == 21000000) return 30331; // mp1-mainnet + if (chainId == 666666666) return 30267; // degen-mainnet + if (chainId == 1313161554) return 30211; // aurora-mainnet + if (chainId == 1380012617) return 30235; // rarible-mainnet + if (chainId == 1666600000) return 30116; // harmony-mainnet + if (chainId == 2046399126) return 30273; // skale-mainnet + + revert("Unsupported chain ID"); + } + + /// @notice Convert uint to string (helper function) + function _toString(uint256 value) private pure returns (string memory) { + if (value == 0) { + return "0"; + } + uint256 temp = value; + uint256 digits; + while (temp != 0) { + digits++; + temp /= 10; + } + bytes memory buffer = new bytes(digits); + while (value != 0) { + digits -= 1; + buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); + value /= 10; + } + return string(buffer); + } +} \ No newline at end of file diff --git a/protocol-units/settlement/mcr/contracts/layerzero_book/LZWorkers.sol b/protocol-units/settlement/mcr/contracts/layerzero_book/LZWorkers.sol new file mode 100644 index 000000000..0aafb7014 --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/layerzero_book/LZWorkers.sol @@ -0,0 +1,1735 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.22; + +import "./interfaces/ILZWorkers.sol"; + +/// @title LayerZero Workers Registry +/// @notice Provides a registry of worker addresses (DVNs, executors) indexed by name and chain +/// @dev Maps worker names to their addresses on each chain for easy lookup +contract LZWorkers is ILZWorkers { + // Storage: nested mapping for efficient lookups (dvnName => eid => address) + mapping(string => mapping(uint32 => address)) private _dvnAddresses; + + // List of all DVN names for enumeration + string[] private _dvnNames; + mapping(string => bool) private _dvnNameExists; + + // Reverse mapping for chain name lookups + mapping(string => uint32) private _chainNameToEid; + mapping(uint32 => string) private _eidToChainName; + + // Track DVNs per chain for enumeration + mapping(uint32 => string[]) private _dvnsByChain; + + constructor() { + _registerAllDVNs(); + _registerChainMappings(); + } + + /// @notice Register all DVNs from metadata + function _registerAllDVNs() private { + + // 01node + _registerDVN("01node", 30110, 0x7A205ED4e3d7f9d0777594501705D8CD405c3B05); // arbitrum-mainnet + _registerDVN("01node", 30106, 0xA80AA110f05C9C6140018aAE0C4E08A70f43350d); // avalanche-mainnet + _registerDVN("01node", 30102, 0x8Fc629aa400D4D9c0B118F2685a49316552ABf27); // bsc-mainnet + _registerDVN("01node", 30101, 0x58DfF8622759eA75910a08DBA5D060579271dcD7); // ethereum-mainnet + _registerDVN("01node", 30112, 0x8Fc629aa400D4D9c0B118F2685a49316552ABf27); // fantom-mainnet + _registerDVN("01node", 30111, 0x969A0bdd86A230345AD87A6a381DE5ED9E6cda85); // optimism-mainnet + _registerDVN("01node", 30109, 0xf0809F6e760a5452Ee567975EdA7a28dA4a83D38); // polygon-mainnet + + // ABDB + _registerDVN("ABDB", 30110, 0xddaa92ce2d2faC3f7c5eae19136E438902Ab46cc); // arbitrum-mainnet + _registerDVN("ABDB", 30106, 0xFfe42DC3927A240f3459e5ec27EAaBD88727173E); // avalanche-mainnet + _registerDVN("ABDB", 30362, 0xa2d10677441230C4AeD58030e4EA6Ba7Bfd80393); // bera-mainnet + _registerDVN("ABDB", 30102, 0x313328609a9C38459CaE56625FFf7F2AD6dcde3b); // bsc-mainnet + _registerDVN("ABDB", 30101, 0x7E65BDd15C8Db8995F80aBf0D6593b57dc8BE437); // ethereum-mainnet + _registerDVN("ABDB", 30112, 0x313328609a9C38459CaE56625FFf7F2AD6dcde3b); // fantom-mainnet + _registerDVN("ABDB", 30111, 0x7B8a0fD9D6ae5011d5cBD3E85Ed6D5510F98c9Bf); // optimism-mainnet + _registerDVN("ABDB", 30109, 0xa6F5DDBF0Bd4D03334523465439D301080574742); // polygon-mainnet + _registerDVN("ABDB", 30320, 0x1337834fd822065Af36a13657d2E847616129F3f); // unichain-mainnet + + // Axelar + _registerDVN("Axelar", 30110, 0x9D3979c7E3DD26653C52256307709C09f47741e0); // arbitrum-mainnet + _registerDVN("Axelar", 30106, 0xc390Fd7Ca590a505655eB6c454ed0783C99a2Ea9); // avalanche-mainnet + _registerDVN("Axelar", 30243, 0xB830a5AfCBEBb936c30C607a18BbbA9f5B0a592f); // blast-mainnet + _registerDVN("Axelar", 30102, 0x878c20D3685cdBc5e2680A8a0E7FB97389344fe1); // bsc-mainnet + _registerDVN("Axelar", 30101, 0xCE5B47FA5139fC5f3c8c5f4C278ad5F56A7b2016); // ethereum-mainnet + _registerDVN("Axelar", 30255, 0x025BAB5B7271790F9cF188FdcE2c4214857f48D3); // fraxtal-mainnet + _registerDVN("Axelar", 30177, 0x80C4c3768dD5A3Dd105cf2BD868fdc50280E398B); // kava-mainnet + _registerDVN("Axelar", 30181, 0x6e6359A9abe2E235eF2b82e48f0F93D1eC16aFbb); // mantle-mainnet + _registerDVN("Axelar", 30111, 0x218B462e19d00c8feD4adbCe78f33aEf88d2ccFc); // optimism-mainnet + _registerDVN("Axelar", 30214, 0x70CEDF51c199Fad12C6c0A71cD876af948059540); // scroll-mainnet + + // BCW + _registerDVN("BCW", 30110, 0x78203678D264063815Dac114eA810E9837Cd80f7); // arbitrum-mainnet + _registerDVN("BCW", 30210, 0x7A7dDC46882220a075934f40380d3A7e1e87d409); // astar-mainnet + _registerDVN("BCW", 30211, 0x70BF42C69173d6e33b834f59630DAC592C70b369); // aurora-mainnet + _registerDVN("BCW", 30106, 0x7B8a0fD9D6ae5011d5cBD3E85Ed6D5510F98c9Bf); // avalanche-mainnet + _registerDVN("BCW", 30184, 0xB3Ce0A5D132Cd9Bf965aBa435E650c55Edce0062); // base-mainnet + _registerDVN("BCW", 30102, 0xd36246C322Ee102A2203bCA9cafb84c179D306F6); // bsc-mainnet + _registerDVN("BCW", 30159, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // canto-mainnet + _registerDVN("BCW", 30212, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // conflux-mainnet + _registerDVN("BCW", 30153, 0x7A7dDC46882220a075934f40380d3A7e1e87d409); // coredao-mainnet + _registerDVN("BCW", 30118, 0x58DfF8622759eA75910a08DBA5D060579271dcD7); // dexalot-mainnet + _registerDVN("BCW", 30115, 0x6A110d94e1baA6984A3d904bab37Ae49b90E6B4f); // dfk-mainnet + _registerDVN("BCW", 30149, 0x2AC038606fff3FB00317B8F0CcFB4081694aCDD0); // dos-mainnet + _registerDVN("BCW", 30101, 0xe552485d02EDd3067FE7FCbD4dd56BB1D3A998D2); // ethereum-mainnet + _registerDVN("BCW", 30138, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // fuse-mainnet + _registerDVN("BCW", 30316, 0x97841D4AB18E9A923322A002d5b8Eb42b31Ccdb5); // hedera-mainnet + _registerDVN("BCW", 30177, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // kava-mainnet + _registerDVN("BCW", 30150, 0x28af4dADbc5066e994986E8bb105240023dC44B6); // klaytn-mainnet + _registerDVN("BCW", 30197, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // loot-mainnet + _registerDVN("BCW", 30217, 0x809CDE2AfcF8627312E87a6a7bbFFaB3F8F347c7); // manta-mainnet + _registerDVN("BCW", 30181, 0x7A7dDC46882220a075934f40380d3A7e1e87d409); // mantle-mainnet + _registerDVN("BCW", 30198, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // meritcircle-mainnet + _registerDVN("BCW", 30176, 0xC4e1b199C3B24954022FcE7ba85419B3f0669142); // meter-mainnet + _registerDVN("BCW", 30151, 0x7A7dDC46882220a075934f40380d3A7e1e87d409); // metis-mainnet + _registerDVN("BCW", 30167, 0x7A7dDC46882220a075934f40380d3A7e1e87d409); // moonriver-mainnet + _registerDVN("BCW", 30175, 0x34730f2570E6cff8B1C91FaaBF37D0DD917c4367); // nova-mainnet + _registerDVN("BCW", 30202, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // opbnb-mainnet + _registerDVN("BCW", 30111, 0x73DDc92E39aEdA95FEb8D3E0008016d9F1268c76); // optimism-mainnet + _registerDVN("BCW", 30213, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // orderly-mainnet + _registerDVN("BCW", 30109, 0xd410dDB726991f372b69A05b006D2ae5A8CedBD6); // polygon-mainnet + _registerDVN("BCW", 30214, 0x7A7dDC46882220a075934f40380d3A7e1e87d409); // scroll-mainnet + _registerDVN("BCW", 30280, 0x1feB08B1A53A9710AfcE82D380B8c2833C69a37e); // sei-mainnet + _registerDVN("BCW", 30230, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // shimmer-mainnet + _registerDVN("BCW", 30199, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // telos-mainnet + _registerDVN("BCW", 30173, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // tenet-mainnet + _registerDVN("BCW", 30196, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // tomo-mainnet + _registerDVN("BCW", 30236, 0x34730f2570E6cff8B1C91FaaBF37D0DD917c4367); // xai-mainnet + _registerDVN("BCW", 30216, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // xpla-mainnet + _registerDVN("BCW", 30158, 0x12b4E588BeB7154519c0C6f737bB8cBa1D4E5BC7); // zkpolygon-mainnet + _registerDVN("BCW", 30165, 0x0D1bc4Efd08940eB109Ef3040c1386d09B6334E0); // zksync-mainnet + _registerDVN("BCW", 30195, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // zora-mainnet + + // BWare + _registerDVN("BWare", 30110, 0x9bCd17A654bffAa6f8fEa38D19661a7210e22196); // arbitrum-mainnet + _registerDVN("BWare", 30210, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // astar-mainnet + _registerDVN("BWare", 30106, 0xcFf5b0608Fa638333f66e0dA9d4f1eB906Ac18e3); // avalanche-mainnet + _registerDVN("BWare", 30184, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // base-mainnet + _registerDVN("BWare", 30243, 0xabC9b1819cc4D9846550F928B985993cF6240439); // blast-mainnet + _registerDVN("BWare", 30279, 0x58DfF8622759eA75910a08DBA5D060579271dcD7); // bob-mainnet + _registerDVN("BWare", 30102, 0xfE1cD27827E16b07E61A4AC96b521bDB35e00328); // bsc-mainnet + _registerDVN("BWare", 30101, 0x7a23612F07d81F16B26cF0b5a4C3eca0E8668df2); // ethereum-mainnet + _registerDVN("BWare", 30112, 0x247624e2143504730aeC22912ed41F092498bEf2); // fantom-mainnet + _registerDVN("BWare", 30145, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // gnosis-mainnet + _registerDVN("BWare", 30294, 0xcced05c3667877B545285B25f19F794436A1c481); // gravity-mainnet + _registerDVN("BWare", 30284, 0xD7bB44516b476ca805FB9d6fc5b508ef3Ee9448D); // iota-mainnet + _registerDVN("BWare", 30217, 0xabC9b1819cc4D9846550F928B985993cF6240439); // manta-mainnet + _registerDVN("BWare", 30181, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // mantle-mainnet + _registerDVN("BWare", 30151, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // metis-mainnet + _registerDVN("BWare", 30260, 0x10901f74caE315f674D3f6FC0645217FE4faD77C); // mode-mainnet + _registerDVN("BWare", 30126, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // moonbeam-mainnet + _registerDVN("BWare", 30167, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // moonriver-mainnet + _registerDVN("BWare", 30175, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // nova-mainnet + _registerDVN("BWare", 30155, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // okx-mainnet + _registerDVN("BWare", 30202, 0x2AC038606fff3FB00317B8F0CcFB4081694aCDD0); // opbnb-mainnet + _registerDVN("BWare", 30111, 0x19670Df5E16bEa2ba9b9e68b48C054C5bAEa06B8); // optimism-mainnet + _registerDVN("BWare", 30302, 0x790d7B1E97a086eb0012393b65a5B32cE58a04Dc); // peaq-mainnet + _registerDVN("BWare", 30109, 0x247624e2143504730aeC22912ed41F092498bEf2); // polygon-mainnet + _registerDVN("BWare", 30214, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // scroll-mainnet + _registerDVN("BWare", 30183, 0xF45742BbfaBCEe739eA2a2d0BA2dd140F1f2C6A3); // zkconsensys-mainnet + _registerDVN("BWare", 30301, 0x1253E268Bc04bB43CB96D2F7Ee858b8A1433Cf6D); // zklink-mainnet + _registerDVN("BWare", 30158, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // zkpolygon-mainnet + _registerDVN("BWare", 30165, 0x3A5a74f863ec48c1769C4Ee85f6C3d70f5655E2A); // zksync-mainnet + + // Bera + _registerDVN("Bera", 30110, 0xf2e89Ed7E342c708BA8CD79b293AD9244f5FCcb3); // arbitrum-mainnet + _registerDVN("Bera", 30106, 0xF18F2C3d86Ec9A350D5E10Cb67c614201f210D3D); // avalanche-mainnet + _registerDVN("Bera", 30362, 0x10473BD2f7320476B5E5E59649e3Dc129d9d0029); // bera-mainnet + _registerDVN("Bera", 30102, 0x8ed0A851964604BB1b6b1a703F4c8234EE684d76); // bsc-mainnet + _registerDVN("Bera", 30101, 0xE2e558C85E00B4d7529433C1cc78Ab678Cf62538); // ethereum-mainnet + _registerDVN("Bera", 30112, 0x1a53015B6b4d88a943Ed512bD179FbD89a768B6b); // fantom-mainnet + _registerDVN("Bera", 30111, 0x5F5512c760f69A338Cf2758d1E6A957571bB6ee0); // optimism-mainnet + _registerDVN("Bera", 30109, 0xCF46153f01355036bF07E5f7Fb1eb262f25dFeDd); // polygon-mainnet + + // Bitgo + _registerDVN("Bitgo", 30110, 0x0711dd777AE626ef5E0a4F50e199C7a0E0666857); // arbitrum-mainnet + _registerDVN("Bitgo", 30106, 0xc18d69d1a83294d0886E1b79f241405F1fA86cB6); // avalanche-mainnet + _registerDVN("Bitgo", 30184, 0x133e9fB2D339D8428476A714B1113B024343811E); // base-mainnet + _registerDVN("Bitgo", 30362, 0xdfF3F73C260b3361d4F006B02972c6aF6C5c5417); // bera-mainnet + _registerDVN("Bitgo", 30279, 0xaA391622e42aE501371CD745CE0BAD588a8C65fd); // bob-mainnet + _registerDVN("Bitgo", 30102, 0xa2CEB887f545400B8247Dfb7E9cCAda7abAbBDE8); // bsc-mainnet + _registerDVN("Bitgo", 30101, 0xc9ca319f6Da263910fd9B037eC3d817A814ef3d8); // ethereum-mainnet + _registerDVN("Bitgo", 30112, 0x3b247F1B48F055EbF2DB593672B98C9597E3081E); // fantom-mainnet + _registerDVN("Bitgo", 30336, 0xCCdeBdb5aCFD6Ae062859ac66653b10ED77586C2); // flow-mainnet + _registerDVN("Bitgo", 30316, 0xA83A87a0bDce466edfBB6794404E1D7F556B8F20); // hedera-mainnet + _registerDVN("Bitgo", 30367, 0xf55E9dAef79eeC17F76e800F059495F198ef8348); // hyperliquid-mainnet + _registerDVN("Bitgo", 30390, 0xdD107f9B5209670840f9cD58e241F460651C16C4); // monad-mainnet + _registerDVN("Bitgo", 30111, 0xF24Dc834039a1E39F6b99A51Df05Df9c91e35b2d); // optimism-mainnet + _registerDVN("Bitgo", 30109, 0x02152F4624596602dCBB8B8EAD2988Ad44EDc865); // polygon-mainnet + _registerDVN("Bitgo", 30280, 0x26cD5aBaDf7eC3f0F02b48314bfcA6b2342cddD4); // sei-mainnet + _registerDVN("Bitgo", 30380, 0xdD9B12623ec1C7E744819708B9217b309fDE4080); // somnia-mainnet + _registerDVN("Bitgo", 30340, 0x04584d612802A3a26b160E3F90341E6443dDB76A); // soneium-mainnet + _registerDVN("Bitgo", 30332, 0xdfBb5C677dB41b5EF3a180509CDe27B5c9784655); // sonic-mainnet + _registerDVN("Bitgo", 30335, 0x1269D1777bA8cF7498FE741869Ed4B73f2A47e93); // swell-mainnet + _registerDVN("Bitgo", 30199, 0x31B8c7CD7226eA79E833FaBDcCbcA0fa38d6E0a1); // telos-mainnet + _registerDVN("Bitgo", 30320, 0x6a4C9096F162f0ab3C0517B0a40dc1CE44785e16); // unichain-mainnet + + // Blockhunters + _registerDVN("Blockhunters", 30110, 0xD074B6bbCBEC2f2B4c4265DE3D95e521f82bF669); // arbitrum-mainnet + _registerDVN("Blockhunters", 30106, 0xD074B6bbCBEC2f2B4c4265DE3D95e521f82bF669); // avalanche-mainnet + _registerDVN("Blockhunters", 30102, 0x547bF6889B1095b7CC6e525A1F8E8Fdb26134a38); // bsc-mainnet + _registerDVN("Blockhunters", 30101, 0x6E70FCdc42D3d63748B7d8883399Dcb16BBB5c8c); // ethereum-mainnet + _registerDVN("Blockhunters", 30112, 0x547bF6889B1095b7CC6e525A1F8E8Fdb26134a38); // fantom-mainnet + _registerDVN("Blockhunters", 30111, 0xB3Ce0A5D132Cd9Bf965aBa435E650c55Edce0062); // optimism-mainnet + _registerDVN("Blockhunters", 30109, 0xBD40c9047980500C46B8aed4462e2f889299FEbE); // polygon-mainnet + + // CCIP + _registerDVN("CCIP", 30106, 0xd46270746acBcA85Dab8dE1CE1d71c46C2F2994C); // avalanche-mainnet + _registerDVN("CCIP", 30102, 0x53561BcfE6B3F23BC72E5b9919c12322729942e8); // bsc-mainnet + _registerDVN("CCIP", 30101, 0x771D10D0C86E26eA8d3b778ad4d31B30533B9Cbf); // ethereum-mainnet + + // Canary + _registerDVN("Canary", 30324, 0xCB773CAf620D2A6703d2cd30C567A6c2906ccfbb); // abstract-mainnet + _registerDVN("Canary", 30312, 0x9bB011796fC3604D3a4FaA5863f587a33F6224AF); // ape-mainnet + _registerDVN("Canary", 30110, 0xf2E380c90e6c09721297526dbC74f870e114dfCb); // arbitrum-mainnet + _registerDVN("Canary", 30210, 0x31B8c7CD7226eA79E833FaBDcCbcA0fa38d6E0a1); // astar-mainnet + _registerDVN("Canary", 30211, 0xb4CaA217dD195B3B40eEe24b82c8093c2ea659cd); // aurora-mainnet + _registerDVN("Canary", 30106, 0xcC49E6fca014c77E1Eb604351cc1E08C84511760); // avalanche-mainnet + _registerDVN("Canary", 30363, 0x4FE90e0f2A99e464d6E97B161d72101CD03C20fe); // bahamut-mainnet + _registerDVN("Canary", 30184, 0x554833698Ae0FB22ECC90B01222903fD62CA4B47); // base-mainnet + _registerDVN("Canary", 30234, 0x2A22804Cfa992D5cb1324863ec4aDa920256B908); // bb1-mainnet + _registerDVN("Canary", 30362, 0x06e8042729CeF3aE6D6DB5350f48F9D736C3675d); // bera-mainnet + _registerDVN("Canary", 30317, 0x4FE90e0f2A99e464d6E97B161d72101CD03C20fe); // bevm-mainnet + _registerDVN("Canary", 30243, 0x6398E91001Cc1682bBA103E6B2489Fa5675a5a64); // blast-mainnet + _registerDVN("Canary", 30279, 0x46d6E532A913cDf688fb7863Ce1CF360a81Ec5E4); // bob-mainnet + _registerDVN("Canary", 30376, 0xbCefdAdB8d24b1d36c26B522235012Cd4cf162f6); // botanix-mainnet + _registerDVN("Canary", 30102, 0xfA9bA83C102283958B997Adc8B44ED3A3CdB5dDa); // bsc-mainnet + _registerDVN("Canary", 30159, 0x73DDc92E39aEdA95FEb8D3E0008016d9F1268c76); // canto-mainnet + _registerDVN("Canary", 30125, 0x94AAfe0A92A8300f0A2100A7f3DE47d6845747A9); // celo-mainnet + _registerDVN("Canary", 30323, 0x391A2021483cB476D059a78130f95165C79604b7); // codex-mainnet + _registerDVN("Canary", 30212, 0xE0F0FbBDBF9d398eCA0dd8c86d1F308D895b9Eb7); // conflux-mainnet + _registerDVN("Canary", 30153, 0xC133Fd6b4c44277eD592E903C0585936D7585Fa5); // coredao-mainnet + _registerDVN("Canary", 30359, 0xF1042Bba248634583d0678d53FB33Bc885E09F11); // cronosevm-mainnet + _registerDVN("Canary", 30360, 0xc4A1F52fDA034A9A5E1B3b27D14451d15776Fef6); // cronoszkevm-mainnet + _registerDVN("Canary", 30283, 0x3a855FCE450F7AEf93b14251D94CC4A47F9ff010); // cyber-mainnet + _registerDVN("Canary", 30267, 0xf10Ea2c0D43bC4973cfBCc94eBAfC39d1D4aF118); // degen-mainnet + _registerDVN("Canary", 30118, 0x9bB011796fC3604D3a4FaA5863f587a33F6224AF); // dexalot-mainnet + _registerDVN("Canary", 30115, 0xAb6d3d37D8Dc309e7d8086B2e85a953b84Ee5fA9); // dfk-mainnet + _registerDVN("Canary", 30149, 0x45A7305c65AAd28384F20a80F87a5183772E4F70); // dos-mainnet + _registerDVN("Canary", 30328, 0x73ddc44AA34A838744c53AA23886e784a7B1F734); // edu-mainnet + _registerDVN("Canary", 30391, 0x56053A8f4db677e5774F8Ee5BdD9D2dC270075f3); // ethereal-mainnet + _registerDVN("Canary", 30101, 0xa4fE5A5B9A846458a70Cd0748228aED3bF65c2cd); // ethereum-mainnet + _registerDVN("Canary", 30112, 0xE5BFfd46776251b70895517D4AB635a640dA61E9); // fantom-mainnet + _registerDVN("Canary", 30295, 0xD791948db16AB4373FA394B74C727DDb7FB02520); // flare-mainnet + _registerDVN("Canary", 30336, 0xe4e65D80DEb0E2c8391215bcBA4b5f7603420407); // flow-mainnet + _registerDVN("Canary", 30255, 0x6398E91001Cc1682bBA103E6B2489Fa5675a5a64); // fraxtal-mainnet + _registerDVN("Canary", 30138, 0x7A3D18E2324536294CD6F054cDde7c994f40391A); // fuse-mainnet + _registerDVN("Canary", 30342, 0xe4e65D80DEb0E2c8391215bcBA4b5f7603420407); // glue-mainnet + _registerDVN("Canary", 30145, 0x90EE303d4743F460B9a38415e09f3799b85a4efc); // gnosis-mainnet + _registerDVN("Canary", 30361, 0x396dC0A78F789586E2982fCCD830C5954C193F3c); // goat-mainnet + _registerDVN("Canary", 30294, 0xe9C24dD582e37FAACa7d44c799530688DE92Da73); // gravity-mainnet + _registerDVN("Canary", 30371, 0x0D7cb4033e0C193F65B3639E61b6986A29Bf1DD4); // gunz-mainnet + _registerDVN("Canary", 30116, 0xa6F5DDBF0Bd4D03334523465439D301080574742); // harmony-mainnet + _registerDVN("Canary", 30316, 0x4b92BC2A7d681bf5230472C80d92aCFE9A6b9435); // hedera-mainnet + _registerDVN("Canary", 30329, 0x396dC0A78F789586E2982fCCD830C5954C193F3c); // hemi-mainnet + _registerDVN("Canary", 30382, 0x97841D4AB18E9A923322A002d5b8Eb42b31Ccdb5); // humanity-mainnet + _registerDVN("Canary", 30367, 0x83342EC538dF0460e730a8F543Fe63063e2D44C4); // hyperliquid-mainnet + _registerDVN("Canary", 30339, 0x1E4CE74ccf5498B19900649D9196e64BAb592451); // ink-mainnet + _registerDVN("Canary", 30284, 0xeCbaA45c33ce6Fa284995e5F8314f5bC7F1C2008); // iota-mainnet + _registerDVN("Canary", 30330, 0x45A7305c65AAd28384F20a80F87a5183772E4F70); // islander-mainnet + _registerDVN("Canary", 30285, 0x5488a4ca201421cF100dC1B90D1dE5B26b421f64); // joc-mainnet + _registerDVN("Canary", 30375, 0x53fF818a1c492e667E2cD0b5AFe0FC82c66d33c7); // katana-mainnet + _registerDVN("Canary", 30177, 0x06b85533967179eD5bC9C754b84aE7d02f7eD830); // kava-mainnet + _registerDVN("Canary", 30150, 0x1154d04d07AEe26ff2C200Bd373eb76a7e5694d6); // klaytn-mainnet + _registerDVN("Canary", 30309, 0xF1042Bba248634583d0678d53FB33Bc885E09F11); // lightlink-mainnet + _registerDVN("Canary", 30321, 0x0D155ec1Dfc983E919C318964fD16078408E99CC); // lisk-mainnet + _registerDVN("Canary", 30197, 0xA1491AdA1168f04df32F72913fc3F27522950acf); // loot-mainnet + _registerDVN("Canary", 30311, 0x047d9DBe4fC6B5c916F37237F547f9F42809935a); // lyra-mainnet + _registerDVN("Canary", 30217, 0xDF44a1594d3D516f7CDFb4DC275a79a5F6e3Db1d); // manta-mainnet + _registerDVN("Canary", 30181, 0xa2447e5B58D357c49Bf74B50B14421e6A100e525); // mantle-mainnet + _registerDVN("Canary", 30198, 0xA1Bc1B9af01A0ec78883AA5DC7DECDCe897E1E76); // meritcircle-mainnet + _registerDVN("Canary", 30266, 0x4134190B4CC18A9745ee0422CbC91c94F46a4cc1); // merlin-mainnet + _registerDVN("Canary", 30151, 0xAf75bfD402f3d4EE84978179a6c87D16c4Bd1724); // metis-mainnet + _registerDVN("Canary", 30260, 0x5D8aeD4182A8EcC47386e88Aa8753Dde7423996e); // mode-mainnet + _registerDVN("Canary", 30390, 0x493626C5D852B9B187a9eb709D0b0978a3877238); // monad-mainnet + _registerDVN("Canary", 30126, 0x33E5fcC13D7439cC62d54c41AA966197145b3Cd7); // moonbeam-mainnet + _registerDVN("Canary", 30167, 0x8fa9eEf18c2A1459024f0B44714e5aCc1Ce7f5e8); // moonriver-mainnet + _registerDVN("Canary", 30322, 0xf10Ea2c0D43bC4973cfBCc94eBAfC39d1D4aF118); // morph-mainnet + _registerDVN("Canary", 30331, 0x5311241a20055f9C0b02d18d6c52F2b711c07B03); // mp1-mainnet + _registerDVN("Canary", 30175, 0xE4193136B92bA91402313e95347c8e9FAD8d27d0); // nova-mainnet + _registerDVN("Canary", 30388, 0x183940c4855a01da92bc2f96F7e0A8Aecbf797ff); // og-mainnet + _registerDVN("Canary", 30155, 0x07653d28b0f53D4c54b70eb1f9025795B23a9D6e); // okx-mainnet + _registerDVN("Canary", 30202, 0xE5491Fac6965Aa664EFD6d1aE5e7D1d56Da4FDDa); // opbnb-mainnet + _registerDVN("Canary", 30111, 0x5b6735c66d97479cCD18294fc96B3084EcB2fa3f); // optimism-mainnet + _registerDVN("Canary", 30213, 0xd42306DF1a805d8053Bc652cE0Cd9F62BDe80146); // orderly-mainnet + _registerDVN("Canary", 30302, 0x0C0C8fd5351fd936A987c790d88B137df4E73D64); // peaq-mainnet + _registerDVN("Canary", 30383, 0x2465eE263149A18d61c9224244c61a5871dc0473); // plasma-mainnet + _registerDVN("Canary", 30370, 0x395B14700812cccC38b8e64F0a06ce2045FE9bA3); // plumephoenix-mainnet + _registerDVN("Canary", 30109, 0x13feb7234Ff60A97af04477d6421415766753Ba3); // polygon-mainnet + _registerDVN("Canary", 30333, 0xF1042Bba248634583d0678d53FB33Bc885E09F11); // rootstock-mainnet + _registerDVN("Canary", 30278, 0x21cAF0BCE846AAA78C9f23C5A4eC5988EcBf9988); // sanko-mainnet + _registerDVN("Canary", 30214, 0xDF44a1594d3D516f7CDFb4DC275a79a5F6e3Db1d); // scroll-mainnet + _registerDVN("Canary", 30280, 0x33051Ad47157A50Bb49a646256b854C60f707C86); // sei-mainnet + _registerDVN("Canary", 30230, 0x7E65BDd15C8Db8995F80aBf0D6593b57dc8BE437); // shimmer-mainnet + _registerDVN("Canary", 30148, 0xE4193136B92bA91402313e95347c8e9FAD8d27d0); // shrapnel-mainnet + _registerDVN("Canary", 30340, 0xdd1564F68aa802E30819F9E8043664584A8a3E87); // soneium-mainnet + _registerDVN("Canary", 30332, 0xb2c7832aA8DDA878De6f949485f927e9e532E92C); // sonic-mainnet + _registerDVN("Canary", 30334, 0x99aA6f70535873AC8167D69893a2CF70ECA544C3); // sophon-mainnet + _registerDVN("Canary", 30341, 0xE4193136B92bA91402313e95347c8e9FAD8d27d0); // space-mainnet + _registerDVN("Canary", 30396, 0x8D6cC20D84FbEb5733c60436CeB8957Da2ac02C8); // stable-mainnet + _registerDVN("Canary", 30364, 0x77aAF86B4466A67869667BaBe02c6Ebe7E7791d6); // story-mainnet + _registerDVN("Canary", 30374, 0xc71a3d16F00d93c78AB89aAEDde7C0012A3b26Cb); // subtensorevm-mainnet + _registerDVN("Canary", 30327, 0x396dC0A78F789586E2982fCCD830C5954C193F3c); // superposition-mainnet + _registerDVN("Canary", 30335, 0xa2447e5B58D357c49Bf74B50B14421e6A100e525); // swell-mainnet + _registerDVN("Canary", 30377, 0x07ff86c392588254Ad10F0811dbBcad45f4C7d87); // tac-mainnet + _registerDVN("Canary", 30290, 0xa9Ff468ad000A4D5729826459197a0dB843F433E); // taiko-mainnet + _registerDVN("Canary", 30199, 0xae5273d893aD87c8f38D45E822A7b4321cCeFB4c); // telos-mainnet + _registerDVN("Canary", 30173, 0xA1491AdA1168f04df32F72913fc3F27522950acf); // tenet-mainnet + _registerDVN("Canary", 30320, 0x00A979a5D306E9c5F8Cf473659e75f8002E06fc8); // unichain-mainnet + _registerDVN("Canary", 30319, 0xe9C24dD582e37FAACa7d44c799530688DE92Da73); // worldchain-mainnet + _registerDVN("Canary", 30236, 0x7A3D18E2324536294CD6F054cDde7c994f40391A); // xai-mainnet + _registerDVN("Canary", 30365, 0x307d81ef09c72730f57667bF1e9b62DB4904053f); // xdc-mainnet + _registerDVN("Canary", 30274, 0x047d9DBe4fC6B5c916F37237F547f9F42809935a); // xlayer-mainnet + _registerDVN("Canary", 30216, 0x73DDc92E39aEdA95FEb8D3E0008016d9F1268c76); // xpla-mainnet + _registerDVN("Canary", 30303, 0xe552485d02EDd3067FE7FCbD4dd56BB1D3A998D2); // zircuit-mainnet + _registerDVN("Canary", 30183, 0xDA63525a0Fc42Bcc2cAD1dD28708d5ed11849347); // zkconsensys-mainnet + _registerDVN("Canary", 30301, 0x0D1bc4Efd08940eB109Ef3040c1386d09B6334E0); // zklink-mainnet + _registerDVN("Canary", 30165, 0x05Db3a229293C09F639a16526bB2481704716Df0); // zksync-mainnet + _registerDVN("Canary", 30195, 0x3AD8537B6936c596ca36D736063380810f7d3252); // zora-mainnet + + // Chainlink + _registerDVN("Chainlink", 30110, 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539); // arbitrum-mainnet + _registerDVN("Chainlink", 30106, 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539); // avalanche-mainnet + _registerDVN("Chainlink", 30102, 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539); // bsc-mainnet + _registerDVN("Chainlink", 30101, 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539); // ethereum-mainnet + _registerDVN("Chainlink", 30112, 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539); // fantom-mainnet + _registerDVN("Chainlink", 30111, 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539); // optimism-mainnet + _registerDVN("Chainlink", 30109, 0x150A58e9E6BF69ccEb1DBA5ae97C166DC8792539); // polygon-mainnet + + // Curve + _registerDVN("Curve", 30110, 0x4066b6e7BfD761B579902E7e8D03F4feb9B9536E); // arbitrum-mainnet + _registerDVN("Curve", 30211, 0x315b0e76A510607bB0F706B17716F426D5b385b8); // aurora-mainnet + _registerDVN("Curve", 30106, 0x6821Ea3d3a52421D2b7DF330f2316eD157314d7f); // avalanche-mainnet + _registerDVN("Curve", 30184, 0x1a3A8421e48b7536f3F71d8B14A1449c90eFA909); // base-mainnet + _registerDVN("Curve", 30102, 0xc6e1f0fc326913bD31fB11699c61F6f1F2A5e6d2); // bsc-mainnet + _registerDVN("Curve", 30125, 0xc4305B4a16cb631CBd34b33380FB8c221cdf63Ab); // celo-mainnet + _registerDVN("Curve", 30101, 0xcc35923c43893CC31F2815e216afD7EFB60f1fB0); // ethereum-mainnet + _registerDVN("Curve", 30112, 0x06a32EFaFC7698c00e87f5225178d7364773E93b); // fantom-mainnet + _registerDVN("Curve", 30255, 0x05dF4949f0B4dC4c4b1ADc0e01700Bc669E935c3); // fraxtal-mainnet + _registerDVN("Curve", 30145, 0x30c673a1F34B91C4bf4951670A2B7c8C0663b100); // gnosis-mainnet + _registerDVN("Curve", 30367, 0x8a41c07623cdF8995aE8769BfC45859D7cA99e82); // hyperliquid-mainnet + _registerDVN("Curve", 30339, 0x18766cA3fEcDE0C1251922Be6D3a088aDf5f53e6); // ink-mainnet + _registerDVN("Curve", 30177, 0x05dF4949f0B4dC4c4b1ADc0e01700Bc669E935c3); // kava-mainnet + _registerDVN("Curve", 30181, 0xF18F2C3d86Ec9A350D5E10Cb67c614201f210D3D); // mantle-mainnet + _registerDVN("Curve", 30126, 0x7DEcC6Df3aF9CFc275E25d2f9703eCF7ad800D5D); // moonbeam-mainnet + _registerDVN("Curve", 30331, 0xDD779AAAd20E62275457Af91b123bB13dd5aFd0B); // mp1-mainnet + _registerDVN("Curve", 30111, 0xb908Fc507fE3145e855cf63127349756b9eCF3a6); // optimism-mainnet + _registerDVN("Curve", 30370, 0x8Ede21203E062D7D1EAeC11c4c72Ad04cDc15658); // plumephoenix-mainnet + _registerDVN("Curve", 30109, 0x4066b6e7BfD761B579902E7e8D03F4feb9B9536E); // polygon-mainnet + _registerDVN("Curve", 30332, 0x3c4e4c3baA5D883654970fe34Db8c943ebf43ab2); // sonic-mainnet + _registerDVN("Curve", 30377, 0x4d45727d2de5ffC811E6A161c3a7233a2Ea2e0E7); // tac-mainnet + _registerDVN("Curve", 30290, 0x8bAFe0299CB4D3fF75d3f7045554474Bf414FD11); // taiko-mainnet + _registerDVN("Curve", 30365, 0xAb6d3d37D8Dc309e7d8086B2e85a953b84Ee5fA9); // xdc-mainnet + _registerDVN("Curve", 30274, 0x1a92C25Cb7Cd80E1138E8125FC0a0B0642688C0B); // xlayer-mainnet + + // Delegate + _registerDVN("Delegate", 30110, 0xdf30C9f6A70cE65A152c5Bd09826525D7E97Ba49); // arbitrum-mainnet + _registerDVN("Delegate", 30106, 0x83d06212b6647B0d0865e730270751e3FDF5036E); // avalanche-mainnet + _registerDVN("Delegate", 30102, 0x9EEee79F5dBC4D99354b5CB547c138Af432F937b); // bsc-mainnet + _registerDVN("Delegate", 30101, 0x87048402c32632B7c4d0A892d82bC1160E8B2393); // ethereum-mainnet + _registerDVN("Delegate", 30112, 0x9EEee79F5dBC4D99354b5CB547c138Af432F937b); // fantom-mainnet + _registerDVN("Delegate", 30111, 0x7A205ED4e3d7f9d0777594501705D8CD405c3B05); // optimism-mainnet + _registerDVN("Delegate", 30109, 0x4D52f5bc932cf1A854381A85ad9ED79B8497c153); // polygon-mainnet + + // Deutsche Telekom + _registerDVN("Deutsche Telekom", 30110, 0xEae839784e5F6C79bBaf34b6023a2f62e134AB39); // arbitrum-mainnet + _registerDVN("Deutsche Telekom", 30106, 0xbe57e9E7d9eB16B92C6383792aBe28D64a18c0F1); // avalanche-mainnet + _registerDVN("Deutsche Telekom", 30184, 0xc2A0C36f5939A14966705c7Cec813163FaEEa1F0); // base-mainnet + _registerDVN("Deutsche Telekom", 30362, 0x0273fbfF931704884668a9eFe50e7a2b3FC30505); // bera-mainnet + _registerDVN("Deutsche Telekom", 30376, 0x7A3D18E2324536294CD6F054cDde7c994f40391A); // botanix-mainnet + _registerDVN("Deutsche Telekom", 30102, 0xf0a5C5306adbFd4e3dfD5d4B148B451c411d3878); // bsc-mainnet + _registerDVN("Deutsche Telekom", 30125, 0xEa928f8E62F3DAc51288056015B1D4e3eCfacdAC); // celo-mainnet + _registerDVN("Deutsche Telekom", 30212, 0x45A7305c65AAd28384F20a80F87a5183772E4F70); // conflux-mainnet + _registerDVN("Deutsche Telekom", 30153, 0xDe79818C75649773Fc462E9d3134b23B81741481); // coredao-mainnet + _registerDVN("Deutsche Telekom", 30101, 0x373a6E5c0C4E89E24819f00AA37ea370917AAfF4); // ethereum-mainnet + _registerDVN("Deutsche Telekom", 30112, 0x8181F551c95928c0648d4378Dc4d95E847bc3945); // fantom-mainnet + _registerDVN("Deutsche Telekom", 30145, 0x93d2d7AADC9F2Cf5EbC88e9703E06dB09b8Fd85B); // gnosis-mainnet + _registerDVN("Deutsche Telekom", 30367, 0x32fFd21260172518A8844feC76A88C8F239C384b); // hyperliquid-mainnet + _registerDVN("Deutsche Telekom", 30375, 0x7cC59B5062A8291804A21a2a793c6Ce9ea2f0Eb9); // katana-mainnet + _registerDVN("Deutsche Telekom", 30150, 0xca29B2be45F1D609189dc467e0f1E48ee202eD0E); // klaytn-mainnet + _registerDVN("Deutsche Telekom", 30181, 0x45f1d581F704B3203d0a4EAb2A572658d7A2E678); // mantle-mainnet + _registerDVN("Deutsche Telekom", 30390, 0x2c7185f5B0976397d9eB5c19d639d4005e6708f0); // monad-mainnet + _registerDVN("Deutsche Telekom", 30388, 0x2EF2097f8C2467A0e274C9022142dc91aaE457A8); // og-mainnet + _registerDVN("Deutsche Telekom", 30111, 0x427bd19a0463fc4eDc2e247d35eB61323d7E5541); // optimism-mainnet + _registerDVN("Deutsche Telekom", 30383, 0xF81da1B0f3ac725503AD0c2c229d1Edc57204787); // plasma-mainnet + _registerDVN("Deutsche Telekom", 30109, 0x5CcCb8DE6Cdba9D2Af9d84465653af7390FDf9Dd); // polygon-mainnet + _registerDVN("Deutsche Telekom", 30332, 0xDe79818C75649773Fc462E9d3134b23B81741481); // sonic-mainnet + _registerDVN("Deutsche Telekom", 30374, 0x58DfF8622759eA75910a08DBA5D060579271dcD7); // subtensorevm-mainnet + _registerDVN("Deutsche Telekom", 30377, 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7); // tac-mainnet + _registerDVN("Deutsche Telekom", 30365, 0xdFDB9b369eF5821e9E6cB9B3329C74C38fe93194); // xdc-mainnet + _registerDVN("Deutsche Telekom", 30183, 0xa2d10677441230C4AeD58030e4EA6Ba7Bfd80393); // zkconsensys-mainnet + + // EigenZero + _registerDVN("EigenZero", 30106, 0xD3333aA4fA669D3eB036676ec01CB0ACaaEc0cc0); // avalanche-mainnet + _registerDVN("EigenZero", 30102, 0x9188B373378D284C9174AE474C2B0A937924B34B); // bsc-mainnet + _registerDVN("EigenZero", 30101, 0x4184Dd22692c8B50D8d7ee0d7B6028e45dbf8108); // ethereum-mainnet + + // FBTC + _registerDVN("FBTC", 30362, 0xE900e073BADaFdC6F72541F34E6b701bde835487); // bera-mainnet + _registerDVN("FBTC", 30101, 0x45C09Dc691B0Ad798e10D38B97e9Dfd917d4B680); // ethereum-mainnet + + // Flowdesk + _registerDVN("Flowdesk", 30110, 0xc07125d75BfA05A0108De0f64c4D6Ebb12B357F6); // arbitrum-mainnet + _registerDVN("Flowdesk", 30106, 0x795c62387ef3022b61F2C705BfBE5d94a78B971d); // avalanche-mainnet + _registerDVN("Flowdesk", 30102, 0x00E91548787Caf130D811EF1872f2Bc2C0583d90); // bsc-mainnet + _registerDVN("Flowdesk", 30101, 0x2fdBb1e2419e13a7e043D07EAf412934B73ad7a8); // ethereum-mainnet + _registerDVN("Flowdesk", 30112, 0x4C4552785d09a422231A1fB3da02b49a3e99426c); // fantom-mainnet + _registerDVN("Flowdesk", 30111, 0x57F61546bd2259Db04EE7132AC385e5447174403); // optimism-mainnet + _registerDVN("Flowdesk", 30109, 0x2cabF8F2c0AAe35A771a1c19487684E94388B03a); // polygon-mainnet + + // Frax + _registerDVN("Frax", 30324, 0xA8c83FEbAb692d6F08cfA303e5D53B3B34F9046d); // abstract-mainnet + _registerDVN("Frax", 30110, 0xB42726e41dBE96fc4ea6d73Cd792167608353698); // arbitrum-mainnet + _registerDVN("Frax", 30211, 0x045d70bf1939aF0489cb44533750A2E15c92D7D4); // aurora-mainnet + _registerDVN("Frax", 30106, 0xfe4c37cd401F58eE0bF4D214447bF306C2BBd41B); // avalanche-mainnet + _registerDVN("Frax", 30184, 0x187cF227F81c287303ee765eE001e151347FAaA2); // base-mainnet + _registerDVN("Frax", 30362, 0x559A194dAe0508342e7CE1aD96e7E90A77F8BC4c); // bera-mainnet + _registerDVN("Frax", 30243, 0xfa06f93ad99825114C8f8738943734b07FdD162F); // blast-mainnet + _registerDVN("Frax", 30376, 0xf835Af1DceA24C255149E0ad7C9FF1a5E8611Fa2); // botanix-mainnet + _registerDVN("Frax", 30102, 0xd4Bf35cE3BfC7F7D7dfC0694a7d4aA8b8c60a38c); // bsc-mainnet + _registerDVN("Frax", 30101, 0x38654142F5E672Ae86a1b21523AAfC765E6A1e08); // ethereum-mainnet + _registerDVN("Frax", 30255, 0x26cD5aBaDf7eC3f0F02b48314bfcA6b2342cddD4); // fraxtal-mainnet + _registerDVN("Frax", 30367, 0x082A08F524C043ec7F6b9a42BAE79A1990D8499a); // hyperliquid-mainnet + _registerDVN("Frax", 30339, 0xF007f1Fef50C0aCAF4418741454BCAEaeCB96B87); // ink-mainnet + _registerDVN("Frax", 30375, 0x5FA12ebC08e183C1F5d44678cF897edEfe68738B); // katana-mainnet + _registerDVN("Frax", 30260, 0x315b0e76A510607bB0F706B17716F426D5b385b8); // mode-mainnet + _registerDVN("Frax", 30111, 0x7240264781Aa2f97Cb994C6231297A8606483242); // optimism-mainnet + _registerDVN("Frax", 30383, 0x0a5a808dc5f9280B26EBE11b356D200e34a48517); // plasma-mainnet + _registerDVN("Frax", 30370, 0x1E4CE74ccf5498B19900649D9196e64BAb592451); // plumephoenix-mainnet + _registerDVN("Frax", 30109, 0xdab6E6ecB3513A8D2614AD75199b4b264A731050); // polygon-mainnet + _registerDVN("Frax", 30214, 0x93bB6f93Fa90a18e88A27bcfBcB048F7e14733c6); // scroll-mainnet + _registerDVN("Frax", 30280, 0xE016F0f39fb7DCf14E9412D92f2049668d4D2612); // sei-mainnet + _registerDVN("Frax", 30332, 0x805ed883FA3453E7Ac588667785a4495C573Cd13); // sonic-mainnet + _registerDVN("Frax", 30396, 0x45A7305c65AAd28384F20a80F87a5183772E4F70); // stable-mainnet + _registerDVN("Frax", 30320, 0x97faa2a9c9bf8B4082B175A5B894Ce6bac6697a8); // unichain-mainnet + _registerDVN("Frax", 30319, 0xE16561B56BDf003B785347d237905BaE24f5F973); // worldchain-mainnet + _registerDVN("Frax", 30274, 0x2Ae36A544b904F2f2960F6Fd1a6084b4b11ba334); // xlayer-mainnet + _registerDVN("Frax", 30183, 0xF4064220871e3B94Ca6aB3b0CEE8e29178bF47dE); // zkconsensys-mainnet + _registerDVN("Frax", 30158, 0x651b1cf59014420112f8B7fCFDA840a16Ad763e0); // zkpolygon-mainnet + _registerDVN("Frax", 30165, 0x2Eb85384CAd49A67eBd8e2AfB0f72B3F586bAF03); // zksync-mainnet + + // Gitcoin + _registerDVN("Gitcoin", 30110, 0x82c1D3209E32BEB7A55069B2C8AF5b6F62e2DBD1); // arbitrum-mainnet + _registerDVN("Gitcoin", 30106, 0xe9d8f20AE42E4634B07b9c994e23CE71c266D205); // avalanche-mainnet + _registerDVN("Gitcoin", 30102, 0xE4b64c3a70cD7F7C38D48F66BA5Db9A41C485f64); // bsc-mainnet + _registerDVN("Gitcoin", 30101, 0x15FaDad87913c3bb95f8f9f2e2b287E71Ba7817D); // ethereum-mainnet + _registerDVN("Gitcoin", 30112, 0xF4213560F316007082731e8574e1A9630F91f1b1); // fantom-mainnet + _registerDVN("Gitcoin", 30111, 0x37a37d958a43810Ec169eeCE501C525664ddF890); // optimism-mainnet + _registerDVN("Gitcoin", 30109, 0xeCB3ac94976F11a53ae74Af1f36FB89E247FAEEF); // polygon-mainnet + + // Google + _registerDVN("Google", 30110, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // arbitrum-mainnet + _registerDVN("Google", 30106, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // avalanche-mainnet + _registerDVN("Google", 30184, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // base-mainnet + _registerDVN("Google", 30102, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // bsc-mainnet + _registerDVN("Google", 30125, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // celo-mainnet + _registerDVN("Google", 30101, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // ethereum-mainnet + _registerDVN("Google", 30112, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // fantom-mainnet + _registerDVN("Google", 30145, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // gnosis-mainnet + _registerDVN("Google", 30116, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // harmony-mainnet + _registerDVN("Google", 30126, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // moonbeam-mainnet + _registerDVN("Google", 30175, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // nova-mainnet + _registerDVN("Google", 30111, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // optimism-mainnet + _registerDVN("Google", 30109, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // polygon-mainnet + _registerDVN("Google", 30183, 0xD56e4eAb23cb81f43168F9F45211Eb027b9aC7cc); // zkconsensys-mainnet + + // Horizen + _registerDVN("Horizen", 30324, 0x264fE346Fcd0A89E3B41A6499BAC80dEa7e908D2); // abstract-mainnet + _registerDVN("Horizen", 30312, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // ape-mainnet + _registerDVN("Horizen", 30110, 0x19670Df5E16bEa2ba9b9e68b48C054C5bAEa06B8); // arbitrum-mainnet + _registerDVN("Horizen", 30210, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // astar-mainnet + _registerDVN("Horizen", 30211, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // aurora-mainnet + _registerDVN("Horizen", 30106, 0x07C05EaB7716AcB6f83ebF6268F8EECDA8892Ba1); // avalanche-mainnet + _registerDVN("Horizen", 30363, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // bahamut-mainnet + _registerDVN("Horizen", 30184, 0xa7b5189bcA84Cd304D8553977c7C614329750d99); // base-mainnet + _registerDVN("Horizen", 30234, 0xC9c1B26505bf3f4D6562159a119f6eDe1e245DeB); // bb1-mainnet + _registerDVN("Horizen", 30362, 0xeCbaA45c33ce6Fa284995e5F8314f5bC7F1C2008); // bera-mainnet + _registerDVN("Horizen", 30317, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // bevm-mainnet + _registerDVN("Horizen", 30314, 0x95729Ea44326f8adD8A9b1d987279DBdC1DD3dFf); // bitlayer-mainnet + _registerDVN("Horizen", 30243, 0x70BF42C69173d6e33b834f59630DAC592C70b369); // blast-mainnet + _registerDVN("Horizen", 30279, 0xf2067660520F79eB7a8326Dc1266DCE0167D64E7); // bob-mainnet + _registerDVN("Horizen", 30376, 0x713d826aaa1f974c1dc0472fC71219e93c3B1614); // botanix-mainnet + _registerDVN("Horizen", 30293, 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd); // bouncebit-mainnet + _registerDVN("Horizen", 30102, 0x247624e2143504730aeC22912ed41F092498bEf2); // bsc-mainnet + _registerDVN("Horizen", 30159, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // canto-mainnet + _registerDVN("Horizen", 30125, 0x31F748a368a893Bdb5aBB67ec95F232507601A73); // celo-mainnet + _registerDVN("Horizen", 30323, 0x5131E3A44C499B11Bd694d1070635cf49EBFeBf3); // codex-mainnet + _registerDVN("Horizen", 30366, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // concrete-mainnet + _registerDVN("Horizen", 30212, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // conflux-mainnet + _registerDVN("Horizen", 30153, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // coredao-mainnet + _registerDVN("Horizen", 30359, 0xE33de1A8cf9bcdC6b509C44EEF66f47c65dA6d47); // cronosevm-mainnet + _registerDVN("Horizen", 30360, 0x1253E268Bc04bB43CB96D2F7Ee858b8A1433Cf6D); // cronoszkevm-mainnet + _registerDVN("Horizen", 30283, 0x9885110b909E88bb94f7f767A68ec2558B2AfA73); // cyber-mainnet + _registerDVN("Horizen", 30267, 0x01a998260Da061EfB9a85b26d42F8f8662bF3d5F); // degen-mainnet + _registerDVN("Horizen", 30118, 0xd42306DF1a805d8053Bc652cE0Cd9F62BDe80146); // dexalot-mainnet + _registerDVN("Horizen", 30115, 0xa9Ff468ad000A4D5729826459197a0dB843F433E); // dfk-mainnet + _registerDVN("Horizen", 30393, 0xf835Af1DceA24C255149E0ad7C9FF1a5E8611Fa2); // doma-mainnet + _registerDVN("Horizen", 30149, 0x33E5fcC13D7439cC62d54c41AA966197145b3Cd7); // dos-mainnet + _registerDVN("Horizen", 30328, 0xf4672690eF45b46EAa3b688fe2f0Fc09e9366b20); // edu-mainnet + _registerDVN("Horizen", 30391, 0x2afa3787cd95fee5D5753cd717EF228eb259f4ea); // ethereal-mainnet + _registerDVN("Horizen", 30101, 0x380275805876Ff19055EA900CDb2B46a94ecF20D); // ethereum-mainnet + _registerDVN("Horizen", 30292, 0xe7411fca6D67De2aA856570dBD59A19FCde81bD8); // etherlink-mainnet + _registerDVN("Horizen", 30112, 0x25e0e650a78e6304A3983Fc4b7Ffc6544b1bEea6); // fantom-mainnet + _registerDVN("Horizen", 30295, 0xeAA5a170d2588F84773f965281F8611D61312832); // flare-mainnet + _registerDVN("Horizen", 30336, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // flow-mainnet + _registerDVN("Horizen", 30255, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // fraxtal-mainnet + _registerDVN("Horizen", 30138, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // fuse-mainnet + _registerDVN("Horizen", 30389, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // gatelayer-mainnet + _registerDVN("Horizen", 30342, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // glue-mainnet + _registerDVN("Horizen", 30145, 0x6ABdb569Dc985504cCcB541ADE8445E5266e7388); // gnosis-mainnet + _registerDVN("Horizen", 30361, 0xDF0771128BD4B9b18eD883d5Af41a6C725C51B38); // goat-mainnet + _registerDVN("Horizen", 30294, 0xe95B63C4dA1D94fa5022e7C23c984F278B416ca7); // gravity-mainnet + _registerDVN("Horizen", 30371, 0xFC977A4e88157B697417aDe965cEF0a2dfA39C70); // gunz-mainnet + _registerDVN("Horizen", 30116, 0x462A63dBE8Ca43a57D379c88a382C02862B9A2cE); // harmony-mainnet + _registerDVN("Horizen", 30316, 0xd0f50363E1aE33feAC8e0E067e42d0070C394525); // hedera-mainnet + _registerDVN("Horizen", 30329, 0x38179D3BFa6Ef1d69A8A7b0b671BA3D8836B2AE8); // hemi-mainnet + _registerDVN("Horizen", 30265, 0x97841D4AB18E9A923322A002d5b8Eb42b31Ccdb5); // homeverse-mainnet + _registerDVN("Horizen", 30367, 0xBB83Ecf372CbB6daa629ea9A9A53BEC6d601F229); // hyperliquid-mainnet + _registerDVN("Horizen", 30339, 0x395B14700812cccC38b8e64F0a06ce2045FE9bA3); // ink-mainnet + _registerDVN("Horizen", 30284, 0xDFC9455F8F86b45Fa3b1116967f740905de6Fe51); // iota-mainnet + _registerDVN("Horizen", 30330, 0xca848BcB059e33Adb260d793EE360924B6Aa8E86); // islander-mainnet + _registerDVN("Horizen", 30285, 0xFb02364E3F5e97d8327dC6e4326E93828a28657d); // joc-mainnet + _registerDVN("Horizen", 30375, 0x84a410A8a912e333B957680998a76e526f98e207); // katana-mainnet + _registerDVN("Horizen", 30177, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // kava-mainnet + _registerDVN("Horizen", 30150, 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7); // klaytn-mainnet + _registerDVN("Horizen", 30373, 0x27bB790440376dB53c840326263801FAFd9F0EE6); // lens-mainnet + _registerDVN("Horizen", 30309, 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7); // lightlink-mainnet + _registerDVN("Horizen", 30321, 0x6c5f923B63Fdd52fb9C45dAeFA8695fA6b55a935); // lisk-mainnet + _registerDVN("Horizen", 30197, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // loot-mainnet + _registerDVN("Horizen", 30311, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // lyra-mainnet + _registerDVN("Horizen", 30217, 0x31F748a368a893Bdb5aBB67ec95F232507601A73); // manta-mainnet + _registerDVN("Horizen", 30181, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // mantle-mainnet + _registerDVN("Horizen", 30198, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // meritcircle-mainnet + _registerDVN("Horizen", 30266, 0x439264FB87581a70Bb6D7bEFd16b636521B0Ad2D); // merlin-mainnet + _registerDVN("Horizen", 30176, 0x3F10b9B75b05f103995eE8B8E2803AA6c7A9dcDf); // meter-mainnet + _registerDVN("Horizen", 30151, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // metis-mainnet + _registerDVN("Horizen", 30260, 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7); // mode-mainnet + _registerDVN("Horizen", 30390, 0xdCdd4628F858b45260C31D6ad076bD2C3D3c2f73); // monad-mainnet + _registerDVN("Horizen", 30126, 0x34730f2570E6cff8B1C91FaaBF37D0DD917c4367); // moonbeam-mainnet + _registerDVN("Horizen", 30167, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // moonriver-mainnet + _registerDVN("Horizen", 30322, 0x6c5f923B63Fdd52fb9C45dAeFA8695fA6b55a935); // morph-mainnet + _registerDVN("Horizen", 30331, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // mp1-mainnet + _registerDVN("Horizen", 30369, 0xf0809F6e760a5452Ee567975EdA7a28dA4a83D38); // nibiru-mainnet + _registerDVN("Horizen", 30175, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // nova-mainnet + _registerDVN("Horizen", 30155, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // okx-mainnet + _registerDVN("Horizen", 30202, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // opbnb-mainnet + _registerDVN("Horizen", 30392, 0xCee801c12814a7C5b8d792098f624fb3D7aD8651); // openledger-mainnet + _registerDVN("Horizen", 30111, 0x9E930731cb4A6bf7eCc11F695A295c60bDd212eB); // optimism-mainnet + _registerDVN("Horizen", 30213, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // orderly-mainnet + _registerDVN("Horizen", 30302, 0x21cAF0BCE846AAA78C9f23C5A4eC5988EcBf9988); // peaq-mainnet + _registerDVN("Horizen", 30383, 0xd4CE45957FBCb88b868ad2c759C7DB9BC2741e56); // plasma-mainnet + _registerDVN("Horizen", 30370, 0x5E0744f8FBF26446c683BcF4cD405ad56bA76F8A); // plumephoenix-mainnet + _registerDVN("Horizen", 30109, 0x25e0e650a78e6304A3983Fc4b7Ffc6544b1bEea6); // polygon-mainnet + _registerDVN("Horizen", 30235, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // rarible-mainnet + _registerDVN("Horizen", 30313, 0x6c5f923B63Fdd52fb9C45dAeFA8695fA6b55a935); // reya-mainnet + _registerDVN("Horizen", 30333, 0x54dD79f5cE72b51FCBbcb170Dd01E32034323565); // rootstock-mainnet + _registerDVN("Horizen", 30278, 0x5fddD320a1e29bB466Fa635661b125D51D976f92); // sanko-mainnet + _registerDVN("Horizen", 30214, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // scroll-mainnet + _registerDVN("Horizen", 30280, 0x87048402c32632B7c4d0A892d82bC1160E8B2393); // sei-mainnet + _registerDVN("Horizen", 30230, 0xa59BA433ac34D2927232918Ef5B2eaAfcF130BA5); // shimmer-mainnet + _registerDVN("Horizen", 30148, 0xabC9b1819cc4D9846550F928B985993cF6240439); // shrapnel-mainnet + _registerDVN("Horizen", 30380, 0x5fddD320a1e29bB466Fa635661b125D51D976f92); // somnia-mainnet + _registerDVN("Horizen", 30340, 0x8Fc629aa400D4D9c0B118F2685a49316552ABf27); // soneium-mainnet + _registerDVN("Horizen", 30332, 0x54dD79f5cE72b51FCBbcb170Dd01E32034323565); // sonic-mainnet + _registerDVN("Horizen", 30334, 0xCec9f0A49073ac4a1C439D06cb9448512389a64E); // sophon-mainnet + _registerDVN("Horizen", 30341, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // space-mainnet + _registerDVN("Horizen", 30396, 0x965A80Dc87cec5848310E612DeAD84B543AeF874); // stable-mainnet + _registerDVN("Horizen", 30364, 0x73DDc92E39aEdA95FEb8D3E0008016d9F1268c76); // story-mainnet + _registerDVN("Horizen", 30374, 0xb3d5Fd1f98510e90bd59BD702eD362622672b97f); // subtensorevm-mainnet + _registerDVN("Horizen", 30327, 0x38179D3BFa6Ef1d69A8A7b0b671BA3D8836B2AE8); // superposition-mainnet + _registerDVN("Horizen", 30335, 0xf4672690eF45b46EAa3b688fe2f0Fc09e9366b20); // swell-mainnet + _registerDVN("Horizen", 30377, 0xB19A9370D404308040A9760678c8Ca28aFfbbb76); // tac-mainnet + _registerDVN("Horizen", 30290, 0xBD237eF21319E2200487BDF30c188C6c34b16D3B); // taiko-mainnet + _registerDVN("Horizen", 30199, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // telos-mainnet + _registerDVN("Horizen", 30173, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // tenet-mainnet + _registerDVN("Horizen", 30238, 0x0165C910Ea47964a23DC4FB7c7483F6f3ad462aE); // tiltyard-mainnet + _registerDVN("Horizen", 30196, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // tomo-mainnet + _registerDVN("Horizen", 30320, 0xC6a6324932B399D6A673B7Ed0af671F28033E046); // unichain-mainnet + _registerDVN("Horizen", 30319, 0x95729Ea44326f8adD8A9b1d987279DBdC1DD3dFf); // worldchain-mainnet + _registerDVN("Horizen", 30236, 0xE94aE34DfCC87A61836938641444080B98402c75); // xai-mainnet + _registerDVN("Horizen", 30291, 0x0E5c792Ec122cBE89cE0085D7EFcdB151eae3376); // xchain-mainnet + _registerDVN("Horizen", 30365, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // xdc-mainnet + _registerDVN("Horizen", 30274, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // xlayer-mainnet + _registerDVN("Horizen", 30216, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // xpla-mainnet + _registerDVN("Horizen", 30303, 0xdCdd4628F858b45260C31D6ad076bD2C3D3c2f73); // zircuit-mainnet + _registerDVN("Horizen", 30183, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // zkconsensys-mainnet + _registerDVN("Horizen", 30301, 0x27bB790440376dB53c840326263801FAFd9F0EE6); // zklink-mainnet + _registerDVN("Horizen", 30158, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // zkpolygon-mainnet + _registerDVN("Horizen", 30165, 0x1253E268Bc04bB43CB96D2F7Ee858b8A1433Cf6D); // zksync-mainnet + _registerDVN("Horizen", 30386, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // zkverify-mainnet + _registerDVN("Horizen", 30195, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // zora-mainnet + + // Lagrange + _registerDVN("Lagrange", 30110, 0x021e401C2a1A60618c5E6353A40524971Eba1E8D); // arbitrum-mainnet + _registerDVN("Lagrange", 30184, 0xC50a49186aA80427aA3b0d3C2Cec19BA64222A29); // base-mainnet + _registerDVN("Lagrange", 30101, 0x95729Ea44326f8adD8A9b1d987279DBdC1DD3dFf); // ethereum-mainnet + _registerDVN("Lagrange", 30111, 0xA4281c1c88F0278FF696eDeb517052153190FC9E); // optimism-mainnet + + // LayerZero Labs + _registerDVN("LayerZero Labs", 30324, 0xF4DA94b4EE9D8e209e3bf9f469221CE2731A7112); // abstract-mainnet + _registerDVN("LayerZero Labs", 30372, 0x282b3386571f7f794450d5789911a9804FA346b4); // animechain-mainnet + _registerDVN("LayerZero Labs", 30312, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // ape-mainnet + _registerDVN("LayerZero Labs", 30384, 0x282b3386571f7f794450d5789911a9804FA346b4); // apexfusionnexus-mainnet + _registerDVN("LayerZero Labs", 30110, 0x2f55C492897526677C5B68fb199ea31E2c126416); // arbitrum-mainnet + _registerDVN("LayerZero Labs", 30210, 0xE1975c47779EdAaABa31F64934A33Affd3CE15c2); // astar-mainnet + _registerDVN("LayerZero Labs", 30211, 0xD4a903930f2c9085586cda0b11D9681EECb20D2f); // aurora-mainnet + _registerDVN("LayerZero Labs", 30106, 0x962F502A63F5FBeB44DC9ab932122648E8352959); // avalanche-mainnet + _registerDVN("LayerZero Labs", 30363, 0x282b3386571f7f794450d5789911a9804FA346b4); // bahamut-mainnet + _registerDVN("LayerZero Labs", 30184, 0x9e059a54699a285714207b43B055483E78FAac25); // base-mainnet + _registerDVN("LayerZero Labs", 30234, 0xb21f945e8917c6Cd69FcFE66ac6703B90f7fe004); // bb1-mainnet + _registerDVN("LayerZero Labs", 30362, 0x282b3386571f7f794450d5789911a9804FA346b4); // bera-mainnet + _registerDVN("LayerZero Labs", 30317, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // bevm-mainnet + _registerDVN("LayerZero Labs", 30314, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // bitlayer-mainnet + _registerDVN("LayerZero Labs", 30243, 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f); // blast-mainnet + _registerDVN("LayerZero Labs", 30279, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // bob-mainnet + _registerDVN("LayerZero Labs", 30376, 0x282b3386571f7f794450d5789911a9804FA346b4); // botanix-mainnet + _registerDVN("LayerZero Labs", 30293, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // bouncebit-mainnet + _registerDVN("LayerZero Labs", 30102, 0xfD6865c841c2d64565562fCc7e05e619A30615f0); // bsc-mainnet + _registerDVN("LayerZero Labs", 30381, 0x15e51701F245F6D5bd0FEE87bCAf55B0841451B3); // camp-mainnet + _registerDVN("LayerZero Labs", 30159, 0x1BAcC2205312534375c8d1801C27D28370656cFf); // canto-mainnet + _registerDVN("LayerZero Labs", 30125, 0x75b073994560A5c03Cd970414d9170be0C6e5c36); // celo-mainnet + _registerDVN("LayerZero Labs", 30323, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // codex-mainnet + _registerDVN("LayerZero Labs", 30366, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // concrete-mainnet + _registerDVN("LayerZero Labs", 30212, 0x8D183A062e99cad6f3723E6d836F9EA13886B173); // conflux-mainnet + _registerDVN("LayerZero Labs", 30400, 0x282b3386571f7f794450d5789911a9804FA346b4); // converge-mainnet + _registerDVN("LayerZero Labs", 30153, 0x3C5575898f59c097681d1Fc239c2c6Ad36B7b41c); // coredao-mainnet + _registerDVN("LayerZero Labs", 30359, 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887); // cronosevm-mainnet + _registerDVN("LayerZero Labs", 30360, 0x07fD0e370B49919cA8dA0CE842B8177263c0E12c); // cronoszkevm-mainnet + _registerDVN("LayerZero Labs", 30283, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // cyber-mainnet + _registerDVN("LayerZero Labs", 30267, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // degen-mainnet + _registerDVN("LayerZero Labs", 30118, 0xB98D764D25d53F803f05d451225612e4A9A3b712); // dexalot-mainnet + _registerDVN("LayerZero Labs", 30115, 0x1F7E674143031e74bc48a0c570c174A07aA9C5d0); // dfk-mainnet + _registerDVN("LayerZero Labs", 30385, 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887); // dinari-mainnet + _registerDVN("LayerZero Labs", 30393, 0x282b3386571f7f794450d5789911a9804FA346b4); // doma-mainnet + _registerDVN("LayerZero Labs", 30149, 0x203DFa8CBcbe234821DA01a6e95Fcbf92dA065EA); // dos-mainnet + _registerDVN("LayerZero Labs", 30328, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // edu-mainnet + _registerDVN("LayerZero Labs", 30391, 0x282b3386571f7f794450d5789911a9804FA346b4); // ethereal-mainnet + _registerDVN("LayerZero Labs", 30101, 0x589dEDbD617e0CBcB916A9223F4d1300c294236b); // ethereum-mainnet + _registerDVN("LayerZero Labs", 30292, 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f); // etherlink-mainnet + _registerDVN("LayerZero Labs", 30112, 0xE60A3959Ca23a92BF5aAf992EF837cA7F828628a); // fantom-mainnet + _registerDVN("LayerZero Labs", 30295, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // flare-mainnet + _registerDVN("LayerZero Labs", 30336, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // flow-mainnet + _registerDVN("LayerZero Labs", 30255, 0xcCE466a522984415bC91338c232d98869193D46e); // fraxtal-mainnet + _registerDVN("LayerZero Labs", 30138, 0x795F8325aF292Ff6E58249361d1954893BE15Aff); // fuse-mainnet + _registerDVN("LayerZero Labs", 30389, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // gatelayer-mainnet + _registerDVN("LayerZero Labs", 30342, 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887); // glue-mainnet + _registerDVN("LayerZero Labs", 30145, 0x11bb2991882a86Dc3E38858d922559A385d506bA); // gnosis-mainnet + _registerDVN("LayerZero Labs", 30361, 0x282b3386571f7f794450d5789911a9804FA346b4); // goat-mainnet + _registerDVN("LayerZero Labs", 30294, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // gravity-mainnet + _registerDVN("LayerZero Labs", 30371, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // gunz-mainnet + _registerDVN("LayerZero Labs", 30116, 0x8363302080e711E0CAb978C081b9e69308d49808); // harmony-mainnet + _registerDVN("LayerZero Labs", 30316, 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887); // hedera-mainnet + _registerDVN("LayerZero Labs", 30329, 0x282b3386571f7f794450d5789911a9804FA346b4); // hemi-mainnet + _registerDVN("LayerZero Labs", 30265, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // homeverse-mainnet + _registerDVN("LayerZero Labs", 30382, 0x7cacBe439EaD55fa1c22790330b12835c6884a91); // humanity-mainnet + _registerDVN("LayerZero Labs", 30367, 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f); // hyperliquid-mainnet + _registerDVN("LayerZero Labs", 30394, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // injectiveevm-mainnet + _registerDVN("LayerZero Labs", 30339, 0x174F2bA26f8ADeAfA82663bcf908288d5DbCa649); // ink-mainnet + _registerDVN("LayerZero Labs", 30284, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // iota-mainnet + _registerDVN("LayerZero Labs", 30330, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // islander-mainnet + _registerDVN("LayerZero Labs", 30285, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // joc-mainnet + _registerDVN("LayerZero Labs", 30375, 0x282b3386571f7f794450d5789911a9804FA346b4); // katana-mainnet + _registerDVN("LayerZero Labs", 30177, 0x2D40A7B66F776345Cf763c8EBB83199Cd285e7a3); // kava-mainnet + _registerDVN("LayerZero Labs", 30150, 0xc80233AD8251E668BecbC3B0415707fC7075501e); // klaytn-mainnet + _registerDVN("LayerZero Labs", 30373, 0x07fD0e370B49919cA8dA0CE842B8177263c0E12c); // lens-mainnet + _registerDVN("LayerZero Labs", 30309, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // lightlink-mainnet + _registerDVN("LayerZero Labs", 30321, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // lisk-mainnet + _registerDVN("LayerZero Labs", 30197, 0x4f8B7a7a346Da5c467085377796e91220d904c15); // loot-mainnet + _registerDVN("LayerZero Labs", 30311, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // lyra-mainnet + _registerDVN("LayerZero Labs", 30217, 0xA09dB5142654e3eB5Cf547D66833FAe7097B21C3); // manta-mainnet + _registerDVN("LayerZero Labs", 30181, 0x28B6140ead70cb2Fb669705b3598ffB4BEaA060b); // mantle-mainnet + _registerDVN("LayerZero Labs", 30198, 0x5E38c31C28d0F485d6dc3fFAbF8980bBCD882294); // meritcircle-mainnet + _registerDVN("LayerZero Labs", 30266, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // merlin-mainnet + _registerDVN("LayerZero Labs", 30176, 0xB792aFc44214B5f910216Bc904633dbD15b31680); // meter-mainnet + _registerDVN("LayerZero Labs", 30151, 0x32d4F92437454829b3Fe7BEBfeCE5D0523DEb475); // metis-mainnet + _registerDVN("LayerZero Labs", 30260, 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887); // mode-mainnet + _registerDVN("LayerZero Labs", 30390, 0x282b3386571f7f794450d5789911a9804FA346b4); // monad-mainnet + _registerDVN("LayerZero Labs", 30126, 0x8B9b67b22ab2ed6Ee324C2fd43734dBd2dDDD045); // moonbeam-mainnet + _registerDVN("LayerZero Labs", 30167, 0x2b3eBE6662Ad402317EE7Ef4e6B25c79a0f91015); // moonriver-mainnet + _registerDVN("LayerZero Labs", 30322, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // morph-mainnet + _registerDVN("LayerZero Labs", 30331, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // mp1-mainnet + _registerDVN("LayerZero Labs", 30395, 0x282b3386571f7f794450d5789911a9804FA346b4); // nexera-mainnet + _registerDVN("LayerZero Labs", 30369, 0x5727E81A40015961145330D91cC27b5E189fF3e1); // nibiru-mainnet + _registerDVN("LayerZero Labs", 30175, 0xb7e97ad5661134185Fe608b2A31fe8cEf2147Ba9); // nova-mainnet + _registerDVN("LayerZero Labs", 30388, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // og-mainnet + _registerDVN("LayerZero Labs", 30155, 0x52EEA5c490fB89c7A0084B32FEAB854eefF07c82); // okx-mainnet + _registerDVN("LayerZero Labs", 30202, 0x3eBb618B5c9d09DE770979D552b27D6357Aff73B); // opbnb-mainnet + _registerDVN("LayerZero Labs", 30392, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // openledger-mainnet + _registerDVN("LayerZero Labs", 30111, 0x6A02D83e8d433304bba74EF1c427913958187142); // optimism-mainnet + _registerDVN("LayerZero Labs", 30213, 0xF53857dbc0D2c59D5666006EC200cbA2936B8c35); // orderly-mainnet + _registerDVN("LayerZero Labs", 30302, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // peaq-mainnet + _registerDVN("LayerZero Labs", 30383, 0x282b3386571f7f794450d5789911a9804FA346b4); // plasma-mainnet + _registerDVN("LayerZero Labs", 30370, 0x4208D6E27538189bB48E603D6123A94b8Abe0A0b); // plumephoenix-mainnet + _registerDVN("LayerZero Labs", 30109, 0x23DE2FE932d9043291f870324B74F820e11dc81A); // polygon-mainnet + _registerDVN("LayerZero Labs", 30235, 0x0b5E5452d0c9DA1Bb5fB0664F48313e9667d7820); // rarible-mainnet + _registerDVN("LayerZero Labs", 30313, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // reya-mainnet + _registerDVN("LayerZero Labs", 30333, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // rootstock-mainnet + _registerDVN("LayerZero Labs", 30278, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // sanko-mainnet + _registerDVN("LayerZero Labs", 30214, 0xbe0d08a85EeBFCC6eDA0A843521f7CBB1180D2e2); // scroll-mainnet + _registerDVN("LayerZero Labs", 30280, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // sei-mainnet + _registerDVN("LayerZero Labs", 30230, 0x9Bdf3aE7E2e3D211811E5e782a808Ca0a75BF1Fc); // shimmer-mainnet + _registerDVN("LayerZero Labs", 30379, 0x282b3386571f7f794450d5789911a9804FA346b4); // silicon-mainnet + _registerDVN("LayerZero Labs", 30273, 0xce8358bc28dd8296Ce8cAF1CD2b44787abd65887); // skale-mainnet + _registerDVN("LayerZero Labs", 30380, 0x282b3386571f7f794450d5789911a9804FA346b4); // somnia-mainnet + _registerDVN("LayerZero Labs", 30340, 0xfDfA2330713A8e2EaC6e4f15918F11937fFA4dBE); // soneium-mainnet + _registerDVN("LayerZero Labs", 30332, 0x282b3386571f7f794450d5789911a9804FA346b4); // sonic-mainnet + _registerDVN("LayerZero Labs", 30334, 0x07fD0e370B49919cA8dA0CE842B8177263c0E12c); // sophon-mainnet + _registerDVN("LayerZero Labs", 30341, 0x7cacBe439EaD55fa1c22790330b12835c6884a91); // space-mainnet + _registerDVN("LayerZero Labs", 30396, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // stable-mainnet + _registerDVN("LayerZero Labs", 30364, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // story-mainnet + _registerDVN("LayerZero Labs", 30374, 0x282b3386571f7f794450d5789911a9804FA346b4); // subtensorevm-mainnet + _registerDVN("LayerZero Labs", 30327, 0x282b3386571f7f794450d5789911a9804FA346b4); // superposition-mainnet + _registerDVN("LayerZero Labs", 30335, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // swell-mainnet + _registerDVN("LayerZero Labs", 30377, 0x282b3386571f7f794450d5789911a9804FA346b4); // tac-mainnet + _registerDVN("LayerZero Labs", 30290, 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f); // taiko-mainnet + _registerDVN("LayerZero Labs", 30199, 0x3C5575898f59c097681d1Fc239c2c6Ad36B7b41c); // telos-mainnet + _registerDVN("LayerZero Labs", 30173, 0x28A5536cA9F36c45A9d2AC8d2B62Fc46Fde024B6); // tenet-mainnet + _registerDVN("LayerZero Labs", 30238, 0xCFc3f9dD0205b76FF04e20243f106465Dd829656); // tiltyard-mainnet + _registerDVN("LayerZero Labs", 30196, 0x1aCe9DD1BC743aD036eF2D92Af42Ca70A1159df5); // tomo-mainnet + _registerDVN("LayerZero Labs", 30320, 0x282b3386571f7f794450d5789911a9804FA346b4); // unichain-mainnet + _registerDVN("LayerZero Labs", 30319, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // worldchain-mainnet + _registerDVN("LayerZero Labs", 30236, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // xai-mainnet + _registerDVN("LayerZero Labs", 30291, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // xchain-mainnet + _registerDVN("LayerZero Labs", 30365, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // xdc-mainnet + _registerDVN("LayerZero Labs", 30274, 0x9C061c9A4782294eeF65ef28Cb88233A987F4bdD); // xlayer-mainnet + _registerDVN("LayerZero Labs", 30216, 0x2d24207F9C1F77B2E08F2C3aD430da18e355CF66); // xpla-mainnet + _registerDVN("LayerZero Labs", 30303, 0x6788f52439ACA6BFF597d3eeC2DC9a44B8FEE842); // zircuit-mainnet + _registerDVN("LayerZero Labs", 30183, 0x129Ee430Cb2Ff2708CCADDBDb408a88Fe4FFd480); // zkconsensys-mainnet + _registerDVN("LayerZero Labs", 30301, 0x04830f6deCF08Dec9eD6C3fCAD215245B78A59e1); // zklink-mainnet + _registerDVN("LayerZero Labs", 30158, 0x488863D609F3A673875a914fBeE7508a1DE45eC6); // zkpolygon-mainnet + _registerDVN("LayerZero Labs", 30165, 0x620A9DF73D2F1015eA75aea1067227F9013f5C51); // zksync-mainnet + _registerDVN("LayerZero Labs", 30386, 0x282b3386571f7f794450d5789911a9804FA346b4); // zkverify-mainnet + _registerDVN("LayerZero Labs", 30195, 0xC1EC25A9e8a8DE5Aa346f635B33e5B74c4c081aF); // zora-mainnet + + // Luganodes + _registerDVN("Luganodes", 30324, 0x022dA66B230da7EFdEEd802DFC77EE8dD258E2C8); // abstract-mainnet + _registerDVN("Luganodes", 30110, 0x54dD79f5cE72b51FCBbcb170Dd01E32034323565); // arbitrum-mainnet + _registerDVN("Luganodes", 30106, 0xE4193136B92bA91402313e95347c8e9FAD8d27d0); // avalanche-mainnet + _registerDVN("Luganodes", 30184, 0xa0AF56164F02bDf9d75287ee77c568889F11d5f2); // base-mainnet + _registerDVN("Luganodes", 30362, 0xFd4d23EB5CeA65f6CC7eEC8f3b394e55AED68299); // bera-mainnet + _registerDVN("Luganodes", 30102, 0x2c7185f5B0976397d9eB5c19d639d4005e6708f0); // bsc-mainnet + _registerDVN("Luganodes", 30125, 0x82F6Ad698f3116Ca1B71836A7f1303628FA855DB); // celo-mainnet + _registerDVN("Luganodes", 30101, 0x58249a2Ec05c1978bF21DF1f5eC1847e42455CF4); // ethereum-mainnet + _registerDVN("Luganodes", 30112, 0xa6F5DDBF0Bd4D03334523465439D301080574742); // fantom-mainnet + _registerDVN("Luganodes", 30145, 0x7cC59B5062A8291804A21a2a793c6Ce9ea2f0Eb9); // gnosis-mainnet + _registerDVN("Luganodes", 30367, 0x9e451905f65eF78D62b93DAc3513486da8429d0a); // hyperliquid-mainnet + _registerDVN("Luganodes", 30339, 0x0ad6c9Eb13e373154bFB303561b979BAc5FA2302); // ink-mainnet + _registerDVN("Luganodes", 30181, 0x315b0e76A510607bB0F706B17716F426D5b385b8); // mantle-mainnet + _registerDVN("Luganodes", 30388, 0xE6655528dbB0f7d1407264aA878A5B5363B8752c); // og-mainnet + _registerDVN("Luganodes", 30111, 0xd841A741Addcb6Dea735D3B8C9Faf96BA3f3d30D); // optimism-mainnet + _registerDVN("Luganodes", 30109, 0xD1b5493e712081A6FBAb73116405590046668F6b); // polygon-mainnet + _registerDVN("Luganodes", 30214, 0xf60C89799C85D8FaB79519f7666dcDe2A7C97CCA); // scroll-mainnet + _registerDVN("Luganodes", 30280, 0x6E01Aa282f058873d28055e07d85f4197E8Db261); // sei-mainnet + _registerDVN("Luganodes", 30380, 0x5488a4ca201421cF100dC1B90D1dE5B26b421f64); // somnia-mainnet + _registerDVN("Luganodes", 30332, 0xC8B7744AFd77C3EEcf310383837A07584766A51a); // sonic-mainnet + _registerDVN("Luganodes", 30377, 0x58249a2Ec05c1978bF21DF1f5eC1847e42455CF4); // tac-mainnet + _registerDVN("Luganodes", 30320, 0xF02D0F9ACc2870e12C34aa3816dd86FaC1339f38); // unichain-mainnet + _registerDVN("Luganodes", 30183, 0x08670E326968d18D4fe359080b8E3eeeA552E867); // zkconsensys-mainnet + _registerDVN("Luganodes", 30195, 0x9FE36b305120556dbeefab58d58877D87b553DF5); // zora-mainnet + + // MIM + _registerDVN("MIM", 30110, 0x9E930731cb4A6bf7eCc11F695A295c60bDd212eB); // arbitrum-mainnet + _registerDVN("MIM", 30106, 0xF45742BbfaBCEe739eA2a2d0BA2dd140F1f2C6A3); // avalanche-mainnet + _registerDVN("MIM", 30362, 0x73DDc92E39aEdA95FEb8D3E0008016d9F1268c76); // bera-mainnet + _registerDVN("MIM", 30102, 0x25e0e650a78e6304A3983Fc4b7Ffc6544b1bEea6); // bsc-mainnet + _registerDVN("MIM", 30101, 0x0Ae4e6a9a8B01EE22c6A49aF22B674A4E033A23D); // ethereum-mainnet + _registerDVN("MIM", 30112, 0x1bab20E7FDc79257729CB596BEF85db76C44915E); // fantom-mainnet + _registerDVN("MIM", 30367, 0x32B29d6B6cd4A851548A6E888Cc25E39E8a16d86); // hyperliquid-mainnet + _registerDVN("MIM", 30369, 0x53Fa9f0bd34F3f0e80580d1c93168F56c9555cA4); // nibiru-mainnet + _registerDVN("MIM", 30111, 0xD954bF7968eF68875c9100c9ec890f969504d120); // optimism-mainnet + _registerDVN("MIM", 30109, 0x1bab20E7FDc79257729CB596BEF85db76C44915E); // polygon-mainnet + + // Mantle Bank + _registerDVN("Mantle Bank", 30110, 0x50fF206140CadADA2d9d510F1A184Be9221d86cF); // arbitrum-mainnet + _registerDVN("Mantle Bank", 30184, 0x761bC869351293c5572Ed5581E23e7D5D9C6D3d1); // base-mainnet + _registerDVN("Mantle Bank", 30362, 0x88a8b858c7fCB3Fe0052c9b7bcC69183a9cebD76); // bera-mainnet + _registerDVN("Mantle Bank", 30101, 0x868e6393AEa25E8c7e58BC5d4c90a5237C573ff6); // ethereum-mainnet + _registerDVN("Mantle Bank", 30181, 0xB797053fBA3D41f5067C4BD74dc334328395C4d2); // mantle-mainnet + + // Mantle01 + _registerDVN("Mantle01", 30101, 0x7cC59B5062A8291804A21a2a793c6Ce9ea2f0Eb9); // ethereum-mainnet + _registerDVN("Mantle01", 30181, 0x0D7cb4033e0C193F65B3639E61b6986A29Bf1DD4); // mantle-mainnet + + // Mantle02 + _registerDVN("Mantle02", 30101, 0xdd907f5aF01A829Cd65C99A132E8720d3e990D02); // ethereum-mainnet + _registerDVN("Mantle02", 30181, 0x5a4c666E9C7aA86FD4fBFDFbfd04646DcC45C6c5); // mantle-mainnet + + // Mantle03 + _registerDVN("Mantle03", 30102, 0xEc65a0245c19A084650cB5B85FD1a2Bc7B0FD452); // bsc-mainnet + _registerDVN("Mantle03", 30101, 0x554833698Ae0FB22ECC90B01222903fD62CA4B47); // ethereum-mainnet + _registerDVN("Mantle03", 30367, 0xbBD228Fa47A8E80FbBfB778Abc56031Fa2C038ce); // hyperliquid-mainnet + _registerDVN("Mantle03", 30181, 0x78203678D264063815Dac114eA810E9837Cd80f7); // mantle-mainnet + + // Muon + _registerDVN("Muon", 30110, 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8); // arbitrum-mainnet + _registerDVN("Muon", 30106, 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8); // avalanche-mainnet + _registerDVN("Muon", 30184, 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8); // base-mainnet + _registerDVN("Muon", 30102, 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8); // bsc-mainnet + _registerDVN("Muon", 30101, 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8); // ethereum-mainnet + _registerDVN("Muon", 30112, 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8); // fantom-mainnet + _registerDVN("Muon", 30111, 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8); // optimism-mainnet + _registerDVN("Muon", 30109, 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8); // polygon-mainnet + _registerDVN("Muon", 30332, 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8); // sonic-mainnet + _registerDVN("Muon", 30183, 0xA3858e2A9860C935Fc9586a617e9b2A674C3e4c8); // zkconsensys-mainnet + + // Mysten Labs + _registerDVN("Mysten Labs", 30101, 0x3D68029E411B181FEfA1a8BA60aaf27dbe68636C); // ethereum-mainnet + + // Nansen + _registerDVN("Nansen", 30110, 0x01F9aAD7c53626bF8807d640D9Ddf852254D6f63); // arbitrum-mainnet + _registerDVN("Nansen", 30106, 0xc816Afa2f1C4Ab615fE735270D1831fa7D067D15); // avalanche-mainnet + _registerDVN("Nansen", 30184, 0x93aC538152E1BC4F093aE5666Ee9FD1d84f4f4bF); // base-mainnet + _registerDVN("Nansen", 30362, 0x00A979a5D306E9c5F8Cf473659e75f8002E06fc8); // bera-mainnet + _registerDVN("Nansen", 30102, 0x534C6b3e6805E9287ff1D49C349d5f7a01B9b7F5); // bsc-mainnet + _registerDVN("Nansen", 30101, 0x3a4636E9AB975d28d3Af808b4e1c9fd936374E30); // ethereum-mainnet + _registerDVN("Nansen", 30112, 0x57555Da46d20F39bC6795BCD6fF50cE425A0E5aF); // fantom-mainnet + _registerDVN("Nansen", 30145, 0x13feb7234Ff60A97af04477d6421415766753Ba3); // gnosis-mainnet + _registerDVN("Nansen", 30367, 0xcFe987eBFf7612B53D145DD70EE24D00E12d6A1F); // hyperliquid-mainnet + _registerDVN("Nansen", 30339, 0x3a4636E9AB975d28d3Af808b4e1c9fd936374E30); // ink-mainnet + _registerDVN("Nansen", 30181, 0x58620C352dd33EaaA2f6513877515453e20e8656); // mantle-mainnet + _registerDVN("Nansen", 30111, 0x3b0531eB02Ab4aD72e7a531180beeF9493a00dD2); // optimism-mainnet + _registerDVN("Nansen", 30302, 0xc2A0C36f5939A14966705c7Cec813163FaEEa1F0); // peaq-mainnet + _registerDVN("Nansen", 30109, 0x0a8618F71dB88AB5D0CAF0610Ede19F0AB8817c5); // polygon-mainnet + _registerDVN("Nansen", 30280, 0xf85F51c1d5b4de2446d99b104acFca7Ff63Bd3AD); // sei-mainnet + _registerDVN("Nansen", 30332, 0x64D684840881b45869B0C72B17aa911A3FC4305e); // sonic-mainnet + _registerDVN("Nansen", 30320, 0x144c6a7A17781e165f430b18f0680c5b3e3713E2); // unichain-mainnet + + // Nethermind + _registerDVN("Nethermind", 30324, 0xc4A1F52fDA034A9A5E1B3b27D14451d15776Fef6); // abstract-mainnet + _registerDVN("Nethermind", 30372, 0x9E0E95Ede70F680f74480b510FF9f45C70e3da80); // animechain-mainnet + _registerDVN("Nethermind", 30312, 0x07653d28b0f53D4c54b70eb1f9025795B23a9D6e); // ape-mainnet + _registerDVN("Nethermind", 30384, 0x70BF42C69173d6e33b834f59630DAC592C70b369); // apexfusionnexus-mainnet + _registerDVN("Nethermind", 30110, 0xa7b5189bcA84Cd304D8553977c7C614329750d99); // arbitrum-mainnet + _registerDVN("Nethermind", 30210, 0xB19A9370D404308040A9760678c8Ca28aFfbbb76); // astar-mainnet + _registerDVN("Nethermind", 30211, 0x34730f2570E6cff8B1C91FaaBF37D0DD917c4367); // aurora-mainnet + _registerDVN("Nethermind", 30106, 0xa59BA433ac34D2927232918Ef5B2eaAfcF130BA5); // avalanche-mainnet + _registerDVN("Nethermind", 30184, 0xcd37CA043f8479064e10635020c65FfC005d36f6); // base-mainnet + _registerDVN("Nethermind", 30234, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // bb1-mainnet + _registerDVN("Nethermind", 30362, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // bera-mainnet + _registerDVN("Nethermind", 30314, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // bitlayer-mainnet + _registerDVN("Nethermind", 30243, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // blast-mainnet + _registerDVN("Nethermind", 30279, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // bob-mainnet + _registerDVN("Nethermind", 30376, 0xA4281c1c88F0278FF696eDeb517052153190FC9E); // botanix-mainnet + _registerDVN("Nethermind", 30102, 0x31F748a368a893Bdb5aBB67ec95F232507601A73); // bsc-mainnet + _registerDVN("Nethermind", 30381, 0x2F29D3d12fc2d1961Ad8B5397c0f878003c35e20); // camp-mainnet + _registerDVN("Nethermind", 30159, 0x809CDE2AfcF8627312E87a6a7bbFFaB3F8F347c7); // canto-mainnet + _registerDVN("Nethermind", 30125, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // celo-mainnet + _registerDVN("Nethermind", 30323, 0xabC9b1819cc4D9846550F928B985993cF6240439); // codex-mainnet + _registerDVN("Nethermind", 30366, 0x047d9DBe4fC6B5c916F37237F547f9F42809935a); // concrete-mainnet + _registerDVN("Nethermind", 30212, 0x809CDE2AfcF8627312E87a6a7bbFFaB3F8F347c7); // conflux-mainnet + _registerDVN("Nethermind", 30153, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // coredao-mainnet + _registerDVN("Nethermind", 30359, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // cronosevm-mainnet + _registerDVN("Nethermind", 30360, 0x3A5a74f863ec48c1769C4Ee85f6C3d70f5655E2A); // cronoszkevm-mainnet + _registerDVN("Nethermind", 30283, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // cyber-mainnet + _registerDVN("Nethermind", 30267, 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd); // degen-mainnet + _registerDVN("Nethermind", 30118, 0x70BF42C69173d6e33b834f59630DAC592C70b369); // dexalot-mainnet + _registerDVN("Nethermind", 30115, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // dfk-mainnet + _registerDVN("Nethermind", 30393, 0xabC9b1819cc4D9846550F928B985993cF6240439); // doma-mainnet + _registerDVN("Nethermind", 30149, 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7); // dos-mainnet + _registerDVN("Nethermind", 30328, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // edu-mainnet + _registerDVN("Nethermind", 30391, 0x6D4fc4bD9f9C29086e2Aa67d4C81F32D2E0F285c); // ethereal-mainnet + _registerDVN("Nethermind", 30101, 0xa59BA433ac34D2927232918Ef5B2eaAfcF130BA5); // ethereum-mainnet + _registerDVN("Nethermind", 30292, 0x7a23612F07d81F16B26cF0b5a4C3eca0E8668df2); // etherlink-mainnet + _registerDVN("Nethermind", 30112, 0x31F748a368a893Bdb5aBB67ec95F232507601A73); // fantom-mainnet + _registerDVN("Nethermind", 30295, 0x9bCd17A654bffAa6f8fEa38D19661a7210e22196); // flare-mainnet + _registerDVN("Nethermind", 30336, 0x3C61aAd6D402D867c653F603558F4b8f91AbE952); // flow-mainnet + _registerDVN("Nethermind", 30255, 0xa7b5189bcA84Cd304D8553977c7C614329750d99); // fraxtal-mainnet + _registerDVN("Nethermind", 30138, 0x809CDE2AfcF8627312E87a6a7bbFFaB3F8F347c7); // fuse-mainnet + _registerDVN("Nethermind", 30342, 0xaA3099F91912E07976c2DD1598DC740d81BD3FeA); // glue-mainnet + _registerDVN("Nethermind", 30145, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // gnosis-mainnet + _registerDVN("Nethermind", 30361, 0xe6CD8c2E46Ef396DF88048449e5B1C75172b40C3); // goat-mainnet + _registerDVN("Nethermind", 30294, 0x4b92BC2A7d681bf5230472C80d92aCFE9A6b9435); // gravity-mainnet + _registerDVN("Nethermind", 30371, 0x70BF42C69173d6e33b834f59630DAC592C70b369); // gunz-mainnet + _registerDVN("Nethermind", 30116, 0xD24972c11F91c1bB9eaEe97ec96bB9c33cF7af24); // harmony-mainnet + _registerDVN("Nethermind", 30316, 0xeCc3Dc1Cc45B1934CE713F8fb0d3D3852C01a5c1); // hedera-mainnet + _registerDVN("Nethermind", 30329, 0x07C05EaB7716AcB6f83ebF6268F8EECDA8892Ba1); // hemi-mainnet + _registerDVN("Nethermind", 30367, 0x8E49eF1DfAe17e547CA0E7526FfDA81FbaCA810A); // hyperliquid-mainnet + _registerDVN("Nethermind", 30394, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // injectiveevm-mainnet + _registerDVN("Nethermind", 30339, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // ink-mainnet + _registerDVN("Nethermind", 30284, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // iota-mainnet + _registerDVN("Nethermind", 30330, 0x70BF42C69173d6e33b834f59630DAC592C70b369); // islander-mainnet + _registerDVN("Nethermind", 30285, 0x57eB450b257E6A5d65CDc9A7B95245139975eaCf); // joc-mainnet + _registerDVN("Nethermind", 30375, 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7); // katana-mainnet + _registerDVN("Nethermind", 30177, 0x6a4C9096F162f0ab3C0517B0a40dc1CE44785e16); // kava-mainnet + _registerDVN("Nethermind", 30150, 0x6a4C9096F162f0ab3C0517B0a40dc1CE44785e16); // klaytn-mainnet + _registerDVN("Nethermind", 30373, 0x62aA89bAd332788021F6F4F4Fb196D5Fe59C27a6); // lens-mainnet + _registerDVN("Nethermind", 30309, 0x18f76f0d8CCD176BbE59B3870fa486d1Fff87026); // lightlink-mainnet + _registerDVN("Nethermind", 30321, 0x4b92BC2A7d681bf5230472C80d92aCFE9A6b9435); // lisk-mainnet + _registerDVN("Nethermind", 30217, 0x247624e2143504730aeC22912ed41F092498bEf2); // manta-mainnet + _registerDVN("Nethermind", 30181, 0xB19A9370D404308040A9760678c8Ca28aFfbbb76); // mantle-mainnet + _registerDVN("Nethermind", 30266, 0xabC9b1819cc4D9846550F928B985993cF6240439); // merlin-mainnet + _registerDVN("Nethermind", 30176, 0x08095eceD6c0b46D50eE45a6a59C0fD3De0b0855); // meter-mainnet + _registerDVN("Nethermind", 30151, 0x6ABdb569Dc985504cCcB541ADE8445E5266e7388); // metis-mainnet + _registerDVN("Nethermind", 30260, 0xcd37CA043f8479064e10635020c65FfC005d36f6); // mode-mainnet + _registerDVN("Nethermind", 30390, 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7); // monad-mainnet + _registerDVN("Nethermind", 30126, 0x790d7B1E97a086eb0012393b65a5B32cE58a04Dc); // moonbeam-mainnet + _registerDVN("Nethermind", 30167, 0xfE1cD27827E16b07E61A4AC96b521bDB35e00328); // moonriver-mainnet + _registerDVN("Nethermind", 30322, 0xdf30C9f6A70cE65A152c5Bd09826525D7E97Ba49); // morph-mainnet + _registerDVN("Nethermind", 30331, 0xE33de1A8cf9bcdC6b509C44EEF66f47c65dA6d47); // mp1-mainnet + _registerDVN("Nethermind", 30395, 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd); // nexera-mainnet + _registerDVN("Nethermind", 30369, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // nibiru-mainnet + _registerDVN("Nethermind", 30388, 0x95729Ea44326f8adD8A9b1d987279DBdC1DD3dFf); // og-mainnet + _registerDVN("Nethermind", 30202, 0x6a4C9096F162f0ab3C0517B0a40dc1CE44785e16); // opbnb-mainnet + _registerDVN("Nethermind", 30392, 0x97841D4AB18E9A923322A002d5b8Eb42b31Ccdb5); // openledger-mainnet + _registerDVN("Nethermind", 30111, 0xa7b5189bcA84Cd304D8553977c7C614329750d99); // optimism-mainnet + _registerDVN("Nethermind", 30213, 0x6a4C9096F162f0ab3C0517B0a40dc1CE44785e16); // orderly-mainnet + _registerDVN("Nethermind", 30302, 0x725fAFe20B74FF6f88DAEA0C506190A8f1037635); // peaq-mainnet + _registerDVN("Nethermind", 30383, 0xa51cE237FaFA3052D5d3308Df38A024724Bb1274); // plasma-mainnet + _registerDVN("Nethermind", 30370, 0x882a1EE8891c7d22310dedf032eF9653785532B8); // plumephoenix-mainnet + _registerDVN("Nethermind", 30109, 0x31F748a368a893Bdb5aBB67ec95F232507601A73); // polygon-mainnet + _registerDVN("Nethermind", 30235, 0xB53648CA1aA054A80159c1175c03679fdC76bf88); // rarible-mainnet + _registerDVN("Nethermind", 30333, 0x05AaEfDf9dB6E0f7d27FA3b6EE099EDB33dA029E); // rootstock-mainnet + _registerDVN("Nethermind", 30214, 0x446755349101cB20c582C224462c3912d3584dCE); // scroll-mainnet + _registerDVN("Nethermind", 30280, 0xD24972c11F91c1bB9eaEe97ec96bB9c33cF7af24); // sei-mainnet + _registerDVN("Nethermind", 30230, 0x5fddD320a1e29bB466Fa635661b125D51D976f92); // shimmer-mainnet + _registerDVN("Nethermind", 30379, 0x31F748a368a893Bdb5aBB67ec95F232507601A73); // silicon-mainnet + _registerDVN("Nethermind", 30380, 0x5FA12ebC08e183C1F5d44678cF897edEfe68738B); // somnia-mainnet + _registerDVN("Nethermind", 30340, 0x5Cc4E4d2cDf15795Dc5EA383b8768ec91A587719); // soneium-mainnet + _registerDVN("Nethermind", 30332, 0x05AaEfDf9dB6E0f7d27FA3b6EE099EDB33dA029E); // sonic-mainnet + _registerDVN("Nethermind", 30334, 0xa1A31D9ddf919e87a23A1416b0aa0b600D32435D); // sophon-mainnet + _registerDVN("Nethermind", 30396, 0x9bCd17A654bffAa6f8fEa38D19661a7210e22196); // stable-mainnet + _registerDVN("Nethermind", 30364, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // story-mainnet + _registerDVN("Nethermind", 30374, 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd); // subtensorevm-mainnet + _registerDVN("Nethermind", 30327, 0x07C05EaB7716AcB6f83ebF6268F8EECDA8892Ba1); // superposition-mainnet + _registerDVN("Nethermind", 30335, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // swell-mainnet + _registerDVN("Nethermind", 30377, 0x97841D4AB18E9A923322A002d5b8Eb42b31Ccdb5); // tac-mainnet + _registerDVN("Nethermind", 30290, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // taiko-mainnet + _registerDVN("Nethermind", 30199, 0x809CDE2AfcF8627312E87a6a7bbFFaB3F8F347c7); // telos-mainnet + _registerDVN("Nethermind", 30196, 0x790d7B1E97a086eb0012393b65a5B32cE58a04Dc); // tomo-mainnet + _registerDVN("Nethermind", 30320, 0x25e0e650a78e6304A3983Fc4b7Ffc6544b1bEea6); // unichain-mainnet + _registerDVN("Nethermind", 30319, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // worldchain-mainnet + _registerDVN("Nethermind", 30236, 0xaCDe1f22EEAb249d3ca6Ba8805C8fEe9f52a16e7); // xai-mainnet + _registerDVN("Nethermind", 30291, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // xchain-mainnet + _registerDVN("Nethermind", 30365, 0x1294E3347ec64Fd63e1d0594Dc1294247cd237C7); // xdc-mainnet + _registerDVN("Nethermind", 30274, 0x28af4dADbc5066e994986E8bb105240023dC44B6); // xlayer-mainnet + _registerDVN("Nethermind", 30216, 0x809CDE2AfcF8627312E87a6a7bbFFaB3F8F347c7); // xpla-mainnet + _registerDVN("Nethermind", 30303, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // zircuit-mainnet + _registerDVN("Nethermind", 30183, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // zkconsensys-mainnet + _registerDVN("Nethermind", 30158, 0x7A7dDC46882220a075934f40380d3A7e1e87d409); // zkpolygon-mainnet + _registerDVN("Nethermind", 30165, 0xb183c2b91cf76cAd13602b32ADa2Fd273f19009C); // zksync-mainnet + _registerDVN("Nethermind", 30386, 0x38179D3BFa6Ef1d69A8A7b0b671BA3D8836B2AE8); // zkverify-mainnet + _registerDVN("Nethermind", 30195, 0xa7b5189bcA84Cd304D8553977c7C614329750d99); // zora-mainnet + + // Nodesguru + _registerDVN("Nodesguru", 30110, 0xD954bF7968eF68875c9100c9ec890f969504d120); // arbitrum-mainnet + _registerDVN("Nodesguru", 30106, 0xD251D8a85cDfC84518b9454EE6a8D017E503F56C); // avalanche-mainnet + _registerDVN("Nodesguru", 30102, 0x1bab20E7FDc79257729CB596BEF85db76C44915E); // bsc-mainnet + _registerDVN("Nodesguru", 30101, 0x9F45834F0C8042e36935781b944443e906886a87); // ethereum-mainnet + _registerDVN("Nodesguru", 30112, 0x05AaEfDf9dB6E0f7d27FA3b6EE099EDB33dA029E); // fantom-mainnet + _registerDVN("Nodesguru", 30294, 0x4D52f5bc932cf1A854381A85ad9ED79B8497c153); // gravity-mainnet + _registerDVN("Nodesguru", 30111, 0xe6CD8c2E46Ef396DF88048449e5B1C75172b40C3); // optimism-mainnet + _registerDVN("Nodesguru", 30302, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // peaq-mainnet + _registerDVN("Nodesguru", 30109, 0xF7DDEE427507cdb6885E53CAAaa1973b1Fe29357); // polygon-mainnet + _registerDVN("Nodesguru", 30301, 0x3A5a74f863ec48c1769C4Ee85f6C3d70f5655E2A); // zklink-mainnet + + // Nodit + _registerDVN("Nodit", 30110, 0x4c41b4EDf85DEe828C2cFcc80019CB2BbCFb69a5); // arbitrum-mainnet + _registerDVN("Nodit", 30106, 0x0F56cE0cA0595792Db727A21596edc2fd39be444); // avalanche-mainnet + _registerDVN("Nodit", 30102, 0xEeCE50190806fA57016028d31D8631419882401c); // bsc-mainnet + _registerDVN("Nodit", 30101, 0x0Cea5a94F8cd3330c4F84944bF4500F8daCD440C); // ethereum-mainnet + _registerDVN("Nodit", 30111, 0x1288cDad593856D7672F82e4cC5fdFE1CF59646d); // optimism-mainnet + _registerDVN("Nodit", 30109, 0x4c41b4EDf85DEe828C2cFcc80019CB2BbCFb69a5); // polygon-mainnet + + // Omnicat + _registerDVN("Omnicat", 30110, 0xd1C70192CC0eb9a89e3D9032b9FAcab259A0a1e9); // arbitrum-mainnet + _registerDVN("Omnicat", 30184, 0xe6CD8c2E46Ef396DF88048449e5B1C75172b40C3); // base-mainnet + _registerDVN("Omnicat", 30243, 0x25e0e650a78e6304A3983Fc4b7Ffc6544b1bEea6); // blast-mainnet + _registerDVN("Omnicat", 30102, 0xdfF3F73C260b3361d4F006B02972c6aF6C5c5417); // bsc-mainnet + _registerDVN("Omnicat", 30159, 0x25e0e650a78e6304A3983Fc4b7Ffc6544b1bEea6); // canto-mainnet + _registerDVN("Omnicat", 30101, 0xf10Ea2c0D43bC4973cfBCc94eBAfC39d1D4aF118); // ethereum-mainnet + _registerDVN("Omnicat", 30109, 0xa2d10677441230C4AeD58030e4EA6Ba7Bfd80393); // polygon-mainnet + + // Omnix + _registerDVN("Omnix", 30110, 0xabEa0b6B9237b589e676dC16f6D74Bf7612591f4); // arbitrum-mainnet + _registerDVN("Omnix", 30106, 0x21cAF0BCE846AAA78C9f23C5A4eC5988EcBf9988); // avalanche-mainnet + _registerDVN("Omnix", 30184, 0xeEdE111103535e473451311e26C3E6660b0F77e1); // base-mainnet + _registerDVN("Omnix", 30102, 0x5a4c666E9C7aA86FD4fBFDFbfd04646DcC45C6c5); // bsc-mainnet + _registerDVN("Omnix", 30101, 0xAf75bfD402f3d4EE84978179a6c87D16c4Bd1724); // ethereum-mainnet + _registerDVN("Omnix", 30112, 0xE0F0FbBDBF9d398eCA0dd8c86d1F308D895b9Eb7); // fantom-mainnet + _registerDVN("Omnix", 30367, 0x3E3A9bC9149Ddf1D3A3ea51c0A49Eb9fe6347043); // hyperliquid-mainnet + _registerDVN("Omnix", 30111, 0x03d2414476a742Aba715BcC337583C820525E22a); // optimism-mainnet + _registerDVN("Omnix", 30109, 0x06b85533967179eD5bC9C754b84aE7d02f7eD830); // polygon-mainnet + _registerDVN("Omnix", 30278, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // sanko-mainnet + + // Ondo Staging + _registerDVN("Ondo Staging", 30110, 0x2f2F1c6025E8Da125e2Afd73BA17d3cBDfE3d093); // arbitrum-mainnet + _registerDVN("Ondo Staging", 30102, 0x089E70BC883Ad0b6551e513bF7A71Ffd2059f9F1); // bsc-mainnet + _registerDVN("Ondo Staging", 30101, 0xF34D1B07c64c4F4d492aE3DdD0AaB0658A2975eb); // ethereum-mainnet + _registerDVN("Ondo Staging", 30181, 0x377B51593a03B82543c1508fE7e75Aba6acDE008); // mantle-mainnet + + // P2P + _registerDVN("P2P", 30324, 0x52B7E1958F6Ad3E195DC30578dA5Fa7ac5827A2A); // abstract-mainnet + _registerDVN("P2P", 30110, 0xB3Ce0A5D132Cd9Bf965aBa435E650c55Edce0062); // arbitrum-mainnet + _registerDVN("P2P", 30106, 0xE94aE34DfCC87A61836938641444080B98402c75); // avalanche-mainnet + _registerDVN("P2P", 30184, 0x5b6735c66d97479cCD18294fc96B3084EcB2fa3f); // base-mainnet + _registerDVN("P2P", 30362, 0x3b247F1B48F055EbF2DB593672B98C9597E3081E); // bera-mainnet + _registerDVN("P2P", 30102, 0x439264FB87581a70Bb6D7bEFd16b636521B0Ad2D); // bsc-mainnet + _registerDVN("P2P", 30125, 0x7E65BDd15C8Db8995F80aBf0D6593b57dc8BE437); // celo-mainnet + _registerDVN("P2P", 30101, 0x06559EE34D85a88317Bf0bfE307444116c631b67); // ethereum-mainnet + _registerDVN("P2P", 30112, 0x439264FB87581a70Bb6D7bEFd16b636521B0Ad2D); // fantom-mainnet + _registerDVN("P2P", 30145, 0xf10Ea2c0D43bC4973cfBCc94eBAfC39d1D4aF118); // gnosis-mainnet + _registerDVN("P2P", 30367, 0xC7423626016bc40375458bc0277F28681EC91C8e); // hyperliquid-mainnet + _registerDVN("P2P", 30339, 0x68b6Fb5e728dB92A09BA810595915aE3d7399e40); // ink-mainnet + _registerDVN("P2P", 30150, 0xF7a1963e52b1471d01e320d547b72b05F443C9e6); // klaytn-mainnet + _registerDVN("P2P", 30181, 0x2206ceb6809bD39f8707ED5eE618f8CFA57E40F2); // mantle-mainnet + _registerDVN("P2P", 30111, 0x539008c98B17803A273eDf98aBA2d4414Ee3f4D7); // optimism-mainnet + _registerDVN("P2P", 30302, 0x795720d981C1f4D4d4381682225572c431284592); // peaq-mainnet + _registerDVN("P2P", 30383, 0xfD429433af17c5C75E4c8BC84b8F6dCD1b2C051A); // plasma-mainnet + _registerDVN("P2P", 30109, 0x9EEee79F5dBC4D99354b5CB547c138Af432F937b); // polygon-mainnet + _registerDVN("P2P", 30214, 0xC6a6324932B399D6A673B7Ed0af671F28033E046); // scroll-mainnet + _registerDVN("P2P", 30280, 0xA83A87a0bDce466edfBB6794404E1D7F556B8F20); // sei-mainnet + _registerDVN("P2P", 30380, 0xE57aF13D6676F7a37d37AB603aaeA6D63B1dEe8E); // somnia-mainnet + _registerDVN("P2P", 30340, 0xf85D19E8884EB985A7f77BA385409ec7aD2923A5); // soneium-mainnet + _registerDVN("P2P", 30332, 0x45A7305c65AAd28384F20a80F87a5183772E4F70); // sonic-mainnet + _registerDVN("P2P", 30374, 0x6c5f923B63Fdd52fb9C45dAeFA8695fA6b55a935); // subtensorevm-mainnet + _registerDVN("P2P", 30377, 0x965A80Dc87cec5848310E612DeAD84B543AeF874); // tac-mainnet + _registerDVN("P2P", 30320, 0xab82E9b24004b954985528dAc14D1B020722a3c8); // unichain-mainnet + _registerDVN("P2P", 30183, 0x0b239476A771834D846Cb505817baC3C391c338A); // zkconsensys-mainnet + _registerDVN("P2P", 30195, 0xD1b5493e712081A6FBAb73116405590046668F6b); // zora-mainnet + + // POPS + _registerDVN("POPS", 30110, 0x8fa9eEf18c2A1459024f0B44714e5aCc1Ce7f5e8); // arbitrum-mainnet + _registerDVN("POPS", 30106, 0x2b8CBEa81315130A4C422e875063362640ddFeB0); // avalanche-mainnet + _registerDVN("POPS", 30184, 0xA9d11632eC5f9502D39afF28d66415F6CCa37544); // base-mainnet + _registerDVN("POPS", 30362, 0x4055fAd06ded1F57A1b4D07455665a9Bbc33C700); // bera-mainnet + _registerDVN("POPS", 30102, 0x33E5fcC13D7439cC62d54c41AA966197145b3Cd7); // bsc-mainnet + _registerDVN("POPS", 30101, 0x94AAfe0A92A8300f0A2100A7f3DE47d6845747A9); // ethereum-mainnet + _registerDVN("POPS", 30112, 0x78203678D264063815Dac114eA810E9837Cd80f7); // fantom-mainnet + _registerDVN("POPS", 30145, 0x790d7B1E97a086eb0012393b65a5B32cE58a04Dc); // gnosis-mainnet + _registerDVN("POPS", 30126, 0x7fe673201724925B5c477d4E1A4Bd3E954688cF5); // moonbeam-mainnet + _registerDVN("POPS", 30111, 0xe552485d02EDd3067FE7FCbD4dd56BB1D3A998D2); // optimism-mainnet + _registerDVN("POPS", 30109, 0xa75ABcC0FAB6aE09c8FD808bEc7bE7E88fe31D6B); // polygon-mainnet + _registerDVN("POPS", 30214, 0x34730f2570E6cff8B1C91FaaBF37D0DD917c4367); // scroll-mainnet + + // Paxos + _registerDVN("Paxos", 30110, 0x8E5f5825602Bc5db725974Bb9e60677d4adC5fbe); // arbitrum-mainnet + _registerDVN("Paxos", 30101, 0xb0B2EF168F52F6d1e42f461e11117295eF992daf); // ethereum-mainnet + _registerDVN("Paxos", 30339, 0x1C5C9C9b50885319BD3cB7e67294136CD436BeE3); // ink-mainnet + _registerDVN("Paxos", 30274, 0x8bEFB8cd9529e539B095251Ea3a058e710225D30); // xlayer-mainnet + + // Planetarium + _registerDVN("Planetarium", 30110, 0xe6CD8c2E46Ef396DF88048449e5B1C75172b40C3); // arbitrum-mainnet + _registerDVN("Planetarium", 30106, 0x2AC038606fff3FB00317B8F0CcFB4081694aCDD0); // avalanche-mainnet + _registerDVN("Planetarium", 30102, 0x05AaEfDf9dB6E0f7d27FA3b6EE099EDB33dA029E); // bsc-mainnet + _registerDVN("Planetarium", 30101, 0x972ED7bd3d42D9C0bea3632992Ebf7e97186ea4A); // ethereum-mainnet + _registerDVN("Planetarium", 30112, 0xF7DDEE427507cdb6885E53CAAaa1973b1Fe29357); // fantom-mainnet + _registerDVN("Planetarium", 30111, 0x021e401C2a1A60618c5E6353A40524971Eba1E8D); // optimism-mainnet + _registerDVN("Planetarium", 30109, 0x2AC038606fff3FB00317B8F0CcFB4081694aCDD0); // polygon-mainnet + + // Polyhedra + _registerDVN("Polyhedra", 30110, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // arbitrum-mainnet + _registerDVN("Polyhedra", 30106, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // avalanche-mainnet + _registerDVN("Polyhedra", 30184, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // base-mainnet + _registerDVN("Polyhedra", 30243, 0x0ff4cc28826356503BB79c00637bec0eE006f237); // blast-mainnet + _registerDVN("Polyhedra", 30102, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // bsc-mainnet + _registerDVN("Polyhedra", 30125, 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC); // celo-mainnet + _registerDVN("Polyhedra", 30153, 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC); // coredao-mainnet + _registerDVN("Polyhedra", 30283, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // cyber-mainnet + _registerDVN("Polyhedra", 30101, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // ethereum-mainnet + _registerDVN("Polyhedra", 30112, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // fantom-mainnet + _registerDVN("Polyhedra", 30295, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // flare-mainnet + _registerDVN("Polyhedra", 30145, 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC); // gnosis-mainnet + _registerDVN("Polyhedra", 30150, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // klaytn-mainnet + _registerDVN("Polyhedra", 30217, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // manta-mainnet + _registerDVN("Polyhedra", 30181, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // mantle-mainnet + _registerDVN("Polyhedra", 30266, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // merlin-mainnet + _registerDVN("Polyhedra", 30151, 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC); // metis-mainnet + _registerDVN("Polyhedra", 30260, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // mode-mainnet + _registerDVN("Polyhedra", 30126, 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC); // moonbeam-mainnet + _registerDVN("Polyhedra", 30175, 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC); // nova-mainnet + _registerDVN("Polyhedra", 30202, 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC); // opbnb-mainnet + _registerDVN("Polyhedra", 30111, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // optimism-mainnet + _registerDVN("Polyhedra", 30109, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // polygon-mainnet + _registerDVN("Polyhedra", 30214, 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC); // scroll-mainnet + _registerDVN("Polyhedra", 30280, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // sei-mainnet + _registerDVN("Polyhedra", 30274, 0x8ddF05F9A5c488b4973897E278B58895bF87Cb24); // xlayer-mainnet + _registerDVN("Polyhedra", 30183, 0xE014fe8c4d5C23EDB7AC4011F226e869ac7Ef5CC); // zkconsensys-mainnet + + // Predicate + _registerDVN("Predicate", 30101, 0x006E1248BE5e40B4A4E7099397719Df7aB872De7); // ethereum-mainnet + _registerDVN("Predicate", 30370, 0xD7bB44516b476ca805FB9d6fc5b508ef3Ee9448D); // plumephoenix-mainnet + + // Quantoz + _registerDVN("Quantoz", 30101, 0x4066b6e7BfD761B579902E7e8D03F4feb9B9536E); // ethereum-mainnet + _registerDVN("Quantoz", 30109, 0xA773b91c42FC8e77C37d7396B2814b8FA485b2c3); // polygon-mainnet + + // Republic + _registerDVN("Republic", 30106, 0x1feB08B1A53A9710AfcE82D380B8c2833C69a37e); // avalanche-mainnet + _registerDVN("Republic", 30102, 0xF7DDEE427507cdb6885E53CAAaa1973b1Fe29357); // bsc-mainnet + _registerDVN("Republic", 30101, 0xA1Bc1B9af01A0ec78883AA5DC7DECDCe897E1E76); // ethereum-mainnet + _registerDVN("Republic", 30109, 0x547bF6889B1095b7CC6e525A1F8E8Fdb26134a38); // polygon-mainnet + + // Restake + _registerDVN("Restake", 30110, 0x969A0bdd86A230345AD87A6a381DE5ED9E6cda85); // arbitrum-mainnet + _registerDVN("Restake", 30106, 0x377B51593a03B82543c1508fE7e75Aba6acDE008); // avalanche-mainnet + _registerDVN("Restake", 30102, 0x4D52f5bc932cf1A854381A85ad9ED79B8497c153); // bsc-mainnet + _registerDVN("Restake", 30101, 0xE4193136B92bA91402313e95347c8e9FAD8d27d0); // ethereum-mainnet + _registerDVN("Restake", 30112, 0x4D52f5bc932cf1A854381A85ad9ED79B8497c153); // fantom-mainnet + _registerDVN("Restake", 30111, 0xcced05c3667877B545285B25f19F794436A1c481); // optimism-mainnet + _registerDVN("Restake", 30109, 0x2afa3787cd95fee5D5753cd717EF228eb259f4ea); // polygon-mainnet + + // Shrapnel + _registerDVN("Shrapnel", 30110, 0x7B8a0fD9D6ae5011d5cBD3E85Ed6D5510F98c9Bf); // arbitrum-mainnet + _registerDVN("Shrapnel", 30106, 0x6A110d94e1baA6984A3d904bab37Ae49b90E6B4f); // avalanche-mainnet + _registerDVN("Shrapnel", 30102, 0xb4FA7f1C67E5Ec99B556Ec92CbDdBCdd384106F2); // bsc-mainnet + _registerDVN("Shrapnel", 30101, 0xCe97511db880571A7C31821eB026Ef12fCaC892e); // ethereum-mainnet + _registerDVN("Shrapnel", 30112, 0xb4FA7f1C67E5Ec99B556Ec92CbDdBCdd384106F2); // fantom-mainnet + _registerDVN("Shrapnel", 30111, 0xd36246C322Ee102A2203bCA9cafb84c179D306F6); // optimism-mainnet + _registerDVN("Shrapnel", 30109, 0x54dD79f5cE72b51FCBbcb170Dd01E32034323565); // polygon-mainnet + + // Stablelab + _registerDVN("Stablelab", 30110, 0xcd37CA043f8479064e10635020c65FfC005d36f6); // arbitrum-mainnet + _registerDVN("Stablelab", 30106, 0x5fddD320a1e29bB466Fa635661b125D51D976f92); // avalanche-mainnet + _registerDVN("Stablelab", 30102, 0xabC9b1819cc4D9846550F928B985993cF6240439); // bsc-mainnet + _registerDVN("Stablelab", 30101, 0x5fddD320a1e29bB466Fa635661b125D51D976f92); // ethereum-mainnet + _registerDVN("Stablelab", 30112, 0xabC9b1819cc4D9846550F928B985993cF6240439); // fantom-mainnet + _registerDVN("Stablelab", 30111, 0xcd37CA043f8479064e10635020c65FfC005d36f6); // optimism-mainnet + _registerDVN("Stablelab", 30109, 0xabC9b1819cc4D9846550F928B985993cF6240439); // polygon-mainnet + + // Stakingcabin + _registerDVN("Stakingcabin", 30110, 0xb0646Fb9028364aC1f04477271375EF32A8A5e62); // arbitrum-mainnet + _registerDVN("Stakingcabin", 30106, 0xb6323Aa5A3FC07d93A3cf0F1044447F2a88B7dAb); // avalanche-mainnet + _registerDVN("Stakingcabin", 30102, 0xcCF6ee53aA0B7c7f190D2a7B273e7b04CCE14D21); // bsc-mainnet + _registerDVN("Stakingcabin", 30283, 0x2206ceb6809bD39f8707ED5eE618f8CFA57E40F2); // cyber-mainnet + _registerDVN("Stakingcabin", 30101, 0xCd0ca0619fc8dB4d47B19A1f04105312952E5F6D); // ethereum-mainnet + _registerDVN("Stakingcabin", 30112, 0x193204535913df3A3b350fcd2e1C97D047AbB409); // fantom-mainnet + _registerDVN("Stakingcabin", 30295, 0xCe97511db880571A7C31821eB026Ef12fCaC892e); // flare-mainnet + _registerDVN("Stakingcabin", 30294, 0x0D155ec1Dfc983E919C318964fD16078408E99CC); // gravity-mainnet + _registerDVN("Stakingcabin", 30265, 0x1294E3347ec64Fd63e1d0594Dc1294247cd237C7); // homeverse-mainnet + _registerDVN("Stakingcabin", 30285, 0x34730f2570E6cff8B1C91FaaBF37D0DD917c4367); // joc-mainnet + _registerDVN("Stakingcabin", 30266, 0xfd4AD9CDBd06FD4D8cA521307BF63a20239208ef); // merlin-mainnet + _registerDVN("Stakingcabin", 30111, 0x56D675bFd1574fF170723689223c3A93DeE5fA78); // optimism-mainnet + _registerDVN("Stakingcabin", 30302, 0x2EdfE0220A74d9609c79711a65E3A2F2A85Dc83b); // peaq-mainnet + _registerDVN("Stakingcabin", 30109, 0xcd19d26710CACf8241583769f353EA7395159007); // polygon-mainnet + _registerDVN("Stakingcabin", 30278, 0x1253CA32712171b5D28115A1346F2B22BB9a41D5); // sanko-mainnet + _registerDVN("Stakingcabin", 30280, 0x93d2d7AADC9F2Cf5EbC88e9703E06dB09b8Fd85B); // sei-mainnet + _registerDVN("Stakingcabin", 30290, 0x2c7185f5B0976397d9eB5c19d639d4005e6708f0); // taiko-mainnet + _registerDVN("Stakingcabin", 30303, 0x92ef4381a03372985985E70fb15E9F081E2e8D14); // zircuit-mainnet + + // Stargate + _registerDVN("Stargate", 30324, 0xCec9f0A49073ac4a1C439D06cb9448512389a64E); // abstract-mainnet + _registerDVN("Stargate", 30312, 0x794C0b0071D4A926c443468f027912e693678151); // ape-mainnet + _registerDVN("Stargate", 30384, 0x313328609a9C38459CaE56625FFf7F2AD6dcde3b); // apexfusionnexus-mainnet + _registerDVN("Stargate", 30110, 0x5756a74e8e18D8392605bA667171962B2b2826B5); // arbitrum-mainnet + _registerDVN("Stargate", 30211, 0xE11c808bC6099Abc9bE566C9017aa2Ab0f131d35); // aurora-mainnet + _registerDVN("Stargate", 30106, 0x252B234545e154543Ad2784c7111Eb90406be836); // avalanche-mainnet + _registerDVN("Stargate", 30184, 0xcdF31d62140204C08853b547E64707110fBC6680); // base-mainnet + _registerDVN("Stargate", 30362, 0x6E70FCdc42D3d63748B7d8883399Dcb16BBB5c8c); // bera-mainnet + _registerDVN("Stargate", 30376, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // botanix-mainnet + _registerDVN("Stargate", 30102, 0xac8de74CE0A44A5e73BBc709fe800406F58431e0); // bsc-mainnet + _registerDVN("Stargate", 30381, 0x64a344a15e4DE73F393E345E6Bfe937F34ee1f90); // camp-mainnet + _registerDVN("Stargate", 30323, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // codex-mainnet + _registerDVN("Stargate", 30153, 0xe6CD8c2E46Ef396DF88048449e5B1C75172b40C3); // coredao-mainnet + _registerDVN("Stargate", 30359, 0x2Ae36A544b904F2f2960F6Fd1a6084b4b11ba334); // cronosevm-mainnet + _registerDVN("Stargate", 30360, 0x0D1bc4Efd08940eB109Ef3040c1386d09B6334E0); // cronoszkevm-mainnet + _registerDVN("Stargate", 30267, 0x80442151791BbDd89117719e508115EBc1Ce2D93); // degen-mainnet + _registerDVN("Stargate", 30393, 0xa6F5DDBF0Bd4D03334523465439D301080574742); // doma-mainnet + _registerDVN("Stargate", 30328, 0x97F930a15172F38B7e947778889424e37b5DF316); // edu-mainnet + _registerDVN("Stargate", 30101, 0x8FafAE7Dd957044088b3d0F67359C327c6200d18); // ethereum-mainnet + _registerDVN("Stargate", 30292, 0x31F748a368a893Bdb5aBB67ec95F232507601A73); // etherlink-mainnet + _registerDVN("Stargate", 30295, 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd); // flare-mainnet + _registerDVN("Stargate", 30336, 0xd1C70192CC0eb9a89e3D9032b9FAcab259A0a1e9); // flow-mainnet + _registerDVN("Stargate", 30138, 0x9F45834F0C8042e36935781b944443e906886a87); // fuse-mainnet + _registerDVN("Stargate", 30342, 0xd1C70192CC0eb9a89e3D9032b9FAcab259A0a1e9); // glue-mainnet + _registerDVN("Stargate", 30145, 0xFCeA5cEF8b1ae3A454577C9444CDD95c1284B0cF); // gnosis-mainnet + _registerDVN("Stargate", 30361, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // goat-mainnet + _registerDVN("Stargate", 30294, 0x70BF42C69173d6e33b834f59630DAC592C70b369); // gravity-mainnet + _registerDVN("Stargate", 30316, 0x178D9517FC35633afDA67b8c236e568997a3Ae03); // hedera-mainnet + _registerDVN("Stargate", 30329, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // hemi-mainnet + _registerDVN("Stargate", 30339, 0xE900e073BADaFdC6F72541F34E6b701bde835487); // ink-mainnet + _registerDVN("Stargate", 30284, 0xf18A7d86917653725aFB7C215E47a24F9D784718); // iota-mainnet + _registerDVN("Stargate", 30330, 0x9EEee79F5dBC4D99354b5CB547c138Af432F937b); // islander-mainnet + _registerDVN("Stargate", 30177, 0x9CbAF815eD62Ef45C59E9F2Cb05106bAbb4d31d3); // kava-mainnet + _registerDVN("Stargate", 30150, 0x17720E3F361dCc2f70871a2ce3ac51b0Eaa5c2E4); // klaytn-mainnet + _registerDVN("Stargate", 30309, 0x0E95cf21aD9376A26997c97f326C5A0a267bB8FF); // lightlink-mainnet + _registerDVN("Stargate", 30321, 0x3fe00587a7b2432421d739A68bb890ceE55Bc18F); // lisk-mainnet + _registerDVN("Stargate", 30217, 0xca848BcB059e33Adb260d793EE360924B6Aa8E86); // manta-mainnet + _registerDVN("Stargate", 30181, 0xfe809470016196573D64A8D17a745bebEA4ecC41); // mantle-mainnet + _registerDVN("Stargate", 30151, 0x61A1B61A1087be03ABeDC04900Cfcc1C14187237); // metis-mainnet + _registerDVN("Stargate", 30260, 0x06559EE34D85a88317Bf0bfE307444116c631b67); // mode-mainnet + _registerDVN("Stargate", 30369, 0x06D99Ffd7c09Ea72e962a06B6e311e513d7c3d20); // nibiru-mainnet + _registerDVN("Stargate", 30388, 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd); // og-mainnet + _registerDVN("Stargate", 30111, 0xfe6507F094155caBB4784403Cd784C2DF04122dd); // optimism-mainnet + _registerDVN("Stargate", 30213, 0xD074B6bbCBEC2f2B4c4265DE3D95e521f82bF669); // orderly-mainnet + _registerDVN("Stargate", 30302, 0x18f76f0d8CCD176BbE59B3870fa486d1Fff87026); // peaq-mainnet + _registerDVN("Stargate", 30383, 0xabC9b1819cc4D9846550F928B985993cF6240439); // plasma-mainnet + _registerDVN("Stargate", 30370, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // plumephoenix-mainnet + _registerDVN("Stargate", 30109, 0xC79F0B1bcb7cDAE9f9BA547dcFc57cBfcd2993A5); // polygon-mainnet + _registerDVN("Stargate", 30235, 0x2fa870cEE4da57De84d1dB36759d4716AD7E5038); // rarible-mainnet + _registerDVN("Stargate", 30333, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // rootstock-mainnet + _registerDVN("Stargate", 30214, 0xb87591D8B0b93faE8b631A073577c40e8Dd46A62); // scroll-mainnet + _registerDVN("Stargate", 30280, 0xBd00C87850416db0995EF8030b104F875E1bdD15); // sei-mainnet + _registerDVN("Stargate", 30380, 0xA83A87a0bDce466edfBB6794404E1D7F556B8F20); // somnia-mainnet + _registerDVN("Stargate", 30340, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // soneium-mainnet + _registerDVN("Stargate", 30332, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // sonic-mainnet + _registerDVN("Stargate", 30334, 0x7cC1A4A700AAb8FbA8160a4e09B04a9A68C6D914); // sophon-mainnet + _registerDVN("Stargate", 30364, 0xA80AA110f05C9C6140018aAE0C4E08A70f43350d); // story-mainnet + _registerDVN("Stargate", 30327, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // superposition-mainnet + _registerDVN("Stargate", 30335, 0x7976b969A8E9560C483229FfBB855E8440898c9D); // swell-mainnet + _registerDVN("Stargate", 30290, 0x37473676FF697f2Eba29C8A3105309AbF00bA013); // taiko-mainnet + _registerDVN("Stargate", 30199, 0xA80AA110f05C9C6140018aAE0C4E08A70f43350d); // telos-mainnet + _registerDVN("Stargate", 30320, 0x9885110b909E88bb94f7f767A68ec2558B2AfA73); // unichain-mainnet + _registerDVN("Stargate", 30319, 0x7cEc38c06a2FEC9Fd525B1925544110204CbB5f6); // worldchain-mainnet + _registerDVN("Stargate", 30291, 0x56053A8f4db677e5774F8Ee5BdD9D2dC270075f3); // xchain-mainnet + _registerDVN("Stargate", 30365, 0x4FE90e0f2A99e464d6E97B161d72101CD03C20fe); // xdc-mainnet + _registerDVN("Stargate", 30183, 0xEf269BBaDB81DE86E4b3278fa1DAe1723545268b); // zkconsensys-mainnet + _registerDVN("Stargate", 30165, 0x62aA89bAd332788021F6F4F4Fb196D5Fe59C27a6); // zksync-mainnet + _registerDVN("Stargate", 30195, 0x376839ad96f4f0CDfFe10AAF987aBaD3AF0A8901); // zora-mainnet + + // Superduper + _registerDVN("Superduper", 30110, 0x539008c98B17803A273eDf98aBA2d4414Ee3f4D7); // arbitrum-mainnet + _registerDVN("Superduper", 30106, 0x0E95cf21aD9376A26997c97f326C5A0a267bB8FF); // avalanche-mainnet + _registerDVN("Superduper", 30102, 0xBD40c9047980500C46B8aed4462e2f889299FEbE); // bsc-mainnet + _registerDVN("Superduper", 30101, 0x92ef4381a03372985985E70fb15E9F081E2e8D14); // ethereum-mainnet + _registerDVN("Superduper", 30112, 0xBD40c9047980500C46B8aed4462e2f889299FEbE); // fantom-mainnet + _registerDVN("Superduper", 30111, 0xdf30C9f6A70cE65A152c5Bd09826525D7E97Ba49); // optimism-mainnet + _registerDVN("Superduper", 30109, 0x8Fc629aa400D4D9c0B118F2685a49316552ABf27); // polygon-mainnet + + // Superform + _registerDVN("Superform", 30110, 0x5496d03d9065B08e5677E1c5D1107110Bb05d445); // arbitrum-mainnet + _registerDVN("Superform", 30106, 0x8fb0B7D74B557e4b45EF89648BAc197EAb2E4325); // avalanche-mainnet + _registerDVN("Superform", 30184, 0xEb62f578497Bdc351dD650853a751135212fAF49); // base-mainnet + _registerDVN("Superform", 30243, 0x0E95cf21aD9376A26997c97f326C5A0a267bB8FF); // blast-mainnet + _registerDVN("Superform", 30102, 0xF4c489AfD83625F510947e63ff8F90dfEE0aE46C); // bsc-mainnet + _registerDVN("Superform", 30101, 0x7518f30bd5867b5fA86702556245Dead173afE46); // ethereum-mainnet + _registerDVN("Superform", 30112, 0x2EdfE0220A74d9609c79711a65E3A2F2A85Dc83b); // fantom-mainnet + _registerDVN("Superform", 30111, 0xb0B2EF168F52F6d1e42f461e11117295eF992daf); // optimism-mainnet + _registerDVN("Superform", 30109, 0x1E4CE74ccf5498B19900649D9196e64BAb592451); // polygon-mainnet + _registerDVN("Superform", 30183, 0x7A205ED4e3d7f9d0777594501705D8CD405c3B05); // zkconsensys-mainnet + + // Switchboard + _registerDVN("Switchboard", 30110, 0xcced05c3667877B545285B25f19F794436A1c481); // arbitrum-mainnet + _registerDVN("Switchboard", 30106, 0x92ef4381a03372985985E70fb15E9F081E2e8D14); // avalanche-mainnet + _registerDVN("Switchboard", 30102, 0xf0809F6e760a5452Ee567975EdA7a28dA4a83D38); // bsc-mainnet + _registerDVN("Switchboard", 30101, 0x276e6B1138d2d49C0Cda86658765d12Ef84550c1); // ethereum-mainnet + _registerDVN("Switchboard", 30112, 0xf0809F6e760a5452Ee567975EdA7a28dA4a83D38); // fantom-mainnet + _registerDVN("Switchboard", 30111, 0x313328609a9C38459CaE56625FFf7F2AD6dcde3b); // optimism-mainnet + _registerDVN("Switchboard", 30109, 0xC6D46F63578635E4a7140cdf4D0eea0fd7bB50eC); // polygon-mainnet + + // TSS + _registerDVN("TSS", 30312, 0xA2Eb037Ee6AABa1547fCa8804392EB8EF9c33976); // ape-mainnet + _registerDVN("TSS", 30110, 0xA0Cc33Dd6f4819D473226257792AFe230EC3c67f); // arbitrum-mainnet + _registerDVN("TSS", 30210, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // astar-mainnet + _registerDVN("TSS", 30211, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // aurora-mainnet + _registerDVN("TSS", 30106, 0x5a54fe5234E811466D5366846283323c954310B2); // avalanche-mainnet + _registerDVN("TSS", 30184, 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4); // base-mainnet + _registerDVN("TSS", 30234, 0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9); // bb1-mainnet + _registerDVN("TSS", 30362, 0x306B9a8953B9462F8b826e6768a93C8EA7454965); // bera-mainnet + _registerDVN("TSS", 30317, 0x6c47E59BC0600942146BF37668fc92b369C85ab7); // bevm-mainnet + _registerDVN("TSS", 30243, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // blast-mainnet + _registerDVN("TSS", 30279, 0xbB2753C1B940363d278c81D6402fA89E79Ab4ebc); // bob-mainnet + _registerDVN("TSS", 30102, 0x5a54fe5234E811466D5366846283323c954310B2); // bsc-mainnet + _registerDVN("TSS", 30159, 0x377530cdA84DFb2673bF4d145DCF0C4D7fdcB5b6); // canto-mainnet + _registerDVN("TSS", 30125, 0x071c3F1bc3046c693c3ABBC03a87ca9A30e43bE2); // celo-mainnet + _registerDVN("TSS", 30212, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // conflux-mainnet + _registerDVN("TSS", 30153, 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb); // coredao-mainnet + _registerDVN("TSS", 30267, 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d); // degen-mainnet + _registerDVN("TSS", 30118, 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb); // dexalot-mainnet + _registerDVN("TSS", 30115, 0x88bD5f18a13C22C41Cf5c8cBA12eB371C4bD18D9); // dfk-mainnet + _registerDVN("TSS", 30149, 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb); // dos-mainnet + _registerDVN("TSS", 30101, 0x5a54fe5234E811466D5366846283323c954310B2); // ethereum-mainnet + _registerDVN("TSS", 30292, 0xb87396e0d0d8B12169319803B56dB763Cd738E63); // etherlink-mainnet + _registerDVN("TSS", 30112, 0xA0Cc33Dd6f4819D473226257792AFe230EC3c67f); // fantom-mainnet + _registerDVN("TSS", 30255, 0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9); // fraxtal-mainnet + _registerDVN("TSS", 30138, 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb); // fuse-mainnet + _registerDVN("TSS", 30145, 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb); // gnosis-mainnet + _registerDVN("TSS", 30361, 0x00961ae3250C2c0dB37a476C0ebA2353Ce800Dae); // goat-mainnet + _registerDVN("TSS", 30116, 0x3E2EF091D7606E4CA3B8d84bcAf23da0FfA11053); // harmony-mainnet + _registerDVN("TSS", 30265, 0xcbD35a9b849342AD34a71e072D9947D4AFb4E164); // homeverse-mainnet + _registerDVN("TSS", 30367, 0xacFC61640598C25bdB273291D889816B2218CD9B); // hyperliquid-mainnet + _registerDVN("TSS", 30339, 0xf772581dcf3300914D6222C4e6FcF0ed5EF93142); // ink-mainnet + _registerDVN("TSS", 30284, 0x59dAE6516D2fA7F21195adC0Cda14d819D21031C); // iota-mainnet + _registerDVN("TSS", 30177, 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4); // kava-mainnet + _registerDVN("TSS", 30150, 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb); // klaytn-mainnet + _registerDVN("TSS", 30197, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // loot-mainnet + _registerDVN("TSS", 30217, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // manta-mainnet + _registerDVN("TSS", 30181, 0xAaB5A48CFC03Efa9cC34A2C1aAcCCB84b4b770e4); // mantle-mainnet + _registerDVN("TSS", 30198, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // meritcircle-mainnet + _registerDVN("TSS", 30266, 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d); // merlin-mainnet + _registerDVN("TSS", 30176, 0x51A6E62D12F2260E697039Ff53bCB102053f5ab7); // meter-mainnet + _registerDVN("TSS", 30151, 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb); // metis-mainnet + _registerDVN("TSS", 30260, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // mode-mainnet + _registerDVN("TSS", 30126, 0xdEeF80c12d49e5DA8e01B05636E2d0C776F6b78D); // moonbeam-mainnet + _registerDVN("TSS", 30167, 0x84070061032F3e7ea4E068f447FB7cDfC98d57Fe); // moonriver-mainnet + _registerDVN("TSS", 30322, 0xb250B0b2A9891a035080615Ac30f040d2b7E7FAB); // morph-mainnet + _registerDVN("TSS", 30175, 0x37aaaf95887624a363effB7762D489E3C05c2a02); // nova-mainnet + _registerDVN("TSS", 30155, 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb); // okx-mainnet + _registerDVN("TSS", 30202, 0xA658742d33ebd2ce2F0bdFf73515Aa797Fd161D9); // opbnb-mainnet + _registerDVN("TSS", 30111, 0xA0Cc33Dd6f4819D473226257792AFe230EC3c67f); // optimism-mainnet + _registerDVN("TSS", 30213, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // orderly-mainnet + _registerDVN("TSS", 30302, 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a); // peaq-mainnet + _registerDVN("TSS", 30109, 0x5a54fe5234E811466D5366846283323c954310B2); // polygon-mainnet + _registerDVN("TSS", 30235, 0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9); // rarible-mainnet + _registerDVN("TSS", 30313, 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a); // reya-mainnet + _registerDVN("TSS", 30278, 0xbB2753C1B940363d278c81D6402fA89E79Ab4ebc); // sanko-mainnet + _registerDVN("TSS", 30214, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // scroll-mainnet + _registerDVN("TSS", 30280, 0xd5C9DFDE96aA0731b3224f8bacf00Cd456188542); // sei-mainnet + _registerDVN("TSS", 30230, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // shimmer-mainnet + _registerDVN("TSS", 30148, 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb); // shrapnel-mainnet + _registerDVN("TSS", 30340, 0xf80cB5F7467B67cBEC77DcE6a13C89f210b554c0); // soneium-mainnet + _registerDVN("TSS", 30332, 0x01BBb6319c596e70342a0cFD1193CfebE10BBB1D); // sonic-mainnet + _registerDVN("TSS", 30364, 0xe25741bda30bb79a66ADf656E7f2D3f0C4fb3191); // story-mainnet + _registerDVN("TSS", 30327, 0xaeA4FB2C28252C8e5f195178820E8791Aa4A4e41); // superposition-mainnet + _registerDVN("TSS", 30335, 0x275448a4BF72Ab5A560e8A535AAC0c85B99bC896); // swell-mainnet + _registerDVN("TSS", 30290, 0x0EC3Aa6352A0BFA3352523938260e42c212fa8E7); // taiko-mainnet + _registerDVN("TSS", 30199, 0x4514FC667a944752ee8A29F544c1B20b1A315f25); // telos-mainnet + _registerDVN("TSS", 30173, 0x282b3386571f7f794450d5789911a9804FA346b4); // tenet-mainnet + _registerDVN("TSS", 30238, 0xfDfA2330713A8e2EaC6e4f15918F11937fFA4dBE); // tiltyard-mainnet + _registerDVN("TSS", 30196, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // tomo-mainnet + _registerDVN("TSS", 30320, 0x306B9a8953B9462F8b826e6768a93C8EA7454965); // unichain-mainnet + _registerDVN("TSS", 30236, 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a); // xai-mainnet + _registerDVN("TSS", 30274, 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a); // xlayer-mainnet + _registerDVN("TSS", 30216, 0xC39161c743D0307EB9BCc9FEF03eeb9Dc4802de7); // xpla-mainnet + _registerDVN("TSS", 30303, 0x4b80F7d25c451D204b1C93D9bdf2aB3B04f3EA4a); // zircuit-mainnet + _registerDVN("TSS", 30183, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // zkconsensys-mainnet + _registerDVN("TSS", 30301, 0x8b82a8DE13aF4bdAC68134494d83A7Aacc113165); // zklink-mainnet + _registerDVN("TSS", 30158, 0xA6Bf2bE6c60175601BF88217c75dD4b14ABB5FBb); // zkpolygon-mainnet + _registerDVN("TSS", 30165, 0xCB7aD38D45ab5bcF5880B0fa851263C29582c18a); // zksync-mainnet + _registerDVN("TSS", 30195, 0xcb566e3B6934Fa77258d68ea18E931fa75e1aaAa); // zora-mainnet + + // Tapioca + _registerDVN("Tapioca", 30110, 0xabC9b1819cc4D9846550F928B985993cF6240439); // arbitrum-mainnet + _registerDVN("Tapioca", 30106, 0xD24972c11F91c1bB9eaEe97ec96bB9c33cF7af24); // avalanche-mainnet + _registerDVN("Tapioca", 30101, 0xD24972c11F91c1bB9eaEe97ec96bB9c33cF7af24); // ethereum-mainnet + _registerDVN("Tapioca", 30111, 0xabC9b1819cc4D9846550F928B985993cF6240439); // optimism-mainnet + + // USDT0 + _registerDVN("USDT0", 30110, 0xa8b8575fA41c305953F519C7D288cd7741727C7b); // arbitrum-mainnet + _registerDVN("USDT0", 30106, 0x375C76c6E8ec55A358e6A8c72fe233d0D4a96bEE); // avalanche-mainnet + _registerDVN("USDT0", 30362, 0xd01ae6905d48315f7bE10C7330aeCF8360Ef5b12); // bera-mainnet + _registerDVN("USDT0", 30102, 0x72F697797aC173F09eDa73Dd9C11a141376d2b57); // bsc-mainnet + _registerDVN("USDT0", 30125, 0x18f76f0d8CCD176BbE59B3870fa486d1Fff87026); // celo-mainnet + _registerDVN("USDT0", 30212, 0x38179D3BFa6Ef1d69A8A7b0b671BA3D8836B2AE8); // conflux-mainnet + _registerDVN("USDT0", 30101, 0x3b0531eB02Ab4aD72e7a531180beeF9493a00dD2); // ethereum-mainnet + _registerDVN("USDT0", 30295, 0x7cEc38c06a2FEC9Fd525B1925544110204CbB5f6); // flare-mainnet + _registerDVN("USDT0", 30316, 0x9d5D4983C4ed9253E920Aa82bE9436F1FbeAe0c0); // hedera-mainnet + _registerDVN("USDT0", 30367, 0xaE016a939935D6fe6185900d4c7C7C9b27366caC); // hyperliquid-mainnet + _registerDVN("USDT0", 30339, 0xDF44a1594d3D516f7CDFb4DC275a79a5F6e3Db1d); // ink-mainnet + _registerDVN("USDT0", 30181, 0xb832B06aB57da86AfBD6a1AF9857703D548fb37d); // mantle-mainnet + _registerDVN("USDT0", 30390, 0x2DCbD79F38D6871232422db88EC29e8D97135Ac7); // monad-mainnet + _registerDVN("USDT0", 30331, 0x91f93749e44C7b6510dcD236aeADE39dFc901D49); // mp1-mainnet + _registerDVN("USDT0", 30111, 0x947Bb89919d1E5996d6C46223626AC2E97BcF8A3); // optimism-mainnet + _registerDVN("USDT0", 30383, 0xdCdd4628F858b45260C31D6ad076bD2C3D3c2f73); // plasma-mainnet + _registerDVN("USDT0", 30109, 0xdD3d71FF05D9206C69c667D22b3a0970009780e4); // polygon-mainnet + _registerDVN("USDT0", 30333, 0xBABbb709b3CefE563f2aB14898a53301686D48b9); // rootstock-mainnet + _registerDVN("USDT0", 30280, 0x8EfB6b7dC61C6B6638714747d5E6B81a3512b5C3); // sei-mainnet + _registerDVN("USDT0", 30396, 0x8D77D35604A9f37f488E41D1d916b2A0088F82Dd); // stable-mainnet + _registerDVN("USDT0", 30320, 0x208894346d2995A26493f8C2a5b04fB1ee41A899); // unichain-mainnet + _registerDVN("USDT0", 30274, 0x6De0D56e2d695dB9E2B4FBEcA3D81372c59848BB); // xlayer-mainnet + + // Ubisoft + _registerDVN("Ubisoft", 30324, 0x62aA89bAd332788021F6F4F4Fb196D5Fe59C27a6); // abstract-mainnet + _registerDVN("Ubisoft", 30110, 0x77aAF86B4466A67869667BaBe02c6Ebe7E7791d6); // arbitrum-mainnet + _registerDVN("Ubisoft", 30106, 0xc86D023C11c5e8aA731F40b65158590624d242aF); // avalanche-mainnet + _registerDVN("Ubisoft", 30184, 0x505E855810cb243b2f23e95fdbb8F28d22F87a8C); // base-mainnet + _registerDVN("Ubisoft", 30101, 0xcc9da5B157eD87e24A9cF562E6A7C05D3C3deCD3); // ethereum-mainnet + _registerDVN("Ubisoft", 30265, 0x60aF1C48AbD2F6013e06269292a77B3285e984b9); // homeverse-mainnet + _registerDVN("Ubisoft", 30111, 0x51ACCFB59e4BDA0F8324934f9789e9Ea19fBEff4); // optimism-mainnet + _registerDVN("Ubisoft", 30216, 0xa51cE237FaFA3052D5d3308Df38A024724Bb1274); // xpla-mainnet + _registerDVN("Ubisoft", 30158, 0xD074B6bbCBEC2f2B4c4265DE3D95e521f82bF669); // zkpolygon-mainnet + _registerDVN("Ubisoft", 30165, 0x02A7Bf7298D17C12181578fF474c17C922aAd75A); // zksync-mainnet + + // WBTC Canary + _registerDVN("WBTC Canary", 30110, 0xeCB3ac94976F11a53ae74Af1f36FB89E247FAEEF); // arbitrum-mainnet + _registerDVN("WBTC Canary", 30106, 0x6995acD4AE604f8f334F5309A75232544F78E0c9); // avalanche-mainnet + _registerDVN("WBTC Canary", 30184, 0x4873d56816F45eF341a8819d7039E4746Ed77C21); // base-mainnet + _registerDVN("WBTC Canary", 30362, 0x575d0De08426223896d9Cd4bBaF4C02C9a7Dc8c6); // bera-mainnet + _registerDVN("WBTC Canary", 30279, 0x8bAFe0299CB4D3fF75d3f7045554474Bf414FD11); // bob-mainnet + _registerDVN("WBTC Canary", 30102, 0xd29dCf66E264aA7d6833BdaC6b9279791a7c246B); // bsc-mainnet + _registerDVN("WBTC Canary", 30101, 0x89CA15937e1033AF26Fe4C5e976216E8C8179408); // ethereum-mainnet + _registerDVN("WBTC Canary", 30336, 0xbbDc8C15936e5ce33FFBcAF1Aba2A8F17e31eFB5); // flow-mainnet + _registerDVN("WBTC Canary", 30316, 0x8EfB6b7dC61C6B6638714747d5E6B81a3512b5C3); // hedera-mainnet + _registerDVN("WBTC Canary", 30382, 0xDd7B5E1dB4AaFd5C8EC3b764eFB8ed265Aa5445B); // humanity-mainnet + _registerDVN("WBTC Canary", 30390, 0x6398E91001Cc1682bBA103E6B2489Fa5675a5a64); // monad-mainnet + _registerDVN("WBTC Canary", 30388, 0xE40D78243074711E21cA5290eE190062BdCe09B5); // og-mainnet + _registerDVN("WBTC Canary", 30202, 0xeFdC8b6E2757118dE5990260D2A4eF39d31f9e49); // opbnb-mainnet + _registerDVN("WBTC Canary", 30111, 0x6F798D30577c91E8F9291e82e633Dbe4dCe16b93); // optimism-mainnet + _registerDVN("WBTC Canary", 30383, 0x3b65E87E2A4690f14cae0483014259DeD8215adc); // plasma-mainnet + _registerDVN("WBTC Canary", 30280, 0xf2e89Ed7E342c708BA8CD79b293AD9244f5FCcb3); // sei-mainnet + _registerDVN("WBTC Canary", 30340, 0x1176B42A5c76b41e0895705af028ff8A75c08156); // soneium-mainnet + _registerDVN("WBTC Canary", 30332, 0x87a4d47918e83Df0fcF6040dBdC358119f7deb2a); // sonic-mainnet + _registerDVN("WBTC Canary", 30335, 0x4d09C99ED8788b191144D6Cdd129014FDe70326f); // swell-mainnet + _registerDVN("WBTC Canary", 30199, 0xd2750419b4a663c8Ff8f7B6067885D82f299aCe9); // telos-mainnet + _registerDVN("WBTC Canary", 30320, 0x148aE5e1df44Cf8b6D258430Eab79b28d0da4Aa6); // unichain-mainnet + + // Wyoming + _registerDVN("Wyoming", 30110, 0xcB1b1d524D013a32E976A5963bd541C388Ec0517); // arbitrum-mainnet + _registerDVN("Wyoming", 30106, 0xDa4428ff0f15B9D92C39aE08c4fc2F1216662c2f); // avalanche-mainnet + _registerDVN("Wyoming", 30184, 0xF80285eFb7518d5c79F4e98E3bAA59dA5eE79621); // base-mainnet + _registerDVN("Wyoming", 30101, 0x6C70Db9CE65fA37499C1f1A150A6440fC9c7273A); // ethereum-mainnet + _registerDVN("Wyoming", 30111, 0x94eC5934Daa761d7597B76fD0fecf8385De143be); // optimism-mainnet + _registerDVN("Wyoming", 30109, 0xf6cB110b0334825797B9b733060229C68e5D8bef); // polygon-mainnet + + // Zeeve + _registerDVN("Zeeve", 30110, 0x7151c89f6ba70d6aB845289E4ec706530FfAF3CB); // arbitrum-mainnet + _registerDVN("Zeeve", 30106, 0x65c41255c7f49A4B728676A0Ede4a1329Ff6911A); // avalanche-mainnet + _registerDVN("Zeeve", 30184, 0x6b34E842175C701F488E2Dd335A98caAEc49593F); // base-mainnet + _registerDVN("Zeeve", 30102, 0x92453Ce02159F774f1c846a4A0693008ED020F59); // bsc-mainnet + _registerDVN("Zeeve", 30101, 0x02041731CB8CBAe90838BB8632c359fC0c2b0775); // ethereum-mainnet + _registerDVN("Zeeve", 30292, 0x1e023Ed98a1236FB30054bA1317bB82c3C37785F); // etherlink-mainnet + _registerDVN("Zeeve", 30111, 0x4873d56816F45eF341a8819d7039E4746Ed77C21); // optimism-mainnet + } + + /// @notice Register chain name to EID mappings + function _registerChainMappings() private { + _chainNameToEid["abstract-mainnet"] = 30324; + _eidToChainName[30324] = "abstract-mainnet"; + _chainNameToEid["animechain-mainnet"] = 30372; + _eidToChainName[30372] = "animechain-mainnet"; + _chainNameToEid["ape-mainnet"] = 30312; + _eidToChainName[30312] = "ape-mainnet"; + _chainNameToEid["apexfusionnexus-mainnet"] = 30384; + _eidToChainName[30384] = "apexfusionnexus-mainnet"; + _chainNameToEid["arbitrum-mainnet"] = 30110; + _eidToChainName[30110] = "arbitrum-mainnet"; + _chainNameToEid["astar-mainnet"] = 30210; + _eidToChainName[30210] = "astar-mainnet"; + _chainNameToEid["aurora-mainnet"] = 30211; + _eidToChainName[30211] = "aurora-mainnet"; + _chainNameToEid["avalanche-mainnet"] = 30106; + _eidToChainName[30106] = "avalanche-mainnet"; + _chainNameToEid["bahamut-mainnet"] = 30363; + _eidToChainName[30363] = "bahamut-mainnet"; + _chainNameToEid["base-mainnet"] = 30184; + _eidToChainName[30184] = "base-mainnet"; + _chainNameToEid["bb1-mainnet"] = 30234; + _eidToChainName[30234] = "bb1-mainnet"; + _chainNameToEid["bera-mainnet"] = 30362; + _eidToChainName[30362] = "bera-mainnet"; + _chainNameToEid["bevm-mainnet"] = 30317; + _eidToChainName[30317] = "bevm-mainnet"; + _chainNameToEid["bitlayer-mainnet"] = 30314; + _eidToChainName[30314] = "bitlayer-mainnet"; + _chainNameToEid["blast-mainnet"] = 30243; + _eidToChainName[30243] = "blast-mainnet"; + _chainNameToEid["bob-mainnet"] = 30279; + _eidToChainName[30279] = "bob-mainnet"; + _chainNameToEid["botanix-mainnet"] = 30376; + _eidToChainName[30376] = "botanix-mainnet"; + _chainNameToEid["bouncebit-mainnet"] = 30293; + _eidToChainName[30293] = "bouncebit-mainnet"; + _chainNameToEid["bsc-mainnet"] = 30102; + _eidToChainName[30102] = "bsc-mainnet"; + _chainNameToEid["camp-mainnet"] = 30381; + _eidToChainName[30381] = "camp-mainnet"; + _chainNameToEid["canto-mainnet"] = 30159; + _eidToChainName[30159] = "canto-mainnet"; + _chainNameToEid["celo-mainnet"] = 30125; + _eidToChainName[30125] = "celo-mainnet"; + _chainNameToEid["codex-mainnet"] = 30323; + _eidToChainName[30323] = "codex-mainnet"; + _chainNameToEid["concrete-mainnet"] = 30366; + _eidToChainName[30366] = "concrete-mainnet"; + _chainNameToEid["conflux-mainnet"] = 30212; + _eidToChainName[30212] = "conflux-mainnet"; + _chainNameToEid["converge-mainnet"] = 30400; + _eidToChainName[30400] = "converge-mainnet"; + _chainNameToEid["coredao-mainnet"] = 30153; + _eidToChainName[30153] = "coredao-mainnet"; + _chainNameToEid["cronosevm-mainnet"] = 30359; + _eidToChainName[30359] = "cronosevm-mainnet"; + _chainNameToEid["cronoszkevm-mainnet"] = 30360; + _eidToChainName[30360] = "cronoszkevm-mainnet"; + _chainNameToEid["cyber-mainnet"] = 30283; + _eidToChainName[30283] = "cyber-mainnet"; + _chainNameToEid["degen-mainnet"] = 30267; + _eidToChainName[30267] = "degen-mainnet"; + _chainNameToEid["dexalot-mainnet"] = 30118; + _eidToChainName[30118] = "dexalot-mainnet"; + _chainNameToEid["dfk-mainnet"] = 30115; + _eidToChainName[30115] = "dfk-mainnet"; + _chainNameToEid["dinari-mainnet"] = 30385; + _eidToChainName[30385] = "dinari-mainnet"; + _chainNameToEid["dm2verse-mainnet"] = 30315; + _eidToChainName[30315] = "dm2verse-mainnet"; + _chainNameToEid["doma-mainnet"] = 30393; + _eidToChainName[30393] = "doma-mainnet"; + _chainNameToEid["dos-mainnet"] = 30149; + _eidToChainName[30149] = "dos-mainnet"; + _chainNameToEid["ebi-mainnet"] = 30282; + _eidToChainName[30282] = "ebi-mainnet"; + _chainNameToEid["edu-mainnet"] = 30328; + _eidToChainName[30328] = "edu-mainnet"; + _chainNameToEid["eon-mainnet"] = 30215; + _eidToChainName[30215] = "eon-mainnet"; + _chainNameToEid["ethereal-mainnet"] = 30391; + _eidToChainName[30391] = "ethereal-mainnet"; + _chainNameToEid["ethereum-mainnet"] = 30101; + _eidToChainName[30101] = "ethereum-mainnet"; + _chainNameToEid["etherlink-mainnet"] = 30292; + _eidToChainName[30292] = "etherlink-mainnet"; + _chainNameToEid["fantom-mainnet"] = 30112; + _eidToChainName[30112] = "fantom-mainnet"; + _chainNameToEid["flare-mainnet"] = 30295; + _eidToChainName[30295] = "flare-mainnet"; + _chainNameToEid["flow-mainnet"] = 30336; + _eidToChainName[30336] = "flow-mainnet"; + _chainNameToEid["fraxtal-mainnet"] = 30255; + _eidToChainName[30255] = "fraxtal-mainnet"; + _chainNameToEid["fuse-mainnet"] = 30138; + _eidToChainName[30138] = "fuse-mainnet"; + _chainNameToEid["gatelayer-mainnet"] = 30389; + _eidToChainName[30389] = "gatelayer-mainnet"; + _chainNameToEid["glue-mainnet"] = 30342; + _eidToChainName[30342] = "glue-mainnet"; + _chainNameToEid["gnosis-mainnet"] = 30145; + _eidToChainName[30145] = "gnosis-mainnet"; + _chainNameToEid["goat-mainnet"] = 30361; + _eidToChainName[30361] = "goat-mainnet"; + _chainNameToEid["gravity-mainnet"] = 30294; + _eidToChainName[30294] = "gravity-mainnet"; + _chainNameToEid["gunz-mainnet"] = 30371; + _eidToChainName[30371] = "gunz-mainnet"; + _chainNameToEid["harmony-mainnet"] = 30116; + _eidToChainName[30116] = "harmony-mainnet"; + _chainNameToEid["hedera-mainnet"] = 30316; + _eidToChainName[30316] = "hedera-mainnet"; + _chainNameToEid["hemi-mainnet"] = 30329; + _eidToChainName[30329] = "hemi-mainnet"; + _chainNameToEid["homeverse-mainnet"] = 30265; + _eidToChainName[30265] = "homeverse-mainnet"; + _chainNameToEid["hubble-mainnet"] = 30182; + _eidToChainName[30182] = "hubble-mainnet"; + _chainNameToEid["humanity-mainnet"] = 30382; + _eidToChainName[30382] = "humanity-mainnet"; + _chainNameToEid["hyperliquid-mainnet"] = 30367; + _eidToChainName[30367] = "hyperliquid-mainnet"; + _chainNameToEid["injectiveevm-mainnet"] = 30394; + _eidToChainName[30394] = "injectiveevm-mainnet"; + _chainNameToEid["ink-mainnet"] = 30339; + _eidToChainName[30339] = "ink-mainnet"; + _chainNameToEid["iota-mainnet"] = 30284; + _eidToChainName[30284] = "iota-mainnet"; + _chainNameToEid["islander-mainnet"] = 30330; + _eidToChainName[30330] = "islander-mainnet"; + _chainNameToEid["joc-mainnet"] = 30285; + _eidToChainName[30285] = "joc-mainnet"; + _chainNameToEid["katana-mainnet"] = 30375; + _eidToChainName[30375] = "katana-mainnet"; + _chainNameToEid["kava-mainnet"] = 30177; + _eidToChainName[30177] = "kava-mainnet"; + _chainNameToEid["klaytn-mainnet"] = 30150; + _eidToChainName[30150] = "klaytn-mainnet"; + _chainNameToEid["lens-mainnet"] = 30373; + _eidToChainName[30373] = "lens-mainnet"; + _chainNameToEid["lightlink-mainnet"] = 30309; + _eidToChainName[30309] = "lightlink-mainnet"; + _chainNameToEid["lisk-mainnet"] = 30321; + _eidToChainName[30321] = "lisk-mainnet"; + _chainNameToEid["loot-mainnet"] = 30197; + _eidToChainName[30197] = "loot-mainnet"; + _chainNameToEid["lyra-mainnet"] = 30311; + _eidToChainName[30311] = "lyra-mainnet"; + _chainNameToEid["manta-mainnet"] = 30217; + _eidToChainName[30217] = "manta-mainnet"; + _chainNameToEid["mantle-mainnet"] = 30181; + _eidToChainName[30181] = "mantle-mainnet"; + _chainNameToEid["masa-mainnet"] = 30263; + _eidToChainName[30263] = "masa-mainnet"; + _chainNameToEid["meritcircle-mainnet"] = 30198; + _eidToChainName[30198] = "meritcircle-mainnet"; + _chainNameToEid["merlin-mainnet"] = 30266; + _eidToChainName[30266] = "merlin-mainnet"; + _chainNameToEid["meter-mainnet"] = 30176; + _eidToChainName[30176] = "meter-mainnet"; + _chainNameToEid["metis-mainnet"] = 30151; + _eidToChainName[30151] = "metis-mainnet"; + _chainNameToEid["mode-mainnet"] = 30260; + _eidToChainName[30260] = "mode-mainnet"; + _chainNameToEid["monad-mainnet"] = 30390; + _eidToChainName[30390] = "monad-mainnet"; + _chainNameToEid["moonbeam-mainnet"] = 30126; + _eidToChainName[30126] = "moonbeam-mainnet"; + _chainNameToEid["moonriver-mainnet"] = 30167; + _eidToChainName[30167] = "moonriver-mainnet"; + _chainNameToEid["morph-mainnet"] = 30322; + _eidToChainName[30322] = "morph-mainnet"; + _chainNameToEid["mp1-mainnet"] = 30331; + _eidToChainName[30331] = "mp1-mainnet"; + _chainNameToEid["nexera-mainnet"] = 30395; + _eidToChainName[30395] = "nexera-mainnet"; + _chainNameToEid["nibiru-mainnet"] = 30369; + _eidToChainName[30369] = "nibiru-mainnet"; + _chainNameToEid["nova-mainnet"] = 30175; + _eidToChainName[30175] = "nova-mainnet"; + _chainNameToEid["og-mainnet"] = 30388; + _eidToChainName[30388] = "og-mainnet"; + _chainNameToEid["okx-mainnet"] = 30155; + _eidToChainName[30155] = "okx-mainnet"; + _chainNameToEid["opbnb-mainnet"] = 30202; + _eidToChainName[30202] = "opbnb-mainnet"; + _chainNameToEid["openledger-mainnet"] = 30392; + _eidToChainName[30392] = "openledger-mainnet"; + _chainNameToEid["optimism-mainnet"] = 30111; + _eidToChainName[30111] = "optimism-mainnet"; + _chainNameToEid["orderly-mainnet"] = 30213; + _eidToChainName[30213] = "orderly-mainnet"; + _chainNameToEid["peaq-mainnet"] = 30302; + _eidToChainName[30302] = "peaq-mainnet"; + _chainNameToEid["pgn-mainnet"] = 30218; + _eidToChainName[30218] = "pgn-mainnet"; + _chainNameToEid["plasma-mainnet"] = 30383; + _eidToChainName[30383] = "plasma-mainnet"; + _chainNameToEid["plume-mainnet"] = 30318; + _eidToChainName[30318] = "plume-mainnet"; + _chainNameToEid["plumephoenix-mainnet"] = 30370; + _eidToChainName[30370] = "plumephoenix-mainnet"; + _chainNameToEid["polygon-mainnet"] = 30109; + _eidToChainName[30109] = "polygon-mainnet"; + _chainNameToEid["rarible-mainnet"] = 30235; + _eidToChainName[30235] = "rarible-mainnet"; + _chainNameToEid["real-mainnet"] = 30237; + _eidToChainName[30237] = "real-mainnet"; + _chainNameToEid["reya-mainnet"] = 30313; + _eidToChainName[30313] = "reya-mainnet"; + _chainNameToEid["rootstock-mainnet"] = 30333; + _eidToChainName[30333] = "rootstock-mainnet"; + _chainNameToEid["sanko-mainnet"] = 30278; + _eidToChainName[30278] = "sanko-mainnet"; + _chainNameToEid["scroll-mainnet"] = 30214; + _eidToChainName[30214] = "scroll-mainnet"; + _chainNameToEid["sei-mainnet"] = 30280; + _eidToChainName[30280] = "sei-mainnet"; + _chainNameToEid["shimmer-mainnet"] = 30230; + _eidToChainName[30230] = "shimmer-mainnet"; + _chainNameToEid["shrapnel-mainnet"] = 30148; + _eidToChainName[30148] = "shrapnel-mainnet"; + _chainNameToEid["silicon-mainnet"] = 30379; + _eidToChainName[30379] = "silicon-mainnet"; + _chainNameToEid["skale-mainnet"] = 30273; + _eidToChainName[30273] = "skale-mainnet"; + _chainNameToEid["somnia-mainnet"] = 30380; + _eidToChainName[30380] = "somnia-mainnet"; + _chainNameToEid["soneium-mainnet"] = 30340; + _eidToChainName[30340] = "soneium-mainnet"; + _chainNameToEid["sonic-mainnet"] = 30332; + _eidToChainName[30332] = "sonic-mainnet"; + _chainNameToEid["sophon-mainnet"] = 30334; + _eidToChainName[30334] = "sophon-mainnet"; + _chainNameToEid["space-mainnet"] = 30341; + _eidToChainName[30341] = "space-mainnet"; + _chainNameToEid["stable-mainnet"] = 30396; + _eidToChainName[30396] = "stable-mainnet"; + _chainNameToEid["story-mainnet"] = 30364; + _eidToChainName[30364] = "story-mainnet"; + _chainNameToEid["subtensorevm-mainnet"] = 30374; + _eidToChainName[30374] = "subtensorevm-mainnet"; + _chainNameToEid["superposition-mainnet"] = 30327; + _eidToChainName[30327] = "superposition-mainnet"; + _chainNameToEid["swell-mainnet"] = 30335; + _eidToChainName[30335] = "swell-mainnet"; + _chainNameToEid["tac-mainnet"] = 30377; + _eidToChainName[30377] = "tac-mainnet"; + _chainNameToEid["taiko-mainnet"] = 30290; + _eidToChainName[30290] = "taiko-mainnet"; + _chainNameToEid["telos-mainnet"] = 30199; + _eidToChainName[30199] = "telos-mainnet"; + _chainNameToEid["tenet-mainnet"] = 30173; + _eidToChainName[30173] = "tenet-mainnet"; + _chainNameToEid["tiltyard-mainnet"] = 30238; + _eidToChainName[30238] = "tiltyard-mainnet"; + _chainNameToEid["tomo-mainnet"] = 30196; + _eidToChainName[30196] = "tomo-mainnet"; + _chainNameToEid["unichain-mainnet"] = 30320; + _eidToChainName[30320] = "unichain-mainnet"; + _chainNameToEid["worldchain-mainnet"] = 30319; + _eidToChainName[30319] = "worldchain-mainnet"; + _chainNameToEid["xai-mainnet"] = 30236; + _eidToChainName[30236] = "xai-mainnet"; + _chainNameToEid["xchain-mainnet"] = 30291; + _eidToChainName[30291] = "xchain-mainnet"; + _chainNameToEid["xdc-mainnet"] = 30365; + _eidToChainName[30365] = "xdc-mainnet"; + _chainNameToEid["xlayer-mainnet"] = 30274; + _eidToChainName[30274] = "xlayer-mainnet"; + _chainNameToEid["xpla-mainnet"] = 30216; + _eidToChainName[30216] = "xpla-mainnet"; + _chainNameToEid["zircuit-mainnet"] = 30303; + _eidToChainName[30303] = "zircuit-mainnet"; + _chainNameToEid["zkatana-mainnet"] = 30257; + _eidToChainName[30257] = "zkatana-mainnet"; + _chainNameToEid["zkconsensys-mainnet"] = 30183; + _eidToChainName[30183] = "zkconsensys-mainnet"; + _chainNameToEid["zklink-mainnet"] = 30301; + _eidToChainName[30301] = "zklink-mainnet"; + _chainNameToEid["zkpolygon-mainnet"] = 30158; + _eidToChainName[30158] = "zkpolygon-mainnet"; + _chainNameToEid["zksync-mainnet"] = 30165; + _eidToChainName[30165] = "zksync-mainnet"; + _chainNameToEid["zkverify-mainnet"] = 30386; + _eidToChainName[30386] = "zkverify-mainnet"; + _chainNameToEid["zora-mainnet"] = 30195; + _eidToChainName[30195] = "zora-mainnet"; + } + + /// @notice Register a single DVN + function _registerDVN(string memory dvnName, uint32 eid, address dvnAddress) private { + _dvnAddresses[dvnName][eid] = dvnAddress; + + // Track unique DVN names + if (!_dvnNameExists[dvnName]) { + _dvnNameExists[dvnName] = true; + _dvnNames.push(dvnName); + } + + // Track DVNs per chain + _dvnsByChain[eid].push(dvnName); + } + + function getDVNAddress(string memory dvnName, uint32 eid) public view returns (address dvnAddress) { + dvnAddress = _dvnAddresses[dvnName][eid]; + require(dvnAddress != address(0), string.concat("DVN not found: ", dvnName, " on chain ", _toString(eid))); + } + + function getDVNAddressByChainName(string memory dvnName, string memory chainName) public view returns (address dvnAddress) { + uint32 eid = _chainNameToEid[chainName]; + require(eid != 0, string.concat("Unknown chain: ", chainName)); + return getDVNAddress(dvnName, eid); + } + + function dvnExists(string memory dvnName, uint32 eid) public view returns (bool exists) { + return _dvnAddresses[dvnName][eid] != address(0); + } + + function getAvailableDVNs() public view returns (string[] memory dvnNames) { + return _dvnNames; + } + + function getDVNsForChain(uint32 eid) public view returns (string[] memory names, address[] memory addresses) { + names = _dvnsByChain[eid]; + addresses = new address[](names.length); + + for (uint256 i = 0; i < names.length; i++) { + addresses[i] = _dvnAddresses[names[i]][eid]; + } + } + + function getDVNsForChainByName(string memory chainName) public view returns (string[] memory names, address[] memory addresses) { + uint32 eid = _chainNameToEid[chainName]; + require(eid != 0, string.concat("Unknown chain: ", chainName)); + return getDVNsForChain(eid); + } + + /// @notice Convert uint to string (helper function) + function _toString(uint256 value) private pure returns (string memory) { + if (value == 0) { + return "0"; + } + uint256 temp = value; + uint256 digits; + while (temp != 0) { + digits++; + temp /= 10; + } + bytes memory buffer = new bytes(digits); + while (value != 0) { + digits -= 1; + buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); + value /= 10; + } + return string(buffer); + } +} \ No newline at end of file diff --git a/protocol-units/settlement/mcr/contracts/layerzero_book/interfaces/ILZProtocol.sol b/protocol-units/settlement/mcr/contracts/layerzero_book/interfaces/ILZProtocol.sol new file mode 100644 index 000000000..5da3289e3 --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/layerzero_book/interfaces/ILZProtocol.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.22; + +/// @title ILZProtocol +/// @notice Interface for LayerZero Protocol Address Provider +interface ILZProtocol { + struct ProtocolAddresses { + address endpointV2; + address sendUln302; + address receiveUln302; + address executor; + uint256 chainId; + string chainName; + bool exists; + } + + function getProtocolAddresses(uint32 eid) external view returns (ProtocolAddresses memory); + function getEidByChainId(uint256 chainId) external view returns (uint32); + function isChainSupported(uint32 eid) external view returns (bool); + function getSupportedEids() external view returns (uint32[] memory); +} diff --git a/protocol-units/settlement/mcr/contracts/layerzero_book/interfaces/ILZWorkers.sol b/protocol-units/settlement/mcr/contracts/layerzero_book/interfaces/ILZWorkers.sol new file mode 100644 index 000000000..382325b82 --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/layerzero_book/interfaces/ILZWorkers.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.22; + +/// @title ILZWorkers +/// @notice Interface for LayerZero Workers Registry +interface ILZWorkers { + function getDVNAddress(string memory dvnName, uint32 eid) external view returns (address dvnAddress); + function getDVNAddressByChainName(string memory dvnName, string memory chainName) external view returns (address dvnAddress); + function dvnExists(string memory dvnName, uint32 eid) external view returns (bool exists); + function getAvailableDVNs() external view returns (string[] memory dvnNames); + function getDVNsForChain(uint32 eid) external view returns (string[] memory names, address[] memory addresses); + function getDVNsForChainByName(string memory chainName) external view returns (string[] memory names, address[] memory addresses); +} diff --git a/protocol-units/settlement/mcr/contracts/layerzero_book/layerzero_book.py b/protocol-units/settlement/mcr/contracts/layerzero_book/layerzero_book.py new file mode 100644 index 000000000..64868cbea --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/layerzero_book/layerzero_book.py @@ -0,0 +1,908 @@ +#!/usr/bin/env python3 +""" +Generate LayerZero V2 Address Book Solidity contracts from metadata API. + +This script fetches deployment data from LayerZero's metadata API and generates +Solidity library contracts following the Aave address book pattern. +""" + +import json +import requests +from typing import Dict, Any, List, Optional +import re +from web3 import Web3 +import hashlib +from datetime import datetime + +# Constants +METADATA_URL = "https://metadata.layerzero-api.com/v1/metadata/deployments" +SOLIDITY_HEADER = """// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +// Auto-generated from LayerZero metadata - do not edit manually +// Source: https://metadata.layerzero-api.com/v1/metadata/deployments + +import {ILayerZeroEndpointV2} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import {IMessageLib} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLib.sol"; +""" + +# Map of contract names to their expected types +CONTRACT_TYPES = { + "endpoint": "ILayerZeroEndpointV2", + "endpointV2": "ILayerZeroEndpointV2", + "sendUln301": "IMessageLib", + "receiveUln301": "IMessageLib", + "sendUln302": "IMessageLib", + "receiveUln302": "IMessageLib", + "readLib1002": "IMessageLib", +} + +def to_checksum_address(address: str) -> str: + """Convert address to EIP-55 checksum format.""" + # Skip if not a valid Ethereum address (must be 42 chars including 0x) + if not address or len(address) != 42: + return address + try: + return Web3.to_checksum_address(address) + except ValueError: + # If it's not a valid address, return as-is + return address + +def to_pascal_case(snake_str: str) -> str: + """Convert snake_case or kebab-case to PascalCase.""" + # Replace hyphens with underscores for uniform processing + snake_str = snake_str.replace('-', '_') + # Split by underscore and capitalize each part + parts = snake_str.split('_') + return ''.join(word.capitalize() for word in parts) + +def sanitize_chain_name(chain_key: str) -> str: + """Sanitize chain key to valid Solidity identifier.""" + # Keep the full chain name to avoid duplicates + # Just convert to PascalCase without removing suffixes + return to_pascal_case(chain_key) + +def sanitize_dvn_name(canonical_name: str) -> str: + """Convert DVN canonical name to valid Solidity constant name.""" + # Handle special cases + special_cases = { + "LayerZero Labs": "LAYERZERO_LABS", + "LZDeadDVN": "LZ_DEAD", + "TSS": "TSS", + "01node": "01NODE", + "P-OPS Team": "P_OPS_TEAM", + "Animoca Blockdaemon": "ABDB", + "ABDB": "ABDB", + "P2P": "P2P", + } + + if canonical_name in special_cases: + return special_cases[canonical_name] + + # General conversion: uppercase and replace spaces/special chars with underscores + name = canonical_name.upper() + name = re.sub(r'[^A-Z0-9]+', '_', name) + name = name.strip('_') + + # Ensure it doesn't start with a number + if name and name[0].isdigit(): + name = 'DVN_' + name + + return name + +def generate_constant_name(key: str) -> str: + """Generate a proper constant name from a camelCase key.""" + # Special mappings + special_mappings = { + "endpointV2": "ENDPOINT_V2", + "endpointV2View": "ENDPOINT_V2_VIEW", + "relayerV2": "RELAYER_V2", + "ultraLightNodeV2": "ULTRA_LIGHT_NODE_V2", + "sendUln301": "SEND_ULN_301", + "receiveUln301": "RECEIVE_ULN_301", + "sendUln302": "SEND_ULN_302", + "receiveUln302": "RECEIVE_ULN_302", + "readLib1002": "READ_LIB_1002", + "lzExecutor": "LZ_EXECUTOR", + "deadDVN": "DEAD_DVN", + "blockedMessageLib": "BLOCKED_MESSAGE_LIB", + "nonceContract": "NONCE_CONTRACT", + } + + if key in special_mappings: + return special_mappings[key] + + # Convert camelCase to UPPER_SNAKE_CASE + result = re.sub('([a-z0-9])([A-Z])', r'\1_\2', key) + return result.upper() + +def is_valid_ethereum_address(address: str) -> bool: + """Check if the string is a valid Ethereum address.""" + if not address or not isinstance(address, str): + return False + # Ethereum addresses are 42 chars (0x + 40 hex chars) + if len(address) != 42 or not address.startswith('0x'): + return False + # Check if the rest are valid hex characters + try: + int(address[2:], 16) + return True + except ValueError: + return False + +def format_deployment_constant(key: str, address: str, contract_type: Optional[str] = None) -> str: + """Format a deployment as a Solidity constant.""" + # Skip if not a valid Ethereum address + if not is_valid_ethereum_address(address): + return None + + const_name = generate_constant_name(key) + checksum_addr = to_checksum_address(address) + + if contract_type: + return f" {contract_type} internal constant {const_name} = {contract_type}({checksum_addr});" + else: + return f" address internal constant {const_name} = {checksum_addr};" + +def generate_chain_library(chain_key: str, chain_data: Dict[str, Any]) -> Optional[str]: + """Generate a Solidity library for a single chain.""" + deployments = chain_data.get('deployments', []) + if not deployments: + return None + + # Find V2 deployment (prefer version 2) + # If multiple V2 deployments exist, prefer the one with higher EID (testnet) + v2_deployment = None + v1_deployment = None + + for deployment in deployments: + if deployment.get('version') == 2: + if v2_deployment is None: + v2_deployment = deployment + else: + # If we have multiple V2 deployments, prefer the one with higher EID + current_eid = deployment.get('eid', 0) + existing_eid = v2_deployment.get('eid', 0) + if current_eid > existing_eid: + v2_deployment = deployment + elif deployment.get('version') == 1: + v1_deployment = deployment + + # Use V2 if available, otherwise V1 + deployment = v2_deployment or v1_deployment + if not deployment: + return None + + chain_name = sanitize_chain_name(chain_key) + library_name = f"LayerZeroV2{chain_name}" + + # Start building the library + lines = [f"\nlibrary {library_name} {{"] + + # Add chain metadata + eid = deployment.get('eid', '') + chain_details = chain_data.get('chainDetails', {}) + native_chain_id = chain_details.get('nativeChainId', 0) + + if eid: + lines.append(f" // Chain metadata") + lines.append(f" uint32 internal constant EID = {eid};") + if native_chain_id: + lines.append(f" uint256 internal constant CHAIN_ID = {native_chain_id};") + lines.append(f' string internal constant CHAIN_KEY = "{chain_key}";') + lines.append("") + + # Group contracts by category + core_contracts = [] + message_libs = [] + other_contracts = [] + + # Process all contract addresses in the deployment + for key, value in deployment.items(): + if key in ['eid', 'chainKey', 'stage', 'version']: + continue + + if isinstance(value, dict) and 'address' in value: + address = value['address'] + contract_type = CONTRACT_TYPES.get(key) + + constant_line = format_deployment_constant(key, address, contract_type) + + # Skip if not a valid address + if constant_line is None: + continue + + # Categorize the constant + if key in ['endpoint', 'endpointV2']: + core_contracts.insert(0, constant_line) # Put endpoint first + elif 'Uln' in key or 'Lib' in key: + message_libs.append(constant_line) + else: + other_contracts.append(constant_line) + + # Add categorized constants + if core_contracts: + lines.append(" // Core protocol") + lines.extend(core_contracts) + if message_libs or other_contracts: + lines.append("") + + if message_libs: + lines.append(" // Message libraries") + lines.extend(message_libs) + if other_contracts: + lines.append("") + + if other_contracts: + lines.append(" // Other contracts") + lines.extend(other_contracts) + + lines.append("}") + + return "\n".join(lines) + +def generate_dvn_library(chain_key: str, dvns: Dict[str, Any]) -> Optional[str]: + """Generate a DVN library for a chain.""" + if not dvns: + return None + + chain_name = sanitize_chain_name(chain_key) + library_name = f"LayerZeroV2DVN{chain_name}" + + lines = [f"\nlibrary {library_name} {{"] + + # Track used constant names to avoid duplicates + used_names = set() + + # Sort DVNs by canonical name for consistent output + sorted_dvns = sorted(dvns.items(), key=lambda x: x[1].get('canonicalName', '')) + + for address, dvn_info in sorted_dvns: + canonical_name = dvn_info.get('canonicalName', '') + dvn_id = dvn_info.get('id', '') + deprecated = dvn_info.get('deprecated', False) + + if not canonical_name: + continue + + # Skip if not a valid Ethereum address + if not is_valid_ethereum_address(address): + continue + + # Generate constant name + base_name = f"DVN_{sanitize_dvn_name(canonical_name)}" + const_name = base_name + + # Handle duplicates by adding suffix + suffix = 2 + while const_name in used_names: + const_name = f"{base_name}_{suffix}" + suffix += 1 + + used_names.add(const_name) + checksum_addr = to_checksum_address(address) + + # Add comment with metadata + comment_parts = [canonical_name] + if deprecated: + comment_parts.append("(deprecated)") + if dvn_id: + comment_parts.append(f"[{dvn_id}]") + + lines.append(f" // {' '.join(comment_parts)}") + lines.append(f" address internal constant {const_name} = {checksum_addr};") + + lines.append("}") + + return "\n".join(lines) + +def fetch_metadata() -> Dict[str, Any]: + """Fetch metadata from LayerZero API.""" + print(f"Fetching metadata from {METADATA_URL}...") + response = requests.get(METADATA_URL) + response.raise_for_status() + return response.json() + +def generate_lz_protocol(chains_processed: List[str], metadata: Dict[str, Any]) -> str: + """Generate the LZProtocol contract.""" + registry_header = """// SPDX-License-Identifier: MIT +pragma solidity ^0.8.22; + +import "../src-gen/LZAddresses.sol"; +import "./interfaces/ILZProtocol.sol"; + +/// @title LayerZero Protocol Address Provider +/// @notice Provides LayerZero protocol addresses from the generated address book +/// @dev Implements ILZProtocol interface for clean access to core protocol addresses +contract LZProtocol is ILZProtocol { + // Storage for chain data + mapping(uint32 => ProtocolAddresses) private _protocolAddresses; + + // List of registered EIDs for iteration + uint32[] private _registeredEids; + + // Mapping from chain name to EID for reverse lookup + mapping(string => uint32) private _chainNameToEid; + + constructor() { + _registerAllChains(); + } + + /// @notice Register all supported chains from the AddressBook + function _registerAllChains() private {""" + + lines = [registry_header] + + # Group chains by category + mainnet_chains = [] + testnet_chains = [] + sandbox_chains = [] + skipped_chains = [] + + for chain_key in chains_processed: + chain_data = metadata.get(chain_key, {}) + deployments = chain_data.get('deployments', []) + + # Find V2 deployment (prefer higher EID if multiple exist) + v2_deployment = None + for deployment in deployments: + if deployment.get('version') == 2: + if v2_deployment is None: + v2_deployment = deployment + else: + # If we have multiple V2 deployments, prefer the one with higher EID + current_eid = deployment.get('eid', 0) + existing_eid = v2_deployment.get('eid', 0) + if current_eid > existing_eid: + v2_deployment = deployment + + if not v2_deployment: + continue + + # Check if chain has nativeChainId + chain_details = chain_data.get('chainDetails', {}) + native_chain_id = chain_details.get('nativeChainId', 0) + + if not native_chain_id: + skipped_chains.append(chain_key) + continue + + # Also check if v2_deployment has required addresses + required_fields = ['endpointV2', 'sendUln302', 'receiveUln302', 'executor'] + missing_fields = [] + for field in required_fields: + if field not in v2_deployment or not v2_deployment[field].get('address'): + missing_fields.append(field) + + if missing_fields: + skipped_chains.append(f"{chain_key} (missing: {', '.join(missing_fields)})") + continue + + chain_name = sanitize_chain_name(chain_key) + + if 'sandbox' in chain_key.lower(): + sandbox_chains.append((chain_key, chain_name)) + elif 'testnet' in chain_key.lower(): + testnet_chains.append((chain_key, chain_name)) + else: + mainnet_chains.append((chain_key, chain_name)) + + # Add mainnet chains + if mainnet_chains: + lines.append(" // Mainnets") + for chain_key, chain_name in sorted(mainnet_chains): + lib_name = f"LayerZeroV2{chain_name}" + lines.append(f" _registerChain({lib_name}.EID, address({lib_name}.ENDPOINT_V2), address({lib_name}.SEND_ULN_302), address({lib_name}.RECEIVE_ULN_302), {lib_name}.EXECUTOR, {lib_name}.CHAIN_ID, \"{chain_key}\");") + + # Add testnet chains + if testnet_chains: + lines.append("\n // Testnets") + for chain_key, chain_name in sorted(testnet_chains): + lib_name = f"LayerZeroV2{chain_name}" + lines.append(f" _registerChain({lib_name}.EID, address({lib_name}.ENDPOINT_V2), address({lib_name}.SEND_ULN_302), address({lib_name}.RECEIVE_ULN_302), {lib_name}.EXECUTOR, {lib_name}.CHAIN_ID, \"{chain_key}\");") + + # Add sandbox chains + if sandbox_chains: + lines.append("\n // Sandbox environments") + for chain_key, chain_name in sorted(sandbox_chains): + lib_name = f"LayerZeroV2{chain_name}" + lines.append(f" _registerChain({lib_name}.EID, address({lib_name}.ENDPOINT_V2), address({lib_name}.SEND_ULN_302), address({lib_name}.RECEIVE_ULN_302), {lib_name}.EXECUTOR, {lib_name}.CHAIN_ID, \"{chain_key}\");") + + lines.append(""" } + + /// @notice Register a single chain + function _registerChain( + uint32 eid, + address endpoint, + address sendUln, + address receiveUln, + address executor, + uint256 chainId, + string memory chainName + ) private { + _protocolAddresses[eid] = ProtocolAddresses({ + endpointV2: endpoint, + sendUln302: sendUln, + receiveUln302: receiveUln, + executor: executor, + chainId: chainId, + chainName: chainName, + exists: true + }); + _registeredEids.push(eid); + _chainNameToEid[chainName] = eid; + } + + function getProtocolAddresses(uint32 eid) public view override returns (ProtocolAddresses memory) { + ProtocolAddresses memory addresses = _protocolAddresses[eid]; + require(addresses.exists, string.concat("Chain not registered: ", _toString(eid))); + return addresses; + } + + function isChainSupported(uint32 eid) public view override returns (bool) { + return _protocolAddresses[eid].exists; + } + + function getSupportedEids() public view override returns (uint32[] memory) { + return _registeredEids; + } + + /// @notice Get EID by chain name + function getEidByChainName(string memory chainName) public view returns (uint32) { + uint32 eid = _chainNameToEid[chainName]; + require(eid != 0 || _protocolAddresses[0].exists, "Chain name not found"); + return eid; + } + + /// @notice Get EID by chain ID + function getEidByChainId(uint256 chainId) public view returns (uint32) { + // Auto-generated chain ID to EID mappings""") + + # Build chain ID to EID mappings from processed chains + chain_id_to_eid = [] + for chain_key in chains_processed: + chain_data = metadata.get(chain_key, {}) + chain_details = chain_data.get('chainDetails', {}) + native_chain_id = chain_details.get('nativeChainId', 0) + + # Find V2 deployment (prefer higher EID if multiple exist) + deployments = chain_data.get('deployments', []) + v2_deployment = None + for deployment in deployments: + if deployment.get('version') == 2: + if v2_deployment is None: + v2_deployment = deployment + else: + # If we have multiple V2 deployments, prefer the one with higher EID + current_eid = deployment.get('eid', 0) + existing_eid = v2_deployment.get('eid', 0) + if current_eid > existing_eid: + v2_deployment = deployment + + if v2_deployment and 'eid' in v2_deployment and native_chain_id: + eid = v2_deployment['eid'] + chain_id_to_eid.append((native_chain_id, eid, chain_key)) + + # Add the auto-generated chain ID mappings + for chain_id, eid, chain_key in sorted(chain_id_to_eid): + lines.append(f' if (chainId == {chain_id}) return {eid}; // {chain_key}') + + lines.append(""" + revert("Unsupported chain ID"); + } + + /// @notice Convert uint to string (helper function) + function _toString(uint256 value) private pure returns (string memory) { + if (value == 0) { + return "0"; + } + uint256 temp = value; + uint256 digits; + while (temp != 0) { + digits++; + temp /= 10; + } + bytes memory buffer = new bytes(digits); + while (value != 0) { + digits -= 1; + buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); + value /= 10; + } + return string(buffer); + } +}""") + + return "\n".join(lines) + +def generate_lz_workers(chains_processed: List[str], metadata: Dict[str, Any]) -> str: + """Generate the LZWorkers contract.""" + registry_header = """// SPDX-License-Identifier: MIT +pragma solidity ^0.8.22; + +import "./interfaces/ILZWorkers.sol"; + +/// @title LayerZero Workers Registry +/// @notice Provides a registry of worker addresses (DVNs, executors) indexed by name and chain +/// @dev Maps worker names to their addresses on each chain for easy lookup +contract LZWorkers is ILZWorkers { + // Storage: nested mapping for efficient lookups (dvnName => eid => address) + mapping(string => mapping(uint32 => address)) private _dvnAddresses; + + // List of all DVN names for enumeration + string[] private _dvnNames; + mapping(string => bool) private _dvnNameExists; + + // Reverse mapping for chain name lookups + mapping(string => uint32) private _chainNameToEid; + mapping(uint32 => string) private _eidToChainName; + + // Track DVNs per chain for enumeration + mapping(uint32 => string[]) private _dvnsByChain; + + constructor() { + _registerAllDVNs(); + _registerChainMappings(); + } + + /// @notice Register all DVNs from metadata + function _registerAllDVNs() private {""" + + lines = [registry_header] + + # Collect all unique DVN names across all chains + all_dvns = {} # canonical_name -> chain_key -> address + + for chain_key in chains_processed: + chain_data = metadata.get(chain_key, {}) + dvns = chain_data.get('dvns', {}) + + # Get V2 deployment for EID (prefer higher EID if multiple exist) + deployments = chain_data.get('deployments', []) + v2_deployment = None + for deployment in deployments: + if deployment.get('version') == 2: + if v2_deployment is None: + v2_deployment = deployment + else: + # If we have multiple V2 deployments, prefer the one with higher EID + current_eid = deployment.get('eid', 0) + existing_eid = v2_deployment.get('eid', 0) + if current_eid > existing_eid: + v2_deployment = deployment + + if not v2_deployment or 'eid' not in v2_deployment: + continue + + eid = v2_deployment['eid'] + + for address, dvn_info in dvns.items(): + canonical_name = dvn_info.get('canonicalName', '') + deprecated = dvn_info.get('deprecated', False) + lz_read_compatible = dvn_info.get('lzReadCompatible', False) + + # Skip if no canonical name, deprecated, or read-only + if not canonical_name or deprecated or lz_read_compatible: + continue + + # Skip if not a valid Ethereum address + if not is_valid_ethereum_address(address): + continue + + # Initialize DVN entry if needed + if canonical_name not in all_dvns: + all_dvns[canonical_name] = {} + + # Store the address for this chain + all_dvns[canonical_name][chain_key] = { + 'address': to_checksum_address(address), + 'eid': eid + } + + # Sort DVNs by canonical name for consistent output + sorted_dvn_names = sorted(all_dvns.keys()) + + # Group registrations by DVN + for dvn_name in sorted_dvn_names: + lines.append(f"\n // {dvn_name}") + chain_entries = all_dvns[dvn_name] + + # Sort chains for consistent output + for chain_key in sorted(chain_entries.keys()): + entry = chain_entries[chain_key] + lines.append(f' _registerDVN("{dvn_name}", {entry["eid"]}, {entry["address"]}); // {chain_key}') + + lines.append(""" } + + /// @notice Register chain name to EID mappings + function _registerChainMappings() private {""") + + # Add chain mappings and collect for getEidByChainId + chain_mappings = [] + chain_id_to_eid = [] # For getEidByChainId function + + for chain_key in chains_processed: + chain_data = metadata.get(chain_key, {}) + deployments = chain_data.get('deployments', []) + chain_details = chain_data.get('chainDetails', {}) + native_chain_id = chain_details.get('nativeChainId', 0) + + v2_deployment = None + for deployment in deployments: + if deployment.get('version') == 2: + if v2_deployment is None: + v2_deployment = deployment + else: + # If we have multiple V2 deployments, prefer the one with higher EID + current_eid = deployment.get('eid', 0) + existing_eid = v2_deployment.get('eid', 0) + if current_eid > existing_eid: + v2_deployment = deployment + + if v2_deployment and 'eid' in v2_deployment and native_chain_id: + eid = v2_deployment['eid'] + chain_mappings.append((chain_key, eid)) + chain_id_to_eid.append((native_chain_id, eid, chain_key)) + + # Sort by chain name for consistent output + for chain_key, eid in sorted(chain_mappings): + lines.append(f' _chainNameToEid["{chain_key}"] = {eid};') + lines.append(f' _eidToChainName[{eid}] = "{chain_key}";') + + lines.append(""" } + + /// @notice Register a single DVN + function _registerDVN(string memory dvnName, uint32 eid, address dvnAddress) private { + _dvnAddresses[dvnName][eid] = dvnAddress; + + // Track unique DVN names + if (!_dvnNameExists[dvnName]) { + _dvnNameExists[dvnName] = true; + _dvnNames.push(dvnName); + } + + // Track DVNs per chain + _dvnsByChain[eid].push(dvnName); + } + + function getDVNAddress(string memory dvnName, uint32 eid) public view returns (address dvnAddress) { + dvnAddress = _dvnAddresses[dvnName][eid]; + require(dvnAddress != address(0), string.concat("DVN not found: ", dvnName, " on chain ", _toString(eid))); + } + + function getDVNAddressByChainName(string memory dvnName, string memory chainName) public view returns (address dvnAddress) { + uint32 eid = _chainNameToEid[chainName]; + require(eid != 0, string.concat("Unknown chain: ", chainName)); + return getDVNAddress(dvnName, eid); + } + + function dvnExists(string memory dvnName, uint32 eid) public view returns (bool exists) { + return _dvnAddresses[dvnName][eid] != address(0); + } + + function getAvailableDVNs() public view returns (string[] memory dvnNames) { + return _dvnNames; + } + + function getDVNsForChain(uint32 eid) public view returns (string[] memory names, address[] memory addresses) { + names = _dvnsByChain[eid]; + addresses = new address[](names.length); + + for (uint256 i = 0; i < names.length; i++) { + addresses[i] = _dvnAddresses[names[i]][eid]; + } + } + + function getDVNsForChainByName(string memory chainName) public view returns (string[] memory names, address[] memory addresses) { + uint32 eid = _chainNameToEid[chainName]; + require(eid != 0, string.concat("Unknown chain: ", chainName)); + return getDVNsForChain(eid); + } + + /// @notice Convert uint to string (helper function) + function _toString(uint256 value) private pure returns (string memory) { + if (value == 0) { + return "0"; + } + uint256 temp = value; + uint256 digits; + while (temp != 0) { + digits++; + temp /= 10; + } + bytes memory buffer = new bytes(digits); + while (value != 0) { + digits -= 1; + buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); + value /= 10; + } + return string(buffer); + } +}""") + + return "\n".join(lines) + +def generate_contracts(output_file: str = "LZAddresses.sol", + protocol_file: str = "LZProtocol.sol", + chain_filter: Optional[List[str]] = None, + include_testnet: bool = False): + """Generate Solidity contracts from LayerZero metadata.""" + # Fetch metadata + metadata = fetch_metadata() + + # Generate DATA_HASH for provenance tracking + metadata_json = json.dumps(metadata, sort_keys=True) + data_hash = hashlib.sha256(metadata_json.encode()).hexdigest() + timestamp = datetime.utcnow().isoformat() + + # Create custom header with DATA_HASH for LZAddresses.sol + registry_header = f"""// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +// Auto-generated from LayerZero metadata - do not edit manually +// Source: {METADATA_URL} +// Generated: {timestamp} +// DATA_HASH: 0x{data_hash} + +import {{ILayerZeroEndpointV2}} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import {{IMessageLib}} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLib.sol"; + +// DATA_HASH for provenance tracking (LZIP spec requirement) +bytes32 constant LZ_ADDRESSES_DATA_HASH = 0x{data_hash}; +""" + + # Start building the complete file + # Use custom header if output file is for the addresses + if "LZAddresses" in output_file: + content = [registry_header] + else: + content = [SOLIDITY_HEADER] + + # Process each chain + chains_processed = [] + dvn_chains_processed = [] + + for chain_key, chain_data in sorted(metadata.items()): + # Skip if filtering is enabled and chain not in filter + if chain_filter and chain_key not in chain_filter: + continue + + # Skip testnet chains unless specifically requested + if 'testnet' in chain_key and not (include_testnet or (chain_filter and chain_key in chain_filter)): + continue + + # Skip sandbox chains unless specifically requested + if 'sandbox' in chain_key and not (include_testnet or (chain_filter and chain_key in chain_filter)): + continue + + # Skip non-EVM chains + chain_details = chain_data.get('chainDetails', {}) + chain_type = chain_details.get('chainType', 'evm') + if chain_type != 'evm': + print(f"Skipping non-EVM chain: {chain_key} (type: {chain_type})") + continue + + # Generate main chain library + chain_library = generate_chain_library(chain_key, chain_data) + if chain_library: + content.append(chain_library) + chains_processed.append(chain_key) + + # Generate DVN library if DVNs exist + dvns = chain_data.get('dvns', {}) + if dvns: + dvn_library = generate_dvn_library(chain_key, dvns) + if dvn_library: + content.append(dvn_library) + dvn_chains_processed.append(chain_key) + + # Write address book to file + with open(output_file, 'w') as f: + f.write('\n'.join(content)) + + print(f"\nGenerated {output_file}") + print(f"Processed {len(chains_processed)} chains: {', '.join(chains_processed)}") + print(f"Generated DVN libraries for {len(dvn_chains_processed)} chains") + + # Generate and write LZProtocol + protocol_content = generate_lz_protocol(chains_processed, metadata) + with open(protocol_file, 'w') as f: + f.write(protocol_content) + + print(f"\nGenerated {protocol_file}") + + # Count chains registered vs skipped + registered_count = 0 + skipped_chains = [] + for chain_key in chains_processed: + chain_data = metadata.get(chain_key, {}) + chain_details = chain_data.get('chainDetails', {}) + native_chain_id = chain_details.get('nativeChainId', 0) + + # Find V2 deployment (prefer higher EID if multiple exist) + deployments = chain_data.get('deployments', []) + v2_deployment = None + for deployment in deployments: + if deployment.get('version') == 2: + if v2_deployment is None: + v2_deployment = deployment + else: + # If we have multiple V2 deployments, prefer the one with higher EID + current_eid = deployment.get('eid', 0) + existing_eid = v2_deployment.get('eid', 0) + if current_eid > existing_eid: + v2_deployment = deployment + + if not native_chain_id: + skipped_chains.append(f"{chain_key} (no chainId)") + elif not v2_deployment: + skipped_chains.append(f"{chain_key} (no v2 deployment)") + else: + # Check required fields + required_fields = ['endpointV2', 'sendUln302', 'receiveUln302', 'executor'] + missing_fields = [] + for field in required_fields: + if field not in v2_deployment or not v2_deployment[field].get('address'): + missing_fields.append(field) + + if missing_fields: + skipped_chains.append(f"{chain_key} (missing: {', '.join(missing_fields)})") + else: + registered_count += 1 + + print(f"Registered {registered_count} chains in LZProtocol") + if skipped_chains: + print(f"Skipped {len(skipped_chains)} chains:") + for chain in skipped_chains: + print(f" - {chain}") + + # Generate and write LZWorkers + workers_file = protocol_file.replace("LZProtocol.sol", "LZWorkers.sol") + workers_content = generate_lz_workers(chains_processed, metadata) + with open(workers_file, 'w') as f: + f.write(workers_content) + + print(f"\nGenerated {workers_file}") + + # Count DVNs registered + dvn_count = 0 + dvn_chain_count = 0 + for chain_key in chains_processed: + chain_data = metadata.get(chain_key, {}) + dvns = chain_data.get('dvns', {}) + + for address, dvn_info in dvns.items(): + if (not dvn_info.get('deprecated', False) and + not dvn_info.get('lzReadCompatible', False) and + dvn_info.get('canonicalName')): + dvn_count += 1 + dvn_chain_count += 1 + + print(f"Registered DVNs across {len(chains_processed)} chains") + +def main(): + """Main entry point.""" + import argparse + + parser = argparse.ArgumentParser(description='Generate LayerZero V2 contracts from metadata') + parser.add_argument('-o', '--output', default='src/src-gen/LZAddresses.sol', + help='Output file name for address book (default: LZAddresses.sol)') + parser.add_argument('-p', '--protocol', default='LZProtocol.sol', + help='Output file name for protocol addresses (default: LZProtocol.sol)') + parser.add_argument('-w', '--workers', default='LZWorkers.sol', + help='Output file name for worker addresses (default: LZWorkers.sol)') + parser.add_argument('-c', '--chains', nargs='+', + help='Filter to specific chains (e.g., base-mainnet arbitrum-mainnet)') + parser.add_argument('--include-testnet', action='store_true', + help='Include testnet and sandbox chains') + + args = parser.parse_args() + + generate_contracts( + output_file=args.output, + protocol_file=args.protocol, + chain_filter=args.chains, + include_testnet=args.include_testnet + ) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/protocol-units/settlement/mcr/contracts/lib/openzeppelin-contracts b/protocol-units/settlement/mcr/contracts/lib/openzeppelin-contracts index dbb6104ce..c64a1edb6 160000 --- a/protocol-units/settlement/mcr/contracts/lib/openzeppelin-contracts +++ b/protocol-units/settlement/mcr/contracts/lib/openzeppelin-contracts @@ -1 +1 @@ -Subproject commit dbb6104ce834628e473d2173bbc9d47f81a9eec3 +Subproject commit c64a1edb67b6e3f4a15cca8909c9482ad33a02b0 diff --git a/protocol-units/settlement/mcr/contracts/remappings.txt b/protocol-units/settlement/mcr/contracts/remappings.txt index 8a3855412..73c312d4b 100644 --- a/protocol-units/settlement/mcr/contracts/remappings.txt +++ b/protocol-units/settlement/mcr/contracts/remappings.txt @@ -19,4 +19,4 @@ solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils @layerzerolabs/test-devtools-evm-foundry/=lib/devtools/packages/test-devtools-evm-foundry/ @layerzerolabs/lz-evm-protocol-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/protocol/ @layerzerolabs/lz-evm-messagelib-v2/=lib/layerzero-v2/packages/layerzero-v2/evm/messagelib/ -solidity-bytes-utils/=lib/solidity-bytes-utils/ \ No newline at end of file +solidity-bytes-utils/=lib/solidity-bytes-utils/ diff --git a/protocol-units/settlement/mcr/contracts/script/DeployMOVETokenHyperliquid.s.sol b/protocol-units/settlement/mcr/contracts/script/DeployMOVETokenHyperliquid.s.sol new file mode 100644 index 000000000..7a47abdcd --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/script/DeployMOVETokenHyperliquid.s.sol @@ -0,0 +1,354 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +// Foundry +import "forge-std/Script.sol"; +import "forge-std/console.sol"; + +// Project contracts +import {MOVETokenHyperliquid} from "../src/token/MOVETokenHyperliquid.sol"; +import {CREATE3Factory, ICREATE3Factory} from "./helpers/Create3/CREATE3Factory.sol"; + +// OpenZeppelin +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +// Safe +import {Enum} from "@safe-smart-account/contracts/common/Enum.sol"; +import {Safe} from "@safe-smart-account/contracts/Safe.sol"; + +// LayerZero +import {ILayerZeroEndpointV2} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import {SetConfigParam} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol"; +import {ExecutorConfig} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/SendLibBase.sol"; +import {UlnConfig} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/UlnBase.sol"; +import {EnforcedOptionParam} from "@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppOptionsType3.sol"; +import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; + +interface IProxyFactory { + function createProxyWithNonce(address masterCopy, bytes memory data, uint256 nonce) + external + returns (address proxy); +} + +/** + * @title DeployMOVETokenHyperliquid + * @notice Deployment script for MOVE token on Hyperliquid with full LayerZero configuration + * @dev Deploys implementation, proxy via CREATE3, configures LayerZero DVNs, and sets peer + */ +contract DeployMOVETokenHyperliquid is Script { + // Deployment addresses + address constant DEPLOYER_ADDRESS = 0xB2105464215716e1445367BEA5668F581eF7d063; + address constant ZERO = address(0x0); + address constant MASTER_COPY_ADDRESS_130 = 0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552; + address constant MASTER_COPY_ADDRESS_141 = 0x41675C099F32341bf84BFc5382aF534df5C7461a; + + // Expected multisig addresses + address constant EXPECTED_MULTISIG_LABS_OPS = 0x5cD71FFf9947486fD6F5c193a722191c22728887; + address constant EXPECTED_MULTISIG_DEPLOYER = 0x7aE744e3b2816F660054EAbd1a1C4935DA34Ae28; + address constant EXPECTED_MULTISIG_EXECUTOR = 0x443513664Eab95280360Dc1c33FDe1ad4ED5C7bB; + address constant EXPECTED_MOVE_TOKEN_PROXY = 0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073; + + // LayerZero endpoint and libraries (Hyperliquid Mainnet) + address public lzEndpoint = 0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9; + address public receiveUln302 = 0x7cacBe439EaD55fa1c22790330b12835c6884a91; + address public sendUln302 = 0xfd76d9CB0Bac839725aB79127E7411fe71b1e3CA; + address public lzExecutor = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; + + // Data Verification Networks (DVNs) + address public p2pDVN = 0xC7423626016bc40375458bc0277F28681EC91C8e; + address public horizenDVN = 0xBB83Ecf372CbB6daa629ea9A9A53BEC6d601F229; + address public lzDVN = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + + // LayerZero config types + uint32 public constant EXECUTOR_CONFIG_TYPE = 1; + uint32 public constant ULN_CONFIG_TYPE = 2; + uint32 public constant RECEIVE_CONFIG_TYPE = 2; + + // LayerZero parameters + uint32 public movementEid = 30325; + uint64 public confirmations = 0; + bytes32 public movementOapp = 0x7e4fd97ef92302eea9b10f74be1d96fb1f1511cf7ed28867b0144ca89c6ebc3c; + + // Factory contracts + IProxyFactory public proxyFactory = IProxyFactory(0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2); + CREATE3Factory public create3 = CREATE3Factory(0x2Dfcc7415D89af828cbef005F0d072D8b3F23183); + + // Deployment parameters + bytes32 public salt = 0x6c0000000000000000000000018eddf77afc0a5c6d05a564a44fe37b068922c3; + + // Deployment state + MOVETokenHyperliquid public moveTokenImplementation; + address public moveTokenProxy = 0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073; + address public multisigLabsOps; + address public multisigExecutor; + address public multisigDeployer; + address public timelock; + + function run() external { + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + require(vm.addr(deployerPrivateKey) == DEPLOYER_ADDRESS, "Private key does not match deployer address"); + + vm.startBroadcast(deployerPrivateKey); + + // Step 1: Deploy multisigs + console.log("=== Step 1: Deploying Multisigs ==="); + deployMultisigs(); + + timelock = deployTimelock(multisigLabsOps, multisigExecutor); + + // Step 2: Deploy MOVE token implementation and proxy + console.log("\n=== Step 2: Deploying MOVE Token ==="); + deployMoveToken(); + + // Step 3: Configure LayerZero + console.log("\n=== Step 3: Configuring LayerZero ==="); + configureLZ(); + + // Step 4: Set peer + console.log("\n=== Step 4: Setting Peer ==="); + setPeer(); + + vm.stopBroadcast(); + + // Log final deployment info + console.log("\n=== Deployment Complete ==="); + console.log("Multisig Labs Ops:", multisigLabsOps); + console.log("Multisig Deployer:", multisigDeployer); + console.log("MOVE Token Implementation:", address(moveTokenImplementation)); + console.log("MOVE Token Proxy:", moveTokenProxy); + } + + /** + * @dev Deploys Safe multisigs for Labs Ops and Deployer + */ + function deployMultisigs() internal { + bytes memory labsOpsInitData = + hex"b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000fd0732dc9e303f09fcef3a7388ad10a83459ec9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000008bc3c3e914ace9a0e73a3e39a669148435de8bbf0000000000000000000000006890e3e256dbc8e0684f0a6ce04c05e2a6658a0700000000000000000000000082153abfc66883acf303534b34f5e27e0ff0db72000000000000000000000000944907f1fb2afa7abea02b929df496d09567c64000000000000000000000000002f57fe96ba5c135e9a8bf82626ca49423128cca000000000000000000000000aff3deeb13bd2b480751189808c16e9809eebcce000000000000000000000000648dc72081ae39814080d3ac45ad08ff4bb864170000000000000000000000000000000000000000000000000000000000000000"; + bytes memory deployerInitData = + hex"b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33aec0fe5e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005afe7a11e70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b2105464215716e1445367bea5668f581ef7d0630000000000000000000000003eb69ef2dbedd5d58aa5e074131cd22d5e87ff530000000000000000000000000000000000000000000000000000000000000000"; + bytes memory executorInitData = + hex"b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000fd0732dc9e303f09fcef3a7388ad10a83459ec990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000450ba32bf877280403d556a4a40aa03be9349a4d0000000000000000000000001da2ed7e5828352bf0e188179cd9d0e15f84006b000000000000000000000000721b92ab5c162e95ad74571ff1f7695608576de70000000000000000000000000000000000000000000000000000000000000000"; + + multisigDeployer = proxyFactory.createProxyWithNonce(MASTER_COPY_ADDRESS_130, deployerInitData, 0); + require(multisigDeployer == EXPECTED_MULTISIG_DEPLOYER, "Multisig Deployer address mismatch"); + + multisigLabsOps = proxyFactory.createProxyWithNonce(MASTER_COPY_ADDRESS_141, labsOpsInitData, 0); + require(multisigLabsOps == EXPECTED_MULTISIG_LABS_OPS, "Multisig Labs Ops address mismatch"); + + multisigExecutor = proxyFactory.createProxyWithNonce(MASTER_COPY_ADDRESS_141, executorInitData, 0); + require(multisigExecutor == EXPECTED_MULTISIG_EXECUTOR, "Multisig Executor address mismatch"); + + console.log("Deployed Multisig Labs Ops:", multisigLabsOps); + console.log("Deployed Multisig Deployer:", multisigDeployer); + console.log("Deployed Multisig Executor:", multisigExecutor); + } + + /** + * @dev Deploys MOVE token implementation and proxy via CREATE3 + */ + function deployMoveToken() internal { + // Deploy implementation + moveTokenImplementation = new MOVETokenHyperliquid(lzEndpoint); + console.log("Deployed Implementation:", address(moveTokenImplementation)); + require(timelock != address(0), "Timelock must be deployed before deploying proxy"); + require(address(moveTokenImplementation) != address(0), "Implementation deployment failed"); + // Prepare CREATE3 deployment bytecode + bytes memory create3Bytecode = abi.encodePacked( + type(TransparentUpgradeableProxy).creationCode, + abi.encode( + address(moveTokenImplementation), + address(timelock), + abi.encodeWithSignature("initialize(address)", DEPLOYER_ADDRESS) + ) + ); + + // Deploy proxy using CREATE3 via Safe multisig + bytes memory bytecode = abi.encodeWithSignature("deploy(bytes32,bytes)", salt, create3Bytecode); + bytes32 digest = Safe(payable(multisigDeployer)).getTransactionHash( + address(create3), 0, bytecode, Enum.Operation.Call, 0, 0, 0, ZERO, payable(ZERO), 0 + ); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(vm.envUint("PRIVATE_KEY"), digest); + bytes memory signature = abi.encodePacked(r, s, v); + require(signature.length >= 65, "Invalid signature length"); + + moveTokenProxy = create3.getDeployed(multisigDeployer, salt); + + Safe(payable(multisigDeployer)).execTransaction( + address(create3), 0, bytecode, Enum.Operation.Call, 0, 0, 0, ZERO, payable(ZERO), signature + ); + + require(moveTokenProxy == EXPECTED_MOVE_TOKEN_PROXY, "MOVE Token proxy address mismatch"); + + // Verify deployment + MOVETokenHyperliquid move = MOVETokenHyperliquid(moveTokenProxy); + + // Verify basic token properties + require(move.decimals() == 8, "Decimals verification failed"); + require(keccak256(bytes(move.name())) == keccak256(bytes("Movement")), "Name verification failed"); + require(keccak256(bytes(move.symbol())) == keccak256(bytes("MOVE")), "Symbol verification failed"); + require(move.owner() == DEPLOYER_ADDRESS, "Owner verification failed"); + require(address(move.endpoint()) == lzEndpoint, "Endpoint verification failed"); + require(move.totalSupply() == 0, "Total supply should be 0"); + require(move.DOMAIN_SEPARATOR() != bytes32(0), "Domain separator should not be zero"); + + console.log("Basic token properties verified"); + + // Verify EIP-712 domain + ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 domainSalt, + uint256[] memory extensions + ) = move.eip712Domain(); + + require(fields == hex"0f", "EIP-712 fields verification failed"); + require(keccak256(bytes(name)) == keccak256(bytes("Movement")), "EIP-712 name verification failed"); + require(keccak256(bytes(version)) == keccak256(bytes("1")), "EIP-712 version verification failed"); + require(chainId == block.chainid, "EIP-712 chainId verification failed"); + require(verifyingContract == address(move), "EIP-712 verifying contract verification failed"); + require(domainSalt == bytes32(0), "EIP-712 salt verification failed"); + require(extensions.length == 0, "EIP-712 extensions verification failed"); + + console.log("EIP-712 domain verified"); + + // Verify finalizer storage slot + address finalizer = address(uint160(uint256(vm.load(address(move), keccak256("HyperCore deployer"))))); + require(finalizer == DEPLOYER_ADDRESS, "Finalizer verification failed"); + console.log("Finalizer verified"); + + console.log("All token verifications passed"); + } + + /** + * @dev Configures LayerZero DVN, executor, and enforced options + */ + function configureLZ() internal { + MOVETokenHyperliquid move = MOVETokenHyperliquid(moveTokenProxy); + + // Configure libraries + console.log("Setting LayerZero libraries..."); + setLibraries(moveTokenProxy, movementEid, sendUln302, receiveUln302); + + // Verify send library configuration + address receivedSendLib = move.endpoint().getSendLibrary(address(move), movementEid); + require(receivedSendLib == sendUln302, "Send library verification failed"); + console.log("Send library verified:", receivedSendLib); + + // Verify receive library configuration + (address receivedReceiveLib,) = move.endpoint().getReceiveLibrary(address(move), movementEid); + require(receivedReceiveLib == receiveUln302, "Receive library verification failed"); + console.log("Receive library verified:", receivedReceiveLib); + + // Configure DVNs and executor + console.log("Configuring DVNs and executor..."); + address[] memory dvnArray = new address[](3); + dvnArray[0] = horizenDVN; + dvnArray[1] = lzDVN; + dvnArray[2] = p2pDVN; + + address[] memory emptyArray = new address[](0); + UlnConfig memory ulnConfig = UlnConfig({ + confirmations: uint64(confirmations), + requiredDVNCount: uint8(3), + optionalDVNCount: uint8(0), + optionalDVNThreshold: uint8(0), + requiredDVNs: dvnArray, + optionalDVNs: emptyArray + }); + ExecutorConfig memory executorConfig = ExecutorConfig({maxMessageSize: 0, executor: lzExecutor}); + + setConfigs(moveTokenProxy, movementEid, sendUln302, receiveUln302, ulnConfig, executorConfig); + console.log("DVN and executor configuration complete"); + + // Set enforced options + console.log("Setting enforced options..."); + bytes memory options = abi.encodePacked(uint176(0x00030100110100000000000000000000000000013880)); + console.logBytes(options); + EnforcedOptionParam[] memory enforcedParams = new EnforcedOptionParam[](2); + enforcedParams[0] = EnforcedOptionParam({eid: movementEid, msgType: uint16(1), options: options}); + enforcedParams[1] = EnforcedOptionParam({eid: movementEid, msgType: uint16(2), options: options}); + move.setEnforcedOptions(enforcedParams); + + // Verify enforced options are set for both message types + bytes memory verifyOptions1 = move.enforcedOptions(movementEid, uint16(1)); + bytes memory verifyOptions2 = move.enforcedOptions(movementEid, uint16(2)); + require(keccak256(verifyOptions1) == keccak256(options), "Enforced options verification failed for msgType 1"); + require(keccak256(verifyOptions2) == keccak256(options), "Enforced options verification failed for msgType 2"); + console.log("Enforced options verified for both message types"); + + console.log("LayerZero configuration complete"); + } + + /** + * @dev Sets the peer OApp address on the Movement network + */ + function setPeer() internal { + MOVETokenHyperliquid move = MOVETokenHyperliquid(moveTokenProxy); + move.setPeer(movementEid, movementOapp); + + // Verify peer is set correctly + bytes32 verifyPeer = move.peers(movementEid); + require(verifyPeer == movementOapp, "Peer verification failed"); + console.log("Peer verified for Movement EID:", movementEid); + } + + /** + * @dev Sets LayerZero configuration parameters for send and receive libraries + * @param contractAddress Address of the contract to configure + * @param remoteEid Remote endpoint ID to configure for + * @param sendLibraryAddress Address of the send library + * @param receiveLibraryAddress Address of the receive library + * @param ulnConfig ULN configuration with DVN settings + * @param executorConfig Executor configuration settings + */ + function setConfigs( + address contractAddress, + uint32 remoteEid, + address sendLibraryAddress, + address receiveLibraryAddress, + UlnConfig memory ulnConfig, + ExecutorConfig memory executorConfig + ) internal { + // Configure send library with executor and ULN configs + SetConfigParam[] memory sendConfigParams = new SetConfigParam[](2); + sendConfigParams[0] = + SetConfigParam({eid: remoteEid, configType: EXECUTOR_CONFIG_TYPE, config: abi.encode(executorConfig)}); + sendConfigParams[1] = + SetConfigParam({eid: remoteEid, configType: ULN_CONFIG_TYPE, config: abi.encode(ulnConfig)}); + + // Configure receive library with ULN config + SetConfigParam[] memory receiveConfigParams = new SetConfigParam[](1); + receiveConfigParams[0] = + SetConfigParam({eid: remoteEid, configType: RECEIVE_CONFIG_TYPE, config: abi.encode(ulnConfig)}); + + ILayerZeroEndpointV2(lzEndpoint).setConfig(contractAddress, sendLibraryAddress, sendConfigParams); + ILayerZeroEndpointV2(lzEndpoint).setConfig(contractAddress, receiveLibraryAddress, receiveConfigParams); + } + + /** + * @dev Sets the send and receive libraries for LayerZero messaging + * @param _oapp Address of the OmniApp to configure + * @param _eid Endpoint ID to configure for + * @param _sendLib Address of the send library + * @param _receiveLib Address of the receive library + */ + function setLibraries(address _oapp, uint32 _eid, address _sendLib, address _receiveLib) internal { + ILayerZeroEndpointV2(lzEndpoint).setSendLibrary(_oapp, _eid, _sendLib); + ILayerZeroEndpointV2(lzEndpoint).setReceiveLibrary(_oapp, _eid, _receiveLib, 0); + } + + function deployTimelock(address proposer, address executor) internal returns (address) { + require(proposer != address(0), "Proposer cannot be zero address"); + require(executor != address(0), "Executor cannot be zero address"); + return address(new TimelockController(172800, _arrayfy(proposer), _arrayfy(executor), ZERO)); + } + + function _arrayfy(address addr) internal pure returns (address[] memory arr) { + arr = new address[](1); + arr[0] = addr; + } +} diff --git a/protocol-units/settlement/mcr/contracts/script/DeployMOVETokenHyperliquidTestnet.s.sol b/protocol-units/settlement/mcr/contracts/script/DeployMOVETokenHyperliquidTestnet.s.sol new file mode 100644 index 000000000..4560d6cce --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/script/DeployMOVETokenHyperliquidTestnet.s.sol @@ -0,0 +1,331 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +// Foundry +import "forge-std/Script.sol"; +import "forge-std/console.sol"; + +// Project contracts +import {MOVETokenHyperliquid} from "../src/token/MOVETokenHyperliquid.sol"; +import {CREATE3Factory, ICREATE3Factory} from "./helpers/Create3/CREATE3Factory.sol"; + +// OpenZeppelin +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +// Safe +import {Enum} from "@safe-smart-account/contracts/common/Enum.sol"; +import {Safe} from "@safe-smart-account/contracts/Safe.sol"; + +// LayerZero +import {ILayerZeroEndpointV2} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import {SetConfigParam} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol"; +import {ExecutorConfig} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/SendLibBase.sol"; +import {UlnConfig} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/UlnBase.sol"; +import {EnforcedOptionParam} from "@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppOptionsType3.sol"; + +interface IProxyFactory { + function createProxyWithNonce(address masterCopy, bytes memory data, uint256 nonce) + external + returns (address proxy); +} + +/** + * @title DeployMOVETokenHyperliquid + * @notice Deployment script for MOVE token on Hyperliquid with full LayerZero configuration + * @dev Deploys implementation, proxy via CREATE3, configures LayerZero DVNs, and sets peer + */ +contract DeployMOVETokenHyperliquidTestnet is Script { + // Deployment addresses + address constant DEPLOYER_ADDRESS = 0xB2105464215716e1445367BEA5668F581eF7d063; + address constant ZERO = address(0x0); + address constant MASTER_COPY_ADDRESS = 0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552; + + // Expected multisig addresses + address constant EXPECTED_MULTISIG_LABS_OPS = 0xd7E22951DE7aF453aAc5400d6E072E3b63BeB7E2; + address constant EXPECTED_MULTISIG_DEPLOYER = 0x7aE744e3b2816F660054EAbd1a1C4935DA34Ae28; + address constant EXPECTED_MOVE_TOKEN_PROXY = 0x431a8F39106dC468DfF6aE772c8F121a0443bFA0; + + // LayerZero endpoint and libraries (Hyperliquid Mainnet) + address public lzEndpoint = 0xf9e1815F151024bDE4B7C10BAC10e8Ba9F6b53E1; + address public receiveUln302 = 0x012f6eaE2A0Bf5916f48b5F37C62Bcfb7C1ffdA1; + address public sendUln302 = 0x43E505ba192aaC7BABdC1A796c87844171011684; + address public lzExecutor = 0x72e34F44Eb09058bdDaf1aeEebDEC062f1844b00; + + // Data Verification Networks (DVNs) + address public p2pDVN = 0x4c90F152707c6EAB6cd801E326D25b0591E449a2; + address public lzDVN = 0x91E698871030D0e1b6c9268C20bB57E2720618Dd; + + // LayerZero config types + uint32 public constant EXECUTOR_CONFIG_TYPE = 1; + uint32 public constant ULN_CONFIG_TYPE = 2; + uint32 public constant RECEIVE_CONFIG_TYPE = 2; + + // LayerZero parameters + uint32 public movementEid = 40325; + uint64 public confirmations = 0; + bytes32 public movementOapp = 0xa7c56d1854c385d73b0389e6e4fe4341e7f3f5c2c6e5a81a64cff902a6b7b0f3; + + // Factory contracts + IProxyFactory public proxyFactory = IProxyFactory(0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2); + CREATE3Factory public create3 = CREATE3Factory(0xC31CfE110880F86DcED15c067F4A2242F6d72580); + + // Deployment parameters + bytes32 public salt = 0x6c0000000000000000000000018eddf77afc0a5c6d05a564a44fe37b068922c3; + + // Deployment state + MOVETokenHyperliquid public moveTokenImplementation; + address public moveTokenProxy; + address public multisigLabsOps; + address public multisigDeployer; + + function run() external { + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + require(vm.addr(deployerPrivateKey) == DEPLOYER_ADDRESS, "Private key does not match deployer address"); + multisigLabsOps = EXPECTED_MULTISIG_LABS_OPS; + multisigDeployer = EXPECTED_MULTISIG_DEPLOYER; + vm.startBroadcast(deployerPrivateKey); + + // Initialize CREATE3 factory + // create3 = new CREATE3Factory(); + + // Step 1: Deploy multisigs + // console.log("=== Step 1: Deploying Multisigs ==="); + // deployMultisigs(); + + // Step 2: Deploy MOVE token implementation and proxy + console.log("\n=== Step 2: Deploying MOVE Token ==="); + deployMoveToken(); + + // Step 3: Configure LayerZero + console.log("\n=== Step 3: Configuring LayerZero ==="); + configureLZ(); + + // Step 4: Set peer + console.log("\n=== Step 4: Setting Peer ==="); + setPeer(); + + vm.stopBroadcast(); + + // Log final deployment info + console.log("\n=== Deployment Complete ==="); + console.log("Multisig Labs Ops:", multisigLabsOps); + console.log("Multisig Deployer:", multisigDeployer); + console.log("MOVE Token Implementation:", address(moveTokenImplementation)); + console.log("MOVE Token Proxy:", moveTokenProxy); + } + + /** + * @dev Deploys Safe multisigs for Labs Ops and Deployer + */ + function deployMultisigs() internal { + bytes memory firstInitData = + hex"b63e800d00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33aec0fe5e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005afe7a11e70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000b2105464215716e1445367bea5668f581ef7d06300000000000000000000000049f86aee2c2187870ece0e64570d0048eaf4c75100000000000000000000000012cbb2c9f072e955b6b95ad46213aaa984a4434d000000000000000000000000aff3deeb13bd2b480751189808c16e9809eebcce0000000000000000000000000eed12ca165a962cd12420dfb38407637bca42670000000000000000000000000000000000000000000000000000000000000000"; + bytes memory secondInitData = + hex"b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33aec0fe5e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005afe7a11e70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b2105464215716e1445367bea5668f581ef7d0630000000000000000000000003eb69ef2dbedd5d58aa5e074131cd22d5e87ff530000000000000000000000000000000000000000000000000000000000000000"; + + // multisigLabsOps = proxyFactory.createProxyWithNonce(MASTER_COPY_ADDRESS, firstInitData, 0); + // multisigDeployer = proxyFactory.createProxyWithNonce(MASTER_COPY_ADDRESS, secondInitData, 0); + + require(multisigLabsOps == EXPECTED_MULTISIG_LABS_OPS, "Multisig Labs Ops address mismatch"); + require(multisigDeployer == EXPECTED_MULTISIG_DEPLOYER, "Multisig Deployer address mismatch"); + + console.log("Deployed Multisig Labs Ops:", multisigLabsOps); + console.log("Deployed Multisig Deployer:", multisigDeployer); + } + + /** + * @dev Deploys MOVE token implementation and proxy via CREATE3 + */ + function deployMoveToken() internal { + // Deploy implementation + moveTokenImplementation = new MOVETokenHyperliquid(lzEndpoint); + console.log("Deployed Implementation:", address(moveTokenImplementation)); + + // Prepare CREATE3 deployment bytecode + bytes memory create3Bytecode = abi.encodePacked( + type(TransparentUpgradeableProxy).creationCode, + abi.encode( + address(moveTokenImplementation), + address(multisigLabsOps), + abi.encodeWithSignature("initialize(address)", DEPLOYER_ADDRESS) + ) + ); + + // Deploy proxy using CREATE3 via Safe multisig + bytes memory bytecode = abi.encodeWithSignature("deploy(bytes32,bytes)", salt, create3Bytecode); + bytes32 digest = Safe(payable(multisigDeployer)).getTransactionHash( + address(create3), 0, bytecode, Enum.Operation.Call, 0, 0, 0, ZERO, payable(ZERO), 0 + ); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(vm.envUint("PRIVATE_KEY"), digest); + bytes memory signature = abi.encodePacked(r, s, v); + require(signature.length >= 65, "Invalid signature length"); + + moveTokenProxy = create3.getDeployed(multisigDeployer, salt); + + Safe(payable(multisigDeployer)).execTransaction( + address(create3), 0, bytecode, Enum.Operation.Call, 0, 0, 0, ZERO, payable(ZERO), signature + ); + + require(moveTokenProxy == EXPECTED_MOVE_TOKEN_PROXY, "MOVE Token proxy address mismatch"); + + // Verify deployment + MOVETokenHyperliquid move = MOVETokenHyperliquid(moveTokenProxy); + + // Verify basic token properties + require(move.decimals() == 8, "Decimals verification failed"); + require(keccak256(bytes(move.name())) == keccak256(bytes("Movement")), "Name verification failed"); + require(keccak256(bytes(move.symbol())) == keccak256(bytes("MOVE")), "Symbol verification failed"); + require(move.owner() == DEPLOYER_ADDRESS, "Owner verification failed"); + require(address(move.endpoint()) == lzEndpoint, "Endpoint verification failed"); + require(move.totalSupply() == 0, "Total supply should be 0"); + require(move.DOMAIN_SEPARATOR() != bytes32(0), "Domain separator should not be zero"); + + console.log("Basic token properties verified"); + + // Verify EIP-712 domain + ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 domainSalt, + uint256[] memory extensions + ) = move.eip712Domain(); + + require(fields == hex"0f", "EIP-712 fields verification failed"); + require(keccak256(bytes(name)) == keccak256(bytes("Movement")), "EIP-712 name verification failed"); + require(keccak256(bytes(version)) == keccak256(bytes("1")), "EIP-712 version verification failed"); + require(chainId == block.chainid, "EIP-712 chainId verification failed"); + require(verifyingContract == address(move), "EIP-712 verifying contract verification failed"); + require(domainSalt == bytes32(0), "EIP-712 salt verification failed"); + require(extensions.length == 0, "EIP-712 extensions verification failed"); + + console.log("EIP-712 domain verified"); + + // Verify finalizer storage slot + address finalizer = address(uint160(uint256(vm.load(address(move), keccak256("HyperCore deployer"))))); + require(finalizer == DEPLOYER_ADDRESS, "Finalizer verification failed"); + console.log("Finalizer verified"); + + console.log("All token verifications passed"); + } + + /** + * @dev Configures LayerZero DVN, executor, and enforced options + */ + function configureLZ() internal { + MOVETokenHyperliquid move = MOVETokenHyperliquid(moveTokenProxy); + + // Configure libraries + console.log("Setting LayerZero libraries..."); + setLibraries(moveTokenProxy, movementEid, sendUln302, receiveUln302); + + // Verify send library configuration + address receivedSendLib = move.endpoint().getSendLibrary(address(move), movementEid); + require(receivedSendLib == sendUln302, "Send library verification failed"); + console.log("Send library verified:", receivedSendLib); + + // Verify receive library configuration + (address receivedReceiveLib,) = move.endpoint().getReceiveLibrary(address(move), movementEid); + require(receivedReceiveLib == receiveUln302, "Receive library verification failed"); + console.log("Receive library verified:", receivedReceiveLib); + + // Configure DVNs and executor + console.log("Configuring DVNs and executor..."); + address[] memory dvnArray = new address[](2); + dvnArray[1] = lzDVN; + dvnArray[0] = p2pDVN; + + address[] memory emptyArray = new address[](0); + UlnConfig memory ulnConfig = UlnConfig({ + confirmations: uint64(confirmations), + requiredDVNCount: uint8(dvnArray.length), + optionalDVNCount: uint8(0), + optionalDVNThreshold: uint8(0), + requiredDVNs: dvnArray, + optionalDVNs: emptyArray + }); + ExecutorConfig memory executorConfig = ExecutorConfig({maxMessageSize: 0, executor: lzExecutor}); + + setConfigs(moveTokenProxy, movementEid, sendUln302, receiveUln302, ulnConfig, executorConfig); + console.log("DVN and executor configuration complete"); + + // Set enforced options + console.log("Setting enforced options..."); + bytes memory options = abi.encodePacked(uint176(0x00030100110100000000000000000000000000013880)); + console.logBytes(options); + EnforcedOptionParam[] memory enforcedParams = new EnforcedOptionParam[](2); + enforcedParams[0] = EnforcedOptionParam({eid: movementEid, msgType: uint16(1), options: options}); + enforcedParams[1] = EnforcedOptionParam({eid: movementEid, msgType: uint16(2), options: options}); + move.setEnforcedOptions(enforcedParams); + + // Verify enforced options are set for both message types + bytes memory verifyOptions1 = move.enforcedOptions(movementEid, uint16(1)); + bytes memory verifyOptions2 = move.enforcedOptions(movementEid, uint16(2)); + require(keccak256(verifyOptions1) == keccak256(options), "Enforced options verification failed for msgType 1"); + require(keccak256(verifyOptions2) == keccak256(options), "Enforced options verification failed for msgType 2"); + console.log("Enforced options verified for both message types"); + + console.log("LayerZero configuration complete"); + } + + /** + * @dev Sets the peer OApp address on the Movement network + */ + function setPeer() internal { + MOVETokenHyperliquid move = MOVETokenHyperliquid(moveTokenProxy); + move.setPeer(movementEid, movementOapp); + + // Verify peer is set correctly + bytes32 verifyPeer = move.peers(movementEid); + require(verifyPeer == movementOapp, "Peer verification failed"); + console.log("Peer verified for Movement EID:", movementEid); + } + + /** + * @dev Sets LayerZero configuration parameters for send and receive libraries + * @param contractAddress Address of the contract to configure + * @param remoteEid Remote endpoint ID to configure for + * @param sendLibraryAddress Address of the send library + * @param receiveLibraryAddress Address of the receive library + * @param ulnConfig ULN configuration with DVN settings + * @param executorConfig Executor configuration settings + */ + function setConfigs( + address contractAddress, + uint32 remoteEid, + address sendLibraryAddress, + address receiveLibraryAddress, + UlnConfig memory ulnConfig, + ExecutorConfig memory executorConfig + ) internal { + // Configure send library with executor and ULN configs + SetConfigParam[] memory sendConfigParams = new SetConfigParam[](2); + sendConfigParams[0] = + SetConfigParam({eid: remoteEid, configType: EXECUTOR_CONFIG_TYPE, config: abi.encode(executorConfig)}); + sendConfigParams[1] = + SetConfigParam({eid: remoteEid, configType: ULN_CONFIG_TYPE, config: abi.encode(ulnConfig)}); + + // Configure receive library with ULN config + SetConfigParam[] memory receiveConfigParams = new SetConfigParam[](1); + receiveConfigParams[0] = + SetConfigParam({eid: remoteEid, configType: RECEIVE_CONFIG_TYPE, config: abi.encode(ulnConfig)}); + + ILayerZeroEndpointV2(lzEndpoint).setConfig(contractAddress, sendLibraryAddress, sendConfigParams); + ILayerZeroEndpointV2(lzEndpoint).setConfig(contractAddress, receiveLibraryAddress, receiveConfigParams); + } + + /** + * @dev Sets the send and receive libraries for LayerZero messaging + * @param _oapp Address of the OmniApp to configure + * @param _eid Endpoint ID to configure for + * @param _sendLib Address of the send library + * @param _receiveLib Address of the receive library + */ + function setLibraries(address _oapp, uint32 _eid, address _sendLib, address _receiveLib) internal { + ILayerZeroEndpointV2(lzEndpoint).setSendLibrary(_oapp, _eid, _sendLib); + ILayerZeroEndpointV2(lzEndpoint).setReceiveLibrary(_oapp, _eid, _receiveLib, 0); + } +} diff --git a/protocol-units/settlement/mcr/contracts/script/DeployMOVETokenOFT.s.sol b/protocol-units/settlement/mcr/contracts/script/DeployMOVETokenOFT.s.sol new file mode 100644 index 000000000..b33b52348 --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/script/DeployMOVETokenOFT.s.sol @@ -0,0 +1,434 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +// Foundry +import "forge-std/Script.sol"; +import "forge-std/console.sol"; + +// Project contracts +import {MOVETokenOFT} from "../src/token/MOVETokenOFT.sol"; +import {CREATE3Factory, ICREATE3Factory} from "./helpers/Create3/CREATE3Factory.sol"; + +// OpenZeppelin +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +// Safe +import {Enum} from "@safe-smart-account/contracts/common/Enum.sol"; +import {Safe} from "@safe-smart-account/contracts/Safe.sol"; + +// LayerZero +import {ILayerZeroEndpointV2} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import {SetConfigParam} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol"; +import {ExecutorConfig} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/SendLibBase.sol"; +import {UlnConfig} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/UlnBase.sol"; +import {EnforcedOptionParam} from "@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppOptionsType3.sol"; +import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; + +// LayerZero Address Book +import {LZProtocol} from "../layerzero_book/LZProtocol.sol"; +import {LZWorkers} from "../layerzero_book/LZWorkers.sol"; + +interface IProxyFactory { + function createProxyWithNonce(address masterCopy, bytes memory data, uint256 nonce) + external + returns (address proxy); +} + +/** + * @title DeployMOVETokenOFT + * @notice Deployment script for MOVE token on EVM chain with full LayerZero configuration + * @dev Deploys implementation, proxy via CREATE3, configures LayerZero DVNs, and sets peer + */ +contract DeployMOVETokenOFT is Script { + // Deployment addresses + address constant DEPLOYER_ADDRESS = 0xB2105464215716e1445367BEA5668F581eF7d063; + address constant ZERO = address(0x0); + address constant MASTER_COPY_ADDRESS_130 = 0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552; + address constant MASTER_COPY_ADDRESS_141 = 0x41675C099F32341bf84BFc5382aF534df5C7461a; + + // Expected multisig addresses + address constant EXPECTED_MULTISIG_LABS_OPS = 0x5cD71FFf9947486fD6F5c193a722191c22728887; + address constant EXPECTED_MULTISIG_DEPLOYER = 0x7aE744e3b2816F660054EAbd1a1C4935DA34Ae28; + address constant EXPECTED_MULTISIG_EXECUTOR = 0x443513664Eab95280360Dc1c33FDe1ad4ED5C7bB; + address constant EXPECTED_MOVE_TOKEN_PROXY = 0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073; + + // LayerZero endpoint and libraries + address public lzEndpoint; + address public receiveUln302; + address public sendUln302; + address public lzExecutor; + + // Data Verification Networks (DVNs) + address public p2pDVN; + address public horizenDVN; + address public lzDVN; + + // LayerZero config types + uint32 public constant EXECUTOR_CONFIG_TYPE = 1; + uint32 public constant ULN_CONFIG_TYPE = 2; + uint32 public constant RECEIVE_CONFIG_TYPE = 2; + + // LayerZero parameters + uint32 public movementEid = 30325; + uint32 public hyperevmEid = 30367; + uint32 public ethereumEid = 30101; + uint32 public baseEid = 30184; + uint32 public avalancheEid = 30106; + bool public defaultValues = false; + bytes32 public movementOapp = 0x7e4fd97ef92302eea9b10f74be1d96fb1f1511cf7ed28867b0144ca89c6ebc3c; + + // Factory contracts + IProxyFactory public proxyFactory = IProxyFactory(0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2); + CREATE3Factory public create3 = CREATE3Factory(0x2Dfcc7415D89af828cbef005F0d072D8b3F23183); + + // Deployment parameters + bytes32 public salt = 0x6c0000000000000000000000018eddf77afc0a5c6d05a564a44fe37b068922c3; + + // Deployment state + MOVETokenOFT public moveTokenImplementation; + address public moveTokenProxy; + address public multisigLabsOps; + address public multisigExecutor; + address public multisigDeployer; + address public timelock; + + function run() external { + + // Load LayerZero configuration from layerzero_book/LZProtocol.sol + LZProtocol lzProtocol = new LZProtocol(); + uint32 eid = lzProtocol.getEidByChainId(block.chainid); + LZProtocol.ProtocolAddresses memory addresses = lzProtocol.getProtocolAddresses(eid); + + // Set LayerZero addresses from protocol + lzEndpoint = addresses.endpointV2; + sendUln302 = addresses.sendUln302; + receiveUln302 = addresses.receiveUln302; + lzExecutor = addresses.executor; + + // Load DVN addresses from LZWorkers + LZWorkers lzWorkers = new LZWorkers(); + p2pDVN = lzWorkers.getDVNAddress("P2P", eid); + horizenDVN = lzWorkers.getDVNAddress("Horizen", eid); + lzDVN = lzWorkers.getDVNAddress("LayerZero Labs", eid); + + // Assert that all addresses are not zero + require(lzEndpoint != address(0), "LayerZero endpoint cannot be zero address"); + require(sendUln302 != address(0), "Send ULN 302 cannot be zero address"); + require(receiveUln302 != address(0), "Receive ULN 302 cannot be zero address"); + require(lzExecutor != address(0), "LayerZero executor cannot be zero address"); + require(p2pDVN != address(0), "P2P DVN cannot be zero address"); + require(horizenDVN != address(0), "Horizen DVN cannot be zero address"); + require(lzDVN != address(0), "LayerZero Labs DVN cannot be zero address"); + + vm.startBroadcast(); + + // Step 1: Deploy multisigs + console.log("=== Step 1: Deploying Multisigs ==="); + deployMultisigs(); + + timelock = deployTimelock(multisigLabsOps, multisigExecutor); + + // Step 2: Deploy MOVE token implementation and proxy + console.log("\n=== Step 2: Deploying MOVE Token ==="); + deployMoveToken(); + + // Step 3: Configure LayerZero + console.log("\n=== Step 3: Configuring LayerZero ==="); + bytes memory options = abi.encodePacked(uint176(0x00030100110100000000000000000000000000013880)); + + // Movement + configureLZ(MOVETokenOFT(EXPECTED_MOVE_TOKEN_PROXY), movementEid, movementOapp, 15, 250000, options); + // HyperEVM + configureLZ(MOVETokenOFT(EXPECTED_MOVE_TOKEN_PROXY), hyperevmEid, bytes32(uint256(uint160(EXPECTED_MOVE_TOKEN_PROXY))), 15, 15, options); + // Base + configureLZ(MOVETokenOFT(EXPECTED_MOVE_TOKEN_PROXY), baseEid, bytes32(uint256(uint160(EXPECTED_MOVE_TOKEN_PROXY))), 15, 15, options); + // Ethereum + configureLZ(MOVETokenOFT(EXPECTED_MOVE_TOKEN_PROXY), ethereumEid, bytes32(uint256(uint160(EXPECTED_MOVE_TOKEN_PROXY))), 15, 15, options); + vm.stopBroadcast(); + + // Log final deployment info + console.log("\n=== Deployment Complete ==="); + console.log("Multisig Labs Ops:", multisigLabsOps); + console.log("Multisig Executor:", multisigExecutor); + console.log("Multisig Deployer:", multisigDeployer); + console.log("MOVE Token Implementation:", address(moveTokenImplementation)); + console.log("MOVE Token Proxy:", moveTokenProxy); + } + + /** + * @dev Deploys Safe multisigs for Labs Ops and Deployer + */ + function deployMultisigs() internal { + bytes memory labsOpsInitData = + hex"b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000fd0732dc9e303f09fcef3a7388ad10a83459ec9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000008bc3c3e914ace9a0e73a3e39a669148435de8bbf0000000000000000000000006890e3e256dbc8e0684f0a6ce04c05e2a6658a0700000000000000000000000082153abfc66883acf303534b34f5e27e0ff0db72000000000000000000000000944907f1fb2afa7abea02b929df496d09567c64000000000000000000000000002f57fe96ba5c135e9a8bf82626ca49423128cca000000000000000000000000aff3deeb13bd2b480751189808c16e9809eebcce000000000000000000000000648dc72081ae39814080d3ac45ad08ff4bb864170000000000000000000000000000000000000000000000000000000000000000"; + bytes memory deployerInitData = + hex"b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33aec0fe5e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005afe7a11e70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b2105464215716e1445367bea5668f581ef7d0630000000000000000000000003eb69ef2dbedd5d58aa5e074131cd22d5e87ff530000000000000000000000000000000000000000000000000000000000000000"; + bytes memory executorInitData = + hex"b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000fd0732dc9e303f09fcef3a7388ad10a83459ec990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000450ba32bf877280403d556a4a40aa03be9349a4d0000000000000000000000001da2ed7e5828352bf0e188179cd9d0e15f84006b000000000000000000000000721b92ab5c162e95ad74571ff1f7695608576de70000000000000000000000000000000000000000000000000000000000000000"; + + multisigDeployer = proxyFactory.createProxyWithNonce(MASTER_COPY_ADDRESS_130, deployerInitData, 0); + require(multisigDeployer == EXPECTED_MULTISIG_DEPLOYER, "Multisig Deployer address mismatch"); + + multisigLabsOps = proxyFactory.createProxyWithNonce(MASTER_COPY_ADDRESS_141, labsOpsInitData, 0); + require(multisigLabsOps == EXPECTED_MULTISIG_LABS_OPS, "Multisig Labs Ops address mismatch"); + + multisigExecutor = proxyFactory.createProxyWithNonce(MASTER_COPY_ADDRESS_141, executorInitData, 0); + require(multisigExecutor == EXPECTED_MULTISIG_EXECUTOR, "Multisig Executor address mismatch"); + } + + /** + * @dev Deploys MOVE token implementation and proxy via CREATE3 + */ + function deployMoveToken() internal { + // Deploy implementation + moveTokenImplementation = new MOVETokenOFT(lzEndpoint); + console.log("Deployed Implementation:", address(moveTokenImplementation)); + require(timelock != address(0), "Timelock must be deployed before deploying proxy"); + // Prepare CREATE3 deployment bytecode + bytes memory create3Bytecode = abi.encodePacked( + type(TransparentUpgradeableProxy).creationCode, + abi.encode( + address(moveTokenImplementation), + address(timelock), + abi.encodeWithSignature("initialize(address,address)", EXPECTED_MULTISIG_LABS_OPS, DEPLOYER_ADDRESS) + ) + ); + + // Deploy proxy using CREATE3 via Safe multisig + bytes memory bytecode = abi.encodeWithSignature("deploy(bytes32,bytes)", salt, create3Bytecode); + bytes32 digest = Safe(payable(multisigDeployer)).getTransactionHash( + address(create3), 0, bytecode, Enum.Operation.Call, 0, 0, 0, ZERO, payable(ZERO), 0 + ); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(digest); + bytes memory signature = abi.encodePacked(r, s, v); + require(signature.length >= 65, "Invalid signature length"); + + moveTokenProxy = create3.getDeployed(multisigDeployer, salt); + + Safe(payable(multisigDeployer)).execTransaction( + address(create3), 0, bytecode, Enum.Operation.Call, 0, 0, 0, ZERO, payable(ZERO), signature + ); + + require(moveTokenProxy == EXPECTED_MOVE_TOKEN_PROXY, "MOVE Token proxy address mismatch"); + + // Verify deployment + MOVETokenOFT move = MOVETokenOFT(moveTokenProxy); + + // Verify basic token properties + require(move.decimals() == 8, "Decimals verification failed"); + require(move.sharedDecimals() == 8, "Decimals verification failed"); + require(keccak256(bytes(move.name())) == keccak256(bytes("Movement")), "Name verification failed"); + require(keccak256(bytes(move.symbol())) == keccak256(bytes("MOVE")), "Symbol verification failed"); + require(move.owner() == DEPLOYER_ADDRESS, "Owner verification failed"); + require(address(move.endpoint()) == lzEndpoint, "Endpoint verification failed"); + require(move.totalSupply() == 0, "Total supply should be 0"); + require(move.DOMAIN_SEPARATOR() != bytes32(0), "Domain separator should not be zero"); + + console.log("Basic token properties verified"); + + // Verify EIP-712 domain + ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 domainSalt, + uint256[] memory extensions + ) = move.eip712Domain(); + + require(fields == hex"0f", "EIP-712 fields verification failed"); + require(keccak256(bytes(name)) == keccak256(bytes("Movement")), "EIP-712 name verification failed"); + require(keccak256(bytes(version)) == keccak256(bytes("1")), "EIP-712 version verification failed"); + require(chainId == block.chainid, "EIP-712 chainId verification failed"); + require(verifyingContract == address(move), "EIP-712 verifying contract verification failed"); + require(domainSalt == bytes32(0), "EIP-712 salt verification failed"); + require(extensions.length == 0, "EIP-712 extensions verification failed"); + + console.log("EIP-712 domain verified"); + + console.log("All token verifications passed"); + } + + function deployTimelock(address proposer, address executor) internal returns (address) { + require(proposer != address(0), "Proposer cannot be zero address"); + require(executor != address(0), "Executor cannot be zero address"); + return address(new TimelockController(172800, _arrayfy(proposer), _arrayfy(executor), ZERO)); + } + + /** + * @dev Configures LayerZero DVN, executor, and enforced options + */ + function configureLZ(MOVETokenOFT move, uint32 eid, bytes32 oapp, uint64 sendConfirmations, uint64 receiveConfirmations, bytes memory options) internal { + + // Configure libraries + console.log("Setting LayerZero libraries..."); + setLibraries(move, eid, sendUln302, receiveUln302); + + // Configure DVNs and executor + console.log("Configuring DVNs and executor..."); + uint256 dvnCount = 3; + address[] memory dvns = new address[](dvnCount); + dvns[0] = p2pDVN; + dvns[1] = horizenDVN; + dvns[2] = lzDVN; + + address[] memory emptyArray = new address[](0); + + + UlnConfig memory sendUlnConfig = UlnConfig({ + confirmations: defaultValues ? uint64(0) : uint64(sendConfirmations), + requiredDVNCount: defaultValues ? uint8(0) : uint8(dvnCount), + optionalDVNCount: uint8(0), + optionalDVNThreshold: uint8(0), + requiredDVNs: defaultValues ? emptyArray : _sortDVNs(dvns), + optionalDVNs: emptyArray + }); + UlnConfig memory receiveUlnConfig = UlnConfig({ + confirmations: defaultValues ? uint64(0) : uint64(receiveConfirmations), + requiredDVNCount: defaultValues ? uint8(0) : uint8(dvnCount), + optionalDVNCount: uint8(0), + optionalDVNThreshold: uint8(0), + requiredDVNs: defaultValues ? emptyArray : _sortDVNs(dvns), + optionalDVNs: emptyArray + }); + ExecutorConfig memory executorConfig = ExecutorConfig({maxMessageSize: 0, executor: lzExecutor}); + + setConfigs(address(move), eid, sendUln302, receiveUln302, sendUlnConfig, receiveUlnConfig, executorConfig); + console.log("DVN and executor configuration complete"); + + console.log("Setting Enforced Options"); + + setEnforcedOptions(move, eid, options); + + console.log("Setting Peer"); + setPeer(move, eid, oapp); + + console.log("LayerZero configuration complete"); + } + + function setEnforcedOptions(MOVETokenOFT move, uint32 eid, bytes memory options) internal { + // Set enforced options + console.log("=== ENFORCED OPTIONS CONFIG ==="); + EnforcedOptionParam[] memory enforcedParams = new EnforcedOptionParam[](2); + enforcedParams[0] = EnforcedOptionParam({eid: eid, msgType: uint16(1), options: options}); + enforcedParams[1] = EnforcedOptionParam({eid: eid, msgType: uint16(2), options: options}); + + console.log("Enforced Option Params ["); + for (uint256 i = 0; i < enforcedParams.length; i++) { + console.log(" eid:", vm.toString(enforcedParams[i].eid)); + console.log(" msgType:", vm.toString(enforcedParams[i].msgType)); + console.log(" options:", vm.toString(enforcedParams[i].options)); + } + console.log("]"); + + move.setEnforcedOptions(enforcedParams); + } + + /** + * @dev Sets the peer OApp address on the Movement network + */ + function setPeer(MOVETokenOFT move, uint32 eid, bytes32 oapp) internal { + console.log("=== PEER CONFIG ==="); + console.log("EID:", vm.toString(eid)); + console.log("Peer Address:", vm.toString(oapp)); + + move.setPeer(eid, oapp); + } + + + /** + * @dev Sets LayerZero configuration parameters for send and receive libraries + * @param contractAddress Address of the contract to configure + * @param remoteEid Remote endpoint ID to configure for + * @param sendLibraryAddress Address of the send library + * @param receiveLibraryAddress Address of the receive library + * @param sendUlnConfig ULN configuration with DVN settings + * @param receiveUlnConfig ULN configuration with DVN settings + * @param executorConfig Executor configuration settings + */ + function setConfigs( + address contractAddress, + uint32 remoteEid, + address sendLibraryAddress, + address receiveLibraryAddress, + UlnConfig memory sendUlnConfig, + UlnConfig memory receiveUlnConfig, + ExecutorConfig memory executorConfig + ) internal { + // Configure send library with executor and ULN configs + SetConfigParam[] memory sendConfigParams = new SetConfigParam[](2); + sendConfigParams[0] = + SetConfigParam({eid: remoteEid, configType: EXECUTOR_CONFIG_TYPE, config: abi.encode(executorConfig)}); + sendConfigParams[1] = + SetConfigParam({eid: remoteEid, configType: ULN_CONFIG_TYPE, config: abi.encode(sendUlnConfig)}); + + // Configure receive library with ULN config + SetConfigParam[] memory receiveConfigParams = new SetConfigParam[](1); + receiveConfigParams[0] = + SetConfigParam({eid: remoteEid, configType: RECEIVE_CONFIG_TYPE, config: abi.encode(receiveUlnConfig)}); + + console.log("=== ENDPOINT ==="); + console.log(lzEndpoint); + + console.log("=== SEND LIBRARY CONFIG ==="); + console.log("Send Library Address:", sendLibraryAddress); + console.log("Send Config Param ["); + for (uint256 i = 0; i < sendConfigParams.length; i++) { + console.log(vm.toString(sendConfigParams[i].eid)); + console.log(vm.toString(sendConfigParams[i].configType)); + console.log("\"", vm.toString(sendConfigParams[i].config),"\""); + } + console.log("]"); + + console.log("=== RECEIVE LIBRARY CONFIG ==="); + console.log("Receive Library Address:", receiveLibraryAddress); + console.log("Receive Config Param ["); + for (uint256 i = 0; i < receiveConfigParams.length; i++) { + console.log(vm.toString(receiveConfigParams[i].eid)); + console.log(vm.toString(receiveConfigParams[i].configType)); + console.log("\"", vm.toString(receiveConfigParams[i].config),"\""); + console.log(","); + } + console.log("]"); + + ILayerZeroEndpointV2(lzEndpoint).setConfig(contractAddress, sendLibraryAddress, sendConfigParams); + ILayerZeroEndpointV2(lzEndpoint).setConfig(contractAddress, receiveLibraryAddress, receiveConfigParams); + } + + /** + * @dev Sets the send and receive libraries for LayerZero messaging + * @param _eid Endpoint ID to configure for + * @param _sendLib Address of the send library + * @param _receiveLib Address of the receive library + */ + function setLibraries(MOVETokenOFT move, uint32 _eid, address _sendLib, address _receiveLib) internal { + console.log("=== LIBRARY CONFIG ==="); + console.log("OApp Address:", address(move)); + console.log("EID:", vm.toString(_eid)); + console.log("Send Library:", _sendLib); + console.log("Receive Library:", _receiveLib); + + ILayerZeroEndpointV2(lzEndpoint).setSendLibrary(address(move), _eid, _sendLib); + ILayerZeroEndpointV2(lzEndpoint).setReceiveLibrary(address(move), _eid, _receiveLib, 0); + } + + function _sortDVNs(address[] memory dvns) internal pure returns (address[] memory sortedDVNs) { + // Simple bubble sort for demonstration; optimize as needed + uint256 n = dvns.length; + sortedDVNs = dvns; + for (uint256 i = 0; i < n; i++) { + for (uint256 j = 0; j < n - i - 1; j++) { + if (sortedDVNs[j] > sortedDVNs[j + 1]) { + (sortedDVNs[j], sortedDVNs[j + 1]) = (sortedDVNs[j + 1], sortedDVNs[j]); + } + } + } + } + + function _arrayfy(address addr) internal pure returns (address[] memory arr) { + arr = new address[](1); + arr[0] = addr; + } +} diff --git a/protocol-units/settlement/mcr/contracts/script/MOVETokenDeployer.s.sol b/protocol-units/settlement/mcr/contracts/script/MOVETokenDeployer.s.sol index 52b398ec6..6dd82b697 100644 --- a/protocol-units/settlement/mcr/contracts/script/MOVETokenDeployer.s.sol +++ b/protocol-units/settlement/mcr/contracts/script/MOVETokenDeployer.s.sol @@ -27,8 +27,7 @@ contract MOVETokenDeployer is Helper { // load config and deployments data _loadExternalData(); - uint256 signer = vm.envUint("PRIVATE_KEY"); - vm.startBroadcast(signer); + vm.startBroadcast(); // Deploy CREATE3Factory, Safes and Timelock if not deployed _deployDependencies(); @@ -38,12 +37,6 @@ contract MOVETokenDeployer is Helper { // if move is already deployed, upgrade it _upgradeMove() : revert("MOVE: both admin and proxy should be registered"); - require(MOVEToken(deployment.move).balanceOf(address(deployment.movementAnchorage)) == 999999998000000000, "Movement Anchorage Safe balance is wrong"); - require(MOVEToken(deployment.move).decimals() == 8, "Decimals are expected to be 8"); - require(MOVEToken(deployment.move).totalSupply() == 1000000000000000000,"Total supply is wrong"); - require(MOVEToken(deployment.move).hasRole(DEFAULT_ADMIN_ROLE, address(deployment.movementFoundationSafe)),"Movement Foundation expected to have token admin role"); - require(!MOVEToken(deployment.move).hasRole(DEFAULT_ADMIN_ROLE, address(deployment.movementLabsSafe)),"Movement Labs not expected to have token admin role"); - require(!MOVEToken(deployment.move).hasRole(DEFAULT_ADMIN_ROLE, address(timelock)),"Timelock not expected to have token admin role"); vm.stopBroadcast(); if (vm.isContext(VmSafe.ForgeContext.ScriptBroadcast)) { @@ -69,24 +62,33 @@ contract MOVETokenDeployer is Helper { console.log("proxy", address(moveProxy)); deployment.move = address(moveProxy); deployment.moveAdmin = _storeAdminDeployment(); + + require(MOVEToken(deployment.move).balanceOf(address(deployment.movementAnchorage)) == 999999998000000000, "Movement Anchorage Safe balance is wrong"); + require(MOVEToken(deployment.move).decimals() == 8, "Decimals are expected to be 8"); + require(MOVEToken(deployment.move).totalSupply() == 1000000000000000000,"Total supply is wrong"); + require(MOVEToken(deployment.move).hasRole(DEFAULT_ADMIN_ROLE, address(deployment.movementFoundationSafe)),"Movement Foundation expected to have token admin role"); + require(!MOVEToken(deployment.move).hasRole(DEFAULT_ADMIN_ROLE, address(deployment.movementLabsSafe)),"Movement Labs not expected to have token admin role"); + require(!MOVEToken(deployment.move).hasRole(DEFAULT_ADMIN_ROLE, address(timelock)),"Timelock not expected to have token admin role"); } function _upgradeMove() internal { console.log("MOVE: upgrading"); - address layerzeroEndpoint = block.chainid == 1 ? - 0x1a44076050125825900e736c501f859c50fE728c : // Mainnet - 0x6EDCE65403992e310A62460808c4b910D972f10f; // BSC Testnet + address layerzeroEndpoint = 0x1a44076050125825900e736c501f859c50fE728c; MOVEToken newMoveImplementation = new MOVETokenV2(layerzeroEndpoint); _checkBytecodeDifference(address(newMoveImplementation), deployment.move); + console.log(address(newMoveImplementation)); + assert(deployment.moveAdmin != address(0)); + assert(deployment.move != address(0)); + assert(deployment.movementFoundationSafe != address(0)); + assert(deployment.movementLabsSafe != address(0)); + // bridge address - address[1] memory burn = [0xf1dF43A3053cd18E477233B59a25fC483C2cBe0f]; + address[] memory burn = new address[](2); + burn[0] = 0xf1dF43A3053cd18E477233B59a25fC483C2cBe0f; + burn[1] = 0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073; // Prepare the data for the upgrade - bytes memory data = abi.encodeWithSignature( - "schedule(address,uint256,bytes,bytes32,bytes32,uint256)", - address(deployment.moveAdmin), - 0, - abi.encodeWithSignature( + bytes memory upgradeCalldata = abi.encodeWithSignature( "upgradeAndCall(address,address,bytes)", address(deployment.move), address(newMoveImplementation), @@ -96,13 +98,24 @@ contract MOVETokenDeployer is Helper { 0x074C155f09cE5fC3B65b4a9Bbb01739459C7AD63, // remove old foundation burn ) - ), + ); + + bytes memory data = abi.encodeWithSignature( + "schedule(address,uint256,bytes,bytes32,bytes32,uint256)", + address(deployment.moveAdmin), + 0, + upgradeCalldata, bytes32(0), bytes32(0), config.minDelay ); + console.log("Upgrade data:"); + console.logBytes(upgradeCalldata); // Data to be used to propose the upgrade _proposeUpgrade(data, "movetoken.json"); + + // We cannot require changes since they will only happen once the timelock executes the upgrade + // Refer to test section that allows us to verify if after upgrade Token will have correct values } } diff --git a/protocol-units/settlement/mcr/contracts/script/SetOFTConfigs.s.sol b/protocol-units/settlement/mcr/contracts/script/SetOFTConfigs.s.sol new file mode 100644 index 000000000..3534bc6c9 --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/script/SetOFTConfigs.s.sol @@ -0,0 +1,318 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +// Foundry +import "forge-std/Script.sol"; +import "forge-std/console.sol"; + +// Project contracts +import {MOVETokenOFT} from "../src/token/MOVETokenOFT.sol"; +import {CREATE3Factory, ICREATE3Factory} from "./helpers/Create3/CREATE3Factory.sol"; + +// OpenZeppelin +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +// Safe +import {Enum} from "@safe-smart-account/contracts/common/Enum.sol"; +import {Safe} from "@safe-smart-account/contracts/Safe.sol"; + +// LayerZero +import {ILayerZeroEndpointV2} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import {SetConfigParam} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol"; +import {ExecutorConfig} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/SendLibBase.sol"; +import {UlnConfig} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/UlnBase.sol"; +import {EnforcedOptionParam} from "@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppOptionsType3.sol"; +import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; + +// LayerZero Address Book +import {LZProtocol} from "../layerzero_book/LZProtocol.sol"; +import {LZWorkers} from "../layerzero_book/LZWorkers.sol"; + +interface IProxyFactory { + function createProxyWithNonce(address masterCopy, bytes memory data, uint256 nonce) + external + returns (address proxy); +} + +/** + * @title DeployMOVETokenOFT + * @notice Deployment script for MOVE token on EVM chain with full LayerZero configuration + * @dev Deploys implementation, proxy via CREATE3, configures LayerZero DVNs, and sets peer + */ +contract SetOFTConfigs is Script { + // Deployment addresses + address constant DEPLOYER_ADDRESS = 0xB2105464215716e1445367BEA5668F581eF7d063; + address constant ZERO = address(0x0); + address constant MASTER_COPY_ADDRESS_130 = 0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552; + address constant MASTER_COPY_ADDRESS_141 = 0x41675C099F32341bf84BFc5382aF534df5C7461a; + + // Expected multisig addresses + address constant EXPECTED_MULTISIG_LABS_OPS = 0x5cD71FFf9947486fD6F5c193a722191c22728887; + address constant EXPECTED_MULTISIG_DEPLOYER = 0x7aE744e3b2816F660054EAbd1a1C4935DA34Ae28; + address constant EXPECTED_MULTISIG_EXECUTOR = 0x443513664Eab95280360Dc1c33FDe1ad4ED5C7bB; + address constant EXPECTED_MOVE_TOKEN_PROXY = 0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073; + + // LayerZero endpoint and libraries + address public lzEndpoint; + address public receiveUln302; + address public sendUln302; + address public lzExecutor; + + // Data Verification Networks (DVNs) + address public p2pDVN; + address public horizenDVN; + address public lzDVN; + + // LayerZero config types + uint32 public constant EXECUTOR_CONFIG_TYPE = 1; + uint32 public constant ULN_CONFIG_TYPE = 2; + uint32 public constant RECEIVE_CONFIG_TYPE = 2; + + // LayerZero parameters + uint32 public movementEid = 30325; + uint32 public hyperevmEid = 30367; + uint32 public ethereumEid = 30101; + uint32 public baseEid = 30184; + uint32 public avalancheEid = 30106; + + bool public defaultValues = false; + bytes32 public movementOapp = 0x7e4fd97ef92302eea9b10f74be1d96fb1f1511cf7ed28867b0144ca89c6ebc3c; + + // Factory contracts + IProxyFactory public proxyFactory = IProxyFactory(0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2); + CREATE3Factory public create3 = CREATE3Factory(0x2Dfcc7415D89af828cbef005F0d072D8b3F23183); + + // Deployment parameters + bytes32 public salt = 0x6c0000000000000000000000018eddf77afc0a5c6d05a564a44fe37b068922c3; + + // Deployment state + MOVETokenOFT public moveTokenImplementation; + address public moveTokenProxy; + address public multisigLabsOps; + address public multisigExecutor; + address public multisigDeployer; + address public timelock; + + function run() external { + + // Load LayerZero configuration from layerzero_book/LZProtocol.sol + LZProtocol lzProtocol = new LZProtocol(); + uint32 eid = lzProtocol.getEidByChainId(block.chainid); + LZProtocol.ProtocolAddresses memory addresses = lzProtocol.getProtocolAddresses(eid); + + // Set LayerZero addresses from protocol + lzEndpoint = addresses.endpointV2; + sendUln302 = addresses.sendUln302; + receiveUln302 = addresses.receiveUln302; + lzExecutor = addresses.executor; + + // Load DVN addresses from LZWorkers + LZWorkers lzWorkers = new LZWorkers(); + p2pDVN = lzWorkers.getDVNAddress("P2P", eid); + horizenDVN = lzWorkers.getDVNAddress("Horizen", eid); + lzDVN = lzWorkers.getDVNAddress("LayerZero Labs", eid); + + // Assert that all addresses are not zero + require(lzEndpoint != address(0), "LayerZero endpoint cannot be zero address"); + require(sendUln302 != address(0), "Send ULN 302 cannot be zero address"); + require(receiveUln302 != address(0), "Receive ULN 302 cannot be zero address"); + require(lzExecutor != address(0), "LayerZero executor cannot be zero address"); + require(p2pDVN != address(0), "P2P DVN cannot be zero address"); + require(horizenDVN != address(0), "Horizen DVN cannot be zero address"); + require(lzDVN != address(0), "LayerZero Labs DVN cannot be zero address"); + + vm.startBroadcast(); + + bytes memory options = abi.encodePacked(uint176(0x00030100110100000000000000000000000000013880)); + bytes32 evmAddress = bytes32(uint256(uint160(EXPECTED_MOVE_TOKEN_PROXY))); + // Movement + // configureLZ(MOVETokenOFT(EXPECTED_MOVE_TOKEN_PROXY), movementEid, movementOapp, 15, 250000, options); + // Avalanche + // configureLZ(MOVETokenOFT(EXPECTED_MOVE_TOKEN_PROXY), avalancheEid, evmAddress, 15, 15, options); + // HyperEVM + // configureLZ(MOVETokenOFT(EXPECTED_MOVE_TOKEN_PROXY), hyperevmEid, evmAddress, 15, 15, options); + // Base + // configureLZ(MOVETokenOFT(EXPECTED_MOVE_TOKEN_PROXY), baseEid, evmAddress, 15, 15, options); + // Ethereum + configureLZ(MOVETokenOFT(EXPECTED_MOVE_TOKEN_PROXY), ethereumEid, evmAddress, 15, 15, options); + + vm.stopBroadcast(); + } + + // forge script DefaultConfig --rpc-url https://rpc.hypurrscan.io --account movement_deployer + + /** + * @dev Configures LayerZero DVN, executor, and enforced options + */ + function configureLZ(MOVETokenOFT move, uint32 eid, bytes32 oapp, uint64 sendConfirmations, uint64 receiveConfirmations, bytes memory options) internal { + + // Configure libraries + console.log("Setting LayerZero libraries..."); + setLibraries(move, eid, sendUln302, receiveUln302); + + // Configure DVNs and executor + console.log("Configuring DVNs and executor..."); + uint256 dvnCount = 3; + address[] memory dvns = new address[](dvnCount); + dvns[0] = p2pDVN; + dvns[1] = horizenDVN; + dvns[2] = lzDVN; + + address[] memory emptyArray = new address[](0); + + + UlnConfig memory sendUlnConfig = UlnConfig({ + confirmations: defaultValues ? uint64(0) : uint64(sendConfirmations), + requiredDVNCount: defaultValues ? uint8(0) : uint8(dvnCount), + optionalDVNCount: uint8(0), + optionalDVNThreshold: uint8(0), + requiredDVNs: defaultValues ? emptyArray : _sortDVNs(dvns), + optionalDVNs: emptyArray + }); + UlnConfig memory receiveUlnConfig = UlnConfig({ + confirmations: defaultValues ? uint64(0) : uint64(receiveConfirmations), + requiredDVNCount: defaultValues ? uint8(0) : uint8(dvnCount), + optionalDVNCount: uint8(0), + optionalDVNThreshold: uint8(0), + requiredDVNs: defaultValues ? emptyArray : _sortDVNs(dvns), + optionalDVNs: emptyArray + }); + ExecutorConfig memory executorConfig = ExecutorConfig({maxMessageSize: 0, executor: lzExecutor}); + + setConfigs(address(move), eid, sendUln302, receiveUln302, sendUlnConfig, receiveUlnConfig, executorConfig); + console.log("DVN and executor configuration complete"); + + console.log("Setting Enforced Options"); + + setEnforcedOptions(move, eid, options); + + console.log("Setting Peer"); + setPeer(move, eid, oapp); + + console.log("LayerZero configuration complete"); + } + + function setEnforcedOptions(MOVETokenOFT move, uint32 eid, bytes memory options) internal { + // Set enforced options + console.log("=== ENFORCED OPTIONS CONFIG ==="); + EnforcedOptionParam[] memory enforcedParams = new EnforcedOptionParam[](2); + enforcedParams[0] = EnforcedOptionParam({eid: eid, msgType: uint16(1), options: options}); + enforcedParams[1] = EnforcedOptionParam({eid: eid, msgType: uint16(2), options: options}); + + console.log("Enforced Option Params ["); + for (uint256 i = 0; i < enforcedParams.length; i++) { + console.log(" eid:", vm.toString(enforcedParams[i].eid)); + console.log(" msgType:", vm.toString(enforcedParams[i].msgType)); + console.log(" options:", vm.toString(enforcedParams[i].options)); + } + console.log("]"); + + // move.setEnforcedOptions(enforcedParams); + } + + /** + * @dev Sets the peer OApp address on the Movement network + */ + function setPeer(MOVETokenOFT move, uint32 eid, bytes32 oapp) internal { + console.log("=== PEER CONFIG ==="); + console.log("EID:", vm.toString(eid)); + console.log("Peer Address:", vm.toString(oapp)); + + // move.setPeer(eid, oapp); + } + + + /** + * @dev Sets LayerZero configuration parameters for send and receive libraries + * @param contractAddress Address of the contract to configure + * @param remoteEid Remote endpoint ID to configure for + * @param sendLibraryAddress Address of the send library + * @param receiveLibraryAddress Address of the receive library + * @param sendUlnConfig ULN configuration with DVN settings + * @param receiveUlnConfig ULN configuration with DVN settings + * @param executorConfig Executor configuration settings + */ + function setConfigs( + address contractAddress, + uint32 remoteEid, + address sendLibraryAddress, + address receiveLibraryAddress, + UlnConfig memory sendUlnConfig, + UlnConfig memory receiveUlnConfig, + ExecutorConfig memory executorConfig + ) internal { + // Configure send library with executor and ULN configs + SetConfigParam[] memory sendConfigParams = new SetConfigParam[](2); + sendConfigParams[0] = + SetConfigParam({eid: remoteEid, configType: EXECUTOR_CONFIG_TYPE, config: abi.encode(executorConfig)}); + sendConfigParams[1] = + SetConfigParam({eid: remoteEid, configType: ULN_CONFIG_TYPE, config: abi.encode(sendUlnConfig)}); + + // Configure receive library with ULN config + SetConfigParam[] memory receiveConfigParams = new SetConfigParam[](1); + receiveConfigParams[0] = + SetConfigParam({eid: remoteEid, configType: RECEIVE_CONFIG_TYPE, config: abi.encode(receiveUlnConfig)}); + + console.log("=== ENDPOINT ==="); + console.log(lzEndpoint); + + console.log("=== SEND LIBRARY CONFIG ==="); + console.log("Send Library Address:", sendLibraryAddress); + console.log("Send Config Param ["); + for (uint256 i = 0; i < sendConfigParams.length; i++) { + console.log(vm.toString(sendConfigParams[i].eid)); + console.log(vm.toString(sendConfigParams[i].configType)); + console.log("\"", vm.toString(sendConfigParams[i].config),"\""); + } + console.log("]"); + + console.log("=== RECEIVE LIBRARY CONFIG ==="); + console.log("Receive Library Address:", receiveLibraryAddress); + console.log("Receive Config Param ["); + for (uint256 i = 0; i < receiveConfigParams.length; i++) { + console.log(vm.toString(receiveConfigParams[i].eid)); + console.log(vm.toString(receiveConfigParams[i].configType)); + console.log("\"", vm.toString(receiveConfigParams[i].config),"\""); + console.log(","); + } + console.log("]"); + + // ILayerZeroEndpointV2(lzEndpoint).setConfig(contractAddress, sendLibraryAddress, sendConfigParams); + // ILayerZeroEndpointV2(lzEndpoint).setConfig(contractAddress, receiveLibraryAddress, receiveConfigParams); + } + + /** + * @dev Sets the send and receive libraries for LayerZero messaging + * @param _eid Endpoint ID to configure for + * @param _sendLib Address of the send library + * @param _receiveLib Address of the receive library + */ + function setLibraries(MOVETokenOFT move, uint32 _eid, address _sendLib, address _receiveLib) internal { + console.log("=== LIBRARY CONFIG ==="); + console.log("OApp Address:", address(move)); + console.log("EID:", vm.toString(_eid)); + console.log("Send Library:", _sendLib); + console.log("Receive Library:", _receiveLib); + + // ILayerZeroEndpointV2(lzEndpoint).setSendLibrary(address(move), _eid, _sendLib); + // ILayerZeroEndpointV2(lzEndpoint).setReceiveLibrary(address(move), _eid, _receiveLib, 0); + } + + function _sortDVNs(address[] memory dvns) internal pure returns (address[] memory sortedDVNs) { + // Simple bubble sort for demonstration; optimize as needed + uint256 n = dvns.length; + sortedDVNs = dvns; + for (uint256 i = 0; i < n; i++) { + for (uint256 j = 0; j < n - i - 1; j++) { + if (sortedDVNs[j] > sortedDVNs[j + 1]) { + (sortedDVNs[j], sortedDVNs[j + 1]) = (sortedDVNs[j + 1], sortedDVNs[j]); + } + } + } + } + + function _arrayfy(address addr) internal pure returns (address[] memory arr) { + arr = new address[](1); + arr[0] = addr; + } +} diff --git a/protocol-units/settlement/mcr/contracts/script/UpgradeMOVETokenHyperliquidV2.s.sol b/protocol-units/settlement/mcr/contracts/script/UpgradeMOVETokenHyperliquidV2.s.sol new file mode 100644 index 000000000..8c67638de --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/script/UpgradeMOVETokenHyperliquidV2.s.sol @@ -0,0 +1,125 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +// Foundry +import "forge-std/Script.sol"; +import "forge-std/console.sol"; + +// Project contracts +import {MOVETokenHyperliquidV2} from "../src/token/MOVETokenHyperliquidV2.sol"; +import {CREATE3Factory, ICREATE3Factory} from "./helpers/Create3/CREATE3Factory.sol"; + +// OpenZeppelin +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +// Safe +import {Enum} from "@safe-smart-account/contracts/common/Enum.sol"; +import {Safe} from "@safe-smart-account/contracts/Safe.sol"; + +// LayerZero +import {ILayerZeroEndpointV2} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import {SetConfigParam} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol"; +import {ExecutorConfig} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/SendLibBase.sol"; +import {UlnConfig} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/UlnBase.sol"; +import {EnforcedOptionParam} from "@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppOptionsType3.sol"; +import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; + +interface IProxyFactory { + function createProxyWithNonce(address masterCopy, bytes memory data, uint256 nonce) + external + returns (address proxy); +} + +/** + * @title DeployMOVETokenHyperliquidV2 + * @notice Deployment script for MOVE token on Hyperliquid with full LayerZero configuration + * @dev Deploys implementation, proxy via CREATE3, configures LayerZero DVNs, and sets peer + */ +contract UpgradeMOVETokenHyperliquidV2 is Script { + // Deployment addresses + address constant DEPLOYER_ADDRESS = 0xB2105464215716e1445367BEA5668F581eF7d063; + address constant ZERO = address(0x0); + + // LayerZero endpoint and libraries (Hyperliquid Mainnet) + address public lzEndpoint = 0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9; + address public receiveUln302 = 0x7cacBe439EaD55fa1c22790330b12835c6884a91; + address public sendUln302 = 0xfd76d9CB0Bac839725aB79127E7411fe71b1e3CA; + address public lzExecutor = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; + + // Deployment state + MOVETokenHyperliquidV2 public moveTokenImplementation; + address public moveTokenProxy = 0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073; + MOVETokenHyperliquidV2 public move = MOVETokenHyperliquidV2(payable(moveTokenProxy)); + + // LayerZero parameters + uint32 public movementEid = 30325; + uint64 public confirmations = 0; + bytes32 public movementOapp = 0x7e4fd97ef92302eea9b10f74be1d96fb1f1511cf7ed28867b0144ca89c6ebc3c; + + + function run() external { + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + require(vm.addr(deployerPrivateKey) == DEPLOYER_ADDRESS, "Private key does not match deployer address"); + + vm.startBroadcast(deployerPrivateKey); + + // Deploy new MOVE implementation + moveTokenImplementation = new MOVETokenHyperliquidV2(lzEndpoint); + + // Verify basic token properties + require(move.decimals() == 8, "Decimals verification failed"); + require(move.sharedDecimals() == 6, "Decimals verification failed"); + require(keccak256(bytes(move.name())) == keccak256(bytes("Movement")), "Name verification failed"); + require(keccak256(bytes(move.symbol())) == keccak256(bytes("MOVE")), "Symbol verification failed"); + require(move.owner() == DEPLOYER_ADDRESS, "Owner verification failed"); + require(address(move.endpoint()) == lzEndpoint, "Endpoint verification failed"); + require(move.totalSupply() == 0, "Total supply should be 0"); + require(move.DOMAIN_SEPARATOR() != bytes32(0), "Domain separator should not be zero"); + ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 domainSalt, + uint256[] memory extensions + ) = move.eip712Domain(); + + require(fields == hex"0f", "EIP-712 fields verification failed"); + require(keccak256(bytes(name)) == keccak256(bytes("Movement")), "EIP-712 name verification failed"); + require(keccak256(bytes(version)) == keccak256(bytes("1")), "EIP-712 version verification failed"); + require(chainId == block.chainid, "EIP-712 chainId verification failed"); + require(verifyingContract == address(move), "EIP-712 verifying contract verification failed"); + require(domainSalt == bytes32(0), "EIP-712 salt verification failed"); + require(extensions.length == 0, "EIP-712 extensions verification failed"); + + // Verify finalizer storage slot + address finalizer = address(uint160(uint256(vm.load(address(move), keccak256("HyperCore deployer"))))); + require(finalizer == DEPLOYER_ADDRESS, "Finalizer verification failed"); + + // Verify send library configuration + address receivedSendLib = move.endpoint().getSendLibrary(address(move), movementEid); + require(receivedSendLib == sendUln302, "Send library verification failed"); + console.log("Send library verified:", receivedSendLib); + + // Verify receive library configuration + (address receivedReceiveLib,) = move.endpoint().getReceiveLibrary(address(move), movementEid); + require(receivedReceiveLib == receiveUln302, "Receive library verification failed"); + console.log("Receive library verified:", receivedReceiveLib); + console.log("Finalizer verified"); + + bytes memory options = abi.encodePacked(uint176(0x00030100110100000000000000000000000000013880)); + // Verify enforced options are set for both message types + bytes memory verifyOptions1 = move.enforcedOptions(movementEid, uint16(1)); + bytes memory verifyOptions2 = move.enforcedOptions(movementEid, uint16(2)); + require(keccak256(verifyOptions1) == keccak256(options), "Enforced options verification failed for msgType 1"); + require(keccak256(verifyOptions2) == keccak256(options), "Enforced options verification failed for msgType 2"); + console.log("Enforced options verified for both message types"); + + // Verify peer is set correctly + bytes32 verifyPeer = move.peers(movementEid); + require(verifyPeer == movementOapp, "Peer verification failed"); + + vm.stopBroadcast(); + } +} diff --git a/protocol-units/settlement/mcr/contracts/script/UpgradeMOVETokenHyperliquidV3.s.sol b/protocol-units/settlement/mcr/contracts/script/UpgradeMOVETokenHyperliquidV3.s.sol new file mode 100644 index 000000000..99c36f46d --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/script/UpgradeMOVETokenHyperliquidV3.s.sol @@ -0,0 +1,195 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +// Foundry +import "forge-std/Script.sol"; +import "forge-std/console.sol"; + +// Project contracts +import {MOVETokenHyperliquidV3} from "../src/token/MOVETokenHyperliquidV3.sol"; + +// OpenZeppelin +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; + +/** + * @title UpgradeMOVETokenHyperliquidV3 + * @notice Script for upgrading MOVETokenHyperliquidV2 to MOVETokenHyperliquidV3 via timelock + * @dev This script: + * 1. Deploys the V3 implementation contract + * 2. Schedules the upgrade through the timelock (requires proposer role) + * 3. After MIN_DELAY (48 hours), executes the upgrade (requires executor role) + * 4. Calls initialize on V3 to set up AccessControl roles + * 5. Verifies the upgrade was successful + */ +contract UpgradeMOVETokenHyperliquidV3 is Script { + // ============================================================================= + // CONSTANTS - ADDRESSES + // ============================================================================= + + /// @dev Timelock controller address + address constant TIMELOCK_ADDRESS = 0xA649f6335828f070dDDd7A8c4F5bef2b6FF7Bd51; + /// @dev Proposer address (multisig) + address constant PROPOSER_ADDRESS = 0x5cD71FFf9947486fD6F5c193a722191c22728887; + /// @dev Executor address (multisig) + address constant EXECUTOR_ADDRESS = 0x443513664Eab95280360Dc1c33FDe1ad4ED5C7bB; + /// @dev Deployer address + address constant DEPLOYER_ADDRESS = 0xB2105464215716e1445367BEA5668F581eF7d063; + /// @dev Proxy Admin address + address constant PROXY_ADMIN_ADDRESS = 0x8365AA031806A1ac2b31a5d3b8323020FC85DfEc; + /// @dev MOVE Token Proxy address + address constant MOVE_TOKEN_PROXY = 0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073; + /// @dev LayerZero endpoint address (Hyperliquid Mainnet) + address constant LZ_ENDPOINT = 0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9; + + // ============================================================================= + // CONSTANTS - CONFIGURATION + // ============================================================================= + + /// @dev Minimum delay for timelock operations (48 hours) + uint256 public constant MIN_DELAY = 48 hours; + /// @dev MOVE token decimals + uint8 public constant MOVE_DECIMALS = 8; + + // ============================================================================= + // STATE VARIABLES + // ============================================================================= + + MOVETokenHyperliquidV3 public moveTokenImplementationV3; + MOVETokenHyperliquidV3 public moveV3; + ProxyAdmin public admin; + TimelockController public timelock; + + // ============================================================================= + // MAIN FUNCTIONS + // ============================================================================= + + /** + * @dev Deploys the V3 implementation and logs the schedule upgrade parameters for multisig UI + * Run with: forge script UpgradeMOVETokenHyperliquidV3 --rpc-url --broadcast + * + */ + function run() public { + + vm.startBroadcast(); + + // Deploy new V3 implementation + moveTokenImplementationV3 = new MOVETokenHyperliquidV3(LZ_ENDPOINT); + + vm.stopBroadcast(); + + console.log("==========================================="); + console.log("V3 Implementation Deployed"); + console.log("==========================================="); + console.log("Implementation Address:", address(moveTokenImplementationV3)); + console.log("LayerZero Endpoint:", LZ_ENDPOINT); + console.log("==========================================="); + console.log(""); + + // Prepare upgrade data with initialize call to set up AccessControl + bytes memory initData = abi.encodeWithSignature("initialize(address)", PROPOSER_ADDRESS); + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + MOVE_TOKEN_PROXY, + address(moveTokenImplementationV3), + initData + ); + + console.log("==========================================="); + console.log("SCHEDULE UPGRADE - MULTISIG PARAMETERS"); + console.log("==========================================="); + console.log("To:", TIMELOCK_ADDRESS); + console.log("Function: schedule(address,uint256,bytes,bytes32,bytes32,uint256)"); + console.log(""); + console.log("Parameters:"); + console.log(" target:", PROXY_ADMIN_ADDRESS); + console.log(" value:", vm.toString(uint256(0))); + console.log(" data:", vm.toString(upgradeData)); + console.log(" predecessor:", vm.toString(bytes32(0))); + console.log(" salt:", vm.toString(bytes32(0))); + console.log(" delay:", vm.toString(MIN_DELAY)); + console.log(""); + console.log("Context:"); + console.log(" Implementation:", address(moveTokenImplementationV3)); + console.log(" Proxy:", MOVE_TOKEN_PROXY); + console.log(" Ready for execution at:", block.timestamp + MIN_DELAY); + console.log("==========================================="); + } + + /** + * @dev Verifies the upgrade was successful + * Run with: forge script UpgradeMOVETokenHyperliquidV3 --sig "verifyUpgrade(address,address)" --rpc-url + * + * @param implementationAddress Address of the deployed V3 implementation + */ + function verifyUpgrade(address implementationAddress) public { + moveV3 = MOVETokenHyperliquidV3(MOVE_TOKEN_PROXY); + + console.log("==========================================="); + console.log("Verifying V3 Upgrade"); + console.log("==========================================="); + + // Verify basic token properties + require(moveV3.decimals() == MOVE_DECIMALS, "Decimals verification failed"); + require(moveV3.sharedDecimals() == MOVE_DECIMALS, "SharedDecimals verification failed"); + require(keccak256(bytes(moveV3.name())) == keccak256(bytes("Movement")), "Name verification failed"); + require(keccak256(bytes(moveV3.symbol())) == keccak256(bytes("MOVE")), "Symbol verification failed"); + require(address(moveV3.endpoint()) == LZ_ENDPOINT, "Endpoint verification failed"); + console.log("Basic token properties verified"); + + // Verify implementation address + bytes32 implementationSlot = vm.load(MOVE_TOKEN_PROXY, bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1)); + address currentImpl; + assembly { + currentImpl := and(implementationSlot, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + } + require(currentImpl == implementationAddress, "Implementation verification failed"); + console.log("Implementation updated correctly"); + console.log(" Current Implementation:", currentImpl); + + // Verify AccessControl roles + bytes32 DEFAULT_ADMIN_ROLE = moveV3.DEFAULT_ADMIN_ROLE(); + bytes32 PAUSER_ROLE = moveV3.PAUSER_ROLE(); + bytes32 UNPAUSER_ROLE = moveV3.UNPAUSER_ROLE(); + + require(moveV3.hasRole(DEFAULT_ADMIN_ROLE, PROPOSER_ADDRESS), "DEFAULT_ADMIN_ROLE verification failed"); + require(moveV3.hasRole(PAUSER_ROLE, PROPOSER_ADDRESS), "PAUSER_ROLE verification failed"); + require(moveV3.hasRole(UNPAUSER_ROLE, PROPOSER_ADDRESS), "UNPAUSER_ROLE verification failed"); + console.log("AccessControl roles verified"); + + // Verify pausing functionality + require(!moveV3.paused(), "Contract should not be paused initially"); + console.log("Contract is not paused"); + + // Verify EIP-712 domain + ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 domainSalt, + uint256[] memory extensions + ) = moveV3.eip712Domain(); + + require(fields == hex"0f", "EIP-712 fields verification failed"); + require(keccak256(bytes(name)) == keccak256(bytes("Movement")), "EIP-712 name verification failed"); + require(keccak256(bytes(version)) == keccak256(bytes("1")), "EIP-712 version verification failed"); + require(chainId == block.chainid, "EIP-712 chainId verification failed"); + require(verifyingContract == MOVE_TOKEN_PROXY, "EIP-712 verifying contract verification failed"); + require(domainSalt == bytes32(0), "EIP-712 salt verification failed"); + require(extensions.length == 0, "EIP-712 extensions verification failed"); + console.log("EIP-712 domain verified"); + + // Verify finalizer storage slot (should remain from original deployment) + address finalizer = address(uint160(uint256(vm.load(MOVE_TOKEN_PROXY, keccak256("HyperCore deployer"))))); + require(finalizer == DEPLOYER_ADDRESS, "Finalizer verification failed"); + console.log("Finalizer storage preserved"); + console.log(" Finalizer:", finalizer); + + console.log("==========================================="); + console.log("All Verifications Passed!"); + console.log("==========================================="); + } +} diff --git a/protocol-units/settlement/mcr/contracts/script/config.sh b/protocol-units/settlement/mcr/contracts/script/config.sh new file mode 100644 index 000000000..292c77331 --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/script/config.sh @@ -0,0 +1,2 @@ +forge script SetOFTConfigs --rpc-url https://rpc.hypurrscan.io --account movement_deployer 2>&1 | tee -a ./defaultconfig.log +forge script SetOFTConfigs --rpc-url "$(chains base)" --account movement_deployer 2>&1 | tee -a ./defaultconfig.log diff --git a/protocol-units/settlement/mcr/contracts/script/helpers/Helper.sol b/protocol-units/settlement/mcr/contracts/script/helpers/Helper.sol index 32ad2cfea..f6d7c0c66 100644 --- a/protocol-units/settlement/mcr/contracts/script/helpers/Helper.sol +++ b/protocol-units/settlement/mcr/contracts/script/helpers/Helper.sol @@ -283,6 +283,7 @@ contract Helper is Script { function _proposeUpgrade(bytes memory data, string memory fileName) internal { string memory json = "safeCall"; // Serialize the relevant fields into JSON format + json.serialize("to", address(timelock)); string memory zero = "0"; json.serialize("value", zero); diff --git a/protocol-units/settlement/mcr/contracts/script/helpers/upgrade/movetoken.json b/protocol-units/settlement/mcr/contracts/script/helpers/upgrade/movetoken.json new file mode 100644 index 000000000..6171c45c5 --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/script/helpers/upgrade/movetoken.json @@ -0,0 +1 @@ +{"chainId":"1","data":"0x01d5062a0000000000000000000000008365aa031806a1ac2b31a5d3b8323020fc85dfec000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a30000000000000000000000000000000000000000000000000000000000000001249623609d0000000000000000000000003073f7aaa4db83f95e9fff17424f71d4751a30730000000000000000000000002e2bc0e2920578e0d46d1f83787b01f1d80946950000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008477a24f36000000000000000000000000d7e22951de7af453aac5400d6e072e3b63beb7e2000000000000000000000000074c155f09ce5fc3b65b4a9bbb01739459c7ad63000000000000000000000000f1df43a3053cd18e477233b59a25fc483c2cbe0f0000000000000000000000003073f7aaa4db83f95e9fff17424f71d4751a30730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","operation":"OperationType.Call","safeAddress":"0xd7E22951DE7aF453aAc5400d6E072E3b63BeB7E2","to":"0x0000000000000000000000000000000000000000","value":"0"} \ No newline at end of file diff --git a/protocol-units/settlement/mcr/contracts/src/token/MOVETokenHyperliquid.sol b/protocol-units/settlement/mcr/contracts/src/token/MOVETokenHyperliquid.sol new file mode 100644 index 000000000..e5ed7d1ed --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/src/token/MOVETokenHyperliquid.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +import {ERC20PermitUpgradeable} from + "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol"; +import {OFTUpgradeable} from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTUpgradeable.sol"; + +contract MOVETokenHyperliquid is ERC20PermitUpgradeable, OFTUpgradeable { + + /// keccak256("HyperCore deployer") + bytes32 internal constant FINALIZER_SLOT = 0x8c306a6a12fff1951878e8621be6674add1102cd359dd968efbbe797629ef84f; + + /** + * @dev Disables potential implementation exploit + */ + constructor(address _endpoint) OFTUpgradeable(_endpoint) {_disableInitializers();} + + /** + * @dev Initializes the contract with initial parameters. + * @param _delegate The address of the delegate. + */ + function initialize(address _delegate) external virtual initializer { + __OFT_init("Movement", "MOVE", _delegate); + __EIP712_init_unchained("Movement", "1"); + __Ownable_init_unchained(_delegate); + _setFinalizer(_delegate); + } + + /** + * @dev Returns the number of decimals + * @notice decimals is set to 8, following the Movement network standard decimals + */ + function decimals() public pure virtual override returns (uint8) { + return 8; + } + + /** + * @dev Sets the finalizer address. + * @param _finalizer The address of the finalizer. + */ + function setFinalizer(address _finalizer) external onlyOwner { + _setFinalizer(_finalizer); + } + + function _setFinalizer(address _finalizer) internal { + assembly { + sstore(FINALIZER_SLOT, _finalizer) + } + } +} diff --git a/protocol-units/settlement/mcr/contracts/src/token/MOVETokenHyperliquidV2.sol b/protocol-units/settlement/mcr/contracts/src/token/MOVETokenHyperliquidV2.sol new file mode 100644 index 000000000..9cdbffdc5 --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/src/token/MOVETokenHyperliquidV2.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +import {MOVETokenHyperliquid} from "./MOVETokenHyperliquid.sol"; + +contract MOVETokenHyperliquidV2 is MOVETokenHyperliquid { + + /** + * @dev Disables potential implementation exploit + */ + constructor(address _endpoint) MOVETokenHyperliquid(_endpoint) {_disableInitializers();} + + /** + * @dev Returns the number of shared decimals + * @notice shared decimals is set to 8, following the Movement network standard decimals + */ + function sharedDecimals() public pure virtual override returns (uint8) { + return 8; + } +} diff --git a/protocol-units/settlement/mcr/contracts/src/token/MOVETokenHyperliquidV3.sol b/protocol-units/settlement/mcr/contracts/src/token/MOVETokenHyperliquidV3.sol new file mode 100644 index 000000000..c7d26bd0c --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/src/token/MOVETokenHyperliquidV3.sol @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +import {MOVETokenHyperliquidV2} from "./MOVETokenHyperliquidV2.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import { SendParam, MessagingFee, MessagingReceipt, OFTReceipt } from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; + +contract MOVETokenHyperliquidV3 is MOVETokenHyperliquidV2, AccessControlUpgradeable, PausableUpgradeable { + + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); + bytes32 public constant UNPAUSER_ROLE = keccak256("UNPAUSER_ROLE"); + + /** + * @dev Disables potential implementation exploit + */ + constructor(address _endpoint) MOVETokenHyperliquidV2(_endpoint) {_disableInitializers();} + + /** + * @dev Initializes the contract with initial parameters. + * @param _owner The address of the contract owner. + */ + function initialize(address _owner) external override reinitializer(2) { + _grantRole(DEFAULT_ADMIN_ROLE, _owner); + _grantRole(PAUSER_ROLE, _owner); + _grantRole(UNPAUSER_ROLE, _owner); + } + + /** + * @dev Executes the send operation. + * @param _sendParam The parameters for the send operation. + * @param _fee The calculated fee for the send() operation. + * - nativeFee: The native fee. + * - lzTokenFee: The lzToken fee. + * @param _refundAddress The address to receive any excess funds. + * @return msgReceipt The receipt for the send operation. + * @return oftReceipt The OFT receipt information. + */ + function send(SendParam calldata _sendParam, MessagingFee calldata _fee, address _refundAddress) + external + payable + override + whenNotPaused + returns (MessagingReceipt memory msgReceipt, OFTReceipt memory oftReceipt) + { + (uint256 amountSentLD, uint256 amountReceivedLD) = _debit( + msg.sender, + _sendParam.amountLD, + _sendParam.minAmountLD, + _sendParam.dstEid + ); + + // @dev Builds the options and OFT message to quote in the endpoint. + (bytes memory message, bytes memory options) = _buildMsgAndOptions(_sendParam, amountReceivedLD); + + // @dev Sends the message to the LayerZero endpoint and returns the LayerZero msg receipt. + msgReceipt = _lzSend(_sendParam.dstEid, message, options, _fee, _refundAddress); + // @dev Formulate the OFT receipt. + oftReceipt = OFTReceipt(amountSentLD, amountReceivedLD); + + emit OFTSent(msgReceipt.guid, _sendParam.dstEid, msg.sender, amountSentLD, amountReceivedLD); + } + + /** + * @dev Pauses all bridging. + * Can only be called by an account with the PAUSER_ROLE. + */ + function pause() external onlyRole(PAUSER_ROLE) { + _pause(); + } + + /** + * @dev Unpauses all bridging. + * Can only be called by an account with the UNPAUSER_ROLE. + */ + function unpause() external onlyRole(UNPAUSER_ROLE) { + _unpause(); + } +} diff --git a/protocol-units/settlement/mcr/contracts/src/token/MOVETokenOFT.sol b/protocol-units/settlement/mcr/contracts/src/token/MOVETokenOFT.sol new file mode 100644 index 000000000..ab73e534a --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/src/token/MOVETokenOFT.sol @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +import {ERC20PermitUpgradeable} from + "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol"; +import {OFTUpgradeable} from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import { SendParam, MessagingFee, MessagingReceipt, OFTReceipt } from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; + + +contract MOVETokenOFT is ERC20PermitUpgradeable, OFTUpgradeable, AccessControlUpgradeable, PausableUpgradeable { + + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); + bytes32 public constant UNPAUSER_ROLE = keccak256("UNPAUSER_ROLE"); + + /** + * @dev Disables potential implementation exploit + */ + constructor(address _endpoint) OFTUpgradeable(_endpoint) { + _disableInitializers(); + } + + /** + * @dev Initializes the contract with initial parameters. + * @param _owner The address of the contract owner. + * @param _delegate The address of the delegate. + */ + function initialize(address _owner, address _delegate) external initializer { + __OFT_init("Movement", "MOVE", _delegate); + __EIP712_init_unchained("Movement", "1"); + __Ownable_init_unchained(_delegate); + _grantRole(DEFAULT_ADMIN_ROLE, _owner); + _grantRole(PAUSER_ROLE, _owner); + _grantRole(UNPAUSER_ROLE, _owner); + } + + /** + * @dev Executes the send operation. + * @param _sendParam The parameters for the send operation. + * @param _fee The calculated fee for the send() operation. + * - nativeFee: The native fee. + * - lzTokenFee: The lzToken fee. + * @param _refundAddress The address to receive any excess funds. + * @return msgReceipt The receipt for the send operation. + * @return oftReceipt The OFT receipt information. + */ + function send(SendParam calldata _sendParam, MessagingFee calldata _fee, address _refundAddress) + external + payable + override + whenNotPaused + returns (MessagingReceipt memory msgReceipt, OFTReceipt memory oftReceipt) + { + (uint256 amountSentLD, uint256 amountReceivedLD) = _debit( + msg.sender, + _sendParam.amountLD, + _sendParam.minAmountLD, + _sendParam.dstEid + ); + + // @dev Builds the options and OFT message to quote in the endpoint. + (bytes memory message, bytes memory options) = _buildMsgAndOptions(_sendParam, amountReceivedLD); + + // @dev Sends the message to the LayerZero endpoint and returns the LayerZero msg receipt. + msgReceipt = _lzSend(_sendParam.dstEid, message, options, _fee, _refundAddress); + // @dev Formulate the OFT receipt. + oftReceipt = OFTReceipt(amountSentLD, amountReceivedLD); + + emit OFTSent(msgReceipt.guid, _sendParam.dstEid, msg.sender, amountSentLD, amountReceivedLD); + } + + /** + * @dev Pauses all bridging. + * Can only be called by an account with the PAUSER_ROLE. + */ + function pause() external onlyRole(PAUSER_ROLE) { + _pause(); + } + + /** + * @dev Unpauses all bridging. + * Can only be called by an account with the UNPAUSER_ROLE. + */ + function unpause() external onlyRole(UNPAUSER_ROLE) { + _unpause(); + } + + /** + * @dev Returns the number of decimals + * @notice decimals is set to 8, following the Movement network standard decimals + */ + function decimals() public pure virtual override returns (uint8) { + return 8; + } + + /** + * @dev Returns the number of shared decimals + * @notice shared decimals is set to 8, following the Movement network standard decimals + */ + function sharedDecimals() public pure virtual override returns (uint8) { + return 8; + } + + +} diff --git a/protocol-units/settlement/mcr/contracts/src/token/MOVETokenV2.sol b/protocol-units/settlement/mcr/contracts/src/token/MOVETokenV2.sol index 47370bd6a..2f8c40d8e 100644 --- a/protocol-units/settlement/mcr/contracts/src/token/MOVETokenV2.sol +++ b/protocol-units/settlement/mcr/contracts/src/token/MOVETokenV2.sol @@ -3,29 +3,89 @@ pragma solidity ^0.8.26; import {MOVEToken} from "./MOVEToken.sol"; import {OFTUpgradeable, ERC20Upgradeable} from "@layerzerolabs/oft-evm-upgradeable/contracts/oft/OFTUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import { SendParam, MessagingFee, MessagingReceipt, OFTReceipt } from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; -contract MOVETokenV2 is MOVEToken, OFTUpgradeable { + +contract MOVETokenV2 is MOVEToken, OFTUpgradeable, PausableUpgradeable { + + bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); + bytes32 public constant UNPAUSER_ROLE = keccak256("UNPAUSER_ROLE"); /** * @dev Disables potential implementation exploit */ - constructor(address _endpoint) OFTUpgradeable(_endpoint) {_disableInitializers();} + constructor(address _endpoint) OFTUpgradeable(_endpoint) { + _disableInitializers(); + } /** * @dev Initializes the contract with initial parameters. - * @param _delegate The address of the delegate. + * @param _owner The address of the owner. * @param _revoke The address of the address to revoke role. * @param _burned Burns circulation supply on Ethereum. */ - function initialize(address _delegate, address _revoke, address[] calldata _burned) external reinitializer(2) { - __OFTCore_init(_delegate); - __Ownable_init_unchained(_delegate); - _grantRole(DEFAULT_ADMIN_ROLE, _delegate); + function initialize(address _owner, address _revoke, address[] calldata _burned) external reinitializer(2) { + __OFTCore_init(_owner); + __Ownable_init_unchained(_owner); + _grantRole(DEFAULT_ADMIN_ROLE, _owner); + _grantRole(PAUSER_ROLE, _owner); + _grantRole(UNPAUSER_ROLE, _owner); _revokeRole(DEFAULT_ADMIN_ROLE, _revoke); for (uint256 i = 0; i < _burned.length; i++) { _burn(_burned[i], balanceOf(_burned[i])); } + } + + /** + * @dev Executes the send operation. + * @param _sendParam The parameters for the send operation. + * @param _fee The calculated fee for the send() operation. + * - nativeFee: The native fee. + * - lzTokenFee: The lzToken fee. + * @param _refundAddress The address to receive any excess funds. + * @return msgReceipt The receipt for the send operation. + * @return oftReceipt The OFT receipt information. + */ + function send(SendParam calldata _sendParam, MessagingFee calldata _fee, address _refundAddress) + external + payable + override + whenNotPaused + returns (MessagingReceipt memory msgReceipt, OFTReceipt memory oftReceipt) + { + (uint256 amountSentLD, uint256 amountReceivedLD) = _debit( + msg.sender, + _sendParam.amountLD, + _sendParam.minAmountLD, + _sendParam.dstEid + ); + + // @dev Builds the options and OFT message to quote in the endpoint. + (bytes memory message, bytes memory options) = _buildMsgAndOptions(_sendParam, amountReceivedLD); + + // @dev Sends the message to the LayerZero endpoint and returns the LayerZero msg receipt. + msgReceipt = _lzSend(_sendParam.dstEid, message, options, _fee, _refundAddress); + // @dev Formulate the OFT receipt. + oftReceipt = OFTReceipt(amountSentLD, amountReceivedLD); + + emit OFTSent(msgReceipt.guid, _sendParam.dstEid, msg.sender, amountSentLD, amountReceivedLD); + } + /** + * @dev Pauses all bridging. + * Can only be called by an account with the PAUSER_ROLE. + */ + function pause() external onlyRole(PAUSER_ROLE) { + _pause(); + } + + /** + * @dev Unpauses all bridging. + * Can only be called by an account with the UNPAUSER_ROLE. + */ + function unpause() external onlyRole(UNPAUSER_ROLE) { + _unpause(); } /** @@ -35,4 +95,12 @@ contract MOVETokenV2 is MOVEToken, OFTUpgradeable { function decimals() public pure override(ERC20Upgradeable, MOVEToken) returns (uint8) { return 8; } -} \ No newline at end of file + + /** + * @dev Returns the number of shared decimals + * @notice shared decimals is set to 8, following the Movement network standard decimals + */ + function sharedDecimals() public pure virtual override returns (uint8) { + return 8; + } +} diff --git a/protocol-units/settlement/mcr/contracts/test/token/DeployMOVETokenHyperliquid.t.sol b/protocol-units/settlement/mcr/contracts/test/token/DeployMOVETokenHyperliquid.t.sol new file mode 100644 index 000000000..70a5eb18d --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/test/token/DeployMOVETokenHyperliquid.t.sol @@ -0,0 +1,324 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +// Foundry +import "forge-std/Test.sol"; +import "forge-std/console.sol"; + +// Project contracts +import {MOVETokenHyperliquid} from "../../src/token/MOVETokenHyperliquid.sol"; +import {CREATE3Factory, ICREATE3Factory} from "../../script/helpers/Create3/CREATE3Factory.sol"; + +// OpenZeppelin +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +// Safe +import {Enum} from "@safe-smart-account/contracts/common/Enum.sol"; +import {Safe} from "@safe-smart-account/contracts/Safe.sol"; + +// LayerZero +import {ILayerZeroEndpointV2} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import {SetConfigParam} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol"; +import {ExecutorConfig} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/SendLibBase.sol"; +import {UlnConfig} from "@layerzerolabs/lz-evm-messagelib-v2/contracts/uln/UlnBase.sol"; +import {EnforcedOptionParam} from "@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOAppOptionsType3.sol"; +import { + IOFT, + SendParam, + OFTLimit, + OFTReceipt, + OFTFeeDetail, + MessagingReceipt, + MessagingFee +} from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; + +interface IProxyFactory { + function createProxyWithNonce(address masterCopy, bytes memory data, uint256 nonce) + external + returns (address proxy); +} + +interface IDelegates { + function delegates(address) external view returns (address); +} + +contract DeployHyperliquidTest is Test { + // Deployment addresses + address constant DEPLOYER_ADDRESS = 0xB2105464215716e1445367BEA5668F581eF7d063; + address constant ZERO = address(0x0); + address constant MASTER_COPY_ADDRESS = 0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552; + + // LayerZero endpoint and libraries + address public lzEndpoint = 0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9; + address public receiveUln302 = 0x7cacBe439EaD55fa1c22790330b12835c6884a91; + address public sendUln302 = 0xfd76d9CB0Bac839725aB79127E7411fe71b1e3CA; + address public lzExecutor = 0x41Bdb4aa4A63a5b2Efc531858d3118392B1A1C3d; + + // Data Verification Networks (DVNs) + address public p2pDVN = 0xC7423626016bc40375458bc0277F28681EC91C8e; + address public horizenDVN = 0xBB83Ecf372CbB6daa629ea9A9A53BEC6d601F229; + address public lzDVN = 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f; + + // LayerZero config types + uint32 public constant EXECUTOR_CONFIG_TYPE = 1; + uint32 public constant ULN_CONFIG_TYPE = 2; + uint32 public constant RECEIVE_CONFIG_TYPE = 2; + + // LayerZero parameters + uint32 public movementEid = 30325; + uint64 public confirmations = 0; + bytes32 public movementOapp = 0x7e4fd97ef92302eea9b10f74be1d96fb1f1511cf7ed28867b0144ca89c6ebc3c; + + // Factory contracts + IProxyFactory public proxyFactory = IProxyFactory(0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2); + CREATE3Factory public create3 = CREATE3Factory(0x2Dfcc7415D89af828cbef005F0d072D8b3F23183); + + // Token contracts + MOVETokenHyperliquid public moveTokenImplementation; + MOVETokenHyperliquid public move = MOVETokenHyperliquid(0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073); + + // Deployment parameters + bytes32 public salt = 0x6c0000000000000000000000018eddf77afc0a5c6d05a564a44fe37b068922c3; + + function setUp() public {} + + function testDeploy() public { + vm.startPrank(DEPLOYER_ADDRESS); + + address expectedAddress = 0xd7E22951DE7aF453aAc5400d6E072E3b63BeB7E2; + address expectedAddress2 = 0x7aE744e3b2816F660054EAbd1a1C4935DA34Ae28; + + bytes memory firstInitData = + hex"b63e800d00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33aec0fe5e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005afe7a11e70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000b2105464215716e1445367bea5668f581ef7d06300000000000000000000000049f86aee2c2187870ece0e64570d0048eaf4c75100000000000000000000000012cbb2c9f072e955b6b95ad46213aaa984a4434d000000000000000000000000aff3deeb13bd2b480751189808c16e9809eebcce0000000000000000000000000eed12ca165a962cd12420dfb38407637bca42670000000000000000000000000000000000000000000000000000000000000000"; + bytes memory secondInitData = + hex"b63e800d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000f48f2b2d2a534e402487b3ee7c18c33aec0fe5e4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005afe7a11e70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b2105464215716e1445367bea5668f581ef7d0630000000000000000000000003eb69ef2dbedd5d58aa5e074131cd22d5e87ff530000000000000000000000000000000000000000000000000000000000000000"; + + address multisigLabsOps = proxyFactory.createProxyWithNonce(MASTER_COPY_ADDRESS, firstInitData, 0); + address multisigDeployer = proxyFactory.createProxyWithNonce(MASTER_COPY_ADDRESS, secondInitData, 0); + assertEq(multisigLabsOps, expectedAddress); + assertEq(multisigDeployer, expectedAddress2); + + moveTokenImplementation = new MOVETokenHyperliquid(lzEndpoint); + + bytes memory create3Bytecode = abi.encodePacked( + type(TransparentUpgradeableProxy).creationCode, + abi.encode( + address(moveTokenImplementation), + address(multisigLabsOps), + abi.encodeWithSignature("initialize(address)", DEPLOYER_ADDRESS) + ) + ); + + // Deploy MOVE token proxy using CREATE3 + bytes memory bytecode = abi.encodeWithSignature("deploy(bytes32,bytes)", salt, create3Bytecode); + bytes32 digest = Safe(payable(multisigDeployer)).getTransactionHash( + address(create3), 0, bytecode, Enum.Operation.Call, 0, 0, 0, ZERO, payable(ZERO), 0 + ); + + assertEq(vm.addr(vm.envUint("PRIVATE_KEY")), DEPLOYER_ADDRESS); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(vm.envUint("PRIVATE_KEY"), digest); + bytes memory signature = abi.encodePacked(r, s, v); + require(signature.length >= 65); + Safe(payable(multisigDeployer)).execTransaction( + address(create3), 0, bytecode, Enum.Operation.Call, 0, 0, 0, ZERO, payable(ZERO), signature + ); + + vm.stopPrank(); + } + + function testVerifyMoveTokenDeployment() public { + testDeploy(); + + // Verify basic token properties + assertEq(move.decimals(), 8); + assertEq(move.name(), "Movement"); + assertEq(move.symbol(), "MOVE"); + assertEq(move.owner(), DEPLOYER_ADDRESS); + assertEq(address(move.endpoint()), lzEndpoint); + assertEq(move.totalSupply(), 0); + assertTrue(move.DOMAIN_SEPARATOR() != bytes32(0)); + assertEq(IDelegates(address(move.endpoint())).delegates(address(move)), DEPLOYER_ADDRESS); + + // Verify EIP-712 domain + ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 domainSalt, + uint256[] memory extensions + ) = move.eip712Domain(); + + assertEq(fields, hex"0f", "fields should be 0x0f (01111)"); + assertEq(name, "Movement", "EIP-712 name should be Movement"); + assertEq(version, "1", "EIP-712 version should be 1"); + assertEq(chainId, block.chainid, "chainId should match block.chainid"); + assertEq(verifyingContract, address(move), "verifyingContract should be the token address"); + assertEq(domainSalt, bytes32(0), "salt should be zero"); + assertEq(extensions.length, 0, "extensions array should be empty"); + + // Verify finalizer storage slot + address finalizer = address(uint160(uint256(vm.load(address(move), keccak256("HyperCore deployer"))))); + assertEq(finalizer, DEPLOYER_ADDRESS, "finalizer should be the deployer address"); + } + + /** + * @dev Tests OFT configuration including DVN setup and enforced options + * Configures LayerZero infrastructure (DVNs, executor, ULN libraries) + * Sets and verifies enforced options for cross-chain messaging + */ + function testConfigOFT() public { + testDeploy(); + vm.startPrank(DEPLOYER_ADDRESS); + + configDVNExecutor(address(move)); + + // Verify send library configuration + address receivedSendLib = move.endpoint().getSendLibrary(address(move), movementEid); + assertEq(receivedSendLib, sendUln302); + + // Verify receive library configuration + (address receivedReceiveLib,) = move.endpoint().getReceiveLibrary(address(move), movementEid); + assertEq(receivedReceiveLib, receiveUln302); + + // Set enforced options for gas and execution parameters + bytes memory options = abi.encodePacked(uint176(0x00030100110100000000000000000000000000001388)); + setEnforcedParams(options); + + // Verify enforced options are set for both message types + assertEq(move.enforcedOptions(movementEid, uint16(1)), options); + assertEq(move.enforcedOptions(movementEid, uint16(2)), options); + + move.setPeer(movementEid, movementOapp); + vm.stopPrank(); + } + + /** + * @dev Tests cross-chain token sending functionality via LayerZero OFT + * Tests the complete flow from quote generation to token burning + * Verifies peer setup requirements, balance changes, and restrictions + * Tests both basic sends and sends with destination gas drops + */ + function testSend() public { + testConfigOFT(); + + assertEq(move.totalSupply(), 0); + uint256 amount = 1 * 10 ** 8; + deal(address(move), DEPLOYER_ADDRESS, amount, true); + vm.deal(DEPLOYER_ADDRESS, 1 ether); + assertEq(move.balanceOf(DEPLOYER_ADDRESS), amount); + // Movement Multisig address on destination chain + bytes32 moveAddress = 0x98ebb7985c84a89972022edf391bdaa7d95f061d9742efb3703de368413431e1; + SendParam memory sendParam = SendParam({ + dstEid: movementEid, + to: moveAddress, + amountLD: amount, + minAmountLD: amount, + extraOptions: bytes(""), + composeMsg: bytes(""), + oftCmd: bytes("") + }); + + vm.startPrank(DEPLOYER_ADDRESS); + + // Now quote and send should work + MessagingFee memory fee = move.quoteSend(sendParam, false); + uint256 totalSupplyBefore = move.totalSupply(); + uint256 balanceBefore = move.balanceOf(DEPLOYER_ADDRESS); + move.send{value: fee.nativeFee}(sendParam, fee, DEPLOYER_ADDRESS); + + // Send burns tokens on source chain + assertEq(move.balanceOf(DEPLOYER_ADDRESS), balanceBefore - amount); + assertEq(move.totalSupply(), totalSupplyBefore - amount); + + vm.stopPrank(); + } + + /** + * @dev Configures LayerZero DVN (Data Verification Network) and executor settings + * Sets up the required infrastructure for cross-chain message verification + * Configures 3 DVNs for security and the LayerZero executor + * @param contractAddress Address of the OFT to configure + */ + function configDVNExecutor(address contractAddress) public { + setLibraries(contractAddress, movementEid, sendUln302, receiveUln302); + + // Configure required DVNs for message verification + address[] memory dvnArray = new address[](3); + dvnArray[0] = horizenDVN; + dvnArray[1] = lzDVN; + dvnArray[2] = p2pDVN; + + address[] memory emptyArray = new address[](0); + UlnConfig memory ulnConfig = UlnConfig({ + confirmations: uint64(confirmations), + requiredDVNCount: uint8(3), + optionalDVNCount: uint8(0), + optionalDVNThreshold: uint8(0), + requiredDVNs: dvnArray, + optionalDVNs: emptyArray + }); + ExecutorConfig memory executorConfig = ExecutorConfig({maxMessageSize: 0, executor: lzExecutor}); + + setConfigs(contractAddress, movementEid, sendUln302, receiveUln302, ulnConfig, executorConfig); + } + + /** + * @dev Sets LayerZero configuration parameters for send and receive libraries + * Configures executor and ULN settings for both sending and receiving messages + * @param contractAddress Address of the contract to configure + * @param remoteEid Remote endpoint ID to configure for + * @param sendLibraryAddress Address of the send library + * @param receiveLibraryAddress Address of the receive library + * @param ulnConfig ULN configuration with DVN settings + * @param executorConfig Executor configuration settings + */ + function setConfigs( + address contractAddress, + uint32 remoteEid, + address sendLibraryAddress, + address receiveLibraryAddress, + UlnConfig memory ulnConfig, + ExecutorConfig memory executorConfig + ) public { + // Configure send library with executor and ULN configs + SetConfigParam[] memory sendConfigParams = new SetConfigParam[](2); + sendConfigParams[0] = + SetConfigParam({eid: remoteEid, configType: EXECUTOR_CONFIG_TYPE, config: abi.encode(executorConfig)}); + sendConfigParams[1] = + SetConfigParam({eid: remoteEid, configType: ULN_CONFIG_TYPE, config: abi.encode(ulnConfig)}); + + // Configure receive library with ULN config + SetConfigParam[] memory receiveConfigParams = new SetConfigParam[](1); + receiveConfigParams[0] = + SetConfigParam({eid: remoteEid, configType: RECEIVE_CONFIG_TYPE, config: abi.encode(ulnConfig)}); + + ILayerZeroEndpointV2(lzEndpoint).setConfig(contractAddress, sendLibraryAddress, sendConfigParams); + ILayerZeroEndpointV2(lzEndpoint).setConfig(contractAddress, receiveLibraryAddress, receiveConfigParams); + } + + /** + * @dev Sets the send and receive libraries for LayerZero messaging + * @param _oapp Address of the OmniApp to configure + * @param _eid Endpoint ID to configure for + * @param _sendLib Address of the send library + * @param _receiveLib Address of the receive library + */ + function setLibraries(address _oapp, uint32 _eid, address _sendLib, address _receiveLib) public { + ILayerZeroEndpointV2(lzEndpoint).setSendLibrary(_oapp, _eid, _sendLib); + ILayerZeroEndpointV2(lzEndpoint).setReceiveLibrary(_oapp, _eid, _receiveLib, 0); + } + + /** + * @dev Sets enforced options for LayerZero messaging + * Applies the same options to both message types (1 and 2) + * @param options Encoded options for gas and execution parameters + */ + function setEnforcedParams(bytes memory options) public { + EnforcedOptionParam[] memory enforcedParams = new EnforcedOptionParam[](2); + enforcedParams[0] = EnforcedOptionParam({eid: movementEid, msgType: uint16(1), options: options}); + enforcedParams[1] = EnforcedOptionParam({eid: movementEid, msgType: uint16(2), options: options}); + move.setEnforcedOptions(enforcedParams); + } +} diff --git a/protocol-units/settlement/mcr/contracts/test/token/MOVETokenV2.t.sol b/protocol-units/settlement/mcr/contracts/test/token/MOVETokenV2.t.sol index 3606e23b3..e60ca526f 100644 --- a/protocol-units/settlement/mcr/contracts/test/token/MOVETokenV2.t.sol +++ b/protocol-units/settlement/mcr/contracts/test/token/MOVETokenV2.t.sol @@ -39,7 +39,6 @@ import {IOAppCore} from "@layerzerolabs/oapp-evm/contracts/oapp/interfaces/IOApp import {MessagingFee} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; import {OFTAdapter} from "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oft/OFTAdapter.sol"; import {OptionsBuilder} from "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/libs/OptionsBuilder.sol"; - // Safe contracts import {CompatibilityFallbackHandler} from "@safe-smart-account/contracts/handler/CompatibilityFallbackHandler.sol"; @@ -47,6 +46,66 @@ interface IRetrieveDelegates { function delegates(address account) external view returns (address); } +struct PoolKey { + /// @notice The lower currency of the pool, sorted numerically. + /// For native ETH, Currency currency0 = Currency.wrap(address(0)); + address currency0; + /// @notice The higher currency of the pool, sorted numerically + address currency1; + /// @notice The pool LP fee, capped at 1_000_000. If the highest bit is 1, the pool has a dynamic fee and must be exactly equal to 0x800000 + uint24 fee; + /// @notice Ticks that involve positions must be a multiple of tick spacing + int24 tickSpacing; + /// @notice The hooks of the pool + address hooks; +} + +struct QuoteExactInputSingleParams { + address tokenIn; + address tokenOut; + uint256 amountIn; + uint24 fee; + uint160 sqrtPriceLimitX96; +} + +interface IUniswapV3Quoter { + function quoteExactInputSingle( + address tokenIn, + address tokenOut, + uint24 fee, + uint256 amountIn, + uint160 sqrtPriceLimitX96 + ) external returns (uint256 amountOut); +} + +interface ISwapRouter { + struct ExactInputSingleParams { + address tokenIn; + address tokenOut; + uint24 fee; + address recipient; + uint256 amountIn; + uint256 amountOutMinimum; + uint160 sqrtPriceLimitX96; + } + + function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); +} + +interface IV4Router { + struct ExactInputSingleParams { + PoolKey poolKey; + bool zeroForOne; + uint128 amountIn; + uint128 amountOutMinimum; + bytes hookData; + } + + function execute(bytes memory commands, bytes[] memory inputs, uint256 deadline) + external + payable; +} + contract MOVETokenV2Test is Test { // ============================================================================= // STATE VARIABLES - CONTRACT INSTANCES @@ -125,7 +184,7 @@ contract MOVETokenV2Test is Test { uint32 public constant ULN_CONFIG_TYPE = 2; /// @dev LayerZero config type for receive library configuration uint32 public constant RECEIVE_CONFIG_TYPE = 2; - + /// @dev Total supply of MOVE tokens (10 billion with 8 decimals) uint256 public constant TOTAL_SUPPLY = 10000000000 * 10 ** 8; /// @dev MOVE token decimals @@ -142,8 +201,9 @@ contract MOVETokenV2Test is Test { * and initializing proxy instances for both MOVEToken and MOVETokenV2 */ function setUp() public { - moveTokenImplementation2 = new MOVETokenV2(address(endpoint)); - + // TODO: comment out after deployment for testing + // moveTokenImplementation2 = new MOVETokenV2(address(endpoint)); + moveTokenImplementation2 = MOVETokenV2(0x2e2Bc0e2920578E0d46d1f83787b01f1d8094695); move = MOVEToken(address(moveProxy)); move2 = MOVETokenV2(address(moveProxy)); } @@ -168,15 +228,21 @@ contract MOVETokenV2Test is Test { * @param other Random address to test role assignment */ function testAdminRoleFuzz(address other) public { + vm.assume(other != oldFoundation); + vm.assume(other != address(0)); assertEq(move.hasRole(DEFAULT_ADMIN_ROLE, other), false); vm.expectRevert( - abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, address(this), DEFAULT_ADMIN_ROLE) + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, address(this), DEFAULT_ADMIN_ROLE + ) ); move.grantRole(DEFAULT_ADMIN_ROLE, other); vm.prank(labs); - vm.expectRevert(abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, labs, DEFAULT_ADMIN_ROLE)); + vm.expectRevert( + abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, labs, DEFAULT_ADMIN_ROLE) + ); move.grantRole(DEFAULT_ADMIN_ROLE, other); vm.prank(oldFoundation); @@ -201,8 +267,9 @@ contract MOVETokenV2Test is Test { assertEq(move.hasRole(DEFAULT_ADMIN_ROLE, labs), false); // Define deprecated addresses whose balances will be burned during upgrade - address[] memory deprecated = new address[](1); + address[] memory deprecated = new address[](2); deprecated[0] = bridge; + deprecated[1] = address(moveProxy); // Token address bytes memory initializeData = abi.encodeWithSignature("initialize(address,address,address[])", labs, oldFoundation, deprecated); @@ -214,11 +281,14 @@ contract MOVETokenV2Test is Test { initializeData ); - vm.prank(labs); - timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), minDelay); + console.logBytes(upgradeData); + + // TODO: Once transaction is scheduled comment out timelock.schedule and RERUN TEST to verify that all arguments are correct + // vm.prank(labs); + // timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), minDelay); // While upgrade is scheduled, labs pauses the existing bridge to prevent new transactions - vm.startPrank(labs); + vm.prank(labs); OFTAdapter(payable(bridge)).setPeer(30325, 0x0); } @@ -234,8 +304,9 @@ contract MOVETokenV2Test is Test { */ function testUpgradeFromTimelock() public { // Define deprecated addresses whose balances will be burned during upgrade - address[] memory deprecated = new address[](1); + address[] memory deprecated = new address[](2); deprecated[0] = bridge; + deprecated[1] = address(moveProxy); // Token address bytes memory initializeData = abi.encodeWithSignature("initialize(address,address,address[])", labs, oldFoundation, deprecated); @@ -246,8 +317,7 @@ contract MOVETokenV2Test is Test { address(moveTokenImplementation2), initializeData ); - - // Once transaction is scheduled comment out testScheduleAndSetPeer and RERUN TEST to verify that all arguments are correct + testScheduleAndSetPeer(); // Verify that upgrade cannot be executed before timelock delay @@ -257,13 +327,15 @@ contract MOVETokenV2Test is Test { vm.warp(block.timestamp + minDelay + 1); uint256 bridgeBalance = move.balanceOf(bridge); + uint256 proxyBalance = move.balanceOf(address(moveProxy)); vm.prank(foundation); - timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + // timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + TimelockController(payable(0x25a5A3FA61cba5Fd5fb1D75D0AcfEB81370778Eb)).execute(0x8365AA031806A1ac2b31a5d3b8323020FC85DfEc, 0, hex"9623609d0000000000000000000000003073f7aaa4db83f95e9fff17424f71d4751a30730000000000000000000000002e2bc0e2920578e0d46d1f83787b01f1d8094695000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c477a24f36000000000000000000000000d7e22951de7af453aac5400d6e072e3b63beb7e2000000000000000000000000074c155f09ce5fc3b65b4a9bbb01739459c7ad6300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f1df43a3053cd18e477233b59a25fc483c2cbe0f0000000000000000000000003073f7aaa4db83f95e9fff17424f71d4751a307300000000000000000000000000000000000000000000000000000000", 0x0000000000000000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000000); // Verify V1 token state after upgrade with old interface assertEq(move.decimals(), MOVE_DECIMALS); - assertEq(move.totalSupply(), TOTAL_SUPPLY - bridgeBalance); + assertEq(move.totalSupply(), TOTAL_SUPPLY - (bridgeBalance + proxyBalance)); assertEq(move.balanceOf(bridge), 0); assertEq(move.hasRole(DEFAULT_ADMIN_ROLE, oldFoundation), false); assertEq(move.hasRole(DEFAULT_ADMIN_ROLE, foundation), false); @@ -272,7 +344,7 @@ contract MOVETokenV2Test is Test { // Verify V2 token state after upgrade assertEq(move2.decimals(), 8); - assertEq(move2.totalSupply(), 10000000000 * 10 ** 8 - bridgeBalance); + assertEq(move2.totalSupply(), 10000000000 * 10 ** 8 - (bridgeBalance + proxyBalance)); assertEq(move2.balanceOf(bridge), 0); assertEq(move2.hasRole(DEFAULT_ADMIN_ROLE, oldFoundation), false); assertEq(move2.hasRole(DEFAULT_ADMIN_ROLE, foundation), false); @@ -301,8 +373,9 @@ contract MOVETokenV2Test is Test { * including labs, oldFoundation, foundation, and proxy admin */ function testCannotReinitialize2() public { - address[] memory deprecated = new address[](1); + address[] memory deprecated = new address[](2); deprecated[0] = bridge; + deprecated[1] = address(moveProxy); // Token address bytes memory initializeData = abi.encodeWithSignature("initialize(address,address,address[])", labs, oldFoundation, deprecated); @@ -351,21 +424,30 @@ contract MOVETokenV2Test is Test { */ function testAdminRole2Fuzz(address other) public { testUpgradeFromTimelock(); + vm.assume(other != address(admin)); + vm.assume(other != labs); + vm.assume(other != address(0)); assertEq(move2.hasRole(DEFAULT_ADMIN_ROLE, other), false); vm.prank(other); - vm.expectRevert(abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, other, DEFAULT_ADMIN_ROLE)); + vm.expectRevert( + abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, other, DEFAULT_ADMIN_ROLE) + ); move2.grantRole(DEFAULT_ADMIN_ROLE, other); vm.prank(foundation); vm.expectRevert( - abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, foundation, DEFAULT_ADMIN_ROLE) + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, foundation, DEFAULT_ADMIN_ROLE + ) ); move2.grantRole(DEFAULT_ADMIN_ROLE, other); vm.prank(oldFoundation); vm.expectRevert( - abi.encodeWithSelector(IAccessControl.AccessControlUnauthorizedAccount.selector, oldFoundation, DEFAULT_ADMIN_ROLE) + abi.encodeWithSelector( + IAccessControl.AccessControlUnauthorizedAccount.selector, oldFoundation, DEFAULT_ADMIN_ROLE + ) ); move2.grantRole(DEFAULT_ADMIN_ROLE, other); @@ -394,6 +476,7 @@ contract MOVETokenV2Test is Test { function testDeprecatedBridge() public { testSend(); assertEq(move2.balanceOf(bridge), 0); + assertEq(move2.balanceOf(address(moveProxy)), 0); uint256 amount = 1 * 10 ** MOVE_DECIMALS; vm.prank(anchorage); @@ -409,7 +492,7 @@ contract MOVETokenV2Test is Test { composeMsg: bytes(""), oftCmd: bytes("") }); - + IOFT deprecatedBridge = IOFT(bridge); vm.expectRevert(); // Should fail - bridge is deprecated deprecatedBridge.quoteSend(sendParam, false); @@ -562,10 +645,195 @@ contract MOVETokenV2Test is Test { assertEq(move2.totalSupply(), totalSupplyBefore - (amount * 2)); } + /** + * @dev Tests that pausing prevents users from calling the send function + * Verifies that: + * 1. Send works normally when not paused + * 2. Send reverts when contract is paused + * 3. Send works again after unpause + */ + function testPausePreventsSend() public { + testConfigOFT(); + + uint256 amount = 1 * 10 ** MOVE_DECIMALS; + bytes32 moveAddress = 0x98ebb7985c84a89972022edf391bdaa7d95f061d9742efb3703de368413431e1; + + SendParam memory sendParam = SendParam({ + dstEid: movementEid, + to: moveAddress, + amountLD: amount, + minAmountLD: amount, + extraOptions: bytes(""), + composeMsg: bytes(""), + oftCmd: bytes("") + }); + + vm.prank(labs); + move2.setPeer(movementEid, moveOftAdapterBytes32); + + // Get fee quote + MessagingFee memory fee = move2.quoteSend(sendParam, false); + + // Fund anchorage with ETH for gas + vm.deal(anchorage, 10 ether); + + // Verify send works when not paused + uint256 balanceBefore = move2.balanceOf(anchorage); + vm.prank(anchorage); + move2.send{value: fee.nativeFee}(sendParam, fee, anchorage); + assertEq(move2.balanceOf(anchorage), balanceBefore - amount); + + // Pause the contract + vm.prank(labs); + move2.pause(); + + // Verify contract is paused + assertEq(move2.paused(), true); + + // Verify send reverts when paused (0xd93c0665 is EnforcedPause() selector) + vm.prank(anchorage); + vm.expectRevert(0xd93c0665); + move2.send{value: fee.nativeFee}(sendParam, fee, anchorage); + + // Unpause the contract + vm.prank(labs); + move2.unpause(); + + // Verify contract is unpaused + assertEq(move2.paused(), false); + + // Verify send works again after unpause + balanceBefore = move2.balanceOf(anchorage); + vm.prank(anchorage); + move2.send{value: fee.nativeFee}(sendParam, fee, anchorage); + assertEq(move2.balanceOf(anchorage), balanceBefore - amount); + } + + function testUniswap() public { + testConfigOFT(); + address uniswapv3Router = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45; + address uniswapv4Router = 0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af; + address uniswapv3Quoter = 0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6; + address uniswapv4Quoter = 0x61fFE014bA17989E743c5F6cB21bF9697530B21e; + + uint256 amount = 100; + + // quote from uniswap v3 + (bool successV3, bytes memory dataV3) = uniswapv3Quoter.call( + abi.encodeWithSignature( + "quoteExactInputSingle(address,address,uint24,uint256,uint160)", + address(move2), + 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, // WETH + 10000, + amount, + 0 + ) + ); + require(successV3, "V3 quote failed"); + uint256 amountOutV3 = abi.decode(dataV3, (uint256)); + + // Adds eth and move balance to uniswapv4 pool + vm.deal(0x1B42bb0771690a3A82beDb1BC74933788145CbfD, 100 ether); + deal(address(move2), 0x1B42bb0771690a3A82beDb1BC74933788145CbfD, 100 ether); + uint24 v4fee = 10000; + // quote from uniswap v4 + (bool successV4, bytes memory dataV4) = uniswapv4Quoter.call( + abi.encodeWithSignature( + "quoteExactInputSingle((address,address,uint256,uint24,uint160))", + QuoteExactInputSingleParams({ + tokenIn: address(move2), + tokenOut: address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2), // ETH + amountIn: amount, + fee: v4fee, + sqrtPriceLimitX96: 0 + }) + ) + ); + require(successV4, "V4 quote failed"); + uint256 amountOutV4 = abi.decode(dataV4, (uint256)); + + uint256 balanceBefore = move2.balanceOf(anchorage); + uint256 snapshotId = vm.snapshot(); + + vm.prank(anchorage); + move2.approve(uniswapv3Router, amount); + + vm.prank(anchorage); + ISwapRouter(uniswapv3Router).exactInputSingle( + ISwapRouter.ExactInputSingleParams({ + tokenIn: address(move2), + tokenOut: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, // WETH + fee: 10000, + recipient: anchorage, + amountIn: amount, + amountOutMinimum: (amountOutV3 * 95) / 100, // slippage 5% + sqrtPriceLimitX96: 0 + }) + ); + + assertEq(move2.balanceOf(anchorage), balanceBefore - amount); + + vm.prank(anchorage); + move2.approve(uniswapv4Router, amount); + + vm.revertTo(snapshotId); + vm.prank(anchorage); + move2.approve(uniswapv4Router, amount); + + PoolKey memory key = PoolKey({ + currency0: address(move2), // currency0 (lower) + currency1: address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2), // currency1 (higher) + fee: v4fee, // fee + tickSpacing: 1, // tickSpacing + hooks: address(0) // no hooks + }); + + + // vm.startPrank(anchorage); + // swapExactInputSingle(uniswapv4Router, key, uint128(amount), uint128((amount * 50) / 100)); + // vm.stopPrank(); + + // assertEq(move2.balanceOf(anchorage), balanceBefore - amount); + } + // ============================================================================= // HELPER FUNCTIONS // ============================================================================= + function swapExactInputSingle(address router, PoolKey memory key, uint128 amountIn, uint128 minAmountOut) + internal + returns (uint256 amountOut) + { + // Encode the Universal Router command + bytes memory commands = abi.encodePacked(uint8(0x10)); + bytes[] memory inputs = new bytes[](1); + + // Encode V4Router actions + bytes memory actions = + abi.encodePacked(uint8(0x06), uint8(0x0c), uint8(0x0f)); + + // Prepare parameters for each action + bytes[] memory params = new bytes[](3); + params[0] = abi.encode( + IV4Router.ExactInputSingleParams({ + poolKey: key, + zeroForOne: true, + amountIn: amountIn, + amountOutMinimum: minAmountOut, + hookData: bytes("") + }) + ); + params[1] = abi.encode(key.currency0, amountIn); + params[2] = abi.encode(key.currency1, minAmountOut); + + // Combine actions and params into inputs + inputs[0] = abi.encode(actions, params); + + // Execute the swap + uint256 deadline = block.timestamp + 20; + IV4Router(router).execute(commands, inputs, deadline); + } + /** * @dev Utility function to convert bytes to address using keccak256 hash * Used for generating deterministic addresses from string inputs diff --git a/protocol-units/settlement/mcr/contracts/test/token/UpgradeMOVETokenHyperliquidV2.t.sol b/protocol-units/settlement/mcr/contracts/test/token/UpgradeMOVETokenHyperliquidV2.t.sol new file mode 100644 index 000000000..459c209be --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/test/token/UpgradeMOVETokenHyperliquidV2.t.sol @@ -0,0 +1,387 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +// Foundry +import "forge-std/Test.sol"; +import "forge-std/console.sol"; + +// Project contracts +import {MOVETokenHyperliquid} from "../../src/token/MOVETokenHyperliquid.sol"; +import {MOVETokenHyperliquidV2} from "../../src/token/MOVETokenHyperliquidV2.sol"; + +// OpenZeppelin +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; +import {ERC1967Utils} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol"; + +// LayerZero +import {ILayerZeroEndpointV2} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; + +/** + * @title UpgradeMOVETokenHyperliquidV2Test + * @notice Test suite for upgrading MOVETokenHyperliquid to MOVETokenHyperliquidV2 via timelock + * @dev Tests the complete upgrade process including: + * - Scheduling the upgrade through timelock with proper delay + * - Executing the upgrade after timelock delay + * - Verifying all state transitions and access controls + */ +contract UpgradeMOVETokenHyperliquidV2Test is Test { + // ============================================================================= + // STATE VARIABLES - CONTRACT INSTANCES + // ============================================================================= + + MOVETokenHyperliquid public moveV1; + MOVETokenHyperliquidV2 public moveV2; + MOVETokenHyperliquidV2 public moveTokenImplementationV2 = MOVETokenHyperliquidV2(0x2ee631fA49F90a98c7210b2220dcA16dA19147D8); + TransparentUpgradeableProxy public moveProxy = TransparentUpgradeableProxy(payable(0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073)); + ProxyAdmin public admin = ProxyAdmin(0x8365AA031806A1ac2b31a5d3b8323020FC85DfEc); + + TimelockController public timelock = TimelockController(payable(0xA649f6335828f070dDDd7A8c4F5bef2b6FF7Bd51)); + + // ============================================================================= + // STATE VARIABLES - ADDRESSES + // ============================================================================= + + /// @dev Timelock controller address + address constant TIMELOCK_ADDRESS = 0xA649f6335828f070dDDd7A8c4F5bef2b6FF7Bd51; + /// @dev Proposer address (multisig) + address constant PROPOSER_ADDRESS = 0x5cD71FFf9947486fD6F5c193a722191c22728887; + /// @dev Executor address (multisig) + address constant EXECUTOR_ADDRESS = 0x443513664Eab95280360Dc1c33FDe1ad4ED5C7bB; + /// @dev Deployer address + address constant DEPLOYER_ADDRESS = 0xB2105464215716e1445367BEA5668F581eF7d063; + + /// @dev Expected proxy address + address constant EXPECTED_MOVE_TOKEN_PROXY = 0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073; + /// @dev LayerZero endpoint address (Hyperliquid Mainnet) + address constant LZ_ENDPOINT = 0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9; + + // ============================================================================= + // STATE VARIABLES - CONFIGURATION + // ============================================================================= + + /// @dev Minimum delay for timelock operations (48 hours) + uint256 public constant MIN_DELAY = 48 hours; + + /// @dev MOVE token decimals + uint8 public constant MOVE_DECIMALS = 8; + + // ============================================================================= + // SETUP + // ============================================================================= + + /** + * @dev Sets up the test environment by: + * 1. Creating a mock LayerZero endpoint + * 2. Deploying the V1 implementation and proxy + * 3. Deploying the ProxyAdmin + * 4. Deploying the TimelockController + * 5. Deploying the V2 implementation + */ + function setUp() public { + moveV1 = MOVETokenHyperliquid(0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073); + moveV2 = MOVETokenHyperliquidV2(0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073); + + } + + // ============================================================================= + // UPGRADE TESTS + // ============================================================================= + + /** + * @dev Tests the complete upgrade process from MOVETokenHyperliquid to MOVETokenHyperliquidV2 + * This test simulates the real upgrade scenario including: + * 1. Scheduling the upgrade through timelock with proper delay + * 2. Verifying that upgrade cannot be executed before timelock delay + * 3. Executing the upgrade after timelock delay + * 4. Verifying all state transitions + */ + function testUpgradeViaTimelock() public { + // Verify initial state + assertEq(moveV1.decimals(), MOVE_DECIMALS); + assertEq(moveV1.sharedDecimals(), 6); + assertEq(moveV1.name(), "Movement"); + assertEq(moveV1.symbol(), "MOVE"); + assertEq(moveV1.owner(), DEPLOYER_ADDRESS); + assertEq(address(moveV1.endpoint()), LZ_ENDPOINT); + assertEq(moveV1.totalSupply(), 0); + assertEq(moveV1.sharedDecimals(), 6); + + // Verify admin owner is timelock + assertEq(admin.owner(), address(timelock)); + + // Prepare upgrade data - NO initialize call per requirements + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(EXPECTED_MOVE_TOKEN_PROXY), + 0x2ee631fA49F90a98c7210b2220dcA16dA19147D8, + bytes("") + ); + + console.log(address(moveTokenImplementationV2)); + console.logBytes(upgradeData); + + // Schedule upgrade via proposer + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + // Verify that upgrade cannot be executed before timelock delay + vm.prank(EXECUTOR_ADDRESS); + vm.expectRevert(); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Fast forward time past the delay + vm.warp(block.timestamp + MIN_DELAY + 1); + + // Execute upgrade via executor + vm.prank(EXECUTOR_ADDRESS); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Verify V1 token state after upgrade (old interface should still work) + assertEq(moveV1.decimals(), MOVE_DECIMALS); + assertEq(moveV1.sharedDecimals(), MOVE_DECIMALS); // Despite using the V1 interface, it should also return 8 + assertEq(moveV1.name(), "Movement"); + assertEq(moveV1.symbol(), "MOVE"); + assertEq(moveV1.owner(), DEPLOYER_ADDRESS); + assertEq(address(moveV1.endpoint()), LZ_ENDPOINT); + + assertEq(address(moveV2), EXPECTED_MOVE_TOKEN_PROXY); + + // Verify V2 token state after upgrade + assertEq(moveV2.decimals(), MOVE_DECIMALS); + assertEq(moveV2.sharedDecimals(), MOVE_DECIMALS); // New function in V2 + assertEq(moveV2.name(), "Movement"); + assertEq(moveV2.symbol(), "MOVE"); + assertEq(moveV2.owner(), DEPLOYER_ADDRESS); + assertEq(address(moveV2.endpoint()), LZ_ENDPOINT); + + // Verify proxy implementation was updated correctly + bytes32 implementation = vm.load(address(moveProxy), ERC1967Utils.IMPLEMENTATION_SLOT); + address implAddr; + assembly { + implAddr := and(implementation, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + } + assertEq(implAddr, address(moveTokenImplementationV2)); + + // Verify EIP-712 domain + ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 domainSalt, + uint256[] memory extensions + ) = moveV2.eip712Domain(); + + assertEq(fields, hex"0f", "EIP-712 fields should be 0x0f"); + assertEq(name, "Movement", "EIP-712 name should be Movement"); + assertEq(version, "1", "EIP-712 version should be 1"); + assertEq(chainId, 999, "EIP-712 chainId should be 999"); + assertEq(verifyingContract, address(moveV2), "EIP-712 verifying contract should be the token address"); + assertEq(domainSalt, bytes32(0), "EIP-712 salt should be zero"); + assertEq(extensions.length, 0, "EIP-712 extensions array should be empty"); + + // Verify finalizer storage slot + address finalizer = address(uint160(uint256(vm.load(address(moveV2), keccak256("HyperCore deployer"))))); + assertEq(finalizer, DEPLOYER_ADDRESS, "Finalizer should be the deployer address"); + + console.log("Upgrade successful!"); + console.log("V2 Implementation:", address(moveTokenImplementationV2)); + console.log("Proxy address:", address(moveProxy)); + console.log("Chain ID:", chainId); + } + + /** + * @dev Tests that the upgrade can only be scheduled by the proposer + */ + function testOnlyProposerCanSchedule() public { + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(admin), + address(moveTokenImplementationV2), + bytes("") + ); + + + // Try to schedule from unauthorized address + vm.prank(DEPLOYER_ADDRESS); + vm.expectRevert(); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + // Verify proposer can schedule + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + } + + /** + * @dev Tests that the upgrade can only be executed by the executor + */ + function testOnlyExecutorCanExecute() public { + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(moveProxy), + address(moveTokenImplementationV2), + bytes("") + ); + + // Schedule upgrade + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + // Fast forward time + vm.warp(block.timestamp + MIN_DELAY + 1); + + // Try to execute from unauthorized address + vm.prank(DEPLOYER_ADDRESS); + vm.expectRevert(); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Verify executor can execute + vm.prank(EXECUTOR_ADDRESS); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + } + + /** + * @dev Tests that the upgrade respects the 48-hour delay + */ + function testUpgradeRespects48HourDelay() public { + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(moveProxy), + address(moveTokenImplementationV2), + bytes("") + ); + + // Schedule upgrade + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + uint256 scheduleTime = block.timestamp; + + // Try to execute before delay + vm.warp(scheduleTime + MIN_DELAY - 1); + vm.prank(EXECUTOR_ADDRESS); + vm.expectRevert(); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Execute exactly at delay + vm.warp(scheduleTime + MIN_DELAY); + vm.prank(EXECUTOR_ADDRESS); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Verify upgrade succeeded + bytes32 implementation = vm.load(address(moveProxy), ERC1967Utils.IMPLEMENTATION_SLOT); + address implAddr; + assembly { + implAddr := and(implementation, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + } + assertEq(implAddr, address(moveTokenImplementationV2)); + } + + /** + * @dev Tests that token state is preserved across the upgrade + */ + function testStatePreservation() public { + // Mint some tokens to test state preservation + deal(address(moveV1), DEPLOYER_ADDRESS, 1000 * 10 ** MOVE_DECIMALS, true); + uint256 balanceBefore = moveV1.balanceOf(DEPLOYER_ADDRESS); + uint256 totalSupplyBefore = moveV1.totalSupply(); + + // Perform upgrade + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(moveProxy), + address(moveTokenImplementationV2), + bytes("") + ); + + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + vm.warp(block.timestamp + MIN_DELAY); + + vm.prank(EXECUTOR_ADDRESS); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Verify state is preserved + assertEq(moveV2.balanceOf(DEPLOYER_ADDRESS), balanceBefore); + assertEq(moveV2.totalSupply(), totalSupplyBefore); + assertEq(moveV2.owner(), DEPLOYER_ADDRESS); + assertEq(moveV2.decimals(), MOVE_DECIMALS); + assertEq(moveV2.sharedDecimals(), MOVE_DECIMALS); + } + + /** + * @dev Tests that V2-specific functionality works after upgrade + */ + function testV2Functionality() public { + // Perform upgrade + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(moveProxy), + address(moveTokenImplementationV2), + bytes("") + ); + + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + vm.warp(block.timestamp + MIN_DELAY); + + vm.prank(EXECUTOR_ADDRESS); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Test V2-specific functionality (sharedDecimals) + assertEq(moveV2.sharedDecimals(), MOVE_DECIMALS); + + // Verify that both decimals and sharedDecimals return the same value + assertEq(moveV2.decimals(), moveV2.sharedDecimals()); + } + + /** + * @dev Tests that initialize cannot be called on the proxy after upgrade + */ + function testCannotReinitializeProxyAfterUpgrade() public { + // Perform upgrade + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(moveProxy), + address(moveTokenImplementationV2), + bytes("") + ); + + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + vm.warp(block.timestamp + MIN_DELAY); + + vm.prank(EXECUTOR_ADDRESS); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Attempt to reinitialize the proxy - should revert + vm.expectRevert(abi.encodeWithSignature("InvalidInitialization()")); + moveV2.initialize(DEPLOYER_ADDRESS); + } + + /** + * @dev Tests that initialize cannot be called on the V2 implementation contract + */ + function testCannotInitializeV2Implementation() public { + // Attempt to initialize the V2 implementation directly - should revert + // The constructor calls _disableInitializers() which prevents initialization + vm.expectRevert(abi.encodeWithSignature("InvalidInitialization()")); + moveTokenImplementationV2.initialize(DEPLOYER_ADDRESS); + } + + /** + * @dev Tests that initialize cannot be called on proxy before upgrade + */ + function testCannotReinitializeProxyBeforeUpgrade() public { + // Attempt to reinitialize the proxy before upgrade - should revert + // The initialize was already called during initial deployment + vm.expectRevert(abi.encodeWithSignature("InvalidInitialization()")); + moveV1.initialize(DEPLOYER_ADDRESS); + } +} diff --git a/protocol-units/settlement/mcr/contracts/test/token/UpgradeMOVETokenHyperliquidV3.t.sol b/protocol-units/settlement/mcr/contracts/test/token/UpgradeMOVETokenHyperliquidV3.t.sol new file mode 100644 index 000000000..454d3b0a6 --- /dev/null +++ b/protocol-units/settlement/mcr/contracts/test/token/UpgradeMOVETokenHyperliquidV3.t.sol @@ -0,0 +1,736 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.26; + +// Foundry +import "forge-std/Test.sol"; +import "forge-std/console.sol"; + +// Project contracts +import {MOVETokenHyperliquidV2} from "../../src/token/MOVETokenHyperliquidV2.sol"; +import {MOVETokenHyperliquidV3} from "../../src/token/MOVETokenHyperliquidV3.sol"; + +// OpenZeppelin +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; +import {ERC1967Utils} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol"; +import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; + +// LayerZero +import {ILayerZeroEndpointV2} from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import {SendParam, MessagingFee, MessagingReceipt, OFTReceipt} from "@layerzerolabs/oft-evm/contracts/interfaces/IOFT.sol"; + +/** + * @title UpgradeMOVETokenHyperliquidV3Test + * @notice Test suite for upgrading MOVETokenHyperliquidV2 to MOVETokenHyperliquidV3 via timelock + * @dev Tests the complete upgrade process including: + * - Scheduling the upgrade through timelock with proper delay + * - Executing the upgrade after timelock delay + * - Verifying all state transitions and access controls + * - Testing pausing functionality + * - Testing reinitialization and inability to initialize again + * - Testing AccessControl role-based permissions + */ +contract UpgradeMOVETokenHyperliquidV3Test is Test { + // ============================================================================= + // STATE VARIABLES - CONTRACT INSTANCES + // ============================================================================= + + MOVETokenHyperliquidV2 public moveV2; + MOVETokenHyperliquidV3 public moveV3; + MOVETokenHyperliquidV3 public moveTokenImplementationV3; + TransparentUpgradeableProxy public moveProxy = TransparentUpgradeableProxy(payable(0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073)); + ProxyAdmin public admin = ProxyAdmin(0x8365AA031806A1ac2b31a5d3b8323020FC85DfEc); + + TimelockController public timelock = TimelockController(payable(0xA649f6335828f070dDDd7A8c4F5bef2b6FF7Bd51)); + + // ============================================================================= + // STATE VARIABLES - ADDRESSES + // ============================================================================= + + /// @dev Timelock controller address + address constant TIMELOCK_ADDRESS = 0xA649f6335828f070dDDd7A8c4F5bef2b6FF7Bd51; + /// @dev Proposer address (multisig) + address constant PROPOSER_ADDRESS = 0x5cD71FFf9947486fD6F5c193a722191c22728887; + /// @dev Executor address (multisig) + address constant EXECUTOR_ADDRESS = 0x443513664Eab95280360Dc1c33FDe1ad4ED5C7bB; + /// @dev Deployer address + address constant DEPLOYER_ADDRESS = 0xB2105464215716e1445367BEA5668F581eF7d063; + + /// @dev Expected proxy address + address constant EXPECTED_MOVE_TOKEN_PROXY = 0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073; + /// @dev LayerZero endpoint address (Hyperliquid Mainnet) + address constant LZ_ENDPOINT = 0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9; + + // ============================================================================= + // STATE VARIABLES - CONFIGURATION + // ============================================================================= + + /// @dev Minimum delay for timelock operations (48 hours) + uint256 public constant MIN_DELAY = 48 hours; + + /// @dev MOVE token decimals + uint8 public constant MOVE_DECIMALS = 8; + + // ============================================================================= + // SETUP + // ============================================================================= + + /** + * @dev Sets up the test environment by: + * 1. Initializing V2 proxy instance + * 2. Deploying the V3 implementation + * 3. Setting up V3 proxy instance + */ + function setUp() public { + // Set up existing V2 proxy + moveV2 = MOVETokenHyperliquidV2(0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073); + moveV3 = MOVETokenHyperliquidV3(0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073); + + // Deploy new V3 implementation + moveTokenImplementationV3 = new MOVETokenHyperliquidV3(LZ_ENDPOINT); + } + + // ============================================================================= + // UPGRADE TESTS + // ============================================================================= + + /** + * @dev Tests the complete upgrade process from MOVETokenHyperliquidV2 to MOVETokenHyperliquidV3 + * This test simulates the real upgrade scenario including: + * 1. Verifying initial V2 state + * 2. Scheduling the upgrade through timelock with proper delay + * 3. Verifying that upgrade cannot be executed before timelock delay + * 4. Executing the upgrade after timelock delay + * 5. Calling initialize on the V3 to set up AccessControl roles + * 6. Verifying all state transitions and new V3 functionality + */ + function testUpgradeV2ToV3ViaTimelock() public { + + // Verify initial V2 state + assertEq(moveV2.decimals(), MOVE_DECIMALS); + assertEq(moveV2.sharedDecimals(), MOVE_DECIMALS); + assertEq(moveV2.name(), "Movement"); + assertEq(moveV2.symbol(), "MOVE"); + assertEq(moveV2.owner(), PROPOSER_ADDRESS); + assertEq(address(moveV2.endpoint()), LZ_ENDPOINT); + uint256 initialTotalSupply = moveV2.totalSupply(); + + // Verify admin owner is timelock + assertEq(admin.owner(), address(timelock)); + + // Prepare upgrade data with initialize call to set up AccessControl + bytes memory initData = abi.encodeWithSignature("initialize(address)", PROPOSER_ADDRESS); + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(EXPECTED_MOVE_TOKEN_PROXY), + address(moveTokenImplementationV3), + initData + ); + + console.log("V3 Implementation:", address(moveTokenImplementationV3)); + console.logBytes(upgradeData); + + // Schedule upgrade via proposer + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + // Verify that upgrade cannot be executed before timelock delay + vm.prank(EXECUTOR_ADDRESS); + vm.expectRevert(); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Fast forward time past the delay + vm.warp(block.timestamp + MIN_DELAY + 1); + + // Execute upgrade via executor + vm.prank(EXECUTOR_ADDRESS); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Verify V2 interface still works after upgrade + assertEq(moveV2.decimals(), MOVE_DECIMALS); + assertEq(moveV2.sharedDecimals(), MOVE_DECIMALS); + assertEq(moveV2.name(), "Movement"); + assertEq(moveV2.symbol(), "MOVE"); + assertEq(moveV2.owner(), PROPOSER_ADDRESS); + assertEq(address(moveV2.endpoint()), LZ_ENDPOINT); + + assertEq(address(moveV3), EXPECTED_MOVE_TOKEN_PROXY); + + // Verify V3 token state after upgrade + assertEq(moveV3.decimals(), MOVE_DECIMALS); + assertEq(moveV3.sharedDecimals(), MOVE_DECIMALS); + assertEq(moveV3.name(), "Movement"); + assertEq(moveV3.symbol(), "MOVE"); + assertEq(moveV3.owner(), PROPOSER_ADDRESS); + assertEq(address(moveV3.endpoint()), LZ_ENDPOINT); + assertEq(moveV3.totalSupply(), initialTotalSupply); + + // Verify proxy implementation was updated correctly + bytes32 implementation = vm.load(address(moveProxy), ERC1967Utils.IMPLEMENTATION_SLOT); + address implAddr; + assembly { + implAddr := and(implementation, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + } + assertEq(implAddr, address(moveTokenImplementationV3)); + + // Verify AccessControl roles were set up correctly + bytes32 DEFAULT_ADMIN_ROLE = moveV3.DEFAULT_ADMIN_ROLE(); + bytes32 PAUSER_ROLE = moveV3.PAUSER_ROLE(); + bytes32 UNPAUSER_ROLE = moveV3.UNPAUSER_ROLE(); + + assertTrue(moveV3.hasRole(DEFAULT_ADMIN_ROLE, PROPOSER_ADDRESS)); + assertTrue(moveV3.hasRole(PAUSER_ROLE, PROPOSER_ADDRESS)); + assertTrue(moveV3.hasRole(UNPAUSER_ROLE, PROPOSER_ADDRESS)); + + // Verify EIP-712 domain + ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + bytes32 domainSalt, + uint256[] memory extensions + ) = moveV3.eip712Domain(); + + assertEq(fields, hex"0f", "EIP-712 fields should be 0x0f"); + assertEq(name, "Movement", "EIP-712 name should be Movement"); + assertEq(version, "1", "EIP-712 version should be 1"); + assertEq(chainId, 999, "EIP-712 chainId should be 999"); + assertEq(verifyingContract, address(moveV3), "EIP-712 verifying contract should be the token address"); + assertEq(domainSalt, bytes32(0), "EIP-712 salt should be zero"); + assertEq(extensions.length, 0, "EIP-712 extensions array should be empty"); + + // Verify finalizer storage slot (remains from original deployment) + address finalizer = address(uint160(uint256(vm.load(address(moveV3), keccak256("HyperCore deployer"))))); + assertEq(finalizer, DEPLOYER_ADDRESS, "Finalizer should remain as originally deployed"); + + console.log("Upgrade successful!"); + console.log("V3 Implementation:", address(moveTokenImplementationV3)); + console.log("Proxy address:", address(moveProxy)); + console.log("Chain ID:", chainId); + } + + /** + * @dev Tests that the upgrade can only be scheduled by the proposer + */ + function testOnlyProposerCanSchedule() public { + bytes memory initData = abi.encodeWithSignature("initialize(address)", PROPOSER_ADDRESS); + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(EXPECTED_MOVE_TOKEN_PROXY), + address(moveTokenImplementationV3), + initData + ); + + // Try to schedule from unauthorized address + vm.prank(DEPLOYER_ADDRESS); + vm.expectRevert(); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + // Verify proposer can schedule + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + } + + /** + * @dev Tests that the upgrade can only be executed by the executor + */ + function testOnlyExecutorCanExecute() public { + bytes memory initData = abi.encodeWithSignature("initialize(address)", PROPOSER_ADDRESS); + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(EXPECTED_MOVE_TOKEN_PROXY), + address(moveTokenImplementationV3), + initData + ); + + // Schedule upgrade + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + // Fast forward time + vm.warp(block.timestamp + MIN_DELAY + 1); + + // Try to execute from unauthorized address + vm.prank(DEPLOYER_ADDRESS); + vm.expectRevert(); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Verify executor can execute + vm.prank(EXECUTOR_ADDRESS); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + } + + /** + * @dev Tests that the upgrade respects the 48-hour delay + */ + function testUpgradeRespects48HourDelay() public { + bytes memory initData = abi.encodeWithSignature("initialize(address)", PROPOSER_ADDRESS); + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(EXPECTED_MOVE_TOKEN_PROXY), + address(moveTokenImplementationV3), + initData + ); + + // Schedule upgrade + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + uint256 scheduleTime = block.timestamp; + + // Try to execute before delay + vm.warp(scheduleTime + MIN_DELAY - 1); + vm.prank(EXECUTOR_ADDRESS); + vm.expectRevert(); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Execute exactly at delay + vm.warp(scheduleTime + MIN_DELAY); + vm.prank(EXECUTOR_ADDRESS); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Verify upgrade succeeded + bytes32 implementation = vm.load(address(moveProxy), ERC1967Utils.IMPLEMENTATION_SLOT); + address implAddr; + assembly { + implAddr := and(implementation, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + } + assertEq(implAddr, address(moveTokenImplementationV3)); + } + + /** + * @dev Tests that token state is preserved across the upgrade + */ + function testStatePreservation() public { + // Mint some tokens to test state preservation + deal(address(moveV2), PROPOSER_ADDRESS, 1000 * 10 ** MOVE_DECIMALS, true); + uint256 balanceBefore = moveV2.balanceOf(PROPOSER_ADDRESS); + uint256 totalSupplyBefore = moveV2.totalSupply(); + + // Perform upgrade + bytes memory initData = abi.encodeWithSignature("initialize(address)", PROPOSER_ADDRESS); + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(EXPECTED_MOVE_TOKEN_PROXY), + address(moveTokenImplementationV3), + initData + ); + + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + vm.warp(block.timestamp + MIN_DELAY); + + vm.prank(EXECUTOR_ADDRESS); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Verify state is preserved + assertEq(moveV3.balanceOf(PROPOSER_ADDRESS), balanceBefore); + assertEq(moveV3.totalSupply(), totalSupplyBefore); + assertEq(moveV3.owner(), PROPOSER_ADDRESS); // Owner remains DEPLOYER from original deployment + assertEq(moveV3.decimals(), MOVE_DECIMALS); + assertEq(moveV3.sharedDecimals(), MOVE_DECIMALS); + } + + // ============================================================================= + // V3-SPECIFIC FUNCTIONALITY TESTS + // ============================================================================= + + /** + * @dev Tests pausing functionality with AccessControl + */ + function testPausingFunctionality() public { + // Perform upgrade with initialization + _performUpgrade(); + + // Mint some tokens for testing + deal(address(moveV3), PROPOSER_ADDRESS, 1000 * 10 ** MOVE_DECIMALS, true); + + // Verify initial state - not paused + assertFalse(moveV3.paused()); + + // Pause the contract as PAUSER_ROLE + vm.prank(PROPOSER_ADDRESS); + moveV3.pause(); + + // Verify paused state + assertTrue(moveV3.paused()); + + // Unpause the contract as UNPAUSER_ROLE + vm.prank(PROPOSER_ADDRESS); + moveV3.unpause(); + + // Verify unpaused state + assertFalse(moveV3.paused()); + } + + /** + * @dev Tests that pausing prevents calling send() function + */ + function testPausingPreventsSend() public { + // Perform upgrade with initialization + _performUpgrade(); + + // Mint some tokens for testing + deal(address(moveV3), PROPOSER_ADDRESS, 1000 * 10 ** MOVE_DECIMALS, true); + + // Verify initial state - not paused + assertFalse(moveV3.paused()); + + // Prepare send parameters + SendParam memory sendParam = SendParam({ + dstEid: 30325, // Ethereum mainnet endpoint ID + to: 0xb10acc8eb83aa4852a1559caa9633427458ef084f9b9febec6ad8558ad709355, + amountLD: 100 * 10 ** MOVE_DECIMALS, + minAmountLD: 100 * 10 ** MOVE_DECIMALS, + extraOptions: bytes(""), + composeMsg: bytes(""), + oftCmd: bytes("") + }); + + MessagingFee memory fee = MessagingFee({ + nativeFee: 0.001 ether, + lzTokenFee: 0 + }); + + // Pause the contract + vm.prank(PROPOSER_ADDRESS); + moveV3.pause(); + + // Verify paused state + assertTrue(moveV3.paused()); + + // Attempt to send tokens while paused - should revert + vm.prank(PROPOSER_ADDRESS); + vm.deal(PROPOSER_ADDRESS, 1 ether); + vm.expectRevert(abi.encodeWithSignature("EnforcedPause()")); + moveV3.send{value: 0.001 ether}(sendParam, fee, PROPOSER_ADDRESS); + + // Verify balance unchanged (send didn't execute) + assertEq(moveV3.balanceOf(PROPOSER_ADDRESS), 1000 * 10 ** MOVE_DECIMALS); + + // Unpause the contract + vm.prank(PROPOSER_ADDRESS); + moveV3.unpause(); + + // Verify unpaused state + assertFalse(moveV3.paused()); + + // Try to send tokens while unpaused - should not revert with EnforcedPause + // It may fail at the LayerZero level, but the pause check should pass + vm.prank(PROPOSER_ADDRESS); + vm.deal(PROPOSER_ADDRESS, 1 ether); + + // We expect it to either: + // 1. Succeed (if LayerZero is properly configured) + // 2. Fail with a LayerZero-related error (not EnforcedPause) + // The key is that it should NOT revert with EnforcedPause + moveV3.send{value: 0.001 ether}(sendParam, fee, PROPOSER_ADDRESS); + + console.log("Send failed with LayerZero error (expected) - pause check passed"); + } + + /** + * @dev Tests that regular ERC20 transfers are NOT affected by pausing + * Only the send() function (LayerZero bridging) should be paused + */ + function testPausingDoesNotAffectERC20Transfers() public { + // Perform upgrade with initialization + _performUpgrade(); + + // Get initial balances + uint256 initialProposerBalance = moveV3.balanceOf(PROPOSER_ADDRESS); + uint256 initialExecutorBalance = moveV3.balanceOf(EXECUTOR_ADDRESS); + uint256 initialDeployerBalance = moveV3.balanceOf(DEPLOYER_ADDRESS); + uint256 initialTotalSupply = moveV3.totalSupply(); + + // Mint some tokens for testing + deal(address(moveV3), PROPOSER_ADDRESS, initialProposerBalance + 1000 * 10 ** MOVE_DECIMALS, true); + + // Pause the contract + vm.prank(PROPOSER_ADDRESS); + moveV3.pause(); + + // Verify paused state + assertTrue(moveV3.paused()); + + // Regular ERC20 transfers should still work when paused + vm.prank(PROPOSER_ADDRESS); + moveV3.transfer(EXECUTOR_ADDRESS, 100 * 10 ** MOVE_DECIMALS); + assertEq(moveV3.balanceOf(EXECUTOR_ADDRESS), initialExecutorBalance + 100 * 10 ** MOVE_DECIMALS); + assertEq(moveV3.balanceOf(PROPOSER_ADDRESS), initialProposerBalance + 900 * 10 ** MOVE_DECIMALS); + + // Approve should work + vm.prank(PROPOSER_ADDRESS); + moveV3.approve(EXECUTOR_ADDRESS, 200 * 10 ** MOVE_DECIMALS); + + // TransferFrom should work + vm.prank(EXECUTOR_ADDRESS); + moveV3.transferFrom(PROPOSER_ADDRESS, DEPLOYER_ADDRESS, 50 * 10 ** MOVE_DECIMALS); + assertEq(moveV3.balanceOf(DEPLOYER_ADDRESS), initialDeployerBalance + 50 * 10 ** MOVE_DECIMALS); + + // Unpause + vm.prank(PROPOSER_ADDRESS); + moveV3.unpause(); + } + + /** + * @dev Tests that only accounts with PAUSER_ROLE can pause + */ + function testOnlyPauserCanPause() public { + _performUpgrade(); + + address nonPauser = address(0x9999); + + // Try to pause from non-pauser address + vm.prank(nonPauser); + vm.expectRevert(); + moveV3.pause(); + + // Verify PAUSER_ROLE can pause + vm.prank(PROPOSER_ADDRESS); + moveV3.pause(); + assertTrue(moveV3.paused()); + } + + /** + * @dev Tests that only accounts with UNPAUSER_ROLE can unpause + */ + function testOnlyUnpauserCanUnpause() public { + _performUpgrade(); + + // First pause the contract + vm.prank(PROPOSER_ADDRESS); + moveV3.pause(); + + address nonUnpauser = address(0x9999); + + // Try to unpause from non-unpauser address + vm.prank(nonUnpauser); + vm.expectRevert(); + moveV3.unpause(); + + // Verify UNPAUSER_ROLE can unpause + vm.prank(PROPOSER_ADDRESS); + moveV3.unpause(); + assertFalse(moveV3.paused()); + } + + /** + * @dev Tests AccessControl role management + */ + function testAccessControlRoles() public { + _performUpgrade(); + + bytes32 DEFAULT_ADMIN_ROLE = moveV3.DEFAULT_ADMIN_ROLE(); + bytes32 PAUSER_ROLE = moveV3.PAUSER_ROLE(); + bytes32 UNPAUSER_ROLE = moveV3.UNPAUSER_ROLE(); + + address newPauser = address(0x1111); + address newUnpauser = address(0x2222); + + // Grant PAUSER_ROLE to new address + vm.prank(PROPOSER_ADDRESS); + moveV3.grantRole(PAUSER_ROLE, newPauser); + assertTrue(moveV3.hasRole(PAUSER_ROLE, newPauser)); + + // Grant UNPAUSER_ROLE to new address + vm.prank(PROPOSER_ADDRESS); + moveV3.grantRole(UNPAUSER_ROLE, newUnpauser); + assertTrue(moveV3.hasRole(UNPAUSER_ROLE, newUnpauser)); + + // Verify new pauser can pause + vm.prank(newPauser); + moveV3.pause(); + assertTrue(moveV3.paused()); + + // Verify new unpauser can unpause + vm.prank(newUnpauser); + moveV3.unpause(); + assertFalse(moveV3.paused()); + + // Revoke PAUSER_ROLE + vm.prank(PROPOSER_ADDRESS); + moveV3.revokeRole(PAUSER_ROLE, newPauser); + assertFalse(moveV3.hasRole(PAUSER_ROLE, newPauser)); + + // Verify revoked pauser cannot pause + vm.prank(newPauser); + vm.expectRevert(); + moveV3.pause(); + } + + /** + * @dev Tests that initialize cannot be called again after V3 upgrade + */ + function testCannotReinitializeAfterV3Upgrade() public { + _performUpgrade(); + + // Attempt to reinitialize - should revert because reinitializer(2) was already called + vm.expectRevert(abi.encodeWithSignature("InvalidInitialization()")); + moveV3.initialize(address(0x9999)); + } + + /** + * @dev Tests that initialize cannot be called on the V3 implementation contract + */ + function testCannotInitializeV3Implementation() public { + // Attempt to initialize the V3 implementation directly - should revert + // The constructor calls _disableInitializers() which prevents initialization + vm.expectRevert(abi.encodeWithSignature("InvalidInitialization()")); + moveTokenImplementationV3.initialize(PROPOSER_ADDRESS); + } + + /** + * @dev Tests that V3 inherits all V2 functionality + */ + function testV3InheritsV2Functionality() public { + _performUpgrade(); + + // Test V2-specific functionality (sharedDecimals) + assertEq(moveV3.sharedDecimals(), MOVE_DECIMALS); + + // Verify that both decimals and sharedDecimals return the same value + assertEq(moveV3.decimals(), moveV3.sharedDecimals()); + + // Test V1 (base) functionality - token metadata + assertEq(moveV3.name(), "Movement"); + assertEq(moveV3.symbol(), "MOVE"); + assertEq(moveV3.decimals(), MOVE_DECIMALS); + + // Test ownership functionality from V1 (owner remains from original deployment) + assertEq(moveV3.owner(), PROPOSER_ADDRESS); + + // Test LayerZero endpoint configuration from V1 + assertEq(address(moveV3.endpoint()), LZ_ENDPOINT); + + // Test ERC20 functionality - mint and transfer + uint256 initialProposerBalance = moveV3.balanceOf(PROPOSER_ADDRESS); + uint256 initialExecutorBalance = moveV3.balanceOf(EXECUTOR_ADDRESS); + uint256 initialTotalSupply = moveV3.totalSupply(); + + deal(address(moveV3), PROPOSER_ADDRESS, initialProposerBalance + 1000 * 10 ** MOVE_DECIMALS, true); + assertEq(moveV3.balanceOf(PROPOSER_ADDRESS), initialProposerBalance + 1000 * 10 ** MOVE_DECIMALS); + assertEq(moveV3.totalSupply(), initialTotalSupply + 1000 * 10 ** MOVE_DECIMALS); + + // Test transfer functionality + vm.prank(PROPOSER_ADDRESS); + moveV3.transfer(EXECUTOR_ADDRESS, 100 * 10 ** MOVE_DECIMALS); + assertEq(moveV3.balanceOf(EXECUTOR_ADDRESS), initialExecutorBalance + 100 * 10 ** MOVE_DECIMALS); + assertEq(moveV3.balanceOf(PROPOSER_ADDRESS), initialProposerBalance + 900 * 10 ** MOVE_DECIMALS); + + // Test approve and transferFrom functionality + uint256 initialDeployerBalance = moveV3.balanceOf(DEPLOYER_ADDRESS); + + vm.prank(PROPOSER_ADDRESS); + moveV3.approve(EXECUTOR_ADDRESS, 200 * 10 ** MOVE_DECIMALS); + assertEq(moveV3.allowance(PROPOSER_ADDRESS, EXECUTOR_ADDRESS), 200 * 10 ** MOVE_DECIMALS); + + vm.prank(EXECUTOR_ADDRESS); + moveV3.transferFrom(PROPOSER_ADDRESS, DEPLOYER_ADDRESS, 50 * 10 ** MOVE_DECIMALS); + assertEq(moveV3.balanceOf(DEPLOYER_ADDRESS), initialDeployerBalance + 50 * 10 ** MOVE_DECIMALS); + assertEq(moveV3.balanceOf(PROPOSER_ADDRESS), initialProposerBalance + 850 * 10 ** MOVE_DECIMALS); + assertEq(moveV3.allowance(PROPOSER_ADDRESS, EXECUTOR_ADDRESS), 150 * 10 ** MOVE_DECIMALS); + + // Test EIP-712 Permit functionality (from ERC20PermitUpgradeable) + ( + bytes1 fields, + string memory name, + string memory version, + uint256 chainId, + address verifyingContract, + , + ) = moveV3.eip712Domain(); + + assertEq(name, "Movement"); + assertEq(version, "1"); + assertEq(verifyingContract, address(moveV3)); + assertTrue(fields != 0x00, "EIP-712 domain should be configured"); + assertTrue(chainId > 0, "Chain ID should be set"); + + // Test finalizer storage functionality from V1 (remains from original deployment) + address finalizer = address(uint160(uint256(vm.load(address(moveV3), keccak256("HyperCore deployer"))))); + assertEq(finalizer, DEPLOYER_ADDRESS, "Finalizer should be set from original deployment"); + + // Test setFinalizer functionality (only owner can call this) + address testAddress = address(0x9999); + vm.prank(PROPOSER_ADDRESS); // Owner is DEPLOYER from original deployment + moveV3.setFinalizer(testAddress); + address newFinalizer = address(uint160(uint256(vm.load(address(moveV3), keccak256("HyperCore deployer"))))); + assertEq(newFinalizer, testAddress, "Finalizer should be updated"); + } + + /** + * @dev Tests upgrading without calling initialize (roles won't be set) + */ + function testUpgradeWithoutInitialize() public { + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(EXPECTED_MOVE_TOKEN_PROXY), + address(moveTokenImplementationV3), + bytes("") // No initialize call + ); + + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + vm.warp(block.timestamp + MIN_DELAY); + + vm.prank(EXECUTOR_ADDRESS); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + + // Verify upgrade succeeded but roles are not set + bytes32 implementation = vm.load(address(moveProxy), ERC1967Utils.IMPLEMENTATION_SLOT); + address implAddr; + assembly { + implAddr := and(implementation, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + } + assertEq(implAddr, address(moveTokenImplementationV3)); + + // Verify roles are NOT set (since initialize wasn't called) + bytes32 DEFAULT_ADMIN_ROLE = moveV3.DEFAULT_ADMIN_ROLE(); + bytes32 PAUSER_ROLE = moveV3.PAUSER_ROLE(); + bytes32 UNPAUSER_ROLE = moveV3.UNPAUSER_ROLE(); + + assertFalse(moveV3.hasRole(DEFAULT_ADMIN_ROLE, PROPOSER_ADDRESS)); + assertFalse(moveV3.hasRole(PAUSER_ROLE, PROPOSER_ADDRESS)); + assertFalse(moveV3.hasRole(UNPAUSER_ROLE, PROPOSER_ADDRESS)); + + // Now initialize manually + vm.prank(DEPLOYER_ADDRESS); + moveV3.initialize(PROPOSER_ADDRESS); + + // Verify roles are now set + assertTrue(moveV3.hasRole(DEFAULT_ADMIN_ROLE, PROPOSER_ADDRESS)); + assertTrue(moveV3.hasRole(PAUSER_ROLE, PROPOSER_ADDRESS)); + assertTrue(moveV3.hasRole(UNPAUSER_ROLE, PROPOSER_ADDRESS)); + } + + // ============================================================================= + // HELPER FUNCTIONS + // ============================================================================= + + /** + * @dev Helper function to perform the upgrade with initialization + */ + function _performUpgrade() internal { + bytes memory initData = abi.encodeWithSignature("initialize(address)", PROPOSER_ADDRESS); + bytes memory upgradeData = abi.encodeWithSignature( + "upgradeAndCall(address,address,bytes)", + address(EXPECTED_MOVE_TOKEN_PROXY), + address(moveTokenImplementationV3), + initData + ); + + vm.prank(PROPOSER_ADDRESS); + timelock.schedule(address(admin), 0, upgradeData, bytes32(0), bytes32(0), MIN_DELAY); + + vm.warp(block.timestamp + MIN_DELAY); + + vm.prank(EXECUTOR_ADDRESS); + timelock.execute(address(admin), 0, upgradeData, bytes32(0), bytes32(0)); + } +} diff --git a/protocol-units/tokens/mainnet/hyperliquid/.github/workflows/test.yml b/protocol-units/tokens/mainnet/hyperliquid/.github/workflows/test.yml new file mode 100644 index 000000000..4481ec6a8 --- /dev/null +++ b/protocol-units/tokens/mainnet/hyperliquid/.github/workflows/test.yml @@ -0,0 +1,40 @@ +name: CI + +on: + push: + pull_request: + workflow_dispatch: + +env: + FOUNDRY_PROFILE: ci + +jobs: + check: + name: Foundry project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + + - name: Show Forge version + run: | + forge --version + + - name: Run Forge fmt + run: | + forge fmt --check + id: fmt + + - name: Run Forge build + run: | + forge build --sizes + id: build + + - name: Run Forge tests + run: | + forge test -vvv + id: test diff --git a/protocol-units/tokens/mainnet/hyperliquid/.gitignore b/protocol-units/tokens/mainnet/hyperliquid/.gitignore new file mode 100644 index 000000000..85198aaa5 --- /dev/null +++ b/protocol-units/tokens/mainnet/hyperliquid/.gitignore @@ -0,0 +1,14 @@ +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ + +# Docs +docs/ + +# Dotenv file +.env diff --git a/protocol-units/tokens/mainnet/hyperliquid/README.md b/protocol-units/tokens/mainnet/hyperliquid/README.md new file mode 100644 index 000000000..8817d6ab7 --- /dev/null +++ b/protocol-units/tokens/mainnet/hyperliquid/README.md @@ -0,0 +1,66 @@ +## Foundry + +**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** + +Foundry consists of: + +- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). +- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. +- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. +- **Chisel**: Fast, utilitarian, and verbose solidity REPL. + +## Documentation + +https://book.getfoundry.sh/ + +## Usage + +### Build + +```shell +$ forge build +``` + +### Test + +```shell +$ forge test +``` + +### Format + +```shell +$ forge fmt +``` + +### Gas Snapshots + +```shell +$ forge snapshot +``` + +### Anvil + +```shell +$ anvil +``` + +### Deploy + +```shell +$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key +``` + +### Cast + +```shell +$ cast +``` + +### Help + +```shell +$ forge --help +$ anvil --help +$ cast --help +``` diff --git a/protocol-units/tokens/mainnet/hyperliquid/broadcast/MOVEHyperLiquidComposer.s.sol/999/run-1764117799160.json b/protocol-units/tokens/mainnet/hyperliquid/broadcast/MOVEHyperLiquidComposer.s.sol/999/run-1764117799160.json new file mode 100644 index 000000000..37e7aeb69 --- /dev/null +++ b/protocol-units/tokens/mainnet/hyperliquid/broadcast/MOVEHyperLiquidComposer.s.sol/999/run-1764117799160.json @@ -0,0 +1,50 @@ +{ + "transactions": [ + { + "hash": "0x36208214698cafc6694cd01b85021c4762e67984c41da53635d3bbfbd13760c7", + "transactionType": "CREATE", + "contractName": "MOVEHyperLiquidComposer", + "contractAddress": "0x29ec0d7e6e6ba3441bf9747f9fd37bb73b041410", + "function": null, + "arguments": [ + "0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073", + "395", + "0" + ], + "transaction": { + "from": "0xb2105464215716e1445367bea5668f581ef7d063", + "gas": "0x3c36fa", + "value": "0x0", + "input": "0x6101a0604052348015610010575f5ffd5b50604051613c95380380613c9583398181016040528101906100329190610528565b82828260016100536100486103de60201b60201c565b61040760201b60201c565b5f01819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036100be576040517fc23419a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5f0b815f0b12806100f4575060125f0b815f0b135b1561015b57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60126040517f470eb46100000000000000000000000000000000000000000000000000000000815260040161015293929190610587565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16635e280f116040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101a4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101c891906105f7565b73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250505f6103e7461461024157610451610244565b60965b905073222222222222222222222222222222222222222273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050600a5f0b60e0815f0b815250508067ffffffffffffffff166101008167ffffffffffffffff168152505060a05173ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610303573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103279190610622565b73ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff16815250506103748367ffffffffffffffff1661041060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff1681525050815f0b610160815f0b815250508267ffffffffffffffff166101808167ffffffffffffffff1681525050505050505050506106b6565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005f1b905090565b5f819050919050565b5f8167ffffffffffffffff1673200000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166104519190610683565b9050919050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104858261045c565b9050919050565b6104958161047b565b811461049f575f5ffd5b50565b5f815190506104b08161048c565b92915050565b5f67ffffffffffffffff82169050919050565b6104d2816104b6565b81146104dc575f5ffd5b50565b5f815190506104ed816104c9565b92915050565b5f815f0b9050919050565b610507816104f3565b8114610511575f5ffd5b50565b5f81519050610522816104fe565b92915050565b5f5f5f6060848603121561053f5761053e610458565b5b5f61054c868287016104a2565b935050602061055d868287016104df565b925050604061056e86828701610514565b9150509250925092565b610581816104f3565b82525050565b5f60608201905061059a5f830186610578565b6105a76020830185610578565b6105b46040830184610578565b949350505050565b5f6105c68261047b565b9050919050565b6105d6816105bc565b81146105e0575f5ffd5b50565b5f815190506105f1816105cd565b92915050565b5f6020828403121561060c5761060b610458565b5b5f610619848285016105e3565b91505092915050565b5f6020828403121561063757610636610458565b5b5f610644848285016104a2565b91505092915050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61068d8261064d565b91506106988361064d565b92508282019050808211156106b0576106af610656565b5b92915050565b60805160a05160c05160e051610100516101205161014051610160516101805161350a61078b5f395f818161142c0152818161179f015261189701525f8181610e8201526117c001525f8181611408015281816117e1015261182801525f8181610ed401528181611736015261184d01525f8181610ea6015281816118c90152611a1201525f8181610a6201526118ea01525f81816109af0152818161190b015261193f01525f81816108540152818161097601528181610fa10152610fdd01525f8181610a3e0152610f05015261350a5ff3fe608060405260043610610143575f3560e01c8063a4e7f8bd116100b5578063cebb51201161006e578063cebb512014610466578063d0a1026014610490578063d3af0cc1146104ac578063f2f7141f146104d6578063f34ec5e0146104f2578063fa69dc7b1461051c5761014a565b8063a4e7f8bd14610345578063a69610d114610382578063a754403e146103be578063b20bffdc146103e8578063c37bcb4c14610412578063cc4aa2041461043c5761014a565b806320d2c9511161010757806320d2c95114610224578063574ad4a81461024e578063634d45b2146102785780636fad06f5146102b557806371139d6c146102df5780639dbfb13f146103095761014a565b806303a9437e1461014e57806319180904146101785780631cd66690146101945780631ed0993d146101d05780631f8164d9146101fa5761014a565b3661014a57005b5f5ffd5b348015610159575f5ffd5b50610162610546565b60405161016f9190611f00565b60405180910390f35b610192600480360381019061018d9190611f5d565b61054b565b005b34801561019f575f5ffd5b506101ba60048036038101906101b5919061207c565b61093c565b6040516101c7919061213e565b60405180910390f35b3480156101db575f5ffd5b506101e4610974565b6040516101f19190612166565b60405180910390f35b348015610205575f5ffd5b5061020e610998565b60405161021b91906121b9565b60405180910390f35b34801561022f575f5ffd5b506102386109a3565b60405161024591906121e1565b60405180910390f35b348015610259575f5ffd5b506102626109ad565b60405161026f9190612166565b60405180910390f35b348015610283575f5ffd5b5061029e6004803603810190610299919061225b565b6109d1565b6040516102ac9291906122a6565b60405180910390f35b3480156102c0575f5ffd5b506102c9610a3c565b6040516102d69190612166565b60405180910390f35b3480156102ea575f5ffd5b506102f3610a60565b6040516103009190611f00565b60405180910390f35b348015610314575f5ffd5b5061032f600480360381019061032a91906122cd565b610a84565b60405161033c919061232c565b60405180910390f35b348015610350575f5ffd5b5061036b60048036038101906103669190611f5d565b610b73565b604051610379929190612489565b60405180910390f35b34801561038d575f5ffd5b506103a860048036038101906103a391906124b7565b610d8e565b6040516103b59190612535565b60405180910390f35b3480156103c9575f5ffd5b506103d2610e80565b6040516103df9190611f00565b60405180910390f35b3480156103f3575f5ffd5b506103fc610ea4565b604051610409919061255d565b60405180910390f35b34801561041d575f5ffd5b50610426610ec8565b60405161043391906121e1565b60405180910390f35b348015610447575f5ffd5b50610450610ed2565b60405161045d9190612166565b60405180910390f35b348015610471575f5ffd5b5061047a610ef6565b60405161048791906121e1565b60405180910390f35b6104aa60048036038101906104a59190612576565b610efb565b005b3480156104b7575f5ffd5b506104c0611352565b6040516104cd9190611f00565b60405180910390f35b6104f060048036038101906104eb919061262d565b611376565b005b3480156104fd575f5ffd5b50610506611406565b6040516105139190612166565b60405180910390f35b348015610527575f5ffd5b5061053061142a565b60405161053d919061255d565b60405180910390f35b601281565b5f5f5f8381526020019081526020015f206040518060400160405290815f82016040518060e00160405290815f82015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820180546105c890612698565b80601f01602080910402602001604051908101604052809291908181526020018280546105f490612698565b801561063f5780601f106106165761010080835404028352916020019161063f565b820191905f5260205f20905b81548152906001019060200180831161062257829003601f168201915b5050505050815260200160058201805461065890612698565b80601f016020809104026020016040519081016040528092919081815260200182805461068490612698565b80156106cf5780601f106106a6576101008083540402835291602001916106cf565b820191905f5260205f20905b8154815290600101906020018083116106b257829003601f168201915b505050505081526020016006820180546106e890612698565b80601f016020809104026020016040519081016040528092919081815260200182805461071490612698565b801561075f5780601f106107365761010080835404028352916020019161075f565b820191905f5260205f20905b81548152906001019060200180831161074257829003601f168201915b505050505081525050815260200160078201548152505090505f815f01515f015163ffffffff16036107c857816040517f0b9486340000000000000000000000000000000000000000000000000000000081526004016107bf91906126d7565b60405180910390fd5b5f5f8381526020019081526020015f205f5f82015f5f82015f6101000a81549063ffffffff0219169055600182015f9055600282015f9055600382015f9055600482015f6108169190611dcd565b600582015f6108259190611dcd565b600682015f6108349190611dcd565b5050600782015f905550505f348260200151610850919061271d565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c7c7f5b382845f015160405180604001604052808681526020015f815250326040518563ffffffff1660e01b81526004016108c79392919061277d565b60c06040518083038185885af11580156108e3573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610908919061296c565b5050827fd41d02272333251e6367f747c63d5cc227dcac6b0c799067569e80a30f9da36960405160405180910390a2505050565b610944611e0a565b5f61094f8487610d8e565b5f0151905061096981868561144e9092919063ffffffff16565b915050949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b630100000660e01b81565b5f620249f0905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f5f60408484905014610a1e57838390506040517f2b701db1000000000000000000000000000000000000000000000000000000008152600401610a1591906121e1565b60405180910390fd5b8383810190610a2d91906129e5565b80925081935050509250929050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b610a8c611e3c565b5f5f61081073ffffffffffffffffffffffffffffffffffffffff1684604051602001610ab89190612166565b604051602081830303815290604052604051610ad49190612a5d565b5f60405180830381855afa9150503d805f8114610b0c576040519150601f19603f3d011682016040523d82523d5f602084013e610b11565b606091505b509150915081610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d90612af3565b60405180910390fd5b80806020019051810190610b6a9190612b74565b92505050919050565b5f602052805f5260405f205f91509050805f016040518060e00160405290815f82015f9054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482018054610be390612698565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0f90612698565b8015610c5a5780601f10610c3157610100808354040283529160200191610c5a565b820191905f5260205f20905b815481529060010190602001808311610c3d57829003601f168201915b50505050508152602001600582018054610c7390612698565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9f90612698565b8015610cea5780601f10610cc157610100808354040283529160200191610cea565b820191905f5260205f20905b815481529060010190602001808311610ccd57829003601f168201915b50505050508152602001600682018054610d0390612698565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2f90612698565b8015610d7a5780601f10610d5157610100808354040283529160200191610d7a565b820191905f5260205f20905b815481529060010190602001808311610d5d57829003601f168201915b505050505081525050908060070154905082565b610d96611e50565b5f5f61080173ffffffffffffffffffffffffffffffffffffffff168585604051602001610dc4929190612b9f565b604051602081830303815290604052604051610de09190612a5d565b5f60405180830381855afa9150503d805f8114610e18576040519150601f19603f3d011682016040523d82523d5f602084013e610e1d565b606091505b509150915081610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5990612c36565b60405180910390fd5b80806020019051810190610e769190612cb5565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f62030d40905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b604081565b610f036114f3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f88576040517f7eb966c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461103a577f0000000000000000000000000000000000000000000000000000000000000000876040517fc8b356c6000000000000000000000000000000000000000000000000000000008152600401611031929190612ce0565b60405180910390fd5b5f6110458686611515565b90505f6110528787611545565b90503073ffffffffffffffffffffffffffffffffffffffff1663634d45b2826040518263ffffffff1660e01b815260040161108d9190612d4f565b6040805180830381865afa9250505080156110c657506040513d601f19601f820116820180604052508101906110c39190612d83565b60015b611214576110d2611e8c565b6110dc88886115a7565b815f019063ffffffff16908163ffffffff16815250506110fc88886115d8565b816020018181525050828160400181815250506040518060400160405280828152602001348152505f5f8b81526020019081526020015f205f820151815f015f820151815f015f6101000a81548163ffffffff021916908363ffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040190816111929190612f61565b5060a08201518160050190816111a89190612f61565b5060c08201518160060190816111be9190612f61565b50505060208201518160070155905050887f387fc8f821460fa8221428c9f4dc1f6d5db4f6a0a01f33dbeaa8cebd95e5d1448260200151348560405161120693929190613030565b60405180910390a25061133f565b8134101561125b5734826040517f7cb769dc00000000000000000000000000000000000000000000000000000000815260040161125292919061306c565b60405180910390fd5b5f5f34116112705761126b6109a3565b611279565b611278610ec8565b5b9050805a10156112c2575a816040517f23e228cb0000000000000000000000000000000000000000000000000000000081526004016112b992919061306c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663f2f7141f3484886040518463ffffffff1660e01b81526004016112fe929190613093565b5f604051808303818588803b158015611315575f5ffd5b505af193505050508015611327575060015b61133a576113358286611606565b61133b565b5b5050505b505061134961177f565b50505050505050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e657336040517fa19dbf000000000000000000000000000000000000000000000000000000000081526004016113dd9190612166565b60405180910390fd5b6113f08282611799565b5f34111561140257611401826118c3565b5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b611456611e0a565b5f5f5f845f0b131561147a5761146d868686611a41565b80925081935050506114b9565b6114b08686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6114ab91906130ba565b611ae5565b80925081935050505b60405180606001604052808381526020018267ffffffffffffffff1681526020018667ffffffffffffffff16815250925050509392505050565b6114fb611b69565b600261150d611508611baa565b611bd3565b5f0181905550565b5f8282600c60ff1690602c60ff1692611530939291906130fe565b9061153b9190613142565b5f1c905092915050565b60608282604c60ff1690809261155d939291906130fe565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050905092915050565b5f8282600860ff1690600c60ff16926115c2939291906130fe565b906115cd91906131a0565b60e01c905092915050565b5f8282602c60ff1690604c60ff16926115f3939291906130fe565b906115fe9190613142565b905092915050565b5f3414611728575f8273ffffffffffffffffffffffffffffffffffffffff163460405161163290613221565b5f6040518083038185875af1925050503d805f811461166c576040519150601f19603f3d011682016040523d82523d5f602084013e611671565b606091505b5050905080611726575f3273ffffffffffffffffffffffffffffffffffffffff163460405161169f90613221565b5f6040518083038185875af1925050503d805f81146116d9576040519150601f19603f3d011682016040523d82523d5f602084013e6116de565b606091505b505090508061172457346040517f77479d3200000000000000000000000000000000000000000000000000000000815260040161171b91906121e1565b60405180910390fd5b505b505b5f811461177b5761177a82827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611bdc9092919063ffffffff16565b5b5050565b600161179161178c611baa565b611bd3565b5f0181905550565b5f6118067f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008561093c565b90505f815f0151146118be575f611821848360200151611c2f565b90506118917f0000000000000000000000000000000000000000000000000000000000000000835f01517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611bdc9092919063ffffffff16565b6118bc847f000000000000000000000000000000000000000000000000000000000000000083611c7b565b505b505050565b5f6119307f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000003461093c565b90505f815f015114611a3d575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16825f015160405161198490613221565b5f6040518083038185875af1925050503d805f81146119be576040519150601f19603f3d011682016040523d82523d5f602084013e6119c3565b606091505b5050905080611a0c57815f01516040517f77479d32000000000000000000000000000000000000000000000000000000008152600401611a0391906121e1565b60405180910390fd5b611a3b837f00000000000000000000000000000000000000000000000000000000000000008460200151611c7b565b505b5050565b5f5f5f83600a611a519190613370565b90505f818667ffffffffffffffff16611a6a91906133ba565b9050818781611a7c57611a7b6133fb565b5b068703935080841115611ac85783816040517f9a0c830f000000000000000000000000000000000000000000000000000000008152600401611abf92919061306c565b60405180910390fd5b818481611ad857611ad76133fb565b5b0492505050935093915050565b5f5f5f83600a611af59190613370565b90505f818667ffffffffffffffff16611b0e9190613428565b905086935080871115611b5a5783816040517f9a0c830f000000000000000000000000000000000000000000000000000000008152600401611b5192919061306c565b60405180910390fd5b81840292505050935093915050565b611b71611d4f565b15611ba8576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005f1b905090565b5f819050919050565b611be98383836001611d6b565b611c2a57826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611c219190612166565b60405180910390fd5b505050565b5f611c3983610a84565b5f0151611c72576040517fbdcf14ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81905092915050565b5f838383604051602001611c9193929190613458565b60405160208183030381529060405290505f630100000660e01b82604051602001611cbd9291906134ad565b604051602081830303815290604052905073333333333333333333333333333333333333333373ffffffffffffffffffffffffffffffffffffffff166317938e13826040518263ffffffff1660e01b8152600401611d1b9190612d4f565b5f604051808303815f87803b158015611d32575f5ffd5b505af1158015611d44573d5f5f3e3d5ffd5b505050505050505050565b5f6002611d62611d5d611baa565b611bd3565b5f015414905090565b5f5f63a9059cbb60e01b9050604051815f525f1960601c86166004528460245260205f60445f5f8b5af1925060015f51148316611dbf578383151615611db3573d5f823e3d81fd5b5f873b113d1516831692505b806040525050949350505050565b508054611dd990612698565b5f825580601f10611dea5750611e07565b601f0160209004905f5260205f2090810190611e069190611ecb565b5b50565b60405180606001604052805f81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681525090565b60405180602001604052805f151581525090565b60405180606001604052805f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681525090565b6040518060e001604052805f63ffffffff1681526020015f81526020015f81526020015f81526020016060815260200160608152602001606081525090565b5b80821115611ee2575f815f905550600101611ecc565b5090565b5f815f0b9050919050565b611efa81611ee6565b82525050565b5f602082019050611f135f830184611ef1565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f819050919050565b611f3c81611f2a565b8114611f46575f5ffd5b50565b5f81359050611f5781611f33565b92915050565b5f60208284031215611f7257611f71611f22565b5b5f611f7f84828501611f49565b91505092915050565b5f67ffffffffffffffff82169050919050565b611fa481611f88565b8114611fae575f5ffd5b50565b5f81359050611fbf81611f9b565b92915050565b611fce81611ee6565b8114611fd8575f5ffd5b50565b5f81359050611fe981611fc5565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61201882611fef565b9050919050565b6120288161200e565b8114612032575f5ffd5b50565b5f813590506120438161201f565b92915050565b5f819050919050565b61205b81612049565b8114612065575f5ffd5b50565b5f8135905061207681612052565b92915050565b5f5f5f5f6080858703121561209457612093611f22565b5b5f6120a187828801611fb1565b94505060206120b287828801611fdb565b93505060406120c387828801612035565b92505060606120d487828801612068565b91505092959194509250565b6120e981612049565b82525050565b6120f881611f88565b82525050565b606082015f8201516121125f8501826120e0565b50602082015161212560208501826120ef565b50604082015161213860408501826120ef565b50505050565b5f6060820190506121515f8301846120fe565b92915050565b6121608161200e565b82525050565b5f6020820190506121795f830184612157565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6121b38161217f565b82525050565b5f6020820190506121cc5f8301846121aa565b92915050565b6121db81612049565b82525050565b5f6020820190506121f45f8301846121d2565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261221b5761221a6121fa565b5b8235905067ffffffffffffffff811115612238576122376121fe565b5b60208301915083600182028301111561225457612253612202565b5b9250929050565b5f5f6020838503121561227157612270611f22565b5b5f83013567ffffffffffffffff81111561228e5761228d611f26565b5b61229a85828601612206565b92509250509250929050565b5f6040820190506122b95f8301856121d2565b6122c66020830184612157565b9392505050565b5f602082840312156122e2576122e1611f22565b5b5f6122ef84828501612035565b91505092915050565b5f8115159050919050565b61230c816122f8565b82525050565b602082015f8201516123265f850182612303565b50505050565b5f60208201905061233f5f830184612312565b92915050565b5f63ffffffff82169050919050565b61235d81612345565b82525050565b61236c81611f2a565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6123b482612372565b6123be818561237c565b93506123ce81856020860161238c565b6123d78161239a565b840191505092915050565b5f60e083015f8301516123f75f860182612354565b50602083015161240a6020860182612363565b50604083015161241d60408601826120e0565b50606083015161243060608601826120e0565b506080830151848203608086015261244882826123aa565b91505060a083015184820360a086015261246282826123aa565b91505060c083015184820360c086015261247c82826123aa565b9150508091505092915050565b5f6040820190508181035f8301526124a181856123e2565b90506124b060208301846121d2565b9392505050565b5f5f604083850312156124cd576124cc611f22565b5b5f6124da85828601612035565b92505060206124eb85828601611fb1565b9150509250929050565b606082015f8201516125095f8501826120ef565b50602082015161251c60208501826120ef565b50604082015161252f60408501826120ef565b50505050565b5f6060820190506125485f8301846124f5565b92915050565b61255781611f88565b82525050565b5f6020820190506125705f83018461254e565b92915050565b5f5f5f5f5f5f5f60a0888a03121561259157612590611f22565b5b5f61259e8a828b01612035565b97505060206125af8a828b01611f49565b965050604088013567ffffffffffffffff8111156125d0576125cf611f26565b5b6125dc8a828b01612206565b955095505060606125ef8a828b01612035565b935050608088013567ffffffffffffffff8111156126105761260f611f26565b5b61261c8a828b01612206565b925092505092959891949750929550565b5f5f6040838503121561264357612642611f22565b5b5f61265085828601612035565b925050602061266185828601612068565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806126af57607f821691505b6020821081036126c2576126c161266b565b5b50919050565b6126d181611f2a565b82525050565b5f6020820190506126ea5f8301846126c8565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61272782612049565b915061273283612049565b925082820190508082111561274a576127496126f0565b5b92915050565b604082015f8201516127645f8501826120e0565b50602082015161277760208501826120e0565b50505050565b5f6080820190508181035f83015261279581866123e2565b90506127a46020830185612750565b6127b16060830184612157565b949350505050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6127f38261239a565b810181811067ffffffffffffffff82111715612812576128116127bd565b5b80604052505050565b5f612824611f19565b905061283082826127ea565b919050565b5f8151905061284381611f33565b92915050565b5f8151905061285781611f9b565b92915050565b5f8151905061286b81612052565b92915050565b5f60408284031215612886576128856127b9565b5b612890604061281b565b90505f61289f8482850161285d565b5f8301525060206128b28482850161285d565b60208301525092915050565b5f608082840312156128d3576128d26127b9565b5b6128dd606061281b565b90505f6128ec84828501612835565b5f8301525060206128ff84828501612849565b602083015250604061291384828501612871565b60408301525092915050565b5f60408284031215612934576129336127b9565b5b61293e604061281b565b90505f61294d8482850161285d565b5f8301525060206129608482850161285d565b60208301525092915050565b5f5f60c0838503121561298257612981611f22565b5b5f61298f858286016128be565b92505060806129a08582860161291f565b9150509250929050565b5f6129b482611fef565b9050919050565b6129c4816129aa565b81146129ce575f5ffd5b50565b5f813590506129df816129bb565b92915050565b5f5f604083850312156129fb576129fa611f22565b5b5f612a0885828601612068565b9250506020612a19858286016129d1565b9150509250929050565b5f81905092915050565b5f612a3782612372565b612a418185612a23565b9350612a5181856020860161238c565b80840191505092915050565b5f612a688284612a2d565b915081905092915050565b5f82825260208201905092915050565b7f436f726520757365722065786973747320707265636f6d70696c652063616c6c5f8201527f206661696c656400000000000000000000000000000000000000000000000000602082015250565b5f612add602783612a73565b9150612ae882612a83565b604082019050919050565b5f6020820190508181035f830152612b0a81612ad1565b9050919050565b612b1a816122f8565b8114612b24575f5ffd5b50565b5f81519050612b3581612b11565b92915050565b5f60208284031215612b5057612b4f6127b9565b5b612b5a602061281b565b90505f612b6984828501612b27565b5f8301525092915050565b5f60208284031215612b8957612b88611f22565b5b5f612b9684828501612b3b565b91505092915050565b5f604082019050612bb25f830185612157565b612bbf602083018461254e565b9392505050565b7f53706f7442616c616e636520707265636f6d70696c652063616c6c206661696c5f8201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b5f612c20602283612a73565b9150612c2b82612bc6565b604082019050919050565b5f6020820190508181035f830152612c4d81612c14565b9050919050565b5f60608284031215612c6957612c686127b9565b5b612c73606061281b565b90505f612c8284828501612849565b5f830152506020612c9584828501612849565b6020830152506040612ca984828501612849565b60408301525092915050565b5f60608284031215612cca57612cc9611f22565b5b5f612cd784828501612c54565b91505092915050565b5f604082019050612cf35f830185612157565b612d006020830184612157565b9392505050565b5f82825260208201905092915050565b5f612d2182612372565b612d2b8185612d07565b9350612d3b81856020860161238c565b612d448161239a565b840191505092915050565b5f6020820190508181035f830152612d678184612d17565b905092915050565b5f81519050612d7d8161201f565b92915050565b5f5f60408385031215612d9957612d98611f22565b5b5f612da68582860161285d565b9250506020612db785828601612d6f565b9150509250929050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302612e1d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612de2565b612e278683612de2565b95508019841693508086168417925050509392505050565b5f819050919050565b5f612e62612e5d612e5884612049565b612e3f565b612049565b9050919050565b5f819050919050565b612e7b83612e48565b612e8f612e8782612e69565b848454612dee565b825550505050565b5f5f905090565b612ea6612e97565b612eb1818484612e72565b505050565b5b81811015612ed457612ec95f82612e9e565b600181019050612eb7565b5050565b601f821115612f1957612eea81612dc1565b612ef384612dd3565b81016020851015612f02578190505b612f16612f0e85612dd3565b830182612eb6565b50505b505050565b5f82821c905092915050565b5f612f395f1984600802612f1e565b1980831691505092915050565b5f612f518383612f2a565b9150826002028217905092915050565b612f6a82612372565b67ffffffffffffffff811115612f8357612f826127bd565b5b612f8d8254612698565b612f98828285612ed8565b5f60209050601f831160018114612fc9575f8415612fb7578287015190505b612fc18582612f46565b865550613028565b601f198416612fd786612dc1565b5f5b82811015612ffe57848901518255600182019150602085019450602081019050612fd9565b8683101561301b5784890151613017601f891682612f2a565b8355505b6001600288020188555050505b505050505050565b5f6060820190506130435f8301866126c8565b61305060208301856121d2565b81810360408301526130628184612d17565b9050949350505050565b5f60408201905061307f5f8301856121d2565b61308c60208301846121d2565b9392505050565b5f6040820190506130a65f830185612157565b6130b360208301846121d2565b9392505050565b5f6130c482611ee6565b91506130cf83611ee6565b92508282026130dd81611ee6565b91508082146130ef576130ee6126f0565b5b5092915050565b5f5ffd5b5f5ffd5b5f5f85851115613111576131106130f6565b5b83861115613122576131216130fa565b5b6001850283019150848603905094509492505050565b5f82905092915050565b5f61314d8383613138565b826131588135611f2a565b92506020821015613198576131937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802612de2565b831692505b505092915050565b5f6131ab8383613138565b826131b6813561217f565b925060048210156131f6576131f17fffffffff0000000000000000000000000000000000000000000000000000000083600403600802612de2565b831692505b505092915050565b50565b5f61320c5f83612a23565b9150613217826131fe565b5f82019050919050565b5f61322b82613201565b9150819050919050565b5f8160011c9050919050565b5f5f8291508390505b600185111561328a57808604811115613266576132656126f0565b5b60018516156132755780820291505b808102905061328385613235565b945061324a565b94509492505050565b5f826132a2576001905061335d565b816132af575f905061335d565b81600181146132c557600281146132cf576132fe565b600191505061335d565b60ff8411156132e1576132e06126f0565b5b8360020a9150848211156132f8576132f76126f0565b5b5061335d565b5060208310610133831016604e8410600b84101617156133335782820a90508381111561332e5761332d6126f0565b5b61335d565b6133408484846001613241565b92509050818404811115613357576133566126f0565b5b81810290505b9392505050565b5f60ff82169050919050565b5f61337a82612049565b915061338583613364565b92506133b27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613293565b905092915050565b5f6133c482612049565b91506133cf83612049565b92508282026133dd81612049565b915082820484148315176133f4576133f36126f0565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61343282612049565b915061343d83612049565b92508261344d5761344c6133fb565b5b828204905092915050565b5f60608201905061346b5f830186612157565b613478602083018561254e565b613485604083018461254e565b949350505050565b5f819050919050565b6134a76134a28261217f565b61348d565b82525050565b5f6134b88285613496565b6004820191506134c88284612a2d565b9150819050939250505056fea2646970667358221220602ba39aa3e267d7c108a6c5d358f16007e5a9935c453d6fd7447361c3a54ba564736f6c634300081e00330000000000000000000000003073f7aaa4db83f95e9fff17424f71d4751a3073000000000000000000000000000000000000000000000000000000000000018b0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x11", + "chainId": "0x3e7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x2fee35", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x36208214698cafc6694cd01b85021c4762e67984c41da53635d3bbfbd13760c7", + "transactionIndex": "0x2", + "blockHash": "0xa4fe7ba8d5de38a6b0e23f00b7b04957ab3866c845eeb7b37d5a80da7cf9eaf9", + "blockNumber": "0x1342859", + "gasUsed": "0x2e51ad", + "effectiveGasPrice": "0x95e8a8a", + "from": "0xb2105464215716e1445367bea5668f581ef7d063", + "to": null, + "contractAddress": "0x29ec0d7e6e6ba3441bf9747f9fd37bb73b041410" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1764117799160, + "chain": 999, + "commit": "27805383a" +} \ No newline at end of file diff --git a/protocol-units/tokens/mainnet/hyperliquid/broadcast/MOVEHyperLiquidComposer.s.sol/999/run-latest.json b/protocol-units/tokens/mainnet/hyperliquid/broadcast/MOVEHyperLiquidComposer.s.sol/999/run-latest.json new file mode 100644 index 000000000..37e7aeb69 --- /dev/null +++ b/protocol-units/tokens/mainnet/hyperliquid/broadcast/MOVEHyperLiquidComposer.s.sol/999/run-latest.json @@ -0,0 +1,50 @@ +{ + "transactions": [ + { + "hash": "0x36208214698cafc6694cd01b85021c4762e67984c41da53635d3bbfbd13760c7", + "transactionType": "CREATE", + "contractName": "MOVEHyperLiquidComposer", + "contractAddress": "0x29ec0d7e6e6ba3441bf9747f9fd37bb73b041410", + "function": null, + "arguments": [ + "0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073", + "395", + "0" + ], + "transaction": { + "from": "0xb2105464215716e1445367bea5668f581ef7d063", + "gas": "0x3c36fa", + "value": "0x0", + "input": "0x6101a0604052348015610010575f5ffd5b50604051613c95380380613c9583398181016040528101906100329190610528565b82828260016100536100486103de60201b60201c565b61040760201b60201c565b5f01819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036100be576040517fc23419a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5f0b815f0b12806100f4575060125f0b815f0b135b1561015b57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60126040517f470eb46100000000000000000000000000000000000000000000000000000000815260040161015293929190610587565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16635e280f116040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101a4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101c891906105f7565b73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250505f6103e7461461024157610451610244565b60965b905073222222222222222222222222222222222222222273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050600a5f0b60e0815f0b815250508067ffffffffffffffff166101008167ffffffffffffffff168152505060a05173ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610303573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103279190610622565b73ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff16815250506103748367ffffffffffffffff1661041060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff1681525050815f0b610160815f0b815250508267ffffffffffffffff166101808167ffffffffffffffff1681525050505050505050506106b6565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005f1b905090565b5f819050919050565b5f8167ffffffffffffffff1673200000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166104519190610683565b9050919050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104858261045c565b9050919050565b6104958161047b565b811461049f575f5ffd5b50565b5f815190506104b08161048c565b92915050565b5f67ffffffffffffffff82169050919050565b6104d2816104b6565b81146104dc575f5ffd5b50565b5f815190506104ed816104c9565b92915050565b5f815f0b9050919050565b610507816104f3565b8114610511575f5ffd5b50565b5f81519050610522816104fe565b92915050565b5f5f5f6060848603121561053f5761053e610458565b5b5f61054c868287016104a2565b935050602061055d868287016104df565b925050604061056e86828701610514565b9150509250925092565b610581816104f3565b82525050565b5f60608201905061059a5f830186610578565b6105a76020830185610578565b6105b46040830184610578565b949350505050565b5f6105c68261047b565b9050919050565b6105d6816105bc565b81146105e0575f5ffd5b50565b5f815190506105f1816105cd565b92915050565b5f6020828403121561060c5761060b610458565b5b5f610619848285016105e3565b91505092915050565b5f6020828403121561063757610636610458565b5b5f610644848285016104a2565b91505092915050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61068d8261064d565b91506106988361064d565b92508282019050808211156106b0576106af610656565b5b92915050565b60805160a05160c05160e051610100516101205161014051610160516101805161350a61078b5f395f818161142c0152818161179f015261189701525f8181610e8201526117c001525f8181611408015281816117e1015261182801525f8181610ed401528181611736015261184d01525f8181610ea6015281816118c90152611a1201525f8181610a6201526118ea01525f81816109af0152818161190b015261193f01525f81816108540152818161097601528181610fa10152610fdd01525f8181610a3e0152610f05015261350a5ff3fe608060405260043610610143575f3560e01c8063a4e7f8bd116100b5578063cebb51201161006e578063cebb512014610466578063d0a1026014610490578063d3af0cc1146104ac578063f2f7141f146104d6578063f34ec5e0146104f2578063fa69dc7b1461051c5761014a565b8063a4e7f8bd14610345578063a69610d114610382578063a754403e146103be578063b20bffdc146103e8578063c37bcb4c14610412578063cc4aa2041461043c5761014a565b806320d2c9511161010757806320d2c95114610224578063574ad4a81461024e578063634d45b2146102785780636fad06f5146102b557806371139d6c146102df5780639dbfb13f146103095761014a565b806303a9437e1461014e57806319180904146101785780631cd66690146101945780631ed0993d146101d05780631f8164d9146101fa5761014a565b3661014a57005b5f5ffd5b348015610159575f5ffd5b50610162610546565b60405161016f9190611f00565b60405180910390f35b610192600480360381019061018d9190611f5d565b61054b565b005b34801561019f575f5ffd5b506101ba60048036038101906101b5919061207c565b61093c565b6040516101c7919061213e565b60405180910390f35b3480156101db575f5ffd5b506101e4610974565b6040516101f19190612166565b60405180910390f35b348015610205575f5ffd5b5061020e610998565b60405161021b91906121b9565b60405180910390f35b34801561022f575f5ffd5b506102386109a3565b60405161024591906121e1565b60405180910390f35b348015610259575f5ffd5b506102626109ad565b60405161026f9190612166565b60405180910390f35b348015610283575f5ffd5b5061029e6004803603810190610299919061225b565b6109d1565b6040516102ac9291906122a6565b60405180910390f35b3480156102c0575f5ffd5b506102c9610a3c565b6040516102d69190612166565b60405180910390f35b3480156102ea575f5ffd5b506102f3610a60565b6040516103009190611f00565b60405180910390f35b348015610314575f5ffd5b5061032f600480360381019061032a91906122cd565b610a84565b60405161033c919061232c565b60405180910390f35b348015610350575f5ffd5b5061036b60048036038101906103669190611f5d565b610b73565b604051610379929190612489565b60405180910390f35b34801561038d575f5ffd5b506103a860048036038101906103a391906124b7565b610d8e565b6040516103b59190612535565b60405180910390f35b3480156103c9575f5ffd5b506103d2610e80565b6040516103df9190611f00565b60405180910390f35b3480156103f3575f5ffd5b506103fc610ea4565b604051610409919061255d565b60405180910390f35b34801561041d575f5ffd5b50610426610ec8565b60405161043391906121e1565b60405180910390f35b348015610447575f5ffd5b50610450610ed2565b60405161045d9190612166565b60405180910390f35b348015610471575f5ffd5b5061047a610ef6565b60405161048791906121e1565b60405180910390f35b6104aa60048036038101906104a59190612576565b610efb565b005b3480156104b7575f5ffd5b506104c0611352565b6040516104cd9190611f00565b60405180910390f35b6104f060048036038101906104eb919061262d565b611376565b005b3480156104fd575f5ffd5b50610506611406565b6040516105139190612166565b60405180910390f35b348015610527575f5ffd5b5061053061142a565b60405161053d919061255d565b60405180910390f35b601281565b5f5f5f8381526020019081526020015f206040518060400160405290815f82016040518060e00160405290815f82015f9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820180546105c890612698565b80601f01602080910402602001604051908101604052809291908181526020018280546105f490612698565b801561063f5780601f106106165761010080835404028352916020019161063f565b820191905f5260205f20905b81548152906001019060200180831161062257829003601f168201915b5050505050815260200160058201805461065890612698565b80601f016020809104026020016040519081016040528092919081815260200182805461068490612698565b80156106cf5780601f106106a6576101008083540402835291602001916106cf565b820191905f5260205f20905b8154815290600101906020018083116106b257829003601f168201915b505050505081526020016006820180546106e890612698565b80601f016020809104026020016040519081016040528092919081815260200182805461071490612698565b801561075f5780601f106107365761010080835404028352916020019161075f565b820191905f5260205f20905b81548152906001019060200180831161074257829003601f168201915b505050505081525050815260200160078201548152505090505f815f01515f015163ffffffff16036107c857816040517f0b9486340000000000000000000000000000000000000000000000000000000081526004016107bf91906126d7565b60405180910390fd5b5f5f8381526020019081526020015f205f5f82015f5f82015f6101000a81549063ffffffff0219169055600182015f9055600282015f9055600382015f9055600482015f6108169190611dcd565b600582015f6108259190611dcd565b600682015f6108349190611dcd565b5050600782015f905550505f348260200151610850919061271d565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c7c7f5b382845f015160405180604001604052808681526020015f815250326040518563ffffffff1660e01b81526004016108c79392919061277d565b60c06040518083038185885af11580156108e3573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610908919061296c565b5050827fd41d02272333251e6367f747c63d5cc227dcac6b0c799067569e80a30f9da36960405160405180910390a2505050565b610944611e0a565b5f61094f8487610d8e565b5f0151905061096981868561144e9092919063ffffffff16565b915050949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b630100000660e01b81565b5f620249f0905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f5f60408484905014610a1e57838390506040517f2b701db1000000000000000000000000000000000000000000000000000000008152600401610a1591906121e1565b60405180910390fd5b8383810190610a2d91906129e5565b80925081935050509250929050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b610a8c611e3c565b5f5f61081073ffffffffffffffffffffffffffffffffffffffff1684604051602001610ab89190612166565b604051602081830303815290604052604051610ad49190612a5d565b5f60405180830381855afa9150503d805f8114610b0c576040519150601f19603f3d011682016040523d82523d5f602084013e610b11565b606091505b509150915081610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d90612af3565b60405180910390fd5b80806020019051810190610b6a9190612b74565b92505050919050565b5f602052805f5260405f205f91509050805f016040518060e00160405290815f82015f9054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001600182015481526020016002820154815260200160038201548152602001600482018054610be390612698565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0f90612698565b8015610c5a5780601f10610c3157610100808354040283529160200191610c5a565b820191905f5260205f20905b815481529060010190602001808311610c3d57829003601f168201915b50505050508152602001600582018054610c7390612698565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9f90612698565b8015610cea5780601f10610cc157610100808354040283529160200191610cea565b820191905f5260205f20905b815481529060010190602001808311610ccd57829003601f168201915b50505050508152602001600682018054610d0390612698565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2f90612698565b8015610d7a5780601f10610d5157610100808354040283529160200191610d7a565b820191905f5260205f20905b815481529060010190602001808311610d5d57829003601f168201915b505050505081525050908060070154905082565b610d96611e50565b5f5f61080173ffffffffffffffffffffffffffffffffffffffff168585604051602001610dc4929190612b9f565b604051602081830303815290604052604051610de09190612a5d565b5f60405180830381855afa9150503d805f8114610e18576040519150601f19603f3d011682016040523d82523d5f602084013e610e1d565b606091505b509150915081610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5990612c36565b60405180910390fd5b80806020019051810190610e769190612cb5565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f62030d40905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b604081565b610f036114f3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f88576040517f7eb966c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461103a577f0000000000000000000000000000000000000000000000000000000000000000876040517fc8b356c6000000000000000000000000000000000000000000000000000000008152600401611031929190612ce0565b60405180910390fd5b5f6110458686611515565b90505f6110528787611545565b90503073ffffffffffffffffffffffffffffffffffffffff1663634d45b2826040518263ffffffff1660e01b815260040161108d9190612d4f565b6040805180830381865afa9250505080156110c657506040513d601f19601f820116820180604052508101906110c39190612d83565b60015b611214576110d2611e8c565b6110dc88886115a7565b815f019063ffffffff16908163ffffffff16815250506110fc88886115d8565b816020018181525050828160400181815250506040518060400160405280828152602001348152505f5f8b81526020019081526020015f205f820151815f015f820151815f015f6101000a81548163ffffffff021916908363ffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040190816111929190612f61565b5060a08201518160050190816111a89190612f61565b5060c08201518160060190816111be9190612f61565b50505060208201518160070155905050887f387fc8f821460fa8221428c9f4dc1f6d5db4f6a0a01f33dbeaa8cebd95e5d1448260200151348560405161120693929190613030565b60405180910390a25061133f565b8134101561125b5734826040517f7cb769dc00000000000000000000000000000000000000000000000000000000815260040161125292919061306c565b60405180910390fd5b5f5f34116112705761126b6109a3565b611279565b611278610ec8565b5b9050805a10156112c2575a816040517f23e228cb0000000000000000000000000000000000000000000000000000000081526004016112b992919061306c565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663f2f7141f3484886040518463ffffffff1660e01b81526004016112fe929190613093565b5f604051808303818588803b158015611315575f5ffd5b505af193505050508015611327575060015b61133a576113358286611606565b61133b565b5b5050505b505061134961177f565b50505050505050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e657336040517fa19dbf000000000000000000000000000000000000000000000000000000000081526004016113dd9190612166565b60405180910390fd5b6113f08282611799565b5f34111561140257611401826118c3565b5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b611456611e0a565b5f5f5f845f0b131561147a5761146d868686611a41565b80925081935050506114b9565b6114b08686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6114ab91906130ba565b611ae5565b80925081935050505b60405180606001604052808381526020018267ffffffffffffffff1681526020018667ffffffffffffffff16815250925050509392505050565b6114fb611b69565b600261150d611508611baa565b611bd3565b5f0181905550565b5f8282600c60ff1690602c60ff1692611530939291906130fe565b9061153b9190613142565b5f1c905092915050565b60608282604c60ff1690809261155d939291906130fe565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050905092915050565b5f8282600860ff1690600c60ff16926115c2939291906130fe565b906115cd91906131a0565b60e01c905092915050565b5f8282602c60ff1690604c60ff16926115f3939291906130fe565b906115fe9190613142565b905092915050565b5f3414611728575f8273ffffffffffffffffffffffffffffffffffffffff163460405161163290613221565b5f6040518083038185875af1925050503d805f811461166c576040519150601f19603f3d011682016040523d82523d5f602084013e611671565b606091505b5050905080611726575f3273ffffffffffffffffffffffffffffffffffffffff163460405161169f90613221565b5f6040518083038185875af1925050503d805f81146116d9576040519150601f19603f3d011682016040523d82523d5f602084013e6116de565b606091505b505090508061172457346040517f77479d3200000000000000000000000000000000000000000000000000000000815260040161171b91906121e1565b60405180910390fd5b505b505b5f811461177b5761177a82827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611bdc9092919063ffffffff16565b5b5050565b600161179161178c611baa565b611bd3565b5f0181905550565b5f6118067f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008561093c565b90505f815f0151146118be575f611821848360200151611c2f565b90506118917f0000000000000000000000000000000000000000000000000000000000000000835f01517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611bdc9092919063ffffffff16565b6118bc847f000000000000000000000000000000000000000000000000000000000000000083611c7b565b505b505050565b5f6119307f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000003461093c565b90505f815f015114611a3d575f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16825f015160405161198490613221565b5f6040518083038185875af1925050503d805f81146119be576040519150601f19603f3d011682016040523d82523d5f602084013e6119c3565b606091505b5050905080611a0c57815f01516040517f77479d32000000000000000000000000000000000000000000000000000000008152600401611a0391906121e1565b60405180910390fd5b611a3b837f00000000000000000000000000000000000000000000000000000000000000008460200151611c7b565b505b5050565b5f5f5f83600a611a519190613370565b90505f818667ffffffffffffffff16611a6a91906133ba565b9050818781611a7c57611a7b6133fb565b5b068703935080841115611ac85783816040517f9a0c830f000000000000000000000000000000000000000000000000000000008152600401611abf92919061306c565b60405180910390fd5b818481611ad857611ad76133fb565b5b0492505050935093915050565b5f5f5f83600a611af59190613370565b90505f818667ffffffffffffffff16611b0e9190613428565b905086935080871115611b5a5783816040517f9a0c830f000000000000000000000000000000000000000000000000000000008152600401611b5192919061306c565b60405180910390fd5b81840292505050935093915050565b611b71611d4f565b15611ba8576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005f1b905090565b5f819050919050565b611be98383836001611d6b565b611c2a57826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611c219190612166565b60405180910390fd5b505050565b5f611c3983610a84565b5f0151611c72576040517fbdcf14ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81905092915050565b5f838383604051602001611c9193929190613458565b60405160208183030381529060405290505f630100000660e01b82604051602001611cbd9291906134ad565b604051602081830303815290604052905073333333333333333333333333333333333333333373ffffffffffffffffffffffffffffffffffffffff166317938e13826040518263ffffffff1660e01b8152600401611d1b9190612d4f565b5f604051808303815f87803b158015611d32575f5ffd5b505af1158015611d44573d5f5f3e3d5ffd5b505050505050505050565b5f6002611d62611d5d611baa565b611bd3565b5f015414905090565b5f5f63a9059cbb60e01b9050604051815f525f1960601c86166004528460245260205f60445f5f8b5af1925060015f51148316611dbf578383151615611db3573d5f823e3d81fd5b5f873b113d1516831692505b806040525050949350505050565b508054611dd990612698565b5f825580601f10611dea5750611e07565b601f0160209004905f5260205f2090810190611e069190611ecb565b5b50565b60405180606001604052805f81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681525090565b60405180602001604052805f151581525090565b60405180606001604052805f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681525090565b6040518060e001604052805f63ffffffff1681526020015f81526020015f81526020015f81526020016060815260200160608152602001606081525090565b5b80821115611ee2575f815f905550600101611ecc565b5090565b5f815f0b9050919050565b611efa81611ee6565b82525050565b5f602082019050611f135f830184611ef1565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f819050919050565b611f3c81611f2a565b8114611f46575f5ffd5b50565b5f81359050611f5781611f33565b92915050565b5f60208284031215611f7257611f71611f22565b5b5f611f7f84828501611f49565b91505092915050565b5f67ffffffffffffffff82169050919050565b611fa481611f88565b8114611fae575f5ffd5b50565b5f81359050611fbf81611f9b565b92915050565b611fce81611ee6565b8114611fd8575f5ffd5b50565b5f81359050611fe981611fc5565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61201882611fef565b9050919050565b6120288161200e565b8114612032575f5ffd5b50565b5f813590506120438161201f565b92915050565b5f819050919050565b61205b81612049565b8114612065575f5ffd5b50565b5f8135905061207681612052565b92915050565b5f5f5f5f6080858703121561209457612093611f22565b5b5f6120a187828801611fb1565b94505060206120b287828801611fdb565b93505060406120c387828801612035565b92505060606120d487828801612068565b91505092959194509250565b6120e981612049565b82525050565b6120f881611f88565b82525050565b606082015f8201516121125f8501826120e0565b50602082015161212560208501826120ef565b50604082015161213860408501826120ef565b50505050565b5f6060820190506121515f8301846120fe565b92915050565b6121608161200e565b82525050565b5f6020820190506121795f830184612157565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6121b38161217f565b82525050565b5f6020820190506121cc5f8301846121aa565b92915050565b6121db81612049565b82525050565b5f6020820190506121f45f8301846121d2565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261221b5761221a6121fa565b5b8235905067ffffffffffffffff811115612238576122376121fe565b5b60208301915083600182028301111561225457612253612202565b5b9250929050565b5f5f6020838503121561227157612270611f22565b5b5f83013567ffffffffffffffff81111561228e5761228d611f26565b5b61229a85828601612206565b92509250509250929050565b5f6040820190506122b95f8301856121d2565b6122c66020830184612157565b9392505050565b5f602082840312156122e2576122e1611f22565b5b5f6122ef84828501612035565b91505092915050565b5f8115159050919050565b61230c816122f8565b82525050565b602082015f8201516123265f850182612303565b50505050565b5f60208201905061233f5f830184612312565b92915050565b5f63ffffffff82169050919050565b61235d81612345565b82525050565b61236c81611f2a565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6123b482612372565b6123be818561237c565b93506123ce81856020860161238c565b6123d78161239a565b840191505092915050565b5f60e083015f8301516123f75f860182612354565b50602083015161240a6020860182612363565b50604083015161241d60408601826120e0565b50606083015161243060608601826120e0565b506080830151848203608086015261244882826123aa565b91505060a083015184820360a086015261246282826123aa565b91505060c083015184820360c086015261247c82826123aa565b9150508091505092915050565b5f6040820190508181035f8301526124a181856123e2565b90506124b060208301846121d2565b9392505050565b5f5f604083850312156124cd576124cc611f22565b5b5f6124da85828601612035565b92505060206124eb85828601611fb1565b9150509250929050565b606082015f8201516125095f8501826120ef565b50602082015161251c60208501826120ef565b50604082015161252f60408501826120ef565b50505050565b5f6060820190506125485f8301846124f5565b92915050565b61255781611f88565b82525050565b5f6020820190506125705f83018461254e565b92915050565b5f5f5f5f5f5f5f60a0888a03121561259157612590611f22565b5b5f61259e8a828b01612035565b97505060206125af8a828b01611f49565b965050604088013567ffffffffffffffff8111156125d0576125cf611f26565b5b6125dc8a828b01612206565b955095505060606125ef8a828b01612035565b935050608088013567ffffffffffffffff8111156126105761260f611f26565b5b61261c8a828b01612206565b925092505092959891949750929550565b5f5f6040838503121561264357612642611f22565b5b5f61265085828601612035565b925050602061266185828601612068565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806126af57607f821691505b6020821081036126c2576126c161266b565b5b50919050565b6126d181611f2a565b82525050565b5f6020820190506126ea5f8301846126c8565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61272782612049565b915061273283612049565b925082820190508082111561274a576127496126f0565b5b92915050565b604082015f8201516127645f8501826120e0565b50602082015161277760208501826120e0565b50505050565b5f6080820190508181035f83015261279581866123e2565b90506127a46020830185612750565b6127b16060830184612157565b949350505050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6127f38261239a565b810181811067ffffffffffffffff82111715612812576128116127bd565b5b80604052505050565b5f612824611f19565b905061283082826127ea565b919050565b5f8151905061284381611f33565b92915050565b5f8151905061285781611f9b565b92915050565b5f8151905061286b81612052565b92915050565b5f60408284031215612886576128856127b9565b5b612890604061281b565b90505f61289f8482850161285d565b5f8301525060206128b28482850161285d565b60208301525092915050565b5f608082840312156128d3576128d26127b9565b5b6128dd606061281b565b90505f6128ec84828501612835565b5f8301525060206128ff84828501612849565b602083015250604061291384828501612871565b60408301525092915050565b5f60408284031215612934576129336127b9565b5b61293e604061281b565b90505f61294d8482850161285d565b5f8301525060206129608482850161285d565b60208301525092915050565b5f5f60c0838503121561298257612981611f22565b5b5f61298f858286016128be565b92505060806129a08582860161291f565b9150509250929050565b5f6129b482611fef565b9050919050565b6129c4816129aa565b81146129ce575f5ffd5b50565b5f813590506129df816129bb565b92915050565b5f5f604083850312156129fb576129fa611f22565b5b5f612a0885828601612068565b9250506020612a19858286016129d1565b9150509250929050565b5f81905092915050565b5f612a3782612372565b612a418185612a23565b9350612a5181856020860161238c565b80840191505092915050565b5f612a688284612a2d565b915081905092915050565b5f82825260208201905092915050565b7f436f726520757365722065786973747320707265636f6d70696c652063616c6c5f8201527f206661696c656400000000000000000000000000000000000000000000000000602082015250565b5f612add602783612a73565b9150612ae882612a83565b604082019050919050565b5f6020820190508181035f830152612b0a81612ad1565b9050919050565b612b1a816122f8565b8114612b24575f5ffd5b50565b5f81519050612b3581612b11565b92915050565b5f60208284031215612b5057612b4f6127b9565b5b612b5a602061281b565b90505f612b6984828501612b27565b5f8301525092915050565b5f60208284031215612b8957612b88611f22565b5b5f612b9684828501612b3b565b91505092915050565b5f604082019050612bb25f830185612157565b612bbf602083018461254e565b9392505050565b7f53706f7442616c616e636520707265636f6d70696c652063616c6c206661696c5f8201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b5f612c20602283612a73565b9150612c2b82612bc6565b604082019050919050565b5f6020820190508181035f830152612c4d81612c14565b9050919050565b5f60608284031215612c6957612c686127b9565b5b612c73606061281b565b90505f612c8284828501612849565b5f830152506020612c9584828501612849565b6020830152506040612ca984828501612849565b60408301525092915050565b5f60608284031215612cca57612cc9611f22565b5b5f612cd784828501612c54565b91505092915050565b5f604082019050612cf35f830185612157565b612d006020830184612157565b9392505050565b5f82825260208201905092915050565b5f612d2182612372565b612d2b8185612d07565b9350612d3b81856020860161238c565b612d448161239a565b840191505092915050565b5f6020820190508181035f830152612d678184612d17565b905092915050565b5f81519050612d7d8161201f565b92915050565b5f5f60408385031215612d9957612d98611f22565b5b5f612da68582860161285d565b9250506020612db785828601612d6f565b9150509250929050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302612e1d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612de2565b612e278683612de2565b95508019841693508086168417925050509392505050565b5f819050919050565b5f612e62612e5d612e5884612049565b612e3f565b612049565b9050919050565b5f819050919050565b612e7b83612e48565b612e8f612e8782612e69565b848454612dee565b825550505050565b5f5f905090565b612ea6612e97565b612eb1818484612e72565b505050565b5b81811015612ed457612ec95f82612e9e565b600181019050612eb7565b5050565b601f821115612f1957612eea81612dc1565b612ef384612dd3565b81016020851015612f02578190505b612f16612f0e85612dd3565b830182612eb6565b50505b505050565b5f82821c905092915050565b5f612f395f1984600802612f1e565b1980831691505092915050565b5f612f518383612f2a565b9150826002028217905092915050565b612f6a82612372565b67ffffffffffffffff811115612f8357612f826127bd565b5b612f8d8254612698565b612f98828285612ed8565b5f60209050601f831160018114612fc9575f8415612fb7578287015190505b612fc18582612f46565b865550613028565b601f198416612fd786612dc1565b5f5b82811015612ffe57848901518255600182019150602085019450602081019050612fd9565b8683101561301b5784890151613017601f891682612f2a565b8355505b6001600288020188555050505b505050505050565b5f6060820190506130435f8301866126c8565b61305060208301856121d2565b81810360408301526130628184612d17565b9050949350505050565b5f60408201905061307f5f8301856121d2565b61308c60208301846121d2565b9392505050565b5f6040820190506130a65f830185612157565b6130b360208301846121d2565b9392505050565b5f6130c482611ee6565b91506130cf83611ee6565b92508282026130dd81611ee6565b91508082146130ef576130ee6126f0565b5b5092915050565b5f5ffd5b5f5ffd5b5f5f85851115613111576131106130f6565b5b83861115613122576131216130fa565b5b6001850283019150848603905094509492505050565b5f82905092915050565b5f61314d8383613138565b826131588135611f2a565b92506020821015613198576131937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802612de2565b831692505b505092915050565b5f6131ab8383613138565b826131b6813561217f565b925060048210156131f6576131f17fffffffff0000000000000000000000000000000000000000000000000000000083600403600802612de2565b831692505b505092915050565b50565b5f61320c5f83612a23565b9150613217826131fe565b5f82019050919050565b5f61322b82613201565b9150819050919050565b5f8160011c9050919050565b5f5f8291508390505b600185111561328a57808604811115613266576132656126f0565b5b60018516156132755780820291505b808102905061328385613235565b945061324a565b94509492505050565b5f826132a2576001905061335d565b816132af575f905061335d565b81600181146132c557600281146132cf576132fe565b600191505061335d565b60ff8411156132e1576132e06126f0565b5b8360020a9150848211156132f8576132f76126f0565b5b5061335d565b5060208310610133831016604e8410600b84101617156133335782820a90508381111561332e5761332d6126f0565b5b61335d565b6133408484846001613241565b92509050818404811115613357576133566126f0565b5b81810290505b9392505050565b5f60ff82169050919050565b5f61337a82612049565b915061338583613364565b92506133b27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613293565b905092915050565b5f6133c482612049565b91506133cf83612049565b92508282026133dd81612049565b915082820484148315176133f4576133f36126f0565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61343282612049565b915061343d83612049565b92508261344d5761344c6133fb565b5b828204905092915050565b5f60608201905061346b5f830186612157565b613478602083018561254e565b613485604083018461254e565b949350505050565b5f819050919050565b6134a76134a28261217f565b61348d565b82525050565b5f6134b88285613496565b6004820191506134c88284612a2d565b9150819050939250505056fea2646970667358221220602ba39aa3e267d7c108a6c5d358f16007e5a9935c453d6fd7447361c3a54ba564736f6c634300081e00330000000000000000000000003073f7aaa4db83f95e9fff17424f71d4751a3073000000000000000000000000000000000000000000000000000000000000018b0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x11", + "chainId": "0x3e7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x2fee35", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x36208214698cafc6694cd01b85021c4762e67984c41da53635d3bbfbd13760c7", + "transactionIndex": "0x2", + "blockHash": "0xa4fe7ba8d5de38a6b0e23f00b7b04957ab3866c845eeb7b37d5a80da7cf9eaf9", + "blockNumber": "0x1342859", + "gasUsed": "0x2e51ad", + "effectiveGasPrice": "0x95e8a8a", + "from": "0xb2105464215716e1445367bea5668f581ef7d063", + "to": null, + "contractAddress": "0x29ec0d7e6e6ba3441bf9747f9fd37bb73b041410" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1764117799160, + "chain": 999, + "commit": "27805383a" +} \ No newline at end of file diff --git a/protocol-units/tokens/mainnet/hyperliquid/foundry.lock b/protocol-units/tokens/mainnet/hyperliquid/foundry.lock new file mode 100644 index 000000000..9db731349 --- /dev/null +++ b/protocol-units/tokens/mainnet/hyperliquid/foundry.lock @@ -0,0 +1,41 @@ +{ + "../../../settlement/mcr/contracts/lib/LayerZero-v2": { + "rev": "63bbd31584c588844de33678bf8dd61d879cba14" + }, + "../../../settlement/mcr/contracts/lib/devtools": { + "rev": "f8294091589fe3f24f5e24282f5dce93d1028807" + }, + "../../../settlement/mcr/contracts/lib/forge-std": { + "rev": "1714bee72e286e73f76e320d110e0eaf5c4e649d" + }, + "../../../settlement/mcr/contracts/lib/murky": { + "rev": "5feccd1253d7da820f7cccccdedf64471025455d" + }, + "../../../settlement/mcr/contracts/lib/openzeppelin-contracts": { + "rev": "c64a1edb67b6e3f4a15cca8909c9482ad33a02b0" + }, + "../../../settlement/mcr/contracts/lib/openzeppelin-contracts-upgradeable": { + "rev": "723f8cab09cdae1aca9ec9cc1cfa040c2d4b06c1" + }, + "../../../settlement/mcr/contracts/lib/openzeppelin-foundry-upgrades": { + "rev": "4cd15fc50b141c77d8cc9ff8efb44d00e841a299" + }, + "../../../settlement/mcr/contracts/lib/safe-smart-account": { + "rev": "bf943f80fec5ac647159d26161446ac5d716a294" + }, + "../../../settlement/mcr/contracts/lib/solidity-bytes-utils": { + "rev": "fc502455bb2a7e26a743378df042612dd50d1eb9" + }, + "../../../settlement/mcr/contracts/lib/solmate": { + "rev": "97bdb2003b70382996a79a406813f76417b1cf90" + }, + "../../../settlement/mcr/contracts/lib/v2-periphery": { + "rev": "0335e8f7e1bd1e8d8329fd300aea2ef2f36dd19f" + }, + "lib/forge-std": { + "tag": { + "name": "v1.11.0", + "rev": "8e40513d678f392f398620b3ef2b418648b33e89" + } + } +} \ No newline at end of file diff --git a/protocol-units/tokens/mainnet/hyperliquid/foundry.toml b/protocol-units/tokens/mainnet/hyperliquid/foundry.toml new file mode 100644 index 000000000..25b918f9c --- /dev/null +++ b/protocol-units/tokens/mainnet/hyperliquid/foundry.toml @@ -0,0 +1,6 @@ +[profile.default] +src = "src" +out = "out" +libs = ["lib"] + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/protocol-units/tokens/mainnet/hyperliquid/remappings.txt b/protocol-units/tokens/mainnet/hyperliquid/remappings.txt new file mode 100644 index 000000000..8a3a86c6c --- /dev/null +++ b/protocol-units/tokens/mainnet/hyperliquid/remappings.txt @@ -0,0 +1,8 @@ +devtools/=lib/devtools/packages/toolbox-foundry/src/ +forge-std/=lib/forge-std/src/ +@layerzerolabs/hyperliquid-composer/=lib/devtools/packages/hyperliquid-composer/ +@layerzerolabs/oft/=lib/devtools/packages/oft-evm/ +@layerzerolabs/oft-evm/=lib/devtools/packages/oft-evm/ +@layerzerolabs/oapp-evm/=lib/devtools/packages/oapp-evm/ +@layerzerolabs/lz-evm-protocol-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/ +@openzeppelin/=lib/openzeppelin-contracts/ \ No newline at end of file diff --git a/protocol-units/tokens/mainnet/hyperliquid/script/MOVEHyperLiquidComposer.s.sol b/protocol-units/tokens/mainnet/hyperliquid/script/MOVEHyperLiquidComposer.s.sol new file mode 100644 index 000000000..b8b797c65 --- /dev/null +++ b/protocol-units/tokens/mainnet/hyperliquid/script/MOVEHyperLiquidComposer.s.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "../src/MOVEHyperLiquidComposer.sol"; +import "forge-std/Script.sol"; + +contract MOVEHyperLiquidComposerDeployer is Script { + MOVEHyperLiquidComposer public hyperLiquidComposer; + + event Deployed(address indexed contractAddress); + + function run() public { + vm.startBroadcast(); + hyperLiquidComposer = new MOVEHyperLiquidComposer(0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073,395,0); + vm.stopBroadcast(); + } +} \ No newline at end of file diff --git a/protocol-units/tokens/mainnet/hyperliquid/src/MOVEHyperLiquidComposer.sol b/protocol-units/tokens/mainnet/hyperliquid/src/MOVEHyperLiquidComposer.sol new file mode 100644 index 000000000..d2a881422 --- /dev/null +++ b/protocol-units/tokens/mainnet/hyperliquid/src/MOVEHyperLiquidComposer.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.22; + +import { HyperLiquidComposer } from "@layerzerolabs/hyperliquid-composer/contracts/HyperLiquidComposer.sol"; + +/// @dev This contract is a composer that allows transfers of ERC20 and HYPE tokens to a target address on hypercore. +/// +/// @dev This contract does NOT refund dust because we do not expect any due to truncation of sharedDecimals. +/// In the off-chance that you have dust you would have to implement dust refunds to the receiver in: +/// `_transferERC20ToHyperCore` and `_transferNativeToHyperCore` +contract MOVEHyperLiquidComposer is HyperLiquidComposer { + /// @notice Constructor for the HyperLiquidComposer + /// + /// @param _oft The address of the OFT + /// @param _hlIndexId The HyperLiquid core spot's index value + /// @param _assetDecimalDiff The difference in decimals between the HyperEVM's ERC20 and the HyperLiquid HIP-1 token + constructor( + address _oft, + uint64 _hlIndexId, + int8 _assetDecimalDiff + ) HyperLiquidComposer(_oft, _hlIndexId, _assetDecimalDiff) {} +} \ No newline at end of file diff --git a/protocol-units/tokens/mainnet/hyperliquid/test/Composer.t.sol b/protocol-units/tokens/mainnet/hyperliquid/test/Composer.t.sol new file mode 100644 index 000000000..7f2eed95c --- /dev/null +++ b/protocol-units/tokens/mainnet/hyperliquid/test/Composer.t.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import { Test } from "forge-std/Test.sol"; +import { MOVEHyperLiquidComposer } from "../src/MOVEHyperLiquidComposer.sol"; +import { IOFT } from "@layerzerolabs/oft/contracts/interfaces/IOFT.sol"; + +contract MOVEHyperLiquidComposerToken3073Test is Test { + // OFT / token on Hyperliquid mainnet + address internal constant MOVE = + 0x3073f7aAA4DB83f95e9FFf17424F71D4751a3073; + + // Expected native config on mainnet + address internal constant EXPECTED_NATIVE_ASSET_BRIDGE = + 0x2222222222222222222222222222222222222222; + uint64 internal constant EXPECTED_NATIVE_CORE_INDEX_ID_MAINNET = 150; + int8 internal constant EXPECTED_NATIVE_DECIMAL_DIFF = 10; + + // Expected ERC20 / OFT config for 0x3073... + uint64 internal constant EXPECTED_ERC20_CORE_INDEX_ID = 395; + int8 internal constant EXPECTED_ERC20_DECIMAL_DIFF = 0; + + function setUp() public { + // Explicitly simulate Hyperliquid mainnet environment + // (use the chainId your contracts use to branch mainnet/testnet logic) + vm.chainId(999); + } + + function test_config_for_token3073_on_mainnet() public { + // Wrap the already-deployed OFT with the IOFT interface (no new OFT deployment) + IOFT oft = IOFT(MOVE); + + // Deploy a fresh composer for this OFT with the expected config + MOVEHyperLiquidComposer composer = new MOVEHyperLiquidComposer( + MOVE, + EXPECTED_ERC20_CORE_INDEX_ID, + EXPECTED_ERC20_DECIMAL_DIFF + ); + + // + // --- Native configuration checks (mainnet branch) --- + // + assertEq( + composer.NATIVE_ASSET_BRIDGE(), + EXPECTED_NATIVE_ASSET_BRIDGE, + "wrong native asset bridge" + ); + + assertEq( + composer.NATIVE_CORE_INDEX_ID(), + EXPECTED_NATIVE_CORE_INDEX_ID_MAINNET, + "wrong native core index id for mainnet" + ); + + assertEq( + composer.NATIVE_DECIMAL_DIFF(), + EXPECTED_NATIVE_DECIMAL_DIFF, + "wrong native decimal diff" + ); + + // + // --- ERC20 / OFT configuration checks for 0x3073... --- + // + // If ERC20_ASSET_BRIDGE is expected to be the OFT/token address, this enforces it. + assertEq( + composer.ERC20_ASSET_BRIDGE(), + MOVE, + "wrong ERC20 asset bridge (should be token 0x3073...)" + ); + + assertEq( + composer.ERC20_CORE_INDEX_ID(), + EXPECTED_ERC20_CORE_INDEX_ID, + "wrong ERC20 core index id for token 0x3073..." + ); + + assertEq( + composer.ERC20_DECIMAL_DIFF(), + EXPECTED_ERC20_DECIMAL_DIFF, + "wrong ERC20 decimal diff for token 0x3073..." + ); + } +} diff --git a/protocol-units/tokens/mock/testnet/suzuka/aptos/Move.toml b/protocol-units/tokens/mock/testnet/suzuka/aptos/Move.toml index 16972532b..abaeb0b52 100644 --- a/protocol-units/tokens/mock/testnet/suzuka/aptos/Move.toml +++ b/protocol-units/tokens/mock/testnet/suzuka/aptos/Move.toml @@ -4,13 +4,13 @@ version = "1.0.0" authors = [] [addresses] -mock="0x275f508689de8756169d1ee02d889c777de1cebda3a7bbcce63ba8a27c563c6f" +mock="_" [dev-addresses] [dependencies.AptosFramework] -git = "https://github.com/aptos-labs/aptos-core.git" -rev = "mainnet" +git = "https://github.com/movementlabsxyz/aptos-core.git" +rev = "movement-mainnet" subdir = "aptos-move/framework/aptos-framework" [dev-dependencies] diff --git a/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/faucet.move b/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/faucet.move index 421cc3430..9e2969f4f 100644 --- a/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/faucet.move +++ b/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/faucet.move @@ -1,129 +1,393 @@ -/// Basic faucet, allows to request coins between intervals. +/// Basic faucet, allows to request fungible assets between intervals. module mock::faucet { use std::signer; use aptos_framework::timestamp; - use aptos_framework::coin::{Self, Coin}; + use aptos_framework::fungible_asset::{Self, Metadata, FungibleStore}; + use aptos_framework::primary_fungible_store; + use aptos_framework::object::{Self, Object, ExtendRef}; + use aptos_framework::simple_map::{Self, SimpleMap}; + /// Faucet already exists for this asset const ERR_FAUCET_EXISTS: u64 = 100; + /// Faucet does not exist for this asset const ERR_FAUCET_NOT_EXISTS: u64 = 101; + /// Account is restricted and must wait before next request const ERR_RESTRICTED: u64 = 102; - struct Faucet has key { - deposit: Coin, + struct FaucetRegistry has key { + faucets: SimpleMap + } + + struct FaucetData has store { + store: Object, + extend_ref: ExtendRef, per_request: u64, - period: u64, + period: u64 } - struct Restricted has key { - since: u64, + struct Restricted has key { + restrictions: SimpleMap // metadata address -> timestamp } - - public fun create_faucet_internal(account: &signer, deposit: Coin, per_request: u64, period: u64) { + + public fun create_faucet_internal( + account: &signer, + metadata: Object, + amount_to_deposit: u64, + per_request: u64, + period: u64 + ) acquires FaucetRegistry { let account_addr = signer::address_of(account); + let metadata_addr = object::object_address(&metadata); + + // Initialize registry if it doesn't exist + if (!exists(account_addr)) { + move_to(account, FaucetRegistry { + faucets: simple_map::create() + }); + }; + + let registry = borrow_global_mut(account_addr); - assert!(!exists>(account_addr), ERR_FAUCET_EXISTS); + assert!( + !simple_map::contains_key(®istry.faucets, &metadata_addr), + ERR_FAUCET_EXISTS + ); - move_to(account, Faucet { - deposit, + // Create a named object to hold the faucet store + let constructor_ref = &object::create_object(account_addr); + let extend_ref = object::generate_extend_ref(constructor_ref); + let store = fungible_asset::create_store(constructor_ref, metadata); + + // Transfer initial deposit to the faucet store + let fa = primary_fungible_store::withdraw(account, metadata, amount_to_deposit); + fungible_asset::deposit(store, fa); + + simple_map::add(&mut registry.faucets, metadata_addr, FaucetData { + store, + extend_ref, per_request, period }); } - public fun change_settings_internal(account: &signer, per_request: u64, period: u64) acquires Faucet { + public fun change_settings_internal( + account: &signer, + metadata: Object, + per_request: u64, + period: u64 + ) acquires FaucetRegistry { let account_addr = signer::address_of(account); + let metadata_addr = object::object_address(&metadata); + + assert!( + exists(account_addr), + ERR_FAUCET_NOT_EXISTS + ); - assert!(exists>(account_addr), ERR_FAUCET_NOT_EXISTS); + let registry = borrow_global_mut(account_addr); - let faucet = borrow_global_mut>(account_addr); - faucet.per_request = per_request; - faucet.period = period; + assert!( + simple_map::contains_key(®istry.faucets, &metadata_addr), + ERR_FAUCET_NOT_EXISTS + ); + + let faucet_data = simple_map::borrow_mut(&mut registry.faucets, &metadata_addr); + faucet_data.per_request = per_request; + faucet_data.period = period; } - /// Deposist more coins `CoinType` to faucet. - public fun deposit_internal(faucet_addr: address, deposit: Coin) acquires Faucet { - assert!(exists>(faucet_addr), ERR_FAUCET_NOT_EXISTS); + /// Deposit more assets to faucet. + public fun deposit_internal( + faucet_addr: address, + metadata: Object, + amount: u64 + ) acquires FaucetRegistry { + let metadata_addr = object::object_address(&metadata); + + assert!( + exists(faucet_addr), + ERR_FAUCET_NOT_EXISTS + ); + + let registry = borrow_global(faucet_addr); + + assert!( + simple_map::contains_key(®istry.faucets, &metadata_addr), + ERR_FAUCET_NOT_EXISTS + ); - let faucet = borrow_global_mut>(faucet_addr); - coin::merge(&mut faucet.deposit, deposit); + let faucet_data = simple_map::borrow(®istry.faucets, &metadata_addr); + + // Create a signer for the faucet object to receive deposits + let faucet_signer = &object::generate_signer_for_extending(&faucet_data.extend_ref); + let fa = primary_fungible_store::withdraw(faucet_signer, metadata, amount); + fungible_asset::deposit(faucet_data.store, fa); } - public fun request_internal(account: &signer, faucet_addr: address): Coin acquires Faucet, Restricted { + public fun request_internal( + account: &signer, + faucet_addr: address, + metadata: Object + ) acquires FaucetRegistry, Restricted { let account_addr = signer::address_of(account); + let metadata_addr = object::object_address(&metadata); + + assert!( + exists(faucet_addr), + ERR_FAUCET_NOT_EXISTS + ); - assert!(exists>(faucet_addr), ERR_FAUCET_NOT_EXISTS); + let registry = borrow_global(faucet_addr); - let faucet = borrow_global_mut>(faucet_addr); - let coins = coin::extract(&mut faucet.deposit, faucet.per_request); + assert!( + simple_map::contains_key(®istry.faucets, &metadata_addr), + ERR_FAUCET_NOT_EXISTS + ); + + let faucet_data = simple_map::borrow(®istry.faucets, &metadata_addr); let now = timestamp::now_seconds(); - if (exists>(account_addr)) { - let restricted = borrow_global_mut>(account_addr); - assert!(restricted.since + faucet.period <= now, ERR_RESTRICTED); - restricted.since = now; - } else { - move_to(account, Restricted { - since: now, + // Check and update restrictions + if (!exists(account_addr)) { + move_to(account, Restricted { + restrictions: simple_map::create() }); }; - coins + let restricted = borrow_global_mut(account_addr); + + if (simple_map::contains_key(&restricted.restrictions, &metadata_addr)) { + let last_request = simple_map::borrow(&restricted.restrictions, &metadata_addr); + assert!( + *last_request + faucet_data.period <= now, + ERR_RESTRICTED + ); + let last_request_mut = simple_map::borrow_mut(&mut restricted.restrictions, &metadata_addr); + *last_request_mut = now; + } else { + simple_map::add(&mut restricted.restrictions, metadata_addr, now); + }; + + // Withdraw from faucet store and deposit to requester + let faucet_signer = &object::generate_signer_for_extending(&faucet_data.extend_ref); + let fa = fungible_asset::withdraw(faucet_signer, faucet_data.store, faucet_data.per_request); + primary_fungible_store::deposit(account_addr, fa); } - public entry fun create_faucet(account: &signer, amount_to_deposit: u64, per_request: u64, period: u64) { - let coins = coin::withdraw(account, amount_to_deposit); + public entry fun create_faucet( + account: &signer, + metadata: Object, + amount_to_deposit: u64, + per_request: u64, + period: u64 + ) acquires FaucetRegistry { + create_faucet_internal(account, metadata, amount_to_deposit, per_request, period); + } - create_faucet_internal(account, coins, per_request, period); + public entry fun change_settings( + account: &signer, + metadata: Object, + per_request: u64, + period: u64 + ) acquires FaucetRegistry { + change_settings_internal(account, metadata, per_request, period); } - public entry fun change_settings(account: &signer, per_request: u64, period: u64) acquires Faucet { - change_settings_internal(account, per_request, period); + public entry fun deposit( + _account: &signer, + metadata: Object, + amount: u64 + ) acquires FaucetRegistry { + deposit_internal(@mock, metadata, amount); } - public entry fun deposit(account: &signer, amount: u64) acquires Faucet { - let coins = coin::withdraw(account, amount); + /// "Mints" (requests) fungible assets from the faucet. + public entry fun mint( + account: &signer, + metadata: Object + ) acquires FaucetRegistry, Restricted { + request_internal(account, @mock, metadata); + } - deposit_internal(@mock, coins); + public entry fun mintAll( + account: &signer, + metadata1: Object, + metadata2: Object, + metadata3: Object, + metadata4: Object + ) acquires FaucetRegistry, Restricted { + request_internal(account, @mock, metadata1); + request_internal(account, @mock, metadata2); + request_internal(account, @mock, metadata3); + request_internal(account, @mock, metadata4); } - /// "Mints" coins of `CoinType` to `account` address. - public entry fun mint(account: &signer) acquires Faucet, Restricted { - let account_addr = signer::address_of(account); + #[test_only] + use aptos_framework::account; + #[test_only] + use std::string::utf8; + #[test_only] + use std::option; - if (!coin::is_account_registered(account_addr)) { - coin::register(account); - }; + #[test_only] + fun setup_test_token(admin: &signer): Object { + // Create a test fungible asset + let constructor_ref = &object::create_named_object(admin, b"TEST_TOKEN"); + primary_fungible_store::create_primary_store_enabled_fungible_asset( + constructor_ref, + option::none(), + utf8(b"Test Token"), + utf8(b"TEST"), + 6, + utf8(b""), + utf8(b""), + ); + let mint_ref = fungible_asset::generate_mint_ref(constructor_ref); + let metadata = object::object_from_constructor_ref(constructor_ref); - let coins = request_internal(account, @mock); + // Mint tokens to admin for the faucet + let fa = fungible_asset::mint(&mint_ref, 1_000_000_000_000); + primary_fungible_store::deposit(signer::address_of(admin), fa); - coin::deposit(account_addr, coins); + metadata } - public entry fun mintAll(account: &signer) acquires Faucet, Restricted { - let account_addr = signer::address_of(account); + #[test(admin = @mock, user = @0x456, aptos_framework = @0x1)] + fun test_mint(admin: &signer, user: &signer, aptos_framework: &signer) acquires FaucetRegistry, Restricted { + // Setup + timestamp::set_time_has_started_for_testing(aptos_framework); + account::create_account_for_test(signer::address_of(admin)); + account::create_account_for_test(signer::address_of(user)); - if (!coin::is_account_registered(account_addr)) { - coin::register(account); - }; - if (!coin::is_account_registered(account_addr)) { - coin::register(account); - }; - if (!coin::is_account_registered(account_addr)) { - coin::register(account); - }; - if (!coin::is_account_registered(account_addr)) { - coin::register(account); - }; + // Create test token and faucet + let test_metadata = setup_test_token(admin); + let per_request = 60_000_000_000; + let period = 3600; + create_faucet(admin, test_metadata, 900_000_000_000, per_request, period); + + // User requests tokens from faucet + mint(user, test_metadata); + + // Verify user received tokens + let user_addr = signer::address_of(user); + let balance = primary_fungible_store::balance(user_addr, test_metadata); + assert!(balance == per_request, 0); // Should receive per_request amount + } + + #[test_only] + fun setup_four_test_tokens(admin: &signer): (Object, Object, Object, Object) { + // Create USDC-like token + let usdc_ref = &object::create_named_object(admin, b"TEST_USDC"); + primary_fungible_store::create_primary_store_enabled_fungible_asset( + usdc_ref, option::none(), utf8(b"Test USDC"), utf8(b"USDC"), 6, utf8(b""), utf8(b"")); + let usdc_mint = fungible_asset::generate_mint_ref(usdc_ref); + let usdc_metadata = object::object_from_constructor_ref(usdc_ref); + primary_fungible_store::deposit(signer::address_of(admin), fungible_asset::mint(&usdc_mint, 1_000_000_000_000)); + + // Create USDT-like token + let usdt_ref = &object::create_named_object(admin, b"TEST_USDT"); + primary_fungible_store::create_primary_store_enabled_fungible_asset( + usdt_ref, option::none(), utf8(b"Test USDT"), utf8(b"USDT"), 6, utf8(b""), utf8(b"")); + let usdt_mint = fungible_asset::generate_mint_ref(usdt_ref); + let usdt_metadata = object::object_from_constructor_ref(usdt_ref); + primary_fungible_store::deposit(signer::address_of(admin), fungible_asset::mint(&usdt_mint, 1_000_000_000_000)); + + // Create WBTC-like token + let wbtc_ref = &object::create_named_object(admin, b"TEST_WBTC"); + primary_fungible_store::create_primary_store_enabled_fungible_asset( + wbtc_ref, option::none(), utf8(b"Test WBTC"), utf8(b"WBTC"), 8, utf8(b""), utf8(b"")); + let wbtc_mint = fungible_asset::generate_mint_ref(wbtc_ref); + let wbtc_metadata = object::object_from_constructor_ref(wbtc_ref); + primary_fungible_store::deposit(signer::address_of(admin), fungible_asset::mint(&wbtc_mint, 10_000_000_000)); + + // Create WETH-like token + let weth_ref = &object::create_named_object(admin, b"TEST_WETH"); + primary_fungible_store::create_primary_store_enabled_fungible_asset( + weth_ref, option::none(), utf8(b"Test WETH"), utf8(b"WETH"), 8, utf8(b""), utf8(b"")); + let weth_mint = fungible_asset::generate_mint_ref(weth_ref); + let weth_metadata = object::object_from_constructor_ref(weth_ref); + primary_fungible_store::deposit(signer::address_of(admin), fungible_asset::mint(&weth_mint, 100_000_000_000)); + + (usdc_metadata, usdt_metadata, wbtc_metadata, weth_metadata) + } + + #[test(admin = @mock, user = @0x456, aptos_framework = @0x1)] + fun test_mintAll(admin: &signer, user: &signer, aptos_framework: &signer) acquires FaucetRegistry, Restricted { + // Setup + timestamp::set_time_has_started_for_testing(aptos_framework); + account::create_account_for_test(signer::address_of(admin)); + account::create_account_for_test(signer::address_of(user)); + + // Create test tokens and faucets + let (usdc_metadata, usdt_metadata, wbtc_metadata, weth_metadata) = setup_four_test_tokens(admin); + + create_faucet(admin, usdc_metadata, 900_000_000_000, 60_000_000_000, 3600); + create_faucet(admin, usdt_metadata, 900_000_000_000, 60_000_000_000, 3600); + create_faucet(admin, wbtc_metadata, 9_000_000_000, 100_000_000, 3600); + create_faucet(admin, weth_metadata, 90_000_000_000, 2_000_000_000, 3600); + + // User requests all tokens from faucet + mintAll(user, usdc_metadata, usdt_metadata, wbtc_metadata, weth_metadata); + + // Verify user received all tokens + let user_addr = signer::address_of(user); + let usdc_balance = primary_fungible_store::balance(user_addr, usdc_metadata); + let usdt_balance = primary_fungible_store::balance(user_addr, usdt_metadata); + let wbtc_balance = primary_fungible_store::balance(user_addr, wbtc_metadata); + let weth_balance = primary_fungible_store::balance(user_addr, weth_metadata); + + assert!(usdc_balance == 60_000_000_000, 0); // USDC per_request + assert!(usdt_balance == 60_000_000_000, 1); // USDT per_request + assert!(wbtc_balance == 100_000_000, 2); // WBTC per_request + assert!(weth_balance == 2_000_000_000, 3); // WETH per_request + } + + #[test(admin = @mock, user = @0x456, aptos_framework = @0x1)] + #[expected_failure(abort_code = ERR_RESTRICTED, location = Self)] + fun test_mint_restriction_period(admin: &signer, user: &signer, aptos_framework: &signer) acquires FaucetRegistry, Restricted { + // Setup + timestamp::set_time_has_started_for_testing(aptos_framework); + account::create_account_for_test(signer::address_of(admin)); + account::create_account_for_test(signer::address_of(user)); + + // Create test token and faucet + let test_metadata = setup_test_token(admin); + create_faucet(admin, test_metadata, 900_000_000_000, 60_000_000_000, 3600); + + // First request should succeed + mint(user, test_metadata); + + // Second request immediately should fail due to restriction period (3600 seconds) + mint(user, test_metadata); + } + + #[test(admin = @mock, user = @0x456, aptos_framework = @0x1)] + fun test_mint_after_period(admin: &signer, user: &signer, aptos_framework: &signer) acquires FaucetRegistry, Restricted { + // Setup + timestamp::set_time_has_started_for_testing(aptos_framework); + account::create_account_for_test(signer::address_of(admin)); + account::create_account_for_test(signer::address_of(user)); + + // Create test token and faucet + let test_metadata = setup_test_token(admin); + let per_request = 60_000_000_000; + create_faucet(admin, test_metadata, 900_000_000_000, per_request, 3600); + + // First request + mint(user, test_metadata); + + let user_addr = signer::address_of(user); + let balance_after_first = primary_fungible_store::balance(user_addr, test_metadata); + assert!(balance_after_first == per_request, 0); + + // Fast forward time past the restriction period (3600 seconds) + timestamp::fast_forward_seconds(3601); - let usdtCoins = request_internal(account, @mock); - let usdcCoins = request_internal(account, @mock); - let wbtcCoins = request_internal(account, @mock); - let wethCoins = request_internal(account, @mock); + // Second request should now succeed + mint(user, test_metadata); - coin::deposit(account_addr, usdtCoins); - coin::deposit(account_addr, usdcCoins); - coin::deposit(account_addr, wbtcCoins); - coin::deposit(account_addr, wethCoins); + let balance_after_second = primary_fungible_store::balance(user_addr, test_metadata); + assert!(balance_after_second == per_request * 2, 1); // Should have double the amount } -} \ No newline at end of file +} diff --git a/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/tokens.move b/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/tokens.move index 8a57b6a1e..1b19f69a6 100644 --- a/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/tokens.move +++ b/protocol-units/tokens/mock/testnet/suzuka/aptos/sources/tokens.move @@ -1,83 +1,164 @@ module mock::tokens { use std::signer; use std::string::utf8; + use std::option; use mock::faucet; - use aptos_framework::coin::{Self, MintCapability, FreezeCapability, BurnCapability}; + use aptos_framework::fungible_asset::{Self, MintRef, BurnRef, TransferRef, Metadata}; + use aptos_framework::object::{Self, Object}; + use aptos_framework::primary_fungible_store; - struct USDC {} - struct USDT {} - struct WBTC {} - struct WETH {} + struct Refs has key { + usdc_mint_ref: MintRef, + usdc_burn_ref: BurnRef, + usdc_transfer_ref: TransferRef, + usdt_mint_ref: MintRef, + usdt_burn_ref: BurnRef, + usdt_transfer_ref: TransferRef, + wbtc_mint_ref: MintRef, + wbtc_burn_ref: BurnRef, + wbtc_transfer_ref: TransferRef, + weth_mint_ref: MintRef, + weth_burn_ref: BurnRef, + weth_transfer_ref: TransferRef, + } - struct Caps has key { - mint: MintCapability, - freeze: FreezeCapability, - burn: BurnCapability, + struct AssetRefs has key { + usdc: Object, + usdt: Object, + wbtc: Object, + weth: Object, } - public entry fun initialize(admin: &signer) acquires Caps { - let (usdc_b, usdc_f, usdc_m) = - coin::initialize(admin, - utf8(b"Circle"), utf8(b"USDC"), 6, true); - let (usdt_b, usdt_f, usdt_m) = - coin::initialize(admin, - utf8(b"Tether"), utf8(b"USDT"), 6, true); - let (btc_b, btc_f, btc_m) = - coin::initialize(admin, - utf8(b"Bitcoin"), utf8(b"WBTC"), 8, true); - let (eth_b, eth_f, eth_m) = - coin::initialize(admin, - utf8(b"Ethereum"), utf8(b"WETH"), 8, true); - - move_to(admin, Caps { mint: usdc_m, freeze: usdc_f, burn: usdc_b }); - move_to(admin, Caps { mint: usdt_m, freeze: usdt_f, burn: usdt_b }); - move_to(admin, Caps { mint: btc_m, freeze: btc_f, burn: btc_b }); - move_to(admin, Caps { mint: eth_m, freeze: eth_f, burn: eth_b }); - register_coins_all(admin); + public entry fun initialize(admin: &signer) acquires Refs, AssetRefs { + // Create USDC fungible asset + let usdc_constructor_ref = &object::create_named_object(admin, b"USDC"); + primary_fungible_store::create_primary_store_enabled_fungible_asset( + usdc_constructor_ref, + option::none(), + utf8(b"Circle"), + utf8(b"USDC"), + 6, + utf8(b""), + utf8(b""), + ); + let usdc_mint_ref = fungible_asset::generate_mint_ref(usdc_constructor_ref); + let usdc_burn_ref = fungible_asset::generate_burn_ref(usdc_constructor_ref); + let usdc_transfer_ref = fungible_asset::generate_transfer_ref(usdc_constructor_ref); + let usdc_metadata = object::object_from_constructor_ref(usdc_constructor_ref); + + // Create USDT fungible asset + let usdt_constructor_ref = &object::create_named_object(admin, b"USDT"); + primary_fungible_store::create_primary_store_enabled_fungible_asset( + usdt_constructor_ref, + option::none(), + utf8(b"Tether"), + utf8(b"USDT"), + 6, + utf8(b""), + utf8(b""), + ); + let usdt_mint_ref = fungible_asset::generate_mint_ref(usdt_constructor_ref); + let usdt_burn_ref = fungible_asset::generate_burn_ref(usdt_constructor_ref); + let usdt_transfer_ref = fungible_asset::generate_transfer_ref(usdt_constructor_ref); + let usdt_metadata = object::object_from_constructor_ref(usdt_constructor_ref); + + // Create WBTC fungible asset + let wbtc_constructor_ref = &object::create_named_object(admin, b"WBTC"); + primary_fungible_store::create_primary_store_enabled_fungible_asset( + wbtc_constructor_ref, + option::none(), + utf8(b"Bitcoin"), + utf8(b"WBTC"), + 8, + utf8(b""), + utf8(b""), + ); + let wbtc_mint_ref = fungible_asset::generate_mint_ref(wbtc_constructor_ref); + let wbtc_burn_ref = fungible_asset::generate_burn_ref(wbtc_constructor_ref); + let wbtc_transfer_ref = fungible_asset::generate_transfer_ref(wbtc_constructor_ref); + let wbtc_metadata = object::object_from_constructor_ref(wbtc_constructor_ref); + + // Create WETH fungible asset + let weth_constructor_ref = &object::create_named_object(admin, b"WETH"); + primary_fungible_store::create_primary_store_enabled_fungible_asset( + weth_constructor_ref, + option::none(), + utf8(b"Ethereum"), + utf8(b"WETH"), + 8, + utf8(b""), + utf8(b""), + ); + let weth_mint_ref = fungible_asset::generate_mint_ref(weth_constructor_ref); + let weth_burn_ref = fungible_asset::generate_burn_ref(weth_constructor_ref); + let weth_transfer_ref = fungible_asset::generate_transfer_ref(weth_constructor_ref); + let weth_metadata = object::object_from_constructor_ref(weth_constructor_ref); + + // Store all refs + move_to(admin, Refs { + usdc_mint_ref, + usdc_burn_ref, + usdc_transfer_ref, + usdt_mint_ref, + usdt_burn_ref, + usdt_transfer_ref, + wbtc_mint_ref, + wbtc_burn_ref, + wbtc_transfer_ref, + weth_mint_ref, + weth_burn_ref, + weth_transfer_ref, + }); + + move_to(admin, AssetRefs { + usdc: usdc_metadata, + usdt: usdt_metadata, + wbtc: wbtc_metadata, + weth: weth_metadata, + }); + mint_coins(admin); } - fun mint_coins(admin: &signer) acquires Caps { + fun mint_coins(admin: &signer) acquires Refs, AssetRefs { let admin_addr = signer::address_of(admin); let max_value = 18446744073709551615; let dexs = 10; - let usdc_caps = borrow_global>(admin_addr); - let usdt_caps = borrow_global>(admin_addr); - let btc_caps = borrow_global>(admin_addr); - let eth_caps = borrow_global>(admin_addr); - let usdc_coins = coin::mint(max_value, &usdc_caps.mint); - let usdt_coins = coin::mint(max_value, &usdt_caps.mint); - let btc_coins = coin::mint(max_value, &btc_caps.mint); - let eth_coins = coin::mint(max_value, ð_caps.mint); - coin::deposit(admin_addr, usdc_coins); - coin::deposit(admin_addr, usdt_coins); - coin::deposit(admin_addr, btc_coins); - coin::deposit(admin_addr, eth_coins); - faucet::create_faucet(admin, max_value - (1_000_000_000_000 * dexs), 60_000_000_000, 3600); - faucet::create_faucet(admin, max_value - (1_000_000_000_000 * dexs), 60_000_000_000, 3600); - faucet::create_faucet(admin, max_value - (1_700_000_000 * dexs), 100_000_000, 3600); - faucet::create_faucet(admin, max_value - (34_000_000_000 * dexs), 2000_000_000, 3600); + + let refs = borrow_global(admin_addr); + let asset_refs = borrow_global(admin_addr); + + // Mint USDC + let usdc_fa = fungible_asset::mint(&refs.usdc_mint_ref, max_value); + primary_fungible_store::deposit(admin_addr, usdc_fa); + + // Mint USDT + let usdt_fa = fungible_asset::mint(&refs.usdt_mint_ref, max_value); + primary_fungible_store::deposit(admin_addr, usdt_fa); + + // Mint WBTC + let wbtc_fa = fungible_asset::mint(&refs.wbtc_mint_ref, max_value); + primary_fungible_store::deposit(admin_addr, wbtc_fa); + + // Mint WETH + let weth_fa = fungible_asset::mint(&refs.weth_mint_ref, max_value); + primary_fungible_store::deposit(admin_addr, weth_fa); + + // Create faucets + faucet::create_faucet(admin, asset_refs.usdc, max_value - (1_000_000_000_000 * dexs), 60_000_000_000, 3600); + faucet::create_faucet(admin, asset_refs.usdt, max_value - (1_000_000_000_000 * dexs), 60_000_000_000, 3600); + faucet::create_faucet(admin, asset_refs.wbtc, max_value - (1_700_000_000 * dexs), 100_000_000, 3600); + faucet::create_faucet(admin, asset_refs.weth, max_value - (34_000_000_000 * dexs), 2000_000_000, 3600); } - public entry fun register_coins_all(account: &signer) { - let account_addr = signer::address_of(account); - if (!coin::is_account_registered(account_addr)) { - coin::register(account); - }; - if (!coin::is_account_registered(account_addr)) { - coin::register(account); - }; - if (!coin::is_account_registered(account_addr)) { - coin::register(account); - }; - if (!coin::is_account_registered(account_addr)) { - coin::register(account); - }; + public entry fun register_coins_all(_account: &signer) { + // With primary fungible stores, registration is automatic. + // This function is kept for API compatibility but is now a no-op. } #[test (admin = @mock)] - fun test_init(admin: &signer) acquires Caps { + fun test_init(admin: &signer) acquires Refs, AssetRefs { initialize(admin); } } \ No newline at end of file