MetaFlux 0.9.5 — A claimed staking reward went to the wrong balance, and staking never appeared in your money history at all
This release is live. MetaFlux 0.9.5 swapped in at block height 3,170,000 on chain 114514. It moves a claimed staking reward to the balance it belongs in, puts staking and Earn into your money history for the first time, makes the EVM JSON-RPC readable by an ordinary wallet, and corrects six data records that stated something other than what they name.
A claimed staking reward now lands in your staking balance, not in spot — Claiming paid the reward straight into the spot MTF balance. That is the wrong destination: a reward earned by stake belongs with the stake, where it can be delegated again with no second step. It now lands in the staking free pool. To spend it, move it to spot with a staking withdrawal, which the free pool returns with no unbonding window. If your client confirms a claim by watching the spot balance, watch the staking summary instead.
Staking and Earn appear in your money history — The non-funding ledger read carried four kinds of movement: deposits, withdrawals, transfers and forced-close settlements. Everything staking did was invisible in it. Moving MTF into the staking balance, delegating, undelegating, claiming a reward, and both Earn directions produced no record at all, so an account could see its balance change with nothing in its history to explain it. Seven kinds are added — staking_deposit, staking_withdraw, delegate, undelegate, staking_reward, earn_deposit and earn_withdraw. Delegating does not change what the account holds in total, but it moves money between what you can withdraw and what you cannot, and that is a movement the history has to show.
One money history read, and its key changed — This is a breaking change for integrators. user_ledger and user_ledger_by_time are removed: both were narrower views of what user_non_funding_ledger_updates already served, and its name states what it holds where theirs did not. The collection key under it was ledgerUpdates, the only camelCase key on a wire that is snake_case everywhere else. It is ledger_updates now. A client reading data.ledgerUpdates receives undefined rather than an error, so check for it before you upgrade.
The EVM JSON-RPC could not read a mapping slot — eth_getStorageAt parsed the slot as a 128-bit number. Every mapping slot is a 32-byte keccak hash, so every ERC-20 balance, every allowance, every role and every proxy pointer was unreadable through that method, and a proxy resolver has no other path. Seven more methods a wallet or an explorer probes on connect were missing and answered an error. A caller that hits the rate limit now receives a JSON-RPC error carrying how long to wait, rather than a reply its client cannot parse.
Six records stated something other than what they name — Each one was well-formed, plausible, and wrong, which is the class that survives review. A position's unrealised profit was written as a literal zero on every row since the field existed, and zero is a believable number for a position. A spot fill stated its size as a raw lot count on a stream that is decimal throughout, so a 100 MTF fill read as 10,000 — a hundred times the truth, and a hundred thousand times on BTC. An order event mixed two number planes inside one record. A partly-filled resting order reported its whole size as still outstanding. And two records stamped every block in a batch with the batch tip's second instead of its own. All six now agree with the reads beside them.
The signed-action tape is published — On a public chain the actions are already transparent, so the node now writes them: one record per committed action, with its signer, nonce, type, payload and outcome. The index is the action's position in the committed block, so it is total and stable on every node and every replay. It is off by default and enabled on the observer only, never on a validator.