// SPDX-License-Identifier: GPL-3.0 /* Copyright 2021 0KIMS association. This file is generated with [snarkJS](https://github.com/iden3/snarkjs). snarkJS is a free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. snarkJS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with snarkJS. If not, see . */ pragma solidity >=0.7.0 <0.9.0; contract Groth16Verifier_AnonEncNullifierKyc { // Scalar field size uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Base field size uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; // Verification Key data uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042; uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958; uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132; uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731; uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679; uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856; uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; uint256 constant IC0x = 1413853962861001569358305612548684789177651871594965589761252342895612221794; uint256 constant IC0y = 15224564710569128326473413068659857504582960089989280426570137804062186528652; uint256 constant IC1x = 2872723816577508709624328704197591200727607541758628878954128471105893037536; uint256 constant IC1y = 5456330743498094593133844908661705509461831972346097901139218028858353007944; uint256 constant IC2x = 11976645042660157778245600444666201881259598139969532082607597201248624893723; uint256 constant IC2y = 5550995410876922716148473852175797786273975811686365647727105917433860011686; uint256 constant IC3x = 21632064216268308772608847035071233361530471189339165054883984973984793197357; uint256 constant IC3y = 17462608659782075911688767715619683212310424904968446440153231973702057463339; uint256 constant IC4x = 19096796998504450466812112404518968523908474709519687141317167317992641618245; uint256 constant IC4y = 18926903502476219600784340400063325209155800740924339849895308657533853249482; uint256 constant IC5x = 10884053302401933792716404226193544468262547862622816890357412988997445576476; uint256 constant IC5y = 19607672738978149038944226212184284509947617578053085314389210236673180321584; uint256 constant IC6x = 18756091312230953743252901076852307680130552720554773696151104865352368562472; uint256 constant IC6y = 12902511926829987794220882750418908360066437485500339729661607416121693345966; uint256 constant IC7x = 17321763059883533307530550563528139272812245333124603446887973653459535929881; uint256 constant IC7y = 12151446517680088985469318937798285286889358479014056479823529294703263839674; uint256 constant IC8x = 7876865731056312181239824927776932899807834073155045758149531514122047026470; uint256 constant IC8y = 19727958552252784828353241448428439511422180671857872524153093347318814800865; uint256 constant IC9x = 9917086662609452621644078045211102624920459267963950639495728329006864858157; uint256 constant IC9y = 16939905902506291291358058305981897630888395253458496241770298547058611772885; uint256 constant IC10x = 18909135056382812197660417909514271893824654273327458151123027397224056786779; uint256 constant IC10y = 11102621345588723325762141758667426598965226444015132997889348790614820467885; uint256 constant IC11x = 9904533998675821050250228870878062500839738046112142627413972991561649387784; uint256 constant IC11y = 1472999390828711720110746479187832259055695312591594515156455948701970839167; uint256 constant IC12x = 6259981580117243269505978400843201685900073884341263913784480781409531257016; uint256 constant IC12y = 17556400727789437691301959719873477688875958672470408542431599994268277697701; uint256 constant IC13x = 6786150454543824681185379885488409422358344023379931929254945828912517427257; uint256 constant IC13y = 1461307302213617129025058553488759827142505916845079526007426509438572108529; uint256 constant IC14x = 18548160247798364319220035665282406269803300954541170041430304804683033785051; uint256 constant IC14y = 9755198421636029968350019001957456386103308719599303665032093558427283180600; uint256 constant IC15x = 1518206586970420517477151464101006353315752811845263733302611013600411502158; uint256 constant IC15y = 3751141164530472434270316848184190720887831510108717881293011856437265093706; uint256 constant IC16x = 14141410449344663648896620837425930560093061920476445455145116319568877990307; uint256 constant IC16y = 21362576089049937855001902873781985399258826264127713239968957647242767818391; uint256 constant IC17x = 20261948216034307185865350693399474848083720679809810166058642970987354907864; uint256 constant IC17y = 11269953331712894119137124918207740684260362654532667611699297664219336782776; uint256 constant IC18x = 10203999916396463367270368359575974708015544129948471630676981517737357310011; uint256 constant IC18y = 13377549460491605159843070390893172806946016983291100814680828534398871836384; uint256 constant IC19x = 19119291374078250310453268556150662770119321418058910055456275551901831221665; uint256 constant IC19y = 18656265189293580010301267675792624799018138439042917808961597814449002263521; // Memory data uint16 constant pVk = 0; uint16 constant pPairing = 128; uint16 constant pLastMem = 896; function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[19] calldata _pubSignals) public view returns (bool) { assembly { function checkField(v) { if iszero(lt(v, r)) { mstore(0, 0) return(0, 0x20) } } // G1 function to multiply a G1 value(x,y) to value in an address function g1_mulAccC(pR, x, y, s) { let success let mIn := mload(0x40) mstore(mIn, x) mstore(add(mIn, 32), y) mstore(add(mIn, 64), s) success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) if iszero(success) { mstore(0, 0) return(0, 0x20) } mstore(add(mIn, 64), mload(pR)) mstore(add(mIn, 96), mload(add(pR, 32))) success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) if iszero(success) { mstore(0, 0) return(0, 0x20) } } function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { let _pPairing := add(pMem, pPairing) let _pVk := add(pMem, pVk) mstore(_pVk, IC0x) mstore(add(_pVk, 32), IC0y) // Compute the linear combination vk_x g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192))) g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224))) g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256))) g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288))) g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320))) g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352))) g1_mulAccC(_pVk, IC13x, IC13y, calldataload(add(pubSignals, 384))) g1_mulAccC(_pVk, IC14x, IC14y, calldataload(add(pubSignals, 416))) g1_mulAccC(_pVk, IC15x, IC15y, calldataload(add(pubSignals, 448))) g1_mulAccC(_pVk, IC16x, IC16y, calldataload(add(pubSignals, 480))) g1_mulAccC(_pVk, IC17x, IC17y, calldataload(add(pubSignals, 512))) g1_mulAccC(_pVk, IC18x, IC18y, calldataload(add(pubSignals, 544))) g1_mulAccC(_pVk, IC19x, IC19y, calldataload(add(pubSignals, 576))) // -A mstore(_pPairing, calldataload(pA)) mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) // B mstore(add(_pPairing, 64), calldataload(pB)) mstore(add(_pPairing, 96), calldataload(add(pB, 32))) mstore(add(_pPairing, 128), calldataload(add(pB, 64))) mstore(add(_pPairing, 160), calldataload(add(pB, 96))) // alpha1 mstore(add(_pPairing, 192), alphax) mstore(add(_pPairing, 224), alphay) // beta2 mstore(add(_pPairing, 256), betax1) mstore(add(_pPairing, 288), betax2) mstore(add(_pPairing, 320), betay1) mstore(add(_pPairing, 352), betay2) // vk_x mstore(add(_pPairing, 384), mload(add(pMem, pVk))) mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) // gamma2 mstore(add(_pPairing, 448), gammax1) mstore(add(_pPairing, 480), gammax2) mstore(add(_pPairing, 512), gammay1) mstore(add(_pPairing, 544), gammay2) // C mstore(add(_pPairing, 576), calldataload(pC)) mstore(add(_pPairing, 608), calldataload(add(pC, 32))) // delta2 mstore(add(_pPairing, 640), deltax1) mstore(add(_pPairing, 672), deltax2) mstore(add(_pPairing, 704), deltay1) mstore(add(_pPairing, 736), deltay2) let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) isOk := and(success, mload(_pPairing)) } let pMem := mload(0x40) mstore(0x40, add(pMem, pLastMem)) // Validate that all evaluations ∈ F checkField(calldataload(add(_pubSignals, 0))) checkField(calldataload(add(_pubSignals, 32))) checkField(calldataload(add(_pubSignals, 64))) checkField(calldataload(add(_pubSignals, 96))) checkField(calldataload(add(_pubSignals, 128))) checkField(calldataload(add(_pubSignals, 160))) checkField(calldataload(add(_pubSignals, 192))) checkField(calldataload(add(_pubSignals, 224))) checkField(calldataload(add(_pubSignals, 256))) checkField(calldataload(add(_pubSignals, 288))) checkField(calldataload(add(_pubSignals, 320))) checkField(calldataload(add(_pubSignals, 352))) checkField(calldataload(add(_pubSignals, 384))) checkField(calldataload(add(_pubSignals, 416))) checkField(calldataload(add(_pubSignals, 448))) checkField(calldataload(add(_pubSignals, 480))) checkField(calldataload(add(_pubSignals, 512))) checkField(calldataload(add(_pubSignals, 544))) checkField(calldataload(add(_pubSignals, 576))) // Validate all evaluations let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) mstore(0, isValid) return(0, 0x20) } } }