Skip to content

Commit

Permalink
Fix upgrade universal verifier (#320)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>
  • Loading branch information
daveroga and AndriianChestnykh authored Nov 27, 2024
1 parent 8f10da2 commit a430e00
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 13 deletions.
50 changes: 44 additions & 6 deletions helpers/UniversalVerifierContractMigrationHelper.ts
Original file line number Diff line number Diff line change
@@ -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(
Expand All @@ -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]);
}
Expand All @@ -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
Expand Down
12 changes: 6 additions & 6 deletions scripts/upgrade/validators/validators-upgrade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = [];
Expand Down
6 changes: 5 additions & 1 deletion scripts/upgrade/verifiers/universal-verifier-upgrade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit a430e00

Please sign in to comment.