69 Commits
Author SHA1 Message Date
zeekayandHanzo Dev d5eff75934 genesis: install the M-Chain plugin under the vmID genesis actually declares
The build installed M-Chain's plugin binary as
tGVBwRxpmD2aFdg3iYjgRvrCe8Jcmq9UNKxyHMus2NZ8WcD8t — the CB58 of the
retired `thresholdvm` identifier — while the genesis builder declares the
chain with constants.MPCVMID (qCURact1n41FcoNBch8iMVBwc9AWie48D118ZNJ5tBdWrvryS).
The plugin registry resolves a CreateChainTx's vmID to an implementation
by filename, so the two never met: M-Chain was declared in genesis and no
node could start it. The Dockerfile comment had already been renamed to
"mpcvm" without the CB58 being recomputed, which is why it read as correct.

Fixes all five sites (plugin build target, the build-verify list, the
runtime COPY, the comment, and publish_plugin_set.sh) and adds
genesis/builder/mchain_test.go, which pins the vmID literally and asserts
M-Chain is present in the height-0 chain set for mainnet, testnet and
local. A vmID is an immutable one-way door once a chain is created with
it, so it is now covered by a test rather than by five copies of a string.

Bumps luxfi/genesis to v1.16.3, where mchain.json states its quorum as
"policy": "7-of-10" instead of a bare mpcThreshold that reads as the
signer count to an operator and as the polynomial degree to a library.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-25 14:53:07 -07:00
zeekayandHanzo Dev 66d5940f88 Dockerfile: let the C-Chain plugin link cevm, and fix the cevm fetch
Two things kept the cevm backend from ever reaching a running node.

The fetch pointed at luxcpp/cevm v0.19.0, which does not exist — the libs
publish from the private lux-private/cevm repo, and unauthenticated downloads
404 there. Point it at v0.51.10 in that repo and authenticate with the same
`ghtok` secret the private go modules and lux-accel already use. It stays
best-effort, so a build without the token behaves exactly as before.

Separately, the C-Chain plugin builds with CGO_ENABLED=0 and no tags, so it is
always the pure-Go EVM regardless of what luxd itself links — which is why
production images carry no cevm at all. That build now honours EVM_CGO and
EVM_TAGS, defaulting to today exact behaviour; EVM_CGO=1 EVM_TAGS=cevm is what
makes AutoEVM resolve to CppEVM. The libraries are already in this stage (the
plugin section shares the builder stage rather than starting a new FROM).

Defaults unchanged, so the in-flight v1.36.12 fleet build is byte-identical.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-25 13:43:32 -07:00
zeekayandHanzo Dev e266345e69 v1.36.12: align bundled EVM/dexvm plugins to node api v1.0.16 (fixes C/D-Chain init)
v1.36.11's node binary is correct (durable rejoin fix fe23efd1f2), but its image
baked VM plugins built against a stale luxfi/api: the C-Chain EVM plugin from
luxfi/evm@v1.104.8 and the D-Chain dexvm plugin from luxfi/dex@v1.5.15 both resolve
api v1.0.15, while the node pins api v1.0.16. api v1.0.16 APPENDED
InitializeResponse.Capabilities (uint64) for the Quasar-export handshake (api
1f2dc5a). The node decodes that field; the stale plugins never encode it, so
vms/rpcchainvm/zap/client.go fails every EVM VM Initialize with
'zap decode initialize response: unexpected EOF'. Native VMs (P/X/Q) are unaffected;
every EVM chain (C, D, and the L2 EVMs) fails to boot. Verified on devnet (published
v1.36.11 digest c3cf92a6): P/X re-bootstrap fine, C+D deterministically EOF.

Fix (image-only; node source unchanged beyond the version bump):
- EVM_VERSION v1.104.8 -> v1.104.9 (api v1.0.15 -> v1.0.16, indirect via luxfi/vm)
- force luxfi/api@v1.0.16 in the dexvm build stage (no dex release pins v1.0.16 yet)
- CHAINS_REF v1.7.6 already carries api v1.0.16 (the other 10 VMs were fine)
The api bump is code-free for plugins (chains v1.7.4->v1.7.5 adopted it go.mod-only).

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-14 18:19:47 -07:00
zeekayandHanzo Dev b34dcd1558 v1.36.10: CHAINS_REF v1.7.6 — all VM plugins ZAP-native in the image
Bumps chains v1.7.5→v1.7.6 (dexvm/schain/identityvm/graphvm json→ZAP migrations)
+ zap v1.2.5. CHAINS_REF=v1.7.6 so the baked VM plugins carry the ZAP-native tx/
block wire. Node builds clean; xvm 12 pkgs green. Plugin subgraph now references
only surviving tags (chains v1.7.6 → node v1.36.9 → utxo v0.5.7).

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-14 15:56:44 -07:00
zeekayandHanzo Dev 7ee56895d9 v1.36.5: no-replace hermetic build — chains v1.7.5 (pins real node v1.36.4), revert Dockerfile node replace
Supersedes v1.36.4's build recipe which used a build-time 'replace node => /build'
(forbidden: no local replace directives). Instead, chains v1.7.5 pins the real,
published node v1.36.4 tag, so the baked VM plugins resolve node the normal way —
Dockerfile just clones chains and builds; CHAINS_REF v1.7.4 -> v1.7.5; go.mod
chains v1.7.4 -> v1.7.5; genproto realigned. Zero replace directives anywhere.
tidy + -mod=readonly + cold 'go mod download all' clean.

