Skip to content

cluster-tool: retarget the Solana outpost to liqsol_core + agave 4.0.3 fixes - #27

Merged
jglanz merged 2 commits into
masterfrom
fix/solana-opp-integration
Jul 15, 2026
Merged

jglanz merged 2 commits into
masterfrom
fix/solana-opp-integration

Conversation

@jglanz

@jglanz jglanz commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Summary

Harness retarget for the wire-solana cleanroom (liqsol_core-hosted OPP outpost) + agave 4.0.3 fixes.

  • SolanaOutpostProgramTool — single source of truth for the wire-solana artifact layout (program name, keypair/.so/IDL subpaths, programId/assertProgramId, readIdl). The validator preload, outpost bootstrapper, daemon artifact preparation, and the flow Anchor loader all resolve through it. Daemon arg builders pass --solana-outpost-program-name liqsol_core; the IDL copies verbatim with a structural required-instructions guard.
  • SolanaOutpostBootstrapper — initialize → initializeOutpost; registers the native-SOL zero-mint binding + its 9-dec precision.
  • SolanaYieldEmitterTool — AddAttestation account list matches the cleanroom (3 accounts).
  • agave 4.0.3:
    • gossip binds at the FIXED default instead of carving from --dynamic-port-range → BindConfig resolves a per-cluster gossip port through the file-locked registry (a plain claim like every other port) and SolanaValidatorProcess passes --gossip-port;
    • --limit-ledger-size defaults to agave-validator's mainnet DEFAULT_MAX_LEDGER_SHREDS (200,000,000) — the test validator's 10k-shred default prunes the blockstore to a ~90s window, which broke the underwriter's SwapDeposit source-deposit verify mid-flow.
  • PersistedClusterConfig exported; test fixtures typed against it; requireOption → assertOption per the assert* naming standard.
  • Docs: the canonical flow-run pattern (scripts/run-flow.mjs + scripts/flow-heartbeat-monitor.mjs, one monitor instance per run) written through CLAUDE.md, README (new "Monitoring a live flow run" section), and the flow READMEs; stale WIRE_CHAIN_DIR/WIRE_BUILD_DIR rows corrected; soak default corrected to 30 min.

Merge order

Requires the wire-sysio companion (--solana-outpost-program-name): merge Wire-Network/wire-sysio#517 (chained onto Wire-Network/wire-sysio#511) before or with this PR — an updated harness against an older nodeop fails with Unknown option.

Companions

  • Wire-Network/wire-sysio PR #517 (plugin option + required token custody; chained onto #511)
  • Wire-Network/wire-solana PR #374 (cleanroom parity port; held for the e2e gate, then rebase-merged)

Validation

  • cluster-tool suite 511/511
  • All 13 flows green locally, including two-cluster parallel runs on the registry-resolved ports
  • Cross-repo gate: e2e-tests dispatch over fix/solana-opp-integration in wire-sysio/wire-tools-ts/wire-solana (FLOW_MAX_CONCURRENCY=4)

🤖 Generated with Claude Code

jglanz and others added 2 commits July 14, 2026 16:51
…3 fixes

- SolanaOutpostProgramTool: single source of truth for the wire-solana
  artifact layout (program name, keypair/.so/IDL subpaths, programId /
  assertProgramId, readIdl); the validator preload, outpost
  bootstrapper, daemon artifact preparation, and the flow Anchor loader
  all resolve through it. Daemon arg builders pass
  --solana-outpost-program-name liqsol_core; the IDL copies VERBATIM
  with a structural required-instructions guard.
- SolanaOutpostBootstrapper: initialize -> initializeOutpost; registers
  the native-SOL zero-mint binding + its 9-dec precision.
- SolanaYieldEmitterTool: AddAttestation account list matches the
  cleanroom (3 accounts, no system_program).
- agave 4.0.3: the test validator binds gossip at its FIXED default
  instead of carving from --dynamic-port-range, so BindConfig resolves a
  per-cluster gossip port through the file-locked registry (a plain
  claim like every other port) and SolanaValidatorProcess passes
  --gossip-port. --limit-ledger-size defaults to agave-validator's
  MAINNET default (DEFAULT_MAX_LEDGER_SHREDS = 200_000_000) — the test
  validator's 10k-shred default prunes the blockstore to a ~90s window,
  which broke the underwriter's SwapDeposit source-deposit verify
  mid-flow.
- PersistedClusterConfig exported; test fixtures typed against it
  (kills a literal-narrowing latent tsc error); requireOption ->
  assertOption per the assert* naming standard.
