Skip to content

Commit

Permalink
wait for finalization and becoming deployed contract visisble as cont…
Browse files Browse the repository at this point in the history
…ract
  • Loading branch information
kovalgek committed Jan 19, 2025
1 parent d46cc29 commit 1c143fb
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 8 deletions.
2 changes: 1 addition & 1 deletion lido-l2-with-steth
42 changes: 37 additions & 5 deletions src/steps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import { runIntegrationTestsScript, setupIntegrationTests } from "./integration-
import { LogCallback, LogType } from "./log-utils";
import { diffyscanRpcUrl, l1RpcUrl, l2RpcUrl, localL1RpcPort, localL2RpcPort, NetworkType } from "./rpc-utils";
import { runStateMateScript, setupStateMateConfig, setupStateMateEnvs } from "./state-mate";
import { runVerificationScript, setupGovExecutorVerification } from "./verification";
import { runVerificationScript, setupGovExecutorVerification, waitForBlockFinalization } from "./verification";

const NUM_L1_DEPLOYED_CONTRACTS = 10;

Expand Down Expand Up @@ -168,17 +168,49 @@ export interface Context {
addGovExecutorToDeploymentArtifacts(ctx.govBridgeExecutor, "deployment_live_result.json");
}
},
{
name: "Wait for Finalization",
action: async(_, logCallback) => {
const deployResult = configFromArtifacts("deployment_live_result.json");

const l1LastBlockNumber = deployResult["ethereum"]["lastBlockNumber"];
const l1Provider = new JsonRpcProvider(l1RpcUrl(NetworkType.Live));
await waitForBlockFinalization(l1Provider, l1LastBlockNumber, logCallback);

const l2Provider = new JsonRpcProvider(l2RpcUrl(NetworkType.Live));
const l2LastBlockNumber = deployResult["optimism"]["lastBlockNumber"];
await waitForBlockFinalization(l2Provider, l2LastBlockNumber, logCallback);
}
},
{
name: "Verififcation",
action: async (_, logCallback) => {
await runVerificationScript({ config: "l1_live_deployment_args.json", network: "l1", workingDirectory: "./lido-l2-with-steth", logCallback: logCallback });
await runVerificationScript({ config: "l2_live_deployment_args.json", network: "l2", workingDirectory: "./lido-l2-with-steth", logCallback: logCallback });
await runVerificationScript({
config: "l1_live_deployment_args.json",
network: "l1",
workingDirectory: "./lido-l2-with-steth",
rpcUrl: l1RpcUrl(NetworkType.Live),
logCallback: logCallback
});
await runVerificationScript({
config: "l2_live_deployment_args.json",
network: "l2",
workingDirectory: "./lido-l2-with-steth",
rpcUrl: l2RpcUrl(NetworkType.Live),
logCallback: logCallback
});
setupGovExecutorVerification();
await runVerificationScript({ config: "l2_live_gov_executor_deployment_args.json", network: "l2", workingDirectory: "./governance-crosschain-bridges", logCallback: logCallback });
await runVerificationScript({
config: "l2_live_gov_executor_deployment_args.json",
network: "l2",
workingDirectory: "./governance-crosschain-bridges",
rpcUrl: l2RpcUrl(NetworkType.Live),
logCallback: logCallback
});
}
}
];

const testDeployedOnRealNetworkSteps: Step[] = [
{
name: "State-mate",
Expand Down
48 changes: 47 additions & 1 deletion src/verification.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@ import dotenv from "dotenv";

import { runCommand } from "./command-utils";
import env from "./env";
import { LogCallback } from "./log-utils";
import { LogCallback, LogType } from "./log-utils";
import { JsonRpcProvider } from "ethers";

export async function runVerificationScript({
config,
network,
rpcUrl,
workingDirectory,
throwOnFail = true,
tryNumber = 1,
Expand All @@ -17,15 +19,18 @@ export async function runVerificationScript({
}: {
config: string;
network: string;
rpcUrl: string;
workingDirectory: string;
throwOnFail?: boolean;
tryNumber?: number;
maxTries?: number;
logCallback: LogCallback;
}) {
const provider = new JsonRpcProvider(rpcUrl);
const args = configFromArtifacts(config);
let contract: keyof typeof args;
for (contract in args) {
await waitForContract(provider, contract, logCallback);
const ctorArgs = args[contract];
await runCommand({
command: "npx",
Expand All @@ -40,6 +45,47 @@ export async function runVerificationScript({
}
}

export async function waitForBlockFinalization(
provider: JsonRpcProvider,
blockNumber: number,
logCallback: LogCallback,
checkInterval: number = 10000
) {
while (true) {
const finalizedBlock = await provider.getBlock("finalized");
const finalizedBlockNumber = finalizedBlock?.number;

if (finalizedBlockNumber === undefined) {
throw Error("Can't fetch block");
}
logCallback(`Waiting for block ${blockNumber} to be finalized. Current finalized block: ${finalizedBlockNumber}`, LogType.Level1);

if (blockNumber <= finalizedBlockNumber) {
return;
}
logCallback(`${blockNumber} isn't finalized. Retrying in ${checkInterval / 1000} seconds...`, LogType.Level1);
await new Promise(resolve => setTimeout(resolve, checkInterval));
}
}

async function waitForContract(
provider: JsonRpcProvider,
address: string,
logCallback: LogCallback,
checkInterval: number = 5000
) {
logCallback(`Checking if address ${address} is an Contract or EOA...`, LogType.Level1);

while (true) {
const code = await provider.getCode(address);
if (code !== "0x") {
return;
}
logCallback(`${address} is EOA. Retrying in ${checkInterval / 1000} seconds...`, LogType.Level1);
await new Promise(resolve => setTimeout(resolve, checkInterval));
}
}

export function setupGovExecutorVerification() {
dotenv.populate(
process.env as { [key: string]: string },
Expand Down

0 comments on commit 1c143fb

Please sign in to comment.