Local Validator Wallet
Use an encrypted node-generated wallet to lock, bond, set session keys, and declare validator intent without a browser extension.
Enroll with a local node-generated wallet
Use this alternative when Talisman or another browser wallet cannot complete validator enrollment. It signs the same native runtime transactions used by the managed validator setup: pwRoko.lock, staking.bond, session.setKeys, and staking.validate. The operator funds and controls the staking account. No administrator or sudo account is used.
The staking wallet is an ECDSA account generated by roko-node key generate. It is separate from the node's seven session keys and P2P identity. This tool captures the exact raw node seed in memory, checks its public key, and saves only password-encrypted keyring JSON. It does not print a seed or mnemonic. Never substitute a session key, node key, or Ethereum-derived mnemonic.
Verification status
Published September 13, 2026. Encryption/recovery tests, the existing installer smoke suite, and read-only call encoding against testnet runtime 286 passed. A funded end-to-end enrollment with this new command remains unverified. Browser-wallet failures remain under investigation; this is a separate local signing path, not a claim that Talisman has been repaired.
Install from source
This optional command is available in the source checkout; the existing signed enrollment bundle does not install its Node.js dependencies. Use a reviewed revision of the public repository, Python 3, Node.js 22 or newer, and your verified roko-node binary:
git clone https://github.com/Roko-Network/roko-edge-tools.git
cd roko-edge-tools
npm ci --ignore-scripts --prefix wallet
npm test --prefix wallet
bin/roko-validator-wallet --help
Run the command as your normal operator user on the validator host. RPC must listen only on loopback, with WebSocket enabled on 127.0.0.1:9944. Do not publish or forward RPC. Signing works with the node's normal Safe RPC policy; only session-key generation uses the existing guarded key-management window.
Create and fund the staking wallet
install -d -m 700 "$HOME/.local/share/roko-validator"
bin/roko-validator-wallet create \
--binary /usr/local/bin/roko-node \
--wallet "$HOME/.local/share/roko-validator/staking-wallet.json"
Enter a unique password of at least 12 characters at the hidden prompt. The command prints the public 0x account address and refuses to overwrite an existing wallet. Back up the encrypted wallet and keep its password separately. Losing either prevents future staking transactions and withdrawal. Do not commit wallet files or send them to support.
Fund the printed address with native ROKO on testnet (chain ID 52370). Enrollment defaults to 50 ROKO bonded and also needs native ROKO for each transaction fee and the existential deposit. The tool checks the current minimum validator bond and estimates each next transaction fee. If the minimum exceeds 50 ROKO, use --stake-planck with the desired integer amount in base units; one ROKO is 1000000000000000000 planck.
This first version creates a new staking wallet. It does not migrate funds, import Talisman accounts, or replace an existing validator's wallet. Fund the new address through your existing funded account or the testnet funding route.
Generate the public session package
Complete the node readiness and guarded session-key workflow on this same node. Restore and verify Safe RPC before proceeding. The public roko-validator-enrollment.json must be fresh and identify this node, runtime, and testnet genesis:
0x0a2296f8f036f71437e8f6f2028ccbf0dc3dd6b3de9120fc15e43789c794e8bb
Keep the node in its non-authoring candidate configuration during enrollment. Use the existing session tuple when refreshing an expired package; do not rotate keys to retry a transaction.
Review and execute
Replace the account placeholder with the public address printed at creation:
bin/roko-validator-wallet plan \
--wallet "$HOME/.local/share/roko-validator/staking-wallet.json" \
--account 0xYOUR_40_HEX_CHARACTER_ACCOUNT \
--enrollment roko-validator-enrollment.json
plan never opens the wallet or asks for its password. It checks the current loopback listener, chain, runtime metadata, node identity, synchronization, advancing finality, live minimum bond, pending nonce, and finalized staking state. It prints the next needed call, encoded call data, estimated fee, and native balance requirement. Review the full sequence: lock enough ROKO to reach the requested pwROKO balance, bond that amount with rewards set to Staked, register the package's session tuple with the current empty proof, then declare validator intent with zero commission and nominations unblocked. Existing validator preferences are preserved. Estimates are refreshed before each call; fee reserves are estimates, not a guarantee of future network fees.
bin/roko-validator-wallet enroll --execute \
--wallet "$HOME/.local/share/roko-validator/staking-wallet.json" \
--account 0xYOUR_40_HEX_CHARACTER_ACCOUNT \
--enrollment roko-validator-enrollment.json
The hidden password unlocks the wallet locally. Its derived address must match --account. Each submission reports its public transaction hash, waits for finalization, prints the finalized block receipt, then rechecks state before the next step. Avoid other transactions from this account during enrollment.
Interruptions and completion
- Insufficient funds: fund the displayed account, then rerun
plan. - Pending nonce or timeout: a transaction may still finalize. Inspect its explorer status and wait for pending activity to settle before rerunning. Do not create a second wallet or blindly resubmit from another tool.
- Dispatch failure: inspect the transaction's explorer receipt and resolve the runtime error. Earlier finalized calls remain effective.
- Expired package or runtime change: refresh the package with the same session keys using the guarded workflow, then rerun
plan. - Different registered keys or insufficient existing bond: stop and review the existing validator. This enrollment command does not rotate keys, increase existing bonds, change commissions, unbond, or withdraw.
Rerunning checks finalized state and skips completed steps. A finalized candidate registration does not mean the node has been elected or authored a block. Continue the join and monitor procedure, verify the session tuple and custody on the node, then enable validator mode according to that procedure. Confirm election and authorship separately.
Before enabling validator mode, use the enrollment command from this updated source checkout to verify finalized state and local custody under Safe RPC:
bin/roko-validator-enroll \
--rpc http://127.0.0.1:9944 \
--check-account 0xYOUR_40_HEX_CHARACTER_ACCOUNT \
--expected-session-keys "$(python3 -c 'import json; print(json.load(open("roko-validator-enrollment.json"))["session"]["encodedKeys"])')"
The tuple is public. Require safeToEnableValidatorMode: true; keep Safe RPC enabled. A not-ready result is not permission to skip custody verification. Older signed tool bundles may lack the Safe readiness fallback; use the source command above until a new signed bundle includes it.