Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion deployments/base.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
{
"TelcoinV3": "0x7E13B43065380aCdeC1c2d138c579cbBbafA0731"
"MigrationVault": "0x222213DeB441C5A9F71Df2942db431978a733333",
"MintBurnWrapper": "0x4A1c2ab0661651Ee55C41DB1239F292e00C3D149",
"TelcoinBridge": "0x6A7E6616653e84eee0c70257eC2E3d79A4476a7e",
"TelcoinV3": "0x7E13B43065380aCdeC1c2d138c579cbBbafA0731",
"TokenMigration": "0x2703E00cAE30A7707e4d18C38f8CB6A4a40c2703"
}
6 changes: 5 additions & 1 deletion deployments/ethereum.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
{
"TelcoinV3": "0x7E13B43065380aCdeC1c2d138c579cbBbafA0731"
"MigrationVault": "0x222213DeB441C5A9F71Df2942db431978a733333",
"MintBurnWrapper": "0x4A1c2ab0661651Ee55C41DB1239F292e00C3D149",
"TelcoinBridge": "0x6A7E6616653e84eee0c70257eC2E3d79A4476a7e",
"TelcoinV3": "0x7E13B43065380aCdeC1c2d138c579cbBbafA0731",
"TokenMigration": "0x2703E00cAE30A7707e4d18C38f8CB6A4a40c2703"
}
6 changes: 5 additions & 1 deletion deployments/polygon.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
{
"TelcoinV3": "0x7E13B43065380aCdeC1c2d138c579cbBbafA0731"
"MigrationVault": "0x222213DeB441C5A9F71Df2942db431978a733333",
"MintBurnWrapper": "0x4A1c2ab0661651Ee55C41DB1239F292e00C3D149",
"TelcoinBridge": "0x6A7E6616653e84eee0c70257eC2E3d79A4476a7e",
"TelcoinV3": "0x7E13B43065380aCdeC1c2d138c579cbBbafA0731",
"TokenMigration": "0x2703E00cAE30A7707e4d18C38f8CB6A4a40c2703"
}
12 changes: 8 additions & 4 deletions docs/custom-dvn-mesh.md
Original file line number Diff line number Diff line change
Expand Up @@ -361,12 +361,14 @@ Threshold: 3 Required + 1-of-2 Optional

## DVN Contract Addresses

