Skip to content

Add stable megapool validator deposit UI#154

Open
saju01 wants to merge 5 commits into
dappnode:mainfrom
saju01:ui-megapool-deposits-testnet
Open

Add stable megapool validator deposit UI#154
saju01 wants to merge 5 commits into
dappnode:mainfrom
saju01:ui-megapool-deposits-testnet

Conversation

@saju01

@saju01 saju01 commented Jun 2, 2026

Copy link
Copy Markdown

Summary

Port of the stable Smartnode v1.20.3 + Saturn/megapool validator deposit UI/API work to the Hoodi testnet package, per maintainer request on mainnet PR #25.

This keeps the testnet package identity intact:

  • package: rocketpool-testnet.public.dappnode.eth
  • network/build arg: hoodi
  • global envs: EXECUTION_CLIENT_HOODI, CONSENSUS_CLIENT_HOODI
  • dependency: web3signer-hoodi.dnp.dappnode.eth

What changed

  • Bumps Smartnode upstream from v1.20.2 to stable v1.20.3.
  • Aligns the settings template with v1.20.3 fields, including internal Smartnode HTTP API port 8280.
  • Migrates Dappnode wrapper calls away from removed rocketpoold api ... commands and toward the stable daemon HTTP API at http://127.0.0.1:8280.
  • Adds /api/v1/megapool/next-validator-bond so the UI asks Smartnode for the next validator bond requirement instead of hardcoding 4 ETH.
  • Adds a stable Saturn/megapool validator deposit path in the UI.
  • Preserves large wei values as strings before JS parsing to avoid precision loss.
  • Supports the existing testnet NETWORK=hoodi env in rocketpool-start.sh (testnet still works too).

Validation run locally

  • yarn --cwd build/api build
  • yarn --cwd build/ui build
  • bash -n build/rocketpool-start.sh
  • dappnode_package.json parses as valid JSON ✅

UI build warnings are existing eslint warnings in RewardsTab.tsx / Minipools.tsx; build completes.

Requested Hoodi validation before merge

Because this changes the Dappnode transaction path and first-run password setup, please validate on a Dappnode Hoodi/testnet install before merging:

  1. first-run wallet password setup still works,
  2. the UI can fetch the next megapool validator bond requirement through internal :8280,
  3. can-deposit returns the expected result,
  4. a test deposit succeeds,
  5. returned validatorPubkeys are imported into Web3Signer correctly.

Related mainnet/stable PR: dappnode#25

saju01 and others added 4 commits June 2, 2026 10:52
- UPSTREAM_VERSION / upstreamVersion v1.19.3 -> v1.20.3 (latest stable
  Smartnode release, 2026-05-21); package version 0.1.8 -> 0.1.9.
- Fix auto_check.yml so future Smartnode releases auto-PR:
  - push trigger watched 'master' but default branch is 'main'
  - no permissions block -> read-only GITHUB_TOKEN could not open the
    bump branch/PR (dappnodesdk bump-upstream needs write)
  - bumped actions/checkout v2 -> v4; added workflow_dispatch
- Add the v1.20.x native-mode Smartnode HTTP API port default (8280) to the generated settings template without exposing it publicly.\n- Add Lodestar's QUIC P2P port default (8001), matching the existing Lighthouse/Prysm entries and upstream v1.20.3 config.\n- Add the explicit IPv6 default (disabled) and align root.version with the bundled Smartnode v1.20.3.
@mgarciate

Copy link
Copy Markdown
Collaborator

@saju01 Just curious, have you tested the UI + API against real pools yet, even if it was outside of DAppNode?

@saju01

saju01 commented Jun 2, 2026

Copy link
Copy Markdown
Author

Not yet against real pools.

So far I’ve validated this at the code/build level:

  • API build passes
  • UI build passes
  • startup script syntax passes
  • the wrapper is mapped to the stable Smartnode v1.20.3 HTTP API routes rather than the removed rocketpoold api ... path
  • testnet package metadata remains Hoodi-specific

