diff --git a/.github/workflows/tests-integration-hoodi.yml b/.github/workflows/tests-integration-hoodi.yml
index 596205edad..2615d471f6 100644
--- a/.github/workflows/tests-integration-hoodi.yml
+++ b/.github/workflows/tests-integration-hoodi.yml
@@ -23,7 +23,4 @@ jobs:
run: yarn test:integration
env:
RPC_URL: "${{ secrets.HOODI_RPC_URL }}"
- LOG_LEVEL: debug
NETWORK_STATE_FILE: deployed-hoodi.json
- # TODO: enable csm integration tests later (CSM is deployed on hoodis)
- INTEGRATION_WITH_CSM: "off"
diff --git a/.github/workflows/tests-integration-mainnet.yml b/.github/workflows/tests-integration-mainnet.yml
index 1314eac441..836ce0b1a6 100644
--- a/.github/workflows/tests-integration-mainnet.yml
+++ b/.github/workflows/tests-integration-mainnet.yml
@@ -13,36 +13,14 @@ jobs:
SKIP_CONTRACT_SIZE: true
SKIP_INTERFACES_CHECK: true
- services:
- hardhat-node:
- image: ghcr.io/lidofinance/hardhat-node:2.26.0
- ports:
- - 8555:8545
- env:
- ETH_RPC_URL: "${{ secrets.ETH_RPC_URL }}"
- DONT_SET_CHAIN_ID: true
- HARDFORK: "prague"
-
steps:
- uses: actions/checkout@v4
- name: Common setup
uses: ./.github/workflows/setup
- - name: Mock Aragon voting
- run: yarn upgrade:mock-voting
- env:
- RPC_URL: http://localhost:8555
- NETWORK_STATE_FILE: deployed-mainnet.json
-
- - name: Workaround for not updated state error when forking a fork
- run: yarn hardhat --network local run --no-compile scripts/utils/mine.ts
- env:
- RPC_URL: http://localhost:8555
-
- name: Run integration tests
run: yarn test:integration
env:
- RPC_URL: http://localhost:8555
- LOG_LEVEL: debug
+ RPC_URL: "${{ secrets.ETH_RPC_URL }}"
NETWORK_STATE_FILE: deployed-mainnet.json
diff --git a/.github/workflows/tests-integration-upgrade-template.yml b/.github/workflows/tests-integration-upgrade-template.yml
deleted file mode 100644
index 04a133a6fc..0000000000
--- a/.github/workflows/tests-integration-upgrade-template.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: Integration Test (Upgrade)
-
-on: [push]
-
-jobs:
- test_hardhat_integration_fork_template:
- name: Hardhat / Mainnet
- runs-on: ubuntu-latest
- timeout-minutes: 120
- env:
- SKIP_GAS_REPORT: true
- SKIP_CONTRACT_SIZE: true
- SKIP_INTERFACES_CHECK: true
-
- steps:
- - uses: actions/checkout@v4
-
- - name: Common setup
- uses: ./.github/workflows/setup
-
- - name: Prepare network state file
- run: cp deployed-mainnet.json deployed-mainnet-upgrade.json
-
- - name: Run Upgrade Template Integration Tests
- run: yarn test:integration:upgrade-template
- env:
- RPC_URL: "${{ secrets.ETH_RPC_URL }}"
- UPGRADE_PARAMETERS_FILE: scripts/upgrade/upgrade-params-mainnet.toml
- GAS_LIMIT: 30000000
diff --git a/.github/workflows/verify-state-hoodi.yml b/.github/workflows/verify-state-hoodi.yml
deleted file mode 100644
index b4cb8551b2..0000000000
--- a/.github/workflows/verify-state-hoodi.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-name: Verify State On Hoodi
-
-on:
- workflow_dispatch:
- push:
- branches:
- - "feat/ci-hoodi-state"
- schedule:
- - cron: "0 0 * * *" # runs every day at midnight UTC
-
-jobs:
- run_state_mate:
- name: Run state-mate on hoodi
- runs-on: ubuntu-latest
- timeout-minutes: 120
- env:
- STATE_MATE_BRANCH: "feat/v3-hoodi"
- HOODI_REMOTE_RPC_URL: "https://hoodi.drpc.org"
-
- steps:
- - name: Checkout state-mate
- uses: actions/checkout@v4
- with:
- repository: lidofinance/state-mate
- ref: ${{ env.STATE_MATE_BRANCH }}
-
- - name: Setup Node.js
- uses: actions/setup-node@v4
- with:
- node-version: "20"
-
- - name: Enable Corepack
- run: corepack enable
-
- - name: Install dependencies
- run: yarn install
-
- - name: Run state-mate
- run: yarn start configs/hoodi/lidov3-testnet.yaml
diff --git a/.github/workflows/verify-state.yml b/.github/workflows/verify-state.yml
new file mode 100644
index 0000000000..d0a06a7ba1
--- /dev/null
+++ b/.github/workflows/verify-state.yml
@@ -0,0 +1,75 @@
+name: Verify State
+
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - "main"
+ - "develop"
+ schedule:
+ - cron: "0 0 * * *" # runs every day at midnight UTC
+
+jobs:
+ run_state_mate_hoodi:
+ name: Hoodi State
+ runs-on: ubuntu-latest
+ timeout-minutes: 120
+ env:
+ STATE_MATE_BRANCH: "main"
+ HOODI_REMOTE_RPC_URL: "https://hoodi.drpc.org"
+
+ steps:
+ - name: Checkout state-mate
+ uses: actions/checkout@v4
+ with:
+ repository: lidofinance/state-mate
+ ref: ${{ env.STATE_MATE_BRANCH }}
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: "20"
+
+ - name: Enable Corepack
+ run: corepack enable
+
+ - name: Install dependencies
+ run: yarn install
+
+ - name: Run state-mate (V3 Hoodi Testnet)
+ run: yarn start configs/lidov3/hoodi/lidov3-testnet.yaml
+
+ - name: Run state-mate (V3 Hoodi Easy Track)
+ run: yarn start configs/lidov3/hoodi/lidov3-et-testnet.yml
+
+ run_state_mate_mainnet:
+ name: Mainnet State
+ runs-on: ubuntu-latest
+ timeout-minutes: 120
+ env:
+ STATE_MATE_BRANCH: "main"
+ MAINNET_REMOTE_RPC_URL: "https://eth.drpc.org"
+
+ steps:
+ - name: Checkout state-mate
+ uses: actions/checkout@v4
+ with:
+ repository: lidofinance/state-mate
+ ref: ${{ env.STATE_MATE_BRANCH }}
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: "20"
+
+ - name: Enable Corepack
+ run: corepack enable
+
+ - name: Install dependencies
+ run: yarn install
+
+ - name: Run state-mate (V3 Mainnet)
+ run: yarn start configs/lidov3/mainnet/lidov3-core-post-vote.yaml
+
+ - name: Run state-mate (V3 Mainnet Easy Track)
+ run: yarn start configs/lidov3/mainnet/lidov3-et-post-vote.yml
diff --git a/README.md b/README.md
index 484b540b50..fe31ccbd41 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ This is the core repository of the Lido on Ethereum protocol. The entire codebas
---
-
&color=white)
+
&color=white)
diff --git a/deployed-mainnet.json b/deployed-mainnet.json
index b323190d09..c3d2d59fa4 100644
--- a/deployed-mainnet.json
+++ b/deployed-mainnet.json
@@ -538,6 +538,11 @@
"maxPositiveTokenRebase": 750000
}
},
+ "pinnedBeaconProxy": {
+ "contract": "contracts/0.8.25/vaults/PinnedBeaconProxy.sol",
+ "address": "0x62e0D92cf7B8752b5292B9BCbbacE4cFa1633428",
+ "constructorArgs": ["0x5FbE8cEf9CCc56ad245736D3C5bAf82ad54Ca789", "0x"]
+ },
"predepositGuarantee": {
"proxy": {
"contract": "contracts/0.8.9/proxy/OssifiableProxy.sol",
diff --git a/package.json b/package.json
index 6954238c56..504714abf8 100644
--- a/package.json
+++ b/package.json
@@ -93,7 +93,7 @@
"eslint-plugin-simple-import-sort": "12.1.1",
"ethereumjs-util": "7.1.5",
"ethers": "6.14.4",
- "glob": "11.0.3",
+ "glob": "11.1.0",
"globals": "15.15.0",
"hardhat": "2.26.1",
"hardhat-contract-sizer": "2.10.0",
diff --git a/poetry.lock b/poetry.lock
index fe94f1bb2b..63b799a1e6 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand.
[[package]]
name = "aiohappyeyeballs"
@@ -1847,21 +1847,21 @@ files = [
[[package]]
name = "urllib3"
-version = "2.5.0"
+version = "2.6.0"
description = "HTTP library with thread-safe connection pooling, file post, and more."
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"},
- {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"},
+ {file = "urllib3-2.6.0-py3-none-any.whl", hash = "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f"},
+ {file = "urllib3-2.6.0.tar.gz", hash = "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1"},
]
[package.extras]
-brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""]
+brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""]
h2 = ["h2 (>=4,<5)"]
socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
-zstd = ["zstandard (>=0.18.0)"]
+zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""]
[[package]]
name = "wcwidth"
diff --git a/scripts/upgrade/steps/0500-mock-v3-aragon-voting.ts b/scripts/upgrade/steps/0500-mock-v3-aragon-voting.ts
index 2a1a61c08a..d4b6fcb320 100644
--- a/scripts/upgrade/steps/0500-mock-v3-aragon-voting.ts
+++ b/scripts/upgrade/steps/0500-mock-v3-aragon-voting.ts
@@ -1,10 +1,8 @@
import { mockDGAragonVoting } from "scripts/utils/upgrade";
-import { getAddress, readNetworkState, Sk } from "lib/state-file";
+import { readNetworkState } from "lib/state-file";
export async function main(): Promise
> {
const state = readNetworkState();
- const votingDescription = "V3 Lido Upgrade description placeholder";
- const proposalMetadata = "V3 Lido Upgrade proposal metadata placeholder";
- return mockDGAragonVoting(getAddress(Sk.v3VoteScript, state), votingDescription, proposalMetadata, state);
+ return mockDGAragonVoting(state);
}
diff --git a/scripts/utils/upgrade.ts b/scripts/utils/upgrade.ts
index df1dba865c..2b2dc6b6e1 100644
--- a/scripts/utils/upgrade.ts
+++ b/scripts/utils/upgrade.ts
@@ -3,13 +3,12 @@ import fs from "fs";
import * as toml from "@iarna/toml";
-import { IDualGovernance, IEmergencyProtectedTimelock, OmnibusBase, TokenManager, Voting } from "typechain-types";
+import { IDualGovernance, IEmergencyProtectedTimelock } from "typechain-types";
import { advanceChainTime, ether, log } from "lib";
import { impersonate } from "lib/account";
import { UpgradeParameters, validateUpgradeParameters } from "lib/config-schemas";
import { loadContract } from "lib/contract";
-import { findEventsWithInterfaces } from "lib/event";
import { DeploymentState, getAddress, Sk } from "lib/state-file";
import { ONE_HOUR } from "test/suite";
@@ -39,26 +38,15 @@ export function readUpgradeParameters(): UpgradeParameters {
}
}
-export async function mockDGAragonVoting(
- omnibusScriptAddress: string,
- description: string,
- proposalMetadata: string,
- state: DeploymentState,
-): Promise<{
- voteId: bigint;
+export async function mockDGAragonVoting(state: DeploymentState): Promise<{
proposalId: bigint;
- executeReceipt: TransactionReceipt;
scheduleReceipt: TransactionReceipt;
proposalExecutedReceipt: TransactionReceipt;
}> {
log("Starting mock Aragon voting...");
const agentAddress = getAddress(Sk.appAgent, state);
- const votingAddress = getAddress(Sk.appVoting, state);
- const tokenManagerAddress = getAddress(Sk.appTokenManager, state);
const deployer = await impersonate(agentAddress, ether("100"));
- const tokenManager = await loadContract("TokenManager", tokenManagerAddress);
- const voting = await loadContract("Voting", votingAddress);
const timelock = await loadContract(
"IEmergencyProtectedTimelock",
state[Sk.dgEmergencyProtectedTimelock].proxy.address,
@@ -66,25 +54,12 @@ export async function mockDGAragonVoting(
const afterSubmitDelay = await timelock.getAfterSubmitDelay();
const afterScheduleDelay = await timelock.getAfterScheduleDelay();
- const voteId = await voting.votesLength();
-
- const voteScript = await loadContract("OmnibusBase", omnibusScriptAddress);
- const voteBytecode = await voteScript.getNewVoteCallBytecode(description, proposalMetadata);
-
- await tokenManager.connect(deployer).forward(voteBytecode);
- if (!(await voteScript.isValidVoteScript(voteId, proposalMetadata))) throw new Error("Vote script is not valid");
- await voting.connect(deployer).vote(voteId, true, false);
- await advanceChainTime(await voting.voteTime());
- const executeTx = await voting.executeVote(voteId);
- const executeReceipt = (await executeTx.wait())!;
- log.success("Voting executed: gas used", executeReceipt.gasUsed);
-
const dualGovernance = await loadContract(
"IDualGovernance",
state[Sk.dgDualGovernance].proxy.address,
);
- const events = findEventsWithInterfaces(executeReceipt, "ProposalSubmitted", [dualGovernance.interface]);
- const proposalId = events[0].args.id;
+
+ const proposalId = 6n; // https://dg.lido.fi/proposals/6
log.success("Proposal submitted: proposalId", proposalId);
await advanceChainTime(afterSubmitDelay);
@@ -115,5 +90,5 @@ export async function mockDGAragonVoting(
process.exit(1);
}
- return { voteId, proposalId, executeReceipt, scheduleReceipt, proposalExecutedReceipt };
+ return { proposalId, scheduleReceipt, proposalExecutedReceipt };
}
diff --git a/test/integration/core/accounting-oracle-extra-data-full-items.integration.ts b/test/integration/core/accounting-oracle-extra-data-full-items.integration.ts
index 0103d26d66..f550e3d31b 100644
--- a/test/integration/core/accounting-oracle-extra-data-full-items.integration.ts
+++ b/test/integration/core/accounting-oracle-extra-data-full-items.integration.ts
@@ -282,7 +282,11 @@ describe("Integration: AccountingOracle extra data full items", () => {
if (norExitedItems + sdvtExitedItems + csmExitedItems === 0) {
continue;
}
- it(
+
+ // TODO: https://github.com/lidofinance/core/issues/1624
+ const itFn = csmExitedItems > 0 ? it.skip : it;
+
+ itFn(
`should process extra data with full items for all modules with norExitedItems=${norExitedItems}, sdvtExitedItems=${sdvtExitedItems}, csmExitedItems=${csmExitedItems}`,
testReportingModuleWithMaxExtraDataItems({
norExitedItems,
diff --git a/test/integration/vaults/withdrawals-bad-debt.integration.ts b/test/integration/vaults/withdrawals-bad-debt.integration.ts
index 86ac7b5f99..4896efc4f6 100644
--- a/test/integration/vaults/withdrawals-bad-debt.integration.ts
+++ b/test/integration/vaults/withdrawals-bad-debt.integration.ts
@@ -258,7 +258,8 @@ describe("Integration: Withdrawals finalization with bad debt internalization",
expect(stateAfter.badDebtToInternalize).to.equal(0n, "There should be no bad debt to internalize after report");
});
- it("Bad debt internalization should affect finalization share rate", async () => {
+ // TODO: https://github.com/lidofinance/core/issues/1621
+ it.skip("Bad debt internalization should affect finalization share rate", async () => {
const beforeReportSnapshot = await Snapshot.take();
// 1. Finalize withdrawals without bad debt internalization
diff --git a/yarn.lock b/yarn.lock
index 63ba7fec2b..a68e9cd95b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6721,19 +6721,19 @@ __metadata:
languageName: node
linkType: hard
-"glob@npm:11.0.3":
- version: 11.0.3
- resolution: "glob@npm:11.0.3"
+"glob@npm:11.1.0":
+ version: 11.1.0
+ resolution: "glob@npm:11.1.0"
dependencies:
foreground-child: "npm:^3.3.1"
jackspeak: "npm:^4.1.1"
- minimatch: "npm:^10.0.3"
+ minimatch: "npm:^10.1.1"
minipass: "npm:^7.1.2"
package-json-from-dist: "npm:^1.0.0"
path-scurry: "npm:^2.0.0"
bin:
glob: dist/esm/bin.mjs
- checksum: 10c0/7d24457549ec2903920dfa3d8e76850e7c02aa709122f0164b240c712f5455c0b457e6f2a1eee39344c6148e39895be8094ae8cfef7ccc3296ed30bce250c661
+ checksum: 10c0/1ceae07f23e316a6fa74581d9a74be6e8c2e590d2f7205034dd5c0435c53f5f7b712c2be00c3b65bf0a49294a1c6f4b98cd84c7637e29453b5aa13b79f1763a2
languageName: node
linkType: hard
@@ -8014,14 +8014,14 @@ __metadata:
linkType: hard
"js-yaml@npm:3.x":
- version: 3.14.1
- resolution: "js-yaml@npm:3.14.1"
+ version: 3.14.2
+ resolution: "js-yaml@npm:3.14.2"
dependencies:
argparse: "npm:^1.0.7"
esprima: "npm:^4.0.0"
bin:
js-yaml: bin/js-yaml.js
- checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b
+ checksum: 10c0/3261f25912f5dd76605e5993d0a126c2b6c346311885d3c483706cd722efe34f697ea0331f654ce27c00a42b426e524518ec89d65ed02ea47df8ad26dcc8ce69
languageName: node
linkType: hard
@@ -8475,7 +8475,7 @@ __metadata:
eslint-plugin-simple-import-sort: "npm:12.1.1"
ethereumjs-util: "npm:7.1.5"
ethers: "npm:6.14.4"
- glob: "npm:11.0.3"
+ glob: "npm:11.1.0"
globals: "npm:15.15.0"
hardhat: "npm:2.26.1"
hardhat-contract-sizer: "npm:2.10.0"
@@ -8968,11 +8968,11 @@ __metadata:
linkType: hard
"min-document@npm:^2.19.0":
- version: 2.19.0
- resolution: "min-document@npm:2.19.0"
+ version: 2.19.2
+ resolution: "min-document@npm:2.19.2"
dependencies:
dom-walk: "npm:^0.1.0"
- checksum: 10c0/783724da716fc73a51c171865d7b29bf2b855518573f82ef61c40d214f6898d7b91b5c5419e4d22693cdb78d4615873ebc3b37d7639d3dd00ca283e5a07c7af9
+ checksum: 10c0/f6cd59ae07758583bda19cf86ffa8e072cc6e1d72d4e2a62fbf72af3ca630f66ac6a0b3e0ca2b83d5939886da2d006c309fbd0e94f17931ad117860c3fb51bf7
languageName: node
linkType: hard
@@ -8999,12 +8999,12 @@ __metadata:
languageName: node
linkType: hard
-"minimatch@npm:^10.0.3":
- version: 10.0.3
- resolution: "minimatch@npm:10.0.3"
+"minimatch@npm:^10.1.1":
+ version: 10.1.1
+ resolution: "minimatch@npm:10.1.1"
dependencies:
"@isaacs/brace-expansion": "npm:^5.0.0"
- checksum: 10c0/e43e4a905c5d70ac4cec8530ceaeccb9c544b1ba8ac45238e2a78121a01c17ff0c373346472d221872563204eabe929ad02669bb575cb1f0cc30facab369f70f
+ checksum: 10c0/c85d44821c71973d636091fddbfbffe62370f5ee3caf0241c5b60c18cd289e916200acb2361b7e987558cd06896d153e25d505db9fc1e43e6b4b6752e2702902
languageName: node
linkType: hard