Account Model
Addresses, EOAs, contracts · Estimated read time: 5 minutes
TL;DR
Valdium uses an account model (not UTXO), in the Ethereum account-model family. Addresses are 20 bytes, rendered as 0x-prefixed hex strings (the Ethereum address format). Two kinds of accounts exist: externally-owned accounts (EOAs, controlled by a Dilithium3 keypair) and contracts (controlled by deployed JavaScript code). Every account has a balance and a nonce.
Address format
Addresses are 20 bytes, presented as 40 lowercase hex characters with a 0x prefix. Example:
0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B
A wallet that honours the checksum verifies the mixed-case digest and rejects addresses where the case doesn't match — which catches most transcription errors.
Address derivation
address = BLAKE3(pubkey)[0:20]
The pubkey is a Dilithium3 (ML-DSA-65) public key — around 1.9 KB. We hash with BLAKE3 and take the first 20 bytes. Ethereum uses blake3(pubkey)[12:32] — same 20-byte size, different hash, different slice. Addresses are not interoperable across chains.
Contract addresses are derived as BLAKE3(deployer_address || deployment_nonce)[0:20] — deterministic and pre-computable before deploy.
EOA vs contract
- Externally-owned account (EOA) — holds VLD, signs transactions with a Dilithium3 keypair. No code. This is what a wallet like the Valdium desktop app or CLI manages for you.
- Contract account — holds VLD, has code (JavaScript source), has storage. Cannot initiate transactions, but can be called by EOAs or by other contracts via async message-passing. Source is stored on-chain and accessible via
eth_getCode.
From outside, they look the same — both are 20-byte addresses with balances. The explorer distinguishes them by whether getCode returns a non-empty body.
Nonces
Every EOA has a nonce — a sequential transaction counter. Every signed transaction includes the sender's current nonce. The chain rejects a tx if the nonce is lower than the account's current nonce (replay attempt) or skips in the sequence. Nonces make transactions replay-safe.
Balances
Balances are stored in wei — 10⁻¹⁸ VLD. Every balance and every value in a transaction is a 256-bit unsigned integer. There are no fractional wei.
1 VLD = 1,000,000 wei. Six decimals, the Ethereum ERC-20 standard (same as USDC). Use parseVld / formatVld from the SDK to convert.
No HD derivation in v1
Ethereum wallets use BIP-32 HD derivation over secp256k1 to generate arbitrary numbers of accounts from a single seed. There is no production-ready BIP-32 equivalent for Dilithium3 yet.
In v1 we treat each account as an independent keypair. The Valdium wallet and CLI support multiple accounts inside one vault by storing independent Dilithium3 secret keys, each encrypted under the same master password.