diff --git a/backend/examples/summa_solvency_flow.rs b/backend/examples/summa_solvency_flow.rs index 8c403ba8..953a040d 100644 --- a/backend/examples/summa_solvency_flow.rs +++ b/backend/examples/summa_solvency_flow.rs @@ -85,7 +85,7 @@ async fn main() -> Result<(), Box> { generate_setup_artifacts(K, Some(params_path), &univariate_grand_sum_circuit).unwrap(); // Create a proof - let instances = vec![Fp::one(); 1]; // This instance is necessary to verify proof on solidity verifier. + let instances = vec![Fp::zero(); 1]; // This instance is necessary to verify proof on solidity verifier. let (zk_snark_proof, advice_polys, _) = full_prover( ¶ms, &pk, diff --git a/backend/src/contracts/abi/SnarkVerifier.json b/backend/src/contracts/abi/SnarkVerifier.json index 44cb506e..f2ecf10e 100644 --- a/backend/src/contracts/abi/SnarkVerifier.json +++ b/backend/src/contracts/abi/SnarkVerifier.json @@ -1 +1 @@ -{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/SnarkVerifier.sol","abi":[{"inputs":[{"internalType":"address","name":"vk","type":"address"},{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256[]","name":"instances","type":"uint256[]"}],"name":"verifyProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612188806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063af83a18d14610030575b600080fd5b61004361003e366004612095565b610057565b604051901515815260200160405180910390f35b6000610263565b60008060008435602086013588821086169450888110851694508860038a8b858609850908898283099289526020890191909152149290921696604094850196509390940193505050565b60016020536021600090812092830682529190915260200190565b6000838351602085015b602087038110156100f0578781518309808452602093840193909250016100ce565b8781518309915060208352602080840152602060408401528160608401526002880360808401528760a084015260208360c08560055afa851693508251915085602081016020850394505b828110156101635789855185098a84518609908452601f19958601959094509092019161013b565b8981518509945089825185099490915292909252509095945050505050565b81604052826060526000604060006080600060065afa9091169392505050565b816040526000604060006060600060075afa90911692915050565b8160c0528260e05260006040608080608060065afa9091169392505050565b8160c0526000604060806060608060075afa90911692915050565b8160005282602052610b4051604052610b6051606052610b8051608052610ba05160a0528360c0528460e052610bc05161010052610be05161012052610c005161014052610c205161016052600060206000610180600060085afa600051921690911695945050505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600161056060006109a08b3c6064356115001481169050610a6051611584358114821691506109a05160005260206115a48260200281015b8082101561030057813580845286119490941693602092830192909101906102dd565b5060849250610f0090506103445b8084101561032d576103228784868861005e565b94509450945061030e565b5060009182208581068252909152602090810161040083015b808410156103655761035a8784868861005e565b945094509450610346565b5060009182208581068252909152602090810161038285826100a9565b905061038083015b808410156103a95761039e8784868861005e565b94509450945061038a565b5060009182208581068252909152602090810160c083015b808410156103e0576103d58784868861005e565b9450945094506103c1565b5060009182208581068252909152602090810161098083015b8084101561041c57833580845286119490941693602093840193909201916103f9565b5060009182208581068252909152602090810161043985826100a9565b90506104478683858761005e565b600090812088810690945292909252935091506020905061046a8582848661005e565b9250925092505050610a80511561053757610ac051610ae0516020610aa051026115a4016020830260028102600382028335838501358386013583870135896020028801895b818a10156104ee5760208a0199508935811b86019550888a0135811b85019450878a0135811b84019350868a0135811b830192508a810190506104b0565b50508c60038e8f8788098709088d848509148b169a508c60038e8f8586098509088d828309148b169a508361100052826110205281611040528061106052505050505050505050505b8061054157600080fd5b6109c0519250610f80518060005b858110156105655784828309915060010161054f565b50610a005194506110806006610a6051016020028101610a6051610587576020015b610a40515b818310156105ad57868188038608835286888209905060208301925061058c565b508560018703840893508381526105cb8660208301611080886100c4565b94506110809150856109e05185099350610a40515b8183101561060357868782855109860983528688820990506020830192506105e0565b506110a05196506110c0935061114091505b8184101561062f5785845188089650602084019350610615565b600091506115a4610a605160200281015b80821015610664578788833588510985089350602082019150602086019550610640565b505051611080805161114051949091526110a0919091526110c0526110e0959095526111008190526111209490945250610f60516000937f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a291908480610e4435830986038208955050610fc435848082810381848009086110c051099050848186848909089550508384610e84358603610ea435086111005109848186848909089550508384610ee4358603610f0435086111005109848186848909089550508384610f44358603610f6435086111005109848186848909089550508384610fa4358603610fc43508611100510984818684890908955050610f4051610f2051610e6435610e44358788858a8b610d04358809610cc4350808830991508788858a8b610d24358809610b843508088309915087610f805184096000528788858a600051610cc4350808820990508786600051096000528788858a600051610b843508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610ec435610ea4358788858a8b610d44358809610ba4350808830991508788858a8b610d64358809610bc4350808830991508788858a600051610ba4350808820990508786600051096000528788858a600051610bc43508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f2435610f04358788858a8b610d84358809610be4350808830991508788858a8b610da4358809610c24350808830991508788858a600051610be4350808820990508786600051096000528788858a600051610c243508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f8435610f64358788858a8b610dc4358809610c44350808830991508788858a8b610de4358809610c64350808830991508788858a600051610c44350808820990508786600051096000528788858a600051610c643508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610fe435610fc4358788858a8b610e04358809610c84350808830991508788858a8b610e24358809611120510808830991508788858a600051610c84350808820990508786600051096000528788858a6000516111205108088209905087818903830893505050508485866110e0516110c05108830986038208905084818684890908955050611100518485611004358703830982089050848186848909089550506110c051848561100435870387611004356110043509088209905084818684890908955060009050610c0435610b8435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361108435088a85611044350809611024350988898a8487088b86890809611004350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611084358603611044350861110051098481868489090895505083848561106435870361104435088661108435880361104435080985866110c0516110e05108870360010809848186848909089550506111005184856110a4358703830982089050848186848909089550506110c05184856110a4358703876110a4356110a43509088209905084818684890908955060009050610b8435610ba435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361112435088a856110e43508096110c4350988898a8487088b868908096110a4350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111243586036110e435086111005109848186848909089550508384856111043587036110e43508866111243588036110e435080985866110c0516110e0510887036001080984818684890908955050611100518485611144358703830982089050848186848909089550506110c051848561114435870387611144356111443509088209905084818684890908955060009050610ba435610bc435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836111c435088a85611184350809611164350988898a8487088b86890809611144350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111c435860361118435086111005109848186848909089550508384856111a43587036111843508866111c435880361118435080985866110c0516110e05108870360010809848186848909089550506111005184856111e4358703830982089050848186848909089550506110c05184856111e4358703876111e4356111e43509088209905084818684890908955060009050610bc435610be435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361126435088a85611224350809611204350988898a8487088b868908096111e4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611264358603611224350861110051098481868489090895505083848561124435870361122435088661126435880361122435080985866110c0516110e0510887036001080984818684890908955050611100518485611284358703830982089050848186848909089550506110c051848561128435870387611284356112843509088209905084818684890908955060009050610ca435610c2435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361130435088a856112c43508096112a4350988898a8487088b86890809611284350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113043586036112c435086111005109848186848909089550508384856112e43587036112c43508866113043588036112c435080985866110c0516110e0510887036001080984818684890908955050611100518485611324358703830982089050848186848909089550506110c051848561132435870387611324356113243509088209905084818684890908955060009050610c2435610c4435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836113a435088a85611364350809611344350988898a8487088b86890809611324350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113a435860361136435086111005109848186848909089550508384856113843587036113643508866113a435880361136435080985866110c0516110e05108870360010809848186848909089550506111005184856113c4358703830982089050848186848909089550506110c05184856113c4358703876113c4356113c43509088209905084818684890908955060009050610c4435610c6435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361144435088a856114043508096113e4350988898a8487088b868908096113c4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611444358603611404350861110051098481868489090895505083848561142435870361140435088661144435880361140435080985866110c0516110e0510887036001080984818684890908955050611100518485611464358703830982089050848186848909089550506110c051848561146435870387611464356114643509088209905084818684890908955060009050610c6435610c8435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836114e435088a856114a4350809611484350988898a8487088b86890809611464350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846114e43586036114a435086111005109848186848909089550508384856114c43587036114a43508866114e43588036114a435080985866110c0516110e05108870360010809848186848909089550505050816110a051840961114052610b4435600052610b6435602052611080519250610b04610a845b818110156113415761132285846101a2565b92506113346020830135833585610182565b9250604082039150611310565b50506000516111605260205161118052610f80519250610a0051610a205183828609915081610360528461034052838186099150816103205283818309915083818309915083818309915083818309915083818309915050806103005250610fe05192506103806104006103005b818310156113cc57848151860387088352602092830192016113af565b50506103c0516104005250610380516103a051909350829084099250816103e05184096104208190526000526103a0516104408190526103805193508290840961046052610380516103e05190935082908409610480526103c0516001935082908409602052610300516103405161036051919450906000848381038708905084858387038808820990508461038051820990508060405284868603840890508485838703850882099050846103c051820990508060605284868603830890508485848703840882099050846103e051820960805250506103405161036051909450905060008382810386089050836103c051820990508060a0528385850383089050836103e051820960c0525050610320516103405190935060008382810386089050836103a051820990508060e0528385850383089050836103c051820961010052506115229050826101206000846100c4565b9050600051925082610420526104406104a05b8082101561154f5783858351098252602082019150611535565b50506020519250610fa05160008384610ce435870982089050838282099050838461114051870982089050610e24610ce45b818110156115a15785868335890987868609089250602082039150611581565b50508382820990508384610cc43587098208905083828209905083846114e43587098208905083828209905083846114443587098208905083828209905083846113a43587098208905083828209905083846113043587098208905083828209905083846112643587098208905083828209905083846111c435870982089050838282099050838461112435870982089050838282099050838461108435870982089050610ca4610b645b8181101561166c578586833589098786860908925060208203915061164c565b5050806104a0525050610fa051925060008283610fa43560405109820890508283610f643560605109820890508283610f843560805109820890508284820990508283610f443560405109820890508283610f043560605109820890508283610f243560805109820890508284820990508283610ee43560405109820890508283610ea43560605109820890508283610ec43560805109820890508284820990508283610e843560405109820890508283610e443560605109820890508283610e64356080510982089050826104405182099050806104c05250610fa0519250600082836114643560a051098208905082836114843560c051098208905082848209905082836113c43560a051098208905082836113e43560c051098208905082848209905082836113243560a051098208905082836113443560c051098208905082848209905082836112843560a051098208905082836112a43560c051098208905082848209905082836111e43560a051098208905082836112043560c051098208905082848209905082836111443560a051098208905082836111643560c051098208905082848209905082836110a43560a051098208905082836110c43560c051098208905082848209905082836110043560a051098208905082836110243560c05109820890508284820990508283610fc43560a05109820890508283610fe43560c0510982089050826104605182099050806104e05250610fa0519250600082836114c43560e051098208905082836114a43561010051098208905082848209905082836114243560e051098208905082836114043561010051098208905082848209905082836113843560e051098208905082836113643561010051098208905082848209905082836112e43560e051098208905082836112c43561010051098208905082848209905082836112443560e051098208905082836112243561010051098208905082848209905082836111a43560e051098208905082836111843561010051098208905082848209905082836111043560e051098208905082836110e43561010051098208905082848209905082836110643560e0510982089050828361104435610100510982089050826104805182096105005250602051610520526040516060519093508290840892508160805184086105405260a05160c051909350829084086105605260e0516101005190935082908408610580526000925060806105205b81851015611a145780518552602094850194016119fc565b5050611a248260806000846100c4565b90508161050051606051099250604060806104e05b81831015611a625784610fc051870995508485825185510987089550601f199283019201611a39565b505050826111a052610fc0519250610a8435600052610aa435602052611a8b610fa051826101a2565b9050611a9e611180516111605183610182565b9050610ec0610c005b81811015611adb57611abc610fa051846101a2565b9250611ace6020830151835185610182565b9250604082039150611aa7565b5050611aea610fa051826101a2565b9050611afd610724356107043583610182565b9050611b0c610fa051826101a2565b9050611b1f6106a4356106843583610182565b9050611b2e610fa051826101a2565b9050611b41610624356106043583610182565b9050611b50610fa051826101a2565b9050611b636105a4356105843583610182565b9050611b72610fa051826101a2565b9050611b85610524356105043583610182565b9050611b94610fa051826101a2565b9050611ba76104a4356104843583610182565b9050611bb6610fa051826101a2565b9050611bc9610424356104043583610182565b9050611bd8610fa051826101a2565b9050611beb6103a4356103843583610182565b9050611bfa610fa051826101a2565b9050611c0d610124356101043583610182565b90506103046102045b81811015611c4a57611c2b610fa051846101a2565b9250611c3d6020830135833585610182565b9250604082039150611c16565b5050611c59610fa051826101a2565b9050611c6a60e43560c43583610182565b90506102046101045b81811015611ca757611c88610fa051846101a2565b9250611c9a6020830135833585610182565b9250604082039150611c73565b5050610804356080526108243560a0526107c46107045b81811015611cf257611cd3610fa051846101dc565b9250611ce560208301358335856101bd565b9250604082039150611cbe565b5050611d0482610440518509826101dc565b9050611d1560a05160805183610182565b905081610fc05184099250610a4435608052610a643560a052610a046108045b81811015611d6957611d4a610fa051846101dc565b9250611d5c60208301358335856101bd565b9250604082039150611d35565b5050611d7b82610460518509826101dc565b9050611d8c60a05160805183610182565b905081610fc051840992506106c4356080526106e43560a052611db2610fa051826101dc565b9050611dc56106643561064435836101bd565b9050611dd4610fa051826101dc565b9050611de76105e4356105c435836101bd565b9050611df6610fa051826101dc565b9050611e096105643561054435836101bd565b9050611e18610fa051826101dc565b9050611e2b6104e4356104c435836101bd565b9050611e3a610fa051826101dc565b9050611e4d6104643561044435836101bd565b9050611e5c610fa051826101dc565b9050611e6f6103e4356103c435836101bd565b9050611e7e610fa051826101dc565b9050611e916103643561034435836101bd565b9050611ea382610480518509826101dc565b9050611eb460a05160805183610182565b9050610b0051608052610b205160a052611ed36111a0518303826101dc565b9050611ee460a05160805183610182565b9050611504356080526115243560a052611f03610400518303826101dc565b9050611f1460a05160805183610182565b9050611544356080526115643560a052611f31610fe051826101dc565b9050611f4260a05160805183610182565b90506000516111c0526020516111e05261154435611200526115643561122052610a80511561201657611000516000526110205160205261104051604052611060516060526111c0516080526111e05160a0526112005160c0526112205160e05281610100600020069250611fb783826101a2565b9050611fca6111e0516111c05183610182565b90506000516111c0526020516111e0526110405160005261106051602052611ff283826101a2565b9050612005611220516112005183610182565b905060005161120052602051611220525b61202f61122051611200516111e0516111c051856101f7565b90508061203b57600080fd5b505050600160005260206000f35b60008083601f84011261205b57600080fd5b50813567ffffffffffffffff81111561207357600080fd5b6020830191508360208260051b850101111561208e57600080fd5b9250929050565b6000806000806000606086880312156120ad57600080fd5b85356001600160a01b03811681146120c457600080fd5b9450602086013567ffffffffffffffff808211156120e157600080fd5b818801915088601f8301126120f557600080fd5b81358181111561210457600080fd5b89602082850101111561211657600080fd5b60208301965080955050604088013591508082111561213457600080fd5b5061214188828901612049565b96999598509396509294939250505056fea2646970667358221220533640d8171c8a735362590c471331aa70a9335324b4ab6dc6eeba85426ab79c64736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063af83a18d14610030575b600080fd5b61004361003e366004612095565b610057565b604051901515815260200160405180910390f35b6000610263565b60008060008435602086013588821086169450888110851694508860038a8b858609850908898283099289526020890191909152149290921696604094850196509390940193505050565b60016020536021600090812092830682529190915260200190565b6000838351602085015b602087038110156100f0578781518309808452602093840193909250016100ce565b8781518309915060208352602080840152602060408401528160608401526002880360808401528760a084015260208360c08560055afa851693508251915085602081016020850394505b828110156101635789855185098a84518609908452601f19958601959094509092019161013b565b8981518509945089825185099490915292909252509095945050505050565b81604052826060526000604060006080600060065afa9091169392505050565b816040526000604060006060600060075afa90911692915050565b8160c0528260e05260006040608080608060065afa9091169392505050565b8160c0526000604060806060608060075afa90911692915050565b8160005282602052610b4051604052610b6051606052610b8051608052610ba05160a0528360c0528460e052610bc05161010052610be05161012052610c005161014052610c205161016052600060206000610180600060085afa600051921690911695945050505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600161056060006109a08b3c6064356115001481169050610a6051611584358114821691506109a05160005260206115a48260200281015b8082101561030057813580845286119490941693602092830192909101906102dd565b5060849250610f0090506103445b8084101561032d576103228784868861005e565b94509450945061030e565b5060009182208581068252909152602090810161040083015b808410156103655761035a8784868861005e565b945094509450610346565b5060009182208581068252909152602090810161038285826100a9565b905061038083015b808410156103a95761039e8784868861005e565b94509450945061038a565b5060009182208581068252909152602090810160c083015b808410156103e0576103d58784868861005e565b9450945094506103c1565b5060009182208581068252909152602090810161098083015b8084101561041c57833580845286119490941693602093840193909201916103f9565b5060009182208581068252909152602090810161043985826100a9565b90506104478683858761005e565b600090812088810690945292909252935091506020905061046a8582848661005e565b9250925092505050610a80511561053757610ac051610ae0516020610aa051026115a4016020830260028102600382028335838501358386013583870135896020028801895b818a10156104ee5760208a0199508935811b86019550888a0135811b85019450878a0135811b84019350868a0135811b830192508a810190506104b0565b50508c60038e8f8788098709088d848509148b169a508c60038e8f8586098509088d828309148b169a508361100052826110205281611040528061106052505050505050505050505b8061054157600080fd5b6109c0519250610f80518060005b858110156105655784828309915060010161054f565b50610a005194506110806006610a6051016020028101610a6051610587576020015b610a40515b818310156105ad57868188038608835286888209905060208301925061058c565b508560018703840893508381526105cb8660208301611080886100c4565b94506110809150856109e05185099350610a40515b8183101561060357868782855109860983528688820990506020830192506105e0565b506110a05196506110c0935061114091505b8184101561062f5785845188089650602084019350610615565b600091506115a4610a605160200281015b80821015610664578788833588510985089350602082019150602086019550610640565b505051611080805161114051949091526110a0919091526110c0526110e0959095526111008190526111209490945250610f60516000937f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a291908480610e4435830986038208955050610fc435848082810381848009086110c051099050848186848909089550508384610e84358603610ea435086111005109848186848909089550508384610ee4358603610f0435086111005109848186848909089550508384610f44358603610f6435086111005109848186848909089550508384610fa4358603610fc43508611100510984818684890908955050610f4051610f2051610e6435610e44358788858a8b610d04358809610cc4350808830991508788858a8b610d24358809610b843508088309915087610f805184096000528788858a600051610cc4350808820990508786600051096000528788858a600051610b843508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610ec435610ea4358788858a8b610d44358809610ba4350808830991508788858a8b610d64358809610bc4350808830991508788858a600051610ba4350808820990508786600051096000528788858a600051610bc43508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f2435610f04358788858a8b610d84358809610be4350808830991508788858a8b610da4358809610c24350808830991508788858a600051610be4350808820990508786600051096000528788858a600051610c243508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f8435610f64358788858a8b610dc4358809610c44350808830991508788858a8b610de4358809610c64350808830991508788858a600051610c44350808820990508786600051096000528788858a600051610c643508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610fe435610fc4358788858a8b610e04358809610c84350808830991508788858a8b610e24358809611120510808830991508788858a600051610c84350808820990508786600051096000528788858a6000516111205108088209905087818903830893505050508485866110e0516110c05108830986038208905084818684890908955050611100518485611004358703830982089050848186848909089550506110c051848561100435870387611004356110043509088209905084818684890908955060009050610c0435610b8435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361108435088a85611044350809611024350988898a8487088b86890809611004350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611084358603611044350861110051098481868489090895505083848561106435870361104435088661108435880361104435080985866110c0516110e05108870360010809848186848909089550506111005184856110a4358703830982089050848186848909089550506110c05184856110a4358703876110a4356110a43509088209905084818684890908955060009050610b8435610ba435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361112435088a856110e43508096110c4350988898a8487088b868908096110a4350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111243586036110e435086111005109848186848909089550508384856111043587036110e43508866111243588036110e435080985866110c0516110e0510887036001080984818684890908955050611100518485611144358703830982089050848186848909089550506110c051848561114435870387611144356111443509088209905084818684890908955060009050610ba435610bc435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836111c435088a85611184350809611164350988898a8487088b86890809611144350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111c435860361118435086111005109848186848909089550508384856111a43587036111843508866111c435880361118435080985866110c0516110e05108870360010809848186848909089550506111005184856111e4358703830982089050848186848909089550506110c05184856111e4358703876111e4356111e43509088209905084818684890908955060009050610bc435610be435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361126435088a85611224350809611204350988898a8487088b868908096111e4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611264358603611224350861110051098481868489090895505083848561124435870361122435088661126435880361122435080985866110c0516110e0510887036001080984818684890908955050611100518485611284358703830982089050848186848909089550506110c051848561128435870387611284356112843509088209905084818684890908955060009050610ca435610c2435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361130435088a856112c43508096112a4350988898a8487088b86890809611284350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113043586036112c435086111005109848186848909089550508384856112e43587036112c43508866113043588036112c435080985866110c0516110e0510887036001080984818684890908955050611100518485611324358703830982089050848186848909089550506110c051848561132435870387611324356113243509088209905084818684890908955060009050610c2435610c4435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836113a435088a85611364350809611344350988898a8487088b86890809611324350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113a435860361136435086111005109848186848909089550508384856113843587036113643508866113a435880361136435080985866110c0516110e05108870360010809848186848909089550506111005184856113c4358703830982089050848186848909089550506110c05184856113c4358703876113c4356113c43509088209905084818684890908955060009050610c4435610c6435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361144435088a856114043508096113e4350988898a8487088b868908096113c4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611444358603611404350861110051098481868489090895505083848561142435870361140435088661144435880361140435080985866110c0516110e0510887036001080984818684890908955050611100518485611464358703830982089050848186848909089550506110c051848561146435870387611464356114643509088209905084818684890908955060009050610c6435610c8435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836114e435088a856114a4350809611484350988898a8487088b86890809611464350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846114e43586036114a435086111005109848186848909089550508384856114c43587036114a43508866114e43588036114a435080985866110c0516110e05108870360010809848186848909089550505050816110a051840961114052610b4435600052610b6435602052611080519250610b04610a845b818110156113415761132285846101a2565b92506113346020830135833585610182565b9250604082039150611310565b50506000516111605260205161118052610f80519250610a0051610a205183828609915081610360528461034052838186099150816103205283818309915083818309915083818309915083818309915083818309915050806103005250610fe05192506103806104006103005b818310156113cc57848151860387088352602092830192016113af565b50506103c0516104005250610380516103a051909350829084099250816103e05184096104208190526000526103a0516104408190526103805193508290840961046052610380516103e05190935082908409610480526103c0516001935082908409602052610300516103405161036051919450906000848381038708905084858387038808820990508461038051820990508060405284868603840890508485838703850882099050846103c051820990508060605284868603830890508485848703840882099050846103e051820960805250506103405161036051909450905060008382810386089050836103c051820990508060a0528385850383089050836103e051820960c0525050610320516103405190935060008382810386089050836103a051820990508060e0528385850383089050836103c051820961010052506115229050826101206000846100c4565b9050600051925082610420526104406104a05b8082101561154f5783858351098252602082019150611535565b50506020519250610fa05160008384610ce435870982089050838282099050838461114051870982089050610e24610ce45b818110156115a15785868335890987868609089250602082039150611581565b50508382820990508384610cc43587098208905083828209905083846114e43587098208905083828209905083846114443587098208905083828209905083846113a43587098208905083828209905083846113043587098208905083828209905083846112643587098208905083828209905083846111c435870982089050838282099050838461112435870982089050838282099050838461108435870982089050610ca4610b645b8181101561166c578586833589098786860908925060208203915061164c565b5050806104a0525050610fa051925060008283610fa43560405109820890508283610f643560605109820890508283610f843560805109820890508284820990508283610f443560405109820890508283610f043560605109820890508283610f243560805109820890508284820990508283610ee43560405109820890508283610ea43560605109820890508283610ec43560805109820890508284820990508283610e843560405109820890508283610e443560605109820890508283610e64356080510982089050826104405182099050806104c05250610fa0519250600082836114643560a051098208905082836114843560c051098208905082848209905082836113c43560a051098208905082836113e43560c051098208905082848209905082836113243560a051098208905082836113443560c051098208905082848209905082836112843560a051098208905082836112a43560c051098208905082848209905082836111e43560a051098208905082836112043560c051098208905082848209905082836111443560a051098208905082836111643560c051098208905082848209905082836110a43560a051098208905082836110c43560c051098208905082848209905082836110043560a051098208905082836110243560c05109820890508284820990508283610fc43560a05109820890508283610fe43560c0510982089050826104605182099050806104e05250610fa0519250600082836114c43560e051098208905082836114a43561010051098208905082848209905082836114243560e051098208905082836114043561010051098208905082848209905082836113843560e051098208905082836113643561010051098208905082848209905082836112e43560e051098208905082836112c43561010051098208905082848209905082836112443560e051098208905082836112243561010051098208905082848209905082836111a43560e051098208905082836111843561010051098208905082848209905082836111043560e051098208905082836110e43561010051098208905082848209905082836110643560e0510982089050828361104435610100510982089050826104805182096105005250602051610520526040516060519093508290840892508160805184086105405260a05160c051909350829084086105605260e0516101005190935082908408610580526000925060806105205b81851015611a145780518552602094850194016119fc565b5050611a248260806000846100c4565b90508161050051606051099250604060806104e05b81831015611a625784610fc051870995508485825185510987089550601f199283019201611a39565b505050826111a052610fc0519250610a8435600052610aa435602052611a8b610fa051826101a2565b9050611a9e611180516111605183610182565b9050610ec0610c005b81811015611adb57611abc610fa051846101a2565b9250611ace6020830151835185610182565b9250604082039150611aa7565b5050611aea610fa051826101a2565b9050611afd610724356107043583610182565b9050611b0c610fa051826101a2565b9050611b1f6106a4356106843583610182565b9050611b2e610fa051826101a2565b9050611b41610624356106043583610182565b9050611b50610fa051826101a2565b9050611b636105a4356105843583610182565b9050611b72610fa051826101a2565b9050611b85610524356105043583610182565b9050611b94610fa051826101a2565b9050611ba76104a4356104843583610182565b9050611bb6610fa051826101a2565b9050611bc9610424356104043583610182565b9050611bd8610fa051826101a2565b9050611beb6103a4356103843583610182565b9050611bfa610fa051826101a2565b9050611c0d610124356101043583610182565b90506103046102045b81811015611c4a57611c2b610fa051846101a2565b9250611c3d6020830135833585610182565b9250604082039150611c16565b5050611c59610fa051826101a2565b9050611c6a60e43560c43583610182565b90506102046101045b81811015611ca757611c88610fa051846101a2565b9250611c9a6020830135833585610182565b9250604082039150611c73565b5050610804356080526108243560a0526107c46107045b81811015611cf257611cd3610fa051846101dc565b9250611ce560208301358335856101bd565b9250604082039150611cbe565b5050611d0482610440518509826101dc565b9050611d1560a05160805183610182565b905081610fc05184099250610a4435608052610a643560a052610a046108045b81811015611d6957611d4a610fa051846101dc565b9250611d5c60208301358335856101bd565b9250604082039150611d35565b5050611d7b82610460518509826101dc565b9050611d8c60a05160805183610182565b905081610fc051840992506106c4356080526106e43560a052611db2610fa051826101dc565b9050611dc56106643561064435836101bd565b9050611dd4610fa051826101dc565b9050611de76105e4356105c435836101bd565b9050611df6610fa051826101dc565b9050611e096105643561054435836101bd565b9050611e18610fa051826101dc565b9050611e2b6104e4356104c435836101bd565b9050611e3a610fa051826101dc565b9050611e4d6104643561044435836101bd565b9050611e5c610fa051826101dc565b9050611e6f6103e4356103c435836101bd565b9050611e7e610fa051826101dc565b9050611e916103643561034435836101bd565b9050611ea382610480518509826101dc565b9050611eb460a05160805183610182565b9050610b0051608052610b205160a052611ed36111a0518303826101dc565b9050611ee460a05160805183610182565b9050611504356080526115243560a052611f03610400518303826101dc565b9050611f1460a05160805183610182565b9050611544356080526115643560a052611f31610fe051826101dc565b9050611f4260a05160805183610182565b90506000516111c0526020516111e05261154435611200526115643561122052610a80511561201657611000516000526110205160205261104051604052611060516060526111c0516080526111e05160a0526112005160c0526112205160e05281610100600020069250611fb783826101a2565b9050611fca6111e0516111c05183610182565b90506000516111c0526020516111e0526110405160005261106051602052611ff283826101a2565b9050612005611220516112005183610182565b905060005161120052602051611220525b61202f61122051611200516111e0516111c051856101f7565b90508061203b57600080fd5b505050600160005260206000f35b60008083601f84011261205b57600080fd5b50813567ffffffffffffffff81111561207357600080fd5b6020830191508360208260051b850101111561208e57600080fd5b9250929050565b6000806000806000606086880312156120ad57600080fd5b85356001600160a01b03811681146120c457600080fd5b9450602086013567ffffffffffffffff808211156120e157600080fd5b818801915088601f8301126120f557600080fd5b81358181111561210457600080fd5b89602082850101111561211657600080fd5b60208301965080955050604088013591508082111561213457600080fd5b5061214188828901612049565b96999598509396509294939250505056fea2646970667358221220533640d8171c8a735362590c471331aa70a9335324b4ab6dc6eeba85426ab79c64736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file +{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/SnarkVerifier.sol","abi":[{"inputs":[{"internalType":"address","name":"vk","type":"address"},{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256[]","name":"instances","type":"uint256[]"}],"name":"verifyProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50612188806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063af83a18d14610030575b600080fd5b61004361003e366004612095565b610057565b604051901515815260200160405180910390f35b6000610263565b60008060008435602086013588821086169450888110851694508860038a8b858609850908898283099289526020890191909152149290921696604094850196509390940193505050565b60016020536021600090812092830682529190915260200190565b6000838351602085015b602087038110156100f0578781518309808452602093840193909250016100ce565b8781518309915060208352602080840152602060408401528160608401526002880360808401528760a084015260208360c08560055afa851693508251915085602081016020850394505b828110156101635789855185098a84518609908452601f19958601959094509092019161013b565b8981518509945089825185099490915292909252509095945050505050565b81604052826060526000604060006080600060065afa9091169392505050565b816040526000604060006060600060075afa90911692915050565b8160c0528260e05260006040608080608060065afa9091169392505050565b8160c0526000604060806060608060075afa90911692915050565b8160005282602052610b4051604052610b6051606052610b8051608052610ba05160a0528360c0528460e052610bc05161010052610be05161012052610c005161014052610c205161016052600060206000610180600060085afa600051921690911695945050505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600161056060006109a08b3c6064356115001481169050610a6051611584358114821691506109a05160005260206115a48260200281015b8082101561030057813580845286119490941693602092830192909101906102dd565b5060849250610f0090506103445b8084101561032d576103228784868861005e565b94509450945061030e565b5060009182208581068252909152602090810161040083015b808410156103655761035a8784868861005e565b945094509450610346565b5060009182208581068252909152602090810161038285826100a9565b905061038083015b808410156103a95761039e8784868861005e565b94509450945061038a565b5060009182208581068252909152602090810160c083015b808410156103e0576103d58784868861005e565b9450945094506103c1565b5060009182208581068252909152602090810161098083015b8084101561041c57833580845286119490941693602093840193909201916103f9565b5060009182208581068252909152602090810161043985826100a9565b90506104478683858761005e565b600090812088810690945292909252935091506020905061046a8582848661005e565b9250925092505050610a80511561053757610ac051610ae0516020610aa051026115a4016020830260028102600382028335838501358386013583870135896020028801895b818a10156104ee5760208a0199508935811b86019550888a0135811b85019450878a0135811b84019350868a0135811b830192508a810190506104b0565b50508c60038e8f8788098709088d848509148b169a508c60038e8f8586098509088d828309148b169a508361100052826110205281611040528061106052505050505050505050505b8061054157600080fd5b6109c0519250610f80518060005b858110156105655784828309915060010161054f565b50610a005194506110806006610a6051016020028101610a6051610587576020015b610a40515b818310156105ad57868188038608835286888209905060208301925061058c565b508560018703840893508381526105cb8660208301611080886100c4565b94506110809150856109e05185099350610a40515b8183101561060357868782855109860983528688820990506020830192506105e0565b506110a05196506110c0935061114091505b8184101561062f5785845188089650602084019350610615565b600091506115a4610a605160200281015b80821015610664578788833588510985089350602082019150602086019550610640565b505051611080805161114051949091526110a0919091526110c0526110e0959095526111008190526111209490945250610f60516000937f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a291908480610e4435830986038208955050610fc435848082810381848009086110c051099050848186848909089550508384610e84358603610ea435086111005109848186848909089550508384610ee4358603610f0435086111005109848186848909089550508384610f44358603610f6435086111005109848186848909089550508384610fa4358603610fc43508611100510984818684890908955050610f4051610f2051610e6435610e44358788858a8b610d04358809610cc4350808830991508788858a8b610d243588096111205108088309915087610f805184096000528788858a600051610cc4350808820990508786600051096000528788858a6000516111205108088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610ec435610ea4358788858a8b610d44358809610b84350808830991508788858a8b610d64358809610ba4350808830991508788858a600051610b84350808820990508786600051096000528788858a600051610ba43508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f2435610f04358788858a8b610d84358809610bc4350808830991508788858a8b610da4358809610be4350808830991508788858a600051610bc4350808820990508786600051096000528788858a600051610be43508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f8435610f64358788858a8b610dc4358809610c24350808830991508788858a8b610de4358809610c44350808830991508788858a600051610c24350808820990508786600051096000528788858a600051610c443508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610fe435610fc4358788858a8b610e04358809610c64350808830991508788858a8b610e24358809610c84350808830991508788858a600051610c64350808820990508786600051096000528788858a600051610c843508088209905087818903830893505050508485866110e0516110c05108830986038208905084818684890908955050611100518485611004358703830982089050848186848909089550506110c051848561100435870387611004356110043509088209905084818684890908955060009050610c0435610b8435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361108435088a85611044350809611024350988898a8487088b86890809611004350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611084358603611044350861110051098481868489090895505083848561106435870361104435088661108435880361104435080985866110c0516110e05108870360010809848186848909089550506111005184856110a4358703830982089050848186848909089550506110c05184856110a4358703876110a4356110a43509088209905084818684890908955060009050610b8435610ba435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361112435088a856110e43508096110c4350988898a8487088b868908096110a4350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111243586036110e435086111005109848186848909089550508384856111043587036110e43508866111243588036110e435080985866110c0516110e0510887036001080984818684890908955050611100518485611144358703830982089050848186848909089550506110c051848561114435870387611144356111443509088209905084818684890908955060009050610ba435610bc435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836111c435088a85611184350809611164350988898a8487088b86890809611144350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111c435860361118435086111005109848186848909089550508384856111a43587036111843508866111c435880361118435080985866110c0516110e05108870360010809848186848909089550506111005184856111e4358703830982089050848186848909089550506110c05184856111e4358703876111e4356111e43509088209905084818684890908955060009050610bc435610be435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361126435088a85611224350809611204350988898a8487088b868908096111e4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611264358603611224350861110051098481868489090895505083848561124435870361122435088661126435880361122435080985866110c0516110e0510887036001080984818684890908955050611100518485611284358703830982089050848186848909089550506110c051848561128435870387611284356112843509088209905084818684890908955060009050610ca435610c2435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361130435088a856112c43508096112a4350988898a8487088b86890809611284350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113043586036112c435086111005109848186848909089550508384856112e43587036112c43508866113043588036112c435080985866110c0516110e0510887036001080984818684890908955050611100518485611324358703830982089050848186848909089550506110c051848561132435870387611324356113243509088209905084818684890908955060009050610c2435610c4435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836113a435088a85611364350809611344350988898a8487088b86890809611324350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113a435860361136435086111005109848186848909089550508384856113843587036113643508866113a435880361136435080985866110c0516110e05108870360010809848186848909089550506111005184856113c4358703830982089050848186848909089550506110c05184856113c4358703876113c4356113c43509088209905084818684890908955060009050610c4435610c6435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361144435088a856114043508096113e4350988898a8487088b868908096113c4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611444358603611404350861110051098481868489090895505083848561142435870361140435088661144435880361140435080985866110c0516110e0510887036001080984818684890908955050611100518485611464358703830982089050848186848909089550506110c051848561146435870387611464356114643509088209905084818684890908955060009050610c6435610c8435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836114e435088a856114a4350809611484350988898a8487088b86890809611464350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846114e43586036114a435086111005109848186848909089550508384856114c43587036114a43508866114e43588036114a435080985866110c0516110e05108870360010809848186848909089550505050816110a051840961114052610b4435600052610b6435602052611080519250610b04610a845b818110156113415761132285846101a2565b92506113346020830135833585610182565b9250604082039150611310565b50506000516111605260205161118052610f80519250610a0051610a205183828609915081610360528461034052838186099150816103205283818309915083818309915083818309915083818309915083818309915050806103005250610fe05192506103806104006103005b818310156113cc57848151860387088352602092830192016113af565b50506103c0516104005250610380516103a051909350829084099250816103e05184096104208190526000526103a0516104408190526103805193508290840961046052610380516103e05190935082908409610480526103c0516001935082908409602052610300516103405161036051919450906000848381038708905084858387038808820990508461038051820990508060405284868603840890508485838703850882099050846103c051820990508060605284868603830890508485848703840882099050846103e051820960805250506103405161036051909450905060008382810386089050836103c051820990508060a0528385850383089050836103e051820960c0525050610320516103405190935060008382810386089050836103a051820990508060e0528385850383089050836103c051820961010052506115229050826101206000846100c4565b9050600051925082610420526104406104a05b8082101561154f5783858351098252602082019150611535565b50506020519250610fa05160008384610ce435870982089050838282099050838461114051870982089050610e24610ce45b818110156115a15785868335890987868609089250602082039150611581565b50508382820990508384610cc43587098208905083828209905083846114e43587098208905083828209905083846114443587098208905083828209905083846113a43587098208905083828209905083846113043587098208905083828209905083846112643587098208905083828209905083846111c435870982089050838282099050838461112435870982089050838282099050838461108435870982089050610ca4610b645b8181101561166c578586833589098786860908925060208203915061164c565b5050806104a0525050610fa051925060008283610fa43560405109820890508283610f643560605109820890508283610f843560805109820890508284820990508283610f443560405109820890508283610f043560605109820890508283610f243560805109820890508284820990508283610ee43560405109820890508283610ea43560605109820890508283610ec43560805109820890508284820990508283610e843560405109820890508283610e443560605109820890508283610e64356080510982089050826104405182099050806104c05250610fa0519250600082836114643560a051098208905082836114843560c051098208905082848209905082836113c43560a051098208905082836113e43560c051098208905082848209905082836113243560a051098208905082836113443560c051098208905082848209905082836112843560a051098208905082836112a43560c051098208905082848209905082836111e43560a051098208905082836112043560c051098208905082848209905082836111443560a051098208905082836111643560c051098208905082848209905082836110a43560a051098208905082836110c43560c051098208905082848209905082836110043560a051098208905082836110243560c05109820890508284820990508283610fc43560a05109820890508283610fe43560c0510982089050826104605182099050806104e05250610fa0519250600082836114c43560e051098208905082836114a43561010051098208905082848209905082836114243560e051098208905082836114043561010051098208905082848209905082836113843560e051098208905082836113643561010051098208905082848209905082836112e43560e051098208905082836112c43561010051098208905082848209905082836112443560e051098208905082836112243561010051098208905082848209905082836111a43560e051098208905082836111843561010051098208905082848209905082836111043560e051098208905082836110e43561010051098208905082848209905082836110643560e0510982089050828361104435610100510982089050826104805182096105005250602051610520526040516060519093508290840892508160805184086105405260a05160c051909350829084086105605260e0516101005190935082908408610580526000925060806105205b81851015611a145780518552602094850194016119fc565b5050611a248260806000846100c4565b90508161050051606051099250604060806104e05b81831015611a625784610fc051870995508485825185510987089550601f199283019201611a39565b505050826111a052610fc0519250610a8435600052610aa435602052611a8b610fa051826101a2565b9050611a9e611180516111605183610182565b9050610ec0610c005b81811015611adb57611abc610fa051846101a2565b9250611ace6020830151835185610182565b9250604082039150611aa7565b5050611aea610fa051826101a2565b9050611afd610724356107043583610182565b9050611b0c610fa051826101a2565b9050611b1f6106a4356106843583610182565b9050611b2e610fa051826101a2565b9050611b41610624356106043583610182565b9050611b50610fa051826101a2565b9050611b636105a4356105843583610182565b9050611b72610fa051826101a2565b9050611b85610524356105043583610182565b9050611b94610fa051826101a2565b9050611ba76104a4356104843583610182565b9050611bb6610fa051826101a2565b9050611bc9610424356104043583610182565b9050611bd8610fa051826101a2565b9050611beb6103a4356103843583610182565b9050611bfa610fa051826101a2565b9050611c0d610124356101043583610182565b90506103046102045b81811015611c4a57611c2b610fa051846101a2565b9250611c3d6020830135833585610182565b9250604082039150611c16565b5050611c59610fa051826101a2565b9050611c6a60e43560c43583610182565b90506102046101045b81811015611ca757611c88610fa051846101a2565b9250611c9a6020830135833585610182565b9250604082039150611c73565b5050610804356080526108243560a0526107c46107045b81811015611cf257611cd3610fa051846101dc565b9250611ce560208301358335856101bd565b9250604082039150611cbe565b5050611d0482610440518509826101dc565b9050611d1560a05160805183610182565b905081610fc05184099250610a4435608052610a643560a052610a046108045b81811015611d6957611d4a610fa051846101dc565b9250611d5c60208301358335856101bd565b9250604082039150611d35565b5050611d7b82610460518509826101dc565b9050611d8c60a05160805183610182565b905081610fc051840992506106c4356080526106e43560a052611db2610fa051826101dc565b9050611dc56106643561064435836101bd565b9050611dd4610fa051826101dc565b9050611de76105e4356105c435836101bd565b9050611df6610fa051826101dc565b9050611e096105643561054435836101bd565b9050611e18610fa051826101dc565b9050611e2b6104e4356104c435836101bd565b9050611e3a610fa051826101dc565b9050611e4d6104643561044435836101bd565b9050611e5c610fa051826101dc565b9050611e6f6103e4356103c435836101bd565b9050611e7e610fa051826101dc565b9050611e916103643561034435836101bd565b9050611ea382610480518509826101dc565b9050611eb460a05160805183610182565b9050610b0051608052610b205160a052611ed36111a0518303826101dc565b9050611ee460a05160805183610182565b9050611504356080526115243560a052611f03610400518303826101dc565b9050611f1460a05160805183610182565b9050611544356080526115643560a052611f31610fe051826101dc565b9050611f4260a05160805183610182565b90506000516111c0526020516111e05261154435611200526115643561122052610a80511561201657611000516000526110205160205261104051604052611060516060526111c0516080526111e05160a0526112005160c0526112205160e05281610100600020069250611fb783826101a2565b9050611fca6111e0516111c05183610182565b90506000516111c0526020516111e0526110405160005261106051602052611ff283826101a2565b9050612005611220516112005183610182565b905060005161120052602051611220525b61202f61122051611200516111e0516111c051856101f7565b90508061203b57600080fd5b505050600160005260206000f35b60008083601f84011261205b57600080fd5b50813567ffffffffffffffff81111561207357600080fd5b6020830191508360208260051b850101111561208e57600080fd5b9250929050565b6000806000806000606086880312156120ad57600080fd5b85356001600160a01b03811681146120c457600080fd5b9450602086013567ffffffffffffffff808211156120e157600080fd5b818801915088601f8301126120f557600080fd5b81358181111561210457600080fd5b89602082850101111561211657600080fd5b60208301965080955050604088013591508082111561213457600080fd5b5061214188828901612049565b96999598509396509294939250505056fea26469706673582212206980435f9591390378e255f4026eeb42c56814114f9e4b0fa8fa6f9c5badec5b64736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063af83a18d14610030575b600080fd5b61004361003e366004612095565b610057565b604051901515815260200160405180910390f35b6000610263565b60008060008435602086013588821086169450888110851694508860038a8b858609850908898283099289526020890191909152149290921696604094850196509390940193505050565b60016020536021600090812092830682529190915260200190565b6000838351602085015b602087038110156100f0578781518309808452602093840193909250016100ce565b8781518309915060208352602080840152602060408401528160608401526002880360808401528760a084015260208360c08560055afa851693508251915085602081016020850394505b828110156101635789855185098a84518609908452601f19958601959094509092019161013b565b8981518509945089825185099490915292909252509095945050505050565b81604052826060526000604060006080600060065afa9091169392505050565b816040526000604060006060600060075afa90911692915050565b8160c0528260e05260006040608080608060065afa9091169392505050565b8160c0526000604060806060608060075afa90911692915050565b8160005282602052610b4051604052610b6051606052610b8051608052610ba05160a0528360c0528460e052610bc05161010052610be05161012052610c005161014052610c205161016052600060206000610180600060085afa600051921690911695945050505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd477f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600161056060006109a08b3c6064356115001481169050610a6051611584358114821691506109a05160005260206115a48260200281015b8082101561030057813580845286119490941693602092830192909101906102dd565b5060849250610f0090506103445b8084101561032d576103228784868861005e565b94509450945061030e565b5060009182208581068252909152602090810161040083015b808410156103655761035a8784868861005e565b945094509450610346565b5060009182208581068252909152602090810161038285826100a9565b905061038083015b808410156103a95761039e8784868861005e565b94509450945061038a565b5060009182208581068252909152602090810160c083015b808410156103e0576103d58784868861005e565b9450945094506103c1565b5060009182208581068252909152602090810161098083015b8084101561041c57833580845286119490941693602093840193909201916103f9565b5060009182208581068252909152602090810161043985826100a9565b90506104478683858761005e565b600090812088810690945292909252935091506020905061046a8582848661005e565b9250925092505050610a80511561053757610ac051610ae0516020610aa051026115a4016020830260028102600382028335838501358386013583870135896020028801895b818a10156104ee5760208a0199508935811b86019550888a0135811b85019450878a0135811b84019350868a0135811b830192508a810190506104b0565b50508c60038e8f8788098709088d848509148b169a508c60038e8f8586098509088d828309148b169a508361100052826110205281611040528061106052505050505050505050505b8061054157600080fd5b6109c0519250610f80518060005b858110156105655784828309915060010161054f565b50610a005194506110806006610a6051016020028101610a6051610587576020015b610a40515b818310156105ad57868188038608835286888209905060208301925061058c565b508560018703840893508381526105cb8660208301611080886100c4565b94506110809150856109e05185099350610a40515b8183101561060357868782855109860983528688820990506020830192506105e0565b506110a05196506110c0935061114091505b8184101561062f5785845188089650602084019350610615565b600091506115a4610a605160200281015b80821015610664578788833588510985089350602082019150602086019550610640565b505051611080805161114051949091526110a0919091526110c0526110e0959095526111008190526111209490945250610f60516000937f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a291908480610e4435830986038208955050610fc435848082810381848009086110c051099050848186848909089550508384610e84358603610ea435086111005109848186848909089550508384610ee4358603610f0435086111005109848186848909089550508384610f44358603610f6435086111005109848186848909089550508384610fa4358603610fc43508611100510984818684890908955050610f4051610f2051610e6435610e44358788858a8b610d04358809610cc4350808830991508788858a8b610d243588096111205108088309915087610f805184096000528788858a600051610cc4350808820990508786600051096000528788858a6000516111205108088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610ec435610ea4358788858a8b610d44358809610b84350808830991508788858a8b610d64358809610ba4350808830991508788858a600051610b84350808820990508786600051096000528788858a600051610ba43508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f2435610f04358788858a8b610d84358809610bc4350808830991508788858a8b610da4358809610be4350808830991508788858a600051610bc4350808820990508786600051096000528788858a600051610be43508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610f8435610f64358788858a8b610dc4358809610c24350808830991508788858a8b610de4358809610c44350808830991508788858a600051610c24350808820990508786600051096000528788858a600051610c443508088209905087866000510960005287818903830893505050508485866110e0516110c05108830986038208905084818684890908955050610f4051610f2051610fe435610fc4358788858a8b610e04358809610c64350808830991508788858a8b610e24358809610c84350808830991508788858a600051610c64350808820990508786600051096000528788858a600051610c843508088209905087818903830893505050508485866110e0516110c05108830986038208905084818684890908955050611100518485611004358703830982089050848186848909089550506110c051848561100435870387611004356110043509088209905084818684890908955060009050610c0435610b8435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361108435088a85611044350809611024350988898a8487088b86890809611004350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611084358603611044350861110051098481868489090895505083848561106435870361104435088661108435880361104435080985866110c0516110e05108870360010809848186848909089550506111005184856110a4358703830982089050848186848909089550506110c05184856110a4358703876110a4356110a43509088209905084818684890908955060009050610b8435610ba435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361112435088a856110e43508096110c4350988898a8487088b868908096110a4350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111243586036110e435086111005109848186848909089550508384856111043587036110e43508866111243588036110e435080985866110c0516110e0510887036001080984818684890908955050611100518485611144358703830982089050848186848909089550506110c051848561114435870387611144356111443509088209905084818684890908955060009050610ba435610bc435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836111c435088a85611184350809611164350988898a8487088b86890809611144350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846111c435860361118435086111005109848186848909089550508384856111a43587036111843508866111c435880361118435080985866110c0516110e05108870360010809848186848909089550506111005184856111e4358703830982089050848186848909089550506110c05184856111e4358703876111e4356111e43509088209905084818684890908955060009050610bc435610be435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361126435088a85611224350809611204350988898a8487088b868908096111e4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611264358603611224350861110051098481868489090895505083848561124435870361122435088661126435880361122435080985866110c0516110e0510887036001080984818684890908955050611100518485611284358703830982089050848186848909089550506110c051848561128435870387611284356112843509088209905084818684890908955060009050610ca435610c2435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361130435088a856112c43508096112a4350988898a8487088b86890809611284350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113043586036112c435086111005109848186848909089550508384856112e43587036112c43508866113043588036112c435080985866110c0516110e0510887036001080984818684890908955050611100518485611324358703830982089050848186848909089550506110c051848561132435870387611324356113243509088209905084818684890908955060009050610c2435610c4435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836113a435088a85611364350809611344350988898a8487088b86890809611324350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846113a435860361136435086111005109848186848909089550508384856113843587036113643508866113a435880361136435080985866110c0516110e05108870360010809848186848909089550506111005184856113c4358703830982089050848186848909089550506110c05184856113c4358703876113c4356113c43509088209905084818684890908955060009050610c4435610c6435620100008781830988039150879050818308610f2051610f4051919450610cc435935091508780808361144435088a856114043508096113e4350988898a8487088b868908096113c4350994508889868b0383088a8b6110c0516110e051088c0360010809945050505050848186848909089550508384611444358603611404350861110051098481868489090895505083848561142435870361140435088661144435880361140435080985866110c0516110e0510887036001080984818684890908955050611100518485611464358703830982089050848186848909089550506110c051848561146435870387611464356114643509088209905084818684890908955060009050610c6435610c8435620100008781830988039150879050818308610f2051610f4051919450610cc43593509150878080836114e435088a856114a4350809611484350988898a8487088b86890809611464350994508889868b0383088a8b6110c0516110e051088c03600108099450505050508481868489090895505083846114e43586036114a435086111005109848186848909089550508384856114c43587036114a43508866114e43588036114a435080985866110c0516110e05108870360010809848186848909089550505050816110a051840961114052610b4435600052610b6435602052611080519250610b04610a845b818110156113415761132285846101a2565b92506113346020830135833585610182565b9250604082039150611310565b50506000516111605260205161118052610f80519250610a0051610a205183828609915081610360528461034052838186099150816103205283818309915083818309915083818309915083818309915083818309915050806103005250610fe05192506103806104006103005b818310156113cc57848151860387088352602092830192016113af565b50506103c0516104005250610380516103a051909350829084099250816103e05184096104208190526000526103a0516104408190526103805193508290840961046052610380516103e05190935082908409610480526103c0516001935082908409602052610300516103405161036051919450906000848381038708905084858387038808820990508461038051820990508060405284868603840890508485838703850882099050846103c051820990508060605284868603830890508485848703840882099050846103e051820960805250506103405161036051909450905060008382810386089050836103c051820990508060a0528385850383089050836103e051820960c0525050610320516103405190935060008382810386089050836103a051820990508060e0528385850383089050836103c051820961010052506115229050826101206000846100c4565b9050600051925082610420526104406104a05b8082101561154f5783858351098252602082019150611535565b50506020519250610fa05160008384610ce435870982089050838282099050838461114051870982089050610e24610ce45b818110156115a15785868335890987868609089250602082039150611581565b50508382820990508384610cc43587098208905083828209905083846114e43587098208905083828209905083846114443587098208905083828209905083846113a43587098208905083828209905083846113043587098208905083828209905083846112643587098208905083828209905083846111c435870982089050838282099050838461112435870982089050838282099050838461108435870982089050610ca4610b645b8181101561166c578586833589098786860908925060208203915061164c565b5050806104a0525050610fa051925060008283610fa43560405109820890508283610f643560605109820890508283610f843560805109820890508284820990508283610f443560405109820890508283610f043560605109820890508283610f243560805109820890508284820990508283610ee43560405109820890508283610ea43560605109820890508283610ec43560805109820890508284820990508283610e843560405109820890508283610e443560605109820890508283610e64356080510982089050826104405182099050806104c05250610fa0519250600082836114643560a051098208905082836114843560c051098208905082848209905082836113c43560a051098208905082836113e43560c051098208905082848209905082836113243560a051098208905082836113443560c051098208905082848209905082836112843560a051098208905082836112a43560c051098208905082848209905082836111e43560a051098208905082836112043560c051098208905082848209905082836111443560a051098208905082836111643560c051098208905082848209905082836110a43560a051098208905082836110c43560c051098208905082848209905082836110043560a051098208905082836110243560c05109820890508284820990508283610fc43560a05109820890508283610fe43560c0510982089050826104605182099050806104e05250610fa0519250600082836114c43560e051098208905082836114a43561010051098208905082848209905082836114243560e051098208905082836114043561010051098208905082848209905082836113843560e051098208905082836113643561010051098208905082848209905082836112e43560e051098208905082836112c43561010051098208905082848209905082836112443560e051098208905082836112243561010051098208905082848209905082836111a43560e051098208905082836111843561010051098208905082848209905082836111043560e051098208905082836110e43561010051098208905082848209905082836110643560e0510982089050828361104435610100510982089050826104805182096105005250602051610520526040516060519093508290840892508160805184086105405260a05160c051909350829084086105605260e0516101005190935082908408610580526000925060806105205b81851015611a145780518552602094850194016119fc565b5050611a248260806000846100c4565b90508161050051606051099250604060806104e05b81831015611a625784610fc051870995508485825185510987089550601f199283019201611a39565b505050826111a052610fc0519250610a8435600052610aa435602052611a8b610fa051826101a2565b9050611a9e611180516111605183610182565b9050610ec0610c005b81811015611adb57611abc610fa051846101a2565b9250611ace6020830151835185610182565b9250604082039150611aa7565b5050611aea610fa051826101a2565b9050611afd610724356107043583610182565b9050611b0c610fa051826101a2565b9050611b1f6106a4356106843583610182565b9050611b2e610fa051826101a2565b9050611b41610624356106043583610182565b9050611b50610fa051826101a2565b9050611b636105a4356105843583610182565b9050611b72610fa051826101a2565b9050611b85610524356105043583610182565b9050611b94610fa051826101a2565b9050611ba76104a4356104843583610182565b9050611bb6610fa051826101a2565b9050611bc9610424356104043583610182565b9050611bd8610fa051826101a2565b9050611beb6103a4356103843583610182565b9050611bfa610fa051826101a2565b9050611c0d610124356101043583610182565b90506103046102045b81811015611c4a57611c2b610fa051846101a2565b9250611c3d6020830135833585610182565b9250604082039150611c16565b5050611c59610fa051826101a2565b9050611c6a60e43560c43583610182565b90506102046101045b81811015611ca757611c88610fa051846101a2565b9250611c9a6020830135833585610182565b9250604082039150611c73565b5050610804356080526108243560a0526107c46107045b81811015611cf257611cd3610fa051846101dc565b9250611ce560208301358335856101bd565b9250604082039150611cbe565b5050611d0482610440518509826101dc565b9050611d1560a05160805183610182565b905081610fc05184099250610a4435608052610a643560a052610a046108045b81811015611d6957611d4a610fa051846101dc565b9250611d5c60208301358335856101bd565b9250604082039150611d35565b5050611d7b82610460518509826101dc565b9050611d8c60a05160805183610182565b905081610fc051840992506106c4356080526106e43560a052611db2610fa051826101dc565b9050611dc56106643561064435836101bd565b9050611dd4610fa051826101dc565b9050611de76105e4356105c435836101bd565b9050611df6610fa051826101dc565b9050611e096105643561054435836101bd565b9050611e18610fa051826101dc565b9050611e2b6104e4356104c435836101bd565b9050611e3a610fa051826101dc565b9050611e4d6104643561044435836101bd565b9050611e5c610fa051826101dc565b9050611e6f6103e4356103c435836101bd565b9050611e7e610fa051826101dc565b9050611e916103643561034435836101bd565b9050611ea382610480518509826101dc565b9050611eb460a05160805183610182565b9050610b0051608052610b205160a052611ed36111a0518303826101dc565b9050611ee460a05160805183610182565b9050611504356080526115243560a052611f03610400518303826101dc565b9050611f1460a05160805183610182565b9050611544356080526115643560a052611f31610fe051826101dc565b9050611f4260a05160805183610182565b90506000516111c0526020516111e05261154435611200526115643561122052610a80511561201657611000516000526110205160205261104051604052611060516060526111c0516080526111e05160a0526112005160c0526112205160e05281610100600020069250611fb783826101a2565b9050611fca6111e0516111c05183610182565b90506000516111c0526020516111e0526110405160005261106051602052611ff283826101a2565b9050612005611220516112005183610182565b905060005161120052602051611220525b61202f61122051611200516111e0516111c051856101f7565b90508061203b57600080fd5b505050600160005260206000f35b60008083601f84011261205b57600080fd5b50813567ffffffffffffffff81111561207357600080fd5b6020830191508360208260051b850101111561208e57600080fd5b9250929050565b6000806000806000606086880312156120ad57600080fd5b85356001600160a01b03811681146120c457600080fd5b9450602086013567ffffffffffffffff808211156120e157600080fd5b818801915088601f8301126120f557600080fd5b81358181111561210457600080fd5b89602082850101111561211657600080fd5b60208301965080955050604088013591508082111561213457600080fd5b5061214188828901612049565b96999598509396509294939250505056fea26469706673582212206980435f9591390378e255f4026eeb42c56814114f9e4b0fa8fa6f9c5badec5b64736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/abi/Summa.json b/backend/src/contracts/abi/Summa.json index 2eba6da3..c260ae38 100644 --- a/backend/src/contracts/abi/Summa.json +++ b/backend/src/contracts/abi/Summa.json @@ -1 +1 @@ -{"_format":"hh-sol-artifact-1","contractName":"Summa","sourceName":"src/Summa.sol","abi":[{"inputs":[{"internalType":"address","name":"_verifyingKey","type":"address"},{"internalType":"contract IVerifier","name":"_polynomialInterpolationVerifier","type":"address"},{"internalType":"contract IVerifier","name":"_grandSumVerifier","type":"address"},{"internalType":"contract IInclusionVerifier","name":"_inclusionVerifier","type":"address"},{"internalType":"string[]","name":"cryptocurrencyNames","type":"string[]"},{"internalType":"string[]","name":"cryptocurrencyChains","type":"string[]"},{"internalType":"uint8","name":"balanceByteRange","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"indexed":false,"internalType":"struct Summa.AddressOwnershipProof[]","name":"addressOwnershipProofs","type":"tuple[]"}],"name":"AddressOwnershipProofSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"totalBalances","type":"uint256[]"},{"indexed":false,"internalType":"bytes","name":"snarkProof","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"grandSumProof","type":"bytes"}],"name":"LiabilitiesCommitmentSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressOwnershipProofs","outputs":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitments","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"uint8","name":"balanceByteRange","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"addressHash","type":"bytes32"}],"name":"getAddressOwnershipProof","outputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"snarkProof","type":"bytes"},{"internalType":"bytes","name":"grandSumProof","type":"bytes"},{"internalType":"uint256[]","name":"totalBalances","type":"uint256[]"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"submitCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof[]","name":"_addressOwnershipProofs","type":"tuple[]"}],"name":"submitProofOfAddressOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes","name":"inclusionProof","type":"bytes"},{"internalType":"uint256[]","name":"challenges","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"verifyInclusionProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"verifyingKey","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"bytecode":"0x6101006040523480156200001257600080fd5b50604051620028f5380380620028f5833981016040819052620000359162000750565b62000040336200042a565b6001600160a01b0387166200009c5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420766572696679696e67206b6579206164647265737300000060448201526064015b60405180910390fd5b6001600160a01b0387166080528151835114620001145760405162461bcd60e51b815260206004820152602f60248201527f43727970746f63757272656e6379206e616d657320616e6420636861696e732060448201526e0dceadac4cae440dad2e6dac2e8c6d608b1b606482015260840162000093565b60005b8351811015620001d1578381815181106200013657620001366200082c565b6020026020010151516000141580156200016e57508281815181106200016057620001606200082c565b602002602001015151600014155b620001bc5760405162461bcd60e51b815260206004820152601660248201527f496e76616c69642063727970746f63757272656e637900000000000000000000604482015260640162000093565b80620001c88162000858565b91505062000117565b50620001e6878451836200047a60201b60201c565b6200025a5760405162461bcd60e51b815260206004820152603c60248201527f54686520636f6e66696720706172616d657465727320646f206e6f7420636f7260448201527f726573706f6e6420746f2074686520766572696679696e67206b657900000000606482015260840162000093565b6001600160a01b038616620002cc5760405162461bcd60e51b815260206004820152603160248201527f496e76616c696420706f6c796e6f6d69616c20696e746572706f6c6174696f6e604482015270207665726966696572206164647265737360781b606482015260840162000093565b6001600160a01b0380871660a0528516620003355760405162461bcd60e51b815260206004820152602260248201527f496e76616c6964206772616e642073756d207665726966696572206164647265604482015261737360f01b606482015260840162000093565b6001600160a01b0380861660c05284166200039e5760405162461bcd60e51b815260206004820152602260248201527f496e76616c696420696e636c7573696f6e207665726966696572206164647265604482015261737360f01b606482015260840162000093565b6001600160a01b03841660e05260408051606081018252848152602080820185905260ff84169282019290925284519091600191620003e391839190880190620004fc565b506020828101518051620003fe9260018501920190620004fc565b50604091909101516002909101805460ff191660ff9092169190911790555062000a4c95505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080836200048b60028562000874565b60ff166200049a9190620008a5565b620004a7906002620008c5565b90506102e06000620004bb836040620008a5565b620004c79083620008c5565b90506000620004d8601083620008db565b9050600060208260008b3c5050600051600f81161590151916979650505050505050565b82805482825590600052602060002090810192821562000547579160200282015b8281111562000547578251829062000536908262000980565b50916020019190600101906200051d565b506200055592915062000559565b5090565b80821115620005555760006200057082826200057a565b5060010162000559565b5080546200058890620008f1565b6000825580601f1062000599575050565b601f016020900490600052602060002090810190620005b99190620005bc565b50565b5b80821115620005555760008155600101620005bd565b6001600160a01b0381168114620005b957600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200062a576200062a620005e9565b604052919050565b6000601f83818401126200064557600080fd5b825160206001600160401b0380831115620006645762000664620005e9565b8260051b62000675838201620005ff565b93845286810183019383810190898611156200069057600080fd5b84890192505b858310156200074357825184811115620006b05760008081fd5b8901603f81018b13620006c35760008081fd5b8581015185811115620006da57620006da620005e9565b620006ed818a01601f19168801620005ff565b81815260408d81848601011115620007055760008081fd5b60005b8381101562000725578481018201518382018b0152890162000708565b50506000918101880191909152835250918401919084019062000696565b9998505050505050505050565b600080600080600080600060e0888a0312156200076c57600080fd5b87516200077981620005d3565b60208901519097506200078c81620005d3565b60408901519096506200079f81620005d3565b6060890151909550620007b281620005d3565b60808901519094506001600160401b0380821115620007d057600080fd5b620007de8b838c0162000632565b945060a08a0151915080821115620007f557600080fd5b50620008048a828b0162000632565b92505060c088015160ff811681146200081c57600080fd5b8091505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200086d576200086d62000842565b5060010190565b600060ff8316806200089657634e487b7160e01b600052601260045260246000fd5b8060ff84160491505092915050565b8082028115828204841417620008bf57620008bf62000842565b92915050565b80820180821115620008bf57620008bf62000842565b81810381811115620008bf57620008bf62000842565b600181811c908216806200090657607f821691505b6020821081036200092757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200097b57600081815260208120601f850160051c81016020861015620009565750805b601f850160051c820191505b81811015620009775782815560010162000962565b5050505b505050565b81516001600160401b038111156200099c576200099c620005e9565b620009b481620009ad8454620008f1565b846200092d565b602080601f831160018114620009ec5760008415620009d35750858301515b600019600386901b1c1916600185901b17855562000977565b600085815260208120601f198616915b8281101562000a1d57888601518255948401946001909101908401620009fc565b508582101562000a3c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e051611e5a62000a9b6000396000610cb801526000610514015260006103500152600081816101380152818161037d015281816105410152610ce50152611e5a6000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80637950c5f8116100715780637950c5f8146101335780638da5cb5b146101725780639c38255914610183578063a3c4bcf8146101a6578063c7ddca0e146101c9578063f2fde38b146101dc57600080fd5b806305ab9860146100ae57806319b33968146100c357806349ce8997146100ec578063715018a61461010c57806379502c5514610114575b600080fd5b6100c16100bc3660046114cb565b6101ef565b005b6100d66100d1366004611567565b610660565b6040516100e3919061163b565b60405180910390f35b6100ff6100fa366004611567565b610973565b6040516100e39190611655565b6100c1610a0d565b6003546101219060ff1681565b60405160ff90911681526020016100e3565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100e3565b6000546001600160a01b031661015a565b6101966101913660046116d8565b610a21565b60405190151581526020016100e3565b6101b96101b4366004611567565b610d5f565b6040516100e3949392919061176a565b6100c16101d73660046117b7565b610fbf565b6100c16101ea366004611911565b611260565b6101f76112d9565b600082511161024d5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420746f74616c2062616c616e636573206c656e67746800000060448201526064015b60405180910390fd5b815161025a906040611950565b83146102a85760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206772616e642073756d2070726f6f66206c656e67746800006044820152606401610244565b8285116102f75760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420736e61726b2070726f6f66206c656e6774680000000000006044820152606401610244565b6040805160018082528183019092526000916020808301908036833701905050905060018160008151811061032e5761032e61196d565b602090810291909101015260405163af83a18d60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063af83a18d906103ab907f0000000000000000000000000000000000000000000000000000000000000000908b908b9087906004016119e7565b602060405180830381865afa1580156103c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ec9190611a1e565b61042e5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21039b730b93590383937b7b360691b6044820152606401610244565b6001548351146104a65760405162461bcd60e51b815260206004820152603a60248201527f4c696162696c69747920636f6d6d69746d656e747320616e642063727970746f60448201527f63757272656e63696573206e756d626572206d69736d617463680000000000006064820152608401610244565b3660008881896104b7896040611a40565b926104c493929190611a53565b9092509050600087876104da8460408188611a53565b6040516020016104ed9493929190611a7d565b60408051601f198184030181529082905263af83a18d60e01b825291506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063af83a18d9061056d907f00000000000000000000000000000000000000000000000000000000000000009085908b90600401611a9f565b602060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae9190611a1e565b6105fa5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206772616e642073756d2070726f6f660000000000000000006044820152606401610244565b6000858152600560205260409020610613838583611b68565b50847f7603a12a8838a565715ddb5bbf625b3f00a5e6f4793437537963e30c3b9495dc8785858c8c60405161064c959493929190611c29565b60405180910390a250505050505050505050565b61068b6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000828152600660205260409020546106dd5760405162461bcd60e51b81526020600482015260146024820152731059191c995cdcc81b9bdd081d995c9a599a595960621b6044820152606401610244565b6000828152600660205260409020546004906106fb90600190611c70565b8154811061070b5761070b61196d565b906000526020600020906004020160405180608001604052908160008201805461073490611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461076090611adf565b80156107ad5780601f10610782576101008083540402835291602001916107ad565b820191906000526020600020905b81548152906001019060200180831161079057829003601f168201915b505050505081526020016001820180546107c690611adf565b80601f01602080910402602001604051908101604052809291908181526020018280546107f290611adf565b801561083f5780601f106108145761010080835404028352916020019161083f565b820191906000526020600020905b81548152906001019060200180831161082257829003601f168201915b5050505050815260200160028201805461085890611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461088490611adf565b80156108d15780601f106108a6576101008083540402835291602001916108d1565b820191906000526020600020905b8154815290600101906020018083116108b457829003601f168201915b505050505081526020016003820180546108ea90611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461091690611adf565b80156109635780601f1061093857610100808354040283529160200191610963565b820191906000526020600020905b81548152906001019060200180831161094657829003601f168201915b5050505050815250509050919050565b6005602052600090815260409020805461098c90611adf565b80601f01602080910402602001604051908101604052809291908181526020018280546109b890611adf565b8015610a055780601f106109da57610100808354040283529160200191610a05565b820191906000526020600020905b8154815290600101906020018083116109e857829003601f168201915b505050505081565b610a156112d9565b610a1f6000611333565b565b60008251600414610a745760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206368616c6c656e676573206c656e677468000000000000006044820152606401610244565b6001805483519091610a8591611c70565b14610add5760405162461bcd60e51b815260206004820152602260248201527f56616c756573206c656e677468206d69736d61746368207769746820636f6e66604482015261696760f01b6064820152608401610244565b60008581526005602052604081208054610af690611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290611adf565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b50505050509050600085518251610b869190611a40565b67ffffffffffffffff811115610b9e57610b9e6113cc565b6040519080825280601f01601f191660200182016040528015610bc8576020820181803683370190505b50905060005b8651811015610c2f57868181518110610be957610be961196d565b602001015160f81c60f81b828281518110610c0657610c0661196d565b60200101906001600160f81b031916908160001a90535080610c2781611c83565b915050610bce565b5060005b8251811015610ca057828181518110610c4e57610c4e61196d565b602001015160f81c60f81b82885183610c679190611a40565b81518110610c7757610c7761196d565b60200101906001600160f81b031916908160001a90535080610c9881611c83565b915050610c33565b506040516323fb5ad560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906347f6b5aa90610d13907f00000000000000000000000000000000000000000000000000000000000000009085908a908a90600401611c9c565b602060405180830381865afa158015610d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d549190611a1e565b979650505050505050565b60048181548110610d6f57600080fd5b9060005260206000209060040201600091509050806000018054610d9290611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbe90611adf565b8015610e0b5780601f10610de057610100808354040283529160200191610e0b565b820191906000526020600020905b815481529060010190602001808311610dee57829003601f168201915b505050505090806001018054610e2090611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4c90611adf565b8015610e995780601f10610e6e57610100808354040283529160200191610e99565b820191906000526020600020905b815481529060010190602001808311610e7c57829003601f168201915b505050505090806002018054610eae90611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610eda90611adf565b8015610f275780601f10610efc57610100808354040283529160200191610f27565b820191906000526020600020905b815481529060010190602001808311610f0a57829003601f168201915b505050505090806003018054610f3c90611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6890611adf565b8015610fb55780601f10610f8a57610100808354040283529160200191610fb5565b820191906000526020600020905b815481529060010190602001808311610f9857829003601f168201915b5050505050905084565b610fc76112d9565b60005b8151811015611225576000828281518110610fe757610fe761196d565b6020026020010151600001516040516020016110039190611ce6565b60408051601f1981840301815291815281516020928301206000818152600690935291205490915080156110795760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610244565b600484848151811061108d5761108d61196d565b602090810291909101810151825460018101845560009384529190922082516004909202019081906110bf9082611d02565b50602082015160018201906110d49082611d02565b50604082015160028201906110e99082611d02565b50606082015160038201906110fe9082611d02565b50506004546000848152600660205260409020555083518490849081106111275761112761196d565b6020026020010151600001515160001415801561116357508383815181106111515761115161196d565b60200260200101516020015151600014155b801561118e575083838151811061117c5761117c61196d565b60200260200101516040015151600014155b80156111b957508383815181106111a7576111a761196d565b60200260200101516060015151600014155b6112105760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610244565b5050808061121d90611c83565b915050610fca565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a0454658816040516112559190611dc2565b60405180910390a150565b6112686112d9565b6001600160a01b0381166112cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610244565b6112d681611333565b50565b6000546001600160a01b03163314610a1f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610244565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008083601f84011261139557600080fd5b50813567ffffffffffffffff8111156113ad57600080fd5b6020830191508360208285010111156113c557600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715611405576114056113cc565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611434576114346113cc565b604052919050565b600067ffffffffffffffff821115611456576114566113cc565b5060051b60200190565b600082601f83011261147157600080fd5b813560206114866114818361143c565b61140b565b82815260059290921b840181019181810190868411156114a557600080fd5b8286015b848110156114c057803583529183019183016114a9565b509695505050505050565b600080600080600080608087890312156114e457600080fd5b863567ffffffffffffffff808211156114fc57600080fd5b6115088a838b01611383565b9098509650602089013591508082111561152157600080fd5b61152d8a838b01611383565b9096509450604089013591508082111561154657600080fd5b5061155389828a01611460565b925050606087013590509295509295509295565b60006020828403121561157957600080fd5b5035919050565b60005b8381101561159b578181015183820152602001611583565b50506000910152565b600081518084526115bc816020860160208601611580565b601f01601f19169290920160200192915050565b60008151608084526115e560808501826115a4565b9050602083015184820360208601526115fe82826115a4565b9150506040830151848203604086015261161882826115a4565b9150506060830151848203606086015261163282826115a4565b95945050505050565b60208152600061164e60208301846115d0565b9392505050565b60208152600061164e60208301846115a4565b600082601f83011261167957600080fd5b813567ffffffffffffffff811115611693576116936113cc565b6116a6601f8201601f191660200161140b565b8181528460208386010111156116bb57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156116ee57600080fd5b84359350602085013567ffffffffffffffff8082111561170d57600080fd5b61171988838901611668565b9450604087013591508082111561172f57600080fd5b61173b88838901611460565b9350606087013591508082111561175157600080fd5b5061175e87828801611460565b91505092959194509250565b60808152600061177d60808301876115a4565b828103602084015261178f81876115a4565b905082810360408401526117a381866115a4565b90508281036060840152610d5481856115a4565b600060208083850312156117ca57600080fd5b823567ffffffffffffffff808211156117e257600080fd5b818501915085601f8301126117f657600080fd5b81356118046114818261143c565b81815260059190911b8301840190848101908883111561182357600080fd5b8585015b838110156119045780358581111561183e57600080fd5b86016080818c03601f190112156118555760008081fd5b61185d6113e2565b888201358781111561186f5760008081fd5b61187d8d8b83860101611668565b825250604080830135888111156118945760008081fd5b6118a28e8c83870101611668565b8b84015250606080840135898111156118bb5760008081fd5b6118c98f8d83880101611668565b838501525060808401359150888211156118e35760008081fd5b6118f18e8c84870101611668565b9083015250845250918601918601611827565b5098975050505050505050565b60006020828403121561192357600080fd5b81356001600160a01b038116811461164e57600080fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176119675761196761193a565b92915050565b634e487b7160e01b600052603260045260246000fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526020808501945080840160005b838110156119dc578151875295820195908201906001016119c0565b509495945050505050565b6001600160a01b0385168152606060208201819052600090611a0c9083018587611983565b8281036040840152610d5481856119ac565b600060208284031215611a3057600080fd5b8151801515811461164e57600080fd5b808201808211156119675761196761193a565b60008085851115611a6357600080fd5b83861115611a7057600080fd5b5050820193919092039150565b8385823760008482016000815283858237600093019283525090949350505050565b6001600160a01b0384168152606060208201819052600090611ac3908301856115a4565b8281036040840152611ad581856119ac565b9695505050505050565b600181811c90821680611af357607f821691505b602082108103611b1357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611b6357600081815260208120601f850160051c81016020861015611b405750805b601f850160051c820191505b81811015611b5f57828155600101611b4c565b5050505b505050565b67ffffffffffffffff831115611b8057611b806113cc565b611b9483611b8e8354611adf565b83611b19565b6000601f841160018114611bc85760008515611bb05750838201355b600019600387901b1c1916600186901b178355611c22565b600083815260209020601f19861690835b82811015611bf95786850135825560209485019460019092019101611bd9565b5086821015611c165760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b606081526000611c3c60608301886119ac565b8281036020840152611c4f818789611983565b90508281036040840152611c64818587611983565b98975050505050505050565b818103818111156119675761196761193a565b600060018201611c9557611c9561193a565b5060010190565b6001600160a01b0385168152608060208201819052600090611cc0908301866115a4565b8281036040840152611cd281866119ac565b90508281036060840152610d5481856119ac565b60008251611cf8818460208701611580565b9190910192915050565b815167ffffffffffffffff811115611d1c57611d1c6113cc565b611d3081611d2a8454611adf565b84611b19565b602080601f831160018114611d655760008415611d4d5750858301515b600019600386901b1c1916600185901b178555611b5f565b600085815260208120601f198616915b82811015611d9457888601518255948401946001909101908401611d75565b5085821015611db25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611e1757603f19888603018452611e058583516115d0565b94509285019290850190600101611de9565b509297965050505050505056fea26469706673582212205cdd3459cf967f298c8255f0d839582dc7dd41555230f51421901f60f838962064736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80637950c5f8116100715780637950c5f8146101335780638da5cb5b146101725780639c38255914610183578063a3c4bcf8146101a6578063c7ddca0e146101c9578063f2fde38b146101dc57600080fd5b806305ab9860146100ae57806319b33968146100c357806349ce8997146100ec578063715018a61461010c57806379502c5514610114575b600080fd5b6100c16100bc3660046114cb565b6101ef565b005b6100d66100d1366004611567565b610660565b6040516100e3919061163b565b60405180910390f35b6100ff6100fa366004611567565b610973565b6040516100e39190611655565b6100c1610a0d565b6003546101219060ff1681565b60405160ff90911681526020016100e3565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100e3565b6000546001600160a01b031661015a565b6101966101913660046116d8565b610a21565b60405190151581526020016100e3565b6101b96101b4366004611567565b610d5f565b6040516100e3949392919061176a565b6100c16101d73660046117b7565b610fbf565b6100c16101ea366004611911565b611260565b6101f76112d9565b600082511161024d5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420746f74616c2062616c616e636573206c656e67746800000060448201526064015b60405180910390fd5b815161025a906040611950565b83146102a85760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206772616e642073756d2070726f6f66206c656e67746800006044820152606401610244565b8285116102f75760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420736e61726b2070726f6f66206c656e6774680000000000006044820152606401610244565b6040805160018082528183019092526000916020808301908036833701905050905060018160008151811061032e5761032e61196d565b602090810291909101015260405163af83a18d60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063af83a18d906103ab907f0000000000000000000000000000000000000000000000000000000000000000908b908b9087906004016119e7565b602060405180830381865afa1580156103c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ec9190611a1e565b61042e5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21039b730b93590383937b7b360691b6044820152606401610244565b6001548351146104a65760405162461bcd60e51b815260206004820152603a60248201527f4c696162696c69747920636f6d6d69746d656e747320616e642063727970746f60448201527f63757272656e63696573206e756d626572206d69736d617463680000000000006064820152608401610244565b3660008881896104b7896040611a40565b926104c493929190611a53565b9092509050600087876104da8460408188611a53565b6040516020016104ed9493929190611a7d565b60408051601f198184030181529082905263af83a18d60e01b825291506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063af83a18d9061056d907f00000000000000000000000000000000000000000000000000000000000000009085908b90600401611a9f565b602060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae9190611a1e565b6105fa5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206772616e642073756d2070726f6f660000000000000000006044820152606401610244565b6000858152600560205260409020610613838583611b68565b50847f7603a12a8838a565715ddb5bbf625b3f00a5e6f4793437537963e30c3b9495dc8785858c8c60405161064c959493929190611c29565b60405180910390a250505050505050505050565b61068b6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000828152600660205260409020546106dd5760405162461bcd60e51b81526020600482015260146024820152731059191c995cdcc81b9bdd081d995c9a599a595960621b6044820152606401610244565b6000828152600660205260409020546004906106fb90600190611c70565b8154811061070b5761070b61196d565b906000526020600020906004020160405180608001604052908160008201805461073490611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461076090611adf565b80156107ad5780601f10610782576101008083540402835291602001916107ad565b820191906000526020600020905b81548152906001019060200180831161079057829003601f168201915b505050505081526020016001820180546107c690611adf565b80601f01602080910402602001604051908101604052809291908181526020018280546107f290611adf565b801561083f5780601f106108145761010080835404028352916020019161083f565b820191906000526020600020905b81548152906001019060200180831161082257829003601f168201915b5050505050815260200160028201805461085890611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461088490611adf565b80156108d15780601f106108a6576101008083540402835291602001916108d1565b820191906000526020600020905b8154815290600101906020018083116108b457829003601f168201915b505050505081526020016003820180546108ea90611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461091690611adf565b80156109635780601f1061093857610100808354040283529160200191610963565b820191906000526020600020905b81548152906001019060200180831161094657829003601f168201915b5050505050815250509050919050565b6005602052600090815260409020805461098c90611adf565b80601f01602080910402602001604051908101604052809291908181526020018280546109b890611adf565b8015610a055780601f106109da57610100808354040283529160200191610a05565b820191906000526020600020905b8154815290600101906020018083116109e857829003601f168201915b505050505081565b610a156112d9565b610a1f6000611333565b565b60008251600414610a745760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206368616c6c656e676573206c656e677468000000000000006044820152606401610244565b6001805483519091610a8591611c70565b14610add5760405162461bcd60e51b815260206004820152602260248201527f56616c756573206c656e677468206d69736d61746368207769746820636f6e66604482015261696760f01b6064820152608401610244565b60008581526005602052604081208054610af690611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290611adf565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b50505050509050600085518251610b869190611a40565b67ffffffffffffffff811115610b9e57610b9e6113cc565b6040519080825280601f01601f191660200182016040528015610bc8576020820181803683370190505b50905060005b8651811015610c2f57868181518110610be957610be961196d565b602001015160f81c60f81b828281518110610c0657610c0661196d565b60200101906001600160f81b031916908160001a90535080610c2781611c83565b915050610bce565b5060005b8251811015610ca057828181518110610c4e57610c4e61196d565b602001015160f81c60f81b82885183610c679190611a40565b81518110610c7757610c7761196d565b60200101906001600160f81b031916908160001a90535080610c9881611c83565b915050610c33565b506040516323fb5ad560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906347f6b5aa90610d13907f00000000000000000000000000000000000000000000000000000000000000009085908a908a90600401611c9c565b602060405180830381865afa158015610d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d549190611a1e565b979650505050505050565b60048181548110610d6f57600080fd5b9060005260206000209060040201600091509050806000018054610d9290611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbe90611adf565b8015610e0b5780601f10610de057610100808354040283529160200191610e0b565b820191906000526020600020905b815481529060010190602001808311610dee57829003601f168201915b505050505090806001018054610e2090611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4c90611adf565b8015610e995780601f10610e6e57610100808354040283529160200191610e99565b820191906000526020600020905b815481529060010190602001808311610e7c57829003601f168201915b505050505090806002018054610eae90611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610eda90611adf565b8015610f275780601f10610efc57610100808354040283529160200191610f27565b820191906000526020600020905b815481529060010190602001808311610f0a57829003601f168201915b505050505090806003018054610f3c90611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6890611adf565b8015610fb55780601f10610f8a57610100808354040283529160200191610fb5565b820191906000526020600020905b815481529060010190602001808311610f9857829003601f168201915b5050505050905084565b610fc76112d9565b60005b8151811015611225576000828281518110610fe757610fe761196d565b6020026020010151600001516040516020016110039190611ce6565b60408051601f1981840301815291815281516020928301206000818152600690935291205490915080156110795760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610244565b600484848151811061108d5761108d61196d565b602090810291909101810151825460018101845560009384529190922082516004909202019081906110bf9082611d02565b50602082015160018201906110d49082611d02565b50604082015160028201906110e99082611d02565b50606082015160038201906110fe9082611d02565b50506004546000848152600660205260409020555083518490849081106111275761112761196d565b6020026020010151600001515160001415801561116357508383815181106111515761115161196d565b60200260200101516020015151600014155b801561118e575083838151811061117c5761117c61196d565b60200260200101516040015151600014155b80156111b957508383815181106111a7576111a761196d565b60200260200101516060015151600014155b6112105760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610244565b5050808061121d90611c83565b915050610fca565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a0454658816040516112559190611dc2565b60405180910390a150565b6112686112d9565b6001600160a01b0381166112cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610244565b6112d681611333565b50565b6000546001600160a01b03163314610a1f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610244565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008083601f84011261139557600080fd5b50813567ffffffffffffffff8111156113ad57600080fd5b6020830191508360208285010111156113c557600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715611405576114056113cc565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611434576114346113cc565b604052919050565b600067ffffffffffffffff821115611456576114566113cc565b5060051b60200190565b600082601f83011261147157600080fd5b813560206114866114818361143c565b61140b565b82815260059290921b840181019181810190868411156114a557600080fd5b8286015b848110156114c057803583529183019183016114a9565b509695505050505050565b600080600080600080608087890312156114e457600080fd5b863567ffffffffffffffff808211156114fc57600080fd5b6115088a838b01611383565b9098509650602089013591508082111561152157600080fd5b61152d8a838b01611383565b9096509450604089013591508082111561154657600080fd5b5061155389828a01611460565b925050606087013590509295509295509295565b60006020828403121561157957600080fd5b5035919050565b60005b8381101561159b578181015183820152602001611583565b50506000910152565b600081518084526115bc816020860160208601611580565b601f01601f19169290920160200192915050565b60008151608084526115e560808501826115a4565b9050602083015184820360208601526115fe82826115a4565b9150506040830151848203604086015261161882826115a4565b9150506060830151848203606086015261163282826115a4565b95945050505050565b60208152600061164e60208301846115d0565b9392505050565b60208152600061164e60208301846115a4565b600082601f83011261167957600080fd5b813567ffffffffffffffff811115611693576116936113cc565b6116a6601f8201601f191660200161140b565b8181528460208386010111156116bb57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156116ee57600080fd5b84359350602085013567ffffffffffffffff8082111561170d57600080fd5b61171988838901611668565b9450604087013591508082111561172f57600080fd5b61173b88838901611460565b9350606087013591508082111561175157600080fd5b5061175e87828801611460565b91505092959194509250565b60808152600061177d60808301876115a4565b828103602084015261178f81876115a4565b905082810360408401526117a381866115a4565b90508281036060840152610d5481856115a4565b600060208083850312156117ca57600080fd5b823567ffffffffffffffff808211156117e257600080fd5b818501915085601f8301126117f657600080fd5b81356118046114818261143c565b81815260059190911b8301840190848101908883111561182357600080fd5b8585015b838110156119045780358581111561183e57600080fd5b86016080818c03601f190112156118555760008081fd5b61185d6113e2565b888201358781111561186f5760008081fd5b61187d8d8b83860101611668565b825250604080830135888111156118945760008081fd5b6118a28e8c83870101611668565b8b84015250606080840135898111156118bb5760008081fd5b6118c98f8d83880101611668565b838501525060808401359150888211156118e35760008081fd5b6118f18e8c84870101611668565b9083015250845250918601918601611827565b5098975050505050505050565b60006020828403121561192357600080fd5b81356001600160a01b038116811461164e57600080fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176119675761196761193a565b92915050565b634e487b7160e01b600052603260045260246000fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526020808501945080840160005b838110156119dc578151875295820195908201906001016119c0565b509495945050505050565b6001600160a01b0385168152606060208201819052600090611a0c9083018587611983565b8281036040840152610d5481856119ac565b600060208284031215611a3057600080fd5b8151801515811461164e57600080fd5b808201808211156119675761196761193a565b60008085851115611a6357600080fd5b83861115611a7057600080fd5b5050820193919092039150565b8385823760008482016000815283858237600093019283525090949350505050565b6001600160a01b0384168152606060208201819052600090611ac3908301856115a4565b8281036040840152611ad581856119ac565b9695505050505050565b600181811c90821680611af357607f821691505b602082108103611b1357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611b6357600081815260208120601f850160051c81016020861015611b405750805b601f850160051c820191505b81811015611b5f57828155600101611b4c565b5050505b505050565b67ffffffffffffffff831115611b8057611b806113cc565b611b9483611b8e8354611adf565b83611b19565b6000601f841160018114611bc85760008515611bb05750838201355b600019600387901b1c1916600186901b178355611c22565b600083815260209020601f19861690835b82811015611bf95786850135825560209485019460019092019101611bd9565b5086821015611c165760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b606081526000611c3c60608301886119ac565b8281036020840152611c4f818789611983565b90508281036040840152611c64818587611983565b98975050505050505050565b818103818111156119675761196761193a565b600060018201611c9557611c9561193a565b5060010190565b6001600160a01b0385168152608060208201819052600090611cc0908301866115a4565b8281036040840152611cd281866119ac565b90508281036060840152610d5481856119ac565b60008251611cf8818460208701611580565b9190910192915050565b815167ffffffffffffffff811115611d1c57611d1c6113cc565b611d3081611d2a8454611adf565b84611b19565b602080601f831160018114611d655760008415611d4d5750858301515b600019600386901b1c1916600185901b178555611b5f565b600085815260208120601f198616915b82811015611d9457888601518255948401946001909101908401611d75565b5085821015611db25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611e1757603f19888603018452611e058583516115d0565b94509285019290850190600101611de9565b509297965050505050505056fea26469706673582212205cdd3459cf967f298c8255f0d839582dc7dd41555230f51421901f60f838962064736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file +{"_format":"hh-sol-artifact-1","contractName":"Summa","sourceName":"src/Summa.sol","abi":[{"inputs":[{"internalType":"address","name":"_verifyingKey","type":"address"},{"internalType":"contract IVerifier","name":"_polynomialInterpolationVerifier","type":"address"},{"internalType":"contract IVerifier","name":"_grandSumVerifier","type":"address"},{"internalType":"contract IInclusionVerifier","name":"_inclusionVerifier","type":"address"},{"internalType":"string[]","name":"cryptocurrencyNames","type":"string[]"},{"internalType":"string[]","name":"cryptocurrencyChains","type":"string[]"},{"internalType":"uint8","name":"balanceByteRange","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"indexed":false,"internalType":"struct Summa.AddressOwnershipProof[]","name":"addressOwnershipProofs","type":"tuple[]"}],"name":"AddressOwnershipProofSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"totalBalances","type":"uint256[]"},{"indexed":false,"internalType":"bytes","name":"snarkProof","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"grandSumProof","type":"bytes"}],"name":"LiabilitiesCommitmentSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressOwnershipProofs","outputs":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitments","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"uint8","name":"balanceByteRange","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"addressHash","type":"bytes32"}],"name":"getAddressOwnershipProof","outputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"snarkProof","type":"bytes"},{"internalType":"bytes","name":"grandSumProof","type":"bytes"},{"internalType":"uint256[]","name":"totalBalances","type":"uint256[]"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"submitCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof[]","name":"_addressOwnershipProofs","type":"tuple[]"}],"name":"submitProofOfAddressOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes","name":"inclusionProof","type":"bytes"},{"internalType":"uint256[]","name":"challenges","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"verifyInclusionProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"verifyingKey","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"bytecode":"0x6101006040523480156200001257600080fd5b50604051620029003803806200290083398101604081905262000035916200075b565b62000040336200042a565b6001600160a01b0387166200009c5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420766572696679696e67206b6579206164647265737300000060448201526064015b60405180910390fd5b6001600160a01b0387166080528151835114620001145760405162461bcd60e51b815260206004820152602f60248201527f43727970746f63757272656e6379206e616d657320616e6420636861696e732060448201526e0dceadac4cae440dad2e6dac2e8c6d608b1b606482015260840162000093565b60005b8351811015620001d15783818151811062000136576200013662000837565b6020026020010151516000141580156200016e575082818151811062000160576200016062000837565b602002602001015151600014155b620001bc5760405162461bcd60e51b815260206004820152601660248201527f496e76616c69642063727970746f63757272656e637900000000000000000000604482015260640162000093565b80620001c88162000863565b91505062000117565b50620001e6878451836200047a60201b60201c565b6200025a5760405162461bcd60e51b815260206004820152603c60248201527f54686520636f6e66696720706172616d657465727320646f206e6f7420636f7260448201527f726573706f6e6420746f2074686520766572696679696e67206b657900000000606482015260840162000093565b6001600160a01b038616620002cc5760405162461bcd60e51b815260206004820152603160248201527f496e76616c696420706f6c796e6f6d69616c20696e746572706f6c6174696f6e604482015270207665726966696572206164647265737360781b606482015260840162000093565b6001600160a01b0380871660a0528516620003355760405162461bcd60e51b815260206004820152602260248201527f496e76616c6964206772616e642073756d207665726966696572206164647265604482015261737360f01b606482015260840162000093565b6001600160a01b0380861660c05284166200039e5760405162461bcd60e51b815260206004820152602260248201527f496e76616c696420696e636c7573696f6e207665726966696572206164647265604482015261737360f01b606482015260840162000093565b6001600160a01b03841660e05260408051606081018252848152602080820185905260ff84169282019290925284519091600191620003e39183919088019062000507565b506020828101518051620003fe926001850192019062000507565b50604091909101516002909101805460ff191660ff9092169190911790555062000a5795505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080836200048b6002856200087f565b60ff166200049a9190620008b0565b620004a7906002620008d0565b90506102e06000620004bb836040620008b0565b620004c79083620008d0565b90506000620004d8601083620008e6565b9050600060208260008b3c50506000516001600160801b0381161560809190911c151916979650505050505050565b82805482825590600052602060002090810192821562000552579160200282015b828111156200055257825182906200054190826200098b565b509160200191906001019062000528565b506200056092915062000564565b5090565b80821115620005605760006200057b828262000585565b5060010162000564565b5080546200059390620008fc565b6000825580601f10620005a4575050565b601f016020900490600052602060002090810190620005c49190620005c7565b50565b5b80821115620005605760008155600101620005c8565b6001600160a01b0381168114620005c457600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620006355762000635620005f4565b604052919050565b6000601f83818401126200065057600080fd5b825160206001600160401b03808311156200066f576200066f620005f4565b8260051b620006808382016200060a565b93845286810183019383810190898611156200069b57600080fd5b84890192505b858310156200074e57825184811115620006bb5760008081fd5b8901603f81018b13620006ce5760008081fd5b8581015185811115620006e557620006e5620005f4565b620006f8818a01601f191688016200060a565b81815260408d81848601011115620007105760008081fd5b60005b8381101562000730578481018201518382018b0152890162000713565b505060009181018801919091528352509184019190840190620006a1565b9998505050505050505050565b600080600080600080600060e0888a0312156200077757600080fd5b87516200078481620005de565b60208901519097506200079781620005de565b6040890151909650620007aa81620005de565b6060890151909550620007bd81620005de565b60808901519094506001600160401b0380821115620007db57600080fd5b620007e98b838c016200063d565b945060a08a01519150808211156200080057600080fd5b506200080f8a828b016200063d565b92505060c088015160ff811681146200082757600080fd5b8091505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200087857620008786200084d565b5060010190565b600060ff831680620008a157634e487b7160e01b600052601260045260246000fd5b8060ff84160491505092915050565b8082028115828204841417620008ca57620008ca6200084d565b92915050565b80820180821115620008ca57620008ca6200084d565b81810381811115620008ca57620008ca6200084d565b600181811c908216806200091157607f821691505b6020821081036200093257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200098657600081815260208120601f850160051c81016020861015620009615750805b601f850160051c820191505b8181101562000982578281556001016200096d565b5050505b505050565b81516001600160401b03811115620009a757620009a7620005f4565b620009bf81620009b88454620008fc565b8462000938565b602080601f831160018114620009f75760008415620009de5750858301515b600019600386901b1c1916600185901b17855562000982565b600085815260208120601f198616915b8281101562000a285788860151825594840194600190910190840162000a07565b508582101562000a475787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e051611e5a62000aa66000396000610cb801526000610514015260006103500152600081816101380152818161037d015281816105410152610ce50152611e5a6000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80637950c5f8116100715780637950c5f8146101335780638da5cb5b146101725780639c38255914610183578063a3c4bcf8146101a6578063c7ddca0e146101c9578063f2fde38b146101dc57600080fd5b806305ab9860146100ae57806319b33968146100c357806349ce8997146100ec578063715018a61461010c57806379502c5514610114575b600080fd5b6100c16100bc3660046114cb565b6101ef565b005b6100d66100d1366004611567565b610660565b6040516100e3919061163b565b60405180910390f35b6100ff6100fa366004611567565b610973565b6040516100e39190611655565b6100c1610a0d565b6003546101219060ff1681565b60405160ff90911681526020016100e3565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100e3565b6000546001600160a01b031661015a565b6101966101913660046116d8565b610a21565b60405190151581526020016100e3565b6101b96101b4366004611567565b610d5f565b6040516100e3949392919061176a565b6100c16101d73660046117b7565b610fbf565b6100c16101ea366004611911565b611260565b6101f76112d9565b600082511161024d5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420746f74616c2062616c616e636573206c656e67746800000060448201526064015b60405180910390fd5b815161025a906040611950565b83146102a85760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206772616e642073756d2070726f6f66206c656e67746800006044820152606401610244565b8285116102f75760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420736e61726b2070726f6f66206c656e6774680000000000006044820152606401610244565b6040805160018082528183019092526000916020808301908036833701905050905060008160008151811061032e5761032e61196d565b602090810291909101015260405163af83a18d60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063af83a18d906103ab907f0000000000000000000000000000000000000000000000000000000000000000908b908b9087906004016119e7565b602060405180830381865afa1580156103c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ec9190611a1e565b61042e5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21039b730b93590383937b7b360691b6044820152606401610244565b6001548351146104a65760405162461bcd60e51b815260206004820152603a60248201527f4c696162696c69747920636f6d6d69746d656e747320616e642063727970746f60448201527f63757272656e63696573206e756d626572206d69736d617463680000000000006064820152608401610244565b3660008881896104b7896040611a40565b926104c493929190611a53565b9092509050600087876104da8460408188611a53565b6040516020016104ed9493929190611a7d565b60408051601f198184030181529082905263af83a18d60e01b825291506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063af83a18d9061056d907f00000000000000000000000000000000000000000000000000000000000000009085908b90600401611a9f565b602060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae9190611a1e565b6105fa5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206772616e642073756d2070726f6f660000000000000000006044820152606401610244565b6000858152600560205260409020610613838583611b68565b50847f7603a12a8838a565715ddb5bbf625b3f00a5e6f4793437537963e30c3b9495dc8785858c8c60405161064c959493929190611c29565b60405180910390a250505050505050505050565b61068b6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000828152600660205260409020546106dd5760405162461bcd60e51b81526020600482015260146024820152731059191c995cdcc81b9bdd081d995c9a599a595960621b6044820152606401610244565b6000828152600660205260409020546004906106fb90600190611c70565b8154811061070b5761070b61196d565b906000526020600020906004020160405180608001604052908160008201805461073490611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461076090611adf565b80156107ad5780601f10610782576101008083540402835291602001916107ad565b820191906000526020600020905b81548152906001019060200180831161079057829003601f168201915b505050505081526020016001820180546107c690611adf565b80601f01602080910402602001604051908101604052809291908181526020018280546107f290611adf565b801561083f5780601f106108145761010080835404028352916020019161083f565b820191906000526020600020905b81548152906001019060200180831161082257829003601f168201915b5050505050815260200160028201805461085890611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461088490611adf565b80156108d15780601f106108a6576101008083540402835291602001916108d1565b820191906000526020600020905b8154815290600101906020018083116108b457829003601f168201915b505050505081526020016003820180546108ea90611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461091690611adf565b80156109635780601f1061093857610100808354040283529160200191610963565b820191906000526020600020905b81548152906001019060200180831161094657829003601f168201915b5050505050815250509050919050565b6005602052600090815260409020805461098c90611adf565b80601f01602080910402602001604051908101604052809291908181526020018280546109b890611adf565b8015610a055780601f106109da57610100808354040283529160200191610a05565b820191906000526020600020905b8154815290600101906020018083116109e857829003601f168201915b505050505081565b610a156112d9565b610a1f6000611333565b565b60008251600414610a745760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206368616c6c656e676573206c656e677468000000000000006044820152606401610244565b6001805483519091610a8591611c70565b14610add5760405162461bcd60e51b815260206004820152602260248201527f56616c756573206c656e677468206d69736d61746368207769746820636f6e66604482015261696760f01b6064820152608401610244565b60008581526005602052604081208054610af690611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290611adf565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b50505050509050600085518251610b869190611a40565b67ffffffffffffffff811115610b9e57610b9e6113cc565b6040519080825280601f01601f191660200182016040528015610bc8576020820181803683370190505b50905060005b8651811015610c2f57868181518110610be957610be961196d565b602001015160f81c60f81b828281518110610c0657610c0661196d565b60200101906001600160f81b031916908160001a90535080610c2781611c83565b915050610bce565b5060005b8251811015610ca057828181518110610c4e57610c4e61196d565b602001015160f81c60f81b82885183610c679190611a40565b81518110610c7757610c7761196d565b60200101906001600160f81b031916908160001a90535080610c9881611c83565b915050610c33565b506040516323fb5ad560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906347f6b5aa90610d13907f00000000000000000000000000000000000000000000000000000000000000009085908a908a90600401611c9c565b602060405180830381865afa158015610d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d549190611a1e565b979650505050505050565b60048181548110610d6f57600080fd5b9060005260206000209060040201600091509050806000018054610d9290611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbe90611adf565b8015610e0b5780601f10610de057610100808354040283529160200191610e0b565b820191906000526020600020905b815481529060010190602001808311610dee57829003601f168201915b505050505090806001018054610e2090611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4c90611adf565b8015610e995780601f10610e6e57610100808354040283529160200191610e99565b820191906000526020600020905b815481529060010190602001808311610e7c57829003601f168201915b505050505090806002018054610eae90611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610eda90611adf565b8015610f275780601f10610efc57610100808354040283529160200191610f27565b820191906000526020600020905b815481529060010190602001808311610f0a57829003601f168201915b505050505090806003018054610f3c90611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6890611adf565b8015610fb55780601f10610f8a57610100808354040283529160200191610fb5565b820191906000526020600020905b815481529060010190602001808311610f9857829003601f168201915b5050505050905084565b610fc76112d9565b60005b8151811015611225576000828281518110610fe757610fe761196d565b6020026020010151600001516040516020016110039190611ce6565b60408051601f1981840301815291815281516020928301206000818152600690935291205490915080156110795760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610244565b600484848151811061108d5761108d61196d565b602090810291909101810151825460018101845560009384529190922082516004909202019081906110bf9082611d02565b50602082015160018201906110d49082611d02565b50604082015160028201906110e99082611d02565b50606082015160038201906110fe9082611d02565b50506004546000848152600660205260409020555083518490849081106111275761112761196d565b6020026020010151600001515160001415801561116357508383815181106111515761115161196d565b60200260200101516020015151600014155b801561118e575083838151811061117c5761117c61196d565b60200260200101516040015151600014155b80156111b957508383815181106111a7576111a761196d565b60200260200101516060015151600014155b6112105760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610244565b5050808061121d90611c83565b915050610fca565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a0454658816040516112559190611dc2565b60405180910390a150565b6112686112d9565b6001600160a01b0381166112cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610244565b6112d681611333565b50565b6000546001600160a01b03163314610a1f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610244565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008083601f84011261139557600080fd5b50813567ffffffffffffffff8111156113ad57600080fd5b6020830191508360208285010111156113c557600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715611405576114056113cc565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611434576114346113cc565b604052919050565b600067ffffffffffffffff821115611456576114566113cc565b5060051b60200190565b600082601f83011261147157600080fd5b813560206114866114818361143c565b61140b565b82815260059290921b840181019181810190868411156114a557600080fd5b8286015b848110156114c057803583529183019183016114a9565b509695505050505050565b600080600080600080608087890312156114e457600080fd5b863567ffffffffffffffff808211156114fc57600080fd5b6115088a838b01611383565b9098509650602089013591508082111561152157600080fd5b61152d8a838b01611383565b9096509450604089013591508082111561154657600080fd5b5061155389828a01611460565b925050606087013590509295509295509295565b60006020828403121561157957600080fd5b5035919050565b60005b8381101561159b578181015183820152602001611583565b50506000910152565b600081518084526115bc816020860160208601611580565b601f01601f19169290920160200192915050565b60008151608084526115e560808501826115a4565b9050602083015184820360208601526115fe82826115a4565b9150506040830151848203604086015261161882826115a4565b9150506060830151848203606086015261163282826115a4565b95945050505050565b60208152600061164e60208301846115d0565b9392505050565b60208152600061164e60208301846115a4565b600082601f83011261167957600080fd5b813567ffffffffffffffff811115611693576116936113cc565b6116a6601f8201601f191660200161140b565b8181528460208386010111156116bb57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156116ee57600080fd5b84359350602085013567ffffffffffffffff8082111561170d57600080fd5b61171988838901611668565b9450604087013591508082111561172f57600080fd5b61173b88838901611460565b9350606087013591508082111561175157600080fd5b5061175e87828801611460565b91505092959194509250565b60808152600061177d60808301876115a4565b828103602084015261178f81876115a4565b905082810360408401526117a381866115a4565b90508281036060840152610d5481856115a4565b600060208083850312156117ca57600080fd5b823567ffffffffffffffff808211156117e257600080fd5b818501915085601f8301126117f657600080fd5b81356118046114818261143c565b81815260059190911b8301840190848101908883111561182357600080fd5b8585015b838110156119045780358581111561183e57600080fd5b86016080818c03601f190112156118555760008081fd5b61185d6113e2565b888201358781111561186f5760008081fd5b61187d8d8b83860101611668565b825250604080830135888111156118945760008081fd5b6118a28e8c83870101611668565b8b84015250606080840135898111156118bb5760008081fd5b6118c98f8d83880101611668565b838501525060808401359150888211156118e35760008081fd5b6118f18e8c84870101611668565b9083015250845250918601918601611827565b5098975050505050505050565b60006020828403121561192357600080fd5b81356001600160a01b038116811461164e57600080fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176119675761196761193a565b92915050565b634e487b7160e01b600052603260045260246000fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526020808501945080840160005b838110156119dc578151875295820195908201906001016119c0565b509495945050505050565b6001600160a01b0385168152606060208201819052600090611a0c9083018587611983565b8281036040840152610d5481856119ac565b600060208284031215611a3057600080fd5b8151801515811461164e57600080fd5b808201808211156119675761196761193a565b60008085851115611a6357600080fd5b83861115611a7057600080fd5b5050820193919092039150565b8385823760008482016000815283858237600093019283525090949350505050565b6001600160a01b0384168152606060208201819052600090611ac3908301856115a4565b8281036040840152611ad581856119ac565b9695505050505050565b600181811c90821680611af357607f821691505b602082108103611b1357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611b6357600081815260208120601f850160051c81016020861015611b405750805b601f850160051c820191505b81811015611b5f57828155600101611b4c565b5050505b505050565b67ffffffffffffffff831115611b8057611b806113cc565b611b9483611b8e8354611adf565b83611b19565b6000601f841160018114611bc85760008515611bb05750838201355b600019600387901b1c1916600186901b178355611c22565b600083815260209020601f19861690835b82811015611bf95786850135825560209485019460019092019101611bd9565b5086821015611c165760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b606081526000611c3c60608301886119ac565b8281036020840152611c4f818789611983565b90508281036040840152611c64818587611983565b98975050505050505050565b818103818111156119675761196761193a565b600060018201611c9557611c9561193a565b5060010190565b6001600160a01b0385168152608060208201819052600090611cc0908301866115a4565b8281036040840152611cd281866119ac565b90508281036060840152610d5481856119ac565b60008251611cf8818460208701611580565b9190910192915050565b815167ffffffffffffffff811115611d1c57611d1c6113cc565b611d3081611d2a8454611adf565b84611b19565b602080601f831160018114611d655760008415611d4d5750858301515b600019600386901b1c1916600185901b178555611b5f565b600085815260208120601f198616915b82811015611d9457888601518255948401946001909101908401611d75565b5085821015611db25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611e1757603f19888603018452611e058583516115d0565b94509285019290850190600101611de9565b509297965050505050505056fea26469706673582212209a722da9dd0f80b828b07566849d43bf66d6ec20c2cd3e06b9d08cd3fa7ded4164736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80637950c5f8116100715780637950c5f8146101335780638da5cb5b146101725780639c38255914610183578063a3c4bcf8146101a6578063c7ddca0e146101c9578063f2fde38b146101dc57600080fd5b806305ab9860146100ae57806319b33968146100c357806349ce8997146100ec578063715018a61461010c57806379502c5514610114575b600080fd5b6100c16100bc3660046114cb565b6101ef565b005b6100d66100d1366004611567565b610660565b6040516100e3919061163b565b60405180910390f35b6100ff6100fa366004611567565b610973565b6040516100e39190611655565b6100c1610a0d565b6003546101219060ff1681565b60405160ff90911681526020016100e3565b61015a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100e3565b6000546001600160a01b031661015a565b6101966101913660046116d8565b610a21565b60405190151581526020016100e3565b6101b96101b4366004611567565b610d5f565b6040516100e3949392919061176a565b6100c16101d73660046117b7565b610fbf565b6100c16101ea366004611911565b611260565b6101f76112d9565b600082511161024d5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c696420746f74616c2062616c616e636573206c656e67746800000060448201526064015b60405180910390fd5b815161025a906040611950565b83146102a85760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206772616e642073756d2070726f6f66206c656e67746800006044820152606401610244565b8285116102f75760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420736e61726b2070726f6f66206c656e6774680000000000006044820152606401610244565b6040805160018082528183019092526000916020808301908036833701905050905060008160008151811061032e5761032e61196d565b602090810291909101015260405163af83a18d60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063af83a18d906103ab907f0000000000000000000000000000000000000000000000000000000000000000908b908b9087906004016119e7565b602060405180830381865afa1580156103c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ec9190611a1e565b61042e5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21039b730b93590383937b7b360691b6044820152606401610244565b6001548351146104a65760405162461bcd60e51b815260206004820152603a60248201527f4c696162696c69747920636f6d6d69746d656e747320616e642063727970746f60448201527f63757272656e63696573206e756d626572206d69736d617463680000000000006064820152608401610244565b3660008881896104b7896040611a40565b926104c493929190611a53565b9092509050600087876104da8460408188611a53565b6040516020016104ed9493929190611a7d565b60408051601f198184030181529082905263af83a18d60e01b825291506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063af83a18d9061056d907f00000000000000000000000000000000000000000000000000000000000000009085908b90600401611a9f565b602060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae9190611a1e565b6105fa5760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206772616e642073756d2070726f6f660000000000000000006044820152606401610244565b6000858152600560205260409020610613838583611b68565b50847f7603a12a8838a565715ddb5bbf625b3f00a5e6f4793437537963e30c3b9495dc8785858c8c60405161064c959493929190611c29565b60405180910390a250505050505050505050565b61068b6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000828152600660205260409020546106dd5760405162461bcd60e51b81526020600482015260146024820152731059191c995cdcc81b9bdd081d995c9a599a595960621b6044820152606401610244565b6000828152600660205260409020546004906106fb90600190611c70565b8154811061070b5761070b61196d565b906000526020600020906004020160405180608001604052908160008201805461073490611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461076090611adf565b80156107ad5780601f10610782576101008083540402835291602001916107ad565b820191906000526020600020905b81548152906001019060200180831161079057829003601f168201915b505050505081526020016001820180546107c690611adf565b80601f01602080910402602001604051908101604052809291908181526020018280546107f290611adf565b801561083f5780601f106108145761010080835404028352916020019161083f565b820191906000526020600020905b81548152906001019060200180831161082257829003601f168201915b5050505050815260200160028201805461085890611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461088490611adf565b80156108d15780601f106108a6576101008083540402835291602001916108d1565b820191906000526020600020905b8154815290600101906020018083116108b457829003601f168201915b505050505081526020016003820180546108ea90611adf565b80601f016020809104026020016040519081016040528092919081815260200182805461091690611adf565b80156109635780601f1061093857610100808354040283529160200191610963565b820191906000526020600020905b81548152906001019060200180831161094657829003601f168201915b5050505050815250509050919050565b6005602052600090815260409020805461098c90611adf565b80601f01602080910402602001604051908101604052809291908181526020018280546109b890611adf565b8015610a055780601f106109da57610100808354040283529160200191610a05565b820191906000526020600020905b8154815290600101906020018083116109e857829003601f168201915b505050505081565b610a156112d9565b610a1f6000611333565b565b60008251600414610a745760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206368616c6c656e676573206c656e677468000000000000006044820152606401610244565b6001805483519091610a8591611c70565b14610add5760405162461bcd60e51b815260206004820152602260248201527f56616c756573206c656e677468206d69736d61746368207769746820636f6e66604482015261696760f01b6064820152608401610244565b60008581526005602052604081208054610af690611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290611adf565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b50505050509050600085518251610b869190611a40565b67ffffffffffffffff811115610b9e57610b9e6113cc565b6040519080825280601f01601f191660200182016040528015610bc8576020820181803683370190505b50905060005b8651811015610c2f57868181518110610be957610be961196d565b602001015160f81c60f81b828281518110610c0657610c0661196d565b60200101906001600160f81b031916908160001a90535080610c2781611c83565b915050610bce565b5060005b8251811015610ca057828181518110610c4e57610c4e61196d565b602001015160f81c60f81b82885183610c679190611a40565b81518110610c7757610c7761196d565b60200101906001600160f81b031916908160001a90535080610c9881611c83565b915050610c33565b506040516323fb5ad560e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906347f6b5aa90610d13907f00000000000000000000000000000000000000000000000000000000000000009085908a908a90600401611c9c565b602060405180830381865afa158015610d30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d549190611a1e565b979650505050505050565b60048181548110610d6f57600080fd5b9060005260206000209060040201600091509050806000018054610d9290611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbe90611adf565b8015610e0b5780601f10610de057610100808354040283529160200191610e0b565b820191906000526020600020905b815481529060010190602001808311610dee57829003601f168201915b505050505090806001018054610e2090611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4c90611adf565b8015610e995780601f10610e6e57610100808354040283529160200191610e99565b820191906000526020600020905b815481529060010190602001808311610e7c57829003601f168201915b505050505090806002018054610eae90611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610eda90611adf565b8015610f275780601f10610efc57610100808354040283529160200191610f27565b820191906000526020600020905b815481529060010190602001808311610f0a57829003601f168201915b505050505090806003018054610f3c90611adf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6890611adf565b8015610fb55780601f10610f8a57610100808354040283529160200191610fb5565b820191906000526020600020905b815481529060010190602001808311610f9857829003601f168201915b5050505050905084565b610fc76112d9565b60005b8151811015611225576000828281518110610fe757610fe761196d565b6020026020010151600001516040516020016110039190611ce6565b60408051601f1981840301815291815281516020928301206000818152600690935291205490915080156110795760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610244565b600484848151811061108d5761108d61196d565b602090810291909101810151825460018101845560009384529190922082516004909202019081906110bf9082611d02565b50602082015160018201906110d49082611d02565b50604082015160028201906110e99082611d02565b50606082015160038201906110fe9082611d02565b50506004546000848152600660205260409020555083518490849081106111275761112761196d565b6020026020010151600001515160001415801561116357508383815181106111515761115161196d565b60200260200101516020015151600014155b801561118e575083838151811061117c5761117c61196d565b60200260200101516040015151600014155b80156111b957508383815181106111a7576111a761196d565b60200260200101516060015151600014155b6112105760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610244565b5050808061121d90611c83565b915050610fca565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a0454658816040516112559190611dc2565b60405180910390a150565b6112686112d9565b6001600160a01b0381166112cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610244565b6112d681611333565b50565b6000546001600160a01b03163314610a1f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610244565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008083601f84011261139557600080fd5b50813567ffffffffffffffff8111156113ad57600080fd5b6020830191508360208285010111156113c557600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715611405576114056113cc565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611434576114346113cc565b604052919050565b600067ffffffffffffffff821115611456576114566113cc565b5060051b60200190565b600082601f83011261147157600080fd5b813560206114866114818361143c565b61140b565b82815260059290921b840181019181810190868411156114a557600080fd5b8286015b848110156114c057803583529183019183016114a9565b509695505050505050565b600080600080600080608087890312156114e457600080fd5b863567ffffffffffffffff808211156114fc57600080fd5b6115088a838b01611383565b9098509650602089013591508082111561152157600080fd5b61152d8a838b01611383565b9096509450604089013591508082111561154657600080fd5b5061155389828a01611460565b925050606087013590509295509295509295565b60006020828403121561157957600080fd5b5035919050565b60005b8381101561159b578181015183820152602001611583565b50506000910152565b600081518084526115bc816020860160208601611580565b601f01601f19169290920160200192915050565b60008151608084526115e560808501826115a4565b9050602083015184820360208601526115fe82826115a4565b9150506040830151848203604086015261161882826115a4565b9150506060830151848203606086015261163282826115a4565b95945050505050565b60208152600061164e60208301846115d0565b9392505050565b60208152600061164e60208301846115a4565b600082601f83011261167957600080fd5b813567ffffffffffffffff811115611693576116936113cc565b6116a6601f8201601f191660200161140b565b8181528460208386010111156116bb57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080608085870312156116ee57600080fd5b84359350602085013567ffffffffffffffff8082111561170d57600080fd5b61171988838901611668565b9450604087013591508082111561172f57600080fd5b61173b88838901611460565b9350606087013591508082111561175157600080fd5b5061175e87828801611460565b91505092959194509250565b60808152600061177d60808301876115a4565b828103602084015261178f81876115a4565b905082810360408401526117a381866115a4565b90508281036060840152610d5481856115a4565b600060208083850312156117ca57600080fd5b823567ffffffffffffffff808211156117e257600080fd5b818501915085601f8301126117f657600080fd5b81356118046114818261143c565b81815260059190911b8301840190848101908883111561182357600080fd5b8585015b838110156119045780358581111561183e57600080fd5b86016080818c03601f190112156118555760008081fd5b61185d6113e2565b888201358781111561186f5760008081fd5b61187d8d8b83860101611668565b825250604080830135888111156118945760008081fd5b6118a28e8c83870101611668565b8b84015250606080840135898111156118bb5760008081fd5b6118c98f8d83880101611668565b838501525060808401359150888211156118e35760008081fd5b6118f18e8c84870101611668565b9083015250845250918601918601611827565b5098975050505050505050565b60006020828403121561192357600080fd5b81356001600160a01b038116811461164e57600080fd5b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176119675761196761193a565b92915050565b634e487b7160e01b600052603260045260246000fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526020808501945080840160005b838110156119dc578151875295820195908201906001016119c0565b509495945050505050565b6001600160a01b0385168152606060208201819052600090611a0c9083018587611983565b8281036040840152610d5481856119ac565b600060208284031215611a3057600080fd5b8151801515811461164e57600080fd5b808201808211156119675761196761193a565b60008085851115611a6357600080fd5b83861115611a7057600080fd5b5050820193919092039150565b8385823760008482016000815283858237600093019283525090949350505050565b6001600160a01b0384168152606060208201819052600090611ac3908301856115a4565b8281036040840152611ad581856119ac565b9695505050505050565b600181811c90821680611af357607f821691505b602082108103611b1357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611b6357600081815260208120601f850160051c81016020861015611b405750805b601f850160051c820191505b81811015611b5f57828155600101611b4c565b5050505b505050565b67ffffffffffffffff831115611b8057611b806113cc565b611b9483611b8e8354611adf565b83611b19565b6000601f841160018114611bc85760008515611bb05750838201355b600019600387901b1c1916600186901b178355611c22565b600083815260209020601f19861690835b82811015611bf95786850135825560209485019460019092019101611bd9565b5086821015611c165760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b606081526000611c3c60608301886119ac565b8281036020840152611c4f818789611983565b90508281036040840152611c64818587611983565b98975050505050505050565b818103818111156119675761196761193a565b600060018201611c9557611c9561193a565b5060010190565b6001600160a01b0385168152608060208201819052600090611cc0908301866115a4565b8281036040840152611cd281866119ac565b90508281036060840152610d5481856119ac565b60008251611cf8818460208701611580565b9190910192915050565b815167ffffffffffffffff811115611d1c57611d1c6113cc565b611d3081611d2a8454611adf565b84611b19565b602080601f831160018114611d655760008415611d4d5750858301515b600019600386901b1c1916600185901b178555611b5f565b600085815260208120601f198616915b82811015611d9457888601518255948401946001909101908401611d75565b5085821015611db25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611e1757603f19888603018452611e058583516115d0565b94509285019290850190600101611de9565b509297965050505050505056fea26469706673582212209a722da9dd0f80b828b07566849d43bf66d6ec20c2cd3e06b9d08cd3fa7ded4164736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/abi/VerifyingKey.json b/backend/src/contracts/abi/VerifyingKey.json index aea60524..4ff9d945 100644 --- a/backend/src/contracts/abi/VerifyingKey.json +++ b/backend/src/contracts/abi/VerifyingKey.json @@ -1 +1 @@ -{"_format":"hh-sol-artifact-1","contractName":"Halo2VerifyingKey","sourceName":"src/VerifyingKey.sol","abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"}],"bytecode":"0x608060405234801561001057600080fd5b5060007f0f4282e55a789d94ea57d4e200623dabb7ea67c998749f0370c890ab9ee6883f815260116020527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f53608016040527f304cd1e79cfa5b0f054e981a27ed7706e7ea6b06a7f266ef8db819c179c2c3ea6060527f193586da872cdeff023d6ab2263a131b4780db8878be3c3b7f8f019c06fcb0fb6080527f299110e6835fd73731fb3ce6de87151988da403c265467a96b9cda0d7daa72e460a052600160c0528060e0528061010052806101205280610140526001610160526002610180527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101a0527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101c0527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6101e0527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610200527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d610220527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e610240527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145610260527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff610280527f1404a2d17cd02c8f9fd79d74ac73c67d1881e62c6af354fa74d235c5e37dacfe6102a0527f2c1e30781f735e7977820d4ca9145010e28dcc808ee0f1e976477289057b7aec6102c0527f1b20314062560deca1b1bada262dbe3352a521ea2ef8973476cb7ad6f588c59d6102e0527f244ac9f0848be84d5a85e3c4e62e2a371ac7be27d68202ef3fe79541021ab99d610300527f2b1f7e2148bfab601e68f2e8133b9d05c10a9526d686b356b761eaa3713a70ba610320527f013345ea09966b06e4ae7d7e2919ddbb6e3f7e645aea515375ed729bff644dc5610340527f27a7a66087a8c17b00ffb7fe9b76ba2199ca308bcb0ad100fa181886d6c9b936610360527f23bc951a3c4307384bdec5d61be122a19c933db3266d6327a472e5203a9f785a610380527f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746103a0527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e36103c0527f1d81e0b06dea11d9b7a7a64458db5e5eb2f5dbe107a81f0555738f613b9b7d786103e0527f081e3e59de4615b05fef48f591d1ea23cb32f0ee841157094c1b81b95cfdb9fa610400527f0c28e0db2e4decc2a36413620cdc36ae237ccbc1cd1168841c5375d2a79478ce610420527f17b5790a11fcde00f8acf7edc4328f37883aec0f5955f8a6f7764078edf3cd05610440527f284ac053d96a33fca69eca00e16eea75ad1bf008d2a742fc846ac73d17d46d73610460527f14f45666a26b8d472186dbf78e606a82891e0f122a54264418cfe2615003dfb9610480527f1c517c335ad634422ef2eb5f615926e875afa9e9c589abf528d315a8a586b22d6104a0527f1220b1b13c91e8115106144bc417d4d3e6a9de3fb70406e68b4a5fd8a92f43276104c0527f1be0972afecdd013ffa6a3acc18998619b8df7834273d89825bf1abd1f2023ab6104e0527e19ea072d6d49fbf164929a19a76d4421f33d47647ff62c7230133fba915307610500527f0f09c585dc376dd0d5962c76ae444dc1cc3de9780f4fbdd5105a7040500d60ba610520527f13587a1e4799ba72f1d95e47a4e377086b83e5189903566e7422119ed28eba596105405261056081f3fe","deployedBytecode":"0x6080604052600080fdfea2646970667358221220e7575f4fe6578c13d0383c6c5b39fe580d12eec30351ca05204f256d8400d7f564736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file +{"_format":"hh-sol-artifact-1","contractName":"Halo2VerifyingKey","sourceName":"src/VerifyingKey.sol","abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"}],"bytecode":"0x608060405234801561001057600080fd5b5060007e996ed64113d5d86f42caab0f3d25466b0856015472de4bb809f168aabc2567815260116020527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f53608016040527f304cd1e79cfa5b0f054e981a27ed7706e7ea6b06a7f266ef8db819c179c2c3ea6060527f193586da872cdeff023d6ab2263a131b4780db8878be3c3b7f8f019c06fcb0fb6080527f299110e6835fd73731fb3ce6de87151988da403c265467a96b9cda0d7daa72e460a052600160c0528060e0528061010052806101205280610140526001610160526002610180527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101a0527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101c0527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6101e0527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610200527f26186a2d65ee4d2f9c9a5b91f86597d35f192cd120caf7e935d8443d1938e23d610220527f30441fd1b5d3370482c42152a8899027716989a6996c2535bc9f7fee8aaef79e610240527f16f363f103c80d7bbc8ad3c6867e0822bbc6000be91a4689755c7df40221c145610260527f2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff610280527f1404a2d17cd02c8f9fd79d74ac73c67d1881e62c6af354fa74d235c5e37dacfe6102a0527f2c1e30781f735e7977820d4ca9145010e28dcc808ee0f1e976477289057b7aec6102c0527f2dd3fd59098a5b4b4a616568bb6ba1a1e4c40e4b0df9ae94e37944d55ab651cf6102e0527f25680c3525ba04435a9034d6e69c96de5133edfe37c226d3e31b60eff6b34ef0610300527f1a224e6aeb9bb7de12c761fd1f49a733ff410c3f772aad6a2ec3c4decad43307610320527f300a66b376af1187694e25dbcea3aac63114716af822fd4661519adbf9c649e9610340527f27a7a66087a8c17b00ffb7fe9b76ba2199ca308bcb0ad100fa181886d6c9b936610360527f23bc951a3c4307384bdec5d61be122a19c933db3266d6327a472e5203a9f785a610380527f0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c4529746103a0527f0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e36103c0527f0f85936c44708409e3e9fb5e2a7ea6604b06997f0ac7fd488e3f147e05a88dbe6103e0527f0497fbb7c4436dcf36ede6a30ad62e016e059a11a6548eb6980edeb2f1052133610400527f0dcbacf368c01f61375c242e35edab12a22147e9d46bf685fb75454d60f5edbc610420527f17720c95139aa3f5dec5b6bd56082f8deded2e4a1425d0a91e2743dd294fdc9c610440527f284ac053d96a33fca69eca00e16eea75ad1bf008d2a742fc846ac73d17d46d73610460527f14f45666a26b8d472186dbf78e606a82891e0f122a54264418cfe2615003dfb9610480527f1c517c335ad634422ef2eb5f615926e875afa9e9c589abf528d315a8a586b22d6104a0527f1220b1b13c91e8115106144bc417d4d3e6a9de3fb70406e68b4a5fd8a92f43276104c0527f0cbaead666e172b1801b7ad17c3450ea2ce7d53c1e392cedf05023e59e53c95a6104e0527f0ce200ab515efc390c459e0b492c15a50024c57fa70768c18389924e1e72982b610500527f1d4848e8db74251fd01e018fedb71ca8e04c41746474ad4b4a39da132f86f30b610520527f148a2252b7b6a07e21aa1bc5b1cc4826ac7f4a7a3e29fb7399dd7029d4bdaf276105405261056081f3fe","deployedBytecode":"0x6080604052600080fdfea26469706673582212207c80617d071a4e94f54a68097fd35e2444402dadbf01772e6352e9def6be37da64736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/generated/snark_verifier.rs b/backend/src/contracts/generated/snark_verifier.rs index 26adebbb..31a87475 100644 --- a/backend/src/contracts/generated/snark_verifier.rs +++ b/backend/src/contracts/generated/snark_verifier.rs @@ -1983,9 +1983,9 @@ pub mod verifier { 136, 9, 97, - 11, - 132, - 53, + 17, + 32, + 81, 8, 8, 131, @@ -2036,9 +2036,9 @@ pub mod verifier { 0, 81, 97, - 11, - 132, - 53, + 17, + 32, + 81, 8, 8, 130, @@ -2124,7 +2124,7 @@ pub mod verifier { 9, 97, 11, - 164, + 132, 53, 8, 8, @@ -2145,7 +2145,7 @@ pub mod verifier { 9, 97, 11, - 196, + 164, 53, 8, 8, @@ -2162,7 +2162,7 @@ pub mod verifier { 81, 97, 11, - 164, + 132, 53, 8, 8, @@ -2188,7 +2188,7 @@ pub mod verifier { 81, 97, 11, - 196, + 164, 53, 8, 8, @@ -2275,7 +2275,7 @@ pub mod verifier { 9, 97, 11, - 228, + 196, 53, 8, 8, @@ -2295,8 +2295,8 @@ pub mod verifier { 136, 9, 97, - 12, - 36, + 11, + 228, 53, 8, 8, @@ -2313,7 +2313,7 @@ pub mod verifier { 81, 97, 11, - 228, + 196, 53, 8, 8, @@ -2338,8 +2338,8 @@ pub mod verifier { 0, 81, 97, - 12, - 36, + 11, + 228, 53, 8, 8, @@ -2426,7 +2426,7 @@ pub mod verifier { 9, 97, 12, - 68, + 36, 53, 8, 8, @@ -2447,7 +2447,7 @@ pub mod verifier { 9, 97, 12, - 100, + 68, 53, 8, 8, @@ -2464,7 +2464,7 @@ pub mod verifier { 81, 97, 12, - 68, + 36, 53, 8, 8, @@ -2490,7 +2490,7 @@ pub mod verifier { 81, 97, 12, - 100, + 68, 53, 8, 8, @@ -2577,7 +2577,7 @@ pub mod verifier { 9, 97, 12, - 132, + 100, 53, 8, 8, @@ -2597,9 +2597,9 @@ pub mod verifier { 136, 9, 97, - 17, - 32, - 81, + 12, + 132, + 53, 8, 8, 131, @@ -2615,7 +2615,7 @@ pub mod verifier { 81, 97, 12, - 132, + 100, 53, 8, 8, @@ -2640,9 +2640,9 @@ pub mod verifier { 0, 81, 97, - 17, - 32, - 81, + 12, + 132, + 53, 8, 8, 130, @@ -8590,38 +8590,38 @@ pub mod verifier { 34, 18, 32, - 83, - 54, - 64, - 216, - 23, - 28, - 138, - 115, - 83, - 98, - 89, - 12, - 71, - 19, - 49, - 170, - 112, - 169, - 51, - 83, - 36, - 180, - 171, - 109, - 198, - 238, - 186, - 133, + 105, + 128, + 67, + 95, + 149, + 145, + 57, + 3, + 120, + 226, + 85, + 244, + 2, + 110, + 235, 66, - 106, - 183, + 197, + 104, + 20, + 17, + 79, + 158, + 75, + 15, + 168, + 250, + 111, 156, + 91, + 173, + 236, + 91, 100, 115, 111, @@ -10574,9 +10574,9 @@ pub mod verifier { 136, 9, 97, - 11, - 132, - 53, + 17, + 32, + 81, 8, 8, 131, @@ -10627,9 +10627,9 @@ pub mod verifier { 0, 81, 97, - 11, - 132, - 53, + 17, + 32, + 81, 8, 8, 130, @@ -10715,7 +10715,7 @@ pub mod verifier { 9, 97, 11, - 164, + 132, 53, 8, 8, @@ -10736,7 +10736,7 @@ pub mod verifier { 9, 97, 11, - 196, + 164, 53, 8, 8, @@ -10753,7 +10753,7 @@ pub mod verifier { 81, 97, 11, - 164, + 132, 53, 8, 8, @@ -10779,7 +10779,7 @@ pub mod verifier { 81, 97, 11, - 196, + 164, 53, 8, 8, @@ -10866,7 +10866,7 @@ pub mod verifier { 9, 97, 11, - 228, + 196, 53, 8, 8, @@ -10886,8 +10886,8 @@ pub mod verifier { 136, 9, 97, - 12, - 36, + 11, + 228, 53, 8, 8, @@ -10904,7 +10904,7 @@ pub mod verifier { 81, 97, 11, - 228, + 196, 53, 8, 8, @@ -10929,8 +10929,8 @@ pub mod verifier { 0, 81, 97, - 12, - 36, + 11, + 228, 53, 8, 8, @@ -11017,7 +11017,7 @@ pub mod verifier { 9, 97, 12, - 68, + 36, 53, 8, 8, @@ -11038,7 +11038,7 @@ pub mod verifier { 9, 97, 12, - 100, + 68, 53, 8, 8, @@ -11055,7 +11055,7 @@ pub mod verifier { 81, 97, 12, - 68, + 36, 53, 8, 8, @@ -11081,7 +11081,7 @@ pub mod verifier { 81, 97, 12, - 100, + 68, 53, 8, 8, @@ -11168,7 +11168,7 @@ pub mod verifier { 9, 97, 12, - 132, + 100, 53, 8, 8, @@ -11188,9 +11188,9 @@ pub mod verifier { 136, 9, 97, - 17, - 32, - 81, + 12, + 132, + 53, 8, 8, 131, @@ -11206,7 +11206,7 @@ pub mod verifier { 81, 97, 12, - 132, + 100, 53, 8, 8, @@ -11231,9 +11231,9 @@ pub mod verifier { 0, 81, 97, - 17, - 32, - 81, + 12, + 132, + 53, 8, 8, 130, @@ -17181,38 +17181,38 @@ pub mod verifier { 34, 18, 32, - 83, - 54, - 64, - 216, - 23, - 28, - 138, - 115, - 83, - 98, - 89, - 12, - 71, - 19, - 49, - 170, - 112, - 169, - 51, - 83, - 36, - 180, - 171, - 109, - 198, - 238, - 186, - 133, + 105, + 128, + 67, + 95, + 149, + 145, + 57, + 3, + 120, + 226, + 85, + 244, + 2, + 110, + 235, 66, - 106, - 183, + 197, + 104, + 20, + 17, + 79, + 158, + 75, + 15, + 168, + 250, + 111, 156, + 91, + 173, + 236, + 91, 100, 115, 111, diff --git a/backend/src/contracts/generated/summa_contract.rs b/backend/src/contracts/generated/summa_contract.rs index 081dfaa0..89f23fc9 100644 --- a/backend/src/contracts/generated/summa_contract.rs +++ b/backend/src/contracts/generated/summa_contract.rs @@ -42,15 +42,15 @@ pub mod summa { 81, 98, 0, - 40, - 245, + 41, + 0, 56, 3, 128, 98, 0, - 40, - 245, + 41, + 0, 131, 57, 129, @@ -68,7 +68,7 @@ pub mod summa { 98, 0, 7, - 80, + 91, 86, 91, 98, @@ -325,7 +325,7 @@ pub mod summa { 98, 0, 8, - 44, + 55, 86, 91, 96, @@ -367,7 +367,7 @@ pub mod summa { 98, 0, 8, - 44, + 55, 86, 91, 96, @@ -471,7 +471,7 @@ pub mod summa { 98, 0, 8, - 88, + 99, 86, 91, 145, @@ -1009,8 +1009,8 @@ pub mod summa { 144, 98, 0, - 4, - 252, + 5, + 7, 86, 91, 80, @@ -1036,8 +1036,8 @@ pub mod summa { 144, 98, 0, - 4, - 252, + 5, + 7, 86, 91, 80, @@ -1074,7 +1074,7 @@ pub mod summa { 98, 0, 10, - 76, + 87, 149, 80, 80, @@ -1178,7 +1178,7 @@ pub mod summa { 98, 0, 8, - 116, + 127, 86, 91, 96, @@ -1193,7 +1193,7 @@ pub mod summa { 98, 0, 8, - 165, + 176, 86, 91, 98, @@ -1206,7 +1206,7 @@ pub mod summa { 98, 0, 8, - 197, + 208, 86, 91, 144, @@ -1226,7 +1226,7 @@ pub mod summa { 98, 0, 8, - 165, + 176, 86, 91, 98, @@ -1238,7 +1238,7 @@ pub mod summa { 98, 0, 8, - 197, + 208, 86, 91, 144, @@ -1255,7 +1255,7 @@ pub mod summa { 98, 0, 8, - 219, + 230, 86, 91, 144, @@ -1275,11 +1275,22 @@ pub mod summa { 0, 81, 96, - 15, + 1, + 96, + 1, + 96, + 128, + 27, + 3, 129, 22, 21, + 96, + 128, + 145, 144, + 145, + 28, 21, 25, 22, @@ -1318,7 +1329,7 @@ pub mod summa { 98, 0, 5, - 71, + 82, 87, 145, 96, @@ -1334,7 +1345,7 @@ pub mod summa { 98, 0, 5, - 71, + 82, 87, 130, 81, @@ -1343,13 +1354,13 @@ pub mod summa { 98, 0, 5, - 54, + 65, 144, 130, 98, 0, 9, - 128, + 139, 86, 91, 80, @@ -1366,21 +1377,21 @@ pub mod summa { 98, 0, 5, - 29, + 40, 86, 91, 80, 98, 0, 5, - 85, + 96, 146, 145, 80, 98, 0, 5, - 89, + 100, 86, 91, 80, @@ -1394,20 +1405,20 @@ pub mod summa { 98, 0, 5, - 85, + 96, 87, 96, 0, 98, 0, 5, - 112, + 123, 130, 130, 98, 0, 5, - 122, + 133, 86, 91, 80, @@ -1417,7 +1428,7 @@ pub mod summa { 98, 0, 5, - 89, + 100, 86, 91, 80, @@ -1426,12 +1437,12 @@ pub mod summa { 98, 0, 5, - 136, + 147, 144, 98, 0, 8, - 241, + 252, 86, 91, 96, @@ -1445,7 +1456,7 @@ pub mod summa { 98, 0, 5, - 153, + 164, 87, 80, 80, @@ -1474,13 +1485,13 @@ pub mod summa { 98, 0, 5, - 185, + 196, 145, 144, 98, 0, 5, - 188, + 199, 86, 91, 80, @@ -1494,7 +1505,7 @@ pub mod summa { 98, 0, 5, - 85, + 96, 87, 96, 0, @@ -1506,7 +1517,7 @@ pub mod summa { 98, 0, 5, - 189, + 200, 86, 91, 96, @@ -1524,7 +1535,7 @@ pub mod summa { 98, 0, 5, - 185, + 196, 87, 96, 0, @@ -1584,16 +1595,16 @@ pub mod summa { 98, 0, 6, - 42, + 53, 87, 98, 0, 6, - 42, + 53, 98, 0, 5, - 233, + 244, 86, 91, 96, @@ -1616,7 +1627,7 @@ pub mod summa { 98, 0, 6, - 69, + 80, 87, 96, 0, @@ -1642,16 +1653,16 @@ pub mod summa { 98, 0, 6, - 100, + 111, 87, 98, 0, 6, - 100, + 111, 98, 0, 5, - 233, + 244, 86, 91, 130, @@ -1661,14 +1672,14 @@ pub mod summa { 98, 0, 6, - 117, + 128, 131, 130, 1, 98, 0, - 5, - 255, + 6, + 10, 86, 91, 147, @@ -1691,7 +1702,7 @@ pub mod summa { 98, 0, 6, - 144, + 155, 87, 96, 0, @@ -1711,7 +1722,7 @@ pub mod summa { 98, 0, 7, - 67, + 78, 87, 130, 81, @@ -1722,7 +1733,7 @@ pub mod summa { 98, 0, 6, - 176, + 187, 87, 96, 0, @@ -1741,7 +1752,7 @@ pub mod summa { 98, 0, 6, - 195, + 206, 87, 96, 0, @@ -1760,22 +1771,22 @@ pub mod summa { 98, 0, 6, - 218, + 229, 87, 98, 0, 6, - 218, + 229, 98, 0, 5, - 233, + 244, 86, 91, 98, 0, 6, - 237, + 248, 129, 138, 1, @@ -1787,8 +1798,8 @@ pub mod summa { 1, 98, 0, - 5, - 255, + 6, + 10, 86, 91, 129, @@ -1807,7 +1818,7 @@ pub mod summa { 98, 0, 7, - 5, + 16, 87, 96, 0, @@ -1825,7 +1836,7 @@ pub mod summa { 98, 0, 7, - 37, + 48, 87, 132, 129, @@ -1844,7 +1855,7 @@ pub mod summa { 98, 0, 7, - 8, + 19, 86, 91, 80, @@ -1874,7 +1885,7 @@ pub mod summa { 98, 0, 6, - 150, + 161, 86, 91, 153, @@ -1911,7 +1922,7 @@ pub mod summa { 98, 0, 7, - 108, + 119, 87, 96, 0, @@ -1923,12 +1934,12 @@ pub mod summa { 98, 0, 7, - 121, + 132, 129, 98, 0, 5, - 211, + 222, 86, 91, 96, @@ -1942,12 +1953,12 @@ pub mod summa { 98, 0, 7, - 140, + 151, 129, 98, 0, 5, - 211, + 222, 86, 91, 96, @@ -1961,12 +1972,12 @@ pub mod summa { 98, 0, 7, - 159, + 170, 129, 98, 0, 5, - 211, + 222, 86, 91, 96, @@ -1980,12 +1991,12 @@ pub mod summa { 98, 0, 7, - 178, + 189, 129, 98, 0, 5, - 211, + 222, 86, 91, 96, @@ -2011,7 +2022,7 @@ pub mod summa { 98, 0, 7, - 208, + 219, 87, 96, 0, @@ -2021,7 +2032,7 @@ pub mod summa { 98, 0, 7, - 222, + 233, 139, 131, 140, @@ -2029,7 +2040,7 @@ pub mod summa { 98, 0, 6, - 50, + 61, 86, 91, 148, @@ -2047,8 +2058,8 @@ pub mod summa { 21, 98, 0, - 7, - 245, + 8, + 0, 87, 96, 0, @@ -2059,7 +2070,7 @@ pub mod summa { 98, 0, 8, - 4, + 15, 138, 130, 139, @@ -2067,7 +2078,7 @@ pub mod summa { 98, 0, 6, - 50, + 61, 86, 91, 146, @@ -2087,7 +2098,7 @@ pub mod summa { 98, 0, 8, - 28, + 39, 87, 96, 0, @@ -2163,16 +2174,16 @@ pub mod summa { 98, 0, 8, - 109, + 120, 87, 98, 0, 8, - 109, + 120, 98, 0, 8, - 66, + 77, 86, 91, 80, @@ -2192,7 +2203,7 @@ pub mod summa { 98, 0, 8, - 150, + 161, 87, 99, 78, @@ -2245,16 +2256,16 @@ pub mod summa { 98, 0, 8, - 191, + 202, 87, 98, 0, 8, - 191, + 202, 98, 0, 8, - 66, + 77, 86, 91, 146, @@ -2273,16 +2284,16 @@ pub mod summa { 98, 0, 8, - 191, + 202, 87, 98, 0, 8, - 191, + 202, 98, 0, 8, - 66, + 77, 86, 91, 129, @@ -2295,16 +2306,16 @@ pub mod summa { 98, 0, 8, - 191, + 202, 87, 98, 0, 8, - 191, + 202, 98, 0, 8, - 66, + 77, 86, 91, 96, @@ -2319,7 +2330,7 @@ pub mod summa { 98, 0, 9, - 6, + 17, 87, 96, 127, @@ -2337,7 +2348,7 @@ pub mod summa { 98, 0, 9, - 39, + 50, 87, 99, 78, @@ -2375,7 +2386,7 @@ pub mod summa { 98, 0, 9, - 123, + 134, 87, 96, 0, @@ -2403,7 +2414,7 @@ pub mod summa { 98, 0, 9, - 86, + 97, 87, 80, 128, @@ -2427,7 +2438,7 @@ pub mod summa { 98, 0, 9, - 119, + 130, 87, 130, 129, @@ -2438,7 +2449,7 @@ pub mod summa { 98, 0, 9, - 98, + 109, 86, 91, 80, @@ -2466,40 +2477,40 @@ pub mod summa { 98, 0, 9, - 156, + 167, 87, 98, 0, 9, - 156, + 167, 98, 0, 5, - 233, + 244, 86, 91, 98, 0, 9, - 180, + 191, 129, 98, 0, 9, - 173, + 184, 132, 84, 98, 0, 8, - 241, + 252, 86, 91, 132, 98, 0, 9, - 45, + 56, 86, 91, 96, @@ -2516,7 +2527,7 @@ pub mod summa { 98, 0, 9, - 236, + 247, 87, 96, 0, @@ -2525,7 +2536,7 @@ pub mod summa { 98, 0, 9, - 211, + 222, 87, 80, 133, @@ -2555,7 +2566,7 @@ pub mod summa { 98, 0, 9, - 119, + 130, 86, 91, 96, @@ -2581,7 +2592,7 @@ pub mod summa { 98, 0, 10, - 29, + 40, 87, 136, 134, @@ -2603,8 +2614,8 @@ pub mod summa { 1, 98, 0, - 9, - 252, + 10, + 7, 86, 91, 80, @@ -2615,7 +2626,7 @@ pub mod summa { 98, 0, 10, - 60, + 71, 87, 135, 133, @@ -2672,7 +2683,7 @@ pub mod summa { 98, 0, 10, - 155, + 166, 96, 0, 57, @@ -3527,7 +3538,7 @@ pub mod summa { 144, 80, 96, - 1, + 0, 129, 96, 0, @@ -10459,38 +10470,38 @@ pub mod summa { 34, 18, 32, - 92, - 221, - 52, - 89, - 207, - 150, - 127, - 41, - 140, - 130, - 85, - 240, - 216, - 57, - 88, + 154, + 114, 45, - 199, + 169, 221, - 65, - 85, - 82, - 48, - 245, - 20, - 33, - 144, - 31, - 96, - 248, - 56, - 150, + 15, + 128, + 184, + 40, + 176, + 117, + 102, + 132, + 157, + 67, + 191, + 102, + 214, + 236, 32, + 194, + 205, + 62, + 6, + 185, + 208, + 140, + 211, + 250, + 125, + 237, + 65, 100, 115, 111, @@ -11304,7 +11315,7 @@ pub mod summa { 144, 80, 96, - 1, + 0, 129, 96, 0, @@ -18236,38 +18247,38 @@ pub mod summa { 34, 18, 32, - 92, - 221, - 52, - 89, - 207, - 150, - 127, - 41, - 140, - 130, - 85, - 240, - 216, - 57, - 88, + 154, + 114, 45, - 199, + 169, 221, - 65, - 85, - 82, - 48, - 245, - 20, - 33, - 144, - 31, - 96, - 248, - 56, - 150, + 15, + 128, + 184, + 40, + 176, + 117, + 102, + 132, + 157, + 67, + 191, + 102, + 214, + 236, 32, + 194, + 205, + 62, + 6, + 185, + 208, + 140, + 211, + 250, + 125, + 237, + 65, 100, 115, 111, diff --git a/backend/src/contracts/generated/verifying_key.rs b/backend/src/contracts/generated/verifying_key.rs index 3c0c6b6c..a1bdd70d 100644 --- a/backend/src/contracts/generated/verifying_key.rs +++ b/backend/src/contracts/generated/verifying_key.rs @@ -41,39 +41,38 @@ pub mod halo_2_verifying_key { 80, 96, 0, - 127, - 15, + 126, + 153, + 110, + 214, + 65, + 19, + 213, + 216, + 111, 66, - 130, - 229, - 90, - 120, - 157, - 148, - 234, - 87, - 212, - 226, - 0, - 98, - 61, + 202, 171, - 183, - 234, + 15, + 61, + 37, + 70, + 107, + 8, + 86, + 1, + 84, + 114, + 222, + 75, + 184, + 9, + 241, + 104, + 170, + 188, + 37, 103, - 201, - 152, - 116, - 159, - 3, - 112, - 200, - 144, - 171, - 158, - 230, - 136, - 63, 129, 82, 96, @@ -632,149 +631,149 @@ pub mod halo_2_verifying_key { 192, 82, 127, - 27, - 32, - 49, - 64, - 98, - 86, - 13, - 236, - 161, - 177, - 186, - 218, - 38, 45, - 190, - 51, - 82, - 165, - 33, - 234, - 46, - 248, - 151, - 52, - 118, - 203, - 122, - 214, - 245, - 136, - 197, - 157, + 211, + 253, + 89, + 9, + 138, + 91, + 75, + 74, + 97, + 101, + 104, + 187, + 107, + 161, + 161, + 228, + 196, + 14, + 75, + 13, + 249, + 174, + 148, + 227, + 121, + 68, + 213, + 90, + 182, + 81, + 207, 97, 2, 224, 82, 127, - 36, - 74, - 201, - 240, - 132, - 139, - 232, - 77, + 37, + 104, + 12, + 53, + 37, + 186, + 4, + 67, 90, - 133, - 227, - 196, + 144, + 52, + 214, 230, - 46, - 42, + 156, + 150, + 222, + 81, + 51, + 237, + 254, 55, - 26, - 199, - 190, - 39, - 214, - 130, - 2, + 194, + 38, + 211, + 227, + 27, + 96, 239, - 63, - 231, - 149, - 65, - 2, - 26, - 185, - 157, + 246, + 179, + 78, + 240, 97, 3, 0, 82, 127, - 43, - 31, - 126, - 33, - 72, - 191, - 171, - 96, - 30, - 104, - 242, - 232, - 19, - 59, - 157, - 5, - 193, - 10, - 149, - 38, - 214, - 134, - 179, - 86, + 26, + 34, + 78, + 106, + 235, + 155, 183, + 222, + 18, + 199, 97, - 234, - 163, - 113, - 58, - 112, - 186, + 253, + 31, + 73, + 167, + 51, + 255, + 65, + 12, + 63, + 119, + 42, + 173, + 106, + 46, + 195, + 196, + 222, + 202, + 212, + 51, + 7, 97, 3, 32, 82, 127, - 1, - 51, - 69, - 234, - 9, - 150, - 107, - 6, - 228, - 174, - 125, - 126, - 41, - 25, - 221, - 187, - 110, - 63, - 126, - 100, - 90, - 234, + 48, + 10, + 102, + 179, + 118, + 175, + 17, + 135, + 105, + 78, + 37, + 219, + 206, + 163, + 170, + 198, + 49, + 20, + 113, + 106, + 248, + 34, + 253, + 70, + 97, 81, - 83, - 117, - 237, - 114, - 155, - 255, - 100, - 77, - 197, + 154, + 219, + 249, + 198, + 73, + 233, 97, 3, 64, @@ -928,151 +927,151 @@ pub mod halo_2_verifying_key { 192, 82, 127, - 29, - 129, - 224, - 176, - 109, - 234, - 17, - 217, - 183, - 167, - 166, + 15, + 133, + 147, + 108, 68, - 88, - 219, - 94, + 112, + 132, + 9, + 227, + 233, + 251, 94, - 178, - 245, - 219, - 225, - 7, - 168, - 31, + 42, + 126, + 166, + 96, + 75, + 6, + 153, + 127, + 10, + 199, + 253, + 72, + 142, + 63, + 20, + 126, 5, - 85, - 115, - 143, - 97, - 59, - 155, - 125, - 120, + 168, + 141, + 190, 97, 3, 224, 82, 127, - 8, - 30, - 62, - 89, - 222, - 70, - 21, - 176, - 95, - 239, - 72, - 245, - 145, - 209, - 234, - 35, - 203, - 50, - 240, - 238, - 132, + 4, + 151, + 251, + 183, + 196, + 67, + 109, + 207, + 54, + 237, + 230, + 163, + 10, + 214, + 46, + 1, + 110, + 5, + 154, 17, - 87, - 9, - 76, - 27, - 129, - 185, - 92, - 253, - 185, - 250, + 166, + 84, + 142, + 182, + 152, + 14, + 222, + 178, + 241, + 5, + 33, + 51, 97, 4, 0, 82, 127, - 12, - 40, - 224, - 219, - 46, - 77, - 236, - 194, - 163, - 100, - 19, - 98, - 12, - 220, - 54, - 174, - 35, - 124, + 13, 203, - 193, - 205, - 17, + 172, + 243, 104, - 132, - 28, - 83, + 192, + 31, + 97, + 55, + 92, + 36, + 46, + 53, + 237, + 171, + 18, + 162, + 33, + 71, + 233, + 212, + 107, + 246, + 133, + 251, 117, - 210, - 167, - 148, - 120, - 206, + 69, + 77, + 96, + 245, + 237, + 188, 97, 4, 32, 82, 127, 23, - 181, - 121, - 10, - 17, - 252, + 114, + 12, + 149, + 19, + 154, + 163, + 245, 222, - 0, - 248, - 172, - 247, + 197, + 182, + 189, + 86, + 8, + 47, + 141, 237, - 196, - 50, - 143, - 55, - 136, - 58, - 236, - 15, - 89, - 85, - 248, - 166, - 247, - 118, - 64, - 120, 237, - 243, - 205, - 5, - 97, - 4, + 46, + 74, + 20, + 37, + 208, + 169, + 30, + 39, + 67, + 221, + 41, + 79, + 220, + 156, + 97, + 4, 64, 82, 127, @@ -1224,148 +1223,149 @@ pub mod halo_2_verifying_key { 192, 82, 127, + 12, + 186, + 234, + 214, + 102, + 225, + 114, + 177, + 128, 27, - 224, - 151, - 42, - 254, - 205, - 208, - 19, - 255, - 166, - 163, - 172, - 193, - 137, - 152, - 97, - 155, - 141, - 247, - 131, - 66, - 115, - 216, - 152, - 37, - 191, - 26, - 189, - 31, - 32, + 122, + 209, + 124, + 52, + 80, + 234, + 44, + 231, + 213, + 60, + 30, + 57, + 44, + 237, + 240, + 80, 35, - 171, + 229, + 158, + 83, + 201, + 90, 97, 4, 224, 82, - 126, - 25, - 234, - 7, - 45, - 109, - 73, - 251, - 241, - 100, - 146, - 154, - 25, - 167, - 109, - 68, - 33, - 243, - 61, - 71, - 100, 127, - 246, + 12, + 226, + 0, + 171, + 81, + 94, + 252, + 57, + 12, + 69, + 158, + 11, + 73, 44, - 114, - 48, - 19, - 63, - 186, - 145, - 83, + 21, + 165, + 0, + 36, + 197, + 127, + 167, 7, + 104, + 193, + 131, + 137, + 146, + 78, + 30, + 114, + 152, + 43, 97, 5, 0, 82, 127, - 15, - 9, - 197, - 133, - 220, - 55, - 109, + 29, + 72, + 72, + 232, + 219, + 116, + 37, + 31, 208, - 213, - 150, - 44, - 118, - 174, - 68, - 77, - 193, - 204, - 61, - 233, - 120, - 15, - 79, - 189, - 213, - 16, - 90, - 112, - 64, - 80, - 13, - 96, - 186, + 30, + 1, + 143, + 237, + 183, + 28, + 168, + 224, + 76, + 65, + 116, + 100, + 116, + 173, + 75, + 74, + 57, + 218, + 19, + 47, + 134, + 243, + 11, 97, 5, 32, 82, 127, - 19, - 88, + 20, + 138, + 34, + 82, + 183, + 182, + 160, + 126, + 33, + 170, + 27, + 197, + 177, + 204, + 72, + 38, + 172, + 127, + 74, 122, - 30, - 71, - 153, - 186, - 114, - 241, - 217, - 94, - 71, - 164, - 227, - 119, - 8, - 107, - 131, - 229, - 24, + 62, + 41, + 251, + 115, 153, - 3, - 86, - 110, - 116, - 34, - 17, - 158, - 210, - 142, - 186, - 89, + 221, + 112, + 41, + 212, + 189, + 175, + 39, 97, 5, 64, @@ -1403,38 +1403,38 @@ pub mod halo_2_verifying_key { 34, 18, 32, - 231, - 87, - 95, - 79, - 230, - 87, - 140, - 19, - 208, - 56, - 60, - 108, - 91, - 57, - 254, - 88, - 13, - 18, - 238, - 195, - 3, - 81, - 202, - 5, - 32, - 79, - 37, - 109, - 132, - 0, - 215, + 124, + 128, + 97, + 125, + 7, + 26, + 78, + 148, 245, + 74, + 104, + 9, + 127, + 211, + 94, + 36, + 68, + 64, + 45, + 173, + 191, + 1, + 119, + 46, + 99, + 82, + 233, + 222, + 246, + 190, + 55, + 218, 100, 115, 111, diff --git a/backend/src/tests.rs b/backend/src/tests.rs index 81e794ac..7e61fe64 100644 --- a/backend/src/tests.rs +++ b/backend/src/tests.rs @@ -201,7 +201,7 @@ mod test { generate_setup_artifacts(K, Some(PARAMS_PATH), &univariate_grand_sum_circuit).unwrap(); // Create a proof - let instances = vec![Fp::one(); 1]; // This instance is necessary to verify proof on solidity verifier. + let instances = vec![Fp::zero(); 1]; // This instance is necessary to verify proof on solidity verifier. let (zk_snark_proof, advice_polys, _omega) = full_prover( ¶ms, &pk, @@ -313,7 +313,7 @@ mod test { generate_setup_artifacts(K, Some(PARAMS_PATH), &univariate_grand_sum_circuit).unwrap(); // Create a SNARK proof - let instances = vec![Fp::one(); 1]; // This instance is necessary to verify proof on solidity verifier. + let instances = vec![Fp::zero(); 1]; // This instance is necessary to verify proof on solidity verifier. let (zk_snark_proof, advice_polys, _omega) = full_prover( ¶ms, &pk, diff --git a/contracts/src/SnarkVerifier.sol b/contracts/src/SnarkVerifier.sol index e95b40fa..55284311 100644 --- a/contracts/src/SnarkVerifier.sol +++ b/contracts/src/SnarkVerifier.sol @@ -476,11 +476,11 @@ contract Verifier { let lhs := calldataload(0x0e64) let rhs := calldataload(0x0e44) lhs := mulmod(lhs, addmod(addmod(calldataload(0x0cc4), mulmod(beta, calldataload(0x0d04), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0b84), mulmod(beta, calldataload(0x0d24), r), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(mload(INSTANCE_EVAL_MPTR), mulmod(beta, calldataload(0x0d24), r), r), gamma, r), r) mstore(0x00, mulmod(beta, mload(X_MPTR), r)) rhs := mulmod(rhs, addmod(addmod(calldataload(0x0cc4), mload(0x00), r), gamma, r), r) mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0b84), mload(0x00), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(mload(INSTANCE_EVAL_MPTR), mload(0x00), r), gamma, r), r) mstore(0x00, mulmod(mload(0x00), delta, r)) let left_sub_right := addmod(lhs, sub(r, rhs), r) let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) @@ -491,11 +491,11 @@ contract Verifier { let beta := mload(BETA_MPTR) let lhs := calldataload(0x0ec4) let rhs := calldataload(0x0ea4) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0ba4), mulmod(beta, calldataload(0x0d44), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0bc4), mulmod(beta, calldataload(0x0d64), r), r), gamma, r), r) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0ba4), mload(0x00), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x0b84), mulmod(beta, calldataload(0x0d44), r), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x0ba4), mulmod(beta, calldataload(0x0d64), r), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x0b84), mload(0x00), r), gamma, r), r) mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0bc4), mload(0x00), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x0ba4), mload(0x00), r), gamma, r), r) mstore(0x00, mulmod(mload(0x00), delta, r)) let left_sub_right := addmod(lhs, sub(r, rhs), r) let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) @@ -506,11 +506,11 @@ contract Verifier { let beta := mload(BETA_MPTR) let lhs := calldataload(0x0f24) let rhs := calldataload(0x0f04) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0be4), mulmod(beta, calldataload(0x0d84), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0c24), mulmod(beta, calldataload(0x0da4), r), r), gamma, r), r) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0be4), mload(0x00), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x0bc4), mulmod(beta, calldataload(0x0d84), r), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x0be4), mulmod(beta, calldataload(0x0da4), r), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x0bc4), mload(0x00), r), gamma, r), r) mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0c24), mload(0x00), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x0be4), mload(0x00), r), gamma, r), r) mstore(0x00, mulmod(mload(0x00), delta, r)) let left_sub_right := addmod(lhs, sub(r, rhs), r) let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) @@ -521,11 +521,11 @@ contract Verifier { let beta := mload(BETA_MPTR) let lhs := calldataload(0x0f84) let rhs := calldataload(0x0f64) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0c44), mulmod(beta, calldataload(0x0dc4), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0c64), mulmod(beta, calldataload(0x0de4), r), r), gamma, r), r) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0c44), mload(0x00), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x0c24), mulmod(beta, calldataload(0x0dc4), r), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x0c44), mulmod(beta, calldataload(0x0de4), r), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x0c24), mload(0x00), r), gamma, r), r) mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0c64), mload(0x00), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x0c44), mload(0x00), r), gamma, r), r) mstore(0x00, mulmod(mload(0x00), delta, r)) let left_sub_right := addmod(lhs, sub(r, rhs), r) let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) @@ -536,11 +536,11 @@ contract Verifier { let beta := mload(BETA_MPTR) let lhs := calldataload(0x0fe4) let rhs := calldataload(0x0fc4) - lhs := mulmod(lhs, addmod(addmod(calldataload(0x0c84), mulmod(beta, calldataload(0x0e04), r), r), gamma, r), r) - lhs := mulmod(lhs, addmod(addmod(mload(INSTANCE_EVAL_MPTR), mulmod(beta, calldataload(0x0e24), r), r), gamma, r), r) - rhs := mulmod(rhs, addmod(addmod(calldataload(0x0c84), mload(0x00), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x0c64), mulmod(beta, calldataload(0x0e04), r), r), gamma, r), r) + lhs := mulmod(lhs, addmod(addmod(calldataload(0x0c84), mulmod(beta, calldataload(0x0e24), r), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x0c64), mload(0x00), r), gamma, r), r) mstore(0x00, mulmod(mload(0x00), delta, r)) - rhs := mulmod(rhs, addmod(addmod(mload(INSTANCE_EVAL_MPTR), mload(0x00), r), gamma, r), r) + rhs := mulmod(rhs, addmod(addmod(calldataload(0x0c84), mload(0x00), r), gamma, r), r) let left_sub_right := addmod(lhs, sub(r, rhs), r) let eval := addmod(left_sub_right, sub(r, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), r), r)), r) quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r) diff --git a/contracts/src/Summa.sol b/contracts/src/Summa.sol index b92d83ab..66904f83 100644 --- a/contracts/src/Summa.sol +++ b/contracts/src/Summa.sol @@ -12,8 +12,8 @@ import "./interfaces/IInclusionVerifier.sol"; contract Summa is Ownable { /** * @dev Struct representing the configuration of the Summa instance - * @param cryptocurrencyNames The names of the cryptocurrencies whose balances are encoded in the polynomials - * @param cryptocurrencyChains The chains of the cryptocurrencies whose balances are encoded in the polynomials + * @param cryptocurrencyNames The names of the cryptocurrencies whose balances are interpolated in the polynomials + * @param cryptocurrencyChains The chains of the cryptocurrencies whose balances are interpolated in the polynomials * @param balanceByteRange The number of bytes used to represent the balance of a cryptocurrency in the polynomials */ struct SummaConfig { @@ -75,8 +75,8 @@ contract Summa is Ownable { * @param _polynomialInterpolationVerifier the address of the polynomial interpolation zkSNARK verifier * @param _grandSumVerifier the address of the grand sum KZG verifier * @param _inclusionVerifier the address of the inclusion KZG verifier - * @param cryptocurrencyNames the names of the cryptocurrencies whose balances are encoded in the polynomials - * @param cryptocurrencyChains the chain names of the cryptocurrencies whose balances are encoded in the polynomials + * @param cryptocurrencyNames the names of the cryptocurrencies whose balances are interpolated in the polynomials + * @param cryptocurrencyChains the chain names of the cryptocurrencies whose balances are interpolated in the polynomials * @param balanceByteRange maximum accepted byte range for the balance of a cryptocurrency */ constructor( @@ -167,8 +167,12 @@ contract Summa is Ownable { extcodecopy(vkContract, 0x00, readOffset, 0x20) // Load the read bytes from 0x00 into a variable let readBytes := mload(0x00) + + let leftHalf := shr(128, readBytes) // Shift right by 128 bits to get the left half + let rightHalf := and(readBytes, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) // Mask the right half + // We expect the left 16 bytes to be nonzero and the right 16 bytes to be zero - valid := and(not(iszero(readBytes)), iszero(and(readBytes, 0x0f))) + valid := and(not(iszero(leftHalf)), iszero(rightHalf)) } return valid; } @@ -233,7 +237,9 @@ contract Summa is Ownable { require(snarkProof.length > grandSumProof.length, "Invalid snark proof length"); uint[] memory args = new uint[](1); - args[0] = 1; // Workaround to satisfy the verifier (TODO remove after https://github.com/summa-dev/halo2-solidity-verifier/issues/1 is resolved) + + // This is the instance value for checking zero value inside circuit + args[0] = 0; require( polynomialInterpolationVerifier.verifyProof(verifyingKey, snarkProof, args), "Invalid snark proof" diff --git a/contracts/src/VerifyingKey.sol b/contracts/src/VerifyingKey.sol index 4643a94e..94ab49aa 100644 --- a/contracts/src/VerifyingKey.sol +++ b/contracts/src/VerifyingKey.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.0; contract Halo2VerifyingKey { constructor() { assembly { - mstore(0x0000, 0x0f4282e55a789d94ea57d4e200623dabb7ea67c998749f0370c890ab9ee6883f) // vk_digest + mstore(0x0000, 0x00996ed64113d5d86f42caab0f3d25466b0856015472de4bb809f168aabc2567) // vk_digest mstore(0x0020, 0x0000000000000000000000000000000000000000000000000000000000000011) // k mstore(0x0040, 0x30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801) // n_inv mstore(0x0060, 0x304cd1e79cfa5b0f054e981a27ed7706e7ea6b06a7f266ef8db819c179c2c3ea) // omega @@ -28,26 +28,26 @@ contract Halo2VerifyingKey { mstore(0x0280, 0x2b1cbb3e521edf5a622d82762a44a5e63f1e50b332d71154a4a7958d6011deff) // neg_s_g2_y_2 mstore(0x02a0, 0x1404a2d17cd02c8f9fd79d74ac73c67d1881e62c6af354fa74d235c5e37dacfe) // fixed_comms[0].x mstore(0x02c0, 0x2c1e30781f735e7977820d4ca9145010e28dcc808ee0f1e976477289057b7aec) // fixed_comms[0].y - mstore(0x02e0, 0x1b20314062560deca1b1bada262dbe3352a521ea2ef8973476cb7ad6f588c59d) // permutation_comms[0].x - mstore(0x0300, 0x244ac9f0848be84d5a85e3c4e62e2a371ac7be27d68202ef3fe79541021ab99d) // permutation_comms[0].y - mstore(0x0320, 0x2b1f7e2148bfab601e68f2e8133b9d05c10a9526d686b356b761eaa3713a70ba) // permutation_comms[1].x - mstore(0x0340, 0x013345ea09966b06e4ae7d7e2919ddbb6e3f7e645aea515375ed729bff644dc5) // permutation_comms[1].y + mstore(0x02e0, 0x2dd3fd59098a5b4b4a616568bb6ba1a1e4c40e4b0df9ae94e37944d55ab651cf) // permutation_comms[0].x + mstore(0x0300, 0x25680c3525ba04435a9034d6e69c96de5133edfe37c226d3e31b60eff6b34ef0) // permutation_comms[0].y + mstore(0x0320, 0x1a224e6aeb9bb7de12c761fd1f49a733ff410c3f772aad6a2ec3c4decad43307) // permutation_comms[1].x + mstore(0x0340, 0x300a66b376af1187694e25dbcea3aac63114716af822fd4661519adbf9c649e9) // permutation_comms[1].y mstore(0x0360, 0x27a7a66087a8c17b00ffb7fe9b76ba2199ca308bcb0ad100fa181886d6c9b936) // permutation_comms[2].x mstore(0x0380, 0x23bc951a3c4307384bdec5d61be122a19c933db3266d6327a472e5203a9f785a) // permutation_comms[2].y mstore(0x03a0, 0x0743ea40f14084db2673217283aa053f986896ee7c181f52118442e99c452974) // permutation_comms[3].x mstore(0x03c0, 0x0203e3493a2594ece57d22cc75dd081ac68271ec7c758153cfd2152bfb5c19e3) // permutation_comms[3].y - mstore(0x03e0, 0x1d81e0b06dea11d9b7a7a64458db5e5eb2f5dbe107a81f0555738f613b9b7d78) // permutation_comms[4].x - mstore(0x0400, 0x081e3e59de4615b05fef48f591d1ea23cb32f0ee841157094c1b81b95cfdb9fa) // permutation_comms[4].y - mstore(0x0420, 0x0c28e0db2e4decc2a36413620cdc36ae237ccbc1cd1168841c5375d2a79478ce) // permutation_comms[5].x - mstore(0x0440, 0x17b5790a11fcde00f8acf7edc4328f37883aec0f5955f8a6f7764078edf3cd05) // permutation_comms[5].y + mstore(0x03e0, 0x0f85936c44708409e3e9fb5e2a7ea6604b06997f0ac7fd488e3f147e05a88dbe) // permutation_comms[4].x + mstore(0x0400, 0x0497fbb7c4436dcf36ede6a30ad62e016e059a11a6548eb6980edeb2f1052133) // permutation_comms[4].y + mstore(0x0420, 0x0dcbacf368c01f61375c242e35edab12a22147e9d46bf685fb75454d60f5edbc) // permutation_comms[5].x + mstore(0x0440, 0x17720c95139aa3f5dec5b6bd56082f8deded2e4a1425d0a91e2743dd294fdc9c) // permutation_comms[5].y mstore(0x0460, 0x284ac053d96a33fca69eca00e16eea75ad1bf008d2a742fc846ac73d17d46d73) // permutation_comms[6].x mstore(0x0480, 0x14f45666a26b8d472186dbf78e606a82891e0f122a54264418cfe2615003dfb9) // permutation_comms[6].y mstore(0x04a0, 0x1c517c335ad634422ef2eb5f615926e875afa9e9c589abf528d315a8a586b22d) // permutation_comms[7].x mstore(0x04c0, 0x1220b1b13c91e8115106144bc417d4d3e6a9de3fb70406e68b4a5fd8a92f4327) // permutation_comms[7].y - mstore(0x04e0, 0x1be0972afecdd013ffa6a3acc18998619b8df7834273d89825bf1abd1f2023ab) // permutation_comms[8].x - mstore(0x0500, 0x0019ea072d6d49fbf164929a19a76d4421f33d47647ff62c7230133fba915307) // permutation_comms[8].y - mstore(0x0520, 0x0f09c585dc376dd0d5962c76ae444dc1cc3de9780f4fbdd5105a7040500d60ba) // permutation_comms[9].x - mstore(0x0540, 0x13587a1e4799ba72f1d95e47a4e377086b83e5189903566e7422119ed28eba59) // permutation_comms[9].y + mstore(0x04e0, 0x0cbaead666e172b1801b7ad17c3450ea2ce7d53c1e392cedf05023e59e53c95a) // permutation_comms[8].x + mstore(0x0500, 0x0ce200ab515efc390c459e0b492c15a50024c57fa70768c18389924e1e72982b) // permutation_comms[8].y + mstore(0x0520, 0x1d4848e8db74251fd01e018fedb71ca8e04c41746474ad4b4a39da132f86f30b) // permutation_comms[9].x + mstore(0x0540, 0x148a2252b7b6a07e21aa1bc5b1cc4826ac7f4a7a3e29fb7399dd7029d4bdaf27) // permutation_comms[9].y return(0, 0x0560) } diff --git a/contracts/src/interfaces/IInclusionVerifier.sol b/contracts/src/interfaces/IInclusionVerifier.sol index e0dacb5f..c67952f0 100644 --- a/contracts/src/interfaces/IInclusionVerifier.sol +++ b/contracts/src/interfaces/IInclusionVerifier.sol @@ -2,15 +2,15 @@ pragma solidity ^0.8.18; /** - * @dev Zero-knowledge proof verifier + * @dev Inclusion proof verifier */ interface IInclusionVerifier { /** * @dev Verify a proof * @param vk The verification key * @param proof The proof - * @param challenges The pre-calculated g2 points with challenge - * @param values The user data that includes userId, balance of currency 1 + * @param challenges The pre-calculated g2 points with challenge + * @param values The user data that includes userId, balance of currency * @return true if the proof is valid, false otherwise */ function verifyProof( diff --git a/contracts/src/interfaces/IVerifier.sol b/contracts/src/interfaces/IVerifier.sol index a9d7db3c..31e3d5c9 100644 --- a/contracts/src/interfaces/IVerifier.sol +++ b/contracts/src/interfaces/IVerifier.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.18; /** - * @dev Zero-knowledge proof verifier + * @dev Zk-SNARK and grand sum proof proof verifier */ interface IVerifier { /** diff --git a/contracts/test/Verifiers.ts b/contracts/test/Verifiers.ts index b6329e2e..3b23c9ba 100644 --- a/contracts/test/Verifiers.ts +++ b/contracts/test/Verifiers.ts @@ -47,7 +47,7 @@ describe("Verifier Contracts", () => { it("should verify snark proof", async () => { // The verifier contract checks the number of instances in the VerifyingKey contract at 0x00c0 with the given 'instances' input - expect(await snarkVerifier.verifyProof(verifyingKey.address, commitmentCalldata.range_check_snark_proof, [1])).to.be.true; + expect(await snarkVerifier.verifyProof(verifyingKey.address, commitmentCalldata.range_check_snark_proof, [0])).to.be.true; }); it("should revert with invalid proof", async () => { diff --git a/prover/benches/kzg.rs b/prover/benches/kzg.rs index ab20584d..471bca8c 100644 --- a/prover/benches/kzg.rs +++ b/prover/benches/kzg.rs @@ -56,11 +56,11 @@ fn bench_kzg< let entries = generate_dummy_entries::().unwrap(); // Calculate total for all entry columns - let mut csv_total: Vec = vec![BigUint::from(0u32); N_CURRENCIES]; + let mut total_balances: Vec = vec![BigUint::from(0u32); N_CURRENCIES]; for entry in &entries { for (i, balance) in entry.balances().iter().enumerate() { - csv_total[i] += balance; + total_balances[i] += balance; } } @@ -70,13 +70,14 @@ fn bench_kzg< b.iter_batched( || circuit.clone(), // Setup function: clone the circuit for each iteration |circuit| { - full_prover(¶ms, &pk, circuit, &[vec![]]); + full_prover(¶ms, &pk, circuit, &[vec![Fp::zero()]]); }, criterion::BatchSize::SmallInput, // Choose an appropriate batch size ); }); - let (zk_snark_proof, advice_polys, omega) = full_prover(¶ms, &pk, circuit, &[vec![]]); + let (zk_snark_proof, advice_polys, omega) = + full_prover(¶ms, &pk, circuit, &[vec![Fp::zero()]]); let poly_length = 1 << u64::from(K); @@ -89,7 +90,7 @@ fn bench_kzg< &advice_polys.advice_blinds, ¶ms, balance_column_range, - csv_total + total_balances .iter() .map(|x| big_uint_to_fp(&(x)) * Fp::from(poly_length).invert().unwrap()) .collect::>() @@ -109,7 +110,7 @@ fn bench_kzg< &advice_polys.advice_blinds, ¶ms, balance_column_range, - csv_total + total_balances .iter() .map(|x| big_uint_to_fp(&(x)) * Fp::from(poly_length).invert().unwrap()) .collect::>() @@ -186,7 +187,7 @@ fn bench_kzg< &advice_polys.advice_blinds, ¶ms, balance_column_range.clone(), - csv_total + total_balances .iter() .map(|x| big_uint_to_fp(&(x)) * Fp::from(poly_length).invert().unwrap()) .collect::>() @@ -261,15 +262,7 @@ fn criterion_benchmark(_c: &mut Criterion) { #[cfg(not(feature = "no_range_check"))] { const K: u32 = 17; - const N_USERS: usize = 2usize.pow(K) + 2usize.pow(16) - 6; // Subtracting 2^16 (reserved for range checks) and 6 (reserved rows) from 2^K. - bench_kzg::>( - format!("K = {K}, N_USERS = {N_USERS}, N_CURRENCIES = {N_CURRENCIES}").as_str(), - ); - } - #[cfg(not(feature = "no_range_check"))] - { - const K: u32 = 18; - const N_USERS: usize = 2usize.pow(K) - 2usize.pow(16) - 6; // Subtracting 2^16 (reserved for range checks) and 6 (reserved rows) from 2^K. + const N_USERS: usize = 2usize.pow(K) - 6; bench_kzg::>( format!("K = {K}, N_USERS = {N_USERS}, N_CURRENCIES = {N_CURRENCIES}").as_str(), ); diff --git a/prover/bin/commitment_solidity_calldata.json b/prover/bin/commitment_solidity_calldata.json index 3ec54874..1ae19c41 100644 --- a/prover/bin/commitment_solidity_calldata.json +++ b/prover/bin/commitment_solidity_calldata.json @@ -1,5 +1,5 @@ { - "range_check_snark_proof": "0x2b90dcabd21d9c25f66663afeda3d3c463de63baf5b404eebf497d7e9fd644172a604e994577ccc9c6796582b032a163b54b4747485873bb55dec4e19ed8e643261b66db77d711fd90671890321022121affeaf8353d696bf4597a6d9fba617c1560b42a43ed84a13785aa23e8d95a604d7aed90b8a4dd41c15284ac81189b812d536e6e7be13957f2eb82d0ced26c44b76e3dee0b896af61f57575935a346871fb31cc9f50e9d5084bb0d2856c98aa13718b511415ecad0e00bbf66c8f6d9002f72e292251aa5ffa14a688a561fed75953edbbc890b2fa598f0583ee7ce765d0aa1868a2757445f492b06805fec0366477f1ebed6348ec5851aeda4f59eb3d71660bb58a7bcd266a5d0ed38ced1123317a82ff1328f6a6eac51004e23b5e66e0599f36e5e86556e8ce526abe26164ace631423a648075afcc32d2e7f2213fa718ec0f12385481852fa95701d4cc2e37f5dc5b50ec2789b01fac8345f2b7bdc6022da8da9ac798151d2254ab55e84048912b04fa52cbaae2cab00b99a8cb2faa065fe18ffb434cca4276255cd9a0ebade94c8483c6ae0ad351ba33e2cd672f6b106076e9ad604ba1385e886dac06a81f8439e8e24001dbcd60194c29166043b62f3c5d63991a6e90d2e83d891484348b3ce12d5223496db1be9f61c0a50e147129c6b5d0224528244c2d4a19b550646d98c44800896d6bc3fa171d855cfa8510299d128669627c0f1b1547523a64a43322592d8a646ba0ed3a2b7dbf798c99a72372c27a0f0b0c889db038885a06b2ad28c99e85db07f53e9c649d864cd156e20b3d46f413cca4fd480c8b31cbe16009432817f957b2b137316c46501b291b02116eb82540e770c6e08fc0b70098238bbc89dd712c6b9943b7f694f04146919f11d8a02a32bdbf9cc4664a6db0a58722b2f7a1f9aaee4d25f31df7436a4cb82a25142de5e4bb2a20848441f2896942c9757ae9d3fc2a6b7fc77f55846f5601e310f9496b43c46838743079f3b67dbfbef49705dd8cc62779fbe9304b407a6f5c0f406093aeaa112e5e33e41c35ec499b145e4240f227670a1561245881a06d3321865022e7f8c4ba5cb25ec7cbfa1ec6fab68cd144bbd758109c768b04d64746147b6168a83f4e1ea14f5e68943b4996eb175d37f6c243393903ff7c977dd7880b0a51b883ab5719944729cb972e56793556d2bd6c79db03b35f4c78bebd84181e0e3d84736d620c70fa09679419b0b5952b57455ad9251a8676331c800702e4035b2d3794f3bec5b52031fcf058825cf7673fa147c67beebc06daab7b5f782a0d7bd42137cb4831ccaf0e487a2bc4fd768fa3ad743c9abe1e352d194e87c7d80aaf762060483d336e88641ec26bdfc8fdc3741d2a7f903e842902d8f756ba0002819421aa64bc3f7681d918ac9bb91fb3c9ef3adea6d1b121e73ed54707986b05d559f8d4161d2bc24baf022af4b65d326e2f5bf1757277db7c7e96834d6b560b5b24acefca0d652956c8b0e452d65a8b062457c5dc81b5c8176152c2b89d57165764608caf245ef1e244c37127e77fb2d9f2b67e9636d011317b4d54066e6d0c71da934b02cedc9e69bfe8494b4f4b38d29d64a68ba8663db64f325595d8e922ac4cf3938c941d3cc3e465a02895b3b9812f73158cc1e1ad004f2d7e90e9800e4fdd6cf83fe108e083388ef88020ecdfd0e45ed0fe2c288639f739e86ca00211c39c56b81afedf123e496f8cff8ff7e3fb4cd71ffcfdc1add13b2dbe5fe1840f9da26a0e8f02a1d905c16570b14ddab131bd74e62eb2c55b4360c1313ab62f0002cfbce929446a4cac551cf062189f5539080c3b5d13e8cf0f19da26f7d67a08056bb86d5076ac2b5f48a759fd468349677a17523c7c741fb3f6d0c677d40e243985f44f98e13a9c0cae00fc35b65b707966ca8d4a4ef4cfbf1d852be7f4182f4e6d1fa7f839f687a7c8a0c469573a245fb52c347f6479ca739308c4bcf90113cf6a54b4f1a12822fbacedd65bf2204dd4febac40ee486a75f5351bc021f32149297d9200e523bdd43f91deb377d8a607aa01446686d07d0fb21985e3a133f0f382a7f8800406b2a80edcf3d848781e2dd78b2aaf5aa8387a8231f71fc6f7715044a291d6e9923d5582479dc70dc67c9d94d85aab2c74d5fe9270296ecc63528d3bcc79474189627ecf1b28ee2ec97d2bca18d416dfb731e92b8f5140624d61b91b9626e1ad6c29e9bdaf58a11f70d02062339716ca520a0b879266091abae248f89f1c46f3ba8ce256a57122975ab93f7691d347846aae66c62ec5a509a330ba0e96d1ae32554df6c38aa27efbcf35eb69675c8c9a773d07fb8ea942bc8f905915916cff4029e2bef6da769ceb47a61df1dc324f9c1daf944c0424bd3507902cef75d8ce602a58ccf84f29840b0205c413f33a15f32322f0d04002741aafc0ce2604118a6bfa1b0a8782a4b99fb0ac6177653d763a48d327ee69bb06536b808c024ec159ce50c0cae081491ea8b222fe2193ef64f1b5cbd5a3da1e7a37f7d1160f999dd304bbc22f4c1344f3f5023b1444deec72cd730c60ba0fcf0a8c1fb0786d0d766176fdefe0378eaed1f5f6b5041e1a0d02ae8538b64392d1ba4187e110c43ff9e022ab5a9c9678f4c7e0c1455075e87925878d7da19148a6548d52217b9ada82c3d81bd0861b5c34847ae36bd3e1845d2753daba22d4e9308c98697265ec7f59119864f73ddac61fbcee5d2df42a5003624c34ebda4c05919e8de51154eb8034bb7962174fb8e02d939ed1503afcc4ac98e290335e6571d6facefea1052c71c1c85a37dd8ff5ada5b6a4b828683d3b9b018a9e1d2342d8aae8fc38125d108daaf8dec298bc31242e36c27062fa6747b584540555395f564a465452a0b23a41b50d2bd9dca4935b2fbea931b1fb29bf006e7f95ea02c9decba9a2fb32c433716cb39fa5a76b2ee663549a5f7988b79a7e4280de037ffec943c5f6c8e25be965cf146fbdbc2700a9ed3d7aa49fe7896d31fd63c5c2780063119cf3fdf2bf6cdb435367c792af736e68804b6e4b12e3ea3a2ba0878a7b268d4d5161aaf18137c99d0abc977ddddbdafbfdb9e74680286a5650be8a4c9598f1aae8ce012235a9ae4cab2acdf238e1a6d872c151686a4124eccf69f8787d34ebd1d3dec112241024b0f06efe95323fc7b0a5b97deca39683f85b1cfc322c2bd08225b7582279717b47bc62cc8b6748bc151af50b8ff1d6fb4656523c1230c58d3885c4281016581943c0711ec1556a5e8851e2100cef5ff58ee9c56fa22c8c8755bb1f38d2a4f35bf34c2f10e87b2afb32a14b989c2d01153b4b0a63c38cdc2183ea902bc1def4f61cbc9c6a52bb73784303da0671ee31479e8f862a8c5755e6b00eb146d2a627b06a61ac896295b22e5eb388909a82bfaf57e9e190618e88a8f9290d11807f3747b4f395c8d5d642c5b0620ef3ed8715c3378f26d7ae86885ecd3a1f0a01c521aa172919ab3e394ee7b8c0da72c169e4764a1a0ce8416e4e2d3614a145005201e7e0fc097b52bf99d2d9eb9b722f2260f6740542022aa34e440bfd6926f05929dda30d9e9553d758430d919b4ad254c8097deab3fea2a821a9e385ea38a1db203e92f07c2e2b026f39c1755bf952f1752908f99f50e69cc3a2d6575ef290b7c43fcd5a40e9d8746e14cbe09edabdff4dbf915d277ad383b0659ffe1934f03c28841933757987087a700d8c49a78464d7ee41df3627597cfcab5903fe4f1131c2e652c49cca612efe07213ce59140e48742f2011f70015f27f2a5abb4932058a33ad359ca2e6b28a0f3145653e26a196e5a109a1f6adc19090f09e5215ab09f1eb55b506fcc3a7881f48fc6649b10f793d152f25bdd2ce1298941d508980005b2d185be866c6b43d77f57ae94be98abadb2668cc8a4952fa8d33db85c07e14cbb2e1b632517115271635dce03d050e60a650aa3015ba13f77152fcf2e1be04acb2307d0c85dfebabb52a8d0ae6a3f51942de828ebebe8694b0aee4801e0118bcebbb0b4859b325bf094b515e0e2b8446edcd946ff9461edfec159a44de2b24ff4d9b144a9f850fa87be4abe9de0217c2051cb1300364ae40cf0b50e9be3704d12d7c4555c18cde907f2a32cd8ff453dbcb7fa0c998bdb647dd80bf53fc380e8d70378e190222f1f26727c7fbaf7cfc8a7c6ea8cf866ba9f5dfeed368ad081b92074c829ab9ce4b40589a3d228308113731961b75bd21ddfbbda15d2465571e2e4aa1d59f616d58867252581f7aef115e4397e0d46ad45e0fa579d373fbb900ba32079f45c906581adf4b4970f5852d76987b6a0c6427285feb4c3a6ac3d92177ec870d8f916b380229cf508ae2d3f935696a1b776c89afe460990c7dd9e1116b9200867f74fbaea8542530c9d7d5e688ca382cb604ae66d0de5097a8fa4607f19aea56c38e39a35196f661b366cecc765dc864ec0688c916db894459b83b0405b12e4dc3be9de451ae3e0b66bbd5a3b7427c894adc234b4efee1ceb97a32191f8cee2eff0952957a90bc6a767314870c453da398c7412b617da59de9677b0a2df2808e4bebd7c213519ab82881667a717786d5f95ea8ff9570c95c7fde1f2a567eb18079d20beca1c1274e8e5112e0a34bb9490ff4645e450332f5eaa39015742eb45f0c4fb81d9212efa513fa4e37bbd0987672759391073bb1dba6a9921501f04e9a8133b6d4063e4ea8f967b54b5e4b762fb5c5408f205b011808ecd928d9898bcb19d89533ced00b49b16e0a9d0bfdf9e4ae8c1db25078c7104290bc07e0cd42352aeb8227c93512a1dd6b0b071cc133e0dbb52f3bb7f71575f69c4305dd49f804d828a379943a5e40ddad0daafe94a98c1e8667c0bfaa115affc10228fcf163b9bae3ea187189128cba08c877e12c25a55b5237e6df71cca1ac84270ec60b7aeeb011bc05d5f2d037e44db10c3e3b9cd26cebf963685b148e7b442910a711f182ccd9f5dc6c83557df3a67b26cd6edde42a4158a6309aa59dcb32fc1d974fd2f1925b744fac2fd75408269f3b2cc9531b5b1b71faebde78b584a0aa2cf32773c7627641ee762efade33f7e786bc8d7e341727c24d38b513ff639c3f12f12d6d0aa522615821b36e69e88149dc4395a952cd5938059b2420b74faaef20ca33159b64f1faead56176f0a460e3854360467a97c9d142c0eea8d76bec1b234375e4271381236e7b32ddf44c0a3e90f15b47f30ddb93634c2dc098eb1f5512b8db34fd01b165c0e6454c52b6894e49eb4a15aea1c859771cab312485dbe3232e9a04406d874ebbc99e836b81a8a21128c2b9fe3e087fd5876db5320be0c72bf9b191688df6933f53ddeed74c44b97cbe51cd1598d2b2386145ef0726800b1445ecf4e86e610a6ca5548e12dc69d18a16a6a5a1cd44b2cc1ead06413b19c72d9843f474b90fa0ce8afe51289fa297150b2f8d7b92506ac50d1c2bdd4daf810c279674cd1888fc3c109db8fd875991a2c05049977b0c16083b6c2d3929ebe82f14cd11e138aa9f2a0512b0d076fadc66b5d66d1ced2f29660374f1ec21c5d723352a379f08cc6047f2949144b66a22087cbafed26e76a8ff5c90559723e0b61c7373c2833c7b9749d07e098fc7328c823cd09e30aecf66b3d27045596575f906d98a275dd533732f83b13510ca593c1aa014086fa953ea6e7603932c1642ca305d6f851c574b6fbc93fed39f3cd5ec3ca0e4c7ce2d4f3bd2d7e8054b876acf09c4d0a8ab1c0399f65ea9cbf5243a92638bd3f5f4958af62ecd19e6c76f6f4c144e14364bed7b8546c9439dd77cb26c80d799c6b6f6c41f6fc18641b254e8372cd6b51a6ee7300f0ef01c0ccfefc0a98cbadffb240323b065c0d9a567a543a81c93b6e2dda6a73d9eb3ba91c0e527dae7ea714e463ac1a47eba2b235a99c17b1af0e07025487d31cb42d79b6ca486d437776a75e712685b293c17d70f6a0e2a10b80a252af985d12148bd0e72066b31d0025406e42d37f8b5ccd9417b86db1a2fcb627aee9ccfa7c3e33f56e500287aa0658f98c13eefd78476961ff6775b490eebb49b981e0a4c1b0ab5ed3185e93feb72dbe5a7ebd14cb0c139e332d6dc5f2fdec99a47806723d66615e4c8010db9cdb04955d98aa5495a2b850f0abb0f500f5d875c6a1ec5e6af778e386088d3f8b0e5863f6cc19a8fca025dc766eca5222b6638d60583041d7b82dec88c3634ea02d25178b152c66354caea0d13dc0b68054be39bd41cf8f5c9e32c5b8ae2291747dffdaa6fc6256fc9c6b495d7a732ca2bb4b4fbb9d06fc49d7d3a9fb575f7e69a96b5ae421c83e9f87ee2a28a14dd0a2a11f3ed37d1d520546ad5ccd36dc0dbbdccbdce311cf0118efcc853456ff84d1dd625319d3e9a572085a0c23e04c67bda7566f1fa6f4abaadcb30c36340cc10058484bb9314e848fe3896ee95bfb58b7c2a1bae1b1c6a6d9f70b545d357417724705f0401a0946308c748f74d83ce3763411abc8747753fc305a833562f52fd0df38a94fed7824ddf580b760f200e9cb879f5234ed7838971c15bae59fc8fd40e7a19c327e032ad163b6dc0fb50acfc75d8c367b2fa2a9da0a8e6352cbd40b30d947c1ff9feb668f11a9452bca022ed1af415866b42b21dc2016735914b9fbd2fbd347f665fe13131921604010678dbcce06c09f449355e8eee98421fe62fc51452eac1f41ca2f3cbd4b1241b2e7cd7d444ace75759671a95ce047cfaa0e2df09f25c455498a6723ea86022f3c450f1e6e16fae855d1fe0ba0cf7e488cf4033202e2bc9b20f7807ebfb60c592fd308b80625cc68b381f69fc42c421f26227a72376f3c5544c1ffec0886530761c76b6e8708ed25305f95fac228ac8617ce27720adc00191531d07ef3b6ca6df4cabd23249d78a610e3cfae48939c60cd482e824c5c75153d781d4cfd068d9735963ab1cc181284354c1673cc4db4c9428709b210ed0972ffa7e540e2483c02a601ac110227c2a16ac3a4c5bcf931c979f29dc0d5d00bf4dcb2aebd348497279ca477c81486b58fcc9f76e9ae0e175ff9b82062f359da3d0de142effe188d68a65232e8d7fa99dbe1e5c199ecdab3a1b996b012ac52bf1e800ce009dc33a581d0b411fc736fe163c16ac33f7a3e671ec0378c226ce5b2efc1f2187978e8e43289ecd6d198d858944b23c766266c0273090a6911d215977125757c404913f6441c0637fcd35c1a50b4ed3c3b3b2f054c1215d781100f9e1d8b3f48cab44b8396d5e6aac6750c1a6a3ef16a705cd9881f87272f317e25e5319462dd73d2a81bb782ce870e95843b00a82df96285e90adb26356a21cf65904fa693b83a23341025d0df38978f7c34ef4a9dbf1f7a4fdbc5cde624002facc9e2edaa963514f1c52732c31f9bd1b0de1f1e4b9e2823c244ca1a780f317aeece4805ff6537a169a4d612cf4ccea68eae109195e50053b8518d35d7fc82d38bf0f97176dea39f566202a8edbfdf27454f1733e6d2d5e7ceabdbd0ad2fc06c2dc6aab237c1f943fdf71e1eea2e54570a337945079a8a51883f8fb6947360b2de96ed3f523910aa00232e90c15794a3db21c6573b15826746db8c41aaef3", + "range_check_snark_proof": "0x1b200581ce1ccff3f92e35dddd962cbda546c1c03834ca56296e567de16461a4075d4eb1bcbb18879d8c84f3804c11e920660ae1c62e0acb20e476c903ae0a3a261b66db77d711fd90671890321022121affeaf8353d696bf4597a6d9fba617c1560b42a43ed84a13785aa23e8d95a604d7aed90b8a4dd41c15284ac81189b812d536e6e7be13957f2eb82d0ced26c44b76e3dee0b896af61f57575935a346871fb31cc9f50e9d5084bb0d2856c98aa13718b511415ecad0e00bbf66c8f6d90009b068aa48cacfb89f98f17d513735930d7a9ca7c72f5c47ca044d5f145a16721a3cd8678d4ff1328601f5246e8fdfa240975ca59d6553add481f1647dcef2a71f250fb136e25a6ac0884fc15417d2cc436a3b9fc7c57f1f4bd0353ea1249f411f7c76d365074a7c695d59edd2a7c5b9e1d9d2f1f851a3495ebbbcdf88a7e74d2cc291aad02f0ce6e69aac34cb88d35bb2f35f56f873060f47b840745d64ef950cde7ea63d577bbc926c6ebb9b10f3ba1082e6d0c17977c3dda4a9f4212f8a22000f603776df9e725b18eac4a405bd18a56cfe291e84c9b3ef90d7192d1d8b78027de76238369cc7e8759784685b5c0fb08a0a52058dcec38e4d67b64072636414b5494d7838057eb66259bb5c984e864a8b604d96d35790a7e079cc152679241cf6d45a7166853135d1ca333727e8b2353eb7e90ae8391783731d392a79063e28d451e54b553700b3a5d8f6b4fb2c069440b4e26d748d6a425b770433a47c6b03181db50c65bfcb472b070c9353228023f3766f536bc953b8c0b2ed54a879242874e7d166e7573897e65ffb943ee855df1a131f86c18da6126f551dc7e1ae192a693fae10d79f0d9d119b145871e6a6fc1143cd5b53f90a48f849727b79fab93048e2f14f00c297ade3227b32a5f2d19145d0c5c9f7ace1bef44481525a227e1f041a4fb26e18d77036ace80d4d29959a5654893185d6c6e9c1a66dcb0b874b007eeef5091b519b8e16e5877b0746d4bff497fa3022d30675d981ce513bed8628e0f67d71b6eea2c0047b1ef4b85a3ac0bf0462abc518a82ecc900f3f32ce6a21f30533df9e36688b94d1ff7c51f5530a36962556c9ec526fda390a6dec8f0502819520ddcc9722ef50731fdd0698e91d53764a0929bed7d7aab2246d287b612baf952b31fae1fd4270034332ed893d7d0ab181f7d9a68205570b60f99cfd19147ba2d8a835fae9f72a43c9db4c9a5dd3e0060fc69af8a1ec14da5c170eb12316c4f940985d6d3133f36b14e6da6ea88bacf4f26641cddf3a0a540bfe4198e2275b31cb08b7e45baadde23fb64b9bbc95e713fc1b55396a150e75b0038837c40d69af90e6144f5e7c0f2b12349f8a0acf52e21a8219aafe765d9d2f7724425a28e8c9e850b2b52a59a87ede18618b6aa8a10eac03a536e1b996767e0583839b11608307bfc8a7048e7069fe123e06ee9f72c2dcdb3c94d135f8a8f95bca6efb29a5ea36536bf72bb3039e04baddac9f49b8b46cabf9902f828b5a70416a4017005f6933903f821274efad4634fcc2ed4da97e43e6ca1eb07197920066f7d7bb115909765a3e1ea151a31f01c63e7930647424be324d3dc45458237194c38e1e1ffb93985978172ee13e425b627f9800c3eeb1a230540a67ad8d699d02227636029c959c26b504774a84ec7d2e64d7ad3f892f94c4fae8abb26935f2f2006b832af8d3a66febdcc3e5659fd28ff59ada6c7ae44f565e10e6f0a074d86402c6b4176c4853110edae31ee186904261ca3fb3794ac42f8a229422b0099486dc6e5f04314e7ec83fd1e051b33299b14c75ac2b2f5996b4ab0467c40d7978ea2c718d005dfc20f5a84b7b669ae47a3f8dc359417c62745a598ea53308377552579dea12f44b1f03372e42eb71af3e464148d4446b1c6768fc1eea18a20a7ac48d41b12cd41e17891dccaf592009218490a38c9a7b3596aa6ab9ecf4bfffce31eb125e2f339daf6e57f4093b6494784831c8846e0fe84536802805e273cbe14d8531dc12ef4ab51059fc94d959899a25ae31bcd868fca678ab710be698014ff31eee271a23055aa10c35cee8c5b9f6dc3e6277dc8742ab9db7049827e1dfa16be2d0f410e037716dd68a33493c79211c18755892db6d6a279405af7198af9e645d618724d3a287384bcd7bda940d5bfa11abde37d1e0adde6ab114aed31a05d9f2ef3924003f4918f100ddf49def61a1fc3362ddc863ef0c47edfa88444eb7e9912d9c01651316d0b3a50ae36c01955898e0533f18da2bca239959cf058a230c5ec8ad215a0df35d515b250ce2dcc58e738698d8f4ed6b4119fa04b5f224b581b2caa008a111bc65c68ad917ee74c11c57bd93414133c4f856d38d0196f26a686052b92bc59d15f547cab99b15904b5333d5d36a34bce08c8f1d0c88624d294a77d2b707e27dff709dcaa80aa6355b832e6fe4ea8492ca325551707b10f9e5bc5aab64092cd1c0fef6f4165a26c20f5c5d014432b3163fce63b2edfa62a260a40172182a928b6b21e05186bc2191cfb9862ebd6f1352ad66f1074c8f7daf06a4e3d777236e6efe6a555655996d7c1126607f9745d2c0d5466a2a5c83b7cee5ab324b0923e67df7d3799436d4435112ddd5c0abaf53d9fc2fc47734e0fd47b77e1f94ca29a14c3cc78915b9e0628c61b7d677faf49be039084d6db04afb75d5eea151cd2d21d59bc86e914bd9b3c98aff084c09fcac9b1290c5cca92f9771ca41ebbed40709fc41153455c8d86753e9752e34c29060148f8704607a6c3bd3dfddf6ceb72435f3ef8ca862b6eaae98b2fe29b51475cca9179ee06f542a044aa1e3e9d1ed1ff1f31fd1450f557ef56cb8dfe6620fe0aa7b9562e9faf479964d17c877834604ad3fe40204e4fe18ff27388a35200e07faaa9487b50d2b0afe02ffcf0ed6522f9d1d256ce6c89af49420fb379fd793c5e87a01c6541412ed0f348681c03c630b90a0e829e5c873ce97b70fe4f33aab122796c833a9e8aa15f81cc0f9d524e11ff88113a2e0325ab73455dd950276848d9f85aba0006a362c2f963cb473ba401af97c4e4d1bf6c9f70a194b41f27a145c8b69fc045953ae04296ec52bcd3b6e260d3a53f50d1f20c07f1200e2637fa545d1390ebd812771b9bebd6bb189e3990257ccaf91e84f211af01b415fb8d7d493a304cfb03824ff680b22f8ae609d621164ef9d70d88f64c9c48ef3265fdc81cd72940aa59a63c06fa63e79c74e5f2d00ce48d62a3536299dde64df718796e7425826cc487fdb1f179c61edeaf040280aa100f302519c2042d64cca4138eec8b33729f5dfc0a03e795d7cf570a8045e1eff836baf5f06c6c61cca266e976ea0eb122b5e6bd29f3c240645c5c2404e2513eb2b331f3802856bc83bbdc40a64ba6065d4a82663ac87dc08a6bc93e39e2f2767f750e2eab6e88032e0199cb35733e6ac0d17534cd413bab641f8a75534cf049faf9192f6b83cb439f5c5572aea5ce5d581371d4116f1c43ad60a1e3f163f2e15f81ab9597985951f0f063f86976b1077bbcefdf1e4d7fa477fdcc1e7d1390e260f969e8e2c7376b72fa5401ef62d30c409a2d7d579a8eb39c763c2fd84d121771983521ae3de3ad954507938271080cbf83231efb45e28c82d0cb47f1e88162e663c0d8a75e673f4b0e9d9aea6d2f82aa8c6204a695c7bf1b0f7a5bf46772faa8fb8a6e36ed22763eebf1427dd5a8c1da1bdd8fd14eca9d9e65601454ba4082a17f58d273c30f931af7885a25e8e4f2baa9f85dcc970f3cc97c946df591f09b78b7da9db60a8c54e6e1f6a030f1be20bef6e22d747c25e0d268ed3d9f93715b2a618cce6b02161dc00858ce2233068f3c83053eddb805596bd4c58466e96209f7299fdffeca7ff573e2fa41d5b8655626421145f467f05451ac19334b4260a0f443cd9704c549d8d4d96b2a1219ea4e66daec875bfd74f4bb0712e6ac5b22f6ff8564c9bb0907283b79e1dc87b48641d166c40c4e5448d4e8a84c20f120e1da1487aa706d72e4e205c36815c47675754b52b41e51fb237ae36274d12de2121ed49ec2a3cbc8ac40166687bf18acdf75e062b826b25050ebc62f402cbb21820b774f663dea6af4868efa2181eed9dc9321365a104dbe16d01ae67bcb80fe10428abe1a98b038c25a0e9fc54fec9c120a1eff63de904e6306bbfa99b6ee9ba18881a5354469eeb4feef89fa682dcdee62a33757a61d8efdde248a005442cc6247f38fe393a44f0812814b7be1f7d5ee0975060aa82a9e78602419eb5a8f6610723b52608263605d5dff29dbc80d514a99f3d0a9d4dacb07817995102047f1d29347b1317934162c2fd55c39831119eb40fa67e6f7e326fa1fa61122ceeca05144db4355935cb1d1762842b1f1e40423813cfd82113914c83966ad8486ddfcd1fe2390b2d01794e522a4c95d6483661bc24af467c5915ab1a5bf315cc7a2abb08627f170ee896b9015162a8a9d741847ed80e2848af9d632682dee79b61de361c0ba9d2513c8aa794495b3123989c10343db49ad6786f1716dde66d811974890806eea7d70f5154dba13a45816639d2c2dc2b17b6c0b3710c7deeded162de6e0c2f4b9f600209591d33208fd26e8d8c525b6f03931fc714c451b8c40d38f69d04694df2f4a14cbd76f97351c41d940c12dbc04ed654d8cf62f44afdf43dca752191c47a3cf7d2f3932c94a294538bbd2262dd65e25720de90e8f0db604192d1100da03880dbb08234529a77695c7fa3ca1b7cbbd1c347dbb0558dae5ef439ba1917cfa948c1c509f9a7e2ef3ba9d78503975d769c1934b78c741c74fc36c7a106c6942af654bbae1ddfeee473492411ea6d23f7094d280c83869a00ecda054c1992416c6808c8941b3407c22fceb6800eb8b1da9e78b4af5ed9b80af86e2351049341e779893782438dd60920e6ea219aa20cb9189855f6e410548ff582511c1a7e25ef38919457e8e23d8e90f594c68816968ffd8d4fb39aa99467fb149ed529bbe7879d39b284bf9f009b71720f426a566c81848f7bbcbcbf37061e06357c2ee53ecdab1453c7cce77e2c06972e04825d2e4336b95a5609cb08fb693638910269a4f72095076b7d46dc24743fe951485d751282d0418cabeb16ac50444d861a27552c4d6b349fe034be3fc2e35087013ef76f871845ede39ba92386b08a6a0bf6b447d95e05ad65ba15a0b1a636b1a41d6b94fddede61528842ada317b4711bcc372e891ed3cc68634ee0ddad9bbd5c2fcf0ff74cbea665414f482faaeeae09383bfb526a0c9c18a80e93f2a9440a0c398ca9548d39f1ed352d464f0809ca0dba2e2521de785c977c7979c43269fd71ec56b9afae58cf35cc465fc88e168b15e2460234bf5b91183032f4dd8c3aa15d582fa1d17bb55e446292e68565a10a024a7bb44dc8ab203969ff6f5d2b1e2a7e208de5106350fa21ec5246ac5d20e40df1f8439af5f86a6002199b9082f878e7286c1071c6588341de511fac571f5513f7c058dfc614b4f570de2a62614351ea3e664e8971a7e5d63004c9026dd400052a97f9b59d3de75552b7185b5912be32f9a49cbb5cb8f3b716c4137911bdb006bc52868e283baca4692ba389032bfe9d0a700e2f47c14a104a4ea731cabc9e23a3dff6c06ceac32421283e96970dae4f22dc3848d3834f675bbda5ba3a436618b97e5277db6e1cf10d7eb5a49f0540dcf50fc9e469957df24d69a9e790eed20f18d2e8f8d535a388019d6ea8197fe373f663819fb47255677e5585892fc4d20859f6834baf37ac4d9989960790fdf08e0989859b76196fffcff9ab80e3df3905fabb664473c9476f71bd5ef2621ed47f76d076a3ff0fe27777073243b68eeb2a14ab9c57dd4fcf758b03a35f49da50238a7c0a464dd73823abe97ea44a97bc2bbec4ca8ae8bed8200bb2da0e2fca94839b3a7cd06c3f8a7fe341e2b1194ddf23b92500bc858bcf7365a1b4ea53bec3beef3ee71f41c148cd4c382b5e48cd9c16fac06e418ec1af458c8f5b658cc117893d685826985759c1500b28137461c00fc713188ce3264701d7376f588240430bc2a3a441cd811d77218385336781e01958b3b3e68c741d9a15e5ec4d4f591d0341f6270b7ebc262e0e4507c33a73442f8279c5d8f1a3fa68b892e74931532df4d030c30e728d32e9d3e364f578c89710d858432377e59e820ccd54fcef1fe1558a09d96c6758d425b20d61020dbcdf12fb55d12da9804179e37b5eb23de9077b73f10a4de909183782a36b65ec92442930f98bd428540c05622b2a545465c000bbd9b4e70f6f9faaf5af85730e7dd203ab945c07893c6096a8b2f457d092153b54369f007997883cc4430775a70d1718241c395063816dce07ea10d4baba9884b568382b7c0efd47d95d21f8d815441a978863e211e1611841e43049ff989aa3595e64052b448f633be2b2f5c1614227d9a49cf7c6f1b53c0aad1ac041d5c734fc3f2ca2830bd6886250ccb3031747251504c8850d9b3845a76b7b77e0cedd57694098b25b30aa62d26be5f435c7ae2404c804e3805870acea4b76fc9e08a2805549b478b9e9cc3379225fb40e755d10acb7167d639d02fc954d7dfb940d8f23320026967a5eaee125318b5d53046b27d81d57642b283e33b631c8d3f8d36ba43daa3ed16a793d3f5d78afefa136d02d76c7efef3836f37ef3318b0ef2b03a6e76151ba5bf4ceef026d6fae19b369a0cb3cc3debd9e28c13999fb73d6e6913064ce706f066b3735eb9b33c7ff59752164f50f5a2274c3f2abf4e499ec60a0c365c8d00d28909b9b032deeae5fb4b0904cdd16690c9631a25828559ab5d2ff25de31fc6cd68c5f474dcf1f99a8c6c770b20baf5752cc4937046638161fafe364b8d3e2ff83024540a0c1794346e27221b4d0fb61d725325f48465ddc9250922e8784b6740fe9e3e594ff29d84a6e18b0f5c9f0895d79912e990bfbf032e29717962423ef29e5d301e7f6df98b302ef811fe513641dc7844134461fe40bd7122588ee3b5ed9bfe78ea04e4ea585eef2d248d9a64528b632f0a5e570c242dc3188c8b3cc536c7e6248fbf74e28be9baf810f6fec952208765498c1fad4de6bb42a2a60d4eb5f84c76357fb527777f320805a00fe719cad11599aa48c6ea066a8818cfe25ca6041ce3de19e319b48ef7bc30395f7ca65c24d6c6a898742cd1ed8858bf4a3f1e8d0ff948351b860768f8b52440e6f08ce61f0c72d813d09eafb2e702ee1b5a70acbd1c5dd6d06ea2d125af13e9c56d652434e16633d851b80969521d4e32e209a0caedc6b8422cf4f0c57f1a809e252787f9f6d88f9f60273268286b3d5e4ddfb534fae863dd381ef919152b9a220f12b3890b1e1a312919e9776a292c3b4bac2ff35b180d5d83232321b60d9dc75397d11aaa6d151a96028edd8060d23c3b3bd15d179e113a10b14eff8a1f27bfae91aa88a9fa6d7243244e1c1c77bbe9b28bdfd0ebcf0f0eb79b99771b0c02446010ee5bdff5d215283109f54fab077adf59a5961d48105b5c95402f3129d7b10968df0858e798858e96acacc3ba49e02dd8afaafbc45ebd0a89363365", "grand_sums_batch_proof": "0x17e2032176f6575e95aa4d9d97293edf675fd8aad89e76d99883b4a830564e7d2ca14616b46c35c4573a4e5806a7fde693b0da39ca285023e93c2e3ee781b78b18c815403ccb3ac8188e4a1b761df4504068402c880e4a687311455818ed4ca32367d0768c54895acb9875b2b2f60d85102d455cc28f0d9d2af67ecaa4ac662f", "total_balances": [ "0x87f3e", diff --git a/prover/bin/gen_commit_and_proofs.rs b/prover/bin/gen_commit_and_proofs.rs index 69f2973b..4d65d74e 100644 --- a/prover/bin/gen_commit_and_proofs.rs +++ b/prover/bin/gen_commit_and_proofs.rs @@ -69,7 +69,7 @@ fn main() { .unwrap(); // Create a proof - let instances = vec![Fp::one(); 1]; // This instance is necessary to verify proof on solidity verifier. + let instances = vec![Fp::zero(); 1]; // This instance is necessary to verify proof on solidity verifier. let (zk_snark_proof, advice_polys, omega) = full_prover( ¶ms, &pk, diff --git a/prover/bin/gen_verifier.rs b/prover/bin/gen_verifier.rs index 3adffb7f..ea0c5810 100644 --- a/prover/bin/gen_verifier.rs +++ b/prover/bin/gen_verifier.rs @@ -69,7 +69,7 @@ fn main() { // 2. Generate Snark Proof for range check // // the instance values has to be at least more than one due to verifier contract that generated from SolidityGenerator. - let instances: Vec = vec![Fp::one(); 1]; + let instances: Vec = vec![Fp::zero(); 1]; let mut transcript = Keccak256Transcript::new(Vec::new()); let result = create_proof::<_, ProverSHPLONK<_>, _, _, _, _>( diff --git a/prover/bin/inclusion_proof_solidity_calldata.json b/prover/bin/inclusion_proof_solidity_calldata.json index b03c6c66..92130cc1 100644 --- a/prover/bin/inclusion_proof_solidity_calldata.json +++ b/prover/bin/inclusion_proof_solidity_calldata.json @@ -1,5 +1,5 @@ { - "proof": "0x1cf73eacc39744861854164c392927ef969ac1e260ec93a96dfa56631368d537210409230fbe5305d545db5e98981fa8566b2370c13f50cba157d847f73f75a50938c672375247acf7a110224e1f3d0e118b289a02c8b4a0acd33a8d209dbebc01895e90be59da66f1de8e8a144047936e7393e312fbbcfe11960be9de661277150f79ec188c492fc71556342c001c2cdf89aca2df24b2f68514e1742185c2021f0479d9e8e1a3e1c14e2bac6af1c5ebd3d6c5b35c230c0cc92c554cc245a9d5", + "proof": "0x0faaa8aa92bf36e2601bdd9d5be92bb5c7aa6f982661cff0611d0bd8ccccb9bd171586516226f99958cdb181eecdfb1ce9bd48e5ae3c19aea353c163c7acf1db0938c672375247acf7a110224e1f3d0e118b289a02c8b4a0acd33a8d209dbebc01895e90be59da66f1de8e8a144047936e7393e312fbbcfe11960be9de661277150f79ec188c492fc71556342c001c2cdf89aca2df24b2f68514e1742185c2021f0479d9e8e1a3e1c14e2bac6af1c5ebd3d6c5b35c230c0cc92c554cc245a9d5", "challenges": [ "0xf79a0045992596e3278606b5317aaf4f6bb65071219b1c89d542509fe6dddd3", "0x2299faaf0e21893e99005dc9165fba869b5aa88bcac5af4395071fd569686fde", diff --git a/prover/examples/chunked_univariate_grand_sum.rs b/prover/examples/chunked_univariate_grand_sum.rs index bc5c4f7b..4ca6dc99 100644 --- a/prover/examples/chunked_univariate_grand_sum.rs +++ b/prover/examples/chunked_univariate_grand_sum.rs @@ -2,7 +2,6 @@ use std::error::Error; use halo2_proofs::halo2curves::bn256::{Fr as Fp, G1Affine}; -use halo2_proofs::halo2curves::group::cofactor::CofactorCurveAffine; use halo2_proofs::halo2curves::group::Curve; use halo2_proofs::transcript::TranscriptRead; use halo2_proofs::{ diff --git a/prover/src/chips/range/range_check.rs b/prover/src/chips/range/range_check.rs index 0ade154c..27c59194 100644 --- a/prover/src/chips/range/range_check.rs +++ b/prover/src/chips/range/range_check.rs @@ -12,6 +12,8 @@ use std::fmt::Debug; /// # Fields /// /// * `zs`: Four advice columns - contain the truncated right-shifted values of the element to be checked +/// * `z0`: An advice column - for storing the zero value from the instance column +/// * `instance`: An instance column - zero value provided to the circuit /// /// # Assumptions /// @@ -36,7 +38,7 @@ pub struct RangeCheckU64Config { /// /// z | zs[0] | zs[1] | zs[2] | zs[3] | /// --------- | ---------- | ---------- | ---------- | ---------- | -/// 0x1f2f3f4f5f6f7f8f | 0x1f2f3f4f5f6f | 0x1f2f3f4f | 0x1f2f | 0x00 | +/// 0x1f2f3f4f5f6f7f8f | 0x1f2f3f4f5f6f | 0x1f2f3f4f | 0x1f2f | 0x00 | /// /// Column zs[0], at offset 0, contains the truncated right-shifted value z - ks[0] / 2^16 (shift right by 16 bits) where ks[0] is the 0-th decomposition big-endian of the element to be checked /// Column zs[1], at offset 0, contains the truncated right-shifted value zs[0] - ks[1] / 2^16 (shift right by 16 bits) where ks[1] is the 1-th decomposition big-endian of the element to be checked @@ -52,7 +54,7 @@ pub struct RangeCheckU64Config { /// zs[i] - 2^16⋅zs[i+1] = ks[i] ∈ range_u16 /// /// 3. -/// zs[3] == 0 +/// zs[3] == z0 #[derive(Debug, Clone)] pub struct RangeCheckU64Chip { config: RangeCheckU64Config, @@ -113,6 +115,7 @@ impl RangeCheckU64Chip { pub fn assign( &self, region: &mut Region<'_, Fp>, + zs: &mut Vec>, element: &AssignedCell, ) -> Result<(), Error> { // Decompose the element in 4 byte pairs. @@ -123,7 +126,6 @@ impl RangeCheckU64Chip { .transpose_vec(4); // Initalize an empty vector of cells for the truncated right-shifted values of the element to be checked. - let mut zs = Vec::with_capacity(4); let mut z = element.clone(); // Calculate 1 / 2^16 @@ -146,9 +148,6 @@ impl RangeCheckU64Chip { zs.push(z.clone()); } - // Constrain the final running sum output to be zero. - region.constrain_constant(zs[3].cell(), Fp::from(0))?; - Ok(()) } } diff --git a/prover/src/chips/range/tests.rs b/prover/src/chips/range/tests.rs index 36af7442..9b826100 100644 --- a/prover/src/chips/range/tests.rs +++ b/prover/src/chips/range/tests.rs @@ -2,7 +2,7 @@ use crate::chips::range::range_check::{RangeCheckU64Chip, RangeCheckU64Config}; use halo2_proofs::{ circuit::{AssignedCell, Layouter, SimpleFloorPlanner, Value}, halo2curves::bn256::Fr as Fp, - plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Fixed, Selector}, + plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Fixed, Instance, Selector}, poly::Rotation, }; @@ -89,6 +89,7 @@ pub struct TestConfig { pub addchip_config: AddConfig, pub range_check_config: RangeCheckU64Config, pub range_u16: Column, + pub instance: Column, } // The test circuit takes two inputs a and b. @@ -130,6 +131,9 @@ impl Circuit for TestCircuit { let add_selector = meta.selector(); + let instance = meta.instance_column(); + meta.enable_equality(instance); + let range_check_config = RangeCheckU64Chip::configure(meta, c, zs, range_u16); let addchip_config = AddChip::configure(meta, a, b, c, add_selector); @@ -139,6 +143,7 @@ impl Circuit for TestCircuit { addchip_config, range_check_config, range_u16, + instance, } } } @@ -173,15 +178,17 @@ impl Circuit for TestCircuit { let addchip = AddChip::construct(config.addchip_config); let (_, _, c) = addchip.assign(self.a, self.b, layouter.namespace(|| "add chip"))?; + let mut zs = Vec::with_capacity(4); // Perform the range check layouter.assign_region( || "Perform range check on c", |mut region| { - range_chip.assign(&mut region, &c)?; + range_chip.assign(&mut region, &mut zs, &c)?; Ok(()) }, )?; + layouter.constrain_instance(zs[3].cell(), config.instance, 0)?; Ok(()) } @@ -213,7 +220,7 @@ mod testing { let b = Fp::from(1); let circuit = TestCircuit { a, b }; - let prover = MockProver::run(k, &circuit, vec![]).unwrap(); + let prover = MockProver::run(k, &circuit, vec![vec![Fp::zero()]]).unwrap(); prover.assert_satisfied(); } @@ -231,14 +238,10 @@ mod testing { let b = Fp::from(2); let circuit = TestCircuit { a, b }; - let invalid_prover = MockProver::run(k, &circuit, vec![]).unwrap(); + let invalid_prover = MockProver::run(k, &circuit, vec![vec![Fp::zero()]]).unwrap(); assert_eq!( invalid_prover.verify(), Err(vec![ - VerifyFailure::Permutation { - column: (Any::Fixed, 1).into(), - location: FailureLocation::OutsideRegion { row: 0 } - }, VerifyFailure::Permutation { column: (Any::advice(), 6).into(), location: FailureLocation::InRegion { @@ -246,6 +249,10 @@ mod testing { offset: 0 } }, + VerifyFailure::Permutation { + column: (Any::Instance, 0).into(), + location: FailureLocation::OutsideRegion { row: 0 } + }, ]) ); } diff --git a/prover/src/circuits/tests.rs b/prover/src/circuits/tests.rs index 6641cf99..a2a8867a 100644 --- a/prover/src/circuits/tests.rs +++ b/prover/src/circuits/tests.rs @@ -34,7 +34,8 @@ mod test { let (entries, circuit, pk, _, params) = set_up::<9, N_USERS, N_CURRENCIES, NoRangeCheckConfig>(path); - let (_, advice_polys, omega) = full_prover(¶ms, &pk, circuit.clone(), &[vec![]]); + let (_, advice_polys, omega) = + full_prover(¶ms, &pk, circuit.clone(), &[vec![Fp::zero()]]); // Select the first user balance polynomial for the example let f_poly = advice_polys.advice_polys.get(1).unwrap(); @@ -137,11 +138,31 @@ mod test { UnivariateGrandSumConfig, >::init(entries.to_vec()); - let valid_prover = MockProver::run(K, &circuit, vec![vec![]]).unwrap(); + let valid_prover = MockProver::run(K, &circuit, vec![vec![Fp::zero()]]).unwrap(); assert_eq!(valid_prover.verify_par(), Ok(())) } + #[test] + fn test_invalid_instance_value_univariate_grand_sum_prover() { + let path = "../csv/entry_16.csv"; + + let mut entries: Vec> = vec![Entry::init_empty(); N_USERS]; + let mut cryptos = vec![Cryptocurrency::init_empty(); N_CURRENCIES]; + parse_csv_to_entries::<&str, N_CURRENCIES>(path, &mut entries, &mut cryptos).unwrap(); + + let circuit = UnivariateGrandSum::< + N_USERS, + N_CURRENCIES, + UnivariateGrandSumConfig, + >::init(entries.to_vec()); + + let valid_prover = MockProver::run(K, &circuit, vec![vec![Fp::one()]]).unwrap(); + + let invalid_result = valid_prover.verify_par().unwrap_err()[0].to_string(); + assert!(invalid_result.contains("Equality constraint not satisfied")); + } + #[test] fn test_valid_univariate_grand_sum_full_prover() { let path = "../csv/entry_16.csv"; @@ -164,7 +185,7 @@ mod test { // The Custodian generates the ZK-SNARK Halo2 proof that commits to the user entry values in advice polynomials // and also range-checks the user balance values let (zk_snark_proof, advice_polys, omega) = - full_prover(¶ms, &pk, circuit.clone(), &[vec![]]); + full_prover(¶ms, &pk, circuit.clone(), &[vec![Fp::zero()]]); // Both the Custodian and the Verifier know what column range are the balance columns // (The first column is the user IDs) @@ -210,7 +231,12 @@ mod test { // 2. Verification phase // The Verifier verifies the ZK proof - assert!(full_verifier(¶ms, &vk, &zk_snark_proof, &[vec![]])); + assert!(full_verifier( + ¶ms, + &vk, + &zk_snark_proof, + &[vec![Fp::zero()]] + )); // The Verifier is able to independently extract the omega from the verification key let omega = pk.get_vk().get_domain().get_omega(); @@ -277,7 +303,7 @@ mod test { // 1. Proving phase // The Custodian generates the ZK proof let (zk_snark_proof, advice_polys, omega) = - full_prover(¶ms, &pk, circuit.clone(), &[vec![]]); + full_prover(¶ms, &pk, circuit.clone(), &[vec![Fp::zero()]]); // The Custodian creates a KZG batch proof of the 4th user ID & balances inclusion let user_index = 3_u16; @@ -302,7 +328,12 @@ mod test { // 2. Verification phase // The Verifier verifies the ZK proof - assert!(full_verifier(¶ms, &vk, &zk_snark_proof, &[vec![]])); + assert!(full_verifier( + ¶ms, + &vk, + &zk_snark_proof, + &[vec![Fp::zero()]] + )); // The Verifier is able to independently extract the omega from the verification key let omega = pk.get_vk().get_domain().get_omega(); @@ -348,7 +379,7 @@ mod test { // The Custodian generates the ZK-SNARK Halo2 proof that commits to the user entry values in advice polynomials // and also range-checks the user balance values let (zk_snark_proof, advice_polys, _) = - full_prover(¶ms, &pk, circuit.clone(), &[vec![]]); + full_prover(¶ms, &pk, circuit.clone(), &[vec![Fp::zero()]]); // Both the Custodian and the Verifier know what column range are the balance columns // (The first column is the user IDs) @@ -372,7 +403,12 @@ mod test { // 2. Verification phase // The Verifier verifies the ZK proof - assert!(full_verifier(¶ms, &vk, &zk_snark_proof, &[vec![]])); + assert!(full_verifier( + ¶ms, + &vk, + &zk_snark_proof, + &[vec![Fp::zero()]] + )); // The Custodian communicates the (invalid) polynomial length to the Verifier let invalid_poly_length = 2 ^ u64::from(K) - 1; @@ -412,23 +448,29 @@ mod test { UnivariateGrandSumConfig, >::init(entries.to_vec()); - let invalid_prover = MockProver::run(K, &circuit, vec![vec![]]).unwrap(); + let invalid_prover = MockProver::run(K, &circuit, vec![vec![Fp::zero()]]).unwrap(); assert_eq!( invalid_prover.verify(), Err(vec![ VerifyFailure::Permutation { - column: (Any::Fixed, 0).into(), - location: FailureLocation::OutsideRegion { row: 65536 } + column: (Any::advice(), 6).into(), + location: FailureLocation::InRegion { + region: (2, "Perform range check on balance 0 of user 0").into(), + offset: 0 + } }, VerifyFailure::Permutation { - column: (Any::Fixed, 0).into(), - location: FailureLocation::OutsideRegion { row: 65539 } + column: (Any::advice(), 6).into(), + location: FailureLocation::InRegion { + region: (6, "Perform range check on balance 0 of user 2").into(), + offset: 0 + } }, VerifyFailure::Permutation { - column: (Any::advice(), 6).into(), + column: (Any::advice(), 10).into(), location: FailureLocation::InRegion { - region: (2, "Perform range check on balance 0 of user 0").into(), + region: (3, "Perform range check on balance 1 of user 0").into(), offset: 0 } }, diff --git a/prover/src/circuits/univariate_grand_sum.rs b/prover/src/circuits/univariate_grand_sum.rs index fb8a9524..75f60b41 100644 --- a/prover/src/circuits/univariate_grand_sum.rs +++ b/prover/src/circuits/univariate_grand_sum.rs @@ -5,7 +5,7 @@ use crate::entry::Entry; use crate::utils::big_uint_to_fp; use halo2_proofs::circuit::{AssignedCell, Layouter, SimpleFloorPlanner, Value}; use halo2_proofs::halo2curves::bn256::Fr as Fp; -use halo2_proofs::plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Fixed}; +use halo2_proofs::plonk::{Advice, Circuit, Column, ConstraintSystem, Error, Fixed, Instance}; #[derive(Clone)] pub struct UnivariateGrandSum< @@ -63,6 +63,7 @@ where balances: [Column; N_CURRENCIES], range_check_configs: [RangeCheckU64Config; N_CURRENCIES], range_u16: Column, + instance: Column, } impl CircuitConfig @@ -84,6 +85,9 @@ where // Create an empty array of range check configs let mut range_check_configs = Vec::with_capacity(N_CURRENCIES); + let instance = meta.instance_column(); + meta.enable_equality(instance); + for item in balances.iter().take(N_CURRENCIES) { let z = *item; // Create 4 advice columns for each range check chip @@ -98,14 +102,12 @@ where range_check_configs.push(range_check_config); } - let instance = meta.instance_column(); - meta.enable_equality(instance); - Self { username, balances, range_check_configs: range_check_configs.try_into().unwrap(), range_u16, + instance, } } @@ -146,13 +148,21 @@ where // Perform range check on the assigned balances for i in 0..N_USERS { for j in 0..N_CURRENCIES { + let mut zs = Vec::with_capacity(4); + layouter.assign_region( || format!("Perform range check on balance {} of user {}", j, i), |mut region| { - range_check_chips[j].assign(&mut region, &assigned_balances[i][j])?; + range_check_chips[j].assign( + &mut region, + &mut zs, + &assigned_balances[i][j], + )?; Ok(()) }, )?; + + layouter.constrain_instance(zs[3].cell(), self.instance, 0)?; } } diff --git a/prover/src/utils/dummy_entries.rs b/prover/src/utils/dummy_entries.rs index c01d74dc..f566b9c0 100644 --- a/prover/src/utils/dummy_entries.rs +++ b/prover/src/utils/dummy_entries.rs @@ -6,8 +6,7 @@ use std::error::Error; use crate::entry::Entry; // This is for testing purposes with a large dataset instead of using a CSV file -pub fn generate_dummy_entries(// entries: &mut [Entry], - // cryptocurrencies: &mut [Cryptocurrency], +pub fn generate_dummy_entries( ) -> Result>, Box> { // Ensure N_CURRENCIES is greater than 0. if N_CURRENCIES == 0 { @@ -33,8 +32,6 @@ pub fn generate_dummy_entries(/ #[cfg(test)] mod tests { use super::*; - use crate::cryptocurrency::Cryptocurrency; - use crate::entry::Entry; #[test] fn test_generate_random_entries() {