dagger-contracts/deployments/codex_testnet/Groth16Verifier.json

504 lines
37 KiB
JSON

{
"address": "0x02dd582726F7507D7d0F8bD8bf8053d3006F9092",
"abi": [
{
"inputs": [
{
"components": [
{
"components": [
{
"internalType": "uint256",
"name": "x",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "y",
"type": "uint256"
}
],
"internalType": "struct G1Point",
"name": "alpha1",
"type": "tuple"
},
{
"components": [
{
"components": [
{
"internalType": "uint256",
"name": "real",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "imag",
"type": "uint256"
}
],
"internalType": "struct Fp2Element",
"name": "x",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "real",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "imag",
"type": "uint256"
}
],
"internalType": "struct Fp2Element",
"name": "y",
"type": "tuple"
}
],
"internalType": "struct G2Point",
"name": "beta2",
"type": "tuple"
},
{
"components": [
{
"components": [
{
"internalType": "uint256",
"name": "real",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "imag",
"type": "uint256"
}
],
"internalType": "struct Fp2Element",
"name": "x",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "real",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "imag",
"type": "uint256"
}
],
"internalType": "struct Fp2Element",
"name": "y",
"type": "tuple"
}
],
"internalType": "struct G2Point",
"name": "gamma2",
"type": "tuple"
},
{
"components": [
{
"components": [
{
"internalType": "uint256",
"name": "real",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "imag",
"type": "uint256"
}
],
"internalType": "struct Fp2Element",
"name": "x",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "real",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "imag",
"type": "uint256"
}
],
"internalType": "struct Fp2Element",
"name": "y",
"type": "tuple"
}
],
"internalType": "struct G2Point",
"name": "delta2",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "x",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "y",
"type": "uint256"
}
],
"internalType": "struct G1Point[]",
"name": "ic",
"type": "tuple[]"
}
],
"internalType": "struct Groth16Verifier.VerifyingKey",
"name": "key",
"type": "tuple"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [
{
"components": [
{
"components": [
{
"internalType": "uint256",
"name": "x",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "y",
"type": "uint256"
}
],
"internalType": "struct G1Point",
"name": "a",
"type": "tuple"
},
{
"components": [
{
"components": [
{
"internalType": "uint256",
"name": "real",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "imag",
"type": "uint256"
}
],
"internalType": "struct Fp2Element",
"name": "x",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "real",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "imag",
"type": "uint256"
}
],
"internalType": "struct Fp2Element",
"name": "y",
"type": "tuple"
}
],
"internalType": "struct G2Point",
"name": "b",
"type": "tuple"
},
{
"components": [
{
"internalType": "uint256",
"name": "x",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "y",
"type": "uint256"
}
],
"internalType": "struct G1Point",
"name": "c",
"type": "tuple"
}
],
"internalType": "struct Groth16Proof",
"name": "proof",
"type": "tuple"
},
{
"internalType": "uint256[]",
"name": "input",
"type": "uint256[]"
}
],
"name": "verify",
"outputs": [
{
"internalType": "bool",
"name": "success",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
}
],
"transactionHash": "0x60fae5c5436ee0c568486411bb505937188e1551cfaa7e015e07b00b0b512200",
"receipt": {
"to": null,
"from": "0x3A39904B71595608524274BFD8c20FCfd9e77236",
"contractAddress": "0x02dd582726F7507D7d0F8bD8bf8053d3006F9092",
"transactionIndex": 0,
"gasUsed": "1049878",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"blockHash": "0x561dd46e3d1b5f0255ed24d49468a1ae076c492e5bf0a849140b2fb7051c008a",
"transactionHash": "0x60fae5c5436ee0c568486411bb505937188e1551cfaa7e015e07b00b0b512200",
"logs": [],
"blockNumber": 1683236,
"cumulativeGasUsed": "1049878",
"status": 1,
"byzantium": true
},
"args": [
{
"alpha1": {
"x": "20491192805390485299153009773594534940189261866228447918068658471970481763042",
"y": "9383485363053290200918347156157836566562967994039712273449902621266178545958"
},
"beta2": {
"x": {
"real": "6375614351688725206403948262868962793625744043794305715222011528459656738731",
"imag": "4252822878758300859123897981450591353533073413197771768651442665752259397132"
},
"y": {
"real": "10505242626370262277552901082094356697409835680220590971873171140371331206856",
"imag": "21847035105528745403288232691147584728191162732299865338377159692350059136679"
}
},
"gamma2": {
"x": {
"real": "10857046999023057135944570762232829481370756359578518086990519993285655852781",
"imag": "11559732032986387107991004021392285783925812861821192530917403151452391805634"
},
"y": {
"real": "8495653923123431417604973247489272438418190587263600148770280649306958101930",
"imag": "4082367875863433681332203403145435568316851327593401208105741076214120093531"
}
},
"delta2": {
"x": {
"real": "5447082348137136057636074748249349893629964699484381242694722378509910936662",
"imag": "12923912798254414252260693988829763358482753026467066334079419207971774923383"
},
"y": {
"real": "5923722662417224846188311304244642495382541026922138972433286027729423758573",
"imag": "6404852905723538426213634984682361567556711202681123116933320550393302489765"
}
},
"ic": [
{
"x": "11919420103024546168896650006162652130022732573970705849225139177428442519914",
"y": "17747753383929265689844293401689552935018333420134132157824903795680624926572"
},
{
"x": "13158415194355348546090070151711085027834066488127676886518524272551654481129",
"y": "18831701962118195025265682681702066674741422770850028135520336928884612556978"
},
{
"x": "20882269691461568155321689204947751047717828445545223718893788782534717197527",
"y": "11996193054822748526485644723594571195813487505803351159052936325857690315211"
},
{
"x": "18155166643053044822201627105588517913195535693446564472247126736722594445000",
"y": "13816319482622393060406816684195314200198627617641073470088058848129378231754"
}
]
}
],
"numDeployments": 2,
"solcInputHash": "3a588acfa01d533bd1d8c93ca5daf963",
"metadata": "{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct G1Point\",\"name\":\"alpha1\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"real\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"imag\",\"type\":\"uint256\"}],\"internalType\":\"struct Fp2Element\",\"name\":\"x\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"real\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"imag\",\"type\":\"uint256\"}],\"internalType\":\"struct Fp2Element\",\"name\":\"y\",\"type\":\"tuple\"}],\"internalType\":\"struct G2Point\",\"name\":\"beta2\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"real\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"imag\",\"type\":\"uint256\"}],\"internalType\":\"struct Fp2Element\",\"name\":\"x\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"real\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"imag\",\"type\":\"uint256\"}],\"internalType\":\"struct Fp2Element\",\"name\":\"y\",\"type\":\"tuple\"}],\"internalType\":\"struct G2Point\",\"name\":\"gamma2\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"real\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"imag\",\"type\":\"uint256\"}],\"internalType\":\"struct Fp2Element\",\"name\":\"x\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"real\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"imag\",\"type\":\"uint256\"}],\"internalType\":\"struct Fp2Element\",\"name\":\"y\",\"type\":\"tuple\"}],\"internalType\":\"struct G2Point\",\"name\":\"delta2\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct G1Point[]\",\"name\":\"ic\",\"type\":\"tuple[]\"}],\"internalType\":\"struct Groth16Verifier.VerifyingKey\",\"name\":\"key\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct G1Point\",\"name\":\"a\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"real\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"imag\",\"type\":\"uint256\"}],\"internalType\":\"struct Fp2Element\",\"name\":\"x\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"real\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"imag\",\"type\":\"uint256\"}],\"internalType\":\"struct Fp2Element\",\"name\":\"y\",\"type\":\"tuple\"}],\"internalType\":\"struct G2Point\",\"name\":\"b\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"}],\"internalType\":\"struct G1Point\",\"name\":\"c\",\"type\":\"tuple\"}],\"internalType\":\"struct Groth16Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"input\",\"type\":\"uint256[]\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Groth16Verifier.sol\":\"Groth16Verifier\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"contracts/Groth16.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.23;\\n\\nstruct G1Point {\\n uint256 x;\\n uint256 y;\\n}\\n\\n// A field element F_{p^2} encoded as `real + i * imag`.\\n// We chose to not represent this as an array of 2 numbers, because both Circom\\n// and Ethereum EIP-197 encode to an array, but with conflicting encodings.\\nstruct Fp2Element {\\n uint256 real;\\n uint256 imag;\\n}\\n\\nstruct G2Point {\\n Fp2Element x;\\n Fp2Element y;\\n}\\n\\nstruct Groth16Proof {\\n G1Point a;\\n G2Point b;\\n G1Point c;\\n}\\n\\ninterface IGroth16Verifier {\\n function verify(\\n Groth16Proof calldata proof,\\n uint256[] calldata pubSignals\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xe1c7a8730cf718c9b69052c81ca3241d7f61c25f3d7944962077d768bf601baf\",\"license\":\"MIT\"},\"contracts/Groth16Verifier.sol\":{\"content\":\"// Copyright 2017 Christian Reitwiessner\\n// Copyright 2019 OKIMS\\n// Copyright 2024 Codex\\n// Permission is hereby granted, free of charge, to any person obtaining a copy\\n// of this software and associated documentation files (the \\\"Software\\\"), to deal\\n// in the Software without restriction, including without limitation the rights\\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\\n// copies of the Software, and to permit persons to whom the Software is\\n// furnished to do so, subject to the following conditions:\\n// The above copyright notice and this permission notice shall be included in\\n// all copies or substantial portions of the Software.\\n// THE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\n// SOFTWARE.\\n// SPDX-License-Identifier: MIT\\npragma solidity 0.8.23;\\nimport \\\"./Groth16.sol\\\";\\n\\ncontract Groth16Verifier is IGroth16Verifier {\\n uint256 private constant _P =\\n 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n uint256 private constant _R =\\n 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\\n VerifyingKey private _verifyingKey;\\n\\n struct VerifyingKey {\\n G1Point alpha1;\\n G2Point beta2;\\n G2Point gamma2;\\n G2Point delta2;\\n G1Point[] ic;\\n }\\n\\n constructor(VerifyingKey memory key) {\\n _verifyingKey.alpha1 = key.alpha1;\\n _verifyingKey.beta2 = key.beta2;\\n _verifyingKey.gamma2 = key.gamma2;\\n _verifyingKey.delta2 = key.delta2;\\n for (uint i = 0; i < key.ic.length; i++) {\\n _verifyingKey.ic.push(key.ic[i]);\\n }\\n }\\n\\n function _negate(G1Point memory point) private pure returns (G1Point memory) {\\n return G1Point(point.x, (_P - point.y) % _P);\\n }\\n\\n function _add(\\n G1Point memory point1,\\n G1Point memory point2\\n ) private view returns (bool success, G1Point memory sum) {\\n // Call the precompiled contract for addition on the alt_bn128 curve.\\n // The call will fail if the points are not valid group elements:\\n // https://eips.ethereum.org/EIPS/eip-196#exact-semantics\\n\\n uint256[4] memory input;\\n input[0] = point1.x;\\n input[1] = point1.y;\\n input[2] = point2.x;\\n input[3] = point2.y;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := staticcall(gas(), 6, input, 128, sum, 64)\\n }\\n }\\n\\n function _multiply(\\n G1Point memory point,\\n uint256 scalar\\n ) private view returns (bool success, G1Point memory product) {\\n // Call the precompiled contract for scalar multiplication on the alt_bn128\\n // curve. The call will fail if the points are not valid group elements:\\n // https://eips.ethereum.org/EIPS/eip-196#exact-semantics\\n\\n uint256[3] memory input;\\n input[0] = point.x;\\n input[1] = point.y;\\n input[2] = scalar;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := staticcall(gas(), 7, input, 96, product, 64)\\n }\\n }\\n\\n function _checkPairing(\\n G1Point memory a1,\\n G2Point memory a2,\\n G1Point memory b1,\\n G2Point memory b2,\\n G1Point memory c1,\\n G2Point memory c2,\\n G1Point memory d1,\\n G2Point memory d2\\n ) private view returns (bool success, uint256 outcome) {\\n // Call the precompiled contract for pairing check on the alt_bn128 curve.\\n // The call will fail if the points are not valid group elements:\\n // https://eips.ethereum.org/EIPS/eip-197#specification\\n\\n uint256[24] memory input; // 4 pairs of G1 and G2 points\\n uint256[1] memory output;\\n\\n input[0] = a1.x;\\n input[1] = a1.y;\\n input[2] = a2.x.imag;\\n input[3] = a2.x.real;\\n input[4] = a2.y.imag;\\n input[5] = a2.y.real;\\n\\n input[6] = b1.x;\\n input[7] = b1.y;\\n input[8] = b2.x.imag;\\n input[9] = b2.x.real;\\n input[10] = b2.y.imag;\\n input[11] = b2.y.real;\\n\\n input[12] = c1.x;\\n input[13] = c1.y;\\n input[14] = c2.x.imag;\\n input[15] = c2.x.real;\\n input[16] = c2.y.imag;\\n input[17] = c2.y.real;\\n\\n input[18] = d1.x;\\n input[19] = d1.y;\\n input[20] = d2.x.imag;\\n input[21] = d2.x.real;\\n input[22] = d2.y.imag;\\n input[23] = d2.y.real;\\n\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n success := staticcall(gas(), 8, input, 768, output, 32)\\n }\\n return (success, output[0]);\\n }\\n\\n function verify(\\n Groth16Proof calldata proof,\\n uint256[] memory input\\n ) public view returns (bool success) {\\n // Check amount of public inputs\\n if (input.length + 1 != _verifyingKey.ic.length) {\\n return false;\\n }\\n // Check that public inputs are field elements\\n for (uint i = 0; i < input.length; i++) {\\n if (input[i] >= _R) {\\n return false;\\n }\\n }\\n // Compute the linear combination\\n G1Point memory combination = _verifyingKey.ic[0];\\n for (uint i = 0; i < input.length; i++) {\\n G1Point memory product;\\n (success, product) = _multiply(_verifyingKey.ic[i + 1], input[i]);\\n if (!success) {\\n return false;\\n }\\n (success, combination) = _add(combination, product);\\n if (!success) {\\n return false;\\n }\\n }\\n // Check the pairing\\n uint256 outcome;\\n (success, outcome) = _checkPairing(\\n _negate(proof.a),\\n proof.b,\\n _verifyingKey.alpha1,\\n _verifyingKey.beta2,\\n combination,\\n _verifyingKey.gamma2,\\n proof.c,\\n _verifyingKey.delta2\\n );\\n if (!success) {\\n return false;\\n }\\n return outcome == 1;\\n }\\n}\\n\",\"keccak256\":\"0xc5c955c1fff1915ba14f6d243568acf4a9e40c738d6783cb37bfa611b62d41e5\",\"license\":\"MIT\"}},\"version\":1}",
"bytecode": "0x60806040523480156200001157600080fd5b5060405162000bd638038062000bd6833981016040819052620000349162000225565b805180516000908155602091820151600155818301518051805160025583015160035582015180516004558201516005556040830151805180516006558301516007558201518051600855820151600955606083015180518051600a55830151600b558201518051600c5590910151600d555b8160800151518110156200010a576000600e0182608001518281518110620000d357620000d362000369565b60209081029190910181015182546001818101855560009485529383902082516002909202019081559101519082015501620000a7565b50506200037f565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200014d576200014d62000112565b60405290565b60405160a081016001600160401b03811182821017156200014d576200014d62000112565b604051601f8201601f191681016001600160401b0381118282101715620001a357620001a362000112565b604052919050565b600060408284031215620001be57600080fd5b620001c862000128565b9050815181526020820151602082015292915050565b600060808284031215620001f157600080fd5b620001fb62000128565b9050620002098383620001ab565b81526200021a8360408401620001ab565b602082015292915050565b600060208083850312156200023957600080fd5b82516001600160401b03808211156200025157600080fd5b908401906101e082870312156200026757600080fd5b6200027162000153565b6200027d8784620001ab565b81526040620002908860408601620001de565b85830152620002a38860c08601620001de565b6040830152620002b8886101408601620001de565b60608301526101c084015183811115620002d157600080fd5b80850194505087601f850112620002e757600080fd5b835183811115620002fc57620002fc62000112565b6200030c868260051b0162000178565b818152868101945060069190911b8501860190898211156200032d57600080fd5b948601945b818610156200035757620003478a87620001ab565b8552948201949386019362000332565b60808401525090979650505050505050565b634e487b7160e01b600052603260045260246000fd5b610847806200038f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c806394c8919d14610030575b600080fd5b61004361003e366004610647565b610057565b604051901515815260200160405180910390f35b600e5481516000919061006b906001610721565b146100785750600061030c565b60005b82518110156100d6577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018382815181106100b7576100b7610734565b6020026020010151106100ce57600091505061030c565b60010161007b565b50600080600e016000815481106100ef576100ef610734565b600091825260208083206040805180820190915260029093020180548352600101549082015291505b83518110156101e05760408051808201909152600080825260208201526101a1600e610145846001610721565b8154811061015557610155610734565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505086848151811061019457610194610734565b6020026020010151610312565b9094509050836101b7576000935050505061030c565b6101c18382610361565b9094509250836101d7576000935050505061030c565b50600101610118565b5060006102f06101fd6101f83688900388018861077a565b6103bc565b61020f3688900388016040890161079d565b604080518082018252600054815260015460208083019190915282516080808201855260025482860190815260035460608085019190915290835285518087018752600454815260055481860152838501528551918201865260065482870190815260075491830191909152815284518086019095526008548552600954858401529182019390935290919087906102af368d90038d0160c08e0161077a565b60408051608081018252600a54818301908152600b54606083015281528151808301909252600c548252600d54602083810191909152810191909152610448565b9093509050826103055760009250505061030c565b6001149150505b92915050565b6000610331604051806040016040528060008152602001600081525090565b61033961055e565b845181526020808601519082015260408082018590528260608360075afa9250509250929050565b6000610380604051806040016040528060008152602001600081525090565b61038861057c565b845181526020808601518183015284516040808401919091529085015160608301528260808360065afa9250509250929050565b60408051808201909152600080825260208201526040518060400160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4761043691906107dc565b61044091906107ef565b905292915050565b60008061045361059a565b61045b6105b9565b8b5182526020808d0151818401528b5181015160408401528b515160608401528b810180518201516080850152515160a08401528a5160c08401528a81015160e08401528951810151610100840152895151610120840152898101805182015161014085015251516101608401528851610180840152888101516101a084015287518101516101c08401528751516101e08401528781018051820151610200850152515161022084015286516102408401528681015161026084015285518101516102808401528551516102a084015285810180518201516102c085015251516102e0840152816103008460085afa9051909c909b509950505050505050505050565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518061030001604052806018906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610610576106106105d7565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561063f5761063f6105d7565b604052919050565b60008082840361012081121561065c57600080fd5b6101008082121561066c57600080fd5b849350830135905067ffffffffffffffff8082111561068a57600080fd5b818501915085601f83011261069e57600080fd5b81356020828211156106b2576106b26105d7565b8160051b92506106c3818401610616565b82815292840181019281810190898511156106dd57600080fd5b948201945b848610156106fb578535825294820194908201906106e2565b8096505050505050509250929050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561030c5761030c61070b565b634e487b7160e01b600052603260045260246000fd5b60006040828403121561075c57600080fd5b6107646105ed565b9050813581526020820135602082015292915050565b60006040828403121561078c57600080fd5b610796838361074a565b9392505050565b6000608082840312156107af57600080fd5b6107b76105ed565b6107c1848461074a565b81526107d0846040850161074a565b60208201529392505050565b8181038181111561030c5761030c61070b565b60008261080c57634e487b7160e01b600052601260045260246000fd5b50069056fea264697066735822122034dcd21d338f27daac96c159c426fe52fd1b4b0f818d0f6bd495e5ff71e11c2564736f6c63430008170033",
"deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c806394c8919d14610030575b600080fd5b61004361003e366004610647565b610057565b604051901515815260200160405180910390f35b600e5481516000919061006b906001610721565b146100785750600061030c565b60005b82518110156100d6577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018382815181106100b7576100b7610734565b6020026020010151106100ce57600091505061030c565b60010161007b565b50600080600e016000815481106100ef576100ef610734565b600091825260208083206040805180820190915260029093020180548352600101549082015291505b83518110156101e05760408051808201909152600080825260208201526101a1600e610145846001610721565b8154811061015557610155610734565b90600052602060002090600202016040518060400160405290816000820154815260200160018201548152505086848151811061019457610194610734565b6020026020010151610312565b9094509050836101b7576000935050505061030c565b6101c18382610361565b9094509250836101d7576000935050505061030c565b50600101610118565b5060006102f06101fd6101f83688900388018861077a565b6103bc565b61020f3688900388016040890161079d565b604080518082018252600054815260015460208083019190915282516080808201855260025482860190815260035460608085019190915290835285518087018752600454815260055481860152838501528551918201865260065482870190815260075491830191909152815284518086019095526008548552600954858401529182019390935290919087906102af368d90038d0160c08e0161077a565b60408051608081018252600a54818301908152600b54606083015281528151808301909252600c548252600d54602083810191909152810191909152610448565b9093509050826103055760009250505061030c565b6001149150505b92915050565b6000610331604051806040016040528060008152602001600081525090565b61033961055e565b845181526020808601519082015260408082018590528260608360075afa9250509250929050565b6000610380604051806040016040528060008152602001600081525090565b61038861057c565b845181526020808601518183015284516040808401919091529085015160608301528260808360065afa9250509250929050565b60408051808201909152600080825260208201526040518060400160405280836000015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4761043691906107dc565b61044091906107ef565b905292915050565b60008061045361059a565b61045b6105b9565b8b5182526020808d0151818401528b5181015160408401528b515160608401528b810180518201516080850152515160a08401528a5160c08401528a81015160e08401528951810151610100840152895151610120840152898101805182015161014085015251516101608401528851610180840152888101516101a084015287518101516101c08401528751516101e08401528781018051820151610200850152515161022084015286516102408401528681015161026084015285518101516102808401528551516102a084015285810180518201516102c085015251516102e0840152816103008460085afa9051909c909b509950505050505050505050565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518061030001604052806018906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610610576106106105d7565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561063f5761063f6105d7565b604052919050565b60008082840361012081121561065c57600080fd5b6101008082121561066c57600080fd5b849350830135905067ffffffffffffffff8082111561068a57600080fd5b818501915085601f83011261069e57600080fd5b81356020828211156106b2576106b26105d7565b8160051b92506106c3818401610616565b82815292840181019281810190898511156106dd57600080fd5b948201945b848610156106fb578535825294820194908201906106e2565b8096505050505050509250929050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561030c5761030c61070b565b634e487b7160e01b600052603260045260246000fd5b60006040828403121561075c57600080fd5b6107646105ed565b9050813581526020820135602082015292915050565b60006040828403121561078c57600080fd5b610796838361074a565b9392505050565b6000608082840312156107af57600080fd5b6107b76105ed565b6107c1848461074a565b81526107d0846040850161074a565b60208201529392505050565b8181038181111561030c5761030c61070b565b60008261080c57634e487b7160e01b600052601260045260246000fd5b50069056fea264697066735822122034dcd21d338f27daac96c159c426fe52fd1b4b0f818d0f6bd495e5ff71e11c2564736f6c63430008170033",
"devdoc": {
"kind": "dev",
"methods": {},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {},
"version": 1
},
"storageLayout": {
"storage": [
{
"astId": 2417,
"contract": "contracts/Groth16Verifier.sol:Groth16Verifier",
"label": "_verifyingKey",
"offset": 0,
"slot": "0",
"type": "t_struct(VerifyingKey)2434_storage"
}
],
"types": {
"t_array(t_struct(G1Point)2369_storage)dyn_storage": {
"base": "t_struct(G1Point)2369_storage",
"encoding": "dynamic_array",
"label": "struct G1Point[]",
"numberOfBytes": "32"
},
"t_struct(Fp2Element)2374_storage": {
"encoding": "inplace",
"label": "struct Fp2Element",
"members": [
{
"astId": 2371,
"contract": "contracts/Groth16Verifier.sol:Groth16Verifier",
"label": "real",
"offset": 0,
"slot": "0",
"type": "t_uint256"
},
{
"astId": 2373,
"contract": "contracts/Groth16Verifier.sol:Groth16Verifier",
"label": "imag",
"offset": 0,
"slot": "1",
"type": "t_uint256"
}
],
"numberOfBytes": "64"
},
"t_struct(G1Point)2369_storage": {
"encoding": "inplace",
"label": "struct G1Point",
"members": [
{
"astId": 2366,
"contract": "contracts/Groth16Verifier.sol:Groth16Verifier",
"label": "x",
"offset": 0,
"slot": "0",
"type": "t_uint256"
},
{
"astId": 2368,
"contract": "contracts/Groth16Verifier.sol:Groth16Verifier",
"label": "y",
"offset": 0,
"slot": "1",
"type": "t_uint256"
}
],
"numberOfBytes": "64"
},
"t_struct(G2Point)2381_storage": {
"encoding": "inplace",
"label": "struct G2Point",
"members": [
{
"astId": 2377,
"contract": "contracts/Groth16Verifier.sol:Groth16Verifier",
"label": "x",
"offset": 0,
"slot": "0",
"type": "t_struct(Fp2Element)2374_storage"
},
{
"astId": 2380,
"contract": "contracts/Groth16Verifier.sol:Groth16Verifier",
"label": "y",
"offset": 0,
"slot": "2",
"type": "t_struct(Fp2Element)2374_storage"
}
],
"numberOfBytes": "128"
},
"t_struct(VerifyingKey)2434_storage": {
"encoding": "inplace",
"label": "struct Groth16Verifier.VerifyingKey",
"members": [
{
"astId": 2420,
"contract": "contracts/Groth16Verifier.sol:Groth16Verifier",
"label": "alpha1",
"offset": 0,
"slot": "0",
"type": "t_struct(G1Point)2369_storage"
},
{
"astId": 2423,
"contract": "contracts/Groth16Verifier.sol:Groth16Verifier",
"label": "beta2",
"offset": 0,
"slot": "2",
"type": "t_struct(G2Point)2381_storage"
},
{
"astId": 2426,
"contract": "contracts/Groth16Verifier.sol:Groth16Verifier",
"label": "gamma2",
"offset": 0,
"slot": "6",
"type": "t_struct(G2Point)2381_storage"
},
{
"astId": 2429,
"contract": "contracts/Groth16Verifier.sol:Groth16Verifier",
"label": "delta2",
"offset": 0,
"slot": "10",
"type": "t_struct(G2Point)2381_storage"
},
{
"astId": 2433,
"contract": "contracts/Groth16Verifier.sol:Groth16Verifier",
"label": "ic",
"offset": 0,
"slot": "14",
"type": "t_array(t_struct(G1Point)2369_storage)dyn_storage"
}
],
"numberOfBytes": "480"
},
"t_uint256": {
"encoding": "inplace",
"label": "uint256",
"numberOfBytes": "32"
}
}
}
}