diff --git a/Cargo.lock b/Cargo.lock index aeef97515b..a1694f802d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8330,6 +8330,7 @@ dependencies = [ "ethers-contract-derive", "futures", "hotshot", + "hotshot-contract-adapter", "hotshot-events-service", "hotshot-orchestrator", "hotshot-query-service", diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json new file mode 100644 index 0000000000..f2010d5f44 --- /dev/null +++ b/contract-bindings/artifacts/LightClientMock_bytecode.json @@ -0,0 +1 @@ +"0x60a0604052306080523480156200001557600080fd5b5060405162005a8338038062005a8383398101604081905262000038916200041b565b6200004262000056565b6200004e82826200010a565b5050620004ee565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a75760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001075780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b81516001600160401b03161515806200012f575060208201516001600160401b031615155b806200013d57506080820151155b806200014b575060a0820151155b8062000159575060c0820151155b8062000167575060e0820151155b8062000177575063ffffffff8116155b1562000196576040516350dd03f760e11b815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a8154816001600160401b0302191690836001600160401b03160217905550806000806101000a81548163ffffffff021916908363ffffffff16021790555060006200038483620003a160201b60201c565b600181905560e09093015160028190556003939093555050600455565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b80516001600160401b03811681146200040157600080fd5b919050565b805163ffffffff811681146200040157600080fd5b6000808284036101208112156200043157600080fd5b610100808212156200044257600080fd5b60405191508082016001600160401b03811183821017156200047457634e487b7160e01b600052604160045260246000fd5b6040526200048285620003e9565b82526200049260208601620003e9565b602083015260408501516040830152606085015160608301526080850151608083015260a085015160a083015260c085015160c083015260e085015160e0830152819350620004e381860162000406565b925050509250929050565b60805161556b6200051860003960008181610d2401528181610d4d0152610ecc015261556b6000f3fe60806040526004361061012a5760003560e01c806376671808116100ab578063a244d5961161006f578063a244d596146104d2578063aa922732146104f2578063ad3cb1cc14610512578063ca6fe85514610550578063f068205414610566578063f2fde38b1461059857600080fd5b8063766718081461036e57806376b6b7cb146103ad5780637f17baad146103c357806382d07ff3146104765780638da5cb5b1461048b57600080fd5b80634847ae5d116100f25780634847ae5d146102985780634f1ef2861461031b57806352d1902d1461032e5780636282773314610343578063715018a61461035957600080fd5b80630d8e6e2c1461012f578063202a0adb14610161578063382b215a1461020c5780633949d1e914610230578063409939b714610278575b600080fd5b34801561013b57600080fd5b506040805160018152600060208201819052918101919091526060015b60405180910390f35b34801561016d57600080fd5b5061020a61017c366004614fa2565b6000805463ffffffff600160401b918290041682526005602081815260409384902085518154928701516001600160401b039081169095026001600160801b0319909316941693909317178255918301516001820155606083015160028201556080830151600382015560a0830151600482015560c08301519181019190915560e090910151600690910155565b005b34801561021857600080fd5b5061022260035481565b604051908152602001610158565b34801561023c57600080fd5b5061020a61024b366004614fbf565b600080546001600160401b03909216600160601b0267ffffffffffffffff60601b19909216919091179055565b34801561028457600080fd5b5061020a610293366004615028565b6105b8565b3480156102a457600080fd5b506102ad6107e6565b60405161015891906000610100820190506001600160401b038084511683528060208501511660208401525060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b61020a6103293660046151f9565b610879565b34801561033a57600080fd5b50610222610898565b34801561034f57600080fd5b5061022260025481565b34801561036557600080fd5b5061020a6108b5565b34801561037a57600080fd5b5060005461039590600160601b90046001600160401b031681565b6040516001600160401b039091168152602001610158565b3480156103b957600080fd5b5061022260015481565b3480156103cf57600080fd5b506104306103de3660046152b2565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006909501546001600160401b0380861697600160401b9096041695939492939192919088565b604080516001600160401b03998a168152989097166020890152958701949094526060860192909252608085015260a084015260c083015260e082015261010001610158565b34801561048257600080fd5b506102ad6108c9565b34801561049757600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b039091168152602001610158565b3480156104de57600080fd5b5061020a6104ed3660046152cd565b610959565b3480156104fe57600080fd5b5061022261050d366004614fa2565b610a96565b34801561051e57600080fd5b50610543604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101589190615338565b34801561055c57600080fd5b5061022260045481565b34801561057257600080fd5b506000546105839063ffffffff1681565b60405163ffffffff9091168152602001610158565b3480156105a457600080fd5b5061020a6105b336600461536b565b610ade565b6105c06108c9565b5182516001600160401b0391821691161115806105fe57506105e06108c9565b602001516001600160401b031682602001516001600160401b031611155b1561061c5760405163051c46ef60e01b815260040160405180910390fd5b600080546106419063ffffffff811690600160601b90046001600160401b031661539c565b6000805463ffffffff600160401b91829004168252600560205260409091205491925090046001600160401b03908116908216148015816106975750816001600160401b031684602001516001600160401b0316115b156106c55760405163036466bf60e31b81526001600160401b03831660048201526024015b60405180910390fd5b6106d28460400151610b1c565b6106df8460600151610b1c565b6106ec8460800151610b1c565b6106f98460a00151610b1c565b6107068460c00151610b1c565b801561071457610714610b7a565b61071e8484610cc2565b6000805463ffffffff600160401b9182900416825260056020818152604093849020885181548a8401516001600160401b039081169687026001600160801b03199092169216918217178255898601516001830181905560608b0151600284015560808b0151600384015560a08b0151600484015560c08b01519483019490945560e08a015160069092019190915593519182529192917fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6910160405180910390a350505050565b6107ee614ae3565b5060008054640100000000900463ffffffff1681526005602081815260409283902083516101008101855281546001600160401b038082168352600160401b90910416928101929092526001810154938201939093526002830154606082015260038301546080820152600483015460a08201529082015460c082015260069091015460e082015290565b610881610d19565b61088a82610dbe565b6108948282610dff565b5050565b60006108a2610ec1565b5060008051602061551f83398151915290565b6108bd610f0a565b6108c76000610f65565b565b6108d1614ae3565b506000805463ffffffff600160401b918290041682526005602081815260409384902084516101008101865281546001600160401b038082168352959004909416918401919091526001810154938301939093526002830154606083015260038301546080830152600483015460a083015282015460c082015260069091015460e082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b031660008115801561099e5750825b90506000826001600160401b031660011480156109ba5750303b155b9050811580156109c8575080155b156109e65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a1057845460ff60401b1916600160401b1785555b610a1986610fd6565b610a21610fe7565b600080546bffffffffffffffff000000001916600160401b179055610a468888610fef565b8315610a8c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b60808082015160a083015160c0840151604080516020810194909452830191909152606082015260009101604051602081830303815290604052805190602001209050919050565b610ae6610f0a565b6001600160a01b038116610b1057604051631e4fbdf760e01b8152600060048201526024016106bc565b610b1981610f65565b50565b60008051602061553f8339815191528110806108945760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c64000000000060448201526064016106bc565b6000805463ffffffff600160401b9182900416825260056020818152604080852081516101008101835281546001600160401b038082168352969004909516928501929092526001820154908401526002810154606084015260038101546080840152600481015460a08401529081015460c08301526006015460e0820152610c0290610a96565b600380546001908155908290556004805460025560008054600160401b810463ffffffff16825260056020526040822060060154909255929350909190600c90610c5d908490600160601b90046001600160401b03166153bf565b82546101009290920a6001600160401b03818102199093169183160217909155600054604051600160601b90910490911681527fdb3558259e039d7e50e816b9dcce30fb114d8a9c86eca5ab14b60194d6945d3f91506020015b60405180910390a150565b6000610ccc611277565b90506000610cd984611858565b9050610cf682828560405180602001604052806000815250611a15565b610d13576040516309bde33960e01b815260040160405180910390fd5b50505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610da057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610d9460008051602061551f833981519152546001600160a01b031690565b6001600160a01b031614155b156108c75760405163703e46dd60e11b815260040160405180910390fd5b610dc6610f0a565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d90602001610cb7565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610e59575060408051601f3d908101601f19168201909252610e56918101906153df565b60015b610e8157604051634c9c8ce360e01b81526001600160a01b03831660048201526024016106bc565b60008051602061551f8339815191528114610eb257604051632a87526960e21b8152600481018290526024016106bc565b610ebc8383611aca565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108c75760405163703e46dd60e11b815260040160405180910390fd5b33610f3c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108c75760405163118cdaa760e01b81523360048201526024016106bc565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b610fde611b20565b610b1981611b69565b6108c7611b20565b81516001600160401b0316151580611013575060208201516001600160401b031615155b8061102057506080820151155b8061102d575060a0820151155b8061103a575060c0820151155b80611047575060e0820151155b80611056575063ffffffff8116155b15611074576040516350dd03f760e11b815260040160405180910390fd5b81600560008060049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e0820151816006015590505081600560008060089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b0316021790555060208201518160000160086101000a8154816001600160401b0302191690836001600160401b0316021790555060408201518160010155606082015181600201556080820151816003015560a0820151816004015560c0820151816005015560e08201518160060155905050600080600c6101000a8154816001600160401b0302191690836001600160401b03160217905550806000806101000a81548163ffffffff021916908363ffffffff160217905550600061125a83610a96565b600181905560e09093015160028190556003939093555050600455565b61127f614b3a565b620100008152600860208201527f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee816040820151527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b6020604083015101527f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d6060820151527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c6020606083015101527f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac86080820151527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d36020608083015101527f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c83960a0820151527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea602060a083015101527f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce760c0820151527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b6602060c083015101527f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a660e0820151527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d602060e083015101527f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f610100820151527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b602061010083015101527f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e08610120820151527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c14602061012083015101527f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e7610140820151527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba602061014083015101527f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba655022610160820151527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f602061016083015101527f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df2610180820151527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e602061018083015101527f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f76101a0820151527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b60206101a083015101527f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec736101c0820151527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc2860206101c083015101527f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508036101e0820151527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d4569091582460206101e083015101527f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a610200820151527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf602061020083015101527f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db44610220820151527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab602061022083015101527f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a75610240820151527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be1602061024083015101527f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9610260820151527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab3706020610260830151015290565b604080516008808252610120820190925260609160009190602082016101008036833701905050905060025481600081518110611897576118976153f8565b60200260200101818152505082600001516001600160401b0316816001815181106118c4576118c46153f8565b60200260200101818152505082602001516001600160401b0316816002815181106118f1576118f16153f8565b602002602001018181525050826040015181600381518110611915576119156153f8565b602002602001018181525050826060015181600481518110611939576119396153f8565b60209081029190910181019190915260008054600160401b900463ffffffff1681526005918290526040902060030154825190918391811061197d5761197d6153f8565b60209081029190910181019190915260008054600160401b900463ffffffff168152600590915260409020600401548151829060069081106119c1576119c16153f8565b60209081029190910181019190915260008054600160401b900463ffffffff168152600591829052604090200154815182906007908110611a0457611a046153f8565b602090810291909101015292915050565b6000611a2083611b71565b60005b8451811015611a5657611a4e858281518110611a4157611a416153f8565b6020026020010151610b1c565b600101611a23565b50604080516001808252818301909252600091816020015b611a76614db8565b815260200190600190039081611a6e579050509050611a9786868686611ca9565b81600081518110611aaa57611aaa6153f8565b6020026020010181905250611abe81611e01565b9150505b949350505050565b611ad38261257b565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611b1857610ebc82826125e0565b610894612658565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166108c757604051631afcd79f60e31b815260040160405180910390fd5b610ae6611b20565b8051611b7c90612677565b611b898160200151612677565b611b968160400151612677565b611ba38160600151612677565b611bb08160800151612677565b611bbd8160a00151612677565b611bca8160c00151612677565b611bd78160e00151612677565b611be5816101000151612677565b611bf3816101200151612677565b611c01816101400151612677565b611c0f816101600151612677565b611c1d816101800151612677565b611c2b816101a00151610b1c565b611c39816101c00151610b1c565b611c47816101e00151610b1c565b611c55816102000151610b1c565b611c63816102200151610b1c565b611c71816102400151610b1c565b611c7f816102600151610b1c565b611c8d816102800151610b1c565b611c9b816102a00151610b1c565b610b19816102c00151610b1c565b611cb1614db8565b8460200151845114611cd6576040516320fa9d8960e11b815260040160405180910390fd5b6000611ce48686868661270f565b90506000611cf587600001516128dd565b90506000611d08828460a0015189612ca8565b60408051601e8082526103e0820190925291925060009190602082016103c080368337505060408051601e8082526103e082019092529293506000929150602082015b6040805180820190915260008082526020820152815260200190600190039081611d4b5790505090506000611d848b858b898787612d08565b60a087015160608701519192509060008051602061553f833981519152600081838509604080516101008101825260e09c8d0151815260208101969096528501525050506060810191909152608081019290925260a082015261016087015160c08201526101809096015192860192909252509295945050505050565b805160009060008051602061553f833981519152600180831115611e7857611e27614e0b565b60005b84811015611e6a57611e62878281518110611e4757611e476153f8565b60200260200101516000015183612d3190919063ffffffff16565b600101611e2a565b50611e7481612d3b565b9150505b604080518082019091526000808252602082015260408051808201909152600080825260208201526000611ead86600261540e565b6001600160401b03811115611ec457611ec4614e7f565b604051908082528060200260200182016040528015611eed578160200160208202803683370190505b5090506000611efd87600261540e565b6001600160401b03811115611f1457611f14614e7f565b604051908082528060200260200182016040528015611f5957816020015b6040805180820190915260008082526020820152815260200190600190039081611f325790505b509050600160005b88811015612098578184611f7683600261540e565b81518110611f8657611f866153f8565b6020026020010181815250508a8181518110611fa457611fa46153f8565b602002602001015160c0015183826002611fbe919061540e565b81518110611fce57611fce6153f8565b60200260200101819052506000808c8381518110611fee57611fee6153f8565b6020026020010151600001519050898185099150818661200f85600261540e565b61201a906001615425565b8151811061202a5761202a6153f8565b60200260200101818152505050508a818151811061204a5761204a6153f8565b602002602001015160e0015183826002612064919061540e565b61206f906001615425565b8151811061207f5761207f6153f8565b6020026020010181905250878783099150600101611f61565b506120a38284612e68565b94505050506060806000896000815181106120c0576120c06153f8565b60200260200101516080015151905060008a518260026120e09190615425565b6120ea919061540e565b6120f5906001615425565b9050806001600160401b0381111561210f5761210f614e7f565b604051908082528060200260200182016040528015612138578160200160208202803683370190505b509350806001600160401b0381111561215357612153614e7f565b60405190808252806020026020018201604052801561219857816020015b60408051808201909152600080825260208201528152602001906001900390816121715790505b509250600091508190506001815b8c5181101561242d5760005b8d6000815181106121c5576121c56153f8565b602002602001015160800151518110156122a65760008e83815181106121ed576121ed6153f8565b602002602001015160800151828151811061220a5761220a6153f8565b6020026020010151905060008c82860990508089878151811061222f5761222f6153f8565b60200260200101818152505050508d828151811061224f5761224f6153f8565b602002602001015160a00151818151811061226c5761226c6153f8565b6020026020010151868581518110612286576122866153f8565b602090810291909101015261229c600185615425565b93506001016121b2565b5060008d82815181106122bb576122bb6153f8565b602002602001015160200151905060008b8285099050808886815181106122e4576122e46153f8565b60200260200101818152505050508c8181518110612304576123046153f8565b602002602001015160c00151858481518110612322576123226153f8565b6020908102919091010152612338600184615425565b925060008d828151811061234e5761234e6153f8565b602002602001015160000151905060008e8381518110612370576123706153f8565b602002602001015160400151905060008c8d838509860990508089878151811061239c5761239c6153f8565b6020026020010181815250505050508c81815181106123bd576123bd6153f8565b602002602001015160e001518584815181106123db576123db6153f8565b60209081029190910101526123f1600184615425565b925060008d8281518110612407576124076153f8565b60200260200101516060015190508a8b828509860894508a8a84099250506001016121a6565b5061243783612f62565b858381518110612449576124496153f8565b602002602001018181525050612481604080518082018252600080825260209182015281518083019092526001825260029082015290565b848381518110612493576124936153f8565b60200260200101819052506124b06124ab8587612e68565b612f94565b95505050505050600060405180608001604052807f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b081526020017f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c181526020017f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5581526020017f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4815250905061256f83828461256a61300f565b6130e0565b98975050505050505050565b806001600160a01b03163b6000036125b157604051634c9c8ce360e01b81526001600160a01b03821660048201526024016106bc565b60008051602061551f83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516125fd9190615438565b600060405180830381855af49150503d8060008114612638576040519150601f19603f3d011682016040523d82523d6000602084013e61263d565b606091505b509150915061264d8583836131c2565b925050505b92915050565b34156108c75760405163b398979f60e01b815260040160405180910390fd5b805160208201516000916000805160206154ff83398151915291159015161561269f57505050565b825160208401518260038485858609850908838283091483821084841016169350505081610ebc5760405162461bcd60e51b815260206004820152601760248201527f426e3235343a20696e76616c696420473120706f696e7400000000000000000060448201526064016106bc565b61275760405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b61275f614e0b565b60008051602061553f8339815191526127788285613221565b61278382888861324b565b84516127909083906134d7565b60208501516127a09083906134d7565b60408501516127b09083906134d7565b60608501516127c09083906134d7565b60808501516127d09083906134d7565b6127d982612d3b565b506127e382612d3b565b60608401526127f182612d3b565b608084015260a08501516128069083906134d7565b61280f82612d3b565b835260c08501516128219083906134d7565b60e08501516128319083906134d7565b6101008501516128429083906134d7565b6101208501516128539083906134d7565b6101408501516128649083906134d7565b61286d82612d3b565b60a084015261287c82866134ee565b61288582612d3b565b60c084015261016085015161289b9083906134d7565b6101808501516128ac9083906134d7565b6128b582612d3b565b60e0840152825181818009828282096020860191909152604085015250919695505050505050565b61290f6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b8162010000036129a357506040805160a0810182526010815260208101929092527f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c1001908201527eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b760608201527f0b5d56b77fe704e8e92338c0082f37e091126414c830e4c6922d5ac802d842d4608082015290565b816202000003612a3857506040805160a0810182526011815260208101929092527f30643640b9f82f90e83b698e5ea6179c7c05542e859533b48b9953a2f5360801908201527f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e560608201527f244cf010c43ca87237d8b00bf9dd50c4c01c7f086bd4e8c920e75251d96f0d22608082015290565b816204000003612acd57506040805160a0810182526012815260208101929092527f30644259cd94e7dd5045d7a27013b7fcd21c9e3b7fa75222e7bda49b729b0401908201527f19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e060608201527f036853f083780e87f8d7c71d111119c57dbe118c22d5ad707a82317466c5174c608082015290565b816208000003612b6257506040805160a0810182526013815260208101929092527f3064486657634403844b0eac78ca882cfd284341fcb0615a15cfcd17b14d8201908201527f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd60608201527f06e402c0a314fb67a15cf806664ae1b722dbc0efe66e6c81d98f9924ca535321608082015290565b816210000003612bf757506040805160a0810182526014815260208101929092527f30644b6c9c4a72169e4daa317d25f04512ae15c53b34e8f5acd8e155d0a6c101908201527f26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da95333785760608201527f100c332d2100895fab6473bc2c51bfca521f45cb3baca6260852a8fde26c91f3608082015290565b81602003612c8a57506040805160a0810182526005815260208101929092527f2ee12bff4a2813286a8dc388cd754d9a3ef2490635eba50cb9c2e5e750800001908201527f09c532c6306b93d29678200d47c0b2a99c18d51b838eeb1d3eed4c533bb512d060608201527f2724713603bfbd790aeaf3e7df25d8e7ef8f311334905b4d8c99980cf210979d608082015290565b60405163e2ef09e560e01b815260040160405180910390fd5b919050565b612ccc60405180606001604052806000815260200160008152602001600081525090565b612cd68484613584565b808252612ce690859085906135d8565b60208201528051612cfc9085908490869061363c565b60408201529392505050565b600080612d16858789613792565b9050612d2688868989888861387e565b61256f818786613b8a565b6108948282613bda565b60208181015180519082015183516040516000948594612d6394909390929091869101615454565b60405160208183030381529060405280519060200120905060008360200151600060028110612d9457612d946153f8565b60200201518460200151600160028110612db057612db06153f8565b602002015185600001516001604051602001612dcf9493929190615454565b604051602081830303815290604052805190602001209050818460200151600060028110612dff57612dff6153f8565b602002018181525050808460200151600160028110612e2057612e206153f8565b602002018181525050611ac2612e638383604051602001612e4b929190918252602082015260400190565b60405160208183030381529060405260006030613c0d565b613d1a565b60408051808201909152600080825260208201528251825114612ecd5760405162461bcd60e51b815260206004820181905260248201527f4d534d206572726f723a206c656e67746820646f6573206e6f74206d6174636860448201526064016106bc565b612f0b83600081518110612ee357612ee36153f8565b602002602001015183600081518110612efe57612efe6153f8565b6020026020010151613d90565b905060015b8251811015612f5b57612f5182612f4c868481518110612f3257612f326153f8565b6020026020010151868581518110612efe57612efe6153f8565b613e34565b9150600101612f10565b5092915050565b6000612f7c60008051602061553f8339815191528361549a565b6126529060008051602061553f8339815191526154bc565b6040805180820190915260008082526020820152815160208301511590151615612fbc575090565b6040518060400160405280836000015181526020016000805160206154ff8339815191528460200151612fef919061549a565b613007906000805160206154ff8339815191526154bc565b905292915050565b61303a6040518060800160405280600081526020016000815260200160008152602001600081525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b60008060006040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e08201526020850151610100820152845161012082015260608501516101408201526040850151610160820152602060006101808360085afa9150506000519150806131b65760405162461bcd60e51b815260206004820152601c60248201527f426e3235343a2050616972696e6720636865636b206661696c6564210000000060448201526064016106bc565b50151595945050505050565b6060826131d7576131d282613edb565b61321a565b81511580156131ee57506001600160a01b0384163b155b1561321757604051639996b31560e01b81526001600160a01b03851660048201526024016106bc565b50805b9392505050565b8151604051613235919083906020016154cf565b60408051601f1981840301815291905290915250565b60fe61328c8461328761325d84613f04565b60405160200161326f91815260200190565b60405160208183030381529060405260006004613c0d565b613221565b6132ca846132876132a08660000151613f04565b6040516020016132b291815260200190565b60405160208183030381529060405260006008613c0d565b6132de846132876132a08660200151613f04565b6132e9846001613bda565b613313847f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a613bda565b61333d847f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025613bda565b613367847f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a613bda565b613391847f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881613bda565b61339f848460e001516134d7565b6133ae848461010001516134d7565b6133bd848461012001516134d7565b6133cc848461014001516134d7565b6133db848461016001516134d7565b6133ea848461018001516134d7565b6133f984846101e001516134d7565b613408848461020001516134d7565b613417848461022001516134d7565b613426848461024001516134d7565b61343584846101a001516134d7565b61344484846101c001516134d7565b613453848461026001516134d7565b6134618484604001516134d7565b61346f8484606001516134d7565b61347d8484608001516134d7565b61348b848460a001516134d7565b613499848460c001516134d7565b60005b82518110156134d0576134c8858483815181106134bb576134bb6153f8565b6020026020010151613bda565b60010161349c565b5050505050565b60006134e282614049565b9050610ebc8382613221565b6134fd82826101a00151613bda565b61350c82826101c00151613bda565b61351b82826101e00151613bda565b61352a82826102000151613bda565b61353982826102200151613bda565b61354882826102400151613bda565b61355782826102600151613bda565b61356682826102800151613bda565b61357582826102a00151613bda565b61089482826102c00151613bda565b815160009060008051602061553f833981519152908380156135c85784935060005b828110156135bc578385860994506001016135a6565b506001840393506135cf565b6001830393505b50505092915050565b6000816000036135ea5750600061321a565b604084015160008051602061553f8339815191529060009082818609905085801561361a57600187039250613621565b6001840392505b5061362b826140c2565b915082828209979650505050505050565b60008160000361364e57506000611ac2565b8351604086015160008051602061553f83398151915291906000908190819081806136798d88614168565b90506000876001600160401b0381111561369557613695614e7f565b6040519080825280602002602001820160405280156136be578160200160208202803683370190505b509050888b850993506001925060005b8881101561370357602081026020840101519550898d878c0308965089878509602082810284010188905293506001016136ce565b5061370d836140c2565b925060005b888110156137805760208102602084010151955089868609975089848909975060005b8981101561375f57808214613757576020810260208401015197508a888a0998505b600101613735565b506020810260208f010151955089868909975089888c089a50600101613712565b50505050505050505050949350505050565b60008060008051602061553f8339815191529050600083602001519050600084604001519050600060019050606088015160808901516101a08901516102408a0151878889838709858501088609945050506101c08901516102608a0151878889838709858501088609945050506101e08901516102808a0151878889838709858501088609945050506102008901516102a08a01518788898387098585010886099450505061022089015191506102c0890151868782898587080985099350505050875160208901518586868309870385089650508485838309860387089998505050505050505050565b61388c86868686858761422d565b60c0850151825160008051602061553f833981519152919081908190869060149081106138bb576138bb6153f8565b6020026020010181815250508560000151846014815181106138df576138df6153f8565b60200260200101819052508282820990508085601581518110613904576139046153f8565b602002602001018181525050856020015184601581518110613928576139286153f8565b6020026020010181905250828282099050808560168151811061394d5761394d6153f8565b602002602001018181525050856040015184601681518110613971576139716153f8565b60200260200101819052508282820990508085601781518110613996576139966153f8565b6020026020010181815250508560600151846017815181106139ba576139ba6153f8565b602002602001018190525082828209905080856018815181106139df576139df6153f8565b602002602001018181525050856080015184601881518110613a0357613a036153f8565b60200260200101819052508282820990508085601981518110613a2857613a286153f8565b602002602001018181525050886040015184601981518110613a4c57613a4c6153f8565b60200260200101819052508282820990508085601a81518110613a7157613a716153f8565b602002602001018181525050886060015184601a81518110613a9557613a956153f8565b60200260200101819052508282820990508085601b81518110613aba57613aba6153f8565b602002602001018181525050886080015184601b81518110613ade57613ade6153f8565b60200260200101819052508282820990508085601c81518110613b0357613b036153f8565b6020026020010181815250508860a0015184601c81518110613b2757613b276153f8565b60200260200101819052508282820990508760e0015185601d81518110613b5057613b506153f8565b6020026020010181815250508560a0015184601d81518110613b7457613b746153f8565b6020026020010181905250505050505050505050565b60008051602061553f8339815191528381039060005b600a811015613bd15760206015820102840151602082026101a0018601518384828409860894505050600101613ba0565b50509392505050565b61089482613be783613f04565b604051602001613bf991815260200190565b604051602081830303815290604052613221565b606081613c1b81601f615425565b1015613c5a5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016106bc565b613c648284615425565b84511015613ca85760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b60448201526064016106bc565b606082158015613cc75760405191506000825260208201604052613d11565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015613d00578051835260209283019201613ce8565b5050858452601f01601f1916604052505b50949350505050565b6000805b8251811015613d8a5760008051602061553f8339815191526101008309915060008051602061553f833981519152838260018651613d5c91906154bc565b613d6691906154bc565b81518110613d7657613d766153f8565b016020015160f81c83089150600101613d1e565b50919050565b6040805180820190915260008082526020820152613dac614e25565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa90508080613dde57600080fd5b5080613e2c5760405162461bcd60e51b815260206004820152601960248201527f426e3235343a207363616c6172206d756c206661696c6564210000000000000060448201526064016106bc565b505092915050565b6040805180820190915260008082526020820152613e50614e43565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa90508080613e8d57600080fd5b5080613e2c5760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a2067726f7570206164646974696f6e206661696c65642100000060448201526064016106bc565b805115613eeb5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b60008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b60408277ffffffffffffffff0000000000000000ffffffffffffffff1916901c179050608081901b608082901c179050919050565b80516020820151606091600091159015161561406657600160fe1b175b60208301516000805160206154ff83398151915260019190911b1061408c5750600160ff1b5b8251614099908217613f04565b6040516020016140ab91815260200190565b604051602081830303815290604052915050919050565b600080600060008051602061553f833981519152905060405160208152602080820152602060408201528460608201526002820360808201528160a08201526020600060c08360055afa9250506000519250816141615760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c65642100000060448201526064016106bc565b5050919050565b6060826020015182111561418f57604051638c5e11f160e01b815260040160405180910390fd5b6060830151600160008051602061553f833981519152846001600160401b038111156141bd576141bd614e7f565b6040519080825280602002602001820160405280156141e6578160200160208202803683370190505b509350841519156135cf5760208401856020028101600182526020820191505b8082101561422257828585099350838252602082019150614206565b505050505092915050565b60008060008060008060008051602061553f83398151915290508060208b015160208d01510995508a5193508060a08c015160608d0151099250806101a08a0151840891508060808c015183089150808483099350807f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a84099150806101c08a0151830891508060808c015183089150808483099350807f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02584099150806101e08a0151830891508060808c015183089150808483099350807f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a84099150806102008a0151830891508060808c015183089150808483099350807f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88184099150806102208a0151830891508060808c0151830891508084830993508084870895508860a00151886000815181106143a4576143a46153f8565b602002602001018190525085876000815181106143c3576143c36153f8565b6020026020010181815250508060608c01518c51099450806102c08a015186099450806102408a015160608d0151099250806101a08a0151840892508060808c015184089250808386099450806102608a015160608d0151099250806101c08a0151840892508060808c015184089250808386099450806102808a015160608d0151099250806101e08a0151840892508060808c015184089250808386099450806102a08a015160608d0151099250806102008a0151840892508060808c0151840892508083860994508b60c00151886001815181106144a5576144a56153f8565b60209081029190910101526144ba85826154bc565b876001815181106144cd576144cd6153f8565b602002602001018181525050886101a00151876002815181106144f2576144f26153f8565b602002602001018181525050886101c0015187600381518110614517576145176153f8565b602002602001018181525050886101e001518760048151811061453c5761453c6153f8565b60200260200101818152505088610200015187600581518110614561576145616153f8565b6020026020010181815250508b60e0015188600281518110614585576145856153f8565b60200260200101819052508b6101000151886003815181106145a9576145a96153f8565b60200260200101819052508b6101200151886004815181106145cd576145cd6153f8565b60200260200101819052508b6101400151886005815181106145f1576145f16153f8565b6020026020010181905250806101c08a01516101a08b01510992508287600681518110614620576146206153f8565b6020026020010181815250508b610160015188600681518110614645576146456153f8565b6020026020010181905250806102008a01516101e08b01510992508287600781518110614674576146746153f8565b6020026020010181815250508b610180015188600781518110614699576146996153f8565b60200260200101819052506101a0890151925080838409915080828309915080828409925082876008815181106146d2576146d26153f8565b6020026020010181815250508b6101e00151886008815181106146f7576146f76153f8565b60200260200101819052506101c089015192508083840991508082830991508082840992508287600981518110614730576147306153f8565b6020026020010181815250508b610200015188600981518110614755576147556153f8565b60200260200101819052506101e089015192508083840991508082830991508082840992508287600a8151811061478e5761478e6153f8565b6020026020010181815250508b610220015188600a815181106147b3576147b36153f8565b602002602001018190525061020089015192508083840991508082830991508082840992508287600b815181106147ec576147ec6153f8565b6020026020010181815250508b610240015188600b81518110614811576148116153f8565b60200260200101819052508861022001518161482d91906154bc565b87600c81518110614840576148406153f8565b6020026020010181815250508b6101a0015188600c81518110614865576148656153f8565b6020026020010181905250600187600d81518110614885576148856153f8565b6020026020010181815250508b6101c0015188600d815181106148aa576148aa6153f8565b6020026020010181905250806101c08a01516101a08b0151099250806101e08a015184099250806102008a015184099250806102208a0151840992508287600e815181106148fa576148fa6153f8565b6020026020010181815250508b610260015188600e8151811061491f5761491f6153f8565b6020908102919091010152895161493690826154bc565b87600f81518110614949576149496153f8565b6020026020010181815250508860c0015188600f8151811061496d5761496d6153f8565b60200260200101819052508060018b510860a08c01519093508190800991508082840992508083602060100289015109915081876010815181106149b3576149b36153f8565b6020026020010181815250508860e00151886010815181106149d7576149d76153f8565b6020026020010181905250808360206011028901510991508187601181518110614a0357614a036153f8565b60200260200101818152505088610100015188601181518110614a2857614a286153f8565b6020026020010181905250808360206012028901510991508187601281518110614a5457614a546153f8565b60200260200101818152505088610120015188601281518110614a7957614a796153f8565b6020026020010181905250808360206013028901510991508187601381518110614aa557614aa56153f8565b60200260200101818152505088610140015188601381518110614aca57614aca6153f8565b6020026020010181905250505050505050505050505050565b60405180610100016040528060006001600160401b0316815260200160006001600160401b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061028001604052806000815260200160008152602001614b71604051806040016040528060008152602001600081525090565b8152602001614b93604051806040016040528060008152602001600081525090565b8152602001614bb5604051806040016040528060008152602001600081525090565b8152602001614bd7604051806040016040528060008152602001600081525090565b8152602001614bf9604051806040016040528060008152602001600081525090565b8152602001614c1b604051806040016040528060008152602001600081525090565b8152602001614c3d604051806040016040528060008152602001600081525090565b8152602001614c5f604051806040016040528060008152602001600081525090565b8152602001614c81604051806040016040528060008152602001600081525090565b8152602001614ca3604051806040016040528060008152602001600081525090565b8152602001614cc5604051806040016040528060008152602001600081525090565b8152602001614ce7604051806040016040528060008152602001600081525090565b8152602001614d09604051806040016040528060008152602001600081525090565b8152602001614d2b604051806040016040528060008152602001600081525090565b8152602001614d4d604051806040016040528060008152602001600081525090565b8152602001614d6f604051806040016040528060008152602001600081525090565b8152602001614d91604051806040016040528060008152602001600081525090565b8152602001614db3604051806040016040528060008152602001600081525090565b905290565b604051806101000160405280600081526020016000815260200160008152602001600081526020016060815260200160608152602001614d91604051806040016040528060008152602001600081525090565b604051806040016040528060608152602001614db3614e61565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b0381118282101715614eb857614eb8614e7f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614ee657614ee6614e7f565b604052919050565b80356001600160401b0381168114612ca357600080fd5b6000610100808385031215614f1957600080fd5b604051908101906001600160401b0382118183101715614f3b57614f3b614e7f565b81604052809250614f4b84614eee565b8152614f5960208501614eee565b602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015260c084013560c082015260e084013560e0820152505092915050565b60006101008284031215614fb557600080fd5b61321a8383614f05565b600060208284031215614fd157600080fd5b61321a82614eee565b600060408284031215614fec57600080fd5b604051604081018181106001600160401b038211171561500e5761500e614e7f565b604052823581526020928301359281019290925250919050565b60008082840361058081121561503d57600080fd5b6150478585614f05565b92506101006104808060ff198401121561506057600080fd5b615068614e95565b925061507687838801614fda565b835261014061508788828901614fda565b602085015261018061509b89828a01614fda565b60408601526101c06150af8a828b01614fda565b60608701526102006150c38b828c01614fda565b60808801526102406150d78c828d01614fda565b60a08901526102806150eb8d828e01614fda565b60c08a01526102c06150ff8e828f01614fda565b60e08b01526151128e6103008f01614fda565b898b01526151248e6103408f01614fda565b6101208b01526151388e6103808f01614fda565b878b015261514a8e6103c08f01614fda565b6101608b015261515e8e6104008f01614fda565b868b01526104408d01356101a08b01526104608d0135858b0152878d01356101e08b01526104a08d0135848b01526104c08d01356102208b01526104e08d0135838b01526105008d01356102608b01526105208d0135828b01526105408d01356102a08b01526105608d0135818b0152505050505050505050809150509250929050565b80356001600160a01b0381168114612ca357600080fd5b6000806040838503121561520c57600080fd5b615215836151e2565b91506020808401356001600160401b038082111561523257600080fd5b818601915086601f83011261524657600080fd5b81358181111561525857615258614e7f565b61526a601f8201601f19168501614ebe565b9150808252878482850101111561528057600080fd5b80848401858401376000848284010152508093505050509250929050565b803563ffffffff81168114612ca357600080fd5b6000602082840312156152c457600080fd5b61321a8261529e565b600080600061014084860312156152e357600080fd5b6152ed8585614f05565b92506152fc610100850161529e565b915061530b61012085016151e2565b90509250925092565b60005b8381101561532f578181015183820152602001615317565b50506000910152565b6020815260008251806020840152615357816040850160208701615314565b601f01601f19169190910160400192915050565b60006020828403121561537d57600080fd5b61321a826151e2565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216028082169190828114613e2c57613e2c615386565b6001600160401b03818116838216019080821115612f5b57612f5b615386565b6000602082840312156153f157600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b808202811582820484141761265257612652615386565b8082018082111561265257612652615386565b6000825161544a818460208701615314565b9190910192915050565b84815283602082015260008351615472816040850160208801615314565b60f89390931b6001600160f81b03191660409290930191820192909252604101949350505050565b6000826154b757634e487b7160e01b600052601260045260246000fd5b500690565b8181038181111561265257612652615386565b600083516154e1818460208801615314565b8351908301906154f5818360208801615314565b0194935050505056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a164736f6c6343000817000a" diff --git a/contract-bindings/src/lib.rs b/contract-bindings/src/lib.rs index 026d46bfd7..1dc3429611 100644 --- a/contract-bindings/src/lib.rs +++ b/contract-bindings/src/lib.rs @@ -8,6 +8,8 @@ pub mod fee_contract; pub mod hot_shot; pub mod i_plonk_verifier; pub mod light_client; +pub mod light_client_mock; pub mod light_client_state_update_vk; +pub mod light_client_state_update_vk_mock; pub mod plonk_verifier; pub mod shared_types; diff --git a/contract-bindings/src/light_client.rs b/contract-bindings/src/light_client.rs index 10dc6f30ab..60b8a1ca15 100644 --- a/contract-bindings/src/light_client.rs +++ b/contract-bindings/src/light_client.rs @@ -2762,27 +2762,4 @@ pub mod light_client { Hash, )] pub struct VotingThresholdReturn(pub ::ethers::core::types::U256); - ///`LightClientState(uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256)` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct LightClientState { - pub view_num: u64, - pub block_height: u64, - pub block_comm_root: ::ethers::core::types::U256, - pub fee_ledger_comm: ::ethers::core::types::U256, - pub stake_table_bls_key_comm: ::ethers::core::types::U256, - pub stake_table_schnorr_key_comm: ::ethers::core::types::U256, - pub stake_table_amount_comm: ::ethers::core::types::U256, - pub threshold: ::ethers::core::types::U256, - } } diff --git a/contract-bindings/src/light_client_mock.rs b/contract-bindings/src/light_client_mock.rs new file mode 100644 index 0000000000..cb437b813c --- /dev/null +++ b/contract-bindings/src/light_client_mock.rs @@ -0,0 +1,2915 @@ +pub use light_client_mock::*; +/// This module was auto-generated with ethers-rs Abigen. +/// More information at: +#[allow( + clippy::enum_variant_names, + clippy::too_many_arguments, + clippy::upper_case_acronyms, + clippy::type_complexity, + dead_code, + non_camel_case_types +)] +pub mod light_client_mock { + pub use super::super::shared_types::*; + #[allow(deprecated)] + fn __abi() -> ::ethers::core::abi::Abi { + ::ethers::core::abi::ethabi::Contract { + constructor: ::core::option::Option::Some(::ethers::core::abi::ethabi::Constructor { + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("genesis"), + kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("struct LightClient.LightClientState",), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("numBlockPerEpoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(32usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint32"), + ), + }, + ], + }), + functions: ::core::convert::From::from([ + ( + ::std::borrow::ToOwned::to_owned("UPGRADE_INTERFACE_VERSION"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("UPGRADE_INTERFACE_VERSION",), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::String, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("string"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("blocksPerEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("blocksPerEpoch"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(32usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint32"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("computeStakeTableComm"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("computeStakeTableComm",), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("state"), + kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "struct LightClient.LightClientState", + ), + ), + },], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes32"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("currentEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("currentEpoch"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("frozenStakeTableCommitment"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("frozenStakeTableCommitment",), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes32"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("frozenThreshold"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("frozenThreshold"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("getFinalizedState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("getFinalizedState"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "struct LightClient.LightClientState", + ), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("getGenesisState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("getGenesisState"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "struct LightClient.LightClientState", + ), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("getVersion"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("getVersion"), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("majorVersion"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint8"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("minorVersion"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint8"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("patchVersion"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(8usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint8"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("initialize"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("initialize"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("genesis"), + kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "struct LightClient.LightClientState", + ), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("numBlocksPerEpoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(32usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint32"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("owner"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("newFinalizedState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("newFinalizedState"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("newState"), + kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "struct LightClient.LightClientState", + ), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("proof"), + kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "struct IPlonkVerifier.PlonkProof", + ), + ), + }, + ], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("owner"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("owner"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("proxiableUUID"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("proxiableUUID"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes32"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("renounceOwnership"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("renounceOwnership"), + inputs: ::std::vec![], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("setCurrentEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("setCurrentEpoch"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("newEpoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("setFinalizedState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("setFinalizedState"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("state"), + kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "struct LightClient.LightClientState", + ), + ), + },], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("states"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("states"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("index"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(32usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint32"), + ), + },], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("viewNum"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blockHeight"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blockCommRoot"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("feeLedgerComm"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("stakeTableBlsKeyComm",), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("stakeTableSchnorrKeyComm",), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("stakeTableAmountComm",), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("threshold"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("transferOwnership"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("transferOwnership"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("newOwner"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + },], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("upgradeToAndCall"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("newImplementation"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("data"), + kind: ::ethers::core::abi::ethabi::ParamType::Bytes, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes"), + ), + }, + ], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("votingStakeTableCommitment"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("votingStakeTableCommitment",), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes32"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("votingThreshold"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("votingThreshold"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), + ]), + events: ::core::convert::From::from([ + ( + ::std::borrow::ToOwned::to_owned("EpochChanged"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("EpochChanged"), + inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + indexed: false, + },], + anonymous: false, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("Initialized"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("Initialized"), + inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("version"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + indexed: false, + },], + anonymous: false, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("NewState"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("NewState"), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("viewNum"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + indexed: true, + }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("blockHeight"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + indexed: true, + }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("blockCommRoot"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + indexed: false, + }, + ], + anonymous: false, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("OwnershipTransferred"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("OwnershipTransferred",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("previousOwner"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + indexed: true, + }, + ::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("newOwner"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + indexed: true, + }, + ], + anonymous: false, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("Upgrade"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("Upgrade"), + inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("implementation"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + indexed: false, + },], + anonymous: false, + },], + ), + ( + ::std::borrow::ToOwned::to_owned("Upgraded"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("Upgraded"), + inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("implementation"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + indexed: true, + },], + anonymous: false, + },], + ), + ]), + errors: ::core::convert::From::from([ + ( + ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("AddressEmptyCode"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("target"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + },], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("ERC1967InvalidImplementation"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("ERC1967InvalidImplementation",), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("implementation"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + },], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("ERC1967NonPayable"), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("FailedInnerCall"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("FailedInnerCall"), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("InvalidArgs"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("InvalidArgs"), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("InvalidInitialization"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("InvalidInitialization",), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("InvalidPolyEvalArgs"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("InvalidPolyEvalArgs",), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("InvalidProof"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("InvalidProof"), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("MissingLastBlockForCurrentEpoch"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("MissingLastBlockForCurrentEpoch",), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("expectedBlockHeight",), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("NotInitializing"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("NotInitializing"), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("OutdatedState"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("OutdatedState"), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("OwnableInvalidOwner"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("OwnableInvalidOwner",), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("owner"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + },], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("OwnableUnauthorizedAccount"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("OwnableUnauthorizedAccount",), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("account"), + kind: ::ethers::core::abi::ethabi::ParamType::Address, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("address"), + ), + },], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("UUPSUnauthorizedCallContext"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("UUPSUnauthorizedCallContext",), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("UUPSUnsupportedProxiableUUID"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("UUPSUnsupportedProxiableUUID",), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("slot"), + kind: ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bytes32"), + ), + },], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("UnsupportedDegree"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("UnsupportedDegree"), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("WrongPlonkVK"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("WrongPlonkVK"), + inputs: ::std::vec![], + },], + ), + ( + ::std::borrow::ToOwned::to_owned("WrongStakeTableUsed"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("WrongStakeTableUsed",), + inputs: ::std::vec![], + },], + ), + ]), + receive: false, + fallback: false, + } + } + ///The parsed JSON ABI of the contract. + pub static LIGHTCLIENTMOCK_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = + ::ethers::contract::Lazy::new(__abi); + #[rustfmt::skip] + const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15b\0\0\x15W`\0\x80\xFD[P`@Qb\0Z\x838\x03\x80b\0Z\x83\x839\x81\x01`@\x81\x90Rb\0\08\x91b\0\x04\x1BV[b\0\0Bb\0\0VV[b\0\0N\x82\x82b\0\x01\nV[PPb\0\x04\xEEV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0\xA7W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\x01\x07W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80b\0\x01/WP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80b\0\x01=WP`\x80\x82\x01Q\x15[\x80b\0\x01KWP`\xA0\x82\x01Q\x15[\x80b\0\x01YWP`\xC0\x82\x01Q\x15[\x80b\0\x01gWP`\xE0\x82\x01Q\x15[\x80b\0\x01wWPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15b\0\x01\x96W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0b\0\x03\x84\x83b\0\x03\xA1` \x1B` \x1CV[`\x01\x81\x90U`\xE0\x90\x93\x01Q`\x02\x81\x90U`\x03\x93\x90\x93UPP`\x04UV[`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[\x80Q`\x01`\x01`@\x1B\x03\x81\x16\x81\x14b\0\x04\x01W`\0\x80\xFD[\x91\x90PV[\x80Qc\xFF\xFF\xFF\xFF\x81\x16\x81\x14b\0\x04\x01W`\0\x80\xFD[`\0\x80\x82\x84\x03a\x01 \x81\x12\x15b\0\x041W`\0\x80\xFD[a\x01\0\x80\x82\x12\x15b\0\x04BW`\0\x80\xFD[`@Q\x91P\x80\x82\x01`\x01`\x01`@\x1B\x03\x81\x11\x83\x82\x10\x17\x15b\0\x04tWcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Rb\0\x04\x82\x85b\0\x03\xE9V[\x82Rb\0\x04\x92` \x86\x01b\0\x03\xE9V[` \x83\x01R`@\x85\x01Q`@\x83\x01R``\x85\x01Q``\x83\x01R`\x80\x85\x01Q`\x80\x83\x01R`\xA0\x85\x01Q`\xA0\x83\x01R`\xC0\x85\x01Q`\xC0\x83\x01R`\xE0\x85\x01Q`\xE0\x83\x01R\x81\x93Pb\0\x04\xE3\x81\x86\x01b\0\x04\x06V[\x92PPP\x92P\x92\x90PV[`\x80QaUkb\0\x05\x18`\09`\0\x81\x81a\r$\x01R\x81\x81a\rM\x01Ra\x0E\xCC\x01RaUk`\0\xF3\xFE`\x80`@R`\x046\x10a\x01*W`\x005`\xE0\x1C\x80cvg\x18\x08\x11a\0\xABW\x80c\xA2D\xD5\x96\x11a\0oW\x80c\xA2D\xD5\x96\x14a\x04\xD2W\x80c\xAA\x92'2\x14a\x04\xF2W\x80c\xAD<\xB1\xCC\x14a\x05\x12W\x80c\xCAo\xE8U\x14a\x05PW\x80c\xF0h T\x14a\x05fW\x80c\xF2\xFD\xE3\x8B\x14a\x05\x98W`\0\x80\xFD[\x80cvg\x18\x08\x14a\x03nW\x80cv\xB6\xB7\xCB\x14a\x03\xADW\x80c\x7F\x17\xBA\xAD\x14a\x03\xC3W\x80c\x82\xD0\x7F\xF3\x14a\x04vW\x80c\x8D\xA5\xCB[\x14a\x04\x8BW`\0\x80\xFD[\x80cHG\xAE]\x11a\0\xF2W\x80cHG\xAE]\x14a\x02\x98W\x80cO\x1E\xF2\x86\x14a\x03\x1BW\x80cR\xD1\x90-\x14a\x03.W\x80cb\x82w3\x14a\x03CW\x80cqP\x18\xA6\x14a\x03YW`\0\x80\xFD[\x80c\r\x8En,\x14a\x01/W\x80c *\n\xDB\x14a\x01aW\x80c8+!Z\x14a\x02\x0CW\x80c9I\xD1\xE9\x14a\x020W\x80c@\x999\xB7\x14a\x02xW[`\0\x80\xFD[4\x80\x15a\x01;W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01mW`\0\x80\xFD[Pa\x02\na\x01|6`\x04aO\xA2V[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x85Q\x81T\x92\x87\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x90\x95\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x93\x16\x94\x16\x93\x90\x93\x17\x17\x82U\x91\x83\x01Q`\x01\x82\x01U``\x83\x01Q`\x02\x82\x01U`\x80\x83\x01Q`\x03\x82\x01U`\xA0\x83\x01Q`\x04\x82\x01U`\xC0\x83\x01Q\x91\x81\x01\x91\x90\x91U`\xE0\x90\x91\x01Q`\x06\x90\x91\x01UV[\0[4\x80\x15a\x02\x18W`\0\x80\xFD[Pa\x02\"`\x03T\x81V[`@Q\x90\x81R` \x01a\x01XV[4\x80\x15a\x02#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\t\x9EWP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\t\xBAWP0;\x15[\x90P\x81\x15\x80\x15a\t\xC8WP\x80\x15[\x15a\t\xE6W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\n\x10W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\n\x19\x86a\x0F\xD6V[a\n!a\x0F\xE7V[`\0\x80Tk\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\x19\x16`\x01`@\x1B\x17\x90Ua\nF\x88\x88a\x0F\xEFV[\x83\x15a\n\x8CW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[a\n\xE6a\x0F\nV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x0B\x10W`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\0`\x04\x82\x01R`$\x01a\x06\xBCV[a\x0B\x19\x81a\x0FeV[PV[`\0\x80Q` aU?\x839\x81Q\x91R\x81\x10\x80a\x08\x94W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xBCV[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x80\x85 \x81Qa\x01\0\x81\x01\x83R\x81T`\x01`\x01`@\x1B\x03\x80\x82\x16\x83R\x96\x90\x04\x90\x95\x16\x92\x85\x01\x92\x90\x92R`\x01\x82\x01T\x90\x84\x01R`\x02\x81\x01T``\x84\x01R`\x03\x81\x01T`\x80\x84\x01R`\x04\x81\x01T`\xA0\x84\x01R\x90\x81\x01T`\xC0\x83\x01R`\x06\x01T`\xE0\x82\x01Ra\x0C\x02\x90a\n\x96V[`\x03\x80T`\x01\x90\x81U\x90\x82\x90U`\x04\x80T`\x02U`\0\x80T`\x01`@\x1B\x81\x04c\xFF\xFF\xFF\xFF\x16\x82R`\x05` R`@\x82 `\x06\x01T\x90\x92U\x92\x93P\x90\x91\x90`\x0C\x90a\x0C]\x90\x84\x90`\x01``\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16aS\xBFV[\x82Ta\x01\0\x92\x90\x92\n`\x01`\x01`@\x1B\x03\x81\x81\x02\x19\x90\x93\x16\x91\x83\x16\x02\x17\x90\x91U`\0T`@Q`\x01``\x1B\x90\x91\x04\x90\x91\x16\x81R\x7F\xDB5X%\x9E\x03\x9D~P\xE8\x16\xB9\xDC\xCE0\xFB\x11M\x8A\x9C\x86\xEC\xA5\xAB\x14\xB6\x01\x94\xD6\x94]?\x91P` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\0a\x0C\xCCa\x12wV[\x90P`\0a\x0C\xD9\x84a\x18XV[\x90Pa\x0C\xF6\x82\x82\x85`@Q\x80` \x01`@R\x80`\0\x81RPa\x1A\x15V[a\r\x13W`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\r\xA0WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a\r\x94`\0\x80Q` aU\x1F\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x08\xC7W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\r\xC6a\x0F\nV[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x0C\xB7V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x0EYWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x0EV\x91\x81\x01\x90aS\xDFV[`\x01[a\x0E\x81W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x06\xBCV[`\0\x80Q` aU\x1F\x839\x81Q\x91R\x81\x14a\x0E\xB2W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x06\xBCV[a\x0E\xBC\x83\x83a\x1A\xCAV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x08\xC7W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\x0F<\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\xC7W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x06\xBCV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\x0F\xDEa\x1B V[a\x0B\x19\x81a\x1BiV[a\x08\xC7a\x1B V[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x10\x13WP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x10 WP`\x80\x82\x01Q\x15[\x80a\x10-WP`\xA0\x82\x01Q\x15[\x80a\x10:WP`\xC0\x82\x01Q\x15[\x80a\x10GWP`\xE0\x82\x01Q\x15[\x80a\x10VWPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x10tW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x12Z\x83a\n\x96V[`\x01\x81\x90U`\xE0\x90\x93\x01Q`\x02\x81\x90U`\x03\x93\x90\x93UPP`\x04UV[a\x12\x7FaK:V[b\x01\0\0\x81R`\x08` \x82\x01R\x7F\x01=\x1DKBQy%\x8BWx`9yU\xCB\xFA\x08\x16\xE3+\x1C%\xA1\xFDsL\x91\xB9Q\xEE\x81`@\x82\x01QR\x7F\x16\xB8\x8D\xC7C\x9Am\x84\x1E\x1A\x11\x03\xF5\xA3\xD2\xD2D\x017\xF1\x8D\x02v5\x03\xBA\xC7\xB4]\xCB\x98;` `@\x83\x01Q\x01R\x7F\x0C<\x86O\x19_Y\x11\x99'\xF58W\xF1\xDE\x8B\xF5u\x94\x17H\xB755\x1F\xD3\x13s\xC7\x87\\-``\x82\x01QR\x7F\x16\x9B\xA1Q\x07\xF2\xEF\xF9\xB94\x1B\xF3\x07B\xA88\xD2}\xBDi\xE8\x8B#S\xDC\xA8Y/\x15\xF1\x11\x1C` ``\x83\x01Q\x01R\x7F\x11\xD4\xCE\xB1Ya\xD1\x0BaV\xAE=\t\xBBx\xB4\xDFE\xFB\x85C\x06\x08\x84\xE7\xD4\0u[\xEBJ\xC8`\x80\x82\x01QR\x7F\x03&\xFF\x069\x1E\xD5\xD2n\xC1\xBC\x08\x0B\x8DF\x01N\xE2,\x0Ch\xED\x02/\x16 \xC4\xD9\xD3\x847\xD3` `\x80\x83\x01Q\x01R\x7F#a\x0C\xB4>!\x03<6\x8A\x93b-\xD4\x05\xB9\x05\xA0\xEB4L\x98\xB9\xD7\xCF\x08\xB0\xC5\xEB\xF7\xC89`\xA0\x82\x01QR~\x13y4*Mw\xD4p\x87C\xAF\xF0\x1F\xF2z\xA1\x19\x17G\x8F\xDC\x8E+}F0\x81sWr\xEA` `\xA0\x83\x01Q\x01R\x7F\x19M\xAF\x85\xD9\xEE\xD9\x93{(\xE2\xA6\x80\xFC\xC5\xA7i\"\xC1\\\xD3\x1D\xC4\xF6\0\xE1I9\xB8 \x0C\xE7`\xC0\x82\x01QR\x7F%(\x0B\x12F$\x91\x1C\x7F\x87\xB4\xC2\xD8\x7FY\xC6\xC0~>\xEE\xB1\raM\xA2\x16\xF6!\x9F\xFEP\xB6` `\xC0\x83\x01Q\x01R\x7F\x04\x88.\xF3\x98\x99\xEA8\xC9gzH\xB8\xF8\xCCjg(N\x17\xFF\x94\x02\x89\xFA\xAA5\x9E\xEC\x9B3\xA6`\xE0\x82\x01QR\x7F\x1B\xAE\x9F6\xE6\x19\x078\xC7\x11P\x1B\xE5?)\x9B\xF6\x13H\xE6\x1E.\xF9\xD5wv\x0Ed\xF6)6\x8D` `\xE0\x83\x01Q\x01R\x7F-\x81\r0\x12\x0C\xB9>\x1A%K\x89\xED\n\xE8lv\x1FI\xB4\xF1)E\x9C\xD54\xF9U\x18Q5\x0Fa\x01\0\x82\x01QR\x7F\x0B%9M\xA5\xA1\xD45\xDA\xCC\xC2\xEA\xDD\x03\x9E,'\t\xF5\xF4/\xAB\xD9\xAF\xBA\x81^\xD6-j\xF3k` a\x01\0\x83\x01Q\x01R\x7F\x1C,\xE7\xBEW\x0B\xEA\x9EC\xF3\xD3\xD7\xCB\xCA\x84\xBD\xB4\xFC\x89\xB5:\xE6WS\x1D\xE7&p\xA6\x10^\x08a\x01 \x82\x01QR\x7F\x1A\x02U\xEC\x8C|\x87i3[\xC9\xDCk\"*\xC6\xA0Nvm\x08\xB4\\\x8C\xC5sY,\x05\xBC\x9C\x14` a\x01 \x83\x01Q\x01R\x7F\x1C\x16AY\x13k\x8F[Gs\xE13\xF4\x83\xA8\xA1\x92\xAB\x15\xD6\xD3\xEE\x01/\x17\x1B=\x02\xFDE\x06\xE7a\x01@\x82\x01QR\x7F'.\xB7\xD63\xCE\xDBh\xCE\x01\x13\xF4B\n\xB5a\x0B\x81\xB8\xBA\x1A\xB94\x8D\xB1Wa\xD4\x0E\x8D\xF5\xBA` a\x01@\x83\x01Q\x01R\x7F\x0EDf9\xAAl\xAF%\xE9>\xF7G\x08N9\xB8\xEA\x90\xAB\xF2;\xB4\x8C(\xFD_\x9B\xA7\xBAeP\"a\x01`\x82\x01QR\x7F\x03>\x19Z\x9E\xA3\xA9\xCE@\xB7+g:\xFBEDL\xA1\xB1_\x05C\xF4M\x10\xF5\xC6@\xA7\x80go` a\x01`\x83\x01Q\x01R\x7F\x0E\x8D\xB2\xB2\x89=\xF2=\xD6\x81y\x96\xF7_\x10\0\x9D\x99\"\x07\x93\xECsa\x01\xC0\x82\x01QR\x7F\x19\xEB\x12\xA7\x82|\r\xDFc\x83\xFE\x80l9S\xBD\x06\xB0\x8A\xAE{\xF2\xA0\x1FU\xC9\x86\xA8OP\xCC(` a\x01\xC0\x83\x01Q\x01R\x7F\x01V\x910\x88F\xE6\x8E\xA8V\xA2\xCB$\xC9\x90?\x0C\x86\x05\xDE\xA1\x90\x82\x91\x80\xFFk\xDD\x1Ce\x08\x03a\x01\xE0\x82\x01QR\x7F\x1F\xFDx\x9B\x15[\x8A\xCB\x13\xE0\xF6\xA4\x8BP\xF7\xAA\x80\x92T\x08\x88\xD0\t\x14\x10W\xD4V\x90\x91X$` a\x01\xE0\x83\x01Q\x01R\x7F\x05E\xACz\xA6m\xCF7\x19\x98\x848\xC8\x06\xFCbM\xE5z\xB4?\x85\x809/\x88\xC8l\x13x\xCEJa\x02\0\x82\x01QR\x7F\x16\xB7\xF2P\x84.\xCFN6\x90pj\x1E\x15-zW\xF7\x0FUo\x92\x07m\xA7\x85\xFD\xD3c\xC1\x9F\xCF` a\x02\0\x83\x01Q\x01R\x7F \xCB\x7F\xF3Z\x83\xA7\xDC1@6\xE4p\xF1L0\xFB\x0E\x98\xD3]f;$;\",\xAAo\xC7\xDBDa\x02 \x82\x01QR\x7F\x14\x9FAWDpth\xBD\xAAN\x85E \x1A\xB4\r\x191\xA7\xD3\x1F#v\x8F\xA7\xC6Ut\xEE>\xAB` a\x02 \x83\x01Q\x01R\x7F\n%\xC1\xB7W9\x06\xDCN\x19;N\xA8/\xD1\xFE|\xCE\xBCM\x92]\xAD&\xF0\xFF\t\xC8L\x9F\x1Aua\x02@\x82\x01QR\x7F\nR\x1F\xF3\x0C\x8F6fy\x8F\x84|]L7\x96X\xFB\xA1\x01V\xE7\xA9I\x9F'\x13\xFA\xE9\xBF+\xE1` a\x02@\x83\x01Q\x01R\x7F\x03\xDBe\x10\xC3\xF16)\xFD\xED\x9AZ-AeK\xBC\xE4\xEFm\x02L\xADS\x10\0Q\xD4\xA3\xF3\xEB\xC9a\x02`\x82\x01QR\x7F\x08\xE8\n\\\x8EL\x9B\x9F&\xF3\0<\xC5\x94\x03\xA1\x8D16\xAF\xD00\x86\x8D%\xCC\x8B\x80~*\xB3p` a\x02`\x83\x01Q\x01R\x90V[`@\x80Q`\x08\x80\x82Ra\x01 \x82\x01\x90\x92R``\x91`\0\x91\x90` \x82\x01a\x01\0\x806\x837\x01\x90PP\x90P`\x02T\x81`\0\x81Q\x81\x10a\x18\x97Wa\x18\x97aS\xF8V[` \x02` \x01\x01\x81\x81RPP\x82`\0\x01Q`\x01`\x01`@\x1B\x03\x16\x81`\x01\x81Q\x81\x10a\x18\xC4Wa\x18\xC4aS\xF8V[` \x02` \x01\x01\x81\x81RPP\x82` \x01Q`\x01`\x01`@\x1B\x03\x16\x81`\x02\x81Q\x81\x10a\x18\xF1Wa\x18\xF1aS\xF8V[` \x02` \x01\x01\x81\x81RPP\x82`@\x01Q\x81`\x03\x81Q\x81\x10a\x19\x15Wa\x19\x15aS\xF8V[` \x02` \x01\x01\x81\x81RPP\x82``\x01Q\x81`\x04\x81Q\x81\x10a\x199Wa\x199aS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 `\x03\x01T\x82Q\x90\x91\x83\x91\x81\x10a\x19}Wa\x19}aS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x90\x91R`@\x90 `\x04\x01T\x81Q\x82\x90`\x06\x90\x81\x10a\x19\xC1Wa\x19\xC1aS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 \x01T\x81Q\x82\x90`\x07\x90\x81\x10a\x1A\x04Wa\x1A\x04aS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x01R\x92\x91PPV[`\0a\x1A \x83a\x1BqV[`\0[\x84Q\x81\x10\x15a\x1AVWa\x1AN\x85\x82\x81Q\x81\x10a\x1AAWa\x1AAaS\xF8V[` \x02` \x01\x01Qa\x0B\x1CV[`\x01\x01a\x1A#V[P`@\x80Q`\x01\x80\x82R\x81\x83\x01\x90\x92R`\0\x91\x81` \x01[a\x1AvaM\xB8V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x1AnW\x90PP\x90Pa\x1A\x97\x86\x86\x86\x86a\x1C\xA9V[\x81`\0\x81Q\x81\x10a\x1A\xAAWa\x1A\xAAaS\xF8V[` \x02` \x01\x01\x81\x90RPa\x1A\xBE\x81a\x1E\x01V[\x91PP[\x94\x93PPPPV[a\x1A\xD3\x82a%{V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x1B\x18Wa\x0E\xBC\x82\x82a%\xE0V[a\x08\x94a&XV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x08\xC7W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\n\xE6a\x1B V[\x80Qa\x1B|\x90a&wV[a\x1B\x89\x81` \x01Qa&wV[a\x1B\x96\x81`@\x01Qa&wV[a\x1B\xA3\x81``\x01Qa&wV[a\x1B\xB0\x81`\x80\x01Qa&wV[a\x1B\xBD\x81`\xA0\x01Qa&wV[a\x1B\xCA\x81`\xC0\x01Qa&wV[a\x1B\xD7\x81`\xE0\x01Qa&wV[a\x1B\xE5\x81a\x01\0\x01Qa&wV[a\x1B\xF3\x81a\x01 \x01Qa&wV[a\x1C\x01\x81a\x01@\x01Qa&wV[a\x1C\x0F\x81a\x01`\x01Qa&wV[a\x1C\x1D\x81a\x01\x80\x01Qa&wV[a\x1C+\x81a\x01\xA0\x01Qa\x0B\x1CV[a\x1C9\x81a\x01\xC0\x01Qa\x0B\x1CV[a\x1CG\x81a\x01\xE0\x01Qa\x0B\x1CV[a\x1CU\x81a\x02\0\x01Qa\x0B\x1CV[a\x1Cc\x81a\x02 \x01Qa\x0B\x1CV[a\x1Cq\x81a\x02@\x01Qa\x0B\x1CV[a\x1C\x7F\x81a\x02`\x01Qa\x0B\x1CV[a\x1C\x8D\x81a\x02\x80\x01Qa\x0B\x1CV[a\x1C\x9B\x81a\x02\xA0\x01Qa\x0B\x1CV[a\x0B\x19\x81a\x02\xC0\x01Qa\x0B\x1CV[a\x1C\xB1aM\xB8V[\x84` \x01Q\x84Q\x14a\x1C\xD6W`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x1C\xE4\x86\x86\x86\x86a'\x0FV[\x90P`\0a\x1C\xF5\x87`\0\x01Qa(\xDDV[\x90P`\0a\x1D\x08\x82\x84`\xA0\x01Q\x89a,\xA8V[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x1DKW\x90PP\x90P`\0a\x1D\x84\x8B\x85\x8B\x89\x87\x87a-\x08V[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90`\0\x80Q` aU?\x839\x81Q\x91R`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x87\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x96\x01Q\x92\x86\x01\x92\x90\x92RP\x92\x95\x94PPPPPV[\x80Q`\0\x90`\0\x80Q` aU?\x839\x81Q\x91R`\x01\x80\x83\x11\x15a\x1ExWa\x1E'aN\x0BV[`\0[\x84\x81\x10\x15a\x1EjWa\x1Eb\x87\x82\x81Q\x81\x10a\x1EGWa\x1EGaS\xF8V[` \x02` \x01\x01Q`\0\x01Q\x83a-1\x90\x91\x90c\xFF\xFF\xFF\xFF\x16V[`\x01\x01a\x1E*V[Pa\x1Et\x81a-;V[\x91PP[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0a\x1E\xAD\x86`\x02aT\x0EV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1E\xC4Wa\x1E\xC4aN\x7FV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x1E\xEDW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P`\0a\x1E\xFD\x87`\x02aT\x0EV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1F\x14Wa\x1F\x14aN\x7FV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x1FYW\x81` \x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x1F2W\x90P[P\x90P`\x01`\0[\x88\x81\x10\x15a \x98W\x81\x84a\x1Fv\x83`\x02aT\x0EV[\x81Q\x81\x10a\x1F\x86Wa\x1F\x86aS\xF8V[` \x02` \x01\x01\x81\x81RPP\x8A\x81\x81Q\x81\x10a\x1F\xA4Wa\x1F\xA4aS\xF8V[` \x02` \x01\x01Q`\xC0\x01Q\x83\x82`\x02a\x1F\xBE\x91\x90aT\x0EV[\x81Q\x81\x10a\x1F\xCEWa\x1F\xCEaS\xF8V[` \x02` \x01\x01\x81\x90RP`\0\x80\x8C\x83\x81Q\x81\x10a\x1F\xEEWa\x1F\xEEaS\xF8V[` \x02` \x01\x01Q`\0\x01Q\x90P\x89\x81\x85\t\x91P\x81\x86a \x0F\x85`\x02aT\x0EV[a \x1A\x90`\x01aT%V[\x81Q\x81\x10a *Wa *aS\xF8V[` \x02` \x01\x01\x81\x81RPPPP\x8A\x81\x81Q\x81\x10a JWa JaS\xF8V[` \x02` \x01\x01Q`\xE0\x01Q\x83\x82`\x02a d\x91\x90aT\x0EV[a o\x90`\x01aT%V[\x81Q\x81\x10a \x7FWa \x7FaS\xF8V[` \x02` \x01\x01\x81\x90RP\x87\x87\x83\t\x91P`\x01\x01a\x1FaV[Pa \xA3\x82\x84a.hV[\x94PPPP``\x80`\0\x89`\0\x81Q\x81\x10a \xC0Wa \xC0aS\xF8V[` \x02` \x01\x01Q`\x80\x01QQ\x90P`\0\x8AQ\x82`\x02a \xE0\x91\x90aT%V[a \xEA\x91\x90aT\x0EV[a \xF5\x90`\x01aT%V[\x90P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a!\x0FWa!\x0FaN\x7FV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a!8W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a!SWa!SaN\x7FV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a!\x98W\x81` \x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a!qW\x90P[P\x92P`\0\x91P\x81\x90P`\x01\x81[\x8CQ\x81\x10\x15a$-W`\0[\x8D`\0\x81Q\x81\x10a!\xC5Wa!\xC5aS\xF8V[` \x02` \x01\x01Q`\x80\x01QQ\x81\x10\x15a\"\xA6W`\0\x8E\x83\x81Q\x81\x10a!\xEDWa!\xEDaS\xF8V[` \x02` \x01\x01Q`\x80\x01Q\x82\x81Q\x81\x10a\"\nWa\"\naS\xF8V[` \x02` \x01\x01Q\x90P`\0\x8C\x82\x86\t\x90P\x80\x89\x87\x81Q\x81\x10a\"/Wa\"/aS\xF8V[` \x02` \x01\x01\x81\x81RPPPP\x8D\x82\x81Q\x81\x10a\"OWa\"OaS\xF8V[` \x02` \x01\x01Q`\xA0\x01Q\x81\x81Q\x81\x10a\"lWa\"laS\xF8V[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a\"\x86Wa\"\x86aS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra\"\x9C`\x01\x85aT%V[\x93P`\x01\x01a!\xB2V[P`\0\x8D\x82\x81Q\x81\x10a\"\xBBWa\"\xBBaS\xF8V[` \x02` \x01\x01Q` \x01Q\x90P`\0\x8B\x82\x85\t\x90P\x80\x88\x86\x81Q\x81\x10a\"\xE4Wa\"\xE4aS\xF8V[` \x02` \x01\x01\x81\x81RPPPP\x8C\x81\x81Q\x81\x10a#\x04Wa#\x04aS\xF8V[` \x02` \x01\x01Q`\xC0\x01Q\x85\x84\x81Q\x81\x10a#\"Wa#\"aS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra#8`\x01\x84aT%V[\x92P`\0\x8D\x82\x81Q\x81\x10a#NWa#NaS\xF8V[` \x02` \x01\x01Q`\0\x01Q\x90P`\0\x8E\x83\x81Q\x81\x10a#pWa#paS\xF8V[` \x02` \x01\x01Q`@\x01Q\x90P`\0\x8C\x8D\x83\x85\t\x86\t\x90P\x80\x89\x87\x81Q\x81\x10a#\x9CWa#\x9CaS\xF8V[` \x02` \x01\x01\x81\x81RPPPPP\x8C\x81\x81Q\x81\x10a#\xBDWa#\xBDaS\xF8V[` \x02` \x01\x01Q`\xE0\x01Q\x85\x84\x81Q\x81\x10a#\xDBWa#\xDBaS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra#\xF1`\x01\x84aT%V[\x92P`\0\x8D\x82\x81Q\x81\x10a$\x07Wa$\x07aS\xF8V[` \x02` \x01\x01Q``\x01Q\x90P\x8A\x8B\x82\x85\t\x86\x08\x94P\x8A\x8A\x84\t\x92PP`\x01\x01a!\xA6V[Pa$7\x83a/bV[\x85\x83\x81Q\x81\x10a$IWa$IaS\xF8V[` \x02` \x01\x01\x81\x81RPPa$\x81`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x84\x83\x81Q\x81\x10a$\x93Wa$\x93aS\xF8V[` \x02` \x01\x01\x81\x90RPa$\xB0a$\xAB\x85\x87a.hV[a/\x94V[\x95PPPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa%o\x83\x82\x84a%ja0\x0FV[a0\xE0V[\x98\x97PPPPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a%\xB1W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x06\xBCV[`\0\x80Q` aU\x1F\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa%\xFD\x91\x90aT8V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a&8W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a&=V[``\x91P[P\x91P\x91Pa&M\x85\x83\x83a1\xC2V[\x92PPP[\x92\x91PPV[4\x15a\x08\xC7W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Q` \x82\x01Q`\0\x91`\0\x80Q` aT\xFF\x839\x81Q\x91R\x91\x15\x90\x15\x16\x15a&\x9FWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x0E\xBCW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xBCV[a'W`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a'_aN\x0BV[`\0\x80Q` aU?\x839\x81Q\x91Ra'x\x82\x85a2!V[a'\x83\x82\x88\x88a2KV[\x84Qa'\x90\x90\x83\x90a4\xD7V[` \x85\x01Qa'\xA0\x90\x83\x90a4\xD7V[`@\x85\x01Qa'\xB0\x90\x83\x90a4\xD7V[``\x85\x01Qa'\xC0\x90\x83\x90a4\xD7V[`\x80\x85\x01Qa'\xD0\x90\x83\x90a4\xD7V[a'\xD9\x82a-;V[Pa'\xE3\x82a-;V[``\x84\x01Ra'\xF1\x82a-;V[`\x80\x84\x01R`\xA0\x85\x01Qa(\x06\x90\x83\x90a4\xD7V[a(\x0F\x82a-;V[\x83R`\xC0\x85\x01Qa(!\x90\x83\x90a4\xD7V[`\xE0\x85\x01Qa(1\x90\x83\x90a4\xD7V[a\x01\0\x85\x01Qa(B\x90\x83\x90a4\xD7V[a\x01 \x85\x01Qa(S\x90\x83\x90a4\xD7V[a\x01@\x85\x01Qa(d\x90\x83\x90a4\xD7V[a(m\x82a-;V[`\xA0\x84\x01Ra(|\x82\x86a4\xEEV[a(\x85\x82a-;V[`\xC0\x84\x01Ra\x01`\x85\x01Qa(\x9B\x90\x83\x90a4\xD7V[a\x01\x80\x85\x01Qa(\xAC\x90\x83\x90a4\xD7V[a(\xB5\x82a-;V[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x96\x95PPPPPPV[a)\x0F`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a)\xA3WP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a*8WP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a*\xCDWP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a+bWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a+\xF7WP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a,\x8AWP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a,\xCC`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a,\xD6\x84\x84a5\x84V[\x80\x82Ra,\xE6\x90\x85\x90\x85\x90a5\xD8V[` \x82\x01R\x80Qa,\xFC\x90\x85\x90\x84\x90\x86\x90a64V[\x91P`\x01\x01a/\x10V[P\x92\x91PPV[`\0a/|`\0\x80Q` aU?\x839\x81Q\x91R\x83aT\x9AV[a&R\x90`\0\x80Q` aU?\x839\x81Q\x91RaT\xBCV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a/\xBCWP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01`\0\x80Q` aT\xFF\x839\x81Q\x91R\x84` \x01Qa/\xEF\x91\x90aT\x9AV[a0\x07\x90`\0\x80Q` aT\xFF\x839\x81Q\x91RaT\xBCV[\x90R\x92\x91PPV[a0:`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a1\xB6W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\x06\xBCV[P\x15\x15\x95\x94PPPPPV[``\x82a1\xD7Wa1\xD2\x82a>\xDBV[a2\x1AV[\x81Q\x15\x80\x15a1\xEEWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a2\x17W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x06\xBCV[P\x80[\x93\x92PPPV[\x81Q`@Qa25\x91\x90\x83\x90` \x01aT\xCFV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x90\x91RPV[`\xFEa2\x8C\x84a2\x87a2]\x84a?\x04V[`@Q` \x01a2o\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04a<\rV[a2!V[a2\xCA\x84a2\x87a2\xA0\x86`\0\x01Qa?\x04V[`@Q` \x01a2\xB2\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08a<\rV[a2\xDE\x84a2\x87a2\xA0\x86` \x01Qa?\x04V[a2\xE9\x84`\x01a;\xDAV[a3\x13\x84\x7F/\x8D\xD1\xF1\xA7X,W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xBCV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra>PaNCV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80a>\x8DW`\0\x80\xFD[P\x80a>,W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x06\xBCV[\x80Q\x15a>\xEBW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81\x90P`\x08\x81~\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\x16\x90\x1B`\x08\x82\x7F\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\x16\x90\x1C\x17\x90P`\x10\x81}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x16\x90\x1B`\x10\x82\x7F\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\x16\x90\x1C\x17\x90P` \x81{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x16\x90\x1B` \x82\x7F\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\x16\x90\x1C\x17\x90P`@\x81w\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90\x1B`@\x82w\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16\x90\x1C\x17\x90P`\x80\x81\x90\x1B`\x80\x82\x90\x1C\x17\x90P\x91\x90PV[\x80Q` \x82\x01Q``\x91`\0\x91\x15\x90\x15\x16\x15a@fW`\x01`\xFE\x1B\x17[` \x83\x01Q`\0\x80Q` aT\xFF\x839\x81Q\x91R`\x01\x91\x90\x91\x1B\x10a@\x8CWP`\x01`\xFF\x1B[\x82Qa@\x99\x90\x82\x17a?\x04V[`@Q` \x01a@\xAB\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP\x91\x90PV[`\0\x80`\0`\0\x80Q` aU?\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aAaW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x06\xBCV[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aA\x8FW`@Qc\x8C^\x11\xF1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01`\0\x80Q` aU?\x839\x81Q\x91R\x84`\x01`\x01`@\x1B\x03\x81\x11\x15aA\xBDWaA\xBDaN\x7FV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aA\xE6W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a5\xCFW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aB\"W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaB\x06V[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80`\0\x80Q` aU?\x839\x81Q\x91R\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x7F/\x8D\xD1\xF1\xA7X,Wa>,aS\x86V[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a/[Wa/[aS\x86V[`\0` \x82\x84\x03\x12\x15aS\xF1W`\0\x80\xFD[PQ\x91\x90PV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a&RWa&RaS\x86V[\x80\x82\x01\x80\x82\x11\x15a&RWa&RaS\x86V[`\0\x82QaTJ\x81\x84` \x87\x01aS\x14V[\x91\x90\x91\x01\x92\x91PPV[\x84\x81R\x83` \x82\x01R`\0\x83QaTr\x81`@\x85\x01` \x88\x01aS\x14V[`\xF8\x93\x90\x93\x1B`\x01`\x01`\xF8\x1B\x03\x19\x16`@\x92\x90\x93\x01\x91\x82\x01\x92\x90\x92R`A\x01\x94\x93PPPPV[`\0\x82aT\xB7WcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x06\x90V[\x81\x81\x03\x81\x81\x11\x15a&RWa&RaS\x86V[`\0\x83QaT\xE1\x81\x84` \x88\x01aS\x14V[\x83Q\x90\x83\x01\x90aT\xF5\x81\x83` \x88\x01aS\x14V[\x01\x94\x93PPPPV\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n"; + /// The bytecode of the contract. + pub static LIGHTCLIENTMOCK_BYTECODE: ::ethers::core::types::Bytes = + ::ethers::core::types::Bytes::from_static(__BYTECODE); + #[rustfmt::skip] + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\x01*W`\x005`\xE0\x1C\x80cvg\x18\x08\x11a\0\xABW\x80c\xA2D\xD5\x96\x11a\0oW\x80c\xA2D\xD5\x96\x14a\x04\xD2W\x80c\xAA\x92'2\x14a\x04\xF2W\x80c\xAD<\xB1\xCC\x14a\x05\x12W\x80c\xCAo\xE8U\x14a\x05PW\x80c\xF0h T\x14a\x05fW\x80c\xF2\xFD\xE3\x8B\x14a\x05\x98W`\0\x80\xFD[\x80cvg\x18\x08\x14a\x03nW\x80cv\xB6\xB7\xCB\x14a\x03\xADW\x80c\x7F\x17\xBA\xAD\x14a\x03\xC3W\x80c\x82\xD0\x7F\xF3\x14a\x04vW\x80c\x8D\xA5\xCB[\x14a\x04\x8BW`\0\x80\xFD[\x80cHG\xAE]\x11a\0\xF2W\x80cHG\xAE]\x14a\x02\x98W\x80cO\x1E\xF2\x86\x14a\x03\x1BW\x80cR\xD1\x90-\x14a\x03.W\x80cb\x82w3\x14a\x03CW\x80cqP\x18\xA6\x14a\x03YW`\0\x80\xFD[\x80c\r\x8En,\x14a\x01/W\x80c *\n\xDB\x14a\x01aW\x80c8+!Z\x14a\x02\x0CW\x80c9I\xD1\xE9\x14a\x020W\x80c@\x999\xB7\x14a\x02xW[`\0\x80\xFD[4\x80\x15a\x01;W`\0\x80\xFD[P`@\x80Q`\x01\x81R`\0` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01mW`\0\x80\xFD[Pa\x02\na\x01|6`\x04aO\xA2V[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x93\x84\x90 \x85Q\x81T\x92\x87\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x90\x95\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x93\x16\x94\x16\x93\x90\x93\x17\x17\x82U\x91\x83\x01Q`\x01\x82\x01U``\x83\x01Q`\x02\x82\x01U`\x80\x83\x01Q`\x03\x82\x01U`\xA0\x83\x01Q`\x04\x82\x01U`\xC0\x83\x01Q\x91\x81\x01\x91\x90\x91U`\xE0\x90\x91\x01Q`\x06\x90\x91\x01UV[\0[4\x80\x15a\x02\x18W`\0\x80\xFD[Pa\x02\"`\x03T\x81V[`@Q\x90\x81R` \x01a\x01XV[4\x80\x15a\x02#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16`\0\x81\x15\x80\x15a\t\x9EWP\x82[\x90P`\0\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\t\xBAWP0;\x15[\x90P\x81\x15\x80\x15a\t\xC8WP\x80\x15[\x15a\t\xE6W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\n\x10W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\n\x19\x86a\x0F\xD6V[a\n!a\x0F\xE7V[`\0\x80Tk\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\x19\x16`\x01`@\x1B\x17\x90Ua\nF\x88\x88a\x0F\xEFV[\x83\x15a\n\x8CW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPV[`\x80\x80\x82\x01Q`\xA0\x83\x01Q`\xC0\x84\x01Q`@\x80Q` \x81\x01\x94\x90\x94R\x83\x01\x91\x90\x91R``\x82\x01R`\0\x91\x01`@Q` \x81\x83\x03\x03\x81R\x90`@R\x80Q\x90` \x01 \x90P\x91\x90PV[a\n\xE6a\x0F\nV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x0B\x10W`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\0`\x04\x82\x01R`$\x01a\x06\xBCV[a\x0B\x19\x81a\x0FeV[PV[`\0\x80Q` aU?\x839\x81Q\x91R\x81\x10\x80a\x08\x94W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xBCV[`\0\x80Tc\xFF\xFF\xFF\xFF`\x01`@\x1B\x91\x82\x90\x04\x16\x82R`\x05` \x81\x81R`@\x80\x85 \x81Qa\x01\0\x81\x01\x83R\x81T`\x01`\x01`@\x1B\x03\x80\x82\x16\x83R\x96\x90\x04\x90\x95\x16\x92\x85\x01\x92\x90\x92R`\x01\x82\x01T\x90\x84\x01R`\x02\x81\x01T``\x84\x01R`\x03\x81\x01T`\x80\x84\x01R`\x04\x81\x01T`\xA0\x84\x01R\x90\x81\x01T`\xC0\x83\x01R`\x06\x01T`\xE0\x82\x01Ra\x0C\x02\x90a\n\x96V[`\x03\x80T`\x01\x90\x81U\x90\x82\x90U`\x04\x80T`\x02U`\0\x80T`\x01`@\x1B\x81\x04c\xFF\xFF\xFF\xFF\x16\x82R`\x05` R`@\x82 `\x06\x01T\x90\x92U\x92\x93P\x90\x91\x90`\x0C\x90a\x0C]\x90\x84\x90`\x01``\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16aS\xBFV[\x82Ta\x01\0\x92\x90\x92\n`\x01`\x01`@\x1B\x03\x81\x81\x02\x19\x90\x93\x16\x91\x83\x16\x02\x17\x90\x91U`\0T`@Q`\x01``\x1B\x90\x91\x04\x90\x91\x16\x81R\x7F\xDB5X%\x9E\x03\x9D~P\xE8\x16\xB9\xDC\xCE0\xFB\x11M\x8A\x9C\x86\xEC\xA5\xAB\x14\xB6\x01\x94\xD6\x94]?\x91P` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\0a\x0C\xCCa\x12wV[\x90P`\0a\x0C\xD9\x84a\x18XV[\x90Pa\x0C\xF6\x82\x82\x85`@Q\x80` \x01`@R\x80`\0\x81RPa\x1A\x15V[a\r\x13W`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14\x80a\r\xA0WP\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\x01`\x01`\xA0\x1B\x03\x16a\r\x94`\0\x80Q` aU\x1F\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x08\xC7W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\r\xC6a\x0F\nV[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x0C\xB7V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x0EYWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x0EV\x91\x81\x01\x90aS\xDFV[`\x01[a\x0E\x81W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x06\xBCV[`\0\x80Q` aU\x1F\x839\x81Q\x91R\x81\x14a\x0E\xB2W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x06\xBCV[a\x0E\xBC\x83\x83a\x1A\xCAV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x16\x14a\x08\xC7W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\x0F<\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\xC7W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x06\xBCV[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90`\0\x90\xA3PPPV[a\x0F\xDEa\x1B V[a\x0B\x19\x81a\x1BiV[a\x08\xC7a\x1B V[\x81Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x10\x13WP` \x82\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x10 WP`\x80\x82\x01Q\x15[\x80a\x10-WP`\xA0\x82\x01Q\x15[\x80a\x10:WP`\xC0\x82\x01Q\x15[\x80a\x10GWP`\xE0\x82\x01Q\x15[\x80a\x10VWPc\xFF\xFF\xFF\xFF\x81\x16\x15[\x15a\x10tW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x81`\x05`\0\x80`\x04\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP\x81`\x05`\0\x80`\x08\x90T\x90a\x01\0\n\x90\x04c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16c\xFF\xFF\xFF\xFF\x16\x81R` \x01\x90\x81R` \x01`\0 `\0\x82\x01Q\x81`\0\x01`\0a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP` \x82\x01Q\x81`\0\x01`\x08a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP`@\x82\x01Q\x81`\x01\x01U``\x82\x01Q\x81`\x02\x01U`\x80\x82\x01Q\x81`\x03\x01U`\xA0\x82\x01Q\x81`\x04\x01U`\xC0\x82\x01Q\x81`\x05\x01U`\xE0\x82\x01Q\x81`\x06\x01U\x90PP`\0\x80`\x0Ca\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UP\x80`\0\x80a\x01\0\n\x81T\x81c\xFF\xFF\xFF\xFF\x02\x19\x16\x90\x83c\xFF\xFF\xFF\xFF\x16\x02\x17\x90UP`\0a\x12Z\x83a\n\x96V[`\x01\x81\x90U`\xE0\x90\x93\x01Q`\x02\x81\x90U`\x03\x93\x90\x93UPP`\x04UV[a\x12\x7FaK:V[b\x01\0\0\x81R`\x08` \x82\x01R\x7F\x01=\x1DKBQy%\x8BWx`9yU\xCB\xFA\x08\x16\xE3+\x1C%\xA1\xFDsL\x91\xB9Q\xEE\x81`@\x82\x01QR\x7F\x16\xB8\x8D\xC7C\x9Am\x84\x1E\x1A\x11\x03\xF5\xA3\xD2\xD2D\x017\xF1\x8D\x02v5\x03\xBA\xC7\xB4]\xCB\x98;` `@\x83\x01Q\x01R\x7F\x0C<\x86O\x19_Y\x11\x99'\xF58W\xF1\xDE\x8B\xF5u\x94\x17H\xB755\x1F\xD3\x13s\xC7\x87\\-``\x82\x01QR\x7F\x16\x9B\xA1Q\x07\xF2\xEF\xF9\xB94\x1B\xF3\x07B\xA88\xD2}\xBDi\xE8\x8B#S\xDC\xA8Y/\x15\xF1\x11\x1C` ``\x83\x01Q\x01R\x7F\x11\xD4\xCE\xB1Ya\xD1\x0BaV\xAE=\t\xBBx\xB4\xDFE\xFB\x85C\x06\x08\x84\xE7\xD4\0u[\xEBJ\xC8`\x80\x82\x01QR\x7F\x03&\xFF\x069\x1E\xD5\xD2n\xC1\xBC\x08\x0B\x8DF\x01N\xE2,\x0Ch\xED\x02/\x16 \xC4\xD9\xD3\x847\xD3` `\x80\x83\x01Q\x01R\x7F#a\x0C\xB4>!\x03<6\x8A\x93b-\xD4\x05\xB9\x05\xA0\xEB4L\x98\xB9\xD7\xCF\x08\xB0\xC5\xEB\xF7\xC89`\xA0\x82\x01QR~\x13y4*Mw\xD4p\x87C\xAF\xF0\x1F\xF2z\xA1\x19\x17G\x8F\xDC\x8E+}F0\x81sWr\xEA` `\xA0\x83\x01Q\x01R\x7F\x19M\xAF\x85\xD9\xEE\xD9\x93{(\xE2\xA6\x80\xFC\xC5\xA7i\"\xC1\\\xD3\x1D\xC4\xF6\0\xE1I9\xB8 \x0C\xE7`\xC0\x82\x01QR\x7F%(\x0B\x12F$\x91\x1C\x7F\x87\xB4\xC2\xD8\x7FY\xC6\xC0~>\xEE\xB1\raM\xA2\x16\xF6!\x9F\xFEP\xB6` `\xC0\x83\x01Q\x01R\x7F\x04\x88.\xF3\x98\x99\xEA8\xC9gzH\xB8\xF8\xCCjg(N\x17\xFF\x94\x02\x89\xFA\xAA5\x9E\xEC\x9B3\xA6`\xE0\x82\x01QR\x7F\x1B\xAE\x9F6\xE6\x19\x078\xC7\x11P\x1B\xE5?)\x9B\xF6\x13H\xE6\x1E.\xF9\xD5wv\x0Ed\xF6)6\x8D` `\xE0\x83\x01Q\x01R\x7F-\x81\r0\x12\x0C\xB9>\x1A%K\x89\xED\n\xE8lv\x1FI\xB4\xF1)E\x9C\xD54\xF9U\x18Q5\x0Fa\x01\0\x82\x01QR\x7F\x0B%9M\xA5\xA1\xD45\xDA\xCC\xC2\xEA\xDD\x03\x9E,'\t\xF5\xF4/\xAB\xD9\xAF\xBA\x81^\xD6-j\xF3k` a\x01\0\x83\x01Q\x01R\x7F\x1C,\xE7\xBEW\x0B\xEA\x9EC\xF3\xD3\xD7\xCB\xCA\x84\xBD\xB4\xFC\x89\xB5:\xE6WS\x1D\xE7&p\xA6\x10^\x08a\x01 \x82\x01QR\x7F\x1A\x02U\xEC\x8C|\x87i3[\xC9\xDCk\"*\xC6\xA0Nvm\x08\xB4\\\x8C\xC5sY,\x05\xBC\x9C\x14` a\x01 \x83\x01Q\x01R\x7F\x1C\x16AY\x13k\x8F[Gs\xE13\xF4\x83\xA8\xA1\x92\xAB\x15\xD6\xD3\xEE\x01/\x17\x1B=\x02\xFDE\x06\xE7a\x01@\x82\x01QR\x7F'.\xB7\xD63\xCE\xDBh\xCE\x01\x13\xF4B\n\xB5a\x0B\x81\xB8\xBA\x1A\xB94\x8D\xB1Wa\xD4\x0E\x8D\xF5\xBA` a\x01@\x83\x01Q\x01R\x7F\x0EDf9\xAAl\xAF%\xE9>\xF7G\x08N9\xB8\xEA\x90\xAB\xF2;\xB4\x8C(\xFD_\x9B\xA7\xBAeP\"a\x01`\x82\x01QR\x7F\x03>\x19Z\x9E\xA3\xA9\xCE@\xB7+g:\xFBEDL\xA1\xB1_\x05C\xF4M\x10\xF5\xC6@\xA7\x80go` a\x01`\x83\x01Q\x01R\x7F\x0E\x8D\xB2\xB2\x89=\xF2=\xD6\x81y\x96\xF7_\x10\0\x9D\x99\"\x07\x93\xECsa\x01\xC0\x82\x01QR\x7F\x19\xEB\x12\xA7\x82|\r\xDFc\x83\xFE\x80l9S\xBD\x06\xB0\x8A\xAE{\xF2\xA0\x1FU\xC9\x86\xA8OP\xCC(` a\x01\xC0\x83\x01Q\x01R\x7F\x01V\x910\x88F\xE6\x8E\xA8V\xA2\xCB$\xC9\x90?\x0C\x86\x05\xDE\xA1\x90\x82\x91\x80\xFFk\xDD\x1Ce\x08\x03a\x01\xE0\x82\x01QR\x7F\x1F\xFDx\x9B\x15[\x8A\xCB\x13\xE0\xF6\xA4\x8BP\xF7\xAA\x80\x92T\x08\x88\xD0\t\x14\x10W\xD4V\x90\x91X$` a\x01\xE0\x83\x01Q\x01R\x7F\x05E\xACz\xA6m\xCF7\x19\x98\x848\xC8\x06\xFCbM\xE5z\xB4?\x85\x809/\x88\xC8l\x13x\xCEJa\x02\0\x82\x01QR\x7F\x16\xB7\xF2P\x84.\xCFN6\x90pj\x1E\x15-zW\xF7\x0FUo\x92\x07m\xA7\x85\xFD\xD3c\xC1\x9F\xCF` a\x02\0\x83\x01Q\x01R\x7F \xCB\x7F\xF3Z\x83\xA7\xDC1@6\xE4p\xF1L0\xFB\x0E\x98\xD3]f;$;\",\xAAo\xC7\xDBDa\x02 \x82\x01QR\x7F\x14\x9FAWDpth\xBD\xAAN\x85E \x1A\xB4\r\x191\xA7\xD3\x1F#v\x8F\xA7\xC6Ut\xEE>\xAB` a\x02 \x83\x01Q\x01R\x7F\n%\xC1\xB7W9\x06\xDCN\x19;N\xA8/\xD1\xFE|\xCE\xBCM\x92]\xAD&\xF0\xFF\t\xC8L\x9F\x1Aua\x02@\x82\x01QR\x7F\nR\x1F\xF3\x0C\x8F6fy\x8F\x84|]L7\x96X\xFB\xA1\x01V\xE7\xA9I\x9F'\x13\xFA\xE9\xBF+\xE1` a\x02@\x83\x01Q\x01R\x7F\x03\xDBe\x10\xC3\xF16)\xFD\xED\x9AZ-AeK\xBC\xE4\xEFm\x02L\xADS\x10\0Q\xD4\xA3\xF3\xEB\xC9a\x02`\x82\x01QR\x7F\x08\xE8\n\\\x8EL\x9B\x9F&\xF3\0<\xC5\x94\x03\xA1\x8D16\xAF\xD00\x86\x8D%\xCC\x8B\x80~*\xB3p` a\x02`\x83\x01Q\x01R\x90V[`@\x80Q`\x08\x80\x82Ra\x01 \x82\x01\x90\x92R``\x91`\0\x91\x90` \x82\x01a\x01\0\x806\x837\x01\x90PP\x90P`\x02T\x81`\0\x81Q\x81\x10a\x18\x97Wa\x18\x97aS\xF8V[` \x02` \x01\x01\x81\x81RPP\x82`\0\x01Q`\x01`\x01`@\x1B\x03\x16\x81`\x01\x81Q\x81\x10a\x18\xC4Wa\x18\xC4aS\xF8V[` \x02` \x01\x01\x81\x81RPP\x82` \x01Q`\x01`\x01`@\x1B\x03\x16\x81`\x02\x81Q\x81\x10a\x18\xF1Wa\x18\xF1aS\xF8V[` \x02` \x01\x01\x81\x81RPP\x82`@\x01Q\x81`\x03\x81Q\x81\x10a\x19\x15Wa\x19\x15aS\xF8V[` \x02` \x01\x01\x81\x81RPP\x82``\x01Q\x81`\x04\x81Q\x81\x10a\x199Wa\x199aS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 `\x03\x01T\x82Q\x90\x91\x83\x91\x81\x10a\x19}Wa\x19}aS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x90\x91R`@\x90 `\x04\x01T\x81Q\x82\x90`\x06\x90\x81\x10a\x19\xC1Wa\x19\xC1aS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01\x91\x90\x91R`\0\x80T`\x01`@\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81R`\x05\x91\x82\x90R`@\x90 \x01T\x81Q\x82\x90`\x07\x90\x81\x10a\x1A\x04Wa\x1A\x04aS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x01R\x92\x91PPV[`\0a\x1A \x83a\x1BqV[`\0[\x84Q\x81\x10\x15a\x1AVWa\x1AN\x85\x82\x81Q\x81\x10a\x1AAWa\x1AAaS\xF8V[` \x02` \x01\x01Qa\x0B\x1CV[`\x01\x01a\x1A#V[P`@\x80Q`\x01\x80\x82R\x81\x83\x01\x90\x92R`\0\x91\x81` \x01[a\x1AvaM\xB8V[\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x1AnW\x90PP\x90Pa\x1A\x97\x86\x86\x86\x86a\x1C\xA9V[\x81`\0\x81Q\x81\x10a\x1A\xAAWa\x1A\xAAaS\xF8V[` \x02` \x01\x01\x81\x90RPa\x1A\xBE\x81a\x1E\x01V[\x91PP[\x94\x93PPPPV[a\x1A\xD3\x82a%{V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90`\0\x90\xA2\x80Q\x15a\x1B\x18Wa\x0E\xBC\x82\x82a%\xE0V[a\x08\x94a&XV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x08\xC7W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\n\xE6a\x1B V[\x80Qa\x1B|\x90a&wV[a\x1B\x89\x81` \x01Qa&wV[a\x1B\x96\x81`@\x01Qa&wV[a\x1B\xA3\x81``\x01Qa&wV[a\x1B\xB0\x81`\x80\x01Qa&wV[a\x1B\xBD\x81`\xA0\x01Qa&wV[a\x1B\xCA\x81`\xC0\x01Qa&wV[a\x1B\xD7\x81`\xE0\x01Qa&wV[a\x1B\xE5\x81a\x01\0\x01Qa&wV[a\x1B\xF3\x81a\x01 \x01Qa&wV[a\x1C\x01\x81a\x01@\x01Qa&wV[a\x1C\x0F\x81a\x01`\x01Qa&wV[a\x1C\x1D\x81a\x01\x80\x01Qa&wV[a\x1C+\x81a\x01\xA0\x01Qa\x0B\x1CV[a\x1C9\x81a\x01\xC0\x01Qa\x0B\x1CV[a\x1CG\x81a\x01\xE0\x01Qa\x0B\x1CV[a\x1CU\x81a\x02\0\x01Qa\x0B\x1CV[a\x1Cc\x81a\x02 \x01Qa\x0B\x1CV[a\x1Cq\x81a\x02@\x01Qa\x0B\x1CV[a\x1C\x7F\x81a\x02`\x01Qa\x0B\x1CV[a\x1C\x8D\x81a\x02\x80\x01Qa\x0B\x1CV[a\x1C\x9B\x81a\x02\xA0\x01Qa\x0B\x1CV[a\x0B\x19\x81a\x02\xC0\x01Qa\x0B\x1CV[a\x1C\xB1aM\xB8V[\x84` \x01Q\x84Q\x14a\x1C\xD6W`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x1C\xE4\x86\x86\x86\x86a'\x0FV[\x90P`\0a\x1C\xF5\x87`\0\x01Qa(\xDDV[\x90P`\0a\x1D\x08\x82\x84`\xA0\x01Q\x89a,\xA8V[`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x91\x92P`\0\x91\x90` \x82\x01a\x03\xC0\x806\x837PP`@\x80Q`\x1E\x80\x82Ra\x03\xE0\x82\x01\x90\x92R\x92\x93P`\0\x92\x91P` \x82\x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x1DKW\x90PP\x90P`\0a\x1D\x84\x8B\x85\x8B\x89\x87\x87a-\x08V[`\xA0\x87\x01Q``\x87\x01Q\x91\x92P\x90`\0\x80Q` aU?\x839\x81Q\x91R`\0\x81\x83\x85\t`@\x80Qa\x01\0\x81\x01\x82R`\xE0\x9C\x8D\x01Q\x81R` \x81\x01\x96\x90\x96R\x85\x01RPPP``\x81\x01\x91\x90\x91R`\x80\x81\x01\x92\x90\x92R`\xA0\x82\x01Ra\x01`\x87\x01Q`\xC0\x82\x01Ra\x01\x80\x90\x96\x01Q\x92\x86\x01\x92\x90\x92RP\x92\x95\x94PPPPPV[\x80Q`\0\x90`\0\x80Q` aU?\x839\x81Q\x91R`\x01\x80\x83\x11\x15a\x1ExWa\x1E'aN\x0BV[`\0[\x84\x81\x10\x15a\x1EjWa\x1Eb\x87\x82\x81Q\x81\x10a\x1EGWa\x1EGaS\xF8V[` \x02` \x01\x01Q`\0\x01Q\x83a-1\x90\x91\x90c\xFF\xFF\xFF\xFF\x16V[`\x01\x01a\x1E*V[Pa\x1Et\x81a-;V[\x91PP[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0a\x1E\xAD\x86`\x02aT\x0EV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1E\xC4Wa\x1E\xC4aN\x7FV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x1E\xEDW\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x90P`\0a\x1E\xFD\x87`\x02aT\x0EV[`\x01`\x01`@\x1B\x03\x81\x11\x15a\x1F\x14Wa\x1F\x14aN\x7FV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a\x1FYW\x81` \x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a\x1F2W\x90P[P\x90P`\x01`\0[\x88\x81\x10\x15a \x98W\x81\x84a\x1Fv\x83`\x02aT\x0EV[\x81Q\x81\x10a\x1F\x86Wa\x1F\x86aS\xF8V[` \x02` \x01\x01\x81\x81RPP\x8A\x81\x81Q\x81\x10a\x1F\xA4Wa\x1F\xA4aS\xF8V[` \x02` \x01\x01Q`\xC0\x01Q\x83\x82`\x02a\x1F\xBE\x91\x90aT\x0EV[\x81Q\x81\x10a\x1F\xCEWa\x1F\xCEaS\xF8V[` \x02` \x01\x01\x81\x90RP`\0\x80\x8C\x83\x81Q\x81\x10a\x1F\xEEWa\x1F\xEEaS\xF8V[` \x02` \x01\x01Q`\0\x01Q\x90P\x89\x81\x85\t\x91P\x81\x86a \x0F\x85`\x02aT\x0EV[a \x1A\x90`\x01aT%V[\x81Q\x81\x10a *Wa *aS\xF8V[` \x02` \x01\x01\x81\x81RPPPP\x8A\x81\x81Q\x81\x10a JWa JaS\xF8V[` \x02` \x01\x01Q`\xE0\x01Q\x83\x82`\x02a d\x91\x90aT\x0EV[a o\x90`\x01aT%V[\x81Q\x81\x10a \x7FWa \x7FaS\xF8V[` \x02` \x01\x01\x81\x90RP\x87\x87\x83\t\x91P`\x01\x01a\x1FaV[Pa \xA3\x82\x84a.hV[\x94PPPP``\x80`\0\x89`\0\x81Q\x81\x10a \xC0Wa \xC0aS\xF8V[` \x02` \x01\x01Q`\x80\x01QQ\x90P`\0\x8AQ\x82`\x02a \xE0\x91\x90aT%V[a \xEA\x91\x90aT\x0EV[a \xF5\x90`\x01aT%V[\x90P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a!\x0FWa!\x0FaN\x7FV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a!8W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x80`\x01`\x01`@\x1B\x03\x81\x11\x15a!SWa!SaN\x7FV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15a!\x98W\x81` \x01[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81R` \x01\x90`\x01\x90\x03\x90\x81a!qW\x90P[P\x92P`\0\x91P\x81\x90P`\x01\x81[\x8CQ\x81\x10\x15a$-W`\0[\x8D`\0\x81Q\x81\x10a!\xC5Wa!\xC5aS\xF8V[` \x02` \x01\x01Q`\x80\x01QQ\x81\x10\x15a\"\xA6W`\0\x8E\x83\x81Q\x81\x10a!\xEDWa!\xEDaS\xF8V[` \x02` \x01\x01Q`\x80\x01Q\x82\x81Q\x81\x10a\"\nWa\"\naS\xF8V[` \x02` \x01\x01Q\x90P`\0\x8C\x82\x86\t\x90P\x80\x89\x87\x81Q\x81\x10a\"/Wa\"/aS\xF8V[` \x02` \x01\x01\x81\x81RPPPP\x8D\x82\x81Q\x81\x10a\"OWa\"OaS\xF8V[` \x02` \x01\x01Q`\xA0\x01Q\x81\x81Q\x81\x10a\"lWa\"laS\xF8V[` \x02` \x01\x01Q\x86\x85\x81Q\x81\x10a\"\x86Wa\"\x86aS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra\"\x9C`\x01\x85aT%V[\x93P`\x01\x01a!\xB2V[P`\0\x8D\x82\x81Q\x81\x10a\"\xBBWa\"\xBBaS\xF8V[` \x02` \x01\x01Q` \x01Q\x90P`\0\x8B\x82\x85\t\x90P\x80\x88\x86\x81Q\x81\x10a\"\xE4Wa\"\xE4aS\xF8V[` \x02` \x01\x01\x81\x81RPPPP\x8C\x81\x81Q\x81\x10a#\x04Wa#\x04aS\xF8V[` \x02` \x01\x01Q`\xC0\x01Q\x85\x84\x81Q\x81\x10a#\"Wa#\"aS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra#8`\x01\x84aT%V[\x92P`\0\x8D\x82\x81Q\x81\x10a#NWa#NaS\xF8V[` \x02` \x01\x01Q`\0\x01Q\x90P`\0\x8E\x83\x81Q\x81\x10a#pWa#paS\xF8V[` \x02` \x01\x01Q`@\x01Q\x90P`\0\x8C\x8D\x83\x85\t\x86\t\x90P\x80\x89\x87\x81Q\x81\x10a#\x9CWa#\x9CaS\xF8V[` \x02` \x01\x01\x81\x81RPPPPP\x8C\x81\x81Q\x81\x10a#\xBDWa#\xBDaS\xF8V[` \x02` \x01\x01Q`\xE0\x01Q\x85\x84\x81Q\x81\x10a#\xDBWa#\xDBaS\xF8V[` \x90\x81\x02\x91\x90\x91\x01\x01Ra#\xF1`\x01\x84aT%V[\x92P`\0\x8D\x82\x81Q\x81\x10a$\x07Wa$\x07aS\xF8V[` \x02` \x01\x01Q``\x01Q\x90P\x8A\x8B\x82\x85\t\x86\x08\x94P\x8A\x8A\x84\t\x92PP`\x01\x01a!\xA6V[Pa$7\x83a/bV[\x85\x83\x81Q\x81\x10a$IWa$IaS\xF8V[` \x02` \x01\x01\x81\x81RPPa$\x81`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x84\x83\x81Q\x81\x10a$\x93Wa$\x93aS\xF8V[` \x02` \x01\x01\x81\x90RPa$\xB0a$\xAB\x85\x87a.hV[a/\x94V[\x95PPPPPP`\0`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa%o\x83\x82\x84a%ja0\x0FV[a0\xE0V[\x98\x97PPPPPPPPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a%\xB1W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x06\xBCV[`\0\x80Q` aU\x1F\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[```\0\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa%\xFD\x91\x90aT8V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a&8W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a&=V[``\x91P[P\x91P\x91Pa&M\x85\x83\x83a1\xC2V[\x92PPP[\x92\x91PPV[4\x15a\x08\xC7W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80Q` \x82\x01Q`\0\x91`\0\x80Q` aT\xFF\x839\x81Q\x91R\x91\x15\x90\x15\x16\x15a&\x9FWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x0E\xBCW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xBCV[a'W`@Q\x80a\x01\0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a'_aN\x0BV[`\0\x80Q` aU?\x839\x81Q\x91Ra'x\x82\x85a2!V[a'\x83\x82\x88\x88a2KV[\x84Qa'\x90\x90\x83\x90a4\xD7V[` \x85\x01Qa'\xA0\x90\x83\x90a4\xD7V[`@\x85\x01Qa'\xB0\x90\x83\x90a4\xD7V[``\x85\x01Qa'\xC0\x90\x83\x90a4\xD7V[`\x80\x85\x01Qa'\xD0\x90\x83\x90a4\xD7V[a'\xD9\x82a-;V[Pa'\xE3\x82a-;V[``\x84\x01Ra'\xF1\x82a-;V[`\x80\x84\x01R`\xA0\x85\x01Qa(\x06\x90\x83\x90a4\xD7V[a(\x0F\x82a-;V[\x83R`\xC0\x85\x01Qa(!\x90\x83\x90a4\xD7V[`\xE0\x85\x01Qa(1\x90\x83\x90a4\xD7V[a\x01\0\x85\x01Qa(B\x90\x83\x90a4\xD7V[a\x01 \x85\x01Qa(S\x90\x83\x90a4\xD7V[a\x01@\x85\x01Qa(d\x90\x83\x90a4\xD7V[a(m\x82a-;V[`\xA0\x84\x01Ra(|\x82\x86a4\xEEV[a(\x85\x82a-;V[`\xC0\x84\x01Ra\x01`\x85\x01Qa(\x9B\x90\x83\x90a4\xD7V[a\x01\x80\x85\x01Qa(\xAC\x90\x83\x90a4\xD7V[a(\xB5\x82a-;V[`\xE0\x84\x01R\x82Q\x81\x81\x80\t\x82\x82\x82\t` \x86\x01\x91\x90\x91R`@\x85\x01RP\x91\x96\x95PPPPPPV[a)\x0F`@Q\x80`\xA0\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[\x81b\x01\0\0\x03a)\xA3WP`@\x80Q`\xA0\x81\x01\x82R`\x10\x81R` \x81\x01\x92\x90\x92R\x7F0d\x1E\x0E\x92\xBE\xBE\xF8\x18&\x8Df;\xCA\xD6\xDB\xCF\xD6\xC0\x14\x91p\xF6\xD7\xD3P\xB1\xB1\xFAl\x10\x01\x90\x82\x01R~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7``\x82\x01R\x7F\x0B]V\xB7\x7F\xE7\x04\xE8\xE9#8\xC0\x08/7\xE0\x91\x12d\x14\xC80\xE4\xC6\x92-Z\xC8\x02\xD8B\xD4`\x80\x82\x01R\x90V[\x81b\x02\0\0\x03a*8WP`@\x80Q`\xA0\x81\x01\x82R`\x11\x81R` \x81\x01\x92\x90\x92R\x7F0d6@\xB9\xF8/\x90\xE8;i\x8E^\xA6\x17\x9C|\x05T.\x85\x953\xB4\x8B\x99S\xA2\xF56\x08\x01\x90\x82\x01R\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5``\x82\x01R\x7F$L\xF0\x10\xC4<\xA8r7\xD8\xB0\x0B\xF9\xDDP\xC4\xC0\x1C\x7F\x08k\xD4\xE8\xC9 \xE7RQ\xD9o\r\"`\x80\x82\x01R\x90V[\x81b\x04\0\0\x03a*\xCDWP`@\x80Q`\xA0\x81\x01\x82R`\x12\x81R` \x81\x01\x92\x90\x92R\x7F0dBY\xCD\x94\xE7\xDDPE\xD7\xA2p\x13\xB7\xFC\xD2\x1C\x9E;\x7F\xA7R\"\xE7\xBD\xA4\x9Br\x9B\x04\x01\x90\x82\x01R\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0``\x82\x01R\x7F\x03hS\xF0\x83x\x0E\x87\xF8\xD7\xC7\x1D\x11\x11\x19\xC5}\xBE\x11\x8C\"\xD5\xADpz\x821tf\xC5\x17L`\x80\x82\x01R\x90V[\x81b\x08\0\0\x03a+bWP`@\x80Q`\xA0\x81\x01\x82R`\x13\x81R` \x81\x01\x92\x90\x92R\x7F0dHfWcD\x03\x84K\x0E\xACx\xCA\x88,\xFD(CA\xFC\xB0aZ\x15\xCF\xCD\x17\xB1M\x82\x01\x90\x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD``\x82\x01R\x7F\x06\xE4\x02\xC0\xA3\x14\xFBg\xA1\\\xF8\x06fJ\xE1\xB7\"\xDB\xC0\xEF\xE6nl\x81\xD9\x8F\x99$\xCASS!`\x80\x82\x01R\x90V[\x81b\x10\0\0\x03a+\xF7WP`@\x80Q`\xA0\x81\x01\x82R`\x14\x81R` \x81\x01\x92\x90\x92R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x90\x82\x01R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW``\x82\x01R\x7F\x10\x0C3-!\0\x89_\xABds\xBC,Q\xBF\xCAR\x1FE\xCB;\xAC\xA6&\x08R\xA8\xFD\xE2l\x91\xF3`\x80\x82\x01R\x90V[\x81` \x03a,\x8AWP`@\x80Q`\xA0\x81\x01\x82R`\x05\x81R` \x81\x01\x92\x90\x92R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x90\x82\x01R\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0``\x82\x01R\x7F'$q6\x03\xBF\xBDy\n\xEA\xF3\xE7\xDF%\xD8\xE7\xEF\x8F1\x134\x90[M\x8C\x99\x98\x0C\xF2\x10\x97\x9D`\x80\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x91\x90PV[a,\xCC`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a,\xD6\x84\x84a5\x84V[\x80\x82Ra,\xE6\x90\x85\x90\x85\x90a5\xD8V[` \x82\x01R\x80Qa,\xFC\x90\x85\x90\x84\x90\x86\x90a64V[\x91P`\x01\x01a/\x10V[P\x92\x91PPV[`\0a/|`\0\x80Q` aU?\x839\x81Q\x91R\x83aT\x9AV[a&R\x90`\0\x80Q` aU?\x839\x81Q\x91RaT\xBCV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a/\xBCWP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01`\0\x80Q` aT\xFF\x839\x81Q\x91R\x84` \x01Qa/\xEF\x91\x90aT\x9AV[a0\x07\x90`\0\x80Q` aT\xFF\x839\x81Q\x91RaT\xBCV[\x90R\x92\x91PPV[a0:`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[`\0\x80`\0`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` `\0a\x01\x80\x83`\x08Z\xFA\x91PP`\0Q\x91P\x80a1\xB6W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\x06\xBCV[P\x15\x15\x95\x94PPPPPV[``\x82a1\xD7Wa1\xD2\x82a>\xDBV[a2\x1AV[\x81Q\x15\x80\x15a1\xEEWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a2\x17W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x06\xBCV[P\x80[\x93\x92PPPV[\x81Q`@Qa25\x91\x90\x83\x90` \x01aT\xCFV[`@\x80Q`\x1F\x19\x81\x84\x03\x01\x81R\x91\x90R\x90\x91RPV[`\xFEa2\x8C\x84a2\x87a2]\x84a?\x04V[`@Q` \x01a2o\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x04a<\rV[a2!V[a2\xCA\x84a2\x87a2\xA0\x86`\0\x01Qa?\x04V[`@Q` \x01a2\xB2\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R`\0`\x08a<\rV[a2\xDE\x84a2\x87a2\xA0\x86` \x01Qa?\x04V[a2\xE9\x84`\x01a;\xDAV[a3\x13\x84\x7F/\x8D\xD1\xF1\xA7X,W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x06\xBCV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra>PaNCV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R`\0\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80a>\x8DW`\0\x80\xFD[P\x80a>,W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x06\xBCV[\x80Q\x15a>\xEBW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0\x81\x90P`\x08\x81~\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\x16\x90\x1B`\x08\x82\x7F\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\xFF\0\x16\x90\x1C\x17\x90P`\x10\x81}\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\x16\x90\x1B`\x10\x82\x7F\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\xFF\xFF\0\0\x16\x90\x1C\x17\x90P` \x81{\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\x16\x90\x1B` \x82\x7F\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\xFF\xFF\xFF\xFF\0\0\0\0\x16\x90\x1C\x17\x90P`@\x81w\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16\x90\x1B`@\x82w\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\0\0\0\0\0\0\0\0\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16\x90\x1C\x17\x90P`\x80\x81\x90\x1B`\x80\x82\x90\x1C\x17\x90P\x91\x90PV[\x80Q` \x82\x01Q``\x91`\0\x91\x15\x90\x15\x16\x15a@fW`\x01`\xFE\x1B\x17[` \x83\x01Q`\0\x80Q` aT\xFF\x839\x81Q\x91R`\x01\x91\x90\x91\x1B\x10a@\x8CWP`\x01`\xFF\x1B[\x82Qa@\x99\x90\x82\x17a?\x04V[`@Q` \x01a@\xAB\x91\x81R` \x01\x90V[`@Q` \x81\x83\x03\x03\x81R\x90`@R\x91PP\x91\x90PV[`\0\x80`\0`\0\x80Q` aU?\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` `\0`\xC0\x83`\x05Z\xFA\x92PP`\0Q\x92P\x81aAaW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x06\xBCV[PP\x91\x90PV[``\x82` \x01Q\x82\x11\x15aA\x8FW`@Qc\x8C^\x11\xF1`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x83\x01Q`\x01`\0\x80Q` aU?\x839\x81Q\x91R\x84`\x01`\x01`@\x1B\x03\x81\x11\x15aA\xBDWaA\xBDaN\x7FV[`@Q\x90\x80\x82R\x80` \x02` \x01\x82\x01`@R\x80\x15aA\xE6W\x81` \x01` \x82\x02\x806\x837\x01\x90P[P\x93P\x84\x15\x19\x15a5\xCFW` \x84\x01\x85` \x02\x81\x01`\x01\x82R` \x82\x01\x91P[\x80\x82\x10\x15aB\"W\x82\x85\x85\t\x93P\x83\x82R` \x82\x01\x91PaB\x06V[PPPPP\x92\x91PPV[`\0\x80`\0\x80`\0\x80`\0\x80Q` aU?\x839\x81Q\x91R\x90P\x80` \x8B\x01Q` \x8D\x01Q\t\x95P\x8AQ\x93P\x80`\xA0\x8C\x01Q``\x8D\x01Q\t\x92P\x80a\x01\xA0\x8A\x01Q\x84\x08\x91P\x80`\x80\x8C\x01Q\x83\x08\x91P\x80\x84\x83\t\x93P\x80\x7F/\x8D\xD1\xF1\xA7X,Wa>,aS\x86V[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a/[Wa/[aS\x86V[`\0` \x82\x84\x03\x12\x15aS\xF1W`\0\x80\xFD[PQ\x91\x90PV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x80\x82\x02\x81\x15\x82\x82\x04\x84\x14\x17a&RWa&RaS\x86V[\x80\x82\x01\x80\x82\x11\x15a&RWa&RaS\x86V[`\0\x82QaTJ\x81\x84` \x87\x01aS\x14V[\x91\x90\x91\x01\x92\x91PPV[\x84\x81R\x83` \x82\x01R`\0\x83QaTr\x81`@\x85\x01` \x88\x01aS\x14V[`\xF8\x93\x90\x93\x1B`\x01`\x01`\xF8\x1B\x03\x19\x16`@\x92\x90\x93\x01\x91\x82\x01\x92\x90\x92R`A\x01\x94\x93PPPPV[`\0\x82aT\xB7WcNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD[P\x06\x90V[\x81\x81\x03\x81\x81\x11\x15a&RWa&RaS\x86V[`\0\x83QaT\xE1\x81\x84` \x88\x01aS\x14V[\x83Q\x90\x83\x01\x90aT\xF5\x81\x83` \x88\x01aS\x14V[\x01\x94\x93PPPPV\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n"; + /// The deployed bytecode of the contract. + pub static LIGHTCLIENTMOCK_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = + ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); + pub struct LightClientMock(::ethers::contract::Contract); + impl ::core::clone::Clone for LightClientMock { + fn clone(&self) -> Self { + Self(::core::clone::Clone::clone(&self.0)) + } + } + impl ::core::ops::Deref for LightClientMock { + type Target = ::ethers::contract::Contract; + fn deref(&self) -> &Self::Target { + &self.0 + } + } + impl ::core::ops::DerefMut for LightClientMock { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } + } + impl ::core::fmt::Debug for LightClientMock { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.debug_tuple(::core::stringify!(LightClientMock)) + .field(&self.address()) + .finish() + } + } + impl LightClientMock { + /// Creates a new contract instance with the specified `ethers` client at + /// `address`. The contract derefs to a `ethers::Contract` object. + pub fn new>( + address: T, + client: ::std::sync::Arc, + ) -> Self { + Self(::ethers::contract::Contract::new( + address.into(), + LIGHTCLIENTMOCK_ABI.clone(), + client, + )) + } + /// Constructs the general purpose `Deployer` instance based on the provided constructor arguments and sends it. + /// Returns a new instance of a deployer that returns an instance of this contract after sending the transaction + /// + /// Notes: + /// - If there are no constructor arguments, you should pass `()` as the argument. + /// - The default poll duration is 7 seconds. + /// - The default number of confirmations is 1 block. + /// + /// + /// # Example + /// + /// Generate contract bindings with `abigen!` and deploy a new contract instance. + /// + /// *Note*: this requires a `bytecode` and `abi` object in the `greeter.json` artifact. + /// + /// ```ignore + /// # async fn deploy(client: ::std::sync::Arc) { + /// abigen!(Greeter, "../greeter.json"); + /// + /// let greeter_contract = Greeter::deploy(client, "Hello world!".to_string()).unwrap().send().await.unwrap(); + /// let msg = greeter_contract.greet().call().await.unwrap(); + /// # } + /// ``` + pub fn deploy( + client: ::std::sync::Arc, + constructor_args: T, + ) -> ::core::result::Result< + ::ethers::contract::builders::ContractDeployer, + ::ethers::contract::ContractError, + > { + let factory = ::ethers::contract::ContractFactory::new( + LIGHTCLIENTMOCK_ABI.clone(), + LIGHTCLIENTMOCK_BYTECODE.clone().into(), + client, + ); + let deployer = factory.deploy(constructor_args)?; + let deployer = ::ethers::contract::ContractDeployer::new(deployer); + Ok(deployer) + } + ///Calls the contract's `UPGRADE_INTERFACE_VERSION` (0xad3cb1cc) function + pub fn upgrade_interface_version( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([173, 60, 177, 204], ()) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `blocksPerEpoch` (0xf0682054) function + pub fn blocks_per_epoch(&self) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([240, 104, 32, 84], ()) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `computeStakeTableComm` (0xaa922732) function + pub fn compute_stake_table_comm( + &self, + state: LightClientState, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([170, 146, 39, 50], (state,)) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `currentEpoch` (0x76671808) function + pub fn current_epoch(&self) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([118, 103, 24, 8], ()) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `frozenStakeTableCommitment` (0x382b215a) function + pub fn frozen_stake_table_commitment( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([56, 43, 33, 90], ()) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `frozenThreshold` (0xca6fe855) function + pub fn frozen_threshold( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([202, 111, 232, 85], ()) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `getFinalizedState` (0x82d07ff3) function + pub fn get_finalized_state( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([130, 208, 127, 243], ()) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `getGenesisState` (0x4847ae5d) function + pub fn get_genesis_state( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([72, 71, 174, 93], ()) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `getVersion` (0x0d8e6e2c) function + pub fn get_version(&self) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([13, 142, 110, 44], ()) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `initialize` (0xa244d596) function + pub fn initialize( + &self, + genesis: LightClientState, + num_blocks_per_epoch: u32, + owner: ::ethers::core::types::Address, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([162, 68, 213, 150], (genesis, num_blocks_per_epoch, owner)) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `newFinalizedState` (0x409939b7) function + pub fn new_finalized_state( + &self, + new_state: LightClientState, + proof: PlonkProof, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([64, 153, 57, 183], (new_state, proof)) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `owner` (0x8da5cb5b) function + pub fn owner( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([141, 165, 203, 91], ()) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `proxiableUUID` (0x52d1902d) function + pub fn proxiable_uuid(&self) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([82, 209, 144, 45], ()) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `renounceOwnership` (0x715018a6) function + pub fn renounce_ownership(&self) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([113, 80, 24, 166], ()) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `setCurrentEpoch` (0x3949d1e9) function + pub fn set_current_epoch( + &self, + new_epoch: u64, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([57, 73, 209, 233], new_epoch) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `setFinalizedState` (0x202a0adb) function + pub fn set_finalized_state( + &self, + state: LightClientState, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([32, 42, 10, 219], (state,)) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `states` (0x7f17baad) function + pub fn states( + &self, + index: u32, + ) -> ::ethers::contract::builders::ContractCall< + M, + ( + u64, + u64, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ), + > { + self.0 + .method_hash([127, 23, 186, 173], index) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `transferOwnership` (0xf2fde38b) function + pub fn transfer_ownership( + &self, + new_owner: ::ethers::core::types::Address, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([242, 253, 227, 139], new_owner) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `upgradeToAndCall` (0x4f1ef286) function + pub fn upgrade_to_and_call( + &self, + new_implementation: ::ethers::core::types::Address, + data: ::ethers::core::types::Bytes, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([79, 30, 242, 134], (new_implementation, data)) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `votingStakeTableCommitment` (0x76b6b7cb) function + pub fn voting_stake_table_commitment( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([118, 182, 183, 203], ()) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `votingThreshold` (0x62827733) function + pub fn voting_threshold( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([98, 130, 119, 51], ()) + .expect("method not found (this should never happen)") + } + ///Gets the contract's `EpochChanged` event + pub fn epoch_changed_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, EpochChangedFilter> + { + self.0.event() + } + ///Gets the contract's `Initialized` event + pub fn initialized_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, InitializedFilter> + { + self.0.event() + } + ///Gets the contract's `NewState` event + pub fn new_state_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, NewStateFilter> { + self.0.event() + } + ///Gets the contract's `OwnershipTransferred` event + pub fn ownership_transferred_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, OwnershipTransferredFilter> + { + self.0.event() + } + ///Gets the contract's `Upgrade` event + pub fn upgrade_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, UpgradeFilter> { + self.0.event() + } + ///Gets the contract's `Upgraded` event + pub fn upgraded_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, UpgradedFilter> { + self.0.event() + } + /// Returns an `Event` builder for all the events of this contract. + pub fn events( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, LightClientMockEvents> + { + self.0 + .event_with_filter(::core::default::Default::default()) + } + } + impl From<::ethers::contract::Contract> + for LightClientMock + { + fn from(contract: ::ethers::contract::Contract) -> Self { + Self::new(contract.address(), contract.client()) + } + } + ///Custom Error type `AddressEmptyCode` with signature `AddressEmptyCode(address)` and selector `0x9996b315` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "AddressEmptyCode", abi = "AddressEmptyCode(address)")] + pub struct AddressEmptyCode { + pub target: ::ethers::core::types::Address, + } + ///Custom Error type `ERC1967InvalidImplementation` with signature `ERC1967InvalidImplementation(address)` and selector `0x4c9c8ce3` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror( + name = "ERC1967InvalidImplementation", + abi = "ERC1967InvalidImplementation(address)" + )] + pub struct ERC1967InvalidImplementation { + pub implementation: ::ethers::core::types::Address, + } + ///Custom Error type `ERC1967NonPayable` with signature `ERC1967NonPayable()` and selector `0xb398979f` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "ERC1967NonPayable", abi = "ERC1967NonPayable()")] + pub struct ERC1967NonPayable; + ///Custom Error type `FailedInnerCall` with signature `FailedInnerCall()` and selector `0x1425ea42` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "FailedInnerCall", abi = "FailedInnerCall()")] + pub struct FailedInnerCall; + ///Custom Error type `InvalidArgs` with signature `InvalidArgs()` and selector `0xa1ba07ee` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "InvalidArgs", abi = "InvalidArgs()")] + pub struct InvalidArgs; + ///Custom Error type `InvalidInitialization` with signature `InvalidInitialization()` and selector `0xf92ee8a9` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "InvalidInitialization", abi = "InvalidInitialization()")] + pub struct InvalidInitialization; + ///Custom Error type `InvalidPolyEvalArgs` with signature `InvalidPolyEvalArgs()` and selector `0x8c5e11f1` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "InvalidPolyEvalArgs", abi = "InvalidPolyEvalArgs()")] + pub struct InvalidPolyEvalArgs; + ///Custom Error type `InvalidProof` with signature `InvalidProof()` and selector `0x09bde339` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "InvalidProof", abi = "InvalidProof()")] + pub struct InvalidProof; + ///Custom Error type `MissingLastBlockForCurrentEpoch` with signature `MissingLastBlockForCurrentEpoch(uint64)` and selector `0x1b2335f8` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror( + name = "MissingLastBlockForCurrentEpoch", + abi = "MissingLastBlockForCurrentEpoch(uint64)" + )] + pub struct MissingLastBlockForCurrentEpoch { + pub expected_block_height: u64, + } + ///Custom Error type `NotInitializing` with signature `NotInitializing()` and selector `0xd7e6bcf8` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "NotInitializing", abi = "NotInitializing()")] + pub struct NotInitializing; + ///Custom Error type `OutdatedState` with signature `OutdatedState()` and selector `0x051c46ef` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "OutdatedState", abi = "OutdatedState()")] + pub struct OutdatedState; + ///Custom Error type `OwnableInvalidOwner` with signature `OwnableInvalidOwner(address)` and selector `0x1e4fbdf7` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "OwnableInvalidOwner", abi = "OwnableInvalidOwner(address)")] + pub struct OwnableInvalidOwner { + pub owner: ::ethers::core::types::Address, + } + ///Custom Error type `OwnableUnauthorizedAccount` with signature `OwnableUnauthorizedAccount(address)` and selector `0x118cdaa7` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror( + name = "OwnableUnauthorizedAccount", + abi = "OwnableUnauthorizedAccount(address)" + )] + pub struct OwnableUnauthorizedAccount { + pub account: ::ethers::core::types::Address, + } + ///Custom Error type `UUPSUnauthorizedCallContext` with signature `UUPSUnauthorizedCallContext()` and selector `0xe07c8dba` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror( + name = "UUPSUnauthorizedCallContext", + abi = "UUPSUnauthorizedCallContext()" + )] + pub struct UUPSUnauthorizedCallContext; + ///Custom Error type `UUPSUnsupportedProxiableUUID` with signature `UUPSUnsupportedProxiableUUID(bytes32)` and selector `0xaa1d49a4` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror( + name = "UUPSUnsupportedProxiableUUID", + abi = "UUPSUnsupportedProxiableUUID(bytes32)" + )] + pub struct UUPSUnsupportedProxiableUUID { + pub slot: [u8; 32], + } + ///Custom Error type `UnsupportedDegree` with signature `UnsupportedDegree()` and selector `0xe2ef09e5` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "UnsupportedDegree", abi = "UnsupportedDegree()")] + pub struct UnsupportedDegree; + ///Custom Error type `WrongPlonkVK` with signature `WrongPlonkVK()` and selector `0x41f53b12` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "WrongPlonkVK", abi = "WrongPlonkVK()")] + pub struct WrongPlonkVK; + ///Custom Error type `WrongStakeTableUsed` with signature `WrongStakeTableUsed()` and selector `0x51618089` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror(name = "WrongStakeTableUsed", abi = "WrongStakeTableUsed()")] + pub struct WrongStakeTableUsed; + ///Container type for all of the contract's custom errors + #[derive( + Clone, + ::ethers::contract::EthAbiType, + serde::Serialize, + serde::Deserialize, + Debug, + PartialEq, + Eq, + Hash, + )] + pub enum LightClientMockErrors { + AddressEmptyCode(AddressEmptyCode), + ERC1967InvalidImplementation(ERC1967InvalidImplementation), + ERC1967NonPayable(ERC1967NonPayable), + FailedInnerCall(FailedInnerCall), + InvalidArgs(InvalidArgs), + InvalidInitialization(InvalidInitialization), + InvalidPolyEvalArgs(InvalidPolyEvalArgs), + InvalidProof(InvalidProof), + MissingLastBlockForCurrentEpoch(MissingLastBlockForCurrentEpoch), + NotInitializing(NotInitializing), + OutdatedState(OutdatedState), + OwnableInvalidOwner(OwnableInvalidOwner), + OwnableUnauthorizedAccount(OwnableUnauthorizedAccount), + UUPSUnauthorizedCallContext(UUPSUnauthorizedCallContext), + UUPSUnsupportedProxiableUUID(UUPSUnsupportedProxiableUUID), + UnsupportedDegree(UnsupportedDegree), + WrongPlonkVK(WrongPlonkVK), + WrongStakeTableUsed(WrongStakeTableUsed), + /// The standard solidity revert string, with selector + /// Error(string) -- 0x08c379a0 + RevertString(::std::string::String), + } + impl ::ethers::core::abi::AbiDecode for LightClientMockErrors { + fn decode( + data: impl AsRef<[u8]>, + ) -> ::core::result::Result { + let data = data.as_ref(); + if let Ok(decoded) = + <::std::string::String as ::ethers::core::abi::AbiDecode>::decode(data) + { + return Ok(Self::RevertString(decoded)); + } + if let Ok(decoded) = ::decode(data) + { + return Ok(Self::AddressEmptyCode(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::ERC1967InvalidImplementation(decoded)); + } + if let Ok(decoded) = ::decode(data) + { + return Ok(Self::ERC1967NonPayable(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::FailedInnerCall(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::InvalidArgs(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::InvalidInitialization(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::InvalidPolyEvalArgs(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::InvalidProof(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::MissingLastBlockForCurrentEpoch(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::NotInitializing(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::OutdatedState(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::OwnableInvalidOwner(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::OwnableUnauthorizedAccount(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::UUPSUnauthorizedCallContext(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::UUPSUnsupportedProxiableUUID(decoded)); + } + if let Ok(decoded) = ::decode(data) + { + return Ok(Self::UnsupportedDegree(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::WrongPlonkVK(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::WrongStakeTableUsed(decoded)); + } + Err(::ethers::core::abi::Error::InvalidData.into()) + } + } + impl ::ethers::core::abi::AbiEncode for LightClientMockErrors { + fn encode(self) -> ::std::vec::Vec { + match self { + Self::AddressEmptyCode(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::ERC1967InvalidImplementation(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::ERC1967NonPayable(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::FailedInnerCall(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::InvalidArgs(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::InvalidInitialization(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::InvalidPolyEvalArgs(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::InvalidProof(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::MissingLastBlockForCurrentEpoch(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::NotInitializing(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::OutdatedState(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::OwnableInvalidOwner(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::OwnableUnauthorizedAccount(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::UUPSUnauthorizedCallContext(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::UUPSUnsupportedProxiableUUID(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::UnsupportedDegree(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::WrongPlonkVK(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::WrongStakeTableUsed(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::RevertString(s) => ::ethers::core::abi::AbiEncode::encode(s), + } + } + } + impl ::ethers::contract::ContractRevert for LightClientMockErrors { + fn valid_selector(selector: [u8; 4]) -> bool { + match selector { + [0x08, 0xc3, 0x79, 0xa0] => true, + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => true, + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => true, + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => { + true + } + _ if selector + == ::selector() => true, + _ if selector + == ::selector() => { + true + } + _ => false, + } + } + } + impl ::core::fmt::Display for LightClientMockErrors { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + match self { + Self::AddressEmptyCode(element) => ::core::fmt::Display::fmt(element, f), + Self::ERC1967InvalidImplementation(element) => { + ::core::fmt::Display::fmt(element, f) + } + Self::ERC1967NonPayable(element) => ::core::fmt::Display::fmt(element, f), + Self::FailedInnerCall(element) => ::core::fmt::Display::fmt(element, f), + Self::InvalidArgs(element) => ::core::fmt::Display::fmt(element, f), + Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f), + Self::InvalidPolyEvalArgs(element) => ::core::fmt::Display::fmt(element, f), + Self::InvalidProof(element) => ::core::fmt::Display::fmt(element, f), + Self::MissingLastBlockForCurrentEpoch(element) => { + ::core::fmt::Display::fmt(element, f) + } + Self::NotInitializing(element) => ::core::fmt::Display::fmt(element, f), + Self::OutdatedState(element) => ::core::fmt::Display::fmt(element, f), + Self::OwnableInvalidOwner(element) => ::core::fmt::Display::fmt(element, f), + Self::OwnableUnauthorizedAccount(element) => ::core::fmt::Display::fmt(element, f), + Self::UUPSUnauthorizedCallContext(element) => ::core::fmt::Display::fmt(element, f), + Self::UUPSUnsupportedProxiableUUID(element) => { + ::core::fmt::Display::fmt(element, f) + } + Self::UnsupportedDegree(element) => ::core::fmt::Display::fmt(element, f), + Self::WrongPlonkVK(element) => ::core::fmt::Display::fmt(element, f), + Self::WrongStakeTableUsed(element) => ::core::fmt::Display::fmt(element, f), + Self::RevertString(s) => ::core::fmt::Display::fmt(s, f), + } + } + } + impl ::core::convert::From<::std::string::String> for LightClientMockErrors { + fn from(value: String) -> Self { + Self::RevertString(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: AddressEmptyCode) -> Self { + Self::AddressEmptyCode(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: ERC1967InvalidImplementation) -> Self { + Self::ERC1967InvalidImplementation(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: ERC1967NonPayable) -> Self { + Self::ERC1967NonPayable(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: FailedInnerCall) -> Self { + Self::FailedInnerCall(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: InvalidArgs) -> Self { + Self::InvalidArgs(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: InvalidInitialization) -> Self { + Self::InvalidInitialization(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: InvalidPolyEvalArgs) -> Self { + Self::InvalidPolyEvalArgs(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: InvalidProof) -> Self { + Self::InvalidProof(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: MissingLastBlockForCurrentEpoch) -> Self { + Self::MissingLastBlockForCurrentEpoch(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: NotInitializing) -> Self { + Self::NotInitializing(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: OutdatedState) -> Self { + Self::OutdatedState(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: OwnableInvalidOwner) -> Self { + Self::OwnableInvalidOwner(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: OwnableUnauthorizedAccount) -> Self { + Self::OwnableUnauthorizedAccount(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: UUPSUnauthorizedCallContext) -> Self { + Self::UUPSUnauthorizedCallContext(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: UUPSUnsupportedProxiableUUID) -> Self { + Self::UUPSUnsupportedProxiableUUID(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: UnsupportedDegree) -> Self { + Self::UnsupportedDegree(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: WrongPlonkVK) -> Self { + Self::WrongPlonkVK(value) + } + } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: WrongStakeTableUsed) -> Self { + Self::WrongStakeTableUsed(value) + } + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethevent(name = "EpochChanged", abi = "EpochChanged(uint64)")] + pub struct EpochChangedFilter(pub u64); + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethevent(name = "Initialized", abi = "Initialized(uint64)")] + pub struct InitializedFilter { + pub version: u64, + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethevent(name = "NewState", abi = "NewState(uint64,uint64,uint256)")] + pub struct NewStateFilter { + #[ethevent(indexed)] + pub view_num: u64, + #[ethevent(indexed)] + pub block_height: u64, + pub block_comm_root: ::ethers::core::types::U256, + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethevent( + name = "OwnershipTransferred", + abi = "OwnershipTransferred(address,address)" + )] + pub struct OwnershipTransferredFilter { + #[ethevent(indexed)] + pub previous_owner: ::ethers::core::types::Address, + #[ethevent(indexed)] + pub new_owner: ::ethers::core::types::Address, + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethevent(name = "Upgrade", abi = "Upgrade(address)")] + pub struct UpgradeFilter { + pub implementation: ::ethers::core::types::Address, + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethevent(name = "Upgraded", abi = "Upgraded(address)")] + pub struct UpgradedFilter { + #[ethevent(indexed)] + pub implementation: ::ethers::core::types::Address, + } + ///Container type for all of the contract's events + #[derive( + Clone, + ::ethers::contract::EthAbiType, + serde::Serialize, + serde::Deserialize, + Debug, + PartialEq, + Eq, + Hash, + )] + pub enum LightClientMockEvents { + EpochChangedFilter(EpochChangedFilter), + InitializedFilter(InitializedFilter), + NewStateFilter(NewStateFilter), + OwnershipTransferredFilter(OwnershipTransferredFilter), + UpgradeFilter(UpgradeFilter), + UpgradedFilter(UpgradedFilter), + } + impl ::ethers::contract::EthLogDecode for LightClientMockEvents { + fn decode_log( + log: &::ethers::core::abi::RawLog, + ) -> ::core::result::Result { + if let Ok(decoded) = EpochChangedFilter::decode_log(log) { + return Ok(LightClientMockEvents::EpochChangedFilter(decoded)); + } + if let Ok(decoded) = InitializedFilter::decode_log(log) { + return Ok(LightClientMockEvents::InitializedFilter(decoded)); + } + if let Ok(decoded) = NewStateFilter::decode_log(log) { + return Ok(LightClientMockEvents::NewStateFilter(decoded)); + } + if let Ok(decoded) = OwnershipTransferredFilter::decode_log(log) { + return Ok(LightClientMockEvents::OwnershipTransferredFilter(decoded)); + } + if let Ok(decoded) = UpgradeFilter::decode_log(log) { + return Ok(LightClientMockEvents::UpgradeFilter(decoded)); + } + if let Ok(decoded) = UpgradedFilter::decode_log(log) { + return Ok(LightClientMockEvents::UpgradedFilter(decoded)); + } + Err(::ethers::core::abi::Error::InvalidData) + } + } + impl ::core::fmt::Display for LightClientMockEvents { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + match self { + Self::EpochChangedFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::InitializedFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::NewStateFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::OwnershipTransferredFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::UpgradeFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::UpgradedFilter(element) => ::core::fmt::Display::fmt(element, f), + } + } + } + impl ::core::convert::From for LightClientMockEvents { + fn from(value: EpochChangedFilter) -> Self { + Self::EpochChangedFilter(value) + } + } + impl ::core::convert::From for LightClientMockEvents { + fn from(value: InitializedFilter) -> Self { + Self::InitializedFilter(value) + } + } + impl ::core::convert::From for LightClientMockEvents { + fn from(value: NewStateFilter) -> Self { + Self::NewStateFilter(value) + } + } + impl ::core::convert::From for LightClientMockEvents { + fn from(value: OwnershipTransferredFilter) -> Self { + Self::OwnershipTransferredFilter(value) + } + } + impl ::core::convert::From for LightClientMockEvents { + fn from(value: UpgradeFilter) -> Self { + Self::UpgradeFilter(value) + } + } + impl ::core::convert::From for LightClientMockEvents { + fn from(value: UpgradedFilter) -> Self { + Self::UpgradedFilter(value) + } + } + ///Container type for all input parameters for the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "UPGRADE_INTERFACE_VERSION", + abi = "UPGRADE_INTERFACE_VERSION()" + )] + pub struct UpgradeInterfaceVersionCall; + ///Container type for all input parameters for the `blocksPerEpoch` function with signature `blocksPerEpoch()` and selector `0xf0682054` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "blocksPerEpoch", abi = "blocksPerEpoch()")] + pub struct BlocksPerEpochCall; + ///Container type for all input parameters for the `computeStakeTableComm` function with signature `computeStakeTableComm((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0xaa922732` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "computeStakeTableComm", + abi = "computeStakeTableComm((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256))" + )] + pub struct ComputeStakeTableCommCall { + pub state: LightClientState, + } + ///Container type for all input parameters for the `currentEpoch` function with signature `currentEpoch()` and selector `0x76671808` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "currentEpoch", abi = "currentEpoch()")] + pub struct CurrentEpochCall; + ///Container type for all input parameters for the `frozenStakeTableCommitment` function with signature `frozenStakeTableCommitment()` and selector `0x382b215a` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "frozenStakeTableCommitment", + abi = "frozenStakeTableCommitment()" + )] + pub struct FrozenStakeTableCommitmentCall; + ///Container type for all input parameters for the `frozenThreshold` function with signature `frozenThreshold()` and selector `0xca6fe855` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "frozenThreshold", abi = "frozenThreshold()")] + pub struct FrozenThresholdCall; + ///Container type for all input parameters for the `getFinalizedState` function with signature `getFinalizedState()` and selector `0x82d07ff3` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "getFinalizedState", abi = "getFinalizedState()")] + pub struct GetFinalizedStateCall; + ///Container type for all input parameters for the `getGenesisState` function with signature `getGenesisState()` and selector `0x4847ae5d` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "getGenesisState", abi = "getGenesisState()")] + pub struct GetGenesisStateCall; + ///Container type for all input parameters for the `getVersion` function with signature `getVersion()` and selector `0x0d8e6e2c` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "getVersion", abi = "getVersion()")] + pub struct GetVersionCall; + ///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),uint32,address)` and selector `0xa244d596` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "initialize", + abi = "initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),uint32,address)" + )] + pub struct InitializeCall { + pub genesis: LightClientState, + pub num_blocks_per_epoch: u32, + pub owner: ::ethers::core::types::Address, + } + ///Container type for all input parameters for the `newFinalizedState` function with signature `newFinalizedState((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x409939b7` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + )] + #[ethcall( + name = "newFinalizedState", + abi = "newFinalizedState((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" + )] + pub struct NewFinalizedStateCall { + pub new_state: LightClientState, + pub proof: PlonkProof, + } + ///Container type for all input parameters for the `owner` function with signature `owner()` and selector `0x8da5cb5b` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "owner", abi = "owner()")] + pub struct OwnerCall; + ///Container type for all input parameters for the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "proxiableUUID", abi = "proxiableUUID()")] + pub struct ProxiableUUIDCall; + ///Container type for all input parameters for the `renounceOwnership` function with signature `renounceOwnership()` and selector `0x715018a6` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "renounceOwnership", abi = "renounceOwnership()")] + pub struct RenounceOwnershipCall; + ///Container type for all input parameters for the `setCurrentEpoch` function with signature `setCurrentEpoch(uint64)` and selector `0x3949d1e9` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "setCurrentEpoch", abi = "setCurrentEpoch(uint64)")] + pub struct SetCurrentEpochCall { + pub new_epoch: u64, + } + ///Container type for all input parameters for the `setFinalizedState` function with signature `setFinalizedState((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x202a0adb` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "setFinalizedState", + abi = "setFinalizedState((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256))" + )] + pub struct SetFinalizedStateCall { + pub state: LightClientState, + } + ///Container type for all input parameters for the `states` function with signature `states(uint32)` and selector `0x7f17baad` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "states", abi = "states(uint32)")] + pub struct StatesCall { + pub index: u32, + } + ///Container type for all input parameters for the `transferOwnership` function with signature `transferOwnership(address)` and selector `0xf2fde38b` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "transferOwnership", abi = "transferOwnership(address)")] + pub struct TransferOwnershipCall { + pub new_owner: ::ethers::core::types::Address, + } + ///Container type for all input parameters for the `upgradeToAndCall` function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "upgradeToAndCall", abi = "upgradeToAndCall(address,bytes)")] + pub struct UpgradeToAndCallCall { + pub new_implementation: ::ethers::core::types::Address, + pub data: ::ethers::core::types::Bytes, + } + ///Container type for all input parameters for the `votingStakeTableCommitment` function with signature `votingStakeTableCommitment()` and selector `0x76b6b7cb` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "votingStakeTableCommitment", + abi = "votingStakeTableCommitment()" + )] + pub struct VotingStakeTableCommitmentCall; + ///Container type for all input parameters for the `votingThreshold` function with signature `votingThreshold()` and selector `0x62827733` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "votingThreshold", abi = "votingThreshold()")] + pub struct VotingThresholdCall; + ///Container type for all of the contract's call + #[derive(Clone, ::ethers::contract::EthAbiType, serde::Serialize, serde::Deserialize)] + pub enum LightClientMockCalls { + UpgradeInterfaceVersion(UpgradeInterfaceVersionCall), + BlocksPerEpoch(BlocksPerEpochCall), + ComputeStakeTableComm(ComputeStakeTableCommCall), + CurrentEpoch(CurrentEpochCall), + FrozenStakeTableCommitment(FrozenStakeTableCommitmentCall), + FrozenThreshold(FrozenThresholdCall), + GetFinalizedState(GetFinalizedStateCall), + GetGenesisState(GetGenesisStateCall), + GetVersion(GetVersionCall), + Initialize(InitializeCall), + NewFinalizedState(NewFinalizedStateCall), + Owner(OwnerCall), + ProxiableUUID(ProxiableUUIDCall), + RenounceOwnership(RenounceOwnershipCall), + SetCurrentEpoch(SetCurrentEpochCall), + SetFinalizedState(SetFinalizedStateCall), + States(StatesCall), + TransferOwnership(TransferOwnershipCall), + UpgradeToAndCall(UpgradeToAndCallCall), + VotingStakeTableCommitment(VotingStakeTableCommitmentCall), + VotingThreshold(VotingThresholdCall), + } + impl ::ethers::core::abi::AbiDecode for LightClientMockCalls { + fn decode( + data: impl AsRef<[u8]>, + ) -> ::core::result::Result { + let data = data.as_ref(); + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::UpgradeInterfaceVersion(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::BlocksPerEpoch(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::ComputeStakeTableComm(decoded)); + } + if let Ok(decoded) = ::decode(data) + { + return Ok(Self::CurrentEpoch(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::FrozenStakeTableCommitment(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::FrozenThreshold(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::GetFinalizedState(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::GetGenesisState(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::GetVersion(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::Initialize(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::NewFinalizedState(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::Owner(decoded)); + } + if let Ok(decoded) = ::decode(data) + { + return Ok(Self::ProxiableUUID(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::RenounceOwnership(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::SetCurrentEpoch(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::SetFinalizedState(decoded)); + } + if let Ok(decoded) = ::decode(data) { + return Ok(Self::States(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::TransferOwnership(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::UpgradeToAndCall(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::VotingStakeTableCommitment(decoded)); + } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::VotingThreshold(decoded)); + } + Err(::ethers::core::abi::Error::InvalidData.into()) + } + } + impl ::ethers::core::abi::AbiEncode for LightClientMockCalls { + fn encode(self) -> Vec { + match self { + Self::UpgradeInterfaceVersion(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::BlocksPerEpoch(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::ComputeStakeTableComm(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::CurrentEpoch(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::FrozenStakeTableCommitment(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::FrozenThreshold(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::GetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::GetGenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::GetVersion(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::NewFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::Owner(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::ProxiableUUID(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::RenounceOwnership(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::SetCurrentEpoch(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::SetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::States(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::TransferOwnership(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::UpgradeToAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::VotingStakeTableCommitment(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::VotingThreshold(element) => ::ethers::core::abi::AbiEncode::encode(element), + } + } + } + impl ::core::fmt::Display for LightClientMockCalls { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + match self { + Self::UpgradeInterfaceVersion(element) => ::core::fmt::Display::fmt(element, f), + Self::BlocksPerEpoch(element) => ::core::fmt::Display::fmt(element, f), + Self::ComputeStakeTableComm(element) => ::core::fmt::Display::fmt(element, f), + Self::CurrentEpoch(element) => ::core::fmt::Display::fmt(element, f), + Self::FrozenStakeTableCommitment(element) => ::core::fmt::Display::fmt(element, f), + Self::FrozenThreshold(element) => ::core::fmt::Display::fmt(element, f), + Self::GetFinalizedState(element) => ::core::fmt::Display::fmt(element, f), + Self::GetGenesisState(element) => ::core::fmt::Display::fmt(element, f), + Self::GetVersion(element) => ::core::fmt::Display::fmt(element, f), + Self::Initialize(element) => ::core::fmt::Display::fmt(element, f), + Self::NewFinalizedState(element) => ::core::fmt::Display::fmt(element, f), + Self::Owner(element) => ::core::fmt::Display::fmt(element, f), + Self::ProxiableUUID(element) => ::core::fmt::Display::fmt(element, f), + Self::RenounceOwnership(element) => ::core::fmt::Display::fmt(element, f), + Self::SetCurrentEpoch(element) => ::core::fmt::Display::fmt(element, f), + Self::SetFinalizedState(element) => ::core::fmt::Display::fmt(element, f), + Self::States(element) => ::core::fmt::Display::fmt(element, f), + Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f), + Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f), + Self::VotingStakeTableCommitment(element) => ::core::fmt::Display::fmt(element, f), + Self::VotingThreshold(element) => ::core::fmt::Display::fmt(element, f), + } + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: UpgradeInterfaceVersionCall) -> Self { + Self::UpgradeInterfaceVersion(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: BlocksPerEpochCall) -> Self { + Self::BlocksPerEpoch(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: ComputeStakeTableCommCall) -> Self { + Self::ComputeStakeTableComm(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: CurrentEpochCall) -> Self { + Self::CurrentEpoch(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: FrozenStakeTableCommitmentCall) -> Self { + Self::FrozenStakeTableCommitment(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: FrozenThresholdCall) -> Self { + Self::FrozenThreshold(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: GetFinalizedStateCall) -> Self { + Self::GetFinalizedState(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: GetGenesisStateCall) -> Self { + Self::GetGenesisState(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: GetVersionCall) -> Self { + Self::GetVersion(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: InitializeCall) -> Self { + Self::Initialize(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: NewFinalizedStateCall) -> Self { + Self::NewFinalizedState(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: OwnerCall) -> Self { + Self::Owner(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: ProxiableUUIDCall) -> Self { + Self::ProxiableUUID(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: RenounceOwnershipCall) -> Self { + Self::RenounceOwnership(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: SetCurrentEpochCall) -> Self { + Self::SetCurrentEpoch(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: SetFinalizedStateCall) -> Self { + Self::SetFinalizedState(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: StatesCall) -> Self { + Self::States(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: TransferOwnershipCall) -> Self { + Self::TransferOwnership(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: UpgradeToAndCallCall) -> Self { + Self::UpgradeToAndCall(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: VotingStakeTableCommitmentCall) -> Self { + Self::VotingStakeTableCommitment(value) + } + } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: VotingThresholdCall) -> Self { + Self::VotingThreshold(value) + } + } + ///Container type for all return fields from the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); + ///Container type for all return fields from the `blocksPerEpoch` function with signature `blocksPerEpoch()` and selector `0xf0682054` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct BlocksPerEpochReturn(pub u32); + ///Container type for all return fields from the `computeStakeTableComm` function with signature `computeStakeTableComm((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0xaa922732` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct ComputeStakeTableCommReturn(pub [u8; 32]); + ///Container type for all return fields from the `currentEpoch` function with signature `currentEpoch()` and selector `0x76671808` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct CurrentEpochReturn(pub u64); + ///Container type for all return fields from the `frozenStakeTableCommitment` function with signature `frozenStakeTableCommitment()` and selector `0x382b215a` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct FrozenStakeTableCommitmentReturn(pub [u8; 32]); + ///Container type for all return fields from the `frozenThreshold` function with signature `frozenThreshold()` and selector `0xca6fe855` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct FrozenThresholdReturn(pub ::ethers::core::types::U256); + ///Container type for all return fields from the `getFinalizedState` function with signature `getFinalizedState()` and selector `0x82d07ff3` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct GetFinalizedStateReturn(pub LightClientState); + ///Container type for all return fields from the `getGenesisState` function with signature `getGenesisState()` and selector `0x4847ae5d` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct GetGenesisStateReturn(pub LightClientState); + ///Container type for all return fields from the `getVersion` function with signature `getVersion()` and selector `0x0d8e6e2c` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct GetVersionReturn { + pub major_version: u8, + pub minor_version: u8, + pub patch_version: u8, + } + ///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct OwnerReturn(pub ::ethers::core::types::Address); + ///Container type for all return fields from the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct ProxiableUUIDReturn(pub [u8; 32]); + ///Container type for all return fields from the `states` function with signature `states(uint32)` and selector `0x7f17baad` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct StatesReturn { + pub view_num: u64, + pub block_height: u64, + pub block_comm_root: ::ethers::core::types::U256, + pub fee_ledger_comm: ::ethers::core::types::U256, + pub stake_table_bls_key_comm: ::ethers::core::types::U256, + pub stake_table_schnorr_key_comm: ::ethers::core::types::U256, + pub stake_table_amount_comm: ::ethers::core::types::U256, + pub threshold: ::ethers::core::types::U256, + } + ///Container type for all return fields from the `votingStakeTableCommitment` function with signature `votingStakeTableCommitment()` and selector `0x76b6b7cb` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct VotingStakeTableCommitmentReturn(pub [u8; 32]); + ///Container type for all return fields from the `votingThreshold` function with signature `votingThreshold()` and selector `0x62827733` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct VotingThresholdReturn(pub ::ethers::core::types::U256); +} diff --git a/contract-bindings/src/light_client_state_update_vk_mock.rs b/contract-bindings/src/light_client_state_update_vk_mock.rs new file mode 100644 index 0000000000..bb9fc46d66 --- /dev/null +++ b/contract-bindings/src/light_client_state_update_vk_mock.rs @@ -0,0 +1,122 @@ +pub use light_client_state_update_vk_mock::*; +/// This module was auto-generated with ethers-rs Abigen. +/// More information at: +#[allow( + clippy::enum_variant_names, + clippy::too_many_arguments, + clippy::upper_case_acronyms, + clippy::type_complexity, + dead_code, + non_camel_case_types +)] +pub mod light_client_state_update_vk_mock { + #[allow(deprecated)] + fn __abi() -> ::ethers::core::abi::Abi { + ::ethers::core::abi::ethabi::Contract { + constructor: ::core::option::Option::None, + functions: ::std::collections::BTreeMap::new(), + events: ::std::collections::BTreeMap::new(), + errors: ::std::collections::BTreeMap::new(), + receive: false, + fallback: false, + } + } + ///The parsed JSON ABI of the contract. + pub static LIGHTCLIENTSTATEUPDATEVKMOCK_ABI: ::ethers::contract::Lazy< + ::ethers::core::abi::Abi, + > = ::ethers::contract::Lazy::new(__abi); + #[rustfmt::skip] + const __BYTECODE: &[u8] = b"`-`7`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14`*WcNH{q`\xE0\x1B`\0R`\0`\x04R`$`\0\xFD[0`\0R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA1dsolcC\0\x08\x17\0\n"; + /// The bytecode of the contract. + pub static LIGHTCLIENTSTATEUPDATEVKMOCK_BYTECODE: ::ethers::core::types::Bytes = + ::ethers::core::types::Bytes::from_static(__BYTECODE); + #[rustfmt::skip] + const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\0\x80\xFD\xFE\xA1dsolcC\0\x08\x17\0\n"; + /// The deployed bytecode of the contract. + pub static LIGHTCLIENTSTATEUPDATEVKMOCK_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = + ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); + pub struct LightClientStateUpdateVKMock(::ethers::contract::Contract); + impl ::core::clone::Clone for LightClientStateUpdateVKMock { + fn clone(&self) -> Self { + Self(::core::clone::Clone::clone(&self.0)) + } + } + impl ::core::ops::Deref for LightClientStateUpdateVKMock { + type Target = ::ethers::contract::Contract; + fn deref(&self) -> &Self::Target { + &self.0 + } + } + impl ::core::ops::DerefMut for LightClientStateUpdateVKMock { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } + } + impl ::core::fmt::Debug for LightClientStateUpdateVKMock { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.debug_tuple(::core::stringify!(LightClientStateUpdateVKMock)) + .field(&self.address()) + .finish() + } + } + impl LightClientStateUpdateVKMock { + /// Creates a new contract instance with the specified `ethers` client at + /// `address`. The contract derefs to a `ethers::Contract` object. + pub fn new>( + address: T, + client: ::std::sync::Arc, + ) -> Self { + Self(::ethers::contract::Contract::new( + address.into(), + LIGHTCLIENTSTATEUPDATEVKMOCK_ABI.clone(), + client, + )) + } + /// Constructs the general purpose `Deployer` instance based on the provided constructor arguments and sends it. + /// Returns a new instance of a deployer that returns an instance of this contract after sending the transaction + /// + /// Notes: + /// - If there are no constructor arguments, you should pass `()` as the argument. + /// - The default poll duration is 7 seconds. + /// - The default number of confirmations is 1 block. + /// + /// + /// # Example + /// + /// Generate contract bindings with `abigen!` and deploy a new contract instance. + /// + /// *Note*: this requires a `bytecode` and `abi` object in the `greeter.json` artifact. + /// + /// ```ignore + /// # async fn deploy(client: ::std::sync::Arc) { + /// abigen!(Greeter, "../greeter.json"); + /// + /// let greeter_contract = Greeter::deploy(client, "Hello world!".to_string()).unwrap().send().await.unwrap(); + /// let msg = greeter_contract.greet().call().await.unwrap(); + /// # } + /// ``` + pub fn deploy( + client: ::std::sync::Arc, + constructor_args: T, + ) -> ::core::result::Result< + ::ethers::contract::builders::ContractDeployer, + ::ethers::contract::ContractError, + > { + let factory = ::ethers::contract::ContractFactory::new( + LIGHTCLIENTSTATEUPDATEVKMOCK_ABI.clone(), + LIGHTCLIENTSTATEUPDATEVKMOCK_BYTECODE.clone().into(), + client, + ); + let deployer = factory.deploy(constructor_args)?; + let deployer = ::ethers::contract::ContractDeployer::new(deployer); + Ok(deployer) + } + } + impl From<::ethers::contract::Contract> + for LightClientStateUpdateVKMock + { + fn from(contract: ::ethers::contract::Contract) -> Self { + Self::new(contract.address(), contract.client()) + } + } +} diff --git a/contract-bindings/src/shared_types.rs b/contract-bindings/src/shared_types.rs index c57523eaf9..18211d22ab 100644 --- a/contract-bindings/src/shared_types.rs +++ b/contract-bindings/src/shared_types.rs @@ -53,3 +53,26 @@ pub struct PlonkProof { pub sigma_eval_3: ::ethers::core::types::U256, pub prod_perm_zeta_omega_eval: ::ethers::core::types::U256, } +///`LightClientState(uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256)` +#[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, +)] +pub struct LightClientState { + pub view_num: u64, + pub block_height: u64, + pub block_comm_root: ::ethers::core::types::U256, + pub fee_ledger_comm: ::ethers::core::types::U256, + pub stake_table_bls_key_comm: ::ethers::core::types::U256, + pub stake_table_schnorr_key_comm: ::ethers::core::types::U256, + pub stake_table_amount_comm: ::ethers::core::types::U256, + pub threshold: ::ethers::core::types::U256, +} diff --git a/contracts/rust/adapter/src/light_client.rs b/contracts/rust/adapter/src/light_client.rs index 5396edbee6..6dbe8586d9 100644 --- a/contracts/rust/adapter/src/light_client.rs +++ b/contracts/rust/adapter/src/light_client.rs @@ -22,6 +22,26 @@ pub struct ParsedLightClientState { pub threshold: U256, } +impl ParsedLightClientState { + /// Return a dummy new genesis that will pass constructor/initializer sanity checks + /// in the contract. + /// + /// # Warning + /// NEVER use this for production, this is test only. + pub fn dummy_genesis() -> Self { + Self { + view_num: 0, + block_height: 0, + block_comm_root: U256::from(0), + fee_ledger_comm: U256::from(0), + bls_key_comm: U256::from(123), + schnorr_key_comm: U256::from(123), + amount_comm: U256::from(20), + threshold: U256::from(1), + } + } +} + impl FromStr for ParsedLightClientState { type Err = AbiError; fn from_str(s: &str) -> Result { diff --git a/contracts/rust/gen-vk-contract/src/main.rs b/contracts/rust/gen-vk-contract/src/main.rs index f208976b78..9c78bb78b4 100644 --- a/contracts/rust/gen-vk-contract/src/main.rs +++ b/contracts/rust/gen-vk-contract/src/main.rs @@ -25,7 +25,7 @@ fn main() { powers_of_h: vec![srs.h, srs.beta_h], } }; - let (_, vk) = hotshot_state_prover::preprocess::(&srs) + let (_, vk) = hotshot_state_prover::preprocess(&srs, STAKE_TABLE_CAPACITY) .expect("Circuit preprocess failed"); let vk: ParsedVerifyingKey = vk.into(); diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol index ff1fe9a488..93d93e43fb 100644 --- a/contracts/test/LightClient.t.sol +++ b/contracts/test/LightClient.t.sol @@ -10,7 +10,7 @@ import { IPlonkVerifier as V } from "../src/interfaces/IPlonkVerifier.sol"; // Target contract import { LightClient as LC } from "../src/LightClient.sol"; -import { LightClientTest as LCTest } from "./mocks/LightClientTest.sol"; +import { LightClientMock as LCTest } from "./mocks/LightClientMock.sol"; import { BN254 } from "bn254/BN254.sol"; /// @dev Common helpers for LightClient tests diff --git a/contracts/test/LightClientTest.s.sol b/contracts/test/LightClientTest.s.sol index 61635a015a..90c4478c11 100644 --- a/contracts/test/LightClientTest.s.sol +++ b/contracts/test/LightClientTest.s.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.0; import "forge-std/Script.sol"; import { BN254 } from "bn254/BN254.sol"; import { LightClient as LC } from "../src/LightClient.sol"; -import { LightClientTest as LCTest } from "../test/mocks/LightClientTest.sol"; +import { LightClientMock as LCTest } from "../test/mocks/LightClientMock.sol"; /// @notice deployment script for LightClientTest which is designed for testing purposes with /// verification key corresponding to smaller circuit, thus faster proof generation during tests. diff --git a/contracts/test/PlonkVerifier.t.sol b/contracts/test/PlonkVerifier.t.sol index 139edfc6c7..aeaf068ce1 100644 --- a/contracts/test/PlonkVerifier.t.sol +++ b/contracts/test/PlonkVerifier.t.sol @@ -17,7 +17,7 @@ pragma solidity ^0.8.0; import "forge-std/Test.sol"; import { BN254 } from "bn254/BN254.sol"; import { IPlonkVerifier } from "../src/interfaces/IPlonkVerifier.sol"; -import { LightClientStateUpdateVKTest as VkTest } from "./mocks/LightClientStateUpdateVKTest.sol"; +import { LightClientStateUpdateVKMock as VkTest } from "./mocks/LightClientStateUpdateVKMock.sol"; import { PolynomialEval as Poly } from "../src/libraries/PolynomialEval.sol"; // Target contract diff --git a/contracts/test/StakeTable.t.sol b/contracts/test/StakeTable.t.sol index 142f2baf56..3018b7fb56 100644 --- a/contracts/test/StakeTable.t.sol +++ b/contracts/test/StakeTable.t.sol @@ -15,7 +15,7 @@ import { BLSSig } from "../src/libraries/BLSSig.sol"; import { EdOnBN254 } from "../src/libraries/EdOnBn254.sol"; import { AbstractStakeTable } from "../src/interfaces/AbstractStakeTable.sol"; import { LightClient as LC } from "../src/LightClient.sol"; -import { LightClientTest as LCTest } from "../test/mocks/LightClientTest.sol"; +import { LightClientMock as LCTest } from "../test/mocks/LightClientMock.sol"; // Token contract import { ExampleToken } from "../src/ExampleToken.sol"; diff --git a/contracts/test/StakeTableInvariant.t.sol b/contracts/test/StakeTableInvariant.t.sol index 2e07c1043b..ab4c93ee40 100644 --- a/contracts/test/StakeTableInvariant.t.sol +++ b/contracts/test/StakeTableInvariant.t.sol @@ -11,7 +11,7 @@ import { BN254 } from "bn254/BN254.sol"; import { EdOnBN254 } from "../src/libraries/EdOnBn254.sol"; import { AbstractStakeTable } from "../src/interfaces/AbstractStakeTable.sol"; import { LightClient } from "../src/LightClient.sol"; -import { LightClientTest } from "../test/mocks/LightClientTest.sol"; +import { LightClientMock } from "../test/mocks/LightClientMock.sol"; import { StakeTableCommonTest } from "../test/StakeTable.t.sol"; // Token contract @@ -26,7 +26,7 @@ contract StakeTableHandlerTest is StakeTableCommonTest { ExampleToken public token; mapping(uint256 index => BN254.G2Point vk) public vks; BN254.G2Point[] public vksWithdraw; - LightClientTest public lightClient; + LightClientMock public lightClient; address[] public users; // Variables for testing invariant relative to Register @@ -51,7 +51,7 @@ contract StakeTableHandlerTest is StakeTableCommonTest { S _stakeTable, address _tokenCreator, ExampleToken _token, - LightClientTest _lightClient + LightClientMock _lightClient ) { stakeTable = _stakeTable; token = _token; @@ -254,7 +254,7 @@ contract StakeTableHandlerTest is StakeTableCommonTest { contract StakeTableInvariant_Tests is Test { S public stakeTable; ExampleToken public token; - LightClientTest public lightClientContract; + LightClientMock public lightClientContract; uint256 public constant INITIAL_BALANCE = 1_000_000_000_000; address public exampleTokenCreator; address[] public users; @@ -278,7 +278,7 @@ contract StakeTableInvariant_Tests is Test { }); uint32 numBlocksPerEpoch = 4; uint64 churnRate = 10; - lightClientContract = new LightClientTest(genesis, numBlocksPerEpoch); + lightClientContract = new LightClientMock(genesis, numBlocksPerEpoch); stakeTable = new S(address(token), address(lightClientContract), churnRate); handler = new StakeTableHandlerTest(stakeTable, exampleTokenCreator, token, lightClientContract); diff --git a/contracts/test/Transcript.t.sol b/contracts/test/Transcript.t.sol index 34ade88cfd..16455d54ca 100644 --- a/contracts/test/Transcript.t.sol +++ b/contracts/test/Transcript.t.sol @@ -8,7 +8,7 @@ pragma solidity ^0.8.0; import "forge-std/Test.sol"; import { BN254 } from "bn254/BN254.sol"; import { IPlonkVerifier } from "../src/interfaces/IPlonkVerifier.sol"; -import { LightClientStateUpdateVKTest as VkTest } from "./mocks/LightClientStateUpdateVKTest.sol"; +import { LightClientStateUpdateVKMock as VkTest } from "./mocks/LightClientStateUpdateVKMock.sol"; // Target contract import { Transcript as T } from "../src/libraries/Transcript.sol"; diff --git a/contracts/test/mocks/LightClientTest.sol b/contracts/test/mocks/LightClientMock.sol similarity index 91% rename from contracts/test/mocks/LightClientTest.sol rename to contracts/test/mocks/LightClientMock.sol index 1e767872c0..a1aef7ff59 100644 --- a/contracts/test/mocks/LightClientTest.sol +++ b/contracts/test/mocks/LightClientMock.sol @@ -5,10 +5,10 @@ pragma solidity ^0.8.0; import { LightClient as LC } from "../../src/LightClient.sol"; import { IPlonkVerifier } from "../../src/interfaces/IPlonkVerifier.sol"; import { PlonkVerifier } from "../../src/libraries/PlonkVerifier.sol"; -import { LightClientStateUpdateVKTest as VkLib } from "./LightClientStateUpdateVKTest.sol"; +import { LightClientStateUpdateVKMock as VkLib } from "./LightClientStateUpdateVKMock.sol"; /// @dev A helper that wraps LightClient contract for testing -contract LightClientTest is LC { +contract LightClientMock is LC { constructor(LC.LightClientState memory genesis, uint32 numBlockPerEpoch) LC() { _initializeState(genesis, numBlockPerEpoch); } diff --git a/contracts/test/mocks/LightClientStateUpdateVKTest.sol b/contracts/test/mocks/LightClientStateUpdateVKMock.sol similarity index 99% rename from contracts/test/mocks/LightClientStateUpdateVKTest.sol rename to contracts/test/mocks/LightClientStateUpdateVKMock.sol index dac870c8d2..e474b7e5b5 100644 --- a/contracts/test/mocks/LightClientStateUpdateVKTest.sol +++ b/contracts/test/mocks/LightClientStateUpdateVKMock.sol @@ -19,7 +19,7 @@ import { IPlonkVerifier } from "../../src/interfaces/IPlonkVerifier.sol"; /* solhint-disable no-inline-assembly */ -library LightClientStateUpdateVKTest { +library LightClientStateUpdateVKMock { function getVk() internal pure returns (IPlonkVerifier.VerifyingKey memory vk) { assembly { // domain size diff --git a/docker-compose.yaml b/docker-compose.yaml index 759376e994..3d686c623c 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -198,7 +198,7 @@ services: image: ghcr.io/espressosystems/espresso-sequencer/sequencer:main ports: - "$ESPRESSO_SEQUENCER1_API_PORT:$ESPRESSO_SEQUENCER_API_PORT" - command: sequencer -- storage-sql -- http -- query -- catchup + command: sequencer -- storage-sql -- http -- query -- catchup -- state environment: - ESPRESSO_SEQUENCER_ORCHESTRATOR_URL - ESPRESSO_SEQUENCER_CDN_ENDPOINT @@ -417,6 +417,7 @@ services: sequencer-db: image: postgres + user: postgres ports: - "$ESPRESSO_SEQUENCER_DB_PORT:5432" environment: diff --git a/flake.nix b/flake.nix index 7736b430d1..59c458a309 100644 --- a/flake.nix +++ b/flake.nix @@ -162,7 +162,7 @@ description = "Spell checking"; entry = "typos"; pass_filenames = true; - excludes = [ "contract-bindings/artifacts" ]; + excludes = [ "contract-bindings/" ]; }; nixpkgs-fmt.enable = true; }; diff --git a/hotshot-state-prover/src/bin/gen-demo-genesis.rs b/hotshot-state-prover/src/bin/gen-demo-genesis.rs index 9ef1d430de..8ff0b54802 100644 --- a/hotshot-state-prover/src/bin/gen-demo-genesis.rs +++ b/hotshot-state-prover/src/bin/gen-demo-genesis.rs @@ -1,5 +1,6 @@ use clap::Parser; use ethers::abi::AbiEncode; +use hotshot_stake_table::config::STAKE_TABLE_CAPACITY; use hotshot_state_prover::service::light_client_genesis; use url::Url; @@ -18,6 +19,8 @@ struct Args { #[async_std::main] async fn main() { let args = Args::parse(); - let pi = light_client_genesis(&args.orchestrator_url).await.unwrap(); + let pi = light_client_genesis(&args.orchestrator_url, STAKE_TABLE_CAPACITY) + .await + .unwrap(); println!("{}", pi.encode_hex()); } diff --git a/hotshot-state-prover/src/bin/state-prover.rs b/hotshot-state-prover/src/bin/state-prover.rs index 19a082b146..7dfc08a4ce 100644 --- a/hotshot-state-prover/src/bin/state-prover.rs +++ b/hotshot-state-prover/src/bin/state-prover.rs @@ -5,6 +5,7 @@ use es_version::SEQUENCER_VERSION; use ethers::providers::{Http, Middleware, Provider}; use ethers::signers::{coins_bip39::English, MnemonicBuilder, Signer}; use ethers::types::Address; +use hotshot_stake_table::config::STAKE_TABLE_CAPACITY; use hotshot_state_prover::service::{run_prover_once, run_prover_service, StateProverConfig}; use snafu::Snafu; use std::{str::FromStr as _, time::Duration}; @@ -66,8 +67,14 @@ struct Args { /// The server provides healthcheck and version endpoints. #[clap(short, long, env = "ESPRESSO_PROVER_SERVICE_PORT")] pub port: Option, + + /// Stake table capacity for the prover circuit + #[clap(short, long, env = "ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY", default_value_t = STAKE_TABLE_CAPACITY)] + pub stake_table_capacity: usize, } +// + #[derive(Clone, Debug, Snafu)] pub struct ParseDurationError { reason: String, @@ -107,6 +114,7 @@ async fn main() { .clone(), orchestrator_url: args.orchestrator_url, port: args.port, + stake_table_capacity: args.stake_table_capacity, }; if args.daemon { diff --git a/hotshot-state-prover/src/circuit.rs b/hotshot-state-prover/src/circuit.rs index c51a12e46f..032b3c519b 100644 --- a/hotshot-state-prover/src/circuit.rs +++ b/hotshot-state-prover/src/circuit.rs @@ -126,8 +126,8 @@ impl AsRef<[Variable]> for LightClientStateVar { /// - a list of schnorr signatures of the updated states (`Vec`), default if the node doesn't sign the state /// - updated light client state (`(view_number, block_height, block_comm_root, fee_ledger_comm, stake_table_comm)`) /// - a quorum threshold -/// Lengths of input vectors should not exceed the `STAKE_TABLE_CAPACITY`. -/// The list of stake table entries, bit indicators and signatures will be padded to the `STAKE_TABLE_CAPACITY`. +/// Lengths of input vectors should not exceed the `stake_table_capacity`. +/// The list of stake table entries, bit indicators and signatures will be padded to the `stake_table_capacity`. /// It checks that /// - the vector that indicates who signed is a bit vector /// - the signers' accumulated weight exceeds the quorum threshold @@ -138,12 +138,13 @@ impl AsRef<[Variable]> for LightClientStateVar { /// - A list of public inputs for verification /// - A `PlonkError` if any error happens when building the circuit #[allow(clippy::too_many_lines)] -pub(crate) fn build( +pub(crate) fn build( stake_table_entries: STIter, signer_bit_vec: BitIter, signatures: SigIter, lightclient_state: &GenericLightClientState, threshold: &U256, + stake_table_capacity: usize, ) -> Result<(PlonkCircuit, GenericPublicInput), PlonkError> where F: RescueParameter, @@ -161,30 +162,30 @@ where let stake_table_entries = stake_table_entries.into_iter(); let signer_bit_vec = signer_bit_vec.into_iter(); let signatures = signatures.into_iter(); - if stake_table_entries.len() > STAKE_TABLE_CAPACITY { + if stake_table_entries.len() > stake_table_capacity { return Err(PlonkError::CircuitError(CircuitError::ParameterError( format!( "Number of input stake table entries {} exceeds the capacity {}", stake_table_entries.len(), - STAKE_TABLE_CAPACITY, + stake_table_capacity, ), ))); } - if signer_bit_vec.len() > STAKE_TABLE_CAPACITY { + if signer_bit_vec.len() > stake_table_capacity { return Err(PlonkError::CircuitError(CircuitError::ParameterError( format!( "Length of input bit vector {} exceeds the capacity {}", signer_bit_vec.len(), - STAKE_TABLE_CAPACITY, + stake_table_capacity, ), ))); } - if signatures.len() > STAKE_TABLE_CAPACITY { + if signatures.len() > stake_table_capacity { return Err(PlonkError::CircuitError(CircuitError::ParameterError( format!( "Number of input signatures {} exceeds the capacity {}", signatures.len(), - STAKE_TABLE_CAPACITY, + stake_table_capacity, ), ))); } @@ -192,7 +193,7 @@ where let mut circuit = PlonkCircuit::new_turbo_plonk(); // creating variables for stake table entries - let stake_table_entries_pad_len = STAKE_TABLE_CAPACITY - stake_table_entries.len(); + let stake_table_entries_pad_len = stake_table_capacity - stake_table_entries.len(); let mut stake_table_var = stake_table_entries .map(|item| { let item = item.borrow(); @@ -219,7 +220,7 @@ where ); // creating variables for signatures - let sig_pad_len = STAKE_TABLE_CAPACITY - signatures.len(); + let sig_pad_len = stake_table_capacity - signatures.len(); let mut sig_vars = signatures .map(|sig| circuit.create_signature_variable(sig.borrow())) .collect::, CircuitError>>()?; @@ -230,7 +231,7 @@ where ); // creating Boolean variables for the bit vector - let bit_vec_pad_len = STAKE_TABLE_CAPACITY - signer_bit_vec.len(); + let bit_vec_pad_len = stake_table_capacity - signer_bit_vec.len(); let collect = signer_bit_vec .map(|b| { let var = circuit.create_variable(*b.borrow())?; @@ -264,7 +265,7 @@ where ]; // Checking whether the accumulated weight exceeds the quorum threshold - let mut signed_amount_var = (0..STAKE_TABLE_CAPACITY / 2) + let mut signed_amount_var = (0..stake_table_capacity / 2) .map(|i| { circuit.mul_add( &[ @@ -277,11 +278,11 @@ where ) }) .collect::, CircuitError>>()?; - // Adding the last if STAKE_TABLE_CAPACITY is not a multiple of 2 - if STAKE_TABLE_CAPACITY % 2 == 1 { + // Adding the last if stake_table_capacity is not a multiple of 2 + if stake_table_capacity % 2 == 1 { signed_amount_var.push(circuit.mul( - stake_table_var[STAKE_TABLE_CAPACITY - 1].stake_amount, - signer_bit_vec_var[STAKE_TABLE_CAPACITY - 1].0, + stake_table_var[stake_table_capacity - 1].stake_amount, + signer_bit_vec_var[stake_table_capacity - 1].0, )?); } let acc_amount_var = circuit.sum(&signed_amount_var)?; @@ -348,7 +349,8 @@ where } /// Internal function to build a dummy circuit -pub(crate) fn build_for_preprocessing( +pub(crate) fn build_for_preprocessing( + stake_table_capacity: usize, ) -> Result<(PlonkCircuit, GenericPublicInput), PlonkError> where F: RescueParameter, @@ -361,7 +363,14 @@ where fee_ledger_comm: F::default(), stake_table_comm: (F::default(), F::default(), F::default()), }; - build::(&[], &[], &[], &lightclient_state, &U256::zero()) + build::( + &[], + &[], + &[], + &lightclient_state, + &U256::zero(), + stake_table_capacity, + ) } #[cfg(test)] @@ -439,24 +448,26 @@ mod tests { .map(|b| if b { F::from(1u64) } else { F::from(0u64) }) .collect::>(); // good path - let (circuit, public_inputs) = build::<_, _, _, _, _, ST_CAPACITY>( + let (circuit, public_inputs) = build::<_, _, _, _, _>( &entries, &bit_vec, &bit_masked_sigs, &lightclient_state, &U256::from(26u32), + ST_CAPACITY, ) .unwrap(); assert!(circuit .check_circuit_satisfiability(public_inputs.as_ref()) .is_ok()); - let (circuit, public_inputs) = build::<_, _, _, _, _, ST_CAPACITY>( + let (circuit, public_inputs) = build::<_, _, _, _, _>( &entries, &bit_vec, &bit_masked_sigs, &lightclient_state, &U256::from(10u32), + ST_CAPACITY, ) .unwrap(); assert!(circuit @@ -465,12 +476,13 @@ mod tests { // bad path: feeding non-bit vector let bit_vec = [F::from(2u64); 10]; - let (circuit, public_inputs) = build::<_, _, _, _, _, ST_CAPACITY>( + let (circuit, public_inputs) = build::<_, _, _, _, _>( &entries, &bit_vec, &bit_masked_sigs, &lightclient_state, &U256::from(26u32), + ST_CAPACITY, ) .unwrap(); assert!(circuit @@ -498,12 +510,13 @@ mod tests { .into_iter() .map(|b| if b { F::from(1u64) } else { F::from(0u64) }) .collect::>(); - let (bad_circuit, public_inputs) = build::<_, _, _, _, _, ST_CAPACITY>( + let (bad_circuit, public_inputs) = build::<_, _, _, _, _>( &entries, &bad_bit_vec, &bad_bit_masked_sigs, &lightclient_state, &U256::from(25u32), + ST_CAPACITY, ) .unwrap(); assert!(bad_circuit @@ -521,12 +534,13 @@ mod tests { }) .collect::, PrimitivesError>>() .unwrap(); - let (bad_circuit, public_inputs) = build::<_, _, _, _, _, ST_CAPACITY>( + let (bad_circuit, public_inputs) = build::<_, _, _, _, _>( &entries, &bit_vec, &sig_for_bad_state, &bad_lightclient_state, &U256::from(26u32), + ST_CAPACITY, ) .unwrap(); assert!(bad_circuit @@ -545,12 +559,13 @@ mod tests { }) .collect::, PrimitivesError>>() .unwrap(); - let (bad_circuit, public_inputs) = build::<_, _, _, _, _, ST_CAPACITY>( + let (bad_circuit, public_inputs) = build::<_, _, _, _, _>( &entries, &bit_vec, &wrong_sigs, &lightclient_state, &U256::from(26u32), + ST_CAPACITY, ) .unwrap(); assert!(bad_circuit @@ -558,12 +573,13 @@ mod tests { .is_err()); // bad path: overflowing stake table size - assert!(build::<_, _, _, _, _, 9>( + assert!(build::<_, _, _, _, _>( &entries, &bit_vec, &bit_masked_sigs, &lightclient_state, &U256::from(26u32), + 9 ) .is_err()); } diff --git a/hotshot-state-prover/src/mock_ledger.rs b/hotshot-state-prover/src/mock_ledger.rs index 7f7e4fe3e9..c15f8b4d5a 100644 --- a/hotshot-state-prover/src/mock_ledger.rs +++ b/hotshot-state-prover/src/mock_ledger.rs @@ -254,7 +254,7 @@ impl MockLedger { powers_of_h: vec![srs.h, srs.beta_h], } }; - let (pk, _) = preprocess::(&srs) + let (pk, _) = preprocess(&srs, STAKE_TABLE_CAPACITY) .expect("Fail to preprocess state prover circuit"); let stake_table_entries = self .st @@ -262,7 +262,7 @@ impl MockLedger { .unwrap() .map(|(_, stake_amount, schnorr_key)| (schnorr_key, stake_amount)) .collect::>(); - let (proof, pi) = generate_state_update_proof::<_, _, _, _, STAKE_TABLE_CAPACITY>( + let (proof, pi) = generate_state_update_proof::<_, _, _, _>( &mut self.rng, &pk, &stake_table_entries, @@ -270,6 +270,7 @@ impl MockLedger { &sigs, &self.state, &self.threshold, + STAKE_TABLE_CAPACITY, ) .expect("Fail to generate state proof"); (pi, proof) @@ -312,14 +313,14 @@ impl MockLedger { powers_of_h: vec![srs.h, srs.beta_h], } }; - let (pk, _) = preprocess::(&srs) + let (pk, _) = preprocess(&srs, STAKE_TABLE_CAPACITY) .expect("Fail to preprocess state prover circuit"); let stake_table_entries = adv_st .try_iter(SnapshotVersion::LastEpochStart) .unwrap() .map(|(_, stake_amount, schnorr_key)| (schnorr_key, stake_amount)) .collect::>(); - let (proof, pi) = generate_state_update_proof::<_, _, _, _, STAKE_TABLE_CAPACITY>( + let (proof, pi) = generate_state_update_proof::<_, _, _, _>( &mut self.rng, &pk, &stake_table_entries, @@ -327,6 +328,7 @@ impl MockLedger { &sigs, &new_state, &self.threshold, // it's fine to use the old threshold + STAKE_TABLE_CAPACITY, ) .expect("Fail to generate state proof"); diff --git a/hotshot-state-prover/src/service.rs b/hotshot-state-prover/src/service.rs index 752d75405d..e13dcf7e36 100644 --- a/hotshot-state-prover/src/service.rs +++ b/hotshot-state-prover/src/service.rs @@ -21,7 +21,6 @@ use futures::FutureExt; use hotshot_contract_adapter::jellyfish::{u256_to_field, ParsedPlonkProof}; use hotshot_contract_adapter::light_client::ParsedLightClientState; use hotshot_orchestrator::OrchestratorVersion; -use hotshot_stake_table::config::STAKE_TABLE_CAPACITY; use hotshot_stake_table::vec_based::config::FieldType; use hotshot_stake_table::vec_based::StakeTable; use hotshot_types::signature_key::BLSPubKey; @@ -68,21 +67,24 @@ pub struct StateProverConfig { pub light_client_address: Address, /// Transaction signing key for Ethereum pub eth_signing_key: SigningKey, - /// Address of the hotshot orchestrator, used for stake table initialization. + /// Address off the hotshot orchestrator, used for stake table initialization. pub orchestrator_url: Url, /// If daemon and provided, the service will run a basic HTTP server on the given port. /// /// The server provides healthcheck and version endpoints. pub port: Option, + /// Stake table capacity for the prover circuit. + pub stake_table_capacity: usize, } pub fn init_stake_table( bls_keys: &[BLSPubKey], state_keys: &[StateVerKey], + stake_table_capacity: usize, ) -> Result, StakeTableError> { // We now initialize a static stake table as what hotshot orchestrator does. // In the future we should get the stake table from the contract. - let mut st = StakeTable::::new(STAKE_TABLE_CAPACITY); + let mut st = StakeTable::::new(stake_table_capacity); st.batch_register( bls_keys.iter().cloned(), iter::repeat(U256::one()).take(bls_keys.len()), @@ -95,6 +97,7 @@ pub fn init_stake_table( async fn init_stake_table_from_orchestrator( orchestrator_url: &Url, + stake_table_capacity: usize, ) -> StakeTable { tracing::info!("Initializing stake table from HotShot orchestrator."); let client = Client::::new(orchestrator_url.clone()); @@ -108,8 +111,9 @@ async fn init_stake_table_from_orchestrator( { Ok(config) => { let mut st = StakeTable::::new( - STAKE_TABLE_CAPACITY, + stake_table_capacity, ); + tracing::debug!("{}", config.config.known_nodes_with_stake.len()); config .config .known_nodes_with_stake @@ -144,8 +148,9 @@ async fn init_stake_table_from_orchestrator( pub async fn light_client_genesis( orchestrator_url: &Url, + stake_table_capacity: usize, ) -> anyhow::Result { - let st = init_stake_table_from_orchestrator(orchestrator_url).await; + let st = init_stake_table_from_orchestrator(orchestrator_url, stake_table_capacity).await; let (bls_comm, schnorr_comm, stake_comm) = st .commitment(SnapshotVersion::LastEpochStart) .expect("Commitment computation shouldn't fail."); @@ -165,13 +170,12 @@ pub async fn light_client_genesis( Ok(pi.into()) } -pub fn load_proving_key() -> ProvingKey { +pub fn load_proving_key(stake_table_capacity: usize) -> ProvingKey { let srs = { let num_gates = crate::circuit::build_for_preprocessing::< CircuitField, ark_ed_on_bn254::EdwardsConfig, - STAKE_TABLE_CAPACITY, - >() + >(stake_table_capacity) .unwrap() .0 .num_gates(); @@ -194,7 +198,7 @@ pub fn load_proving_key() -> ProvingKey { std::println!("Generating proving key and verification key."); let key_gen_timer = Instant::now(); - let (pk, _) = crate::snark::preprocess::(&srs) + let (pk, _) = crate::snark::preprocess(&srs, stake_table_capacity) .expect("Fail to preprocess state prover circuit"); let key_gen_elapsed = key_gen_timer.elapsed(); std::println!("Done in {key_gen_elapsed:.3}"); @@ -326,7 +330,7 @@ pub async fn sync_state( tracing::info!("Collected latest state and signatures. Start generating SNARK proof."); let proof_gen_start = time::Instant::now(); - let (proof, public_input) = generate_state_update_proof::<_, _, _, _, STAKE_TABLE_CAPACITY>( + let (proof, public_input) = generate_state_update_proof::<_, _, _, _>( &mut ark_std::rand::thread_rng(), proving_key, &entries, @@ -334,6 +338,7 @@ pub async fn sync_state( signatures, &bundle.state, &threshold, + config.stake_table_capacity, )?; let proof_gen_elapsed = proof_gen_start.elapsed(); tracing::info!("Proof generation completed. Elapsed: {proof_gen_elapsed:.3}"); @@ -373,8 +378,11 @@ pub async fn run_prover_service( bind_version: Ver, ) { // TODO(#1022): maintain the following stake table - let st = Arc::new(init_stake_table_from_orchestrator(&config.orchestrator_url).await); - let proving_key = Arc::new(load_proving_key()); + let st = Arc::new( + init_stake_table_from_orchestrator(&config.orchestrator_url, config.stake_table_capacity) + .await, + ); + let proving_key = Arc::new(load_proving_key(config.stake_table_capacity)); let relay_server_client = Arc::new(Client::::new(config.relay_server.clone())); let config = Arc::new(config); @@ -398,14 +406,17 @@ pub async fn run_prover_service( tracing::error!("Cannot sync the light client state: {}", err); } }); + tracing::info!("Sleeping for {:?}", update_interval); sleep(update_interval).await; } } /// Run light client state prover once pub async fn run_prover_once(config: StateProverConfig, _: Ver) { - let st = init_stake_table_from_orchestrator(&config.orchestrator_url).await; - let proving_key = load_proving_key(); + let st = + init_stake_table_from_orchestrator(&config.orchestrator_url, config.stake_table_capacity) + .await; + let proving_key = load_proving_key(config.stake_table_capacity); let relay_server_client = Client::::new(config.relay_server.clone()); sync_state(&st, &proving_key, &relay_server_client, &config) @@ -551,24 +562,24 @@ mod test { powers_of_h: vec![srs.h, srs.beta_h], } }; - let (pk, _) = crate::preprocess::(&srs) + let (pk, _) = crate::preprocess(&srs, STAKE_TABLE_CAPACITY_FOR_TEST) .expect("Fail to preprocess state prover circuit"); let stake_table_entries = st .try_iter(SnapshotVersion::LastEpochStart) .unwrap() .map(|(_, stake_amount, schnorr_key)| (schnorr_key, stake_amount)) .collect::>(); - let (proof, pi) = - crate::generate_state_update_proof::<_, _, _, _, STAKE_TABLE_CAPACITY_FOR_TEST>( - &mut rng, - &pk, - &stake_table_entries, - &bit_vec, - &sigs, - &new_state.into(), - &old_state.threshold, - ) - .expect("Fail to generate state proof"); + let (proof, pi) = crate::generate_state_update_proof::<_, _, _, _>( + &mut rng, + &pk, + &stake_table_entries, + &bit_vec, + &sigs, + &new_state.into(), + &old_state.threshold, + STAKE_TABLE_CAPACITY_FOR_TEST, + ) + .expect("Fail to generate state proof"); (pi, proof) } @@ -629,6 +640,7 @@ mod test { eth_signing_key: SigningKey::random(&mut test_rng()), orchestrator_url: Url::parse("http://localhost").unwrap(), port: None, + stake_table_capacity: 10, } } } diff --git a/hotshot-state-prover/src/snark.rs b/hotshot-state-prover/src/snark.rs index 02eaa90424..5db1d2d505 100644 --- a/hotshot-state-prover/src/snark.rs +++ b/hotshot-state-prover/src/snark.rs @@ -28,14 +28,13 @@ pub type UniversalSrs = jf_plonk::proof_system::structs::UniversalSrs; /// # Errors /// Errors if unable to preprocess #[allow(clippy::cast_possible_truncation)] -pub fn preprocess( +pub fn preprocess( srs: &UniversalSrs, + stake_table_capacity: usize, ) -> Result<(ProvingKey, VerifyingKey), PlonkError> { - let (circuit, _) = crate::circuit::build_for_preprocessing::< - CircuitField, - EdwardsConfig, - STAKE_TABLE_CAPACITY, - >()?; + let (circuit, _) = crate::circuit::build_for_preprocessing::( + stake_table_capacity, + )?; PlonkKzgSnark::preprocess(srs, &circuit) } @@ -53,7 +52,8 @@ pub fn preprocess( /// Errors if unable to generate proof /// # Panics /// if the stake table is not up to date -pub fn generate_state_update_proof( +#[allow(clippy::too_many_arguments)] +pub fn generate_state_update_proof( rng: &mut R, pk: &ProvingKey, stake_table_entries: STIter, @@ -61,6 +61,7 @@ pub fn generate_state_update_proof Result<(Proof, PublicInput), PlonkError> where STIter: IntoIterator, @@ -81,12 +82,13 @@ where CircuitField::from(0u64) } }); - let (circuit, public_inputs) = crate::circuit::build::<_, _, _, _, _, STAKE_TABLE_CAPACITY>( + let (circuit, public_inputs) = crate::circuit::build::<_, _, _, _, _>( stake_table_entries, signer_bit_vec, signatures, lightclient_state, threshold, + stake_table_capacity, )?; let proof = PlonkKzgSnark::::prove::<_, _, SolidityTranscript>(rng, &circuit, pk, None)?; Ok((proof, public_inputs)) @@ -238,18 +240,18 @@ mod tests { // good path let num_gates = - build_for_preprocessing::() + build_for_preprocessing::(ST_CAPACITY) .unwrap() .0 .num_gates(); let test_srs = universal_setup_for_testing(num_gates + 2, &mut prng).unwrap(); ark_std::println!("Number of constraint in the circuit: {num_gates}"); - let result = preprocess::(&test_srs); + let result = preprocess(&test_srs, ST_CAPACITY); assert!(result.is_ok()); let (pk, vk) = result.unwrap(); - let result = generate_state_update_proof::<_, _, _, _, ST_CAPACITY>( + let result = generate_state_update_proof::<_, _, _, _>( &mut prng, &pk, &stake_table_entries, @@ -257,6 +259,7 @@ mod tests { &bit_masked_sigs, &lightclient_state, &U256::from(26u32), + ST_CAPACITY, ); assert!(result.is_ok()); @@ -270,7 +273,7 @@ mod tests { .is_ok()); // minimum bad path, other bad cases are checked inside `circuit.rs` - let result = generate_state_update_proof::<_, _, _, _, ST_CAPACITY>( + let result = generate_state_update_proof::<_, _, _, _>( &mut prng, &pk, &stake_table_entries, @@ -278,6 +281,7 @@ mod tests { &bit_masked_sigs, &lightclient_state, &U256::from(100u32), + ST_CAPACITY, ); assert!(result.is_err()); } diff --git a/justfile b/justfile index c679223504..ecdce4d57a 100644 --- a/justfile +++ b/justfile @@ -57,7 +57,7 @@ build-docker-images: scripts/build-docker-images # generate rust bindings for contracts -REGEXP := "^LightClient$|^LightClientStateUpdateVK$|^FeeContract$|^HotShot$|PlonkVerifier$|^ERC1967Proxy$" +REGEXP := "^LightClient$|^LightClientStateUpdateVK$|^FeeContract$|^HotShot$|PlonkVerifier$|^ERC1967Proxy$|^LightClientMock$|^LightClientStateUpdateVKMock$" gen-bindings: forge bind --contracts ./contracts/src/ --crate-name contract-bindings --bindings-path contract-bindings --select "{{REGEXP}}" --overwrite --force @@ -67,6 +67,7 @@ gen-bindings: # date, without needed to recompile the contracts. mkdir -p contract-bindings/artifacts jq '.bytecode.object' < contracts/out/LightClient.sol/LightClient.json > contract-bindings/artifacts/LightClient_bytecode.json + jq '.bytecode.object' < contracts/out/LightClientMock.sol/LightClientMock.json > contract-bindings/artifacts/LightClientMock_bytecode.json cargo fmt --all cargo sort -g -w diff --git a/process-compose.yaml b/process-compose.yaml index 9d2d7ce8df..7040c1ca99 100644 --- a/process-compose.yaml +++ b/process-compose.yaml @@ -26,7 +26,9 @@ processes: deploy-contracts: # The contract addresses are implicitly inherited from .env. We need to unset these or else the # script will think they're already deployed. - command: unset ESPRESSO_SEQUENCER_HOTSHOT_ADDRESS ESPRESSO_SEQUENCER_LIGHT_CLIENT_PROXY_ADDRESS && deploy + command: unset ESPRESSO_SEQUENCER_HOTSHOT_ADDRESS ESPRESSO_SEQUENCER_LIGHT_CLIENT_PROXY_ADDRESS && deploy --use-mock-contract + environment: + - ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY=10 depends_on: demo-l1-network: condition: process_healthy @@ -60,6 +62,8 @@ processes: command: state-prover -d environment: - MNEMONIC=$ESPRESSO_SEQUENCER_ETH_MNEMONIC + - ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY=10 + - ESPRESSO_STATE_PROVER_UPDATE_INTERVAL=30s depends_on: orchestrator: condition: process_healthy @@ -82,6 +86,7 @@ processes: - ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_0 - ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_0 - ESPRESSO_SEQUENCER_ETH_ACCOUNT_INDEX=10 + - ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY=10 depends_on: orchestrator: condition: process_healthy @@ -119,6 +124,7 @@ processes: - ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_1 - ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_1 - ESPRESSO_SEQUENCER_ETH_ACCOUNT_INDEX=11 + - ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY=10 depends_on: orchestrator: condition: process_healthy @@ -153,6 +159,7 @@ processes: - ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_2 - ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_2 - ESPRESSO_SEQUENCER_ETH_ACCOUNT_INDEX=12 + - ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY=10 depends_on: orchestrator: condition: process_healthy @@ -185,6 +192,7 @@ processes: - ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_3 - ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_3 - ESPRESSO_SEQUENCER_ETH_ACCOUNT_INDEX=13 + - ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY=10 depends_on: orchestrator: condition: process_healthy @@ -215,6 +223,7 @@ processes: - ESPRESSO_SEQUENCER_PRIVATE_STAKING_KEY=$ESPRESSO_DEMO_SEQUENCER_STAKING_PRIVATE_KEY_4 - ESPRESSO_SEQUENCER_PRIVATE_STATE_KEY=$ESPRESSO_DEMO_SEQUENCER_STATE_PRIVATE_KEY_4 - ESPRESSO_SEQUENCER_ETH_ACCOUNT_INDEX=14 + - ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY=10 depends_on: orchestrator: condition: process_healthy diff --git a/sequencer/Cargo.toml b/sequencer/Cargo.toml index fb883b448e..804e142efb 100644 --- a/sequencer/Cargo.toml +++ b/sequencer/Cargo.toml @@ -44,6 +44,7 @@ tagged-base64 = { workspace = true } zeroize = { workspace = true } hotshot = { workspace = true } +hotshot-contract-adapter ={ path = "../contracts/rust/adapter" } hotshot-events-service = { workspace = true } hotshot-orchestrator = { workspace = true } hotshot-query-service = { workspace = true } diff --git a/sequencer/src/api.rs b/sequencer/src/api.rs index df00174f91..8aeeccaeef 100644 --- a/sequencer/src/api.rs +++ b/sequencer/src/api.rs @@ -128,6 +128,8 @@ mod test_helpers { use surf_disco::Client; use tide_disco::error::ServerError; + const STAKE_TABLE_CAPACITY_FOR_TEST: usize = 10; + pub struct TestNetwork { pub server: SequencerContext, pub peers: Vec>, @@ -158,6 +160,7 @@ mod test_helpers { persistence, catchup, &*metrics, + STAKE_TABLE_CAPACITY_FOR_TEST, SEQUENCER_VERSION, ) .await @@ -175,6 +178,7 @@ mod test_helpers { persistence, catchup, &NoMetrics, + STAKE_TABLE_CAPACITY_FOR_TEST, SEQUENCER_VERSION, ) .await diff --git a/sequencer/src/bin/deploy.rs b/sequencer/src/bin/deploy.rs index c0c108d795..b787892792 100644 --- a/sequencer/src/bin/deploy.rs +++ b/sequencer/src/bin/deploy.rs @@ -5,9 +5,11 @@ use clap::{builder::OsStr, Parser}; use contract_bindings::{ erc1967_proxy::ERC1967Proxy, hot_shot::HotShot, - light_client::{LightClient, LIGHTCLIENT_ABI}, - light_client_state_update_vk::LightClientStateUpdateVK, + light_client::LIGHTCLIENT_ABI, + light_client_mock::{LightClientMock, LIGHTCLIENTMOCK_ABI}, + light_client_state_update_vk_mock::LightClientStateUpdateVKMock, plonk_verifier::PlonkVerifier, + shared_types::LightClientState, }; use derive_more::Display; use ethers::{ @@ -16,6 +18,8 @@ use ethers::{ solc::artifacts::BytecodeObject, }; use futures::future::{BoxFuture, FutureExt}; +use hotshot_contract_adapter::light_client::ParsedLightClientState; +use hotshot_stake_table::config::STAKE_TABLE_CAPACITY; use hotshot_state_prover::service::light_client_genesis; use std::{ collections::HashMap, @@ -74,7 +78,6 @@ struct Options { default_value = "test test test test test test test test test test test junk" )] mnemonic: String, - /// Account index in the L1 wallet generated by MNEMONIC to use when deploying the contracts. #[clap( long, @@ -92,6 +95,14 @@ struct Options { #[clap(flatten)] contracts: DeployedContracts, + + /// If toggled, launch a mock prover contract that does not do any proof verification. + #[clap(short, long)] + pub use_mock_contract: bool, + + /// Stake table capacity for the prover circuit + #[clap(short, long, env = "ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY", default_value_t = STAKE_TABLE_CAPACITY)] + pub stake_table_capacity: usize, } /// Set of predeployed contracts. @@ -245,15 +256,21 @@ async fn main() -> anyhow::Result<()> { let l1 = l1.clone(); let orchestrator_url = opt.orchestrator_url.clone(); async move { - let light_client = LightClient::new( + let light_client = LightClientMock::new( contracts .deploy_fn(Contract::LightClient, |contracts| { - deploy_light_client_contract(l1.clone(), contracts).boxed() + deploy_light_client_contract( + l1.clone(), + contracts, + opt.use_mock_contract, + ) + .boxed() }) .await?, l1.clone(), ); - let genesis = light_client_genesis(&orchestrator_url).await?; + let genesis = + light_client_genesis(&orchestrator_url, opt.stake_table_capacity).await?; let data = light_client .initialize(genesis.into(), u32::MAX, owner) .calldata() @@ -280,6 +297,7 @@ async fn main() -> anyhow::Result<()> { async fn deploy_light_client_contract( l1: Arc, contracts: &mut Contracts, + use_mock_contract: bool, ) -> anyhow::Result
{ // Deploy library contracts. let plonk_verifier = contracts @@ -291,10 +309,21 @@ async fn deploy_light_client_contract( let vk = contracts .deploy_tx( Contract::StateUpdateVK, - LightClientStateUpdateVK::deploy(l1.clone(), ())?, + LightClientStateUpdateVKMock::deploy(l1.clone(), ())?, ) .await?; + if use_mock_contract { + deploy_mock_light_client_contract(l1, plonk_verifier, vk).await + } else { + deploy_production_light_client_contract(l1, plonk_verifier, vk).await + } +} +async fn deploy_production_light_client_contract( + l1: Arc, + plonk_verifier: Address, + vk: Address, +) -> anyhow::Result
{ // Link with LightClient's bytecode artifacts. We include the unlinked bytecode for the contract // in this binary so that the contract artifacts do not have to be distributed with the binary. // This should be fine because if the bindings we are importing are up to date, so should be the @@ -302,7 +331,7 @@ async fn deploy_light_client_contract( // bindings, except that foundry doesn't provide the bytecode for contracts that link with // libraries, so we have to do it ourselves. let mut bytecode: BytecodeObject = serde_json::from_str(include_str!( - "../../../contract-bindings/artifacts/LightClient_bytecode.json" + "../../../contract-bindings/artifacts/LightClient_bytecode.json", ))?; bytecode .link_fully_qualified( @@ -313,7 +342,7 @@ async fn deploy_light_client_contract( .context("error linking PlonkVerifier lib")?; bytecode .link_fully_qualified( - "contracts/src/libraries/LightClientStateUpdateVK.sol:LightClientStateUpdateVK", + "contracts/tests/mocks/LightClientStateUpdateVK.sol:LightClientStateUpdateVK", vk, ) .resolve() @@ -332,3 +361,50 @@ async fn deploy_light_client_contract( let contract = light_client_factory.deploy(())?.send().await?; Ok(contract.address()) } + +async fn deploy_mock_light_client_contract( + l1: Arc, + plonk_verifier: Address, + vk: Address, +) -> anyhow::Result
{ + // Link with LightClient's bytecode artifacts. We include the unlinked bytecode for the contract + // in this binary so that the contract artifacts do not have to be distributed with the binary. + // This should be fine because if the bindings we are importing are up to date, so should be the + // contract artifacts: this is no different than foundry inlining bytecode objects in generated + // bindings, except that foundry doesn't provide the bytecode for contracts that link with + // libraries, so we have to do it ourselves. + let mut bytecode: BytecodeObject = serde_json::from_str(include_str!( + "../../../contract-bindings/artifacts/LightClientMock_bytecode.json", + ))?; + bytecode + .link_fully_qualified( + "contracts/src/libraries/PlonkVerifier.sol:PlonkVerifier", + plonk_verifier, + ) + .resolve() + .context("error linking PlonkVerifier lib")?; + bytecode + .link_fully_qualified( + "contracts/tests/mocks/LightClientStateUpdateVKMock.sol:LightClientStateUpdateVKMock", + vk, + ) + .resolve() + .context("error linking LightClientStateUpdateVK lib")?; + ensure!(!bytecode.is_unlinked(), "failed to link LightClient.sol"); + + // Deploy light client. + let light_client_factory = ContractFactory::new( + LIGHTCLIENTMOCK_ABI.clone(), + bytecode + .as_bytes() + .context("error parsing bytecode for linked LightClient contract")? + .clone(), + l1, + ); + let dummy_genesis: LightClientState = ParsedLightClientState::dummy_genesis().into(); + let contract = light_client_factory + .deploy((dummy_genesis, u32::MAX))? + .send() + .await?; + Ok(contract.address()) +} diff --git a/sequencer/src/context.rs b/sequencer/src/context.rs index a4dc64e017..198207b84d 100644 --- a/sequencer/src/context.rs +++ b/sequencer/src/context.rs @@ -13,8 +13,6 @@ use hotshot::{ Memberships, Networks, SystemContext, }; use hotshot_orchestrator::client::OrchestratorClient; -// Should move `STAKE_TABLE_CAPACITY` in the sequencer repo when we have variate stake table support -use hotshot_stake_table::config::STAKE_TABLE_CAPACITY; use hotshot_types::{ consensus::ConsensusMetricsValue, traits::{election::Membership, metrics::Metrics}, @@ -76,6 +74,7 @@ impl, metrics: &dyn Metrics, node_id: u64, + stake_table_capacity: usize, _: Ver, ) -> anyhow::Result { // Load saved consensus state from storage. @@ -98,7 +97,7 @@ impl::new( diff --git a/sequencer/src/lib.rs b/sequencer/src/lib.rs index 092e595398..3ec5677844 100644 --- a/sequencer/src/lib.rs +++ b/sequencer/src/lib.rs @@ -301,6 +301,7 @@ pub async fn init_node anyhow::Result> { // Orchestrator client @@ -430,6 +431,7 @@ pub async fn init_node( &self, i: usize, @@ -563,6 +568,7 @@ pub mod testing { persistence: P, catchup: impl StateCatchup + 'static, metrics: &dyn Metrics, + stake_table_capacity: usize, bind_version: Ver, ) -> SequencerContext { let mut config = self.config.clone(); @@ -605,6 +611,7 @@ pub mod testing { None, metrics, i as u64, + stake_table_capacity, bind_version, ) .await diff --git a/sequencer/src/main.rs b/sequencer/src/main.rs index 7a2ca42100..3237b1fb1a 100644 --- a/sequencer/src/main.rs +++ b/sequencer/src/main.rs @@ -49,6 +49,7 @@ where S: DataSourceOptions, { let (private_staking_key, private_state_key) = opt.private_keys()?; + let stake_table_capacity = opt.stake_table_capacity; let l1_params = L1Params { url: opt.l1_provider_url, }; @@ -121,6 +122,7 @@ where storage, builder_params, l1_params, + stake_table_capacity, bind_version, ) .await @@ -139,6 +141,7 @@ where storage_opt.create().await?, builder_params, l1_params, + stake_table_capacity, bind_version, ) .await? diff --git a/sequencer/src/options.rs b/sequencer/src/options.rs index fc4abd3126..11b129a921 100644 --- a/sequencer/src/options.rs +++ b/sequencer/src/options.rs @@ -3,6 +3,7 @@ use anyhow::{bail, Context}; use clap::{error::ErrorKind, Args, FromArgMatches, Parser}; use cld::ClDuration; use ethers::types::Address; +use hotshot_stake_table::config::STAKE_TABLE_CAPACITY; use hotshot_types::light_client::StateSignKey; use hotshot_types::signature_key::BLSPrivKey; use snafu::Snafu; @@ -165,6 +166,10 @@ pub struct Options { /// Peer nodes use to fetch missing state #[clap(long, env = "ESPRESSO_SEQUENCER_STATE_PEERS", value_delimiter = ',')] pub state_peers: Vec, + + /// Stake table capacity for the prover circuit + #[clap(short, long, env = "ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY", default_value_t = STAKE_TABLE_CAPACITY)] + pub stake_table_capacity: usize, } impl Options {