Zero to first transaction.
Install the CLI, generate a quantum-safe wallet, claim testnet VLD from the faucet, send a transaction, and (optionally) deploy a smart contract — in roughly ten minutes. Nothing in this guide costs real money.
Prerequisites. A Unix-like terminal (macOS, Linux, or WSL on Windows). Node.js 20+ if you want to run the contract step. Nothing else.
Install the CLI
The Valdium CLI is a single static binary. Install it via the official script — it pins to the latest stable release and verifies the signature before running.
$ curl -sSL https://get.valdium.xyz | sh
Verify the install:
$ valdium --version valdium-cli 1.10.0 # testnet build, Dilithium3 enabled
Create a wallet
Generate a fresh ML-DSA-65 keypair. The seed is shown once — write it down or copy it to a password manager before pressing enter.
$ valdium wallet create Generating ML-DSA-65 (Dilithium3) keypair... Seed: 0xa1ae94e345bf...d33790c06610 Address: 0x209d8683a6b7b990820221aAD2eeCbf40C800fdf PubKey: 0x0c13cce08ee6bc55...f535d0a9ce79bd32 (1,952 bytes) # ⚠ The seed is shown only once. Lose it = lose the wallet.
Why is the pubkey so large? Dilithium3 public keys are ~1.95 KB and signatures are ~3.3 KB. That's the post-quantum tax. We engineered the block format around it from genesis — see the thesis for the trade-off discussion.
Claim testnet VLD from the faucet
The faucet hands out 100 VLD per request on testnet. Cooldown is one hour per address.
$ valdium faucet --amount 100 Requesting 100 VLD from testnet faucet... ✓ Funded in block #14,127 Tx: 0x2d5224c9...2eb055a3 Explorer Link ›
Check the balance:
$ valdium balance 100.000 VLD
Send your first transaction
Transfer some VLD to a friend or a burner address. The CLI signs with ML-DSA-65 by default — there's no "legacy mode" because the chain has no legacy.
$ valdium send 0x685a7c7a...2950724b 10 VLD Signing with ML-DSA-65... Broadcasting transaction... ✓ Confirmed in block #14,131 Tx: 0x57f7...515d6 Gas: 0.001 VLD
Transactions finalise in two blocks — about four seconds wall clock from broadcast.
Deploy a JavaScript contract (optional)
Valdium contracts are plain JavaScript files. Create a token contract — note the absence of constructors, modifiers, or anything that doesn't look like ordinary JS.
// token.js function init() { storage.name = 'DemoToken'; storage.totalSupply = '1000'; storage.balances = { [msg.sender]: '1000' }; } function transfer(to, amount) { const b = storage.balances; assert(+b[msg.sender] >= +amount, 'insuf.'); b[msg.sender] = String(+b[msg.sender] - +amount); b[to] = String(+(b[to] || '0') + +amount); emit('Transfer', { from: msg.sender, to, amount }); }
Deploy it:
$ valdium deploy token.js Deploying contract (518 bytes)... Signing with ML-DSA-65... ✓ Deployed in block #14,138 Contract: 0x3644006ba60f097f1bca3d38715cf6687f6b69dd
Call the transfer function:
$ valdium call transfer 0x685a7c7a...2950724b 250 ✓ Confirmed in block #14,141
Read the balance:
$ valdium view balanceOf 0x685a7c7a...2950724b 250
What's next
Everything above ran against testnet. The same commands work against mainnet once it launches — there is no separate "production" workflow.
- Read The Thesis for the design reasoning behind every choice above.
- Join the launch list to be told first when mainnet drops.
- Follow the devlog for weekly updates on the testnet and the roadmap.
- Read (soon) the full SDK reference, the validator setup guide, and the contract programming model.
Stuck? Most issues at this stage are install-path or Node-version related. Drop a message in Telegram with the exact command and the error — the founder reads everything personally on testnet.