Awesome
Mint an NFT if you know a secret
Developed for 0xPARC.
Contract on Goerli: 0xc4490d6407f81378c8d3620eA11092B2FC429Df2
Getting started
Clone this repository and install dependencies:
git clone git@github.com:weijiekoh/zknftmint.git
cd zknftmint
npm i
npm run bootstrap
You may need to manually install dependencies for zkey-manager
by following instructions here.
In a separate terminal, run a HTTP server in web/zkeys
:
cd web/zkeys
npx http-server --cors -p 8000
In another terminal, run the web application:
cd web
npm run serve
Get Goerli ETH: https://faucet.paradigm.xyz/
To generate a proof and nullifier, first navigate to:
Next, paste your ETH address from Metamask and enter the secret (currently
hardcoded to 1234
). Click "Create proof".
Navigate to the Write Contract page for the NftMint contract on Etherscan,
click on "Connect to Web3", and select mintWithProof
. Copy and paste the
nullifier and the proof, and click "Write".
https://goerli.etherscan.io/address/0xc4490d6407f81378c8d3620eA11092B2FC429Df2#writeContract
If the proof is valid and you have not previously used this address to mint an NFT on this contract, the transaction will execute and mint an NFT to your address.
Development
To install NPM dependencies, run this in the project's root directory:
npm i && npm run bootstrap
To compile the Typescript code for tests, run:
npm run build
To compile the circuits, generate its zkey file, and export its verification key for off-chain proof verification:
cd circuits
npx zkey-manager compile -c ./zkeys.config.yml
npx zkey-manager downloadPtau -c ./zkeys.config.yml
npx zkey-manager genZkeys -c ./zkeys.config.yml
npx snarkjs zkev ./NftMint__prod.0.zkey ./zkeys/verification_key.json
node build/exportVerifier.js ./zkeys/NftMint__prod.0.zkey ../contracts/contracts/verifier.sol
Note that no phase 2 trusted setup is performed, so do not use this in production unless you perform one.
Next, compile the contracts:
cd ../contracts
npm run compileSol
Deploy the contracts to a testnet:
npx hardhat run build/deploy.js --network goerli
Verify the contracts on Etherscan:
- Update
contracts/hardhat.config.js
with your Etherscan API key. - Run:
npx hardhat verify --network goerli <NftMint address> "<verifier address>"