Activation notice — block 5,710,001
LIVE since block 5,710,001. Node 0.9.7 swapped in at block 5,710,000 and every rule below turned on one block later. This page is the record of what changed at that boundary, because a client written against the older behaviour breaks on the rows below.
{"type":"account_state","address":"0x…"} carries the live height if you need to
check where the chain is.
Part of the split rules below is already superseded. Read the standard-mode split before you code to them.
Several behaviours move at ONE height, so the chain gains one boundary rather than several. The rows below are the ones a caller can observe. Anything else in the release changes no request, response, or rejection you can see.
Why the pin is one block above the swap. The outgoing binary commits block 5,710,000 and only then halts, so that block still runs the old rules. Pinning the change at the swap height itself would mean the live chain and a replay of it disagreed about that one block.
The two-wallet standard account
An account that enters standard mode at or above the height holds two USDC
wallets: perp collateral stays in the perp wallet, spot USDC moves to its own
wallet, and usd_class_transfer
is the only lane that crosses. An account already in standard at the swap keeps
one balance until it leaves the mode and enters again. The full rule set is
the standard-mode split.
| Surface | Below the height | At and above |
|---|---|---|
usd_class_transfer | Refused on every account | Accepted by a split standard account; refused on every other |
spot_margin_open, split account | — | Refused: spot margin is not available in standard mode |
user_set_abstraction kind: 2, split account | Sets a spot reservation | Refused: spot has its own wallet in standard mode; no spot reservation |
user_set_abstraction kind: 0, value: 0, split account | — | Refused while the spot wallet is below zero: spot wallet is negative; cannot leave standard mode |
USDC send_asset / sub_account_spot_transfer, split leg | Debits the pool, insufficient free collateral / insufficient cross collateral | Debits the spot wallet, insufficient spot balance |
account_state.split | Absent | true / false on a standard account |
account_state.reservations.spot, split account | Pooled row | reserved: "0", available = the spot wallet |
account_state.spot.balances USDC row, split account | Perp margin inside total | The spot wallet alone |
A split account's perp bankruptcy cannot reach its spot wallet; the insurance fund and ADL absorb it.
One governance vote closes both legs
A quorum-met force_close_position closed only the long leg, so a hedge account
kept its short and the action reported success. At and above the height one vote
closes each leg the account holds: a hedge account gets two liquidation
records per vote, max_size caps each leg on its own, and the outcome summary
reads forceClosePosition partial (quorum met): residual stays open when any leg
keeps size. The vote payload does not change. See
liquidation records.
Rows that change shape or meaning
| Surface | Below the height | At and above |
|---|---|---|
user_fills[*].start_position, spot row | A bare "0" | Zero at the market's sz_decimals, the same plane as sz ("0.00" on a two-decimal market) |
user_fills aggregate: true | Ignored | Folds one order's legs into one row; see aggregate |
user_fills[*].dir, spot row | Read as if a perp | States the spot direction |
account_state.reservations | Absent in every mode | Present on a standard account |
Node stream node_fills, each record | — | Carries ntl, the fill's notional in whole USDC |
| Faucet grant the reserve cannot pay | 200, nothing credited | Refused |
Nothing else moves
No /exchange action tag is added or removed. No snapshot or block field is renamed.
Every EIP-712 type string is unchanged, so a signed action that verified below the
height verifies above it.