Note: luxfi node/geth/utxo git tags are being periodically wiped by an external
tag-sync (root cause of the 'unknown revision' failures); all four pinned tags
(node v1.36.4, chains v1.7.5, utxo v0.5.1, geth v1.17.12) re-verified present
immediately before this build races the sync window.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-12 21:43:55 -07:00
zeekayandHanzo Dev bbce8e6e13 Dockerfile: build baked VM plugins against the HOST node (/build), not chains' pinned node
The plugin stage cloned chains and built each VM's cmd/plugin standalone, which
resolved chains' pinned github.com/luxfi/node@v1.30.6 — a wiped/disjoint release
tag (325 orphan commits, no merge-base with main) absent from the remote, so the
hermetic build died with 'unknown revision v1.30.6' and the required bridgevm/
mpcvm/zkvm plugins went missing (FATAL).

Fix: inject 'replace github.com/luxfi/node => /build' (the exact vX.Y.Z node source
being built) into every /tmp/chains go.mod before building. This is what the
existing 'plugins in lockstep with the host node' intent actually requires — the
baked plugins now match the node they run in instead of an ancient pin. chains is
the main module during the plugin build, so node(/build)'s own require of chains
resolves back to /tmp/chains (main-module-wins) — no version fetch, no loop. Also
bumped CHAINS_REF default v1.7.2 -> v1.7.4 to match node's go.mod chains pin.

