SteemVM v0.0.6 Know the Update .

in SVM - EVM on STEEM • 16 days ago

Everything this release introduces, and exactly how existing validators move to the new chain with reset.sh.*


Hi everyone 👋

SteemVM is the EVM app-chain bridged to the Steem mainchain. Bridged STEEM is the native gas token, contracts run in a real Ethereum Virtual Machine, and a quorum of bonded validators, not a trusted relay, secures every deposit and withdrawal.

v0.0.6 launches as a fresh chain, steemvm-2. Instead of a coordinated upgrade on the old chain, every v0.0.6 feature is built into a clean genesis, with corrected parameters and a recorded Steem starting point. Existing validators move over with one script, reset.sh. It keeps their keys and their address, and rejoins them as validators on the new chain.

At a glance:

  • 🆕 A fresh chain: chain-id steemvm-2, EVM chain-id 81630, with a recorded Steem anchor so the two chains never mix.
  • 🤖 Withdrawals pay themselves: every validator's oracle runs an automated signer for the @svm.bank gateway.
  • ⚖️ Signing power matches stake exactly: @svm.bank's weights always total 10,000, with a 7,500 threshold.
  • 🛡️ A hardened bridge: the findings of our October security review are closed.
  • 🔒 A security refresh: the whole stack is on the latest compatible releases.
  • 🧰 New operator tooling: reset.sh moves a validator in one command, new validators start with one line, a faucet funds the stake, and public HTTPS endpoints serve state-sync.

1. The new chain: steemvm-2

Cosmos chain-idsteemvm-2
EVM chain-id81630 (0x13ede)
Genesis time2026-10-18 08:43:09 UTC
Instructions/genesis.json sha256feec8833b4124e64d8c820c7f49a62b49fea4be41dff683b3071381d70ec1a56
Steem anchorblock 110542427, ID 0696be5b24933003cd18654e794c7fce06d63c72
Node versionv0.0.6 (steemblazer/steemvmd:v0.0.6)
Genesis validator@blaze.apps
Block timeabout 6 seconds

Public endpoints (HTTPS):

UseURL
EVM JSON-RPC (MetaMask)https://evm.steemvmscan.com
EVM WebSocketwss://evm-ws.steemvmscan.com
CometBFT RPC (and state-sync)https://rpc.steemvmscan.com
Cosmos REST APIhttps://api.steemvmscan.com

Why a fresh chain

A clean genesis let us ship v0.0.6 complete from block 1, and fix parameters that an in-place upgrade would have carried forward:

  • Governance deposits are real amounts: 10 STEEM to submit a proposal (50 STEEM for an expedited one), instead of a dust value.
  • No community tax: community_tax is 0, so staking rewards go to stakers in full.
  • A 1 gwei gas floor from the first block.
  • SBD is ready at genesis: it's registered as the ERC-20 token at 0x…0901.
  • The EVM staking precompile (0x…0800) is on from the start, behind the validator identity gate.

The Steem anchor

Both chains watch the same gateway account on Steem, @svm.bank. So steemvm-2 records a starting point on Steem, the anchor: block 110542427 and that block's ID.

  • On-chain rule: the chain rejects any deposit, name-registration or payout attestation for a Steem block before the anchor. Steem history from before steemvm-2 existed can never be credited again here.
  • In every oracle: each oracle checks that its own Steem node returns the recorded ID for the anchor block. A node on the wrong network, or a wrong genesis, is caught before anything is attested. Oracles never scan Steem history from before the anchor.

A guard on the EVM chain-id

The node refuses to start if app.toml has a different EVM chain-id than 81630. A node with a stale config can't end up signing for the wrong network.


2. Withdrawals now pay themselves: the svm.bank signer

When you bridge out, your coins are burned on SteemVM and a withdrawal request is recorded. The STEEM or SBD is then paid to you on Steem from @svm.bank. @svm.bank has no keys of its own. It is a multisig: its authority is a list of validator accounts with weights, and a transaction from it is only valid once validators holding at least 75% of the weight have signed. No single validator can move the funds.

