Skip to content

Commit

Permalink
add-verify-contract
Browse files Browse the repository at this point in the history
  • Loading branch information
kientt265 committed Nov 18, 2024
1 parent a650f3d commit 806b203
Show file tree
Hide file tree
Showing 9 changed files with 234 additions and 2 deletions.
2 changes: 1 addition & 1 deletion cache/solidity-files-cache.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions out/G16Verify.sol/Groth16Verifier.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"abi":[{"type":"function","name":"verifyProof","inputs":[{"name":"_pA","type":"uint256[2]","internalType":"uint256[2]"},{"name":"_pB","type":"uint256[2][2]","internalType":"uint256[2][2]"},{"name":"_pC","type":"uint256[2]","internalType":"uint256[2]"},{"name":"_pubSignals","type":"uint256[1]","internalType":"uint256[1]"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"}],"bytecode":{"object":"0x6080604052348015600f57600080fd5b5061055e8061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c806343753b4d14610030575b600080fd5b61004361003e3660046104c1565b610057565b604051901515815260200160405180910390f35b6000610479565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001811061008f576000805260206000f35b50565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816100c5576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806100f6576000805260206000f35b5050505050565b7f013546fdff9fc1a53a820ba6f97a9e2f5670e5329a9ce51fc9b6fe7bae39ee0885527f3045067b76279f4fc4e0f955dc99e07f5d5d148b7429628215c6e568ffa41f1c60208601526000608086018661019a87357f2aa96d636d8564adc9d81f1ee274c524b863373cb14088d9c1cd83d1ce45c70d7f2b36993ebff6ed5de853be07dc6367b280cb1327793bef6878df9a94ddf5d4f984610092565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f0254654fc2952502b42a90356e352a86bda7701727e3a451ceff66491a5fe0cd60c08201527f06a47fc24954664f4a5610edf0c0876727b3cbecb7fef0d1cf99037fa602506660e08201527f0e871f84408619371d5bec1e962ceb85f26ec12e1b1ad316534396f467b4dfb16101008201527f2c6e608207ff07b5c03d0a8d9d3f088405e40811c97759f83c45e1081c6b31c86101208201527f10f00ca9c9a70e2fb1897668f9e18a70fc6344d0cb7e6dd7bd49ee1e40d09fd16101408201527f14d95ead938526f175c26be2e1dfdf3d2c78419d59d811ddb94bbaf160be370d610160820152600087015161018082015260206000018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f2ca327150a7388a8c62be547045aa3f64ff32869f38f26a3d1fefa548e1d2b1d6102808201527f20b98ac5bab7749e76f180b4c9b7fa59095984af14264866c582f7d84f2e25a36102a08201527ee35ec673ced59cca9bb4dfd1da023bc7292ab8376cae63cd9a2b5030941e6d6102c08201527f109e74f9a5506d5d81597da4a30abf24dd6433482bc2b3b2d30f91adc04beacd6102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610491600084013561005e565b61049e818486888a6100fd565b90508060005260206000f35b80604081018310156104bb57600080fd5b92915050565b60008060008061012085870312156104d857600080fd5b6104e286866104aa565b935060c08501868111156104f557600080fd5b60408601935061050587826104aa565b925050856101208601111561051957600080fd5b5091949093509091610100019056fea264697066735822122026e758e67f9e3d3b2bdbae6e1c2be837be0fd946766c6313f8908983a4c3bb6764736f6c634300081a0033","sourceMap":"831:6230:0:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c806343753b4d14610030575b600080fd5b61004361003e3660046104c1565b610057565b604051901515815260200160405180910390f35b6000610479565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001811061008f576000805260206000f35b50565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816100c5576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806100f6576000805260206000f35b5050505050565b7f013546fdff9fc1a53a820ba6f97a9e2f5670e5329a9ce51fc9b6fe7bae39ee0885527f3045067b76279f4fc4e0f955dc99e07f5d5d148b7429628215c6e568ffa41f1c60208601526000608086018661019a87357f2aa96d636d8564adc9d81f1ee274c524b863373cb14088d9c1cd83d1ce45c70d7f2b36993ebff6ed5de853be07dc6367b280cb1327793bef6878df9a94ddf5d4f984610092565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f0254654fc2952502b42a90356e352a86bda7701727e3a451ceff66491a5fe0cd60c08201527f06a47fc24954664f4a5610edf0c0876727b3cbecb7fef0d1cf99037fa602506660e08201527f0e871f84408619371d5bec1e962ceb85f26ec12e1b1ad316534396f467b4dfb16101008201527f2c6e608207ff07b5c03d0a8d9d3f088405e40811c97759f83c45e1081c6b31c86101208201527f10f00ca9c9a70e2fb1897668f9e18a70fc6344d0cb7e6dd7bd49ee1e40d09fd16101408201527f14d95ead938526f175c26be2e1dfdf3d2c78419d59d811ddb94bbaf160be370d610160820152600087015161018082015260206000018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f2ca327150a7388a8c62be547045aa3f64ff32869f38f26a3d1fefa548e1d2b1d6102808201527f20b98ac5bab7749e76f180b4c9b7fa59095984af14264866c582f7d84f2e25a36102a08201527ee35ec673ced59cca9bb4dfd1da023bc7292ab8376cae63cd9a2b5030941e6d6102c08201527f109e74f9a5506d5d81597da4a30abf24dd6433482bc2b3b2d30f91adc04beacd6102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610491600084013561005e565b61049e818486888a6100fd565b90508060005260206000f35b80604081018310156104bb57600080fd5b92915050565b60008060008061012085870312156104d857600080fd5b6104e286866104aa565b935060c08501868111156104f557600080fd5b60408601935061050587826104aa565b925050856101208601111561051957600080fd5b5091949093509091610100019056fea264697066735822122026e758e67f9e3d3b2bdbae6e1c2be837be0fd946766c6313f8908983a4c3bb6764736f6c634300081a0033","sourceMap":"831:6230:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3249:3809;;;;;;:::i;:::-;;:::i;:::-;;;1018:14:2;;1011:22;993:41;;981:2;966:18;3249:3809:0;;;;;;;;3390:4;3429:163;;;3486:1;3483;3480:8;3470:108;;3522:1;3519;3512:12;3555:4;3552:1;3545:15;3470:108;3429:163;:::o;3696:738::-;3747:11;3792:4;3786:11;3826:1;3821:3;3814:14;3866:1;3861:2;3856:3;3852:12;3845:23;3906:1;3901:2;3896:3;3892:12;3885:23;3983:2;3978:3;3974:2;3969:3;3966:1;3959:4;3952:5;3948:16;3937:49;3926:60;;4014:7;4004:107;;4055:1;4052;4045:12;4088:4;4085:1;4078:15;4004:107;4156:2;4150:9;4145:2;4140:3;4136:12;4129:31;4212:2;4208;4204:11;4198:18;4193:2;4188:3;4184:12;4177:40;4292:2;4288;4283:3;4278;4275:1;4268:4;4261:5;4257:16;4246:49;4235:60;;;4323:7;4313:107;;4364:1;4361;4354:12;4397:4;4394:1;4387:15;4313:107;;3696:738;;;;:::o;4448:2197::-;4636:4;4623:18;;4680:4;4675:2;4665:13;;4658:27;4503:4;4553:8;4543:19;;4547:4;4775:62;4804:32;;4798:4;4792;4547;4775:62;:::i;:::-;;4925:2;4912:16;4901:9;4894:35;5012:1;5005:2;5001;4997:11;4984:25;4981:1;4977:33;4973:41;4968:2;4957:9;4953:18;4946:69;5094:2;5081:16;5076:2;5065:9;5061:18;5054:44;5163:2;5159;5155:11;5142:25;5137:2;5126:9;5122:18;5115:53;5234:2;5230;5226:11;5213:25;5207:3;5196:9;5192:19;5185:54;5305:2;5301;5297:11;5284:25;5278:3;5267:9;5263:19;5256:54;5382:6;5376:3;5365:9;5361:19;5354:35;5434:6;5428:3;5417:9;5413:19;5406:35;5512:6;5506:3;5495:9;5491:19;5484:35;5564:6;5558:3;5547:9;5543:19;5536:35;5616:6;5610:3;5599:9;5595:19;5588:35;5668:6;5662:3;5651:9;5647:19;5640:35;5761:3;5755:4;5751:14;5745:21;5739:3;5728:9;5724:19;5717:50;5837:2;5832:3;5828:12;5822:4;5818:23;5812:30;5806:3;5795:9;5791:19;5784:59;5916:7;5910:3;5899:9;5895:19;5888:36;5969:7;5963:3;5952:9;5948:19;5941:36;6022:7;6016:3;6005:9;6001:19;5994:36;6075:7;6069:3;6058:9;6054:19;6047:36;6163:2;6150:16;6144:3;6133:9;6129:19;6122:45;6233:2;6229;6225:11;6212:25;6206:3;6195:9;6191:19;6184:54;6310:7;6304:3;6293:9;6289:19;6282:36;6363:7;6357:3;6346:9;6342:19;6335:36;6416:7;6410:3;6399:9;6395:19;6388:36;6469:7;6463:3;6452:9;6448:19;6441:36;6570:4;6559:9;6554:3;6543:9;6540:1;6533:4;6526:5;6522:16;6511:64;6614:16;;6601:30;;4448:2197;-1:-1:-1;;;;;;4448:2197:0:o;:::-;6677:4;6671:11;6718:8;6712:4;6708:19;6702:4;6695:33;6806:45;6847:1;6834:11;6830:19;6817:33;6806:45;:::i;:::-;6933:46;6974:4;6961:11;6956:3;6951;6946;6933:46;:::i;:::-;6918:61;;7003:7;7000:1;6993:18;7035:4;7032:1;7025:15;14:159:2;108:6;141:2;129:15;;126:24;-1:-1:-1;123:44:2;;;163:1;160;153:12;123:44;14:159;;;;:::o;178:670::-;389:6;397;405;413;466:3;454:9;445:7;441:23;437:33;434:53;;;483:1;480;473:12;434:53;506;551:7;540:9;506:53;:::i;:::-;496:63;;593:3;582:9;578:19;616:7;612:2;609:15;606:35;;;637:1;634;627:12;606:35;675:2;664:9;660:18;650:28;;697:46;735:7;731:2;697:46;:::i;:::-;687:56;;;779:7;773:3;762:9;758:19;755:32;752:52;;;800:1;797;790:12;752:52;-1:-1:-1;178:670:2;;;;-1:-1:-1;178:670:2;;838:3;823:19;;178:670::o","linkReferences":{}},"methodIdentifiers":{"verifyProof(uint256[2],uint256[2][2],uint256[2],uint256[1])":"43753b4d"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.26+commit.8a97fa7a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"_pA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"_pB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"_pC\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[1]\",\"name\":\"_pubSignals\",\"type\":\"uint256[1]\"}],\"name\":\"verifyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/hopital/G16Verify.sol\":\"Groth16Verifier\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"]},\"sources\":{\"src/hopital/G16Verify.sol\":{\"keccak256\":\"0x470c24be9421a38786ec4ae94fa01fbabad9719eae3b41698b3743fab7eac414\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://1337203bb576b2eed7fb2b7fa7437eb90f967b968a38ecd40bbb82462505a40a\",\"dweb:/ipfs/QmeK6RKPZE6uKygmYcVB2AkeMWQgzNoTH9TvzvSfZBhP9Z\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.26+commit.8a97fa7a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256[2]","name":"_pA","type":"uint256[2]"},{"internalType":"uint256[2][2]","name":"_pB","type":"uint256[2][2]"},{"internalType":"uint256[2]","name":"_pC","type":"uint256[2]"},{"internalType":"uint256[1]","name":"_pubSignals","type":"uint256[1]"}],"stateMutability":"view","type":"function","name":"verifyProof","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/hopital/G16Verify.sol":"Groth16Verifier"},"evmVersion":"paris","libraries":{}},"sources":{"src/hopital/G16Verify.sol":{"keccak256":"0x470c24be9421a38786ec4ae94fa01fbabad9719eae3b41698b3743fab7eac414","urls":["bzz-raw://1337203bb576b2eed7fb2b7fa7437eb90f967b968a38ecd40bbb82462505a40a","dweb:/ipfs/QmeK6RKPZE6uKygmYcVB2AkeMWQgzNoTH9TvzvSfZBhP9Z"],"license":"GPL-3.0"}},"version":1},"id":0}
1 change: 1 addition & 0 deletions out/History.sol/History.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions out/build-info/16c8ebe7b2340df066b163e66207f551.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"16c8ebe7b2340df066b163e66207f551","source_id_to_path":{"0":"src/hopital/G16Verify.sol","1":"src/hopital/Verifyer.sol"},"language":"Solidity"}
1 change: 0 additions & 1 deletion out/build-info/223dd12e0be96fdcef5c629e5246cddd.json