But I have not yet run the full UI + API flow against a live Rocket Pool Hoodi pool / actual deposit path.

That’s why I marked this PR as needing Hoodi/DAppNode validation before merge. The key flows I’d want to test are:

  1. first-run wallet password setup,
  2. fetching next validator bond through the internal :8280 API,
  3. can-deposit,
  4. actual Hoodi test deposit,
  5. returned validatorPubkeys import into Web3Signer.

Happy to adjust based on what you see in testnet validation.

@saju01

saju01 commented Jun 24, 2026

Copy link
Copy Markdown
Author

Status update — keeping this aligned with the new auto-bump cadence. The mainnet sibling's older v1.20.3 bump (#24) was closed as superseded by tropibot's v1.20.5 bump; the testnet auto-bump is #158.

This deposit-UI PR is independent of those version bumps (they only touch the daemon version, not the UI/API). I re-verified compatibility: the wrapper calls stable Smartnode HTTP routes at :8280 (/api/node/can-deposit, /api/megapool/status, /api/wallet/*), and v1.20.4/v1.20.5 are client + bugfix releases with no API route changes — so this stays compatible on top of #158.

Still flagged as needing a live Hoodi/DAppNode validation pass before merge (the build/syntax checks pass; the real-pool deposit path is what's untested). Happy to rebase onto current master whenever useful.

@saju01

saju01 commented Jun 24, 2026

Copy link
Copy Markdown
Author

Update on the "have you tested the UI + API against real pools?" question — yes, now validated end-to-end on a live Hoodi pool, not just builds.

I ran the v1.20.x daemon in external-client mode (public Hoodi EL RPC + Beacon API) and drove this PR's flow against real Rocket Pool contracts:

First-run + deposit (this PR's flow):

One bug found while validating — worth fixing before merge:
The settings template uses network: ${NETWORK} and the package sets NETWORK=hoodi, but the Smartnode daemon's network enum only accepts mainnet|testnet|devnet. testnet is Hoodi internally (chainId 560048, RocketStorage 0x594Fb75D3dc2DFa0150Ad03F99F97817747dd4E1). With network: hoodi the daemon can't resolve the storage address and every on-chain call fails with "The Rocket Pool storage contract was not found." Rendering the setting as network: testnet fixes it immediately — every contract read then succeeds. (The repo's own history already uses testnet in user-settings; the megapool template just needs the same.)

Also opened #159 as a stacked follow-up adding the exit + claim/withdraw lifecycle (exit-queue / exit-validator / notify-exit / distribute / claim-refund), validated against the same live megapool — so there's the option of deposit-only here, or the full lifecycle.

The settings template rendered network: ${NETWORK} (= hoodi), but the
Smartnode daemon only accepts mainnet|testnet|devnet. "testnet" is Hoodi
internally (chainId 560048, RocketStorage 0x594Fb75D...). With network: hoodi
the daemon cannot resolve the storage address and every on-chain call fails
with "The Rocket Pool storage contract was not found".

Introduce SMARTNODE_NETWORK (mainnet -> mainnet, hoodi/testnet -> testnet),
pass it through envsubst, and use it for the template's network: field. The
dappnode package keeps using NETWORK=hoodi for its own identity (web3signer-hoodi,
globals, urls); only the smartnode setting is remapped.

Verified live on Hoodi: with network: testnet, node register + 4-ETH megapool
deposit succeed and all megapool routes resolve.
@saju01

saju01 commented Jun 24, 2026

Copy link
Copy Markdown
Author

Pushed the fix for the network: hoodi issue in 065edbf: introduces SMARTNODE_NETWORK (hoodi → testnet for the smartnode setting, mainnet → mainnet), passed through envsubst into the template's network: field. The package keeps NETWORK=hoodi for its own identity (web3signer-hoodi, globals, URLs) — only the smartnode network setting is remapped. Re-verified: with this, node register + the 4-ETH megapool deposit succeed and all megapool routes resolve against live Hoodi.

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.

2 participants