Collecting those signatures used to be manual. In v0.0.6, every validator's oracle runs a svm.bank signer:

  1. Propose. One validator's signer is designated for each withdrawal. It drafts the payout: a transfer from @svm.bank to your account, for your exact net amount, with the memo svm-withdrawal <id>.
  2. Check independently. Every other signer verifies the payout against SteemVM itself, not against the proposer's word. The withdrawal must exist and still be unpaid, and the recipient, the amount (to the last 0.001) and the asset must all match.
  3. Approve. Signers that agree publish their signatures in their own Steem profile metadata. It's public and auditable, with no central server.
  4. Execute. Once approvals reach 75% of the weight, a signer broadcasts the payout to Steem.
  5. Confirm. Validators' oracles see the payout and attest it. At ⅔ of bonded voting power the withdrawal flips from REQUESTED to PROCESSED, with the Steem transaction ID recorded on-chain.

Built so it can't pay twice:

  • One approval per withdrawal. A signer approves at most one proposal per withdrawal, and only the earliest correct one. It writes a local record of each approval before publishing it, so a lagging Steem node can't trick it into signing twice.
  • Never races the refund. SteemVM refunds a withdrawal that isn't confirmed within 3.5 days. The signer won't pay one within about a day of that deadline.
  • Wrong is denied, unsure waits. A payout that can never be right (wrong amount, recipient or memo) is denied. Anything that might clear later is checked again on the next pass.
  • Treasury and recovery operations are never automatic. Staking or powering down @svm.bank, and changing its recovery account, always wait for humans.

Active key only. The signer uses the validator's Steem active key and nothing else. @svm.bank's owner, active and posting authorities all resolve through validators' active keys. It refuses to start if:

  • an owner key, posting key or master password is configured;
  • the key doesn't match the validator's verified Steem identity;
  • the key is one of the account's owner keys.

Go, Python and JS. The signer ships in all three oracle clients, which produce byte-identical proposals and votes, so validators can mix them freely.


3. Signing power that matches stake, exactly

The signers also keep @svm.bank's authority equal to each validator's share of bonded stake on steemvm-2:

  • Exact, whole-number math: the weights always total exactly 10,000 and the threshold is exactly 7,500. The old set had drifted to 10,003 / 7,503 through rounding.
  • Everyone computes the same answer: weights are taken from a fixed SteemVM block, every 1,000 blocks (about 100 minutes). Each signer recomputes them from that same block and approves only an identical result.
  • No churn: a new set is proposed only when a validator joins or leaves, or someone's weight moves by more than 0.5 percentage points. Steem's limit of one owner change per hour is respected.

⚠️ The first sync needs the old set's approval. Until it happens, @svm.bank is still controlled by the old chain's validator set, with a 7,503 threshold. Moving it to the steemvm-2 set needs approvals from that old set's members. So please move your validator soon and keep the signer running. Each validator from the old set that rejoins brings that switch closer.


4. A hardened bridge (October security review)

  • Attestations are tallied per observed fact. Deposits, name registrations and payouts used to adopt whatever the first attesting validator reported. Now each distinct version is counted separately, and only one backed by ⅔ of bonded voting power wins. A minority reporting bogus details can no longer block or redirect the majority. This closes a withdrawal double-payout path and a deposit/name griefing path.
  • Size limits. Memos are capped at Steem's 2,048 bytes and timestamps are validated. Bridge-out rejects absurd amounts and enforces the minimum on every path, including the EVM precompile.
  • Bounded end-of-block work. Expiring stale deposits, withdrawals and registrations handles a bounded number of records per block, so a flood can't slow block production.
  • Fair duty credit. A correct attestation that lands just after the ⅔ threshold was crossed now counts as done, not as a missed duty.

Every finding has its own regression test.


5. A security refresh of the whole stack

  • cosmos/evm v0.7.3, an upstream security release: EVM state stays atomic across precompile calls, and a balance-overflow path is closed.
  • ibc-go v11.2.0 and the cosmos go-ethereum fork v1.17.2-cosmos-1, which includes an EIP-712 fix.
  • gRPC v1.84.0, with OpenTelemetry and the other dependencies brought up to date.
  • Go 1.26.9, which includes 12 standard-library security fixes.
  • Cosmos SDK v0.54.4 and CometBFT v0.39.4, the newest versions cosmos/evm supports today.

