mirror of
https://github.com/selfxyz/self.git
synced 2026-01-22 21:17:59 -05:00
108 lines
3.4 KiB
TypeScript
108 lines
3.4 KiB
TypeScript
import { assert } from "chai";
|
|
import { ethers } from "hardhat";
|
|
import { mockPassportData_sha256WithRSAEncryption_65537 } from "../../common/src/utils/mockPassportData";
|
|
import { groth16 } from 'snarkjs'
|
|
import { revealBitmapFromMapping } from "../../common/src/utils/revealBitmap";
|
|
import { generateCircuitInputs } from "../../common/src/utils/generateInputs";
|
|
import { countryCodes } from "../../common/src/constants/constants";
|
|
import { formatRoot } from "../../common/src/utils/utils";
|
|
import fs from 'fs';
|
|
|
|
// Useful script to test formatting of tokenURI
|
|
async function main() {
|
|
const passportData = mockPassportData_sha256WithRSAEncryption_65537;
|
|
|
|
const attributeToReveal = {
|
|
issuing_state: true,
|
|
name: true,
|
|
passport_number: true,
|
|
nationality: true,
|
|
date_of_birth: true,
|
|
gender: true,
|
|
expiry_date: true,
|
|
older_than: true,
|
|
}
|
|
|
|
const reveal_bitmap = revealBitmapFromMapping(attributeToReveal)
|
|
|
|
console.log('reveal_bitmap', reveal_bitmap);
|
|
|
|
const address = "0xE6E4b6a802F2e0aeE5676f6010e0AF5C9CDd0a50";
|
|
|
|
const inputs = generateCircuitInputs(
|
|
passportData,
|
|
reveal_bitmap,
|
|
address,
|
|
18,
|
|
{ developmentMode: true }
|
|
);
|
|
|
|
const Verifier = await ethers.getContractFactory("Groth16Verifier");
|
|
const verifier = await Verifier.deploy();
|
|
await verifier.waitForDeployment();
|
|
|
|
console.log(`Verifier deployed to ${verifier.target}`);
|
|
|
|
const Formatter = await ethers.getContractFactory("Formatter");
|
|
const formatter = await Formatter.deploy();
|
|
await formatter.waitForDeployment();
|
|
console.log(`Formatter deployed to ${formatter.target}`);
|
|
|
|
const tx = await formatter.addCountryCodes(Object.entries(countryCodes));
|
|
await tx.wait();
|
|
console.log(`Country codes added`);
|
|
|
|
const Registry = await ethers.getContractFactory("Registry");
|
|
const registry = await Registry.deploy(formatRoot(inputs.root[0]));
|
|
await registry.waitForDeployment();
|
|
console.log(`Registry deployed to ${registry.target}`);
|
|
|
|
const ProofOfPassport = await ethers.getContractFactory("ProofOfPassport");
|
|
const proofOfPassport = await ProofOfPassport.deploy(verifier.target, formatter.target, registry.target);
|
|
await proofOfPassport.waitForDeployment();
|
|
|
|
console.log(`ProofOfPassport NFT deployed to ${proofOfPassport.target}`);
|
|
|
|
console.log('generating proof...');
|
|
const { proof, publicSignals } = await groth16.fullProve(
|
|
inputs,
|
|
"../circuits/build/proof_of_passport_js/proof_of_passport.wasm",
|
|
"../circuits/build/proof_of_passport_final.zkey"
|
|
)
|
|
|
|
console.log('proof done');
|
|
|
|
const vKey = JSON.parse(fs.readFileSync("../circuits/build/proof_of_passport_vkey.json") as unknown as string);
|
|
|
|
const verified = await groth16.verify(
|
|
vKey,
|
|
publicSignals,
|
|
proof
|
|
)
|
|
|
|
assert(verified == true, 'Should verifiable')
|
|
|
|
const cd = await groth16.exportSolidityCallData(proof, publicSignals);
|
|
const callData = JSON.parse(`[${cd}]`);
|
|
console.log('callData', callData);
|
|
|
|
const mintTx = await proofOfPassport.mint(...callData);
|
|
|
|
const receipt = await mintTx.wait();
|
|
console.log('receipt', receipt?.hash);
|
|
const tokenURI = await proofOfPassport.tokenURI(0);
|
|
console.log('tokenURI', tokenURI);
|
|
|
|
const decodedTokenURI = Buffer.from(tokenURI.split(',')[1], 'base64').toString();
|
|
const parsedTokenURI = JSON.parse(decodedTokenURI)
|
|
|
|
console.log('parsedTokenURI', parsedTokenURI);
|
|
process.exit(0);
|
|
}
|
|
|
|
|
|
main().catch((error) => {
|
|
console.error(error);
|
|
process.exitCode = 1;
|
|
});
|