┌─┐┌─┐┌─┐┬ ┬ ├─┘├┤ │ │ │ ┴ └─┘└─┘└─┘
A Verus wallet that lives in your terminal.
Keys, transparent sends, air-gapped signing, transaction decoding, the VerusID lifecycle and currency operations — from one binary, with no full node to run.
pecu doctor
The point
There is no daemon.
No verusd to install, no chain to sync, no wallet process to keep
alive. pecu asks a public RPC endpoint questions and hands it
finished transaction bytes. That is the whole architecture.
Starts in milliseconds
pecu id show VRSCTEST@ answers in about the time
curl to the same node would take. There is nothing to warm up.
Keys never leave the machine
Generated locally, encrypted at rest with Argon2id and ChaCha20-Poly1305, signed in process. The node is never asked to hold, unlock or use a key.
One URL to point somewhere else
--node, an environment variable or a config file. Your own
daemon works exactly as well as a public one; it is the same interface.
Built to teach the SDK
Every command takes --explain, which prints the exact
verus-sdk calls
it just made.
Reading the chain
It tells you what things mean.
Most of the value is not in fetching data — any HTTP client does that. It is in saying what the data implies, at the moment you are about to act on it.
An identity, and whether it can be revoked at all
An identity that is its own recovery authority cannot be revoked: consensus refuses a revocation nobody could undo. Nothing in the raw RPC reply says so. The last line does.
pecu id show VRSCTEST@
A transaction, output by output
A real VRSCTEST currency launch — seven outputs, one of which holds a
VerusID and one of which holds reserves. Output #2 is why
this command exists: an undecodable CryptoCondition that may hold currency,
called out rather than printed as an empty 0.00000000.
pecu tx explain <txid>
A balance you can actually spend
Spendable, withheld, in-conditions and every token on the address, kept apart — because a balance that adds them together is a balance you cannot spend from.
pecu wallet balance
Writing to the chain
Nothing irreversible happens quietly.
Every spending command builds a panel first, names what cannot be undone, and
then asks. --dry-run stops after signing, so you can read the whole
thing before a single byte is broadcast.
Send
Built and signed and stopped. Nothing broadcast, nothing written.
pecu send --dry-run
Send a token
--currency moves a token instead of the chain's own coins. The
amount is labelled with what is actually moving; the fee stays in VRSCTEST,
because that is what the miner is paid in. The token-carrying outputs read
0.00000000 VRSCTEST because a token rides in the output's
script, not its value.
pecu send --currency
Register a VerusID
Two transactions: one commits to the name, a second claims it once the first confirms. The reservation is written to disk before the commitment is broadcast, so Ctrl-C, a timeout or a dead connection all leave a registration the same command picks up. That is not theoretical — an earlier run lost its node mid-wait and resumed from the file.
pecu id register
Air gap
Three commands, three machines.
The machine holding the key never opens a socket. The machines that talk to the network never see a key. Each step also speaks QR codes, so the offline machine needs no cable either.
# 1. where the node is. No key on this machine at all.
pecu plan send --address R… --to R… --amount 1 --out plan.hex
# 2. where the key is. This one opens no socket.
pecu sign @plan.hex --key cold --out signed.hex
# 3. back where the node is. Carries no key.
pecu broadcast @signed.hex
The gap carries the chain's own coins, and nothing else.
pecu plan send takes --currency and
--from-identity and refuses each by name, before it opens a
socket: a token rides in an output's script and a VerusID's funds sit in
pay-to-identity outputs, and the SDK builds an unsigned form of neither.
pecu send moves both, and it signs on the machine that talks
to the node.
-
Mainnet ships unable to spend
Spending is off for it by default. Moving real coins
takes a deliberate edit, not a forgotten
--profile. -
--json is output, not consent
Machine-readable mode refuses to spend without
--yes, because the confirmation prompt would go to the stream you are parsing. - Burned fees are named as burned A registration fee is not recoverable, and the panel says so in those words before you agree to it.
- Refusals are diagnostics, not stack traces Each one has a code, an explanation of what the chain would have done, and the next thing to try.
Status
Early, and specific about it.
This is the SDK's example app before it is anything else. The honest version of where it stands:
Proven on chain
Identity registration and reads, transaction decoding, key management, balances and UTXO reads, transparent sends.
Built, waiting on a chain
--nft, seeded contributions at launch, and paying a token to a
VerusID are each refused by a named diagnostic rather than attempted.
Not in scope
Shielded and z-address operations, marketplace offers.
DeFi is currently switched off on both VRSCTEST and VRSC.
While the switch is in force the daemon refuses every currency launch and every
conversion, whatever the transaction contains. pecu doctor reads
that from the chain's notification oracle and tells you before you sign one —
see Status for what it unblocks.
Start here
Rust 1.95, which rust-toolchain.toml pins. No other
system dependency.
git clone https://github.com/chainvue/pecu-cli
cd pecu-cli
cargo build --release
./target/release/pecu doctor
The name
pecū n. Latin
cattle; livestock; a herd.
The root of pecūnia, the Latin word for money: wealth was a herd, before there were coins to count it in. The same root sits inside pecuniary and impecunious — and inside peculium, the Roman fund a dependent could hold and trade with while ownership stayed elsewhere.
Held is not the same as free to move. pecu keeps spendable,
withheld and in-conditions apart for that reason: a beast already pledged
against a debt still grazes in your field, but it isn't yours to drive to
market.