All providers confirmed deployed on Ethereum, Base, and Polygon (queried from [LZ metadata API](https://metadata.layerzero-api.com/v1/metadata/dvns) on 2026-05-30):
All providers confirmed deployed on Ethereum, Base, and Polygon (re-verified against the [LZ metadata API](https://metadata.layerzero-api.com/v1/metadata/dvns) on 2026-08-26).

> **Correction (2026-08-26):** the original 2026-05-30 table listed the `lzReadCompatible` DVN variants for LayerZero Labs (Ethereum, Polygon) and Nethermind (Base, Polygon). Those are separate lzRead deployments — standard OFT messaging must use the addresses below. Canonical copy lives in `script/mainnet/utils/Constants.sol`.

| Provider | Ethereum | Base | Polygon |
|----------|----------|------|---------|
| LayerZero Labs | `0xDb979D0A36aF0525AFa60Fc265B1525505c55D79` | `0x9e059a54699a285714207b43B055483E78FAac25` | `0xA70C51C38D5A9990F3113a403D74EBa01fce4CCb` |
| Nethermind | `0xa59BA433ac34D2927232918Ef5B2eaAfcF130BA5` | `0x658947BC7956aea0067a62Cf87ab02ae199Ef3f3` | `0xbCefdAdB8d24b1d36c26B522235012Cd4cf162f6` |
| LayerZero Labs | `0x589dEDbD617e0CBcB916A9223F4d1300c294236b` | `0x9e059a54699a285714207b43B055483E78FAac25` | `0x23DE2FE932d9043291f870324B74F820e11dc81A` |
| Nethermind | `0xa59BA433ac34D2927232918Ef5B2eaAfcF130BA5` | `0xcd37CA043f8479064e10635020c65FfC005d36f6` | `0x31F748a368a893Bdb5aBB67ec95F232507601A73` |
| Canary | `0xa4fE5A5B9A846458a70Cd0748228aED3bF65c2cd` | `0x554833698Ae0FB22ECC90B01222903fD62CA4B47` | `0x13feb7234Ff60A97af04477d6421415766753Ba3` |
| Deutsche Telekom | `0x373a6E5c0C4E89E24819f00AA37ea370917AAfF4` | `0xc2A0C36f5939A14966705c7Cec813163FaEEa1F0` | `0x5CcCb8DE6Cdba9D2Af9d84465653af7390FDf9Dd` |
| FCAT | `0xc61aF5706b80Ca941a0aAb1C7B3D7a953E4dD8C4` | `0xEaE72C81F3FCe1313EeeE26717F42af91E178516` | `0x14206011d192E4F41D694d21ac599D0e88c2c12A` |
Expand All @@ -381,6 +383,8 @@ All providers confirmed deployed on Ethereum, Base, and Polygon (queried from [L
| Date | Decision | Rationale |
|------|----------|-----------|
| 2026-05-30 | Initial provider shortlist confirmed | Based on LayerZero team call — prioritizing client, cloud, and entity diversity |
| 2026-08-26 | **Mesh chosen**: Required = [LayerZero Labs, Canary, Deutsche Telekom], Optional = [Nethermind, FCAT], threshold 1-of-2 (4 of 5 must agree) | Wired into `script/mainnet/2_ConfigureDVNs.s.sol`; addresses in `script/mainnet/utils/Constants.sol` |
| 2026-08-26 | Address table corrected — standard messaging DVNs, not lzRead variants | Original table mixed in `lzReadCompatible` deployments for LZ Labs (eth/polygon) and Nethermind (base/polygon) |
| | | |

### Open Questions
Expand All @@ -391,7 +395,7 @@ All providers confirmed deployed on Ethereum, Base, and Polygon (queried from [L
4. **TelcoinNetwork DVN support** — Which providers will support TelcoinNetwork when it launches? This could narrow our options.
5. ~~**Exact fee quotes**~~ — ✅ Queried via `getFee()` on 2026-05-30. DVN fees are ~$0.003/DVN/msg from Ethereum. Cost is negligible.
6. **Liveness SLAs** — Do any providers offer uptime guarantees or SLAs?
7. **Preferred mesh option** — Need team alignment on which option (A–E). Given negligible cost delta, security should be the primary driver.
7. ~~**Preferred mesh option**~~✅ Decided 2026-08-26: 3 required (LZ Labs, Canary, Deutsche Telekom) + 1-of-2 optional (Nethermind, FCAT). See Decision Log.

---

Expand Down
5 changes: 4 additions & 1 deletion remappings.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,7 @@ forge-deploy-utils/=lib/forge-deploy-utils/src/
@safe-utils/=lib/forge-deploy-utils/lib/safe-utils/src/
safe-smart-account/=lib/forge-deploy-utils/lib/safe-utils/lib/safe-smart-account/contracts/
solidity-http/=lib/forge-deploy-utils/lib/safe-utils/lib/solidity-http/src/
solidity-stringutils/=lib/forge-deploy-utils/lib/safe-utils/lib/solidity-stringutils/src/
solidity-stringutils/=lib/forge-deploy-utils/lib/safe-utils/lib/solidity-stringutils/src/
forge-std/=lib/forge-std/src/
lib/forge-deploy-utils/:forge-std/=lib/forge-std/src/
lib/forge-deploy-utils/lib/safe-utils/:forge-std/=lib/forge-std/src/
12 changes: 10 additions & 2 deletions script/base/BaseConfigureDVNs.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,11 @@ abstract contract BaseConfigureDVNs is DeployBase {
needsLibUpdate = isDefault || currentRecvLib != dst.receiveLib;
}

bytes memory ulnConfig = _buildUlnConfig(dst);
// Receive ULN = dst chain's DVN deployments, but the SOURCE chain's
// confirmations: `confirmations` counts source-chain blocks the DVNs
// must wait, so it must mirror the send config on src or the pathway
// stalls (DVN attests at src.confirmations, receive demands more).
bytes memory ulnConfig = _buildUlnConfig(dst, src.confirmations);

{
bytes memory currentUln = endpoint.getConfig(dstBridge, dst.receiveLib, src.eid, CONFIG_TYPE_ULN);
Expand Down Expand Up @@ -342,8 +346,12 @@ abstract contract BaseConfigureDVNs is DeployBase {
// ----------------

function _buildUlnConfig(ChainConfig memory chain) internal pure returns (bytes memory) {
return _buildUlnConfig(chain, chain.confirmations);
}

function _buildUlnConfig(ChainConfig memory chain, uint64 confirmations) internal pure returns (bytes memory) {
UlnConfig memory config = UlnConfig({
confirmations: chain.confirmations,
confirmations: confirmations,
requiredDVNCount: uint8(chain.requiredDVNs.length),
optionalDVNCount: uint8(chain.optionalDVNs.length),
optionalDVNThreshold: chain.optionalDVNThreshold,
Expand Down
18 changes: 17 additions & 1 deletion script/base/BaseDeployMigrationInfra.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,25 @@ abstract contract BaseDeployMigrationInfra is DeployBase, Roles {
"Deploy TokenMigration"
);

// 2b. Grant PAUSER_ROLE/UNPAUSER_ROLE on TokenMigration (batched, post-deploy)
// 2b. Pause roles + deploy paused (batched, post-deploy). Fresh deploys are paused
// within the same MultiSend so migration cannot start until UNPAUSER unpauses at
// launch. pause() is PAUSER_ROLE-gated and the batch executes as the admin, so
// the order is: grant PAUSER_ROLE to the admin, pause, then grant the dedicated
// pauser/unpauser. The admin keeps PAUSER_ROLE.
require(_pauser != address(0), "Pauser not configured");
require(_unpauser != address(0), "Unpauser not configured");
console.log(" [batch] Grant PAUSER_ROLE to admin");
_batchTargets.push(migrator);
_batchDatas.push(abi.encodeCall(IAccessControl.grantRole, (PAUSER_ROLE, _admin)));

// Fresh deploys only: an existing migrator's pause state is operational state, not
// deployment state (and pause() reverts if already paused).
if (migrator.code.length == 0) {
console.log(" [batch] Pause TokenMigration (deploy paused)");
_batchTargets.push(migrator);
_batchDatas.push(abi.encodeCall(TokenMigration.pause, ()));
}

console.log(" [batch] Grant PAUSER_ROLE / UNPAUSER_ROLE on TokenMigration");
_batchTargets.push(migrator);
_batchDatas.push(abi.encodeCall(IAccessControl.grantRole, (PAUSER_ROLE, _pauser)));
Expand Down
62 changes: 41 additions & 21 deletions script/mainnet/2_ConfigureDVNs.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,13 @@ contract ConfigureDVNs is BaseConfigureDVNs {
ETH_MAINNET_LZ_ENDPOINT_V2,
_ethRequiredDVNs(),
_ethOptionalDVNs(),
0, // TODO: Set optional DVN threshold
1, // 1-of-2 optional DVNs must sign (Nethermind, FCAT)
ETH_MAINNET_LZ_SEND_ULN_302,
ETH_MAINNET_LZ_RECEIVE_ULN_302,
ETH_MAINNET_LZ_EXECUTOR,
false,
15, // TODO: Finalize mainnet confirmations
100_000 // TODO: Profile actual lzReceive gas
15, // matches LZ default for messages sent FROM Ethereum
100_000 // lzReceive gas on this chain; validated on testnet
));

// Base Mainnet
Expand All @@ -65,13 +65,13 @@ contract ConfigureDVNs is BaseConfigureDVNs {
BASE_MAINNET_LZ_ENDPOINT_V2,
_baseRequiredDVNs(),
_baseOptionalDVNs(),
0, // TODO: Set optional DVN threshold
1, // 1-of-2 optional DVNs must sign (Nethermind, FCAT)
BASE_MAINNET_LZ_SEND_ULN_302,
BASE_MAINNET_LZ_RECEIVE_ULN_302,
BASE_MAINNET_LZ_EXECUTOR,
false,
15, // TODO: Finalize mainnet confirmations
100_000 // TODO: Profile actual lzReceive gas
10, // matches LZ default for messages sent FROM Base
100_000 // lzReceive gas on this chain; validated on testnet
));

// Polygon Mainnet
Expand All @@ -83,13 +83,13 @@ contract ConfigureDVNs is BaseConfigureDVNs {
POLYGON_MAINNET_LZ_ENDPOINT_V2,
_polygonRequiredDVNs(),
_polygonOptionalDVNs(),
0, // TODO: Set optional DVN threshold
1, // 1-of-2 optional DVNs must sign (Nethermind, FCAT)
POLYGON_MAINNET_LZ_SEND_ULN_302,
POLYGON_MAINNET_LZ_RECEIVE_ULN_302,
POLYGON_MAINNET_LZ_EXECUTOR,
false,
15, // TODO: Finalize mainnet confirmations
100_000 // TODO: Profile actual lzReceive gas
120, // matches LZ default for messages sent FROM Polygon (PoS reorg depth)
100_000 // lzReceive gas on this chain; validated on testnet
));

// TelcoinNetwork (main chain — NativeBridge)
Expand All @@ -113,31 +113,51 @@ contract ConfigureDVNs is BaseConfigureDVNs {
// DVN Arrays (per chain)
// ----------------------

// Mesh (decided 2026-08-26, see docs/custom-dvn-mesh.md):
// Required: LayerZero Labs, Canary, Deutsche Telekom (all must sign)
// Optional: Nethermind, FCAT (1-of-2 must sign) — 4 of 5 total must agree
// Addresses live in utils/Constants.sol (verified vs LZ metadata API).
// ULN302 requires each array sorted ascending by address with no
// duplicates (reverts LZ_ULN_Unsorted otherwise), so provider order
// differs per chain below.

function _ethRequiredDVNs() internal pure returns (address[] memory dvns) {
dvns = new address[](1);
dvns[0] = address(0); // TODO: e.g. LayerZero Labs DVN on Ethereum
dvns = new address[](3);
dvns[0] = ETH_MAINNET_DVN_DEUTSCHE_TELEKOM;
dvns[1] = ETH_MAINNET_DVN_LAYERZERO_LABS;
dvns[2] = ETH_MAINNET_DVN_CANARY;
}

function _ethOptionalDVNs() internal pure returns (address[] memory) {
return new address[](0); // TODO: e.g. [Google Cloud, Polyhedra, Nethermind]
function _ethOptionalDVNs() internal pure returns (address[] memory dvns) {
dvns = new address[](2);
dvns[0] = ETH_MAINNET_DVN_NETHERMIND;
dvns[1] = ETH_MAINNET_DVN_FCAT;
}

function _baseRequiredDVNs() internal pure returns (address[] memory dvns) {
dvns = new address[](1);
dvns[0] = address(0); // TODO: e.g. LayerZero Labs DVN on Base
dvns = new address[](3);
dvns[0] = BASE_MAINNET_DVN_CANARY;
dvns[1] = BASE_MAINNET_DVN_LAYERZERO_LABS;
dvns[2] = BASE_MAINNET_DVN_DEUTSCHE_TELEKOM;
}

function _baseOptionalDVNs() internal pure returns (address[] memory) {
return new address[](0); // TODO
function _baseOptionalDVNs() internal pure returns (address[] memory dvns) {
dvns = new address[](2);
dvns[0] = BASE_MAINNET_DVN_NETHERMIND;
dvns[1] = BASE_MAINNET_DVN_FCAT;
}

function _polygonRequiredDVNs() internal pure returns (address[] memory dvns) {
dvns = new address[](1);
dvns[0] = address(0); // TODO: e.g. LayerZero Labs DVN on Polygon
dvns = new address[](3);
dvns[0] = POLYGON_MAINNET_DVN_CANARY;
dvns[1] = POLYGON_MAINNET_DVN_LAYERZERO_LABS;
dvns[2] = POLYGON_MAINNET_DVN_DEUTSCHE_TELEKOM;
}

function _polygonOptionalDVNs() internal pure returns (address[] memory) {
return new address[](0); // TODO
function _polygonOptionalDVNs() internal pure returns (address[] memory dvns) {
dvns = new address[](2);
dvns[0] = POLYGON_MAINNET_DVN_FCAT;
dvns[1] = POLYGON_MAINNET_DVN_NETHERMIND;
}

// -------
Expand Down
18 changes: 16 additions & 2 deletions script/mainnet/3_DeployMigrationInfra.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ contract DeployMigrationInfra is BaseDeployMigrationInfra {
_migrationDuration = 365 days;
_withdrawalDelay = 90 days;

// Only chains with legacy TEL tokens
// Only chains with legacy TEL tokens — same set as the bridge mesh
allChains.push(MigrationChainConfig({
chainName: "ethereum",
rpcUrl: vm.envString("ETHEREUM_RPC_URL"),
Expand All @@ -54,6 +54,20 @@ contract DeployMigrationInfra is BaseDeployMigrationInfra {
deployLegacyTel: false
}));

// Add more chains here as needed (e.g. Polygon if legacy TEL exists there)
allChains.push(MigrationChainConfig({
chainName: "base",
rpcUrl: vm.envString("BASE_RPC_URL"),
evmChainId: BASE_MAINNET_CHAIN_ID,
legacyTel: LEGACY_TELCOIN_BASE,
deployLegacyTel: false
}));

allChains.push(MigrationChainConfig({
chainName: "polygon",
rpcUrl: vm.envString("POLYGON_RPC_URL"),
evmChainId: POLYGON_MAINNET_CHAIN_ID,
legacyTel: LEGACY_TELCOIN_POLYGON,
deployLegacyTel: false
}));
}
}
54 changes: 42 additions & 12 deletions script/mainnet/utils/Constants.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,13 @@ pragma solidity ^0.8.30;
// Legacy TEL
// ----------

// All three are 2-decimal tokens (verified on-chain 2026-08-26) — required by
// TokenMigration's hardcoded 2→18 DECIMAL_MULTIPLIER. Ethereum is canonical;
// Polygon is the PoS-bridged representation; Base is the official deployment
// announced by the Telcoin Association (2025-02-25).
address constant LEGACY_TELCOIN_ETHEREUM = 0x467Bccd9d29f223BcE8043b84E8C8B282827790F;
address constant LEGACY_TELCOIN_POLYGON = 0xdF7837DE1F2Fa4631D716CF2502f8b230F1dcc32;
address constant LEGACY_TELCOIN_BASE = 0x09bE1692ca16e06f536F0038fF11D1dA8524aDB1;

// -------------
// EVM Chain IDs
Expand All @@ -20,35 +26,59 @@ uint256 constant POLYGON_MAINNET_CHAIN_ID = 137;
// Layer Zero V2
// -------------

// All addresses verified against the LayerZero metadata API on 2026-08-26:
// https://metadata.layerzero-api.com/v1/metadata/deployments (endpoint/ULN/executor)
// https://metadata.layerzero-api.com/v1/metadata/dvns (DVNs)
// DVN constants are the STANDARD messaging DVNs — each provider also runs a
// separate lzRead-compatible DVN at a different address; those must NOT be
// used here (docs/custom-dvn-mesh.md's 2026-05-30 table mixed some in).
// Which providers go in the required vs optional buckets is configured in
// 2_ConfigureDVNs.s.sol; this file is only the address registry.

// Ethereum Mainnet

address constant ETH_MAINNET_LZ_ENDPOINT_V2 = 0x1a44076050125825900e736c501f859c50fE728c;
uint32 constant ETH_MAINNET_LZ_CHAIN_ID_V2 = 30101;

address constant ETH_MAINNET_LZ_DVN = address(0); // TODO
address constant ETH_MAINNET_LZ_EXECUTOR = address(0); // TODO
address constant ETH_MAINNET_LZ_SEND_ULN_302 = address(0); // TODO
address constant ETH_MAINNET_LZ_RECEIVE_ULN_302 = address(0); // TODO
address constant ETH_MAINNET_LZ_EXECUTOR = 0x173272739Bd7Aa6e4e214714048a9fE699453059;
address constant ETH_MAINNET_LZ_SEND_ULN_302 = 0xbB2Ea70C9E858123480642Cf96acbcCE1372dCe1;
address constant ETH_MAINNET_LZ_RECEIVE_ULN_302 = 0xc02Ab410f0734EFa3F14628780e6e695156024C2;

address constant ETH_MAINNET_DVN_LAYERZERO_LABS = 0x589dEDbD617e0CBcB916A9223F4d1300c294236b;
address constant ETH_MAINNET_DVN_NETHERMIND = 0xa59BA433ac34D2927232918Ef5B2eaAfcF130BA5;
address constant ETH_MAINNET_DVN_CANARY = 0xa4fE5A5B9A846458a70Cd0748228aED3bF65c2cd;
address constant ETH_MAINNET_DVN_DEUTSCHE_TELEKOM = 0x373a6E5c0C4E89E24819f00AA37ea370917AAfF4;
address constant ETH_MAINNET_DVN_FCAT = 0xc61aF5706b80Ca941a0aAb1C7B3D7a953E4dD8C4;

// Base Mainnet

address constant BASE_MAINNET_LZ_ENDPOINT_V2 = 0x1a44076050125825900e736c501f859c50fE728c;
uint32 constant BASE_MAINNET_LZ_CHAIN_ID_V2 = 30184;

address constant BASE_MAINNET_LZ_DVN = address(0); // TODO
address constant BASE_MAINNET_LZ_EXECUTOR = address(0); // TODO
address constant BASE_MAINNET_LZ_SEND_ULN_302 = address(0); // TODO
address constant BASE_MAINNET_LZ_RECEIVE_ULN_302 = address(0); // TODO
address constant BASE_MAINNET_LZ_EXECUTOR = 0x2CCA08ae69E0C44b18a57Ab2A87644234dAebaE4;
address constant BASE_MAINNET_LZ_SEND_ULN_302 = 0xB5320B0B3a13cC860893E2Bd79FCd7e13484Dda2;
address constant BASE_MAINNET_LZ_RECEIVE_ULN_302 = 0xc70AB6f32772f59fBfc23889Caf4Ba3376C84bAf;

address constant BASE_MAINNET_DVN_LAYERZERO_LABS = 0x9e059a54699a285714207b43B055483E78FAac25;
address constant BASE_MAINNET_DVN_NETHERMIND = 0xcd37CA043f8479064e10635020c65FfC005d36f6;
address constant BASE_MAINNET_DVN_CANARY = 0x554833698Ae0FB22ECC90B01222903fD62CA4B47;
address constant BASE_MAINNET_DVN_DEUTSCHE_TELEKOM = 0xc2A0C36f5939A14966705c7Cec813163FaEEa1F0;
address constant BASE_MAINNET_DVN_FCAT = 0xEaE72C81F3FCe1313EeeE26717F42af91E178516;

// Polygon Mainnet

address constant POLYGON_MAINNET_LZ_ENDPOINT_V2 = 0x1a44076050125825900e736c501f859c50fE728c;
uint32 constant POLYGON_MAINNET_LZ_CHAIN_ID_V2 = 30109;

address constant POLYGON_MAINNET_LZ_DVN = address(0); // TODO
address constant POLYGON_MAINNET_LZ_EXECUTOR = address(0); // TODO
address constant POLYGON_MAINNET_LZ_SEND_ULN_302 = address(0); // TODO
address constant POLYGON_MAINNET_LZ_RECEIVE_ULN_302 = address(0); // TODO
address constant POLYGON_MAINNET_LZ_EXECUTOR = 0xCd3F213AD101472e1713C72B1697E727C803885b;
address constant POLYGON_MAINNET_LZ_SEND_ULN_302 = 0x6c26c61a97006888ea9E4FA36584c7df57Cd9dA3;
address constant POLYGON_MAINNET_LZ_RECEIVE_ULN_302 = 0x1322871e4ab09Bc7f5717189434f97bBD9546e95;

address constant POLYGON_MAINNET_DVN_LAYERZERO_LABS = 0x23DE2FE932d9043291f870324B74F820e11dc81A;
address constant POLYGON_MAINNET_DVN_NETHERMIND = 0x31F748a368a893Bdb5aBB67ec95F232507601A73;
address constant POLYGON_MAINNET_DVN_CANARY = 0x13feb7234Ff60A97af04477d6421415766753Ba3;
address constant POLYGON_MAINNET_DVN_DEUTSCHE_TELEKOM = 0x5CcCb8DE6Cdba9D2Af9d84465653af7390FDf9Dd;
address constant POLYGON_MAINNET_DVN_FCAT = 0x14206011d192E4F41D694d21ac599D0e88c2c12A;

// Telcoin Network (Main Chain — NativeBridge)
// address constant TELCOIN_NETWORK_LZ_ENDPOINT_V2 = address(0); // TODO
Expand Down
2 changes: 1 addition & 1 deletion script/mainnet/utils/Roles.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ pragma solidity ^0.8.30;
address constant ADMIN = 0x6012dBcb4350Ab297FeB7f96D4d86258062aeB03;
address constant PAUSER = 0xC4D09Da0825dBf89A2B755E20b35f39fF455B086;
address constant UNPAUSER = 0xf0700ccbf77F05CB1bDB6b9EdbEc6B0d33214f07;
address constant TREASURY = address(0); // TODO: Treasury address
address constant TREASURY = 0x6012dBcb4350Ab297FeB7f96D4d86258062aeB03;
Loading