- Docs: the canonical flow-run pattern (scripts/run-flow.mjs +
  scripts/flow-heartbeat-monitor.mjs, one monitor instance per run)
  written through CLAUDE.md, README (new "Monitoring a live flow run"
  section), and the flow READMEs; stale WIRE_CHAIN_DIR / WIRE_BUILD_DIR
  rows corrected to the standard WIRE_CLUSTER_PATH / WIRE_BUILD_PATH
  contract; soak default corrected to 30 min.

Requires the wire-sysio companion branch (same name) for the
--solana-outpost-program-name option. cluster-tool suite 511/511; all 13
flows green locally, including two-cluster parallel runs on the
registry-resolved ports.

Co-Authored-By: Claude Fable 5 <[email protected]>
Change-Id: I5e52eb2ffff0ecd50608b9f3ba143a23bf8bdf14
…ator startup ceiling

- ManagedProcess.awaitReady: a child that exited can never become ready —
  surface its exit code immediately instead of burning the whole verify
  budget. A crashed daemon and a slow boot previously produced the
  IDENTICAL 'did not pass verifyReady within Nms' line (2026-07-14 e2e
  gate: solana-test-validator start failures were undiagnosable from the
  message alone).
- SolanaValidatorProcess.StartupTimeoutMs 180s -> 480s: the gate
  bootstraps several clusters concurrently; simultaneous agave genesis +
  PoH initialization on a shared runner exceeds 180s. The readiness poll
  returns early on healthy hosts, so the ceiling costs nothing there.

Co-Authored-By: Claude Fable 5 <[email protected]>
Change-Id: Ie6abc68bdc26cbbac14c635faa76cb1b198b1053
@jglanz

jglanz commented Jul 14, 2026

Copy link
Copy Markdown
Contributor Author

e2e gate GREEN over this branch: all 13 flows passed — run: https://github.com/Wire-Network/wire-platform-build-system/actions/runs/29368882980. Companions: Wire-Network/wire-sysio#517 (merge first — the --solana-outpost-program-name option), Wire-Network/wire-solana#374 (rebase-merged into next). The branch additionally carries the fail-fast-on-child-exit verify + validator startup ceiling landed from the run's failure analysis (three transient CI port-squat validator crashes, all retried green).

@jglanz
jglanz merged commit d44af80 into master Jul 15, 2026
qhool added a commit that referenced this pull request Aug 13, 2026
THREE things, all downstream of the #27 review and the master merge.

1. GAS CEILING IS NOW A BOOLEAN. The two-member enum had one member
   (`mainnetParity`) that meant "do what AnvilProcess already does
   unconditionally" — a no-op wearing a type. Replaced by
   `ethereumGasUncapped: boolean` / `--ethereum-gas-uncapped` /
   `WIRE_ETHEREUM_GAS_UNCAPPED`, default false. AnvilProcess.gasArgs
   takes the boolean. An unrecognised env value resolves FALSE rather
   than throwing: silently enabling an unrealistic gas regime would make
   a run look like it proved something about mainnet when it proves
   nothing, so the safe direction is "stay realistic".

2. MASTER-INTEGRATION BREAKS, found by a real recompile. Master split
   the durable operator LABEL from the generated ACCOUNT, so
   `underwriterAccountName(index)` is gone: the flow now takes the label
   for plan-time text and resolves the account from
   `ctx.keyStore.assertOperator(label).account` inside the predicate,
   where provisioning has run. `NodeConfig.batchOperatorAccount` ->
   `batchOperatorLabel`. `resolveLatestNonce` lost its count parameter
   when master centralised nonce authority for the shared ETH signer.

   These were latent behind a STALE INCREMENTAL BUILD: `tsc -b`
   considered the flow package current, so the post-merge "green" build
   never rechecked it. Editing a comment invalidated the tsbuildinfo and
   they surfaced. Verified now with `clean.sh && pnpm -r run clean` and a
   from-zero rebuild — the check that should have been run the first
   time.

3. LOCAL-ONLY DOCS, per the #27 review ("the flow should be standalone
   and can not accept outside config, running LOCALLY - CAN accept the
   outside config"). Four places claimed the e2e gate wires these env
   vars in shared job env; the gate now sets neither. Corrected in
   LoadProfile, the scenario Constants, ClusterConfigProvider, and
   CLAUDE.md's env table + CLI sentence.

Clean build, eslint 0, 280 suites / 2,146 tests.

Co-Authored-By: Claude <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant