The network explained for total beginners — with the exact code receipts folded in for the blockchain wizards. Read the plain part, or expand “Under the hood” for the source.
TL;DR: VoiceBan is a sovereign Layer-1 — its own independent blockchain. It was built with the Polkadot SDK (a toolkit), but it does not run on the Polkadot network, and it is not a parachain.
The word "Polkadot" means two different things, and mixing them causes most of the confusion:
① Polkadot the network — an actual live blockchain. ② Polkadot the SDK (Substrate) — a free toolkit for building your own blockchain. VoiceBan used the toolkit to build a brand-new, standalone chain. Think of it like using a car-factory's tools to build your own car — you're not driving their car.
The runtime is declared a solochain (not a parachain):
// runtime/src/configs/system.rs:62 #[derive_impl(frame_system::config_preludes::SolochainDefaultConfig)]
It runs its own consensus — BABE (block production) + GRANDPA (finality) via sc_consensus_babe / sc_consensus_grandpa (node/src/service.rs). There is no cumulus_pallet_parachain_system, parachain_info, or register_validate_block anywhere in the runtime — so it needs no relay chain. Deps come from VoiceBan's own forks: github.com/VoiceBan/polkadot-sdk & /frontier.
0x — since day oneTL;DR: Your account is a normal Ethereum 0x… address, so MetaMask works. It was never a Polkadot 5… account that got "converted" — it's been 0x from genesis. The 5… you saw in Polkadot.js is just that tool mis-labelling the same address.
VoiceBan chose Ethereum-style accounts from the very first block. That's why any 0x wallet — MetaMask, or the Ethereum account in Talisman/SubWallet — holds VBAN natively.
Why the old Polkadot.js portal showed a 5… account: that's a generic Substrate tool. It assumes every chain uses Polkadot's 5… format and re-encodes the same bytes into a 5… string. It's a display quirk of that tool — not VoiceBan's real address format. (It's exactly why we built our own explorer.)
// primitives/runtime-primitives/src/lib.rs:37
pub type Signature = fp_account::EthereumSignature;
pub type AccountId = <<Signature as Verify>::Signer
as IdentifyAccount>::AccountId; // → AccountId20 (H160)
// runtime/src/configs/system.rs type AccountId = AccountId; // 20-byte type Lookup = IdentityLookup<AccountId>; // address IS the account — no ss58 indices
Genesis endows 20-byte H160 literals (not 32-byte ss58 keys):
// runtime/src/genesis_config_presets.rs:71+
AccountId::from(hex_literal::hex!("e04cc55ebee1cbce552f250e85c57b70b2e2625b"))
SS58Prefix = 42 exists but is a vestigial Substrate constant; user accounts are H160. No migration ever happened — it's H160 from genesis.
TL;DR: VBAN is the chain's own base currency (like ETH is to Ethereum), held directly by the protocol. It is not a token sitting in a smart contract.
An ERC-20 is a token created by a contract on top of an existing chain (like USDC on Ethereum). VBAN is the opposite: it's the native coin of its own chain — the thing you pay gas with and stake. MetaMask shows it as the network's native currency, not as a contract token.
// runtime/src/configs/balances.rs
use runtime_primitives::currency::{Balance, VBAN};
pub const ExistentialDeposit: Balance = VBAN;
impl pallet_balances::Config for Runtime { … } // native balances
// runtime/src/configs/system.rs
type AccountData = pallet_balances::AccountData<Balance>;
// runtime/src/configs/evm.rs:57
type Currency = Balances; // EVM gas spends the SAME native VBAN
// primitives/.../currency.rs pub type Balance = u128; pub const VBAN: Balance = 1_000_000_000_000_000_000; // 18 decimals (wei-style)
VBAN lives in pallet_balances as the chain's native unit. No ERC-20 contract is involved.
TL;DR: VoiceBan is a "Frontier" chain — a Substrate blockchain with a full Ethereum engine built in. Same chain, two doors: a Substrate wss RPC and an Ethereum eth_* RPC. MetaMask uses the Ethereum door. EVM chain id is 9956.
This is why the same network answers both Polkadot-style apps (via wss) and Ethereum tools like MetaMask, ethers, Hardhat (via eth_*). It's one chain wearing both interfaces.
The runtime configures the full Frontier stack — pallet_evm, pallet_ethereum, pallet_base_fee (configs/evm.rs) — and the node exposes standard eth_* / net_* / web3_* JSON-RPC via fc_rpc / fc_db (node/src/eth.rs).
// runtime/src/configs/evm.rs:61 type ChainId = ConstU64<9956>; // "vban custom chain id" (MetaMask network id)
The Substrate side (BABE/GRANDPA state, staking, extrinsics) is served over the native JSON-RPC / WebSocket that Polkadot.js speaks. Both hit the same state.
5… keys are validator machinery, not walletsTL;DR: The 5… keys you sometimes see are consensus keys that nodes use to produce and finalize blocks. They hold no user funds. Your money lives on your 0x account.
Validators use special keys — BABE (to produce blocks) and GRANDPA (to finalize them) — which happen to be in the 5… format. They're the engine of the network, completely separate from the 0x wallet that holds coins.
// runtime/src/lib.rs — impl_opaque_keys!
pub struct SessionKeys { babe, grandpa, im_online, authority_discovery, ipfs_address }
GRANDPA = ed25519; BABE / AuthorityDiscovery / ImOnline = sr25519 — the crypto that renders as 5…. They're derived on sub-paths (//babe, //grandpa…) and inserted into the node keystore to sign blocks & finality (node/src/session_keys.rs). The validator's spendable account is derived on the Ethereum path → an 0x H160. Consensus keys ≠ user accounts.
| Chain type | Sovereign Layer-1 · solochain (not a parachain) |
|---|---|
| Framework | Polkadot SDK (Substrate) + Frontier EVM |
| Account model | Ethereum AccountId20 (20-byte 0x), IdentityLookup |
| Signatures | ECDSA — fp_account::EthereumSignature |
| Native coin | VBAN · 18 decimals (10^18 wei) · in pallet_balances |
| Token standard? | None — native coin, not ERC-20 |
| EVM chain ID | 9956 |
| Consensus | BABE (production) + GRANDPA (finality) · ~6s blocks |
| RPC | Substrate wss + Ethereum eth_* (Frontier) |
| Public RPC | wss://explorer.voiceban.com/rpc |
| vs Polkadot | Built with the SDK · not on the Polkadot network · no relay chain |
| The claim | The reality |
|---|---|
| "VBAN is an ERC-20 token" | No. It's the native coin of its own chain (pallet_balances), like ETH to Ethereum. |
| "The account was changed from Polkadot to Ethereum" | No. It's been Ethereum 0x (H160) since genesis — no conversion ever happened. |
| "VoiceBan was created on Polkadot" | No. It's a sovereign chain built with Polkadot's SDK — not on the Polkadot network, not a parachain. |
"The 5… account holds my VBAN" | No. 5… = validator consensus keys. Funds live on 0x accounts. |