From a430e00be0b72924292a257274744fb7f3df2bf5 Mon Sep 17 00:00:00 2001 From: David Rodriguez <70919589+daveroga@users.noreply.github.com> Date: Wed, 27 Nov 2024 19:28:21 +0100 Subject: [PATCH] Fix upgrade universal verifier (#320) * Comment out AuthV2 validator * get first request from events to check data * check state contract address instead of data from first request * Minor fix --------- Co-authored-by: Andriian Chestnykh <andriian.chestnykh@gmail.com> --- ...niversalVerifierContractMigrationHelper.ts | 50 ++++++++++++++++--- .../upgrade/validators/validators-upgrade.ts | 12 ++--- .../verifiers/universal-verifier-upgrade.ts | 6 ++- 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/helpers/UniversalVerifierContractMigrationHelper.ts b/helpers/UniversalVerifierContractMigrationHelper.ts index 87acf136..aab0623a 100644 --- a/helpers/UniversalVerifierContractMigrationHelper.ts +++ b/helpers/UniversalVerifierContractMigrationHelper.ts @@ -1,8 +1,9 @@ import { DeployHelper } from "./DeployHelper"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { Contract, Wallet } from "ethers"; +import { Contract, Wallet, Block } from "ethers"; // eslint-disable-next-line @typescript-eslint/no-unused-vars import { ContractMigrationSteps, EventLogEntry, log } from "./ContractMigrationSteps"; +import { ethers } from "hardhat"; export class UniversalVerifierContractMigrationHelper extends ContractMigrationSteps { constructor( @@ -15,12 +16,50 @@ export class UniversalVerifierContractMigrationHelper extends ContractMigrationS @log async getDataFromContract(contract: Contract, ...args: any[]): Promise<any> { const countRequests = await contract.getZKPRequestsCount(); + const stateAddress = await contract.getStateAddress(); + const result = { countRequests, stateAddress }; + return result; + } + + @log + async getDataFirstRequestFromContract(contract: Contract): Promise<any> { let validator: string = ""; let request: any = {}; + const countRequests = await contract.getZKPRequestsCount(); + if (countRequests > 0) { - const firstRequestInfo: any = await contract.getZKPRequest(0); + const filter = contract.filters.ZKPRequestSet; + let allEvents: any[]; + + try { + allEvents = (await contract.queryFilter(filter, 0, "latest")) as any; + } catch (error) { + // In case of large number of events some nodes protect with limit, we can use the following code to get events in chunks + const startBlock = 0; + const endBlock = ((await ethers.provider.getBlock("latest")) as Block).number; + allEvents = []; + + console.log( + `Getting events ZKPRequestSet from block ${endBlock} to ${startBlock} for first ZKPRequestSet`, + ); + for (let i = endBlock; i > startBlock; i -= 5000) { + const _startBlock = Math.max(0, i - 4999); + const _endBlock = i; + const events = await contract.queryFilter(filter, _startBlock, _endBlock); + console.log(`Got ${events.length} events from block ${_startBlock} to ${_endBlock}`); + if (events.length > 0) { + allEvents.push(...events); + // we need only 1 event + break; + } + } + } + + console.log(`Got ${allEvents.length} events in total`); + + const firstRequestInfo: any = await contract.getZKPRequest(allEvents[0].args.requestId); validator = firstRequestInfo[1]; request = JSON.parse(firstRequestInfo[0]); } @@ -34,11 +73,10 @@ export class UniversalVerifierContractMigrationHelper extends ContractMigrationS const result1 = args[0]; const result2 = args[1]; - const { request: requestV1, countRequests: countRequestsV1, validator: validatorV1 } = result1; - const { request: requestV2, countRequests: countRequestsV2, validator: validatorV2 } = result2; + const { countRequests: countRequestsV1, stateAddress: stateAddress1 } = result1; + const { countRequests: countRequestsV2, stateAddress: stateAddress2 } = result2; console.assert(countRequestsV1 === countRequestsV2, "lenght of requests not equal"); - console.assert(JSON.stringify(requestV1) === JSON.stringify(requestV2), "requests not equal"); - console.assert(validatorV1 === validatorV2, "validator not equal"); + console.assert(stateAddress1 === stateAddress2, "state address not equal"); } @log diff --git a/scripts/upgrade/validators/validators-upgrade.ts b/scripts/upgrade/validators/validators-upgrade.ts index 00103435..07eccb15 100644 --- a/scripts/upgrade/validators/validators-upgrade.ts +++ b/scripts/upgrade/validators/validators-upgrade.ts @@ -65,12 +65,12 @@ async function main() { validatorVerification: contractsInfo.VALIDATOR_V3.verificationOpts, version: contractsInfo.VALIDATOR_V3.version, }, - { - validatorContractAddress: contractsInfo.VALIDATOR_AUTH_V2.unifiedAddress, - validatorContractName: contractsInfo.VALIDATOR_AUTH_V2.name, - validatorType: VALIDATOR_TYPES.V3, - validatorVerification: contractsInfo.VALIDATOR_AUTH_V2.verificationOpts, - }, + // { + // validatorContractAddress: contractsInfo.VALIDATOR_AUTH_V2.unifiedAddress, + // validatorContractName: contractsInfo.VALIDATOR_AUTH_V2.name, + // validatorType: VALIDATOR_TYPES.AUTH_V2, + // validatorVerification: contractsInfo.VALIDATOR_AUTH_V2.verificationOpts, + // }, ]; const validatorsInfo: any = []; diff --git a/scripts/upgrade/verifiers/universal-verifier-upgrade.ts b/scripts/upgrade/verifiers/universal-verifier-upgrade.ts index 5f1811e2..e760c931 100644 --- a/scripts/upgrade/verifiers/universal-verifier-upgrade.ts +++ b/scripts/upgrade/verifiers/universal-verifier-upgrade.ts @@ -111,7 +111,11 @@ async function main() { const dataBeforeUpgrade = await universalVerifierMigrationHelper.getDataFromContract(universalVerifierContract); - const whitelistedValidators = dataBeforeUpgrade.validators; + const whitelistedValidators = [ + contractsInfo.VALIDATOR_MTP.unifiedAddress, + contractsInfo.VALIDATOR_SIG.unifiedAddress, + contractsInfo.VALIDATOR_V3.unifiedAddress, + ]; for (const validator of whitelistedValidators) { expect(await universalVerifierContract.isWhitelistedValidator(validator)).to.equal(true);