Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/cl-client/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export type BeaconValidatorsResponse = z.infer<typeof BeaconValidatorsSchema>;
export const BeaconConfigSchema = z.object({
data: z.object({
ELECTRA_FORK_EPOCH: z.string(),
CAPELLA_FORK_EPOCH: z.string(),
SECONDS_PER_SLOT: z.string(),
SLOTS_PER_EPOCH: z.string(),
DEPOSIT_CONTRACT_ADDRESS: z.string(),
Expand Down
3 changes: 2 additions & 1 deletion packages/command/src/service/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,8 @@ export class DevNetService<Name extends keyof DevNetServices> {
: Record<keyof DevNetServices[Name]["labels"], ContainerInfo[]> | null
> {
const { labels } = this.config;

// todo: make something with dora
delete labels['dora'];
if (must) {
return await getContainersByServiceLabels<DevNetServices[Name]["labels"]>(
labels,
Expand Down
6 changes: 3 additions & 3 deletions packages/services/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ const lidoCore = new DevNetServiceConfig({
const lidoCLI = new DevNetServiceConfig({
repository: {
url: "https://github.com/lidofinance/lido-cli.git",
branch: "feature/devnet-command",
branch: "fix/vroom-306-temp-fix-fusaka-1",
},
name: "lidoCLI" as const,
constants: {
Expand Down Expand Up @@ -112,7 +112,7 @@ const kapi = new DevNetServiceConfig({
const oracle = new DevNetServiceConfig({
repository: {
url: "https://github.com/lidofinance/lido-oracle.git",
branch: "feat/oracle-v6",
branch: "fix/vroom-306-temp-fix-fusaka-1",
},
workspace: "workspaces/oracle-v6",
name: "oracle" as const,
Expand Down Expand Up @@ -161,7 +161,7 @@ const dsmBots = new DevNetServiceConfig({
const csm = new DevNetServiceConfig({
repository: {
url: "https://github.com/lidofinance/community-staking-module.git",
branch: "tags/v1",
branch: "v1.1",
},
name: "csm" as const,
constants: {
Expand Down
9 changes: 6 additions & 3 deletions src/commands/csm/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,15 @@ type CSMENVConfig = {
DEPLOYER_PRIVATE_KEY: string;
DEVNET_CHAIN_ID: string;
DEVNET_ELECTRA_EPOCH: string;
DEVNET_CAPELLA_EPOCH: string;
DEVNET_GENESIS_TIME: string;
DEVNET_SLOTS_PER_EPOCH: string;
EVM_SCRIPT_EXECUTOR_ADDRESS: string;
RPC_URL: string;
UPGRADE_CONFIG: string;
VERIFIER_API_KEY: string;
VERIFIER_URL: string;
FOUNDRY_BLOCK_GAS_LIMIT: string;
};

export const DeployCSMContracts = command.cli({
Expand Down Expand Up @@ -58,7 +60,7 @@ export const DeployCSMContracts = command.cli({
} = await clClient.getGenesis();

const {
data: { ELECTRA_FORK_EPOCH, SLOTS_PER_EPOCH },
data: { ELECTRA_FORK_EPOCH, SLOTS_PER_EPOCH, CAPELLA_FORK_EPOCH },
} = await clClient.getConfig();

const blockscoutConfig = await state.getBlockScout();
Expand All @@ -84,11 +86,12 @@ export const DeployCSMContracts = command.cli({
DEVNET_ELECTRA_EPOCH: ELECTRA_FORK_EPOCH,
DEVNET_GENESIS_TIME: genesis_time,
DEVNET_SLOTS_PER_EPOCH: SLOTS_PER_EPOCH,
DEVNET_CAPELLA_EPOCH: CAPELLA_FORK_EPOCH,
EVM_SCRIPT_EXECUTOR_ADDRESS: agent,
RPC_URL: elPublic,
UPGRADE_CONFIG: constants.UPGRADE_CONFIG,
VERIFIER_API_KEY: constants.VERIFIER_API_KEY,

FOUNDRY_BLOCK_GAS_LIMIT: "1000000000",
VERIFIER_URL: blockscoutConfig.api,
};

Expand All @@ -99,7 +102,7 @@ export const DeployCSMContracts = command.cli({

await dre.runCommand(CSMInstall, {});

const args = ["deploy-live-no-confirm", "-g", "200", "--legacy", "--private-key", "$DEPLOYER_PRIVATE_KEY"];
const args = ["deploy-live-no-confirm", "--slow", "--legacy", "--private-key", "$DEPLOYER_PRIVATE_KEY"];
if (params.verify) {
args.push("--verify", "--verifier", "blockscout", "--chain", "32382");
}
Expand Down
2 changes: 2 additions & 0 deletions src/commands/lido-core/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ type DeployEnvRequired = {
NETWORK_STATE_FILE: string;
RPC_URL: string;
SLOTS_PER_EPOCH: string;
GAS_LIMIT?: string;
};

export const DeployLidoContracts = command.cli({
Expand Down Expand Up @@ -63,6 +64,7 @@ export const DeployLidoContracts = command.cli({
GENESIS_TIME: genesis_time,
RPC_URL: elPublic,
SLOTS_PER_EPOCH: constants.SLOTS_PER_EPOCH,
GAS_LIMIT: '16000000',
};

await lidoCore.sh({ env: deployEnv })`bash -c scripts/dao-deploy.sh`;
Expand Down
153 changes: 153 additions & 0 deletions src/commands/stands/fusaka.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
import { Params, command } from "@devnet/command";

import { BlockscoutUp } from "../blockscout/up.js";
import { KurtosisGetInfo } from "../chain/info.js";
import { KurtosisUp } from "../chain/up.js";
import { CouncilUp } from "../council/up.js";
import { ActivateCSM } from "../csm/activate.js";
import { LidoAddCSMOperatorWithKeys } from "../csm/add-operator.js";
import { DeployCSVerifier } from "../csm/add-verifier.js";
import { DeployCSMContracts } from "../csm/deploy.js";
import { DataBusDeploy } from "../data-bus/deploy.js";
import { DSMBotsUp } from "../dsm-bots/up.js";
import { GitCheckout } from "../git/checkout.js";
import { KapiUp } from "../kapi/up.js";
import { ActivateLidoProtocol } from "../lido-core/activate.js";
import { LidoAddKeys } from "../lido-core/add-keys.js";
import { LidoAddOperator } from "../lido-core/add-operator.js";
import { DeployLidoContracts } from "../lido-core/deploy.js";
import { LidoDeposit } from "../lido-core/deposit.js";
import { GenerateLidoDevNetKeys } from "../lido-core/keys/generate.js";
import { UseLidoDevNetKeys } from "../lido-core/keys/use.js";
import { ReplaceDSM } from "../lido-core/replace-dsm.js";
import { LidoSetStakingLimit } from "../lido-core/set-staking-limit.js";
import { OracleUp } from "../oracles/up.js";
import { ValidatorAdd } from "../validator/add.js";

export const FusakaDevNetUp = command.cli({
description: "Base Fusaka test stand.",
params: {
verify: Params.boolean({
description: "Enables verification of smart contracts during deployment.",
}),
dsm: Params.boolean({
description: "Use full DSM setup.",
default: false,
}),
preset: Params.string({
description: "Kurtosis preset name",
default: "fusaka-devnet2",
}),
},
async handler({ params, dre, dre: { logger } }) {
await dre.runCommand(GitCheckout, {
service: "lidoCore",
ref: "develop",
});

await dre.runCommand(GitCheckout, {
service: "csm",
ref: "main",
});

await dre.runCommand(KurtosisUp, { preset: params.preset });
logger.log("✅ Network initialized.");

await dre.runCommand(BlockscoutUp, {});
logger.log("✅ BlockScout launched for transaction visualization.");

const deployArgs = { verify: params.verify };
const depositArgs = { dsm: params.dsm };

logger.log("🚀 Deploying Lido Core contracts...");
await dre.runCommand(DeployLidoContracts, deployArgs);
logger.log("✅ Lido contracts deployed.");

logger.log("🚀 Deploying CSM contracts...");
await dre.runCommand(DeployCSMContracts, deployArgs);
logger.log("✅ CSM contracts deployed.");

logger.log("🚀 Activating Lido Core protocol...");
await dre.runCommand(ActivateLidoProtocol, {});
logger.log("✅ Lido Core protocol activated.");

logger.log("🚀 Activating CSM protocol...");
await dre.runCommand(ActivateCSM, {
stakeShareLimitBP: 2000,
priorityExitShareThresholdBP: 2500,
maxDepositsPerBlock: 30,
});
logger.log("✅ CSM protocol activated.");

if (!params.dsm) {
logger.log("🚀 Replacing DSM with an EOA...");
await dre.runCommand(ReplaceDSM, {});
logger.log("✅ DSM replaced with an EOA.");
}

const NOR_DEVNET_OPERATOR = "devnet_nor_1";
const CSM_DEVNET_OPERATOR = "devnet_csm_1";

logger.log("🚀 Generating and allocating keys for NOR Module...");
await dre.runCommand(GenerateLidoDevNetKeys, { validators: 30 });
await dre.runCommand(UseLidoDevNetKeys, { name: NOR_DEVNET_OPERATOR });
logger.log("✅ NOR Module keys generated and allocated.");

logger.log("🚀 Generating and allocating keys for CSM Module...");
await dre.runCommand(GenerateLidoDevNetKeys, { validators: 30 });
await dre.runCommand(UseLidoDevNetKeys, { name: CSM_DEVNET_OPERATOR });
logger.log("✅ CSM Module keys generated and allocated.");

logger.log("🚀 Adding NOR operator...");
await dre.runCommand(LidoAddOperator, { name: NOR_DEVNET_OPERATOR });
logger.log(`✅ Operator ${NOR_DEVNET_OPERATOR} added.`);

logger.log("🚀 Adding NOR keys...");
await dre.runCommand(LidoAddKeys, { name: NOR_DEVNET_OPERATOR, id: 0 });
logger.log("✅ NOR keys added.");

logger.log("🚀 Increasing staking limit for NOR...");
await dre.runCommand(LidoSetStakingLimit, { operatorId: 0, limit: 30 });
logger.log("✅ Staking limit for NOR increased.");

logger.log("🚀 Adding CSM operator with keys...");
await dre.runCommand(LidoAddCSMOperatorWithKeys, {
name: CSM_DEVNET_OPERATOR,
});
logger.log(`✅ Keys for operator ${CSM_DEVNET_OPERATOR} added.`);

logger.log("🚀 Run KAPI service.");
await dre.runCommand(KapiUp, {});

logger.log("🚀 Run Oracle service.");
await dre.runCommand(OracleUp, {});

if (params.dsm) {
logger.log("🚀 Deploying Data-bus...");
await dre.runCommand(DataBusDeploy, {});
logger.log("✅ Data-bus deployed.");

logger.log("🚀 Running Council service...");
await dre.runCommand(CouncilUp, {});
logger.log("✅ Council service started.");

logger.log("🚀 Running DSM-bots service...");
await dre.runCommand(DSMBotsUp, {});
logger.log("✅ DSM-bots service started.");
}

logger.log("🚀 Making deposit to NOR...");
await dre.runCommand(LidoDeposit, { id: 1, deposits: 30, ...depositArgs });
logger.log("✅ Deposit to NOR completed.");

logger.log("🚀 Making deposit to CSM...");
await dre.runCommand(LidoDeposit, { id: 3, deposits: 30, ...depositArgs });
logger.log("✅ Deposit to CSM completed.");

logger.log("🚀 Adding keys to the validator...");
await dre.runCommand(ValidatorAdd, {});
logger.log("✅ Validator keys added.");

await dre.runCommand(KurtosisGetInfo, {});
},
});
88 changes: 88 additions & 0 deletions workspaces/kurtosis/fusaka-devnet2.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
participants_matrix:
el:
#- el_type: besu
# el_image: ethpandaops/besu:fusaka-devnet-3
#- el_type: reth
# el_image: ethpandaops/reth:fusaka-devnet-3
#- el_type: nimbus
# el_image: ethpandaops/nimbus-eth1:fusaka-devnet-3
- el_type: geth
el_image: ethpandaops/geth:master
el_extra_params: [ --rpc.gascap=16777215 --rpc.allow-unprotected-txs --syncmode=full --gcmode=archive ]
el_min_cpu: 0
el_max_cpu: 0
el_min_mem: 0
el_max_mem: 0
el_volume_size: 102400
#- el_type: erigon
# el_image: docker.ethquokkaops.io/dh/ethpandaops/erigon:fusaka-devnet-3
- el_type: nethermind
el_image: ethpandaops/nethermind:fusaka-devnet-3
cl:
- cl_type: lighthouse
cl_image: docker.ethquokkaops.io/dh/ethpandaops/lighthouse:fusaka-devnet-3
supernode: true
use_separate_vc: true
#- cl_type: prysm
# cl_image: ethpandaops/prysm-beacon-chain:fusaka-devnet-3
# supernode: true
- cl_type: teku
cl_image: ethpandaops/teku:master
cl_extra_params: [ --reconstruct-historic-states=true ]
cl_extra_env_vars:
JAVA_OPTS: "-Xmx32g"
supernode: true
use_separate_vc: true
cl_min_cpu: 4000
cl_max_cpu: 8000
cl_min_mem: 16384
cl_max_mem: 32768
cl_volume_size: 102400
# - cl_type: grandine
# cl_image: ethpandaops/grandine:fusaka-devnet-3
# supernode: true
#- cl_type: lodestar
# cl_image: ethpandaops/lodestar:unstable
# supernode: true
# use_separate_vc: true


network_params:
network_id: "32382"
fulu_fork_epoch: 10
bpo_1_epoch: 20
bpo_1_max_blobs: 12
bpo_1_target_blobs: 9
bpo_2_epoch: 23
bpo_2_max_blobs: 6
bpo_2_target_blobs: 4
bpo_3_epoch: 24
bpo_3_max_blobs: 9
bpo_3_target_blobs: 6
bpo_4_epoch: 25
bpo_4_max_blobs: 18
bpo_4_target_blobs: 12
bpo_5_epoch: 26
bpo_5_max_blobs: 9
bpo_5_target_blobs: 6
withdrawal_type: "0x02"
preset: mainnet

persistent: true

additional_services:
- dora
- spamoor

keymanager_enabled: true

spamoor_params:
image: ethpandaops/spamoor:master
max_mem: 8000
spammers:
- scenario: eoatx
config:
throughput: 200
- scenario: blobs
config:
throughput: 20