Skip to content

Mainnet TEL v3 infra deployment: bridges, DVN mesh, migration contracts - #49

Merged
chasebrownn merged 5 commits into
mainfrom
deploy/token-infra-mainnet
Aug 27, 2026
Merged

Mainnet TEL v3 infra deployment: bridges, DVN mesh, migration contracts#49
chasebrownn merged 5 commits into
mainfrom
deploy/token-infra-mainnet

Conversation

@chasebrownn

@chasebrownn chasebrownn commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Summary

Completes the TEL v3 mainnet rollout on Ethereum, Base, and Polygon. All contracts deployed via CREATE3 from the admin Safe (0x6012…eB03) at identical addresses on every chain, executed as Safe MultiSend batches at nonces 1–3, and source-verified on all three explorers.

Contract Address (all chains) State
MintBurnWrapper 0x4A1c2ab0661651Ee55C41DB1239F292e00C3D149 live, holds MINTER/BURNER on TEL v3
TelcoinBridge 0x6A7E6616653e84eee0c70257eC2E3d79A4476a7e live, full peer mesh
TokenMigration 0x2703E00cAE30A7707e4d18C38f8CB6A4a40c2703 deployed paused
MigrationVault (ERC1967 proxy) 0x222213DeB441C5A9F71Df2942db431978a733333 initialized, unfunded

Changes

DVN configuration (2_ConfigureDVNs + Constants) — mainnet LayerZero security stack, verified against the LZ metadata API (standard messaging DVNs, not the lzRead variants):

  • Required: LayerZero Labs, Canary, Deutsche Telekom; Optional: Nethermind, FCAT (1-of-2) — 4 of 5 must agree on every pathway
  • Per-source-chain confirmations matching LZ defaults: Ethereum 15, Base 10, Polygon 120
  • BaseConfigureDVNs fix: receive-side ULN configs now use the source chain's confirmations (receive-side confirmations count source-chain blocks; building them from the destination's value stalls any pathway where the two differ — hidden on testnet by symmetric confs=1). Verified on-chain post-execution: all 6 pathways' send/receive configs match.

Migration deploy-paused (BaseDeployMigrationInfra) — fresh TokenMigration deploys are paused within the same MultiSend (grant PAUSER to admin → pause → grant dedicated pauser/unpauser), so migration cannot start before the coordinated launch. Admin retains PAUSER alongside the dedicated pauser. At launch, per chain: admin extends setMigrationExpiry(launch + 365d) (extend-only setter), then UNPAUSER unpauses.

deployments/*.json — the full five-contract address set for all three chains.

Verification

  • Every batch simulated (safe-utils multi-sig simulation) before broadcast; state audited on-chain after each execution: deploys at expected vanity addresses, role grants, wrapper authorization, peer mesh, ULN configs per pathway, enforced lzReceive gas (100k), migrator paused with correct legacy token per chain (canonical / PoS-bridged / official Base deployment — all 2-decimal, matching the hardcoded 1e16 multiplier), vault immutables and treasury role.
  • Source verified on all 3 explorers. Note: MigrationVault.sol pins solc 0.8.30 exactly, so the vault impl + proxy verify with 0.8.30 while the rest use 0.8.35.

Remaining (not in this PR)

Vault funding mints, launch-day expiry extension + unpause, TelcoinNetwork/NativeBridge when TN launches.

…live on eth/base/polygon

- deployments/*.json: full contract set on all three chains — MintBurnWrapper
  0x4A1c…D149, TelcoinBridge 0x6A7E…6a7e, TokenMigration 0x2703…2703 (deployed
  paused), MigrationVault 0x2222…3333, alongside TelcoinV3 0x7E13…0731. All
  source-verified on Etherscan/Basescan/Polygonscan.
- BaseDeployBridges: split each chain's deployment into two consecutive-nonce
  proposals (initcode-heavy deploys separate from config/role calls) so the
  EIP-712 payload stays within hardware-wallet signing memory. Config proposal
  falls back to the first free nonce when deploys are already on-chain.
…exts

Foundry 1.8.0 (CI is unpinned stable; 1.7.1 -> 1.8.0 since the last main run)
changed remapping auto-detection so files inside forge-deploy-utils and
safe-utils resolve forge-std/ to their own vendored copies (v1.16.1 / v1.9.6)
instead of the repo's lib/forge-std (v1.11.0). Two source paths for VmSafe
make its enums distinct types, breaking every vm.isContext() call site.
Explicit context remappings restore the single-copy resolution the build has
always effectively used.
The split never fixed hardware-wallet signing - the deploy batch alone still
carries the bridge initcode, which exceeds the device memory cap under the
Safe UI's EIP-712 flow regardless of batching. Hash-based co-signing
(safe-cosigner) is the actual fix, and the executed mainnet deployments used
the original single 9-txn batches, so this restores the code to match what
ran.
@chasebrownn
chasebrownn requested review from Huwonk and grantkee August 27, 2026 19:40
@chasebrownn chasebrownn self-assigned this Aug 27, 2026

@Huwonk Huwonk left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@chasebrownn
chasebrownn merged commit 5805083 into main Aug 27, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants