Documentation

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.

ChainLIVE — Block height advancing
Explorerexplorer.exavolt.io
RPCrpc.exavolt.io — public endpoint
Gas limit50,000,000 — Gov Proposal #1 PASSED & EXECUTED (26 Jun 2026)
DEXExavoltSwap — 6 routes tested & verified
BridgeTestnet (Sepolia↔Exavolt) — end-to-end verified
DEX UIswap.exavolt.io — LIVE

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:

javascript
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).

⚠️
EVM version: always paris

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

remix / hardhat
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).

cli
# 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

ParameterValue
Network NameExavolt
Chain ID (EVM)188188 0x2DF1C
Chain ID (Cosmos)exavolt_188188-1
Native CurrencyEXVT (18 decimals)
Base denomaexvt (1 EXVT = 10¹⁸ aexvt)
RPC (public)https://rpc.exavolt.io
Block Explorerhttps://explorer.exavolt.io
EVM binarygo-ethereum fork v1.10.26-evmos-rc4
ConsensusCometBFT v0.37.3 (Tendermint BFT)
SDKCosmos SDK v0.47.x
Finality~3 seconds (deterministic)
Block gas limit50,000,000 (via Gov Proposal #1, active ~26 Jun 2026)
Total supply1,000,001,000 EXVT (fixed, inflation disabled)
Genesis time2026-06-19T10:48:09Z
https://rpc.exavolt.io 📋 copy RPC

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.

ExavoltRegistry LIVE v1.2.0
0x537b27829b4112F638b9aA6793a3Eb5F96088089 📋
Block 90,911 Solidity 0.8.34 EVM paris Read Contract ↗
ℹ️
Key fix in v1.2.0

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

solidity / ethers.js
// 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

ContractAddressStatus
ExavoltRegistry v1.2.00x537b...8089✓ LIVE
WEXVT0xBDFD...D205✓ LIVE
MockUSDT (test)0xf931...8332✓ LIVE
ExavoltSwapFactory v20xcA1F...4784✓ LIVE
ExavoltSwapRouter v70x7a41...8429✓ LIVE
ExavoltSwapPair v20x4F7F...8485✓ LIVE
ExavoltUSDT v20x4B17...6bc9✓ LIVE
ExavoltMultiSig 2-of-30xa660...38a4✓ LIVE
ExavoltUSDT v10xdDb0...Ab96DEACTIVATED

04ExavoltSwap DEX

Uniswap v2–style AMM deployed natively on Exavolt Chain. All three contracts are verified and registered. Current pool: WEXVT/MockUSDT.

ExavoltSwapFactory v2 LIVE
0xcA1F9b3Af5420E7cCa4126E717451289CD8e4784 📋
Fee to setter ExavoltMultiSig 2-of-3feeTo Treasury
ExavoltSwapRouter v7 LIVE
0x7a41B26e1b4915F35E39b459737bA2Cd9c7e8429 📋
Use this address for all swaps
ExavoltSwapPair v2 (WEXVT/mUSDT) LIVE
0x4F7F875aEEB61d6f14ec00fa39049E2b8f7e8485 📋
Pair WEXVT / MockUSDTFee 0.30% total (0.25% LP + 0.05% Treasury)

Token addresses

TokenAddressDecimals
WEXVT (Wrapped EXVT)0xBDFD33fa695B4eaA293EAFca64FB8A2f4F5eD20518
MockUSDT (test)0xf931649fbE867e84Bf8a5efaec6d8Bb629F983326
⚠️
Deadline parameter

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

ethers.js
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

ethers.js
// 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

ethers.js
// 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

ExavoltUSDT v2 (Exavolt Chain) LIVE
0x4B1780BfE7751c2f6387E522F2A9c71Bb5276bc9 📋
Symbol eUSDTDecimals 6Controller ExavoltMultiSig (2-of-3)
LockVault (Sepolia) LIVE
0xaBd5F1e56Ee50E5f6CD12631941c3Cd1B5Bf55ec 📋
Network Ethereum SepoliaToken TestUSDT (tUSDT)
TestUSDT (Sepolia) LIVE
0x64f4F2448446037C6e6a43bD80765b5A3ceFD97c 📋
Network Ethereum SepoliaDecimals 6
ℹ️
Proof-of-reserve invariant

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)

01

Approve tUSDT (Sepolia)

On Sepolia, call tUSDT.approve(LockVault, amount). Amount in 6-decimal units (e.g. 100000000 = 100 tUSDT).

02

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.

03

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)

01

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.

02

Controller verifies Burn event

The bridge controller (ExavoltMultiSig) verifies the Burned event on Exavolt Chain.

03

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.

ExavoltMultiSig 2-of-3 LIVE v1.1.0
0xa660B8DD5b85E9fe72AE684C30970C60217C38a4 📋
Threshold 2-of-3 Block 160,503 Source ↗

Core flow

solidity
// 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

remix / solidity
// 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

https://rpc.exavolt.io 📋 copy

Standard Ethereum JSON-RPC. Compatible with ethers.js, web3.js, viem, wagmi, Hardhat, Foundry.

bash — common calls
# 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)

https://explorer.exavolt.io/api/v2 📋 copy
bash — blockscout v2 api
# 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)

bash
# 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:

01

Open MetaMask → Networks → Add a network

Click the network selector at the top of MetaMask, then "Add network" → "Add a network manually".

02

Fill in the fields

Network NameExavolt
RPC URLhttps://rpc.exavolt.io
Chain ID188188
Currency SymbolEXVT
Block Explorerhttps://explorer.exavolt.io
03

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

Proposal #1 — Set block.max_gas to 50,000,000PASSED ~26 Jun 2026
FieldValue
Proposal ID1
Typecosmos.consensus.v1.MsgUpdateParams
Changeblock.max_gas: -1 (unlimited) → 50000000
Submit height145902
Voting period48 hours
Min deposit1,000 EXVT
cli — submit a proposal
# 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.

WalletAllocation%
Ecosystem300,000,000 EXVT30%
Rewards Pool250,000,000 EXVT25%
Development200,000,000 EXVT20%
Team150,000,000 EXVT15%
Reserve100,000,000 EXVT10%
Validator (staked)1,000 EXVT<0.01%
Fixed supply Inflation disabled 18 decimals EVM compatible

11Developer Principles

Known constraints of the Exavolt Chain node. Follow these to avoid common failures.

🚫
No MCOPY opcode

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.

⚠️
No raw call + abi.encodeWithSignature

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.

ℹ️
Checks-Effects-Interactions

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

checklist
  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

🔴
Anti-scam

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

PropertyImplementation
Mint authorizationExavoltMultiSig 2-of-3 — two independent signers required
BurnPermissionless — any holder can burn their own eUSDT
Controller upgradeImmutable — requires full redeployment of ExavoltUSDT
Proof-of-reserveeUSDT.totalSupply() == LockVault.totalLocked() — verifiable on-chain
No owner privilegebridgeController 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.

Verify everything on-chain

"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.

1

Open MetaMask

Click the MetaMask extension icon in your browser. If you don't have MetaMask, download it from metamask.io (official site only).

2

Add Network Manually

Click the network dropdown at the top → Add a custom network → fill in the fields below:

FieldValue
Network NameExavolt
New RPC URLhttps://rpc.exavolt.io
Chain ID188188
Currency SymbolEXVT
Block Explorer URLhttps://explorer.exavolt.io
3

Save and Switch

Click Save. MetaMask will automatically switch to Exavolt Chain. You should see EXVT as your balance currency.

4

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.

⚠️
Only use official RPC

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.

1

Open ExavoltSwap

Go to swap.exavolt.io. Make sure you are on this exact domain — bookmark it to avoid phishing sites.

2

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.

3

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.

4

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.

5

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.

ℹ️
Available pairs

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.

ℹ️
Bridge status

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)

1

Approve USDT

On Ethereum, approve the LockVault contract to spend your USDT. Minimum deposit: 1 USDT.

2

Lock USDT

Call lock(amount) on LockVault. Your USDT is locked in the vault. A Locked event is emitted on-chain.

3

Multisig Verification

The bridge controller (Gnosis Safe 2-of-3) verifies the lock event. Two of three signers must approve before minting proceeds.

4

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)

1

Burn eUSDT

On Exavolt Chain, burn your eUSDT. This is permissionless — any holder can burn their own tokens.

2

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.

3

Claim USDT on Ethereum

Call unlock(nonce) on LockVault within 7 days. Your USDT is released back to your Ethereum wallet.

Proof of Reserve

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

🔴
Official channels only

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

ServiceOfficial URL
Websitehttps://exavolt.io
Documentationhttps://docs.exavolt.io
DEX / Swaphttps://swap.exavolt.io
Explorerhttps://explorer.exavolt.io
RPChttps://rpc.exavolt.io

How to verify a contract is official

Query the ExavoltRegistry on-chain:

ethers.js
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
⚠️
Copycat tokens

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.