Skip to content

Commit

Permalink
Merge pull request #2 from rarimo/feature/update_deployment
Browse files Browse the repository at this point in the history
Update deploy scripts
  • Loading branch information
Hrom131 committed Feb 12, 2024
2 parents f03d059 + 5c26b8b commit 24be609
Show file tree
Hide file tree
Showing 11 changed files with 1,753 additions and 2,758 deletions.
12 changes: 9 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ The config has the following structure:
{
"validatorContractInfo": {
"validatorAddr": "",
"isSigValidator": "true"
"isSigValidator": "false"
},
"stateContractInfo": {
"stateAddr": "0x134B1...07a4",
Expand All @@ -36,8 +36,14 @@ The config has the following structure:
"chainName": "Sepolia"
}
},
"poseidonFacade": "0x1702a...1AF5"
"verifiedSBTInfo": {
"name": "Polygon ID × Rarimo",
"symbol": "PRA",
"tokenURI": "some URI"
},
"poseidonFacade": ""
}

```

To deploy new contracts it is enough to leave the fields with addresses empty while filling in the fields with init values.
Expand All @@ -51,7 +57,7 @@ To deploy the contracts locally, run the following commands (in the different te

```bash
npm run private-network
npm run deploy-local
npm run deploy-localhost
```

#### Bindings
Expand Down
54 changes: 6 additions & 48 deletions deploy/1_poseidon_deploy.ts
Original file line number Diff line number Diff line change
@@ -1,60 +1,18 @@
import { Deployer } from "@solarity/hardhat-migrate";
import { artifacts } from "hardhat";
import { ethers } from "hardhat";
import { deployPoseidons } from "@/deploy/helpers/deploy_helper";
import { Config, parseConfig, isZeroAddr } from "@/deploy/helpers/config_parser";

const PoseidonUnit1L = artifacts.require("PoseidonUnit1L");
const PoseidonUnit2L = artifacts.require("PoseidonUnit2L");
const PoseidonUnit3L = artifacts.require("PoseidonUnit3L");
const PoseidonUnit4L = artifacts.require("PoseidonUnit4L");
const PoseidonUnit5L = artifacts.require("PoseidonUnit5L");
const PoseidonUnit6L = artifacts.require("PoseidonUnit6L");

const SpongePoseidon = artifacts.require("SpongePoseidon");
const PoseidonFacade = artifacts.require("PoseidonFacade");
import { PoseidonFacade__factory, SpongePoseidon__factory } from "@/generated-types/ethers";

export = async (deployer: Deployer) => {
const config: Config = parseConfig();

if (isZeroAddr(config.poseidonFacade)) {
const poseidonContracts = await deployPoseidons(
(
await ethers.getSigners()
)[0],
new Array(6).fill(6).map((_, i) => i + 1)
);

const poseidonUnit1L = await PoseidonUnit1L.at(poseidonContracts[0].address);
const poseidonUnit2L = await PoseidonUnit2L.at(poseidonContracts[1].address);
const poseidonUnit3L = await PoseidonUnit3L.at(poseidonContracts[2].address);
const poseidonUnit4L = await PoseidonUnit4L.at(poseidonContracts[3].address);
const poseidonUnit5L = await PoseidonUnit5L.at(poseidonContracts[4].address);
const poseidonUnit6L = await PoseidonUnit6L.at(poseidonContracts[5].address);

await PoseidonUnit1L.setAsDeployed(poseidonUnit1L);
await PoseidonUnit2L.setAsDeployed(poseidonUnit2L);
await PoseidonUnit3L.setAsDeployed(poseidonUnit3L);
await PoseidonUnit4L.setAsDeployed(poseidonUnit4L);
await PoseidonUnit5L.setAsDeployed(poseidonUnit5L);
await PoseidonUnit6L.setAsDeployed(poseidonUnit6L);

await deployer.link(poseidonUnit6L, SpongePoseidon);

await deployer.deploy(SpongePoseidon);

await deployer.link(poseidonUnit1L, PoseidonFacade);
await deployer.link(poseidonUnit2L, PoseidonFacade);
await deployer.link(poseidonUnit3L, PoseidonFacade);
await deployer.link(poseidonUnit4L, PoseidonFacade);
await deployer.link(poseidonUnit5L, PoseidonFacade);
await deployer.link(poseidonUnit6L, PoseidonFacade);
await deployer.link(SpongePoseidon, PoseidonFacade);
await deployPoseidons(deployer, [1, 2, 3, 4, 5, 6]);

await deployer.deploy(PoseidonFacade);
} else {
const poseidonFacade = await PoseidonFacade.at(config.poseidonFacade);
await deployer.deploy(SpongePoseidon__factory);

await PoseidonFacade.setAsDeployed(poseidonFacade);
await deployer.deploy(PoseidonFacade__factory);
} else if (config.poseidonFacade) {
await deployer.save(PoseidonFacade__factory, config.poseidonFacade);
}
};
38 changes: 19 additions & 19 deletions deploy/2_lightweight_state_deploy.ts
Original file line number Diff line number Diff line change
@@ -1,36 +1,36 @@
import { Deployer, Logger } from "@solarity/hardhat-migrate";
import { artifacts } from "hardhat";
import { Deployer } from "@solarity/hardhat-migrate";
import { Config, parseConfig, isZeroAddr } from "@/deploy/helpers/config_parser";
import { ERC1967Proxy__factory, LightweightStateV2, LightweightStateV2__factory } from "@/generated-types/ethers";

const ERC1967Proxy = artifacts.require("ERC1967Proxy");
const LightweightStateV2 = artifacts.require("LightweightStateV2");

export = async (deployer: Deployer, logger: Logger) => {
export = async (deployer: Deployer) => {
const config: Config = parseConfig();

let lightweightStateV2;
let lightweightStateV2: LightweightStateV2;

if (isZeroAddr(config.stateContractInfo.stateAddr)) {
const lightweightStateV2Impl = await deployer.deploy(LightweightStateV2);
const lightweightStateV2Proxy = await deployer.deploy(ERC1967Proxy, lightweightStateV2Impl.address, []);
const lightweightStateV2Impl = await deployer.deploy(LightweightStateV2__factory, {
name: "LightweightStateV2Impl",
});
const lightweightStateV2Proxy = await deployer.deploy(
ERC1967Proxy__factory,
[lightweightStateV2Impl.address, "0x"],
{ name: "LightweightStateV2Proxy" }
);

lightweightStateV2 = await LightweightStateV2.at(lightweightStateV2Proxy.address);
lightweightStateV2 = await deployer.deployed(LightweightStateV2__factory, lightweightStateV2Proxy.address);

if (config.stateContractInfo.stateInitParams) {
logger.logTransaction(
await lightweightStateV2.__LightweightStateV2_init(
config.stateContractInfo.stateInitParams.signer,
config.stateContractInfo.stateInitParams.sourceStateContract,
config.stateContractInfo.stateInitParams.chainName
),
"Initialize LightweightStateV2 contract"
await lightweightStateV2.__LightweightStateV2_init(
config.stateContractInfo.stateInitParams.signer,
config.stateContractInfo.stateInitParams.sourceStateContract,
config.stateContractInfo.stateInitParams.chainName
);
} else {
throw new Error("Invalid state init params");
}
} else {
lightweightStateV2 = await LightweightStateV2.at(config.stateContractInfo.stateAddr);
lightweightStateV2 = await deployer.deployed(LightweightStateV2__factory, config.stateContractInfo.stateAddr);
}

await LightweightStateV2.setAsDeployed(lightweightStateV2);
await deployer.save(LightweightStateV2__factory, lightweightStateV2.address);
};
36 changes: 15 additions & 21 deletions deploy/3_query_validator_deploy.ts
Original file line number Diff line number Diff line change
@@ -1,39 +1,33 @@
import { Deployer, Logger } from "@solarity/hardhat-migrate";
import { artifacts } from "hardhat";
import { Deployer } from "@solarity/hardhat-migrate";
import { Config, parseConfig, isZeroAddr } from "@/deploy/helpers/config_parser";
import { deployMTPValidatorOnChain, deploySigValidatorOnChain } from "@/deploy/helpers/deploy_helper";
import {
CredentialAtomicQueryMTPValidator__factory,
CredentialAtomicQuerySigValidator__factory,
} from "@/generated-types/ethers";

const PoseidonFacade = artifacts.require("PoseidonFacade");
const LightweightStateV2 = artifacts.require("LightweightStateV2");

const CredentialAtomicQuerySigValidator = artifacts.require("CredentialAtomicQuerySigValidator");
const CredentialAtomicQueryMTPValidator = artifacts.require("CredentialAtomicQueryMTPValidator");

export = async (deployer: Deployer, logger: Logger) => {
export = async (deployer: Deployer) => {
const config: Config = parseConfig();

let queryValidatorAddr;
let queryValidatorAddr: string;

if (isZeroAddr(config.validatorContractInfo.validatorAddr)) {
const poseidonFacade = await PoseidonFacade.deployed();
const stateAddr = (await LightweightStateV2.deployed()).address;

if (config.validatorContractInfo.isSigValidator) {
queryValidatorAddr = await deploySigValidatorOnChain(deployer, logger, stateAddr);
queryValidatorAddr = await deploySigValidatorOnChain(deployer);
} else {
queryValidatorAddr = await deployMTPValidatorOnChain(deployer, logger, stateAddr);
queryValidatorAddr = await deployMTPValidatorOnChain(deployer);
}
} else {
if (!config.validatorContractInfo.validatorAddr) {
throw new Error(`Invalid validator address - ${config.validatorContractInfo.validatorAddr}`);
}

queryValidatorAddr = config.validatorContractInfo.validatorAddr;
}

if (config.validatorContractInfo.isSigValidator) {
const querySigValidator = await CredentialAtomicQuerySigValidator.at(queryValidatorAddr);

await CredentialAtomicQuerySigValidator.setAsDeployed(querySigValidator);
await deployer.save(CredentialAtomicQuerySigValidator__factory, queryValidatorAddr);
} else {
const queryMTPValidator = await CredentialAtomicQueryMTPValidator.at(queryValidatorAddr);

await CredentialAtomicQueryMTPValidator.setAsDeployed(queryMTPValidator);
await deployer.save(CredentialAtomicQueryMTPValidator__factory, queryValidatorAddr);
}
};
76 changes: 42 additions & 34 deletions deploy/4_contracts_deploy.ts
Original file line number Diff line number Diff line change
@@ -1,54 +1,62 @@
import { Deployer, Logger } from "@solarity/hardhat-migrate";
import { artifacts } from "hardhat";

import { Deployer, Reporter } from "@solarity/hardhat-migrate";
import { Config, parseConfig } from "@/deploy/helpers/config_parser";

const VerifiedSBT = artifacts.require("VerifiedSBT");
const QueryVerifier = artifacts.require("QueryVerifier");
const PoseidonFacade = artifacts.require("PoseidonFacade");
const LightweightStateV2 = artifacts.require("LightweightStateV2");
const ERC1967Proxy = artifacts.require("ERC1967Proxy");

const CredentialAtomicQuerySigValidator = artifacts.require("CredentialAtomicQuerySigValidator");
const CredentialAtomicQueryMTPValidator = artifacts.require("CredentialAtomicQueryMTPValidator");

export = async (deployer: Deployer, logger: Logger) => {
import {
CredentialAtomicQueryMTPValidator__factory,
CredentialAtomicQuerySigValidator__factory,
ERC1967Proxy__factory,
LightweightStateV2__factory,
PoseidonFacade__factory,
QueryVerifier__factory,
VerifiedSBT__factory,
} from "@/generated-types/ethers";

export = async (deployer: Deployer) => {
const config: Config = parseConfig();

const poseidonFacade = await PoseidonFacade.deployed();
await deployer.link(poseidonFacade, QueryVerifier);
const verifiedSBTImpl = await deployer.deploy(VerifiedSBT__factory, { name: "VerifiedSBTImpl" });
const verifiedSBTProxy = await deployer.deploy(ERC1967Proxy__factory, [verifiedSBTImpl.address, "0x"], {
name: "VerifiedSBTProxy",
});

const verifiedSBTImpl = await deployer.deploy(VerifiedSBT);
const verifiedSBTProxy = await deployer.deploy(ERC1967Proxy, verifiedSBTImpl.address, []);
const verifiedSBT = await deployer.deployed(VerifiedSBT__factory, verifiedSBTProxy.address);

const verifiedSBT = await VerifiedSBT.at(verifiedSBTProxy.address);
await VerifiedSBT.setAsDeployed(verifiedSBT);
await deployer.save(VerifiedSBT__factory, verifiedSBTProxy.address);

const queryVerifier = await deployer.deploy(QueryVerifier);
const queryVerifier = await deployer.deploy(QueryVerifier__factory);

logger.logTransaction(
await queryVerifier.setSBTContract(verifiedSBT.address),
"Set VerifiedSBT contract address in the QueryVerifier contract"
await queryVerifier.setSBTContract(verifiedSBT.address);
await verifiedSBT.__VerifiedSBT_init(
queryVerifier.address,
config.verifiedSBTInfo.name,
config.verifiedSBTInfo.symbol,
config.verifiedSBTInfo.tokenURI
);

logger.logTransaction(
await verifiedSBT.__VerifiedSBT_init(queryVerifier.address, "Polygon ID × Rarimo", "PRA", ""),
"Initialize VerifiedSBT contract"
);
console.log(`Initialize VerifiedSBT contract with next params:
NAME: ${config.verifiedSBTInfo.name}
SYMBOL: ${config.verifiedSBTInfo.symbol}
TOKEN_URI: ${config.verifiedSBTInfo.tokenURI}
`);

let validatorsInfo;
let validatorsInfo: [string, string];

if (config.validatorContractInfo.isSigValidator) {
validatorsInfo = ["QuerySigValidatorOnChain", (await CredentialAtomicQuerySigValidator.deployed()).address];
validatorsInfo = [
"QuerySigValidatorOnChain",
(await deployer.deployed(CredentialAtomicQuerySigValidator__factory)).address,
];
} else {
validatorsInfo = ["QueryMTPValidatorOnChain", (await CredentialAtomicQueryMTPValidator.deployed()).address];
validatorsInfo = [
"QueryMTPValidatorOnChain",
(await deployer.deployed(CredentialAtomicQueryMTPValidator__factory)).address,
];
}

logger.logContracts(
["LightweightStateV2", (await LightweightStateV2.deployed()).address],
Reporter.reportContracts(
["LightweightStateV2", (await deployer.deployed(LightweightStateV2__factory)).address],
validatorsInfo,
["VerifiedSBT", verifiedSBT.address],
["QueryVerifier", queryVerifier.address],
["PoseidonFacade", poseidonFacade.address]
["PoseidonFacade", (await deployer.deployed(PoseidonFacade__factory)).address]
);
};
42 changes: 21 additions & 21 deletions deploy/5_set_zkp_query.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import { Deployer, Logger } from "@solarity/hardhat-migrate";
import { artifacts, ethers } from "hardhat";
import { Deployer } from "@solarity/hardhat-migrate";
import { ethers } from "hardhat";
import { Config, parseConfig } from "@/deploy/helpers/config_parser";
import { AGE_VERIFY_REQUEST_ID } from "@/test/helpers/constants";

const QueryVerifier = artifacts.require("QueryVerifier");
const CredentialAtomicQuerySigValidator = artifacts.require("CredentialAtomicQuerySigValidator");
const CredentialAtomicQueryMTPValidator = artifacts.require("CredentialAtomicQueryMTPValidator");
import {
CredentialAtomicQueryMTPValidator,
CredentialAtomicQueryMTPValidator__factory,
CredentialAtomicQuerySigValidator,
CredentialAtomicQuerySigValidator__factory,
QueryVerifier__factory,
} from "@/generated-types/ethers";

const Operators = {
NOOP: 0, // No operation, skip query verification in circuit
Expand All @@ -17,15 +20,15 @@ const Operators = {
NE: 6, // not equal
};

export = async (deployer: Deployer, logger: Logger) => {
export = async (deployer: Deployer) => {
const config: Config = parseConfig();

let validator;
let validator: CredentialAtomicQueryMTPValidator | CredentialAtomicQuerySigValidator;

if (config.validatorContractInfo.isSigValidator) {
validator = await CredentialAtomicQuerySigValidator.deployed();
validator = await deployer.deployed(CredentialAtomicQuerySigValidator__factory);
} else {
validator = await CredentialAtomicQueryMTPValidator.deployed();
validator = await deployer.deployed(CredentialAtomicQueryMTPValidator__factory);
}

const circuitId = await validator.getCircuitId();
Expand All @@ -40,17 +43,14 @@ export = async (deployer: Deployer, logger: Logger) => {
circuitId,
};

const queryVerifier = await QueryVerifier.deployed();
const queryVerifier = await deployer.deployed(QueryVerifier__factory);

logger.logTransaction(
await queryVerifier.setZKPRequest(
AGE_VERIFY_REQUEST_ID,
validator.address,
query.schema,
query.claimPathKey,
query.operator,
query.value
),
"ZKP Request for KYC Age Credential is set"
await queryVerifier.setZKPRequest(
AGE_VERIFY_REQUEST_ID,
validator.address,
query.schema.toBigInt(),
query.claimPathKey.toBigInt(),
query.operator,
query.value
);
};
9 changes: 7 additions & 2 deletions deploy/data/config.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"validatorContractInfo": {
"validatorAddr": "",
"isSigValidator": "true"
"isSigValidator": "false"
},
"stateContractInfo": {
"stateAddr": "0x134B1...07a4",
Expand All @@ -11,5 +11,10 @@
"chainName": "Sepolia"
}
},
"poseidonFacade": "0x1702a...1AF5"
"verifiedSBTInfo": {
"name": "Polygon ID × Rarimo",
"symbol": "PRA",
"tokenURI": "some URI"
},
"poseidonFacade": ""
}
Loading

0 comments on commit 24be609

Please sign in to comment.