This repository contains the contracts and backend/operator tooling for a fresh Telos Zero <> Telos EVM asset bridge.
Target MVP assets:
- Telos EVM
USDC.e-> fresh Telos ZeroZUSDC - Telos EVM
USDT-> fresh Telos ZeroZUSDT - Telos EVM
WBTC-> fresh Telos ZeroZWBTC - Telos Zero
EMPIRES-> Telos EVMwEMPIREStest asset
The bridge is designed around the fact that Telos Zero and Telos EVM share the same underlying chain. Relayers are treated as liveness/UX helpers, not trusted oracles.
Built now:
- EVM escrow and registry contracts with Foundry tests.
- Native Telos Zero asset contract for fresh bridge assets.
- Native Telos Zero bridge contract with
eosio.evm::accountstateproof verification for EVM-to-Zero deposits and permissionless native dispatch for Zero-to-EVM releases througheosio.evm::raw. - Node operator tools for reconciliation, EVM event scanning, signed Telos Zero request processing, and permissionless Zero-to-EVM relay triggering.
- Production spec in
zero-evm-bridge-production-spec.md. - Testnet MVP runbook in
docs/testnet-mvp-runbook.md.
The UI integration lives separately in the Telos Bridge v3 frontend branch.
Testnet live now:
- Native bridge is deployed on Telos testnet with
dev_mode = false. - EVM bridge is deployed with
zeroBridgeset to the bridge account's linked EVM address. - Zero-to-EVM release is driven through
relayztoeandeosio.evm::raw; no reusable EVM relayer private key is needed. - Hosted testnet relayer uses
tbrgrelay111@bridgeops, a finite liveness permission linked to the bridge proof/relay actions.
Remaining production gates:
- Mainnet ownership/admin must be handed to a large governance MSIG, not a single signer or developer-held account.
- Mainnet deployment must repeat the linked bridge-account EVM sender setup under MSIG control.
- External pass-through routes, such as Zero -> Telos EVM -> Base, are intentionally outside the MVP.
Path: evm
Contracts:
BridgeRegistry: asset pair registry, limits, pause state.EvmEscrowBridge: escrow deposits from Telos EVM users and release escrowed tokens for validated Zero burns.
Run:
cd evm
forge test -vvvPath: contracts/native
Contracts:
zero.asset: minimal fresh asset contract.zero.bridge: Zero-side burn/request tracker plusproveetoz, which verifies fixed EVM proof slots fromeosio.evm::accountstate, andrelayztoe, which dispatches validated releases througheosio.evm::raw.
Build requires Antelope CDT. On macOS, use the Docker helper:
cd contracts/native
../../scripts/build-native-docker.shThe verified local build produced zero.asset.wasm, zero.asset.abi, zero.bridge.wasm, and zero.bridge.abi in contracts/native/build.
Path: relayer
Tools:
npm testnode src/reconcile.js src/config.local.jsonnode src/scan-evm-requests.js src/config.local.jsonnode src/process-evm-requests.js src/config.local.json --dry-runZERO_RELAYER_PRIVATE_KEY=... node src/process-evm-requests.js src/config.local.jsonZERO_RELAYER_PRIVATE_KEY=... npm run process:evm:watchnode src/process-zero-requests.js src/config.local.json --dry-runZERO_TO_EVM_RELAYER_PRIVATE_KEY=... node src/process-zero-requests.js src/config.local.json --request-id <id>ZERO_TO_EVM_RELAYER_PRIVATE_KEY=... npm run process:zero:watch
Copy src/config.example.json for testnet deployments. src/config.telos-mainnet-assets.example.json records the current Telos EVM asset addresses for the target mainnet asset set.
EVM to Zero:
- User calls
EvmEscrowBridge.depositToZero(pairId, amount, zeroReceiver). - EVM asset is escrowed.
- Contract emits
EvmToZeroRequested. - Any relayer submits
zero.bridge::proveetozwith the request hash, receiver, amount, and EVM sender. zero.bridgereads the EVM bridge storage fromeosio.evm::accountstateand issues fresh Zero assets only if the proof fields match.
Zero to EVM:
- User signs a Telos Zero transfer of
ZUSDC,ZUSDT,ZWBTC, orEMPIREStozero.bridgewith the EVM receiver address in the memo. zero.bridgerecords the burn request and burns the bridge asset.- Any relayer calls
zero.bridge::relayztoe(request_id). zero.bridgeverifies the burn row, replay state, limits, and finality, then callseosio.evm::rawfrom the bridge account's linked EVM address to executereleaseToEvm.- The relayer key only pays to submit
relayztoe; it is not trusted to release or redirect funds.
- Instant finality is live and stable on testnet.
- Native verification can prove EVM escrow records from Telos Zero on testnet with
dev_mode = false. - EVM release path is driven by
relayztoeand a linked bridge-account EVM sender, with no reusable EVM relayer private key. - Hosted relayers use a finite native permission such as
bridgeops, linked only tozero.bridge::proveetozandzero.bridge::relayztoe. - Admin/owner authorities are controlled by the production governance MSIG, with separate narrow emergency pause permissions.
- Daily limits, pause controls, and recovery procedures are reviewed.
- End-to-end testnet runs cover USDC.e, USDT, and WBTC in both directions.
- Independent audit covers EVM Solidity, native C++, permissions, and replay protection.