Exavolt Chain
Developer Reference
Complete technical reference for Exavolt Chain — a Layer-1 DePIN blockchain (Chain ID 188188). EVM-compatible, CometBFT consensus, native token EXVT. Deploy contracts with standard Solidity tooling.
01Quick Start
Get connected to Exavolt Chain in under 60 seconds.
Add to MetaMask (one-click)
Open your browser console or use the button on exavolt.io:
await window.ethereum.request({
method: 'wallet_addEthereumChain',
params: [{
chainId: '0x2DF1C', // 188188 in hex
chainName: 'Exavolt',
nativeCurrency: {
name: 'Exavolt',
symbol: 'EXVT',
decimals: 18
},
rpcUrls: ['https://rpc.exavolt.io'],
blockExplorerUrls: ['https://explorer.exavolt.io']
}]
});
Deploy a contract (Remix)
Exavolt Chain is EVM-compatible. Any Solidity contract works — with one constraint: always compile with EVM Version: paris (not Shanghai/Cancun). The node's go-ethereum fork does not implement MCOPY (opcode 0x5e).
Compiling with shanghai, cancun, or later EVM targets generates MCOPY opcodes that cause invalid opcode reverts on Exavolt nodes. Set EVM Version to paris in Remix → Advanced Compiler Settings before every deploy.
Recommended compiler settings
Solidity: 0.8.34 EVM Version: paris // REQUIRED — never shanghai/cancun Optimization: true Runs: 200 License: GPL-3.0
Gas
Exavolt gas is ultra-cheap. Use --gas-prices 7aexvt in CLI. For deploys and heavy transactions, set a manual gas limit (the node's --gas auto estimation sometimes under-estimates for new accounts).
# Token transfer (safe minimum) exavoltd tx bank send FROM TO AMOUNT aexvt \ --gas-prices 7aexvt --gas 300000 # Submit gov proposal exavoltd tx gov submit-proposal proposal.json \ --from DEV --gas-prices 7aexvt --gas 400000 # Note: --gas auto often under-estimates. Use fixed values above.
02Network Configuration
| Parameter | Value |
|---|---|
| Network Name | Exavolt |
| Chain ID (EVM) | 188188 0x2DF1C |
| Chain ID (Cosmos) | exavolt_188188-1 |
| Native Currency | EXVT (18 decimals) |
| Base denom | aexvt (1 EXVT = 10¹⁸ aexvt) |
| RPC (public) | https://rpc.exavolt.io |
| Block Explorer | https://explorer.exavolt.io |
| EVM binary | go-ethereum fork v1.10.26-evmos-rc4 |
| Consensus | CometBFT v0.37.3 (Tendermint BFT) |
| SDK | Cosmos SDK v0.47.x |
| Finality | ~3 seconds (deterministic) |
| Block gas limit | 50,000,000 (via Gov Proposal #1, active ~26 Jun 2026) |
| Total supply | 1,000,001,000 EXVT (fixed, inflation disabled) |
| Genesis time | 2026-06-19T10:48:09Z |
03ExavoltRegistry
The canonical on-chain directory of all official Exavolt contracts. Query it to verify any contract address before interacting. Always check here — not social media or third-party sites.
All string return types replaced with bytes32. This fixes MCOPY opcode failures (Bug #1) present in v1.1.0. When reading bytes32 fields off-chain, use ethers.utils.parseBytes32String() or trim null bytes.
Read functions
// Check if an address is an official Exavolt contract bool ok = registry.isOfficialContract(contractAddress); // Get list of all registered contract addresses address[] memory all = registry.getAllContracts(); // Verify a specific contract (ethers.js) const registry = new ethers.Contract( '0x537b27829b4112F638b9aA6793a3Eb5F96088089', ['function isOfficialContract(address) view returns (bool)'], provider ); const isOfficial = await registry.isOfficialContract(targetAddr);
Currently registered contracts
| Contract | Address | Status |
|---|---|---|
| ExavoltRegistry v1.2.0 | 0x537b...8089 | ✓ LIVE |
| WEXVT | 0xBDFD...D205 | ✓ LIVE |
| MockUSDT (test) | 0xf931...8332 | ✓ LIVE |
| ExavoltSwapFactory v2 | 0xcA1F...4784 | ✓ LIVE |
| ExavoltSwapRouter v7 | 0x7a41...8429 | ✓ LIVE |
| ExavoltSwapPair v2 | 0x4F7F...8485 | ✓ LIVE |
| ExavoltUSDT v2 | 0x4B17...6bc9 | ✓ LIVE |
| ExavoltMultiSig 2-of-3 | 0xa660...38a4 | ✓ LIVE |
| ExavoltUSDT v1 | 0xdDb0...Ab96 | DEACTIVATED |
04ExavoltSwap DEX
Uniswap v2–style AMM deployed natively on Exavolt Chain. All three contracts are verified and registered. Current pool: WEXVT/MockUSDT.
Token addresses
| Token | Address | Decimals |
|---|---|---|
| WEXVT (Wrapped EXVT) | 0xBDFD33fa695B4eaA293EAFca64FB8A2f4F5eD205 | 18 |
| MockUSDT (test) | 0xf931649fbE867e84Bf8a5efaec6d8Bb629F98332 | 6 |
Never hardcode the deadline parameter in swap calls. Always compute it dynamically: block.timestamp + 1200 (20 min buffer). Hardcoded deadlines cause EXPIRED reverts when blocks are included after the timestamp.
04aSwapping Tokens
Token → Token swap
const ROUTER = '0x7a41B26e1b4915F35E39b459737bA2Cd9c7e8429'; const WEXVT = '0xBDFD33fa695B4eaA293EAFca64FB8A2f4F5eD205'; const MUSDT = '0xf931649fbE867e84Bf8a5efaec6d8Bb629F98332'; const router = new ethers.Contract(ROUTER, routerABI, signer); // 1. Approve router to spend WEXVT await wexvt.approve(ROUTER, amountIn); // 2. Swap WEXVT → mUSDT const deadline = Math.floor(Date.now() / 1000) + 1200; // +20 min await router.swapExactTokensForTokens( amountIn, amountOutMin, // use getAmountsOut for accurate estimate [WEXVT, MUSDT], recipientAddress, deadline );
Native EXVT → Token swap
// No approve needed — EXVT wraps internally await router.swapExactETHForTokens( amountOutMin, [WEXVT, MUSDT], // path must start with WEXVT recipient, deadline, { value: amountIn } // send EXVT as msg.value );
04bProviding Liquidity
// 1. Approve both tokens await wexvt.approve(ROUTER, amountA); await musdt.approve(ROUTER, amountB); // 2. Add liquidity await router.addLiquidity( WEXVT, MUSDT, amountADesired, amountBDesired, amountAMin, amountBMin, recipient, deadline ); // 3. Remove liquidity await lpToken.approve(ROUTER, lpAmount); await router.removeLiquidity( WEXVT, MUSDT, lpAmount, amountAMin, amountBMin, recipient, deadline );
05Bridge — ExavoltUSDT (eUSDT)
Lock tUSDT on Sepolia → mint eUSDT on Exavolt. The bridge is testnet-only. Minting requires 2-of-3 multisig approval via ExavoltMultiSig.
Contract addresses
The bridge maintains eUSDT.totalSupply() == LockVault.totalLocked() at all times. Both values are publicly readable on-chain. 1 eUSDT is always backed by exactly 1 tUSDT locked in LockVault.
05aBridge — Deposit (Lock → Mint)
Approve tUSDT (Sepolia)
On Sepolia, call tUSDT.approve(LockVault, amount). Amount in 6-decimal units (e.g. 100000000 = 100 tUSDT).
Lock tUSDT (Sepolia)
Call LockVault.lock(tUSDT_address, amount). This transfers tUSDT from your wallet into the vault and emits a Locked event with your address and amount.
Controller verifies & mints (Exavolt Chain)
The bridge controller (ExavoltMultiSig 2-of-3) verifies the Locked event on Sepolia. Two signers must submitTransaction and confirmTransaction a mint(to, amount) call on ExavoltUSDT v2. Upon 2nd confirmation, eUSDT is minted to your address on Exavolt Chain.
05bBridge — Withdraw (Burn → Unlock)
Burn eUSDT (Exavolt Chain)
Call ExavoltUSDT.burn(amount) directly from your wallet. This is permissionless — no approval needed. Your eUSDT is destroyed and a Burned event is emitted.
Controller verifies Burn event
The bridge controller (ExavoltMultiSig) verifies the Burned event on Exavolt Chain.
Unlock tUSDT (Sepolia)
The controller calls LockVault.approveUnlock(tUSDT, recipient, amount) on Sepolia. Your tUSDT is released back to your wallet.
06ExavoltMultiSig
Native 2-of-3 multisig on Exavolt Chain. Controls minting of ExavoltUSDT v2. Any 2 of 3 signers must approve before an operation executes.
Core flow
// Signer 1: submit a transaction uint256 txId = multisig.submitTransaction( target, // contract to call value, // EXVT to send (usually 0) data // ABI-encoded calldata ); // → signer 1 auto-confirms. If threshold == 1, auto-executes. // Signer 2: confirm → triggers auto-execute when threshold reached multisig.confirmTransaction(txId); // Before executing: revoke if needed multisig.revokeConfirmation(txId);
Generate calldata for mint
// Use the built-in helper (pure function, free to call) bytes memory calldata = multisig.encodeMint( recipientAddress, // who receives eUSDT 100000000 // amount (6 decimals: 100000000 = 100 eUSDT) ); // Pass this as `data` param in submitTransaction // target = ExavoltUSDT v2 address: 0x4B1780BfE7751c2f6387E522F2A9c71Bb5276bc9
07RPC & Explorer API
JSON-RPC endpoint
Standard Ethereum JSON-RPC. Compatible with ethers.js, web3.js, viem, wagmi, Hardhat, Foundry.
# Block number curl -s https://rpc.exavolt.io \ -X POST -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' # Chain ID curl -s https://rpc.exavolt.io \ -X POST -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' # → 0x2DF1C (188188) # Get balance (in aexvt, divide by 1e18 for EXVT) curl -s https://rpc.exavolt.io \ -X POST -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xYOUR_ADDRESS","latest"],"id":1}'
Explorer API (Blockscout)
# Chain stats (blocks, txns, addresses, gas) curl https://explorer.exavolt.io/api/v2/stats # Address info curl https://explorer.exavolt.io/api/v2/addresses/0xADDRESS # Address token balances curl https://explorer.exavolt.io/api/v2/addresses/0xADDRESS/token-balances # Transaction list curl https://explorer.exavolt.io/api/v2/transactions?filter=validated # Block by number curl https://explorer.exavolt.io/api/v2/blocks/161341
Consensus params (CometBFT)
# Check current block gas limit and other consensus params
curl -s https://rpc.exavolt.io/consensus_params | python3 -m json.tool
08MetaMask Setup
Manual setup if the one-click button doesn't work:
Open MetaMask → Networks → Add a network
Click the network selector at the top of MetaMask, then "Add network" → "Add a network manually".
Fill in the fields
| Network Name | Exavolt |
| RPC URL | https://rpc.exavolt.io |
| Chain ID | 188188 |
| Currency Symbol | EXVT |
| Block Explorer | https://explorer.exavolt.io |
Save & switch
Click Save. MetaMask will switch to Exavolt Chain. Your EXVT balance will appear once the node syncs your address.
09Governance
Exavolt uses Cosmos SDK on-chain governance (x/gov). Consensus parameters (like block gas limit) are managed via x/consensus module proposals.
Gov Proposal #1 — Gas Limit
| Field | Value |
|---|---|
| Proposal ID | 1 |
| Type | cosmos.consensus.v1.MsgUpdateParams |
| Change | block.max_gas: -1 (unlimited) → 50000000 |
| Submit height | 145902 |
| Voting period | 48 hours |
| Min deposit | 1,000 EXVT |
# Submit proposal (JSON file) exavoltd tx gov submit-proposal proposal.json \ --from YOUR_KEY \ --keyring-backend test \ --chain-id exavolt_188188-1 \ --gas-prices 7aexvt \ --gas 400000 # Vote yes exavoltd tx gov vote PROPOSAL_ID yes \ --from YOUR_KEY \ --keyring-backend test \ --chain-id exavolt_188188-1 \ --gas-prices 7aexvt \ --gas 250000 # Check tally exavoltd query gov tally PROPOSAL_ID
10Tokenomics
Fixed supply of 1,000,001,000 EXVT. Inflation permanently disabled at genesis (enable_inflation: false). No new EXVT will ever be minted.
| Wallet | Allocation | % |
|---|---|---|
| Ecosystem | 300,000,000 EXVT | 30% |
| Rewards Pool | 250,000,000 EXVT | 25% |
| Development | 200,000,000 EXVT | 20% |
| Team | 150,000,000 EXVT | 15% |
| Reserve | 100,000,000 EXVT | 10% |
| Validator (staked) | 1,000 EXVT | <0.01% |
11Developer Principles
Known constraints of the Exavolt Chain node. Follow these to avoid common failures.
The node's go-ethereum fork (v1.10.26-evmos-rc2) does not implement opcode 0x5e (MCOPY), despite genesis claiming Cancun active. Any Solidity function that returns a string type, or compiled with EVM target shanghai+, will emit MCOPY and fail with invalid opcode. Always use EVM target paris and return bytes32 instead of string.
Pattern token.call(abi.encodeWithSignature("transfer(address,uint256)", to, amount)) with abi.decode triggers invalid opcode on this node. Always use a typed interface (e.g. IERC20(token).transfer(to, amount)). This was the root cause of DEX swap failures in ExavoltSwap v1.
Always update state variables before making external calls. This is standard Solidity best practice and especially important here — external call failures after state changes can leave contracts in inconsistent states.
Quick checklist before deploying
✅ EVM Version set to paris (not shanghai/cancun/osaka) ✅ No string return types → use bytes32 ✅ No raw call + abi.encodeWithSignature → use typed interface ✅ Checks-Effects-Interactions pattern throughout ✅ MetaMask on network 188188 (not Sepolia) ✅ Deadline param computed dynamically (block.timestamp + buffer) ✅ Gas set manually for important txs (300000-400000 safe range)
12Security
Exavolt Foundation will never DM you first, ask for your private key or seed phrase, or ask you to send EXVT to "verify" your wallet. The only official contract registry is ExavoltRegistry at 0x537b27829b4112F638b9aA6793a3Eb5F96088089. Always verify contract addresses against this registry before sending funds or approving transactions.
Bridge security model
| Property | Implementation |
|---|---|
| Mint authorization | ExavoltMultiSig 2-of-3 — two independent signers required |
| Burn | Permissionless — any holder can burn their own eUSDT |
| Controller upgrade | Immutable — requires full redeployment of ExavoltUSDT |
| Proof-of-reserve | eUSDT.totalSupply() == LockVault.totalLocked() — verifiable on-chain |
| No owner privilege | bridgeController can only mint — cannot burn, pause, transfer funds, or drain user balances |
Multisig security
ExavoltMultiSig signers use 3 independent browsers with 3 separate seed phrases (Brave, Edge, Firefox). Owner management functions (addOwner, removeOwner, changeRequirement) require consensus of the multisig itself — no single signer can make unilateral changes.
"Code does not lie and can be verified by anyone." All deployed contracts are verified on explorer.exavolt.io. Source code is publicly readable. The proof-of-reserve invariant is always queryable. Do not trust — verify.
13Add Exavolt to MetaMask
Follow these steps to connect MetaMask to Exavolt Chain. You only need to do this once.
Open MetaMask
Click the MetaMask extension icon in your browser. If you don't have MetaMask, download it from metamask.io (official site only).
Add Network Manually
Click the network dropdown at the top → Add a custom network → fill in the fields below:
| Field | Value |
|---|---|
| Network Name | Exavolt |
| New RPC URL | https://rpc.exavolt.io |
| Chain ID | 188188 |
| Currency Symbol | EXVT |
| Block Explorer URL | https://explorer.exavolt.io |
Save and Switch
Click Save. MetaMask will automatically switch to Exavolt Chain. You should see EXVT as your balance currency.
Verify You're on the Right Network
Check that MetaMask shows Chain ID: 188188. You can also verify by visiting explorer.exavolt.io — your wallet address should appear correctly.
The only official RPC endpoint is https://rpc.exavolt.io. Do not use RPC endpoints from unknown sources — they could return manipulated data.
14How to Swap Tokens
ExavoltSwap is the native DEX on Exavolt Chain. Access it at swap.exavolt.io.
Open ExavoltSwap
Go to swap.exavolt.io. Make sure you are on this exact domain — bookmark it to avoid phishing sites.
Connect Wallet
Click Connect Wallet at the top right. If MetaMask is not on Exavolt Chain (ID 188188), the UI will prompt you to switch automatically.
Select Tokens and Amount
Choose the token you want to swap from and to. Enter the amount — the output estimate will appear automatically based on current pool reserves.
Approve and Swap
If swapping an ERC-20 token (WEXVT or mUSDT), you first need to Approve the router to spend your tokens. After approval, click Swap and confirm in MetaMask.
Confirm Transaction
MetaMask will show a gas fee estimate. Confirm the transaction. It will be finalized in ~3 seconds. You can track it on explorer.exavolt.io.
Current trading pairs: EXVT ↔ mUSDT, WEXVT ↔ mUSDT, EXVT ↔ WEXVT. Slippage tolerance can be set to 0.1%, 0.5%, or 1% in the Swap panel.
Wrap / Unwrap EXVT
Native EXVT can be wrapped to WEXVT (ERC-20) for use in DEX liquidity pools. Use the Wrap / Unwrap tab in ExavoltSwap. Conversion is always 1:1 with no fee.
15How to Bridge (eUSDT)
The Exavolt Bridge allows you to move USDT from Ethereum to Exavolt Chain as eUSDT, and back. The bridge uses a lock-mint model with 1:1 proof-of-reserve.
The bridge is currently in testnet phase (Sepolia ↔ Exavolt Chain). Mainnet bridge (Ethereum Mainnet ↔ Exavolt) will be available in a future release. This documentation describes the flow that will apply to mainnet.
Deposit: Ethereum → Exavolt (Lock → Mint)
Approve USDT
On Ethereum, approve the LockVault contract to spend your USDT. Minimum deposit: 1 USDT.
Lock USDT
Call lock(amount) on LockVault. Your USDT is locked in the vault. A Locked event is emitted on-chain.
Multisig Verification
The bridge controller (Gnosis Safe 2-of-3) verifies the lock event. Two of three signers must approve before minting proceeds.
Receive eUSDT on Exavolt
After multisig approval, an equivalent amount of eUSDT is minted to your address on Exavolt Chain. Check your balance on explorer.exavolt.io.
Withdraw: Exavolt → Ethereum (Burn → Unlock)
Burn eUSDT
On Exavolt Chain, burn your eUSDT. This is permissionless — any holder can burn their own tokens.
Multisig Approves Unlock
The bridge controller verifies the burn. Two of three signers approve the unlock. This creates an on-chain approval with a 7-day expiry.
Claim USDT on Ethereum
Call unlock(nonce) on LockVault within 7 days. Your USDT is released back to your Ethereum wallet.
At all times: eUSDT.totalSupply() == LockVault.totalLocked(). This is verifiable on-chain by anyone. Call proofOfReserve() on LockVault to get a real-time 3-value report: locked, actual balance, and isFullyBacked.
16Stay Safe
Exavolt will never DM you first. We will never ask for your private key, seed phrase, or ask you to send EXVT to "verify" anything. If someone claiming to be Exavolt contacts you first — it is a scam.
Official links — bookmark these
| Service | Official URL |
|---|---|
| Website | https://exavolt.io |
| Documentation | https://docs.exavolt.io |
| DEX / Swap | https://swap.exavolt.io |
| Explorer | https://explorer.exavolt.io |
| RPC | https://rpc.exavolt.io |
How to verify a contract is official
Query the ExavoltRegistry on-chain:
const registry = new ethers.Contract( '0x537b27829b4112F638b9aA6793a3Eb5F96088089', ['function isOfficialContract(address) view returns (bool)'], provider ); const isOfficial = await registry.isOfficialContract(suspectAddress); // true = official Exavolt contract // false = NOT official — do not interact
Anyone can create a token called "EXVT" on other chains (BSC, Solana, etc.). These are not affiliated with Exavolt Chain. The real EXVT is the native gas token of Chain ID 188188 — it cannot be created on another chain.