This file was deleted.

1 change: 1 addition & 0 deletions out/build-info/84d83be00ee32e1d4e26712358afea73.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"84d83be00ee32e1d4e26712358afea73","source_id_to_path":{"0":"src/hopital/History.sol"},"language":"Solidity"}
168 changes: 168 additions & 0 deletions src/hopital/G16Verify.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
// 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 <https://www.gnu.org/licenses/>.
*/

pragma solidity >=0.7.0 <0.9.0;

contract Groth16Verifier {
// Scalar field size
uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
// Base field size
uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;

// Verification Key data
uint256 constant alphax = 1053740077316668714414534110732640686626367502329931821105284795228294734029;
uint256 constant alphay = 3004521769861466482019419817025965976898564719998716268472884831971616903270;
uint256 constant betax1 = 6571121753555673481951651392979679476431281378010913600952578586603876048817;
uint256 constant betax2 = 20096784588073801335031716815921849077911836435143188474022054861846117822920;
uint256 constant betay1 = 7661136271302715925454502213861599354889064096832883352059110535176286937041;
uint256 constant betay2 = 9430316228485291378166252247201435774166213280272670774152297403039149340429;
uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;
uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;
uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;
uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;
uint256 constant deltax1 = 20190031144589653351994303730898926614060327094510740764925450645729464625949;
uint256 constant deltax2 = 14801835633417431538758761795589908706163548268600062408851856781414958507427;
uint256 constant deltay1 = 401728398126731940223462522210172715653634018546898356263316520344604647021;
uint256 constant deltay2 = 7516974746579808723603286730290804606898925102965826950371473030941210569421;


uint256 constant IC0x = 546445713047657244252768031280236846052530858205084478433949514442315787784;
uint256 constant IC0y = 21832973918461166053763384874700171834970387793389010862231572842080282877724;

uint256 constant IC1x = 19545919889502467446202853710012284030023571558341023726302112457705913701625;
uint256 constant IC1y = 19296491765365170085841257630776206025016351151343960557692042853000122058509;


// 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[1] 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)))


// -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)))


// Validate all evaluations
let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)

mstore(0, isValid)
return(0, 0x20)
}
}
}
Loading

0 comments on commit 806b203

Please sign in to comment.