Verified: all 10 required plugins build cold (fresh GOMODCACHE, CGO_ENABLED=0) into
real binaries against local node v1.36.4.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-12 17:35:39 -07:00
zeekayandHanzo Dev 3f890bc98e Integrate main's Quasar-export + EVM v1.104.8 content into the codec-kill branch
The non-codec main changes (Dockerfile EVM_VERSION v1.104.8, chains/manager
GetContext size-chunking for behind-validator resync + Quasar EXPORT frontier
bridge, warp/signature, rpcchainvm/zap client) that the branch lacked. The
codec-era main files (codec.go/parse.go/tx.go etc.) are intentionally
superseded by this branch's native-ZAP struct-is-wire — not reintroduced.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-11 22:48:27 -07:00
zeekayandHanzo Dev ae15850e1a v1.34.25: proper semver — EVM pin v1.104.7 (head-state-pin fix), drop stale replace-cascade comment
Same content as v1.34.24 (v1.104.3-headpin == v1.104.7, retagged per semver
policy: real monotonic patch versions, no suffix tags). go.mod has no replace
directives; removes the leftover comment from an already-completed cascade.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-07 21:39:48 -07:00
zeekayandHanzo Dev 092ed0459e v1.34.24: EVM v1.104.3-hotfix -> v1.104.3-headpin (durable idle-freeze fix)
Pins luxfi/evm v1.104.3-headpin: dedicated unbalanced GC pin on the accepted
head state root (transferred head-to-head in Accept + startup + direct
setters) so the head can never be evicted by the tipBuffer/Cap while idle —
the durable fix for the 1085200 'missing trie node at head' freeze. Also
carries vm v1.2.6 parity. Base: v1.34.22 (mainnet matcher lineage), no other
changes.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-07 20:33:36 -07:00
zeekayandHanzo Dev 3d65b1c0c2 v1.34.22: MAINNET FINAL — matcher+Reference EVM (v1.104.3-hotfix) + consensus v1.35.28
Bundles BOTH reliability fixes on the mainnet-compatible line (the live test proved they
COMPOUND — Bug A catch-up alone can't reconcile the tip-loss Bug B causes on restart):
- Bug A (consensus v1.35.28, merged to consensus main): catch-up #1/#2/#3/#5 + vote-guard clone re-sign.
- Bug B (EVM v1.104.3-hotfix): head-state Reference one-liner — EXECUTION-IDENTICAL to mainnet
  (golden roots identical RED vs GREEN), matcher EVM (precompile v0.19.0), NO settle-only.
go.mod delta vs mainnet v1.34.14 = consensus-only; EVM = matcher+Reference (the only exec delta is
the proven-identical GC pin). STAGED for mainnet recovery — NOT rolled (gated on RED + canary).

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-07 11:00:24 -07:00
zeekayandHanzo Dev 98911842db docker: guard all mandatory chain-VM plugins, not just bridgevm
The chain-VM plugins are built with '|| echo WARN' (optional) but hard-COPY'd in
the runtime stage (a build miss -> cryptic COPY failure). Replace the single
bridgevm test-s check with a guard over every mandatory plugin so a missing/empty
binary fails loudly at the build stage with the real cause.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-03 21:26:08 -07:00
zeekayandHanzo Dev b3e92ce979 build: node canary v1.34.12 — chains v1.7.2 (pulsar-path fix) + consensus v1.35.22
Supersedes the v1.34.11 image build, which failed in the Docker plugin
stage: chains v1.7.1 pulled consensus v1.25.35, whose polaris.go imports
the removed pulsar/ref/go/pkg/pulsar path — the quantumvm + mpcvm plugins
could not build and their hard COPY failed.

- chains v1.7.1 -> v1.7.2 (consensus bumped to v1.35.22 there; consistent
  pulsar graph; all 10 chain VM plugins verified building standalone).
- Dockerfile CHAINS_REF v1.7.1 -> v1.7.2.
- consensus v1.35.21 -> v1.35.22 (Pike-clean of the ProposalKey liveness
  fix; logic identical to v1.35.21).

Pins: consensus v1.35.22, chains v1.7.2, evm v1.104.3. Off origin/main,
no WIP.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-03 20:50:05 -07:00
zeekayandHanzo Dev 0428445890 build: node canary v1.34.11 — buildable image with decomplected consensus
IMAGE/BUILD change (packaging only — the consensus behavior change ships
separately as luxfi/consensus v1.35.21). Two edits make the deployable
node image build with the fixed consensus and the current chain plugins:

- consensus pin v1.35.20 -> v1.35.21 (ProposalKey decomplection, commit
  776a5119c: outer block IDs are transport aliases, proposal identity is
  ProposalKey{ParentID,Height} — proposervm envelope churn can no longer
  spawn own sibling candidates that split votes; the mainnet 1082880 fix).
- Dockerfile ARG CHAINS_REF v1.7.0 -> v1.7.1. v1.7.0 still shipped the
  pre-rename `thresholdvm` dir, so the Dockerfile's `cd /tmp/chains/mpcvm`
  plugin build produced nothing (swallowed by `|| echo WARN`) and the hard
  COPY of the mpcvm plugin (tGVBwRxp...) failed — the v1.34.10 Docker build
  break. v1.7.1 carries the mpcvm rename; the mpcvm plugin builds clean
  (verified standalone, 16MB) and all 10 chain plugins are present.

Pins verified for the canary image: consensus v1.35.21 (=776a5119c),
chains v1.7.1, evm v1.104.3, cevm v0.19.0, dex v1.5.15. Built off
origin/main — no WIP from any other worktree.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-03 19:38:25 -07:00
zeekay 52fd2cef35 Merge branch 'feat/thresholdvm-decomplect' into integrate/node-release-plus-mpcvm 2026-07-03 16:20:21 -07:00
zeekayandHanzo Dev 89bb0e718c build: pin EVM_VERSION v1.104.1 -> v1.104.3 (ZAP VM-state serialization fix)
v1.34.9 = v1.34.8 + the C-Chain EVM plugin rebuilt from evm v1.104.3
(= evm v1.104.1 + luxfi/vm v1.2.6). The only change is the plugin's
ZAP RPC server now serializes VM state calls, fixing the concurrent-map
crash (chain.State.verifiedBlocks) that killed the EVM subprocess under a
concurrent ParseBlock storm and froze Lux mainnet C-Chain at block 1082879.
Node binary, consensus, genesis, and all other plugins are unchanged;
block output is byte-identical, so v1.34.9 is consensus-compatible with the
running v1.34.8 fleet (verified on devnet/testnet before the mainnet roll).

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-03 15:15:10 -07:00
zeekayandHanzo Dev d4323da799 node: rename thresholdvm → mpcvm; split M/F registries (LP-0130)
- vms/thresholdvm/ → vms/mpcvm/ (dir + inner files + package decl).
- node/vms.go optional-VM registry: drop ThresholdVMID row, add
  MPCVMID and FHEVMID rows (matching the new split).
- genesis/builder/registry.go: T-Chain entry → M-Chain (MPCVMID) +
  F-Chain (FHEVMID); registry_test.go parity assertions updated.
- genesis/builder/builder.go: TChainAliases → MChainAliases +
  FChainAliases; ThresholdVMID switch case split to MPCVMID / FHEVMID;
  optIn chain slice uses config.MChainGenesis + config.FChainGenesis
  (T-Chain slot retired).
- LLM.md: point at LP-0130 as canonical topology + fee spec; correct
  the quantumvm posture to service-only per LP-0130 §6 (Q-Chain has
  no user-payable blockspace).

Build + vet clean on chains/mpcvm/... + node/{vms/mpcvm,genesis,node}/...

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-03 01:23:03 -07:00
zeekayandHanzo Dev 3db595a637 node v1.34.5: bump C-Chain EVM plugin pin v1.104.0 -> v1.104.1
Picks up the DEX 0x9999 genesis-injection fix (evm v1.104.1): 0x9999's
EXTCODESIZE marker is no longer baked into pre-2025 genesis state, so the
archived Lux mainnet (0x3f4fa2a0), Lux testnet (0x1c5fe377) and Zoo mainnet
(0x7c548af4) RLPs re-import byte-identical. 0x9999 activates at its protocol
timestamp (2025-12-25) during replay. rpcChainVM protocol 42 unchanged.

Forward-integrated on v1.34.4 (bootstrap/finality split, consensus v1.35.15) —
v1.34.4 was already taken and still pinned evm v1.104.0. This is a minimal
patch on top: EVM pin only.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-02 17:49:22 -07:00
zeekayandHanzo Dev ec5cf94145 node: v1.34.3 — decomplected single-validator DECIDE fix + evm accept-empty pin
consensus v1.35.13 -> v1.35.14 (decomplect: removed the selfVoter shortcut that
self-deadlocked on t.mu.RLock — the live n=1 freeze; K==1 now finalizes solely via the
inline finalizer, one path). EVM_VERSION v1.103.0 -> v1.104.0 (= v1.103.0 + accept-empty:
a consensus-finalized empty block Accepts, so VM.Accept can never fail-closed on an empty
first block — the stale-evm-pin gap). Unblocks single-validator Zoo mainnet/testnet +
Hanzo (all frozen at block 0).

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-02 15:29:50 -07:00
zeekay 2e98019144 Merge branch 'deploy/dex-v114-integer-wire' 2026-07-02 11:03:04 -07:00
zeekayandHanzo Dev 6424671eb7 deploy: bump DEX stack to fork-safe integer wire (chains v1.7.0, evm v1.103.0, precompile v0.19.0)
Deploys the launch-blocker fixes: F1-F5 cross-arch execRoot fork (exact-integer
ZAP wire, no float64 in consensus) + F9 infinite-money unbacked-deposit (authority
gate, fail-closed). Rebuilds the bundled DexVM + EVM plugins on the reconciled
dep chain (dex v1.14.0 lx→dex fold). Cross-arch execRoot proven identical.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-02 11:03:04 -07:00
zeekayandHanzo Dev bd996c41b1 node v1.32.12: bake evm v1.101.3 (stateless ParseBlock — fixes C-Chain bootstrap descent stall)
Bootstrap descent no longer stalls on ancestry blocks ahead of the accepted height:
evm v1.101.3 decomplects BlockGasCost from ParseBlock (parse decodes; Verify enforces).
Carries the v1.32.11 isBootstrapped-truth + ancestry-fetch hardening.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-02 03:23:28 -07:00
zeekayandHanzo Dev feef2bcb1e diag: bake evm v1.101.3-diag (PARSEBLOCK_DIAG logging) for descent root-cause
Temporary diagnostic node build. To be reverted after the evm ParseBlock fix.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-02 03:07:08 -07:00
zeekayandHanzo Dev 51a304804c chore: migrate luxd HTTP routes /ext -> /v1
Drop the Avalanche-heritage /ext prefix; /v1 is the single canonical route
surface (one way, no backward compat). The node's baseURL is the source of
truth; clients, SDKs, CLI, indexer, maker, genesis, netrunner, and the
k8s/compose/gateway/explorer configs are updated to match.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-01 11:40:13 -07:00
zeekayandHanzo Dev d254dccc8a node v1.32.7: bake evm v1.101.2 (on-demand pruned-state rebuild — real fix for fresh-multi-node halt)
evm v1.101.1's accept-path guard was confirmed a no-op live (halt reproduced at
block 8 on v1.32.6). v1.101.2 rebuilds pruned parent state on demand at BuildBlock,
which is where the post-accept state loss manifests. Isolated EVM_VERSION bump on
the v1.32.4 baseline.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-01 10:25:49 -07:00
zeekayandHanzo Dev fc20584db0 node v1.32.6: bake evm v1.101.1 (accept-path state-materialization backstop)
Isolated bump of EVM_VERSION v1.99.52 -> v1.101.1 on the v1.32.4 baseline.
v1.101.1 core/plugin code == v1.99.52 (verified byte-identical) + the accept-path
equivocation-commit-gap backstop (BlockChain.Accept re-materializes an accepted
block's state if !HasState, on the parent state). Fixes the fresh-genesis testnet/
devnet block-2 'missing trie node' halt. CHAINS_REF/DEX_REF unchanged. Devnet test
build; RED-gated before mainnet.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-01 06:27:09 -07:00
zeekayandHanzo Dev d291ea44c6 build(evm-plugin): bump baked C-Chain EVM plugin v1.99.51 -> v1.99.52 (bug 2 idle-builder wake)
node v1.32.3 = v1.32.2 + the idle-builder bounded-wake fix, delivered as the
baked C-Chain EVM plugin. The node Dockerfile git-clones luxfi/evm@EVM_VERSION
and builds ./plugin into the image; v1.99.52 = v1.99.51 + startPendingTxPoll
(500ms mempool re-poll so a tx submitted to an idle demand-driven chain wakes
the builder within a bounded window — closes the lost-wakeup/subscribe-gap).
Patch bump only (x.x.x+1 on the pinned v1.99.x line, NOT a jump to v1.100.x);
cherry-picked clean onto v1.99.51 and RED-cleared. Deterministic: wake timing
only, block contents unchanged.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-06-30 21:33:19 -07:00
zeekay a49c32cc2f deps+image: evm v1.99.51 + chains v1.4.8 — fix network-wide block-production stall
P0: all Lux C-Chains (mainnet/testnet/devnet) froze at their imported frontier —
no live block produced. Root cause in the EVM plugin block-build trigger:
1. WaitForEvent blocked forever when the node forwarder called it before the
   builder initialized (nil-builder race) — so PendingTxs never reached the
   engine and no block ever built.
2. A block built faster than parent.Time+TargetBlockRate has a higher required
   fee; a small-tip/legacy tx can't cover it, verifyBlockFee rejects it, stall.

evm v1.99.51 fixes both (builderReady select + target-rate pacing, with a
nextBuildTime pure helper + regression test). chains v1.4.8 rebuilds the
C-Chain VM plugin against it.

Dockerfile: EVM_VERSION v1.99.50->v1.99.51, chains pin + CHAINS_REF
v1.4.7->v1.4.8. node go.mod chains v1.4.7->v1.4.8 (+ tidy for the new
genesis/security transitive). luxd binary builds clean.
2026-06-28 00:58:24 -07:00
zeekay 69107d5c15 node v1.30.95 — Dockerfile EVM_VERSION v1.99.49→v1.99.50
Carries evm v1.99.50: paces block building to the target block rate, fixing
(1) small transactions never mining because the rapid-block gas cost exceeds
their tips, and (2) the equivocation crash-loop from validators racing to
finalize conflicting blocks at the same height. Together with v1.99.49
(WaitForEvent builder-ready race), a fresh multi-validator EVM chain now builds
and finalizes blocks under full BFT consensus and accepts ordinary traffic.
2026-06-28 00:13:59 -07:00
zeekay f353d6f1ee node v1.30.94 — Dockerfile EVM_VERSION v1.99.48→v1.99.49
Carries evm v1.99.49: fixes the fresh-start block-production stall where the
C-Chain EVM plugin's WaitForEvent blocks forever when the node-side notification
bridge calls it before SetState(NormalOp) initializes the block builder. Without
this, a freshly-booted (or restarted) EVM chain accepts txs into the mempool but
never builds a block. See luxfi/evm#fix/waitforevent-builder-ready-race.
2026-06-27 23:33:16 -07:00
zeekay 5bd5dbf154 deps+image: chains v1.4.7 + evm v1.99.48 + precompile v0.16.0 — enable-everything plugin
Dockerfile plugin pins bumped:
  - EVM_VERSION v1.99.47 -> v1.99.48 (C-Chain plugin mgj786…)
  - chains pin (EVM stage) + CHAINS_REF v1.3.22 -> v1.4.7 (bridge/zk/threshold/
    graph/identity/key/oracle/quantum/relay VM plugins)
node go.mod: chains v1.4.6 -> v1.4.7, precompile -> v0.16.0.

Delivers the enable-everything builder precompile surface (wallet curves
ed25519/sr25519/secp256r1 + standard ecrecover/p256/sha256/ripemd160/blake2f/
bls12381/kzg; fflonk fail-closed), accel CPU/GPU byte-identity, DEX 0x9999
price-floor big.Rat + stableswap token/gas bound + graph determinism, and warp
consolidated to ONE luxfi/warp helper across the chains VMs. graphvm
genesis-last-accepted fix carried forward in chains v1.4.7. luxd binary builds
green against the new deps.
2026-06-27 21:56:20 -07:00
zeekay c7dd2fc5a9 node v1.30.92 — Dockerfile EVM_VERSION v1.99.40→v1.99.47 so the 0x9999 EVM PLUGIN carries the DEX fix
The C-Chain EVM plugin (mgj786NP, where 0x9999 lives) is built from EVM_VERSION,
NOT node's go.mod. v1.30.91 bumped the binary deps but the plugin still built from
the stale v1.99.40 (precompile v0.12.0, no DEX fix). Bump EVM_VERSION→v1.99.47
(precompile v0.15.0 active-only DEX money path) + chains v1.3.21→v1.3.22 to match.
Now the deployed plugin actually carries the real-fill DEX code.
2026-06-27 19:08:29 -07:00
zeekay bd42106be3 node: bump chains v1.3.21→v1.3.22 (graphvm genesis last-accepted) on main
Brings the G-Chain consensus init fix (deployed as v1.30.72) onto main. graphvm
resolves a deterministic genesis last-accepted block so the G chain creates
cleanly over ZAP. Full build CGO_ENABLED=0 clean.
2026-06-26 18:05:06 -07:00
zeekay f88033df9c fix(docker): pin chains@v1.3.21 in the EVM-plugin build (evm v1.99.40 -> broken chains v1.3.19)
evm v1.99.40's go.mod pins luxfi/chains v1.3.19, whose dexvm/registry was an
incomplete refactor (forbidden.go deleted) -> AssertNoForbiddenAssetRefs / toHex /
fromHex / looksLikeASCIITickerID undefined -> EVM plugin won't compile. Force
chains@v1.3.21 (forbidden.go restored), matching node's go.mod + the chain-VM
plugin stage. This is the 2nd build blocker after the go.sum re-strip (v1.30.63);
together they should green the build (v1.30.59 -> v1.30.64).
2026-06-25 19:47:19 -07:00
zeekay 21da5b39b5 fix(docker): re-strip first-party go.sum before build (COPY . . clobbered the strip)
The pre-download strip (line 69) fixed go.sum, but `COPY . .` then restored the
committed stale go.sum, so the build hit a SECURITY ERROR when a luxfi/* module was
re-tagged (luxfi/age v1.5.0 here). Re-strip first-party lines right before the build
so -mod=mod re-records current cache hashes. Self-heals every future re-tag.
(v1.30.59 built; v1.30.60/61/62 failed on exactly this.)
2026-06-25 18:53:50 -07:00
zeekay 8d401fc5b8 release: bump EVM_VERSION v1.99.40 (0x9999 reprocess-bind fix, on-node proven) + deps to latest (chains v1.3.19, precompile v0.5.59, consensus v1.25.21) — no stragglers 2026-06-23 09:32:19 -07:00
zeekay 60a6c4b2ad Dockerfile: strip first-party go.sum before node go mod download
luxfi re-tagged crypto v1.19.22 (and others) after node go.sum was recorded,
causing 'checksum mismatch / SECURITY ERROR' at the node binary build step and
a cascading -mod=mod fallback to a corona pseudo-version with the old 2-value
Round1 API. Apply the same first-party go.sum strip the EVM/chains/dex plugin
stages already use, so -mod=mod re-records current content hashes for the
re-published modules at their pinned versions (integrity repair, no version drift).
2026-06-23 08:55:02 -07:00
zeekay cebb10fbc6 node: bump EVM_VERSION v1.99.35 -> v1.99.37 (0x9999 ERC-20 Call-surface env fix)
evm v1.99.37 (precompile v0.5.57) wires the 0x9999 ERC-20 Call surface to the
DEX settlement precompile (2cf30e43d) and gates it to the 0x9999/0x9996 settle
family (9579f2e34). Before this a CALL into 0x9999's ERC-20 settle path saw a
nil PrecompileEnv and could not resolve the token-transfer Call seam. v0.5.57
adds the CALL-only DELEGATECALL guard (feeaab5a0). Deps converge to latest
patch within v1.x.x (threshold v1.9.9, crypto v1.19.21, database v1.20.3,
geth v1.17.12, vm v1.2.5, api v1.0.15). Money path (V4 swap ABI, marker
install, dated DexSettleActivationTime fork) byte-unchanged.

Pairs with the baked DEX_REF v1.5.15 (D-Chain committed-state read RPC) for
one coordinated image: native-fill matcher + read RPC + ERC-20 env fix.

Also: harden the lux-accel fetch to authenticate with the ghtok BuildKit
secret (luxcpp/accel is private -> lux-private/accel; unauthenticated 404)
and make it best-effort (matches the cevm/lpm contract) since the GPU lib is
linked only at CGO_ENABLED=1 and the canonical build is CGO_ENABLED=0 pure-Go.

Image: ghcr.io/luxfi/node:v1.30.40 (patch from v1.30.39).
2026-06-22 15:09:16 -07:00
zeekay 5dcd8a7b4f node: bump DEX_REF v1.5.14 -> v1.5.15 (D-Chain committed-state read RPC)
v1.5.15 adds the D-Chain read surface (clob_get_trades/orders/markets/book over
/ext/bc/D/dex/<method>, pkg/dchain/read.go): read-only JSON of the committed
trade log, resting book, and markets, served beside the write methods via
VM.CreateHandlers with zero consensus impact.

Needed to (1) VERIFY a native fill replicated identically across the validator
set — query clob_get_trades on every node and diff the trade rows + accepted
head root — and (2) feed markets-display, since native fills are D-Chain trade:
rows (not C-Chain 0x9999 DEXFills).

Plugin VM id unchanged (mDVT5EWMumBp3LCqvKwuyZQeY1VXr1jvjGNAt8nL4UFiXvqXr); the
change is additive read endpoints, no consensus/state-transition change.
2026-06-22 14:57:04 -07:00
zeekay 4b80d407da node: bump DEX_REF v1.5.13 -> v1.5.14 (prefixdb prefix-iteration fix via database v1.20.4)
dex v1.5.14 consumes luxfi/database v1.20.4, which fixes prefixdb
NewIteratorWithStartAndPrefix synthesizing a pre-prefix start for a nil-start
prefix scan -> ZERO rows over a prefixdb-wrapped chain DB. This stranded the
native D-Chain: rebuildBookFromDB iterated order:<pool> alongside other
sub-prefix rows, folded an EMPTY book, and every taker cross produced 0 fills
despite durably-committed asks. Only the dexvm slot is rebuilt this run (devnet
D-Chain scope); the same database fix likely benefits the other plugin VMs and
is a separate follow-on bump.
2026-06-22 14:12:47 -07:00
zeekay dd5f22cf93 node: bump DEX_REF v1.5.12 -> v1.5.13 (D-Chain consensus stall fix)
dex v1.5.13 indexes processing blocks so the plugin transport's ID-only Accept
(GetBlock(builtID)) resolves the just-built block. Without it the native
D-Chain's self-finalize Accept is a silent no-op, the clob submitTx waiter hangs,
and NO D-Chain blocks are produced — orders submitted to /ext/bc/D/dex/clob_*
never match. Required for native trading to actually produce fills.
2026-06-22 12:28:37 -07:00
zeekay 3ab3fad41e node: bump DEX_REF v1.5.11 -> v1.5.12 (D-Chain restart fix)
dex v1.5.12 persists the head block so the native D-Chain VM survives a restart
once advanced past genesis — without it the first validator to restart fails VM
init ('get last accepted block: not found') and the D-Chain goes down. Required
for a 5-validator rolling restart of the native matcher.
2026-06-22 11:41:32 -07:00
zeekay ac22514f3d node: bump DEX_REF v1.5.10 -> v1.5.11 (native D-Chain CLOB ingestion)
dex v1.5.11 wires CLOB order ingestion over the node HTTP router
(pkg/dchain VM.CreateHandlers -> /ext/bc/D/dex/<method>). An order POSTed to
/ext/bc/D/dex/clob_submit flows submitTx -> mempool -> consensus -> BuildBlock
-> Verify(match) -> Accept; the chain is the matcher, no venue, no keeper.

Plugin stage rebuilds (ARG change invalidates the dexvm slot cache); node
go.mod is unaffected (the plugin is built from dex's own module, -mod=mod).
2026-06-22 11:17:45 -07:00
zeekay 36b9fb26f4 node: D-Chain (dexvm) plugin = native consensus matcher VM (dex/cmd/dchain)
The D-Chain runs as a PluginDir plugin loaded by luxd at the dexvm vmID
(mDVT5EWMumBp3LCqvKwuyZQeY1VXr1jvjGNAt8nL4UFiXvqXr). Until now that slot was
built from chains/dexvm/cmd/plugin — the STATELESS PROXY that relayed clob_*
frames over ZAP to a standalone dchain-venue (DexZapEndpoint). Matching did
NOT happen in luxd consensus; it happened in the external venue's single-node
sealer.

Build the dexvm slot from github.com/luxfi/dex@v1.5.10 ./cmd/dchain instead:
the NATIVE VM (pkg/dchain, block.ChainVM) that runs the lx.OrderBook matcher
INSIDE luxd consensus — BuildBlock drains the mempool, Block.Verify matches
against a versiondb overlay, Block.Accept commits. The trade IS the D-Chain
state transition, sequenced by luxd's multi-validator engine. No
DexZapEndpoint, no standalone venue in the trading path.

cmd/dchain wraps the VM in the same rpc.Serve plugin harness luxfi/evm uses
and is pure-Go (CGO=0); same GOFLAGS/go.sum-heal pattern as CHAINS_REF. The
other 10 chains VMs still build from chains. New ARG DEX_REF=v1.5.10; a FATAL
guard fails the build if the native D-Chain plugin is missing. Verified: a
fresh v1.5.10 clone builds ./cmd/dchain CGO=0 -mod=mod in Docker-like
isolation; native VM suite (TestLocalnetVenueE2E/TestFourPath/conservation)
passes.
2026-06-22 03:44:08 -07:00
Antje Worring 7f507e7236 deps: chains v1.3.16 -> v1.3.17 (consensus v1.25.19 Round1 fix) + hanzoai sumdb exclusion
Two CI-image-build blockers fixed: (1) chains v1.3.16 pinned consensus v1.25.18
which calls the old single-value corona Round1 -> quantumvm plugin compile break;
v1.3.17 bumps consensus to v1.25.19 (Round1 returns error). (2) hanzoai/* excluded
from sumdb/proxy (404 on hanzoai/vfs go.mod). All 11 VM plugins build; luxd 57MB.
2026-06-22 03:12:58 -07:00
Antje Worring b22cdd965c fix(docker): exclude hanzoai/* from sumdb+proxy (unblocks image build)
The CI Docker build failed reading hanzoai/vfs@v0.4.1's go.mod via the public
sum.golang.org (404 — it's a cross-org module not registered there), same class
as luxfi/*. Added github.com/hanzoai/* to GONOSUMCHECK/GONOSUMDB/GONOPROXY.
Verified: clean 'go mod download hanzoai/vfs@v0.4.1' 404s without the exclusion,
succeeds with it. Unblocks ghcr.io/luxfi/node image builds (v1.30.30/31 failed).
2026-06-22 03:04:10 -07:00
zeekay 6a8a4f3a36 deps: consume chains v1.3.16 (dexvm dex.submitTx + dex.getSettlement RPC seam)
The dexvm plugin gains the C<->D keeper RPC seam: dex.submitTx (mempool entry for
ImportTx + settling RelayOrderTx) and dex.getSettlement (D->C proceeds coordinate
for Phase-B). Bumps go.mod luxfi/chains v1.3.15->v1.3.16 AND Dockerfile CHAINS_REF
v1.3.14->v1.3.16 so the bundled dexvm plugin is rebuilt with the new RPC. go mod
verify clean; dexvm plugin builds from the v1.3.16 tag (CI mode).
2026-06-22 02:47:26 -07:00
zeekay c36527ce2a node: bump EVM_VERSION v1.99.34 -> v1.99.35 (native 0x9999 DEXFill/Initialize indexing) (v1.30.28)
evm v1.99.35 pins precompile v0.5.55, which emits the DEXFill + V4 Initialize
logs the explorer's DEX graph indexes — Dec-25-2025 activation-gated (same
dated fork as 0x9999 dispatch; no fork risk). EVM_VM_ID unchanged (money path
byte-identical). Plugin pulls precompile v0.5.55 transitively via the evm clone.
2026-06-21 14:29:19 -07:00
zeekay 813a6596ff node: bump C-Chain EVM plugin to v1.99.34 — 0x9999 replay consensus-divergence fix (v1.30.27)
EVM_VERSION v1.99.33 -> v1.99.34 (precompile v0.5.53 -> v0.5.54). v1.99.34 fixes
the ONE HIGH from Red's review of the 0x9999 dated-fork activation that blocked
the production deploy: the EVM dispatch gate read a process-global timestamp
(last-writer-wins across concurrent goroutines), so on the relaunch path
(admin.importChain of a pre-fork RLP snapshot on a live, RPC-serving post-fork
node) a concurrent post-fork eth_call could make a pre-fork block see 0x9999
ENABLED and dispatch settlement during plain-account execution -> state
divergence. The gate now reads the overrider's own per-EVM (chainConfig,
timestamp). Also: SubBalance fallback fails closed (no silent native mint) and
the genesis-config builders skip AlwaysOn modules (0x9999 can't get a
timestamp-0 genesis config that bypasses the dated fork). Money path
byte-for-byte unchanged. This unblocks the production deploy.
2026-06-21 12:41:01 -07:00
zeekay a5bed03d83 node: EVM_VERSION v1.99.33 — 0x9999 dated-fork activation + 0x9010 removal (v1.30.26)
Bundle the C-Chain EVM plugin built from luxfi/evm v1.99.33 (precompile v0.5.53):
0x9999 DEX settlement now activates at a SINGLE canonical dated fork
(extras.DexSettleActivationTime = 1766704800, Dec 25 2025) instead of the v1.99.32
unconditional always-on. At the fork it BOTH enables dispatch AND installs the
EXTCODESIZE marker forward (never in historical genesis), so:
  - eth_getCode(0x9999) != 0x and typed Solidity IPoolManager(0x9999).swap(...)
    passes the contract-existence guard from the activation block onward;
  - pre-Dec-25 history replays byte-identically (the ~/work/lux/state RLP snapshot
    via admin.importChain) — a pre-fork value transfer to 0x9999 hits a PLAIN
    account, not the precompile, so canonical pre-activation state is preserved;
  - the C-Chain genesis hash is unchanged (no genesis-time marker).
0x9010 is REMOVED entirely (not a registered precompile, no dispatch, no forward);
0x9999 is the SOLE canonical DEX precompile. Runtime DChainID via the "D" alias and
the built-in DAO-treasury protocolFeeController are unchanged.

deps: indirect precompile v0.5.52 -> v0.5.53 (go.sum tidied: stale v0.5.52 hashes
dropped; v0.5.53 hash matches the evm/precompile repos byte-for-byte). node main
builds clean GOWORK=off; go mod verify OK; go mod tidy is a no-op on go.mod.
2026-06-21 12:13:01 -07:00
zeekay 81fb68e54d node: EVM_VERSION v1.99.32 — 0x9999 always-on DEX settlement (v1.30.25)
Bump the bundled C-Chain EVM plugin to v1.99.32 (precompile v0.5.52): the native
0x9999 DEX settlement money path is now ALWAYS-ON. It is active on the C-Chain from
genesis with ZERO per-net config — no dexSettleConfig genesis/upgrade entry anywhere.
Booting luxd = 0x9999 live on the C-Chain, on every Lux network.

Activation is dispatch-only (no genesis state write → genesis hash unchanged → no
fork of any existing network). The D-Chain (dexvm) peer the atomic seam routes to is
resolved at RUNTIME from the consensus-context "D" alias the node already registers in
initChainAliases (chains/manager.go BCLookup), via contract.AtomicState.DChainID().
The protocolFeeController is the built-in DAO treasury. Nothing per-net to configure.

Dockerfile: ARG EVM_VERSION v1.99.31 -> v1.99.32 (the plugin is built from this tag).
go.mod/go.sum: indirect luxfi/precompile v0.5.51 -> v0.5.52 (keeps node's transitive
graph in lockstep with the plugin; node main builds clean GOWORK=off, go mod verify OK).
2026-06-21 09:23:48 -07:00