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 ---
- Lido + Lido GitHub license Solidity Aragon OS 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