6. Operator tooling

  • reset.sh moves an existing validator to steemvm-2 in one command, keeping its keys and address (section 7).
  • New validators start with one line. install.sh installs Docker, asks for just your Steem username and active key, and runs the full setup. A DigitalOcean referral link is in the README for anyone who needs a server; new accounts get trial credit.
  • A faucet funds the stake. New and returning validators receive 5,000 STEEM automatically, stake 4,000 and keep the rest for fees.
  • Name registration is automatic. The scripts send the 0.001 STEEM registration themselves, signed with your active key.
  • State-sync through https://rpc.steemvmscan.com. A node bootstraps from a snapshot (served every 1,000 blocks) in about a minute instead of replaying the chain.
  • Live peer discovery. update_peers.sh builds your peer list from the network's live node list. It keeps only peers whose p2p port actually answers, and leaves your own node out.
  • Oracle fixes:
    • the Go oracle no longer hits intermittent EOF / connection reset errors from the node;
    • a state-synced node's EVM JSON-RPC indexer starts correctly;
    • password-protected keyrings are supported throughout.
  • Pinned images. The node and all three oracles run the same release tag, v0.0.6.

7. Existing validators: moving to steemvm-2 with reset.sh

Before you start

  • Your node runs the Docker setup from this repository (the steemvm-node container).
  • Have your Steem ACTIVE private key ready (it starts with 5). You'll be asked for it only if oracle/.env doesn't already have it. Never use your owner key, posting key or master password.
  • If your keyring has a passphrase, the one steemvmd keys list asks for, have it ready too.
  • Run as root (sudo). The node home is owned by root.
  • Back up ~/.steemvm/config/priv_validator_key.json, ~/.steemvm/config/node_key.json, your keyring or mnemonic, and oracle/.env. reset.sh never deletes them, but a backup is always wise.

The command

From your SteemVM folder:

git fetch origin
git checkout release/v0.0.6
git pull --ff-only
sudo ./reset.sh
  • If git checkout complains about local changes, run git stash first. oracle/.env and Instructions/*.toml are not tracked by git, so stashing doesn't touch your keys or config.
  • git pull --ff-only matters. If you have an older local release/v0.0.6, git checkout alone stays on the old copy.
  • Use reset.sh for this move, not update.sh. Your current copy of update.sh is the old script, and it won't hand over to reset.sh. From this release on, update.sh hands over by itself.

What it asks you

  1. Your keyring passphrase, only if your keyring is password-protected. It's checked straight away; a wrong one stops the script with nothing changed.
  2. Your Steem active key, only if oracle/.env doesn't have it. It's shown as you paste it so you can check it, then verified against your account before anything is sent. If oracle/.env already has it, it's verified without asking.
  3. YES, after a summary of every change it's about to make, including each .env line it will adjust.

What it does

Checks first, before touching anything:

  1. The genesis in your checkout must be the one the network runs. If it isn't, git pull and retry.
  2. The node image must be v0.0.6.
  3. A state-sync snapshot must be available.
  4. Every URL in oracle/.env must work (see step 6).

Then it moves your node:

  1. Keeps all keys: consensus key, node key, keyring and address. Your validator keeps the same steem1… address.
  2. Adjusts oracle/.env, without replacing it:
    • Node RPC/REST that points anywhere but your own node is commented out, so the oracle uses your node.
    • Steem RPCs must return the anchor block's recorded ID. Dead or wrong ones are replaced by working public nodes, keeping at least two.
    • Price-API URLs that are unreachable are commented out, so the defaults apply.
    • An old-chain gas price is commented out (1 gwei applies). Price votes aren't fee-exempt, and an old value would drain your balance.
    • Owner keys, posting keys and passwords are removed.
    • cmc without an API key switches to CoinGecko, which needs no key.
    • Missing settings are added, including the active key and the svm.bank signer switch.
    • Your oracle key, API keys and your own valid settings are kept.
  3. Old image pins in the repository-root .env are commented out, so v0.0.6 runs.
  4. Wipes the old chain data and installs steemvm-2:
    • the genesis, chain-id and EVM chain-id;
    • fresh peers, without the old chain's address book;
    • cosmovisor pointed at the v0.0.6 binary.
  5. State-syncs to the tip, then restarts the node once so its EVM indexer starts correctly.
  6. Rejoins as a validator:
    • sends 0.001 STEEM from your Steem account to @svm.bank with the memo svm-register <your address>, and waits for validators to attest it;
    • confirms your name on-chain;
    • claims from the faucet and waits for the stake;
    • runs create-validator with your Steem public keys (the identity gate), staking 4,000 STEEM by default and keeping at least 1 STEEM liquid for fees.
  7. Restarts your oracle on its v0.0.6 image, with the svm.bank signer on.

It usually takes 10–15 minutes, most of it waiting for the registration to be attested.

Check that it worked

docker exec steemvm-node /root/go/bin/steemvmd status | jq '.sync_info'
docker exec steemvm-node /root/go/bin/steemvmd query staking validators --home /root/.steemvm
docker compose logs -f oracle-go          # or oracle-python / oracle-js

In the oracle log, look for svm.bank signer ready and for price prevotes and votes.

If it stops part-way

  • A registration or funding timeout: run sudo ./reset.sh --rejoin-only to finish without resetting again.
  • "genesis differs": your checkout is old. Run git pull --ff-only, then retry.
  • "can't tell which key is your validator's": name the key, e.g. sudo VALIDATOR_KEY=<name> ./reset.sh. With sudo, put the variable after sudo, as shown.
  • Your Steem username isn't your moniker: sudo STEEM_USERNAME=<name> ./reset.sh.
  • "oracle/.env has no ORACLE_PRIVATE_KEY" (password-protected keyrings only): export it with the command the script prints, add it to oracle/.env, and retry.
  • The active key is rejected: it must be the active private key of the account your validator is named after.

Useful options

OptionWhat it does
--rejoin-onlyFinish rejoining (registration, stake, create-validator, oracle) without a reset
--no-rejoinMove to steemvm-2 as a plain full node, e.g. an RPC node
STAKE_AMOUNT=<n>asteemStake a different amount (default 4,000 STEEM)
--seed-rpc <url>State-sync from another node's RPC

Keep your peers fresh

As validators join, refresh your peer list from the live network at any time. It leaves your own node out:

git pull --ff-only && sudo ./update_peers.sh --restart

8. New validators

On a fresh Ubuntu server, one line does everything:

curl -fsSL https://raw.githubusercontent.com/blazeapps007/SteemVirtualMachine-EVM/release/v0.0.6/install.sh | sudo bash

It asks only for your Steem username and Steem active key. It then installs Docker, syncs the node, registers your name, claims the faucet, creates your validator and starts your oracle. For a step-by-step version, run ./new-validator.sh from a clone of the repository.


9. What changes for users and developers

  • Add the new network to MetaMask:
    • network name: SteemVM
    • RPC URL: https://evm.steemvmscan.com
    • chain ID: 81630
    • currency symbol: STEEM
  • Balances on the old chain (steemvm, EVM chain-id 8163) are not carried over. steemvm-2 starts fresh, and only Steem deposits from the anchor block onward are credited on it.
  • Bridging works as before: send STEEM or SBD to @svm.bank with your address as the memo. Once validators' signers are running, bridge-outs are paid automatically.
  • For developers, precompile addresses and message formats are unchanged: 0x…0900 bridge, 0x…0901 SBD, 0x…0902 price oracle. Only the chain-id changed, so update it in your configs.

TL;DR

  • 🆕 steemvm-2: a fresh chain with EVM chain-id 81630, a recorded Steem anchor, and corrected parameters.
  • 🤖 Automatic withdrawals through an svm.bank signer in every validator's oracle.
  • 🛑 No double payouts: one approval per withdrawal, a write-ahead approval record, and no payout near the refund deadline.
  • 🔑 Active key only: the signer refuses an owner key, posting key or master password.
  • ⚖️ Exact stake-weighted signing power: always 10,000 in total, with a 7,500 threshold.
  • 🛡️ Hardened bridge and a 🔒 security refresh of the whole stack.
  • 🧰 One command to move: git fetch origin && git checkout release/v0.0.6 && git pull --ff-only && sudo ./reset.sh.

Validators, please move your node soon. Each validator from the old set that rejoins and runs its signer brings the @svm.bank switch to the new set closer.

Questions, feedback, or want to run a validator? Drop a comment below. 🙌