From bffb6a08e0fe19b96d7d69271e6b5276bbb392a5 Mon Sep 17 00:00:00 2001 From: Nicholas Addison Date: Wed, 8 May 2024 15:30:58 +1000 Subject: [PATCH 1/5] Fixed resolveAsset --- contracts/utils/resolvers.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/contracts/utils/resolvers.js b/contracts/utils/resolvers.js index e1bc803f06..5791420874 100644 --- a/contracts/utils/resolvers.js +++ b/contracts/utils/resolvers.js @@ -13,16 +13,23 @@ const resolveAsset = async (symbol) => { // "Hardhat can't be initialized while its config is being defined" const hre = require("hardhat"); - if (hre.network.name != "hardhat") { + // Not using helpers here as they import hardhat which won't work for Hardhat tasks + if (process.env.FORK === "true" || hre.network.name != "hardhat") { + const network = + hre.network.name != "hardhat" + ? hre.network.name != "hardhat" + : hre.network.config.chainId == 17000 + ? "holesky" + : "mainnet"; + const assetAddr = - addresses[hre.network.name][symbol + "Proxy"] || - addresses[hre.network.name][symbol]; + addresses[network][symbol + "Proxy"] || addresses[network][symbol]; if (!assetAddr) { throw Error( - `Failed to resolve symbol "${symbol}" to an address on the "${hre.network.name}" network` + `Failed to resolve symbol "${symbol}" to an address on the "${network}" network` ); } - log(`Resolved ${symbol} to ${assetAddr}`); + log(`Resolved ${symbol} to ${assetAddr} on the ${network} network`); const asset = await ethers.getContractAt("IERC20Metadata", assetAddr); return asset; } From 92aa9c62536047cb94c7e4aedc7cd4d02f52f57d Mon Sep 17 00:00:00 2001 From: Nicholas Addison Date: Wed, 8 May 2024 21:17:29 +1000 Subject: [PATCH 2/5] Fixed validator fork tests Added error func sigs to ISSVNetwork --- .../contracts/interfaces/ISSVNetwork.sol | 70 +++++++++++-------- .../strategies/nativeSsvStaking.fork-test.js | 10 +-- 2 files changed, 45 insertions(+), 35 deletions(-) diff --git a/contracts/contracts/interfaces/ISSVNetwork.sol b/contracts/contracts/interfaces/ISSVNetwork.sol index 9f37388663..f069138177 100644 --- a/contracts/contracts/interfaces/ISSVNetwork.sol +++ b/contracts/contracts/interfaces/ISSVNetwork.sol @@ -10,36 +10,46 @@ struct Cluster { } interface ISSVNetwork { - error ApprovalNotWithinTimeframe(); - error CallerNotOwner(); - error CallerNotWhitelisted(); - error ClusterAlreadyEnabled(); - error ClusterDoesNotExists(); - error ClusterIsLiquidated(); - error ClusterNotLiquidatable(); - error ExceedValidatorLimit(); - error FeeExceedsIncreaseLimit(); - error FeeIncreaseNotAllowed(); - error FeeTooHigh(); - error FeeTooLow(); - error IncorrectClusterState(); - error IncorrectValidatorState(); - error InsufficientBalance(); - error InvalidOperatorIdsLength(); - error InvalidPublicKeyLength(); - error MaxValueExceeded(); - error NewBlockPeriodIsBelowMinimum(); - error NoFeeDeclared(); - error NotAuthorized(); - error OperatorAlreadyExists(); - error OperatorDoesNotExist(); - error OperatorsListNotUnique(); - error SameFeeChangeNotAllowed(); - error TargetModuleDoesNotExist(); - error TokenTransferFailed(); - error UnsortedOperatorsList(); - error ValidatorAlreadyExists(); - error ValidatorDoesNotExist(); + /**********/ + /* Errors */ + /**********/ + + error CallerNotOwner(); // 0x5cd83192 + error CallerNotWhitelisted(); // 0x8c6e5d71 + error FeeTooLow(); // 0x732f9413 + error FeeExceedsIncreaseLimit(); // 0x958065d9 + error NoFeeDeclared(); // 0x1d226c30 + error ApprovalNotWithinTimeframe(); // 0x97e4b518 + error OperatorDoesNotExist(); // 0x961e3e8c + error InsufficientBalance(); // 0xf4d678b8 + error ValidatorDoesNotExist(); // 0xe51315d2 + error ClusterNotLiquidatable(); // 0x60300a8d + error InvalidPublicKeyLength(); // 0x637297a4 + error InvalidOperatorIdsLength(); // 0x38186224 + error ClusterAlreadyEnabled(); // 0x3babafd2 + error ClusterIsLiquidated(); // 0x95a0cf33 + error ClusterDoesNotExists(); // 0x185e2b16 + error IncorrectClusterState(); // 0x12e04c87 + error UnsortedOperatorsList(); // 0xdd020e25 + error NewBlockPeriodIsBelowMinimum(); // 0x6e6c9cac + error ExceedValidatorLimit(); // 0x6df5ab76 + error TokenTransferFailed(); // 0x045c4b02 + error SameFeeChangeNotAllowed(); // 0xc81272f8 + error FeeIncreaseNotAllowed(); // 0x410a2b6c + error NotAuthorized(); // 0xea8e4eb5 + error OperatorsListNotUnique(); // 0xa5a1ff5d + error OperatorAlreadyExists(); // 0x289c9494 + error TargetModuleDoesNotExist(); // 0x8f9195fb + error MaxValueExceeded(); // 0x91aa3017 + error FeeTooHigh(); // 0xcd4e6167 + error PublicKeysSharesLengthMismatch(); // 0x9ad467b8 + error IncorrectValidatorStateWithData(bytes publicKey); // 0x89307938 + error ValidatorAlreadyExistsWithData(bytes publicKey); // 0x388e7999 + error EmptyPublicKeysList(); // df83e679 + + // legacy errors + error ValidatorAlreadyExists(); // 0x8d09a73e + error IncorrectValidatorState(); // 0x2feda3c1 event AdminChanged(address previousAdmin, address newAdmin); event BeaconUpgraded(address indexed beacon); diff --git a/contracts/test/strategies/nativeSsvStaking.fork-test.js b/contracts/test/strategies/nativeSsvStaking.fork-test.js index 3652fa8955..12b502c26d 100644 --- a/contracts/test/strategies/nativeSsvStaking.fork-test.js +++ b/contracts/test/strategies/nativeSsvStaking.fork-test.js @@ -21,14 +21,14 @@ describe("ForkTest: Native SSV Staking Strategy", function () { addresses: addresses.mainnet, testValidator: { publicKey: - "0xad9ade40c386259fe4161ec12d7746ab49a098a4760a279c56dc7e26b56fc4d985e74eeecdd2bc5a1decceb5174204f4", - operatorIds: [193, 196, 199, 202], + "0x93d60259213f491a910ee8f6504d51ba5fc28085981eccd6c20ca646525c626013c75b04f061fbf3de839ac602c64698", + operatorIds: [348, 352, 361, 377], sharesData: - "0x8308e4b6ad536304f978077a0cd3685a98d5847bb1b05e0a4c5994ddf64ce48daa917f666d86f3125aac139a4fc7b07119ea2c7fc0fe5cfb316a5687dbddf621b0229e55230f0857d426697513ee2556d2c730595268358ebe8e16331bd2dd53acfd93e4e96c5fb510f78dc0f11e5097f83b2609a5711b233fa843935125dbbd90e43dc4f7d181221a42fcc02fe58aeb90fefb6a1d46faad099b6fa8e68351ff21f52d90a96bffeb33d1c0517bf39e413a441f1c290f1289021e9bd47146689ba139bccfaf7d6d1a6fba03c177d9ffca11f347b0f16a1cd8b1808a9b46ec0849ff45562a853ea137dfea3a0ed43ceac5805a993edd6b618cf7aa1441b2deeb2a7a573f0a44d9ed6bffb75573a91e9de2c21e198815d9b133ce7060ff339bf23b12af3c15f566b81842f307066205f09b40b4db045af881f5ca571289d1aa52555002544e8941b854b1b565b5e76c845c4b287a46890d6ad3e01185d2fb5485ecb136814a23378d37ff53244c1420af43db268f74bf0532dd235cb2afd49d1dce7158d1f51650bc32b790f29bdfc2bafc9990a55a15d005139c6ede259a6a9426400d67192ec697a8990c326bc63fe8a809515d0cc311059da2e333cb92331c45ac8b8d2e09a8cc4092016ade9f90a4b1a89a89f9da38818a5a77f84ae2aba340719dc6a01810ddfcd9e9cf9ebfab033363d2a58296cd1ab8e33ea4e04738111a3e2d80d34c601b0b49e95412cdd554a844f02a94f7f239e70cb72247c36218de79b5d0d73a7429cccf1999eca2611b1c486e8148451cac60bc60280764948f54100a39d9290c368a2ace60daa3ff1bf9dd7514afd02397c196b9cee8ef94478619a114cbebdf4475053857f2728c7621c5fb6739cbf8a15727c5d15a354e20ac054f31e51288a4f94a4215d00d23d2e5a82f745f2f15d6b147ecf817165913f2f72f492075de8f339efe54f163311f7de056c36a900949f7f026c17a96770edd29ba0301732bb83d218a0fb28d466858118e7240725ee74a45fd3acf8ca7310cb72f6cb3c6f8517b89984ad622ffeb39dad587d2e944d59fe849841fc5f09e9f1935cc59b10c795446eb18a2f87e6ee1a497fe0bb556164cd2d7b5c7cf5fdb758e8fc26711116bf59a08be68d2ddb9a97300d2ac43055877a0cc3be97c8b82ceb5dd59f6222c23d849dc7620ffca0393d685cb609059e0e8a76500c9c92d7878a3939c346897d10c6707d39bd10d0f546f6506b6b087dea16156478e11d9537d169d582ca26a04dceede25a38b5a4bf2e16db9db97bdb320f198632a0b60af8ebdf3e6a0bda19f34c9ddc7e437d3fef3da021cae41dd99d2898d825db9de51561dee2a5587fa75453609fff5aec3e949a34fd438f00ab6dbca03e385059003936db14c66d4fec38d6ba729051866c336c51c802507dc5b16b591a4905636736a05bbd0d39ba965de131abad34797e3521ff01612b1bd17aca6af61abf8bd24182a1e2848fc41819c0ce7065000747023db82de23eef601ed7cdaffd39b005e8bb8156f4986d9825e62cd2f13f8c0e33e5825e8d81730ef1a63dfd19af6afd08f9f102f403783dca89173456d9e60fb72b2c153bf0bb73bed799a15eb94923f7cadd9c9bc529a86051d8202b1af53ccb161179f9c4609084dd977091082fc14c20ff21efd70bb9ca56b0ea80c7fc16e2f1718c7b306944fa6c7572440c7d6035a22cea8858f64bb3b6d147a05743021ca1b79d71bac87888bb5fd343b1817a28dda336f1d640f8adae159020deba8d3e1e97ae0b9a4ba23112e59d93169a7b875fc878f66f13b2568ed326f9da7ba6c2bd08d37f5b0ef6bfe56febe20e366fa9d", + "0x861fce88da51de578b2a3f9fa32b3c56499b1261d33f8adbb24932cc906edfd6383b63ac37bfd8b2e9f7087622c1f14b1651426316c741bd8470315d63393bbdc8a0a097f1ac728315fbf17b79b675e9c40605913fff64800a5c7c2057e30f44abed76d8ce797db6f03219e077a3d1fa3945f37d8eeb4c52aee99b4a5f606be50515d347405db37b37a063cd1cd315818521decd2e44878a1a53e84a4186ea3e896a29e0e34c68091a4575b5834e6bfa6c5987916ae49d77347ee7b2f7428f8489a07e54e9d05690f5f8acc2eeab46f44a0f39e5e0e41fde76d29e2660fb5349e00d264527f92d71cfa27a51d9285873908757f42f8f9e40a9c3ec5d9adc966a4dde82d0b87c48ffaebfe2bda73ff388197829d24eb2b18cc50dbae96473a95d819dc1dc99959811e832396eec4773701dbaf86d6449c8310f7fa9ed289675a0ba1be59881fe7b1e64d4485654bab3f9010e575773262ac65f7fa24663f090d413ca74572dac7df3cf06c1fdc226acfc1380441c2d9c4b31fbdd5ee12d83e2d36b9512f4e9c5f0b3607b51665479a9ce035ee952c9d743b5d7b3fa1acec222b447bf8e98397a6e79569a1487adff39f06bfa0a51b022d1798738b37a0801a1f97498c6c3633404f251c137b21e0eec92bcb7a4eb00cad9c826327f4712643035e4b79d14d3e5b0bcf791e6bbfa447f30d362570c26c29787d7c9360b3566b1e9c6eb3f785c96c6d3642a2332910fe3f0b78d4d18d7d4bbedd0b919c8a2853a0babd353c695960d4ec00727a3a91192b8b3a4d4e7cfd1620cdb4936afd91f5155c20bbe8a3dd96790d5e623f9cea53fa32ebe8f2f2572d5d99686ba735d824aaa74a56fd0fde9c219811cb79760410be3815ca95b75551608ee945b895a5c08b760b90aa4836128048b4fd19e0ed475c720d83a76af7e8c3e571f11b0fc540c788d7daea8bc923db44a6f8d208e0140a18d1c811029419d27b4ed994f0ec21c8f65df2f0c83cf5d0111694c18076e7441b0e0fa8e58da3a6c3b94e819550322765d70fbd4f053f2edcba3050cfe14d0efe7280c4a3990182a46cdf4a7f8cf20e0fc17d4fb5becb35908a04e19f5be2df7db81edf9cae016ac88769cb1a644189d84e35e18ff0d2fea6b02a406129487009311525199ffec581fd587521a239f6514e6e10aeef63e531cbe4c37f08592999ce3c3146e76e2793a974d49e0c7264c214133bd2049eacb8f09b3184130812b71fb0cd02d2f044f1d38ab34d1a9bed9940b5691f396c7e2ad25b6baf6ed14baa0f70ef3fd2d5cafd16c7775f6583971223eab2276b98e1998e87692e8474647bc135fab8d8ff7bbdd3d669856897cf7776b594f7cf49ac02870df621eca1919b39f9d28bddee92f3b5150e806b9fe9db01e6e1474d09239799c1265bdab86e8eda0f69cebf921af3ba852f5b64d2129bfa09155dc411165d66c0d750fa9fc07a6be3fdbce769bb494b84eff41319618c1611fe3f62b39066e81ee5ead615d7a576cc8fe68e8bb6ba1d4088810c701f0c1873df8cd02d5019589c095bb730a5625a3996c0b240aaf4484f2502d4aa377d462894557615a5d486339b4ad108ef6ffef0a26ba0136e3d969b4337954069aaeaa73e64757477f30d723ba38dc644f6e371088d9e2b1ff50ecbddad48198e525963fabda4e196c9ddf0d89abcdc3a3d395a96b22254242ce93804e4d6673265e7c4d56b1195aada97bbe9050e843bd56181a533fa03e01285ade0f715d0f9830b1f0ae7586d8485bf76ace561ea6c8c4c9497674d96182a9e289ddcc722814f14b8ce8a70bbb6dec40f84cde55e0d16d4ec043561d6a1d16790b5bc4f02ab9", signature: - "0xadf71438600db72305e4a277554c06359d25e59480e2c4d5ea9d12d132088893d2df141c60a0857c63edc10b9800ac0e0e3e3dcd7b5fdfbcab8fbf377816811becc8be9420c17a725dff9dac6653230b9c5c04fd2ea19f9313fe943e1a562a18", + "0x8522f6464ddc5550f70ed8cd58ed26961d8755111d5e967ee815730bc2e9ad24e7ca718fcf56f1af785bc25dfac719a615a4c4e029a352840edca0d78c9a46ef35202f42311918f70d8ddde9de25fe091889283b9778ea15403fe87dc5f7527e", depositDataRoot: - "0x0d12c28849771f3f946d8d705a1f73683d97add9edaec5e6b30650cc03bc57d5", + "0xcbcd1da8a9ba0e30b2dd8a955591ac4a759bf5ee6f5295d72f5b89b1b175193b", }, }; }); From 9d9e09caa083d809050a7c57c7db39a3ea4fad0f Mon Sep 17 00:00:00 2001 From: Nicholas Addison Date: Wed, 8 May 2024 21:44:42 +1000 Subject: [PATCH 3/5] Fixed harvester behaviour tests --- contracts/test/behaviour/reward-tokens.fork.js | 5 +++-- contracts/test/vault/oeth-vault.fork-test.js | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/test/behaviour/reward-tokens.fork.js b/contracts/test/behaviour/reward-tokens.fork.js index 068ff475ae..d0c48eb779 100644 --- a/contracts/test/behaviour/reward-tokens.fork.js +++ b/contracts/test/behaviour/reward-tokens.fork.js @@ -14,6 +14,7 @@ const { BigNumber } = require("ethers"); shouldHaveRewardTokensConfigured(() => ({ harvester: fixture.harvester, vault: fixture.vault, + ignoreTokens: [fixture.weth.address.toLowerCase()], expectedConfigs: { [fixture.cvx.address]: { allowedSlippageBps: 300, @@ -46,7 +47,7 @@ const shouldHaveRewardTokensConfigured = (context) => { describe("Reward Tokens", () => { it("Should have swap config for all reward tokens from strategies", async () => { - let { vault, harvester, expectedConfigs } = context(); + let { vault, harvester, expectedConfigs, ignoreTokens } = context(); const strategies = await vault.getAllStrategies(); expectedConfigs = Object.keys(expectedConfigs).reduce( @@ -57,7 +58,7 @@ const shouldHaveRewardTokensConfigured = (context) => { {} ); - const checkedConfigs = []; + const checkedConfigs = ignoreTokens || []; for (const strategyAddr of strategies) { const strategy = await ethers.getContractAt("IStrategy", strategyAddr); diff --git a/contracts/test/vault/oeth-vault.fork-test.js b/contracts/test/vault/oeth-vault.fork-test.js index 7ade3fd9da..59177c0cbf 100644 --- a/contracts/test/vault/oeth-vault.fork-test.js +++ b/contracts/test/vault/oeth-vault.fork-test.js @@ -219,6 +219,7 @@ describe("ForkTest: OETH Vault", function () { shouldHaveRewardTokensConfigured(() => ({ vault: fixture.oethVault, harvester: fixture.oethHarvester, + ignoreTokens: [fixture.weth.address.toLowerCase()], expectedConfigs: { [fixture.cvx.address]: { allowedSlippageBps: 300, From 8084a031c52d6866f69343961ace3ee36b1c62c5 Mon Sep 17 00:00:00 2001 From: Shahul Hameed <10547529+shahthepro@users.noreply.github.com> Date: Wed, 8 May 2024 18:28:07 +0530 Subject: [PATCH 4/5] Fix global hooks --- contracts/test/_global-hooks.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/test/_global-hooks.js b/contracts/test/_global-hooks.js index 3492812b2d..5b4a65ef74 100644 --- a/contracts/test/_global-hooks.js +++ b/contracts/test/_global-hooks.js @@ -39,15 +39,15 @@ mocha.before(function () { const isHoleskyTestFile = s.file.endsWith(".holesky-fork-test.js"); const isArbTestFile = s.file.endsWith(".arb.fork-test.js"); - if (isMainnetForkTest) { + if (isArbFork) { + return isArbTestFile; + } else if (isMainnetForkTest) { return isMainnetForkTestFile; } else if (isHoleskyFork) { return isHoleskyTestFile; - } else if (isArbFork) { - return isArbTestFile; } else { // else is unit test - return !isMainnetForkTestFile && !isHoleskyTestFile && !isArbTestFile; + return !isMainnetForkTestFile && !isHoleskyTestFile; } }); From 76e5644196d852a54bb0425272e179ca403b1d45 Mon Sep 17 00:00:00 2001 From: Shahul Hameed <10547529+shahthepro@users.noreply.github.com> Date: Wed, 8 May 2024 18:36:42 +0530 Subject: [PATCH 5/5] Fix tooling --- contracts/test/_global-hooks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/test/_global-hooks.js b/contracts/test/_global-hooks.js index 5b4a65ef74..68e3cd9a9f 100644 --- a/contracts/test/_global-hooks.js +++ b/contracts/test/_global-hooks.js @@ -42,7 +42,7 @@ mocha.before(function () { if (isArbFork) { return isArbTestFile; } else if (isMainnetForkTest) { - return isMainnetForkTestFile; + return isMainnetForkTestFile && !isArbTestFile; } else if (isHoleskyFork) { return isHoleskyTestFile; } else {