From 519ee9648bfb213c9a2b4d59f32f527579849e91 Mon Sep 17 00:00:00 2001 From: Santiago Gonzalez Date: Sat, 2 Aug 2025 00:19:35 +0200 Subject: [PATCH 01/12] add support for Hoodi testnet + Reth Execution Client --- build/api/src/AppConfig.ts | 6 +-- build/rocketpool-start.sh | 84 +++++++++++++++++--------------- build/ui/src/types/AppConfig.ts | 2 +- build/ui/src/types/Network.ts | 2 +- build/user-settings_template.yml | 9 ++++ dappnode_package.json | 4 +- docker-compose.yml | 4 +- 7 files changed, 62 insertions(+), 49 deletions(-) diff --git a/build/api/src/AppConfig.ts b/build/api/src/AppConfig.ts index 4fc1e41..1877b5d 100644 --- a/build/api/src/AppConfig.ts +++ b/build/api/src/AppConfig.ts @@ -15,10 +15,10 @@ class AppConfig { private config: Config; private constructor() { - const network = shelljs.exec(`echo $NETWORK`).stdout.trim() || "holesky"; + const network = shelljs.exec(`echo $NETWORK`).stdout.trim() || "hoodi"; const isMainnet = network === "mainnet"; - const w3sSuffix = isMainnet ? "" : "-holesky"; - const networkPrefix = isMainnet ? "" : "holesky."; + const w3sSuffix = isMainnet ? "" : "-hoodi"; + const networkPrefix = isMainnet ? "" : "hoodi."; this.config = { network: network, brainAPIUrl: `http://brain.web3signer${w3sSuffix}.dappnode:3000`, diff --git a/build/rocketpool-start.sh b/build/rocketpool-start.sh index 128509e..841b544 100644 --- a/build/rocketpool-start.sh +++ b/build/rocketpool-start.sh @@ -41,7 +41,7 @@ case $NETWORK in ;; esac - # Assign proper value to _DAPPNODE_GLOBAL_CONSENSUS_CLIENT_HOLESKY. + # Assign proper value to _DAPPNODE_GLOBAL_CONSENSUS_CLIENT_MAINNET. case "$_DAPPNODE_GLOBAL_CONSENSUS_CLIENT_MAINNET" in "prysm.dnp.dappnode.eth") _BEACON_NODE_API_3500="http://beacon-chain.prysm.dappnode:3500" @@ -75,63 +75,67 @@ case $NETWORK in esac ;; -"holesky") - echo "Holesky network" +"testnet") + echo "Hoodi network" # https://github.com/dappnode/DAppNodePackage-SSV-Shifu/blob/775dfbc2190b8c3bc7384a2e4c62d83892071001/build/entrypoint.sh#L3 - # Assign proper value to _DAPPNODE_GLOBAL_EXECUTION_CLIENT_HOLESKY. - case $_DAPPNODE_GLOBAL_EXECUTION_CLIENT_HOLESKY in - "holesky-geth.dnp.dappnode.eth") - _EXECUTION_LAYER_HTTP="http://holesky-geth.dappnode:8545" - _EXECUTION_LAYER_WS="ws://holesky-geth.dappnode:8546" + # Assign proper value to _DAPPNODE_GLOBAL_EXECUTION_CLIENT_HOODI. + case $_DAPPNODE_GLOBAL_EXECUTION_CLIENT_HOODI in + "hoodi-geth.dnp.dappnode.eth") + _EXECUTION_LAYER_HTTP="http://hoodi-geth.dappnode:8545" + _EXECUTION_LAYER_WS="ws://hoodi-geth.dappnode:8546" ;; - "holesky-nethermind.dnp.dappnode.eth") - _EXECUTION_LAYER_HTTP="http://holesky-nethermind.dappnode:8545" - _EXECUTION_LAYER_WS="ws://holesky-nethermind.dappnode:8546" + "hoodi-nethermind.dnp.dappnode.eth") + _EXECUTION_LAYER_HTTP="http://hoodi-nethermind.dappnode:8545" + _EXECUTION_LAYER_WS="ws://hoodi-nethermind.dappnode:8546" ;; - "holesky-besu.dnp.dappnode.eth") - _EXECUTION_LAYER_HTTP="http://holesky-besu.dappnode:8545" - _EXECUTION_LAYER_WS="ws://holesky-besu.dappnode:8546" + "hoodi-besu.dnp.dappnode.eth") + _EXECUTION_LAYER_HTTP="http://hoodi-besu.dappnode:8545" + _EXECUTION_LAYER_WS="ws://hoodi-besu.dappnode:8546" ;; - "holesky-erigon.dnp.dappnode.eth") - _EXECUTION_LAYER_HTTP="http://holesky-erigon.dappnode:8545" - _EXECUTION_LAYER_WS="ws://holesky-erigon.dappnode:8545" + "hoodi-reth.dnp.dappnode.eth") + _EXECUTION_LAYER_HTTP="http://hoodi-reth.dappnode:8545" + _EXECUTION_LAYER_WS="ws://hoodi-reth.dappnode:8546" + ;; + "hoodi-erigon.dnp.dappnode.eth") + _EXECUTION_LAYER_HTTP="http://hoodi-erigon.dappnode:8545" + _EXECUTION_LAYER_WS="ws://hoodi-erigon.dappnode:8545" ;; *) - echo "Unknown value or unsupported for _DAPPNODE_GLOBAL_EXECUTION_CLIENT_HOLESKY Please confirm that the value is correct" + echo "Unknown value or unsupported for _DAPPNODE_GLOBAL_EXECUTION_CLIENT_HOODI Please confirm that the value is correct" exit 1 ;; esac - # Assign proper value to _DAPPNODE_GLOBAL_CONSENSUS_CLIENT_HOLESKY. - case "$_DAPPNODE_GLOBAL_CONSENSUS_CLIENT_HOLESKY" in - "prysm-holesky.dnp.dappnode.eth") - _BEACON_NODE_API_3500="http://beacon-chain.prysm-holesky.dappnode:3500" - _BEACON_NODE_API_4000="http://beacon-chain.prysm-holesky.dappnode:4000" + # Assign proper value to _DAPPNODE_GLOBAL_CONSENSUS_CLIENT_HOODI. + case "$_DAPPNODE_GLOBAL_CONSENSUS_CLIENT_HOODI" in + "prysm-hoodi.dnp.dappnode.eth") + _BEACON_NODE_API_3500="http://beacon-chain.prysm-hoodi.dappnode:3500" + _BEACON_NODE_API_4000="http://beacon-chain.prysm-hoodi.dappnode:4000" _BEACON_NODE_CLIENT="prysm" ;; - "teku-holesky.dnp.dappnode.eth") - _BEACON_NODE_API_3500="http://beacon-chain.teku-holesky.dappnode:3500" - _BEACON_NODE_API_4000="http://beacon-chain.teku-holesky.dappnode:4000" + "teku-hoodi.dnp.dappnode.eth") + _BEACON_NODE_API_3500="http://beacon-chain.teku-hoodi.dappnode:3500" + _BEACON_NODE_API_4000="http://beacon-chain.teku-hoodi.dappnode:4000" _BEACON_NODE_CLIENT="teku" ;; - "lighthouse-holesky.dnp.dappnode.eth") - _BEACON_NODE_API_3500="http://beacon-chain.lighthouse-holesky.dappnode:3500" - _BEACON_NODE_API_4000="http://beacon-chain.lighthouse-holesky.dappnode:4000" + "lighthouse-hoodi.dnp.dappnode.eth") + _BEACON_NODE_API_3500="http://beacon-chain.lighthouse-hoodi.dappnode:3500" + _BEACON_NODE_API_4000="http://beacon-chain.lighthouse-hoodi.dappnode:4000" _BEACON_NODE_CLIENT="lighthouse" ;; - "nimbus-holesky.dnp.dappnode.eth") - _BEACON_NODE_API_3500="http://beacon-validator.nimbus-holesky.dappnode:4500" - _BEACON_NODE_API_4000="http://beacon-validator.nimbus-holesky.dappnode:4500" + "nimbus-hoodi.dnp.dappnode.eth") + _BEACON_NODE_API_3500="http://beacon-validator.nimbus-hoodi.dappnode:4500" + _BEACON_NODE_API_4000="http://beacon-validator.nimbus-hoodi.dappnode:4500" _BEACON_NODE_CLIENT="nimbus" ;; - "lodestar-holesky.dnp.dappnode.eth") - _BEACON_NODE_API_3500="http://beacon-chain.lodestar-holesky.dappnode:3500" - _BEACON_NODE_API_4000="http://beacon-chain.lodestar-holesky.dappnode:4000" + "lodestar-hoodi.dnp.dappnode.eth") + _BEACON_NODE_API_3500="http://beacon-chain.lodestar-hoodi.dappnode:3500" + _BEACON_NODE_API_4000="http://beacon-chain.lodestar-hoodi.dappnode:4000" _BEACON_NODE_CLIENT="lodestar" ;; *) - echo "Unknown value or unsupported for _DAPPNODE_GLOBAL_CONSENSUS_CLIENT_HOLESKY Please confirm that the value is correct" + echo "Unknown value or unsupported for _DAPPNODE_GLOBAL_CONSENSUS_CLIENT_HOODI Please confirm that the value is correct" exit 1 ;; esac @@ -153,11 +157,11 @@ export BEACON_NODE_CLIENT=$_BEACON_NODE_CLIENT # For testing porpuses, uncomment the above lines and comment the following ones # BEACON_NODE_CLIENT="prysm" -# EXECUTION_LAYER_HTTP="http://holesky-geth.dappnode:8545" -# EXECUTION_LAYER_WS="ws://holesky-geth.dappnode:8546" +# EXECUTION_LAYER_HTTP="http://hoodi-geth.dappnode:8545" +# EXECUTION_LAYER_WS="ws://hoodi-geth.dappnode:8546" -# BEACON_NODE_API_3500="http://beacon-chain.prysm-holesky.dappnode:3500" -# BEACON_NODE_API_4000="http://beacon-chain.prysm-holesky.dappnode:4000" +# BEACON_NODE_API_3500="http://beacon-chain.prysm-hoodi.dappnode:3500" +# BEACON_NODE_API_4000="http://beacon-chain.prysm-hoodi.dappnode:4000" NETWORK="${NETWORK}" \ BEACON_NODE_CLIENT="${BEACON_NODE_CLIENT}" \ diff --git a/build/ui/src/types/AppConfig.ts b/build/ui/src/types/AppConfig.ts index 2dc7153..3659eb0 100644 --- a/build/ui/src/types/AppConfig.ts +++ b/build/ui/src/types/AppConfig.ts @@ -8,6 +8,6 @@ export interface Config { package: string; } -const network = process.env.REACT_APP_NETWORK || "holesky"; +const network = process.env.REACT_APP_NETWORK || "hoodi"; const apiBaseUrl = network === "mainnet" ? "http://rocketpool.public.dappnode:3000" : "http://rocketpool-testnet.public.dappnode:3000"; export default apiBaseUrl; \ No newline at end of file diff --git a/build/ui/src/types/Network.ts b/build/ui/src/types/Network.ts index 02cfd36..ad1a11d 100644 --- a/build/ui/src/types/Network.ts +++ b/build/ui/src/types/Network.ts @@ -1,3 +1,3 @@ -export const networks = ["mainnet", "holesky"] as const; +export const networks = ["mainnet", "hoodi"] as const; export type Network = (typeof networks)[number]; diff --git a/build/user-settings_template.yml b/build/user-settings_template.yml index c28ecb8..584289d 100644 --- a/build/user-settings_template.yml +++ b/build/user-settings_template.yml @@ -128,6 +128,15 @@ nethermind: containerTag: nethermind/nethermind:1.17.3 maxPeers: "50" pruneMemSize: "256" +reth: + additionalFlags: "" + unsupportedCommonParams: "" + unsupportedCommonParams: "" + eventLogInterval: "1000" + cacheSize: "256" + containerTag: ghcr.io/paradigmxyz/reth:v1.4.3 + maxPeers: "50" + maxInboundPeers: "30" nimbus: additionalBnFlags: "" additionalVcFlags: "" diff --git a/dappnode_package.json b/dappnode_package.json index 212e23d..278b7af 100644 --- a/dappnode_package.json +++ b/dappnode_package.json @@ -14,7 +14,7 @@ }, "globalEnvs": [ { - "envs": ["EXECUTION_CLIENT_HOLESKY", "CONSENSUS_CLIENT_HOLESKY"], + "envs": ["EXECUTION_CLIENT_HOODI", "CONSENSUS_CLIENT_HOODI"], "services": ["rocketpool-testnet.public.dappnode.eth"] } ], @@ -26,7 +26,7 @@ } ], "dependencies": { - "web3signer-holesky.dnp.dappnode.eth": "latest" + "web3signer-hoodi.dnp.dappnode.eth": "latest" }, "license": "GLP-3.0" } diff --git a/docker-compose.yml b/docker-compose.yml index e8eacd8..05a667a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,11 +6,11 @@ services: context: ./build args: UPSTREAM_VERSION: v1.15.7 - NETWORK: holesky + NETWORK: hoodi volumes: - rocketpool-testnet:/rocketpool environment: - - NETWORK=holesky + - NETWORK=hoodi - WALLET_PASSWORD= - EXTRA_OPTS= restart: unless-stopped From 304adf7d49cd49949d4c7869f7cf0cb5495717e1 Mon Sep 17 00:00:00 2001 From: Santiago Gonzalez Date: Sat, 2 Aug 2025 00:21:08 +0200 Subject: [PATCH 02/12] fix parsing error on RPL token value sent to stake RPL actions --- build/ui/src/services/AppService.ts | 11 +++++++---- build/ui/src/utils/Utils.ts | 4 ++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/build/ui/src/services/AppService.ts b/build/ui/src/services/AppService.ts index f34c355..be57da7 100644 --- a/build/ui/src/services/AppService.ts +++ b/build/ui/src/services/AppService.ts @@ -11,7 +11,7 @@ import { WaitResponse } from "../types/WaitResponse"; import { NodeCanSetWithdrawalAddress } from "../types/NodeCanSetWithdrawalAddress"; import { NodeCanSetSmoothingPool } from "../types/NodeCanSetSmoothingPool"; import { CanDeposit } from "../types/CanDeposit"; -import { toWei } from "../utils/Utils"; +import { toWei, toWeiString } from "../utils/Utils"; import { NodeFee } from "../types/NodeFee"; import { StakeRplApprove } from "../types/StakeRplApprove"; import { CanStake } from "../types/CanStake"; @@ -150,20 +150,23 @@ export class AppService { return response.data; } public async stakeRplApprove(amount: number): Promise { + const amountWei = toWeiString(amount); const response = await this.api.post(`/api/v1/rocketpool-command`, { - cmd: `node stake-rpl-approve-rpl ${amount}`, + cmd: `node stake-rpl-approve-rpl ${amountWei}`, }); return response.data; } public async getNodeCanStakeRpl(amount: number): Promise { + const amountWei = toWeiString(amount); const response = await this.api.post(`/api/v1/rocketpool-command`, { - cmd: `node can-stake-rpl ${amount}`, + cmd: `node can-stake-rpl ${amountWei}`, }); return response.data; } public async nodeStakeRpl(amount: number): Promise { + const amountWei = toWeiString(amount); const response = await this.api.post(`/api/v1/rocketpool-command`, { - cmd: `node stake-rpl ${amount}`, + cmd: `node stake-rpl ${amountWei}`, }); return response.data; } diff --git a/build/ui/src/utils/Utils.ts b/build/ui/src/utils/Utils.ts index a148851..4476538 100644 --- a/build/ui/src/utils/Utils.ts +++ b/build/ui/src/utils/Utils.ts @@ -6,6 +6,10 @@ export function toWei(ether: number): number { return ether * 10 ** 18; } +export function toWeiString(ether: number): string { + return BigInt(ether).toString(); +} + export function toEther(wei: number): number { return wei / 10 ** 18; } From 91e754f5ef385ca6fc3b0b5fc7c021c6728fd579 Mon Sep 17 00:00:00 2001 From: Santiago Gonzalez Date: Sat, 2 Aug 2025 00:21:29 +0200 Subject: [PATCH 03/12] add minor fixes --- build/ui/src/components/Setup/CreateMinipool.tsx | 2 +- build/ui/src/components/Setup/MinipoolActions.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/ui/src/components/Setup/CreateMinipool.tsx b/build/ui/src/components/Setup/CreateMinipool.tsx index 079d84e..9c2dce0 100644 --- a/build/ui/src/components/Setup/CreateMinipool.tsx +++ b/build/ui/src/components/Setup/CreateMinipool.tsx @@ -204,7 +204,7 @@ const CreateMinipool: React.FC = ({ + ))} + + - -
- - {tabs.map((tab, index) => ( - - ))} - -
+ ); } diff --git a/build/ui/src/index.css b/build/ui/src/index.css index 4a1df4d..4a45f58 100644 --- a/build/ui/src/index.css +++ b/build/ui/src/index.css @@ -5,9 +5,73 @@ body { sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + overflow-x: hidden; } code { font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } + +/* Global mobile-friendly styles */ +* { + box-sizing: border-box; +} + +html { + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +/* Ensure touch targets are at least 44px */ +button, a, input, select, textarea { + min-width: 44px; +} + +/* Improve touch scrolling on iOS */ +* { + -webkit-overflow-scrolling: touch; +} + +/* Prevent horizontal scroll */ +body, html { + max-width: 100vw; + overflow-x: hidden; +} + +/* Mobile-specific improvements */ +@media (max-width: 768px) { + body { + font-size: 14px; + line-height: 1.4; + } + + /* Improve button spacing on mobile */ + .MuiButton-root { + min-height: 44px !important; + padding: 8px 16px !important; + } + + /* Improve card spacing */ + .MuiCard-root { + margin: 8px !important; + } + + /* Improve text readability */ + p, span, div { + word-wrap: break-word; + overflow-wrap: break-word; + } +} + +@media (max-width: 480px) { + body { + font-size: 13px; + } + + /* Smaller buttons on very small screens */ + .MuiButton-root { + padding: 6px 12px !important; + font-size: 0.8rem !important; + } +} From c01ec8903e97b765c8b96373cdf4e2d431dc1abe Mon Sep 17 00:00:00 2001 From: Santiago Gonzalez Date: Mon, 22 Sep 2025 23:16:08 +0200 Subject: [PATCH 11/12] add minor fixes --- build/ui/src/components/Advanced/AdvancedTab.tsx | 2 +- build/ui/src/components/Setup/MinipoolActions.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/ui/src/components/Advanced/AdvancedTab.tsx b/build/ui/src/components/Advanced/AdvancedTab.tsx index b4888ec..bafc197 100644 --- a/build/ui/src/components/Advanced/AdvancedTab.tsx +++ b/build/ui/src/components/Advanced/AdvancedTab.tsx @@ -37,7 +37,7 @@ const AdvancedTab: React.FC = (): JSX.Element => { event.preventDefault(); const output = await appService.runCustomCommand(command); - + // Append the command and output to the output box try { const jsonOutput = JSON.parse(output); diff --git a/build/ui/src/components/Setup/MinipoolActions.tsx b/build/ui/src/components/Setup/MinipoolActions.tsx index f997c86..823457d 100644 --- a/build/ui/src/components/Setup/MinipoolActions.tsx +++ b/build/ui/src/components/Setup/MinipoolActions.tsx @@ -38,7 +38,7 @@ function MinipoolActions({