From 7cfa5edf8db966f4b7ee1d25ef2c64c442a51c51 Mon Sep 17 00:00:00 2001 From: Alysia Huggins Date: Wed, 28 Aug 2024 19:51:49 -0400 Subject: [PATCH 01/27] switch from states mapping to two state variables for the genesis and finalized state --- .../artifacts/LightClientMock_bytecode.json | 2 +- .../artifacts/LightClient_bytecode.json | 2 +- contract-bindings/src/light_client.rs | 275 ++++++++++++++++++ contract-bindings/src/light_client_mock.rs | 275 ++++++++++++++++++ contracts/src/LightClient.sol | 36 ++- contracts/test/LightClientV2.sol | 25 +- contracts/test/mocks/LightClientMock.sol | 8 +- 7 files changed, 586 insertions(+), 37 deletions(-) diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json index 27495aac1..430432eb0 100644 --- a/contract-bindings/artifacts/LightClientMock_bytecode.json +++ b/contract-bindings/artifacts/LightClientMock_bytecode.json @@ -1 +1 @@ -"0x60a0346200065a576200395638819003601f8101601f191683016001600160401b0381118482101762000484578392829160405283398101039061014082126200065a576101008092126200065a5760405191808301906001600160401b038211848310176200048457620000dd61012091620000e59360405262000084856200065f565b865262000094602086016200065f565b602087015260408501516040870152606085015160608701526080850151608087015260a085015160a087015260c085015160c087015260e085015160e0870152840162000674565b920162000674565b306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8160401c1662000648576002600160401b03196001600160401b03821601620005fc575b505082516001600160401b031615801590620005e5575b8015620005d8575b8015620005cb575b8015620005be575b8015620005b1575b8015620005a2575b620005905760008054602090811c63ffffffff1682526005815260409182902085518154928701516001600160801b03199093166001600160401b0391909116179190921b6fffffffffffffffff0000000000000000161781556040848101516001830155606085015160028301556080850151600383015560a0850151600483015560c0850151600583015560e085015160069092019190915560008054821c63ffffffff1681528190208451815460208701516001600160801b03199091166001600160401b039290921691909117921b6fffffffffffffffff00000000000000001691909117815591604084015160018401556060840151600284015560808401519182600385015560a08501519182600486015560c086015194856005820155600660e088015191015563ffffffff60005491169073ffffffffffffffff0000000000000000ffffffff1916176000556006549063ffffffff60a81b9060a81b169063ffffffff60a81b1916179283600655604051916020830193845260408301526060820152606081526080810181811060018060401b0382111762000484576040525190208060015560e0830151908160025560035560045560085490811515918262000519575b50506200049a575b602081015160409182015182519290916001600160401b03908116918401908111848210176200048457604052825260208201526040516060810181811060018060401b03821117620004845760409081526001600160401b034381168352421660208301908152908201928352600854680100000000000000008110156200048457806001620003dc920160085562000686565b9390936200046e579151835491516001600160801b03199092166001600160401b03919091161760409190911b6fffffffffffffffff0000000000000000161782556002906020905180516001850180546001600160401b0319166001600160401b039290921691909117905501519101556040516132999081620006bd8239608051818181610dd60152610f2e0152f35b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600754620004b1906001600160401b031662000686565b6200046e576000808255600182018190556002909101556007546001600160401b0380821690811462000503576001600160401b03199091166001919091016001600160401b03161760075562000347565b634e487b7160e01b600052601160045260246000fd5b90915060001981019081116200050357620005349062000686565b50546007546001600160401b0360409290921c82169162000556911662000686565b505460401c6001600160401b0390811690910391908211620005035760a81c63ffffffff166001600160401b03909116101538806200033f565b6040516350dd03f760e11b8152600490fd5b5063ffffffff82161562000171565b5060e08301511562000169565b5060c08301511562000161565b5060a08301511562000159565b5060808301511562000151565b5060208301516001600160401b0316151562000149565b6001600160401b0319166001600160401b039081179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388062000132565b60405163f92ee8a960e01b8152600490fd5b600080fd5b51906001600160401b03821682036200065a57565b519063ffffffff821682036200065a57565b600854811015620006a65760086000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461024757806302b592f3146102425780630d8e6e2c1461023d578063202a0adb146102385780632d52aad6146102335780632f5f46001461022e5780632f79889d14610229578063313df7b114610224578063382b215a1461021f5780633949d1e91461021a578063409939b7146102155780634847ae5d146102105780634f1ef2861461020b57806352d1902d14610206578063628277331461020157806369cc6a04146101fc578063715018a6146101f757806376671808146101f257806376b6b7cb146101ed5780637f17baad146101e857806382d07ff3146101e35780638584d23f146101de5780638da5cb5b146101d957806396c1ca61146101d4578063aa922732146101cf578063ad3cb1cc146101ca578063bd32519a146101c5578063c23b9e9e146101c0578063c8e5e498146101bb578063ca15521c146101b6578063ca6fe855146101b1578063e0303301146101ac578063f0682054146101a7578063f2fde38b146101a25763f9e50d191461019d57600080fd5b6116b9565b611690565b61166c565b61153c565b61151e565b6113d2565b6113b5565b61138e565b611368565b6112eb565b6112be565b611239565b611203565b6111c6565b61119e565b6110f1565b611098565b61106e565b611003565b610fa4565b610f86565b610f1b565b610d5c565b610c88565b610ad3565b610853565b610835565b61080c565b6107e5565b6106f9565b6106bc565b6105e1565b61051e565b6104a8565b61027e565b600435906001600160a01b038216820361026257565b600080fd5b61014435906001600160a01b038216820361026257565b346102625760203660031901126102625761029761024c565b61029f612056565b6001600160a01b0390811690811561032f57600654908116821461031d5760ff60a01b19919091166001600160a81b03199190911617600160a01b1760068190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600854811015610392576003906008600052027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30190600090565b610341565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b038211176103c857604052565b610397565b61010081019081106001600160401b038211176103c857604052565b606081019081106001600160401b038211176103c857604052565b90601f801991011681019081106001600160401b038211176103c857604052565b604051906102e082018281106001600160401b038211176103c857604052565b60405190610452826103ad565b565b60405190610452826103e9565b6040519061028082018281106001600160401b038211176103c857604052565b9060405161048e816103ad565b6020600182946001600160401b0381541684520154910152565b3461026257602036600319011261026257600435600854811015610262576104d1608091610357565b5061051c8154916104ec60016001600160401b039201610481565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610262576000366003190112610262576060604051600181526000602082015260006040820152f35b602435906001600160401b038216820361026257565b35906001600160401b038216820361026257565b610100906003190112610262576040519061058c826103cd565b816004356001600160401b03811681036102625781526105aa610548565b602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e060e435910152565b3461026257610100366003190112610262576105fc36610572565b63ffffffff60005460401c166000526005602052600660e06040600020926106446001600160401b0382511685906001600160401b03166001600160401b0319825416179055565b61068361065b60208301516001600160401b031690565b855467ffffffffffffffff60401b191660409190911b67ffffffffffffffff60401b16178555565b60408101516001850155606081015160028501556080810151600385015560a0810151600485015560c081015160058501550151910155005b34610262576020366003190112610262576009805460ff19166001179055600435600a55005b6001600160401b0381116103c85760051b60200190565b346102625760208060031936011261026257600435906001600160401b038211610262573660238301121561026257816004013591610737836106e2565b9160409361074785519485610404565b80845260248285019160071b8401019236841161026257602401905b83821061077557610773856118db565b005b81360360808112610262578680519161078d836103e9565b6107968561055e565b83526107a386860161055e565b83870152603f19011261026257608091849188516107c0816103ad565b6107cb8a870161055e565b815260608601358482015289820152815201910190610763565b346102625760003660031901126102625760206001600160401b0360075416604051908152f35b34610262576000366003190112610262576006546040516001600160a01b039091168152602090f35b34610262576000366003190112610262576020600354604051908152f35b34610262576020366003190112610262576004356001600160401b0381168103610262576000805467ffffffffffffffff60601b191660609290921b67ffffffffffffffff60601b16919091179055005b60409061010319011261026257604051906108be826103ad565b610104358252610124356020830152565b60409061014319011261026257604051906108e9826103ad565b610144358252610164356020830152565b6040906101831901126102625760405190610914826103ad565b6101843582526101a4356020830152565b6040906101c3190112610262576040519061093f826103ad565b6101c43582526101e4356020830152565b604090610203190112610262576040519061096a826103ad565b610204358252610224356020830152565b6040906102431901126102625760405190610995826103ad565b610244358252610264356020830152565b60409061028319011261026257604051906109c0826103ad565b6102843582526102a4356020830152565b6040906102c319011261026257604051906109eb826103ad565b6102c43582526102e4356020830152565b6040906103031901126102625760405190610a16826103ad565b610304358252610324356020830152565b6040906103431901126102625760405190610a41826103ad565b610344358252610364356020830152565b6040906103831901126102625760405190610a6c826103ad565b6103843582526103a4356020830152565b6040906103c31901126102625760405190610a97826103ad565b6103c43582526103e4356020830152565b6040906104031901126102625760405190610ac2826103ad565b610404358252610424356020830152565b346102625761058036600319011261026257610aee36610572565b610480366101031901126102625761077390610b08610425565b90610b12366108a4565b8252610b1d366108cf565b6020830152610b2b366108fa565b6040830152610b3936610925565b6060830152610b4736610950565b6080830152610b553661097b565b60a0830152610b63366109a6565b60c0830152610b71366109d1565b60e0830152610b7f366109fc565b610100830152610b8e36610a27565b610120830152610b9d36610a52565b610140830152610bac36610a7d565b610160830152610bbb36610aa8565b610180830152610444356101a0830152610464356101c0830152610484356101e08301526104a4356102008301526104c4356102208301526104e4356102408301526105043561026083015261052435610280830152610544356102a0830152610564356102c08301526119a3565b91909160e0806101008301946001600160401b03808251168552602082015116602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b3461026257600080600319360112610d3e576040610d3a91610ca8611c0d565b5063ffffffff815460201c168152600560205220600660405191610ccb836103cd565b80546001600160401b038082168552610cf5915b60401c1660208501906001600160401b03169052565b600181015460408401526002810154606084015260038101546080840152600481015460a0840152600581015460c0840152015460e082015260405191829182610c2a565b0390f35b80fd5b6001600160401b0381116103c857601f01601f191660200190565b60408060031936011261026257610d7161024c565b6024356001600160401b038111610262573660238201121561026257806004013590610d9c82610d41565b91610da985519384610404565b80835260209136602483830101116102625781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610eff575b50610eee579080600492610e14612056565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610ebf575b5050610e84578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b60008051602061324d8339815191528193929303610ea65761077383836130b1565b8351632a87526960e21b81526004810191909152602490fd5b610edf929350803d10610ee7575b610ed78183610404565b8101906129fc565b903880610e5e565b503d610ecd565b845163703e46dd60e11b8152600490fd5b90508160008051602061324d8339815191525416141538610e02565b34610262576000366003190112610262577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610f7457602060405160008051602061324d8339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610262576000366003190112610262576020600254604051908152f35b3461026257600080600319360112610d3e57610fbe612056565b60065460ff8160a01c1660001461031d576001600160a81b0319166006557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b3461026257600080600319360112610d3e5761101d612056565b60008051602061322d83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b346102625760003660031901126102625760206001600160401b0360005460601c16604051908152f35b34610262576000366003190112610262576020600154604051908152f35b6004359063ffffffff8216820361026257565b610104359063ffffffff8216820361026257565b610124359063ffffffff8216820361026257565b346102625760203660031901126102625763ffffffff61110f6110b6565b1660005260056020526040600020805490610d3a6001600160401b039160018101549060028101546003820154600483015491600660058501549401549460405198888a998260401c16911689949198979693909260e0969361010087019a6001600160401b03809216885216602087015260408601526060850152608084015260a083015260c08201520152565b3461026257600036600319011261026257610d3a6111ba611c4b565b60405191829182610c2a565b346102625760203660031901126102625760406111e4600435611d05565b61051c82518092602080916001600160401b0381511684520151910152565b346102625760003660031901126102625760008051602061322d833981519152546040516001600160a01b039091168152602090f35b34610262576020366003190112610262576112526110b6565b61125a612056565b63ffffffff808216610e1081109182156112ac575b505061129a576006805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b60065460a81c1610159050388061126f565b34610262576101003660031901126102625760206112e36112de36610572565b611dcb565b604051908152f35b3461026257600036600319011261026257604080519061130a826103ad565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106113555784604081866000838284010152601f80199101168101030190f35b8581018301518582018301528201611333565b3461026257600036600319011261026257602060ff60065460a01c166040519015158152f35b3461026257600036600319011261026257602063ffffffff60065460a81c16604051908152f35b34610262576000366003190112610262576009805460ff19169055005b3461026257610160366003190112610262576113ed36610572565b6113f56110c9565b906113fe6110dd565b611406610267565b9060008051602061326d83398151915254936001600160401b0360ff8660401c1615951680159081611516575b600114908161150c575b159081611503575b506114f15760008051602061326d833981519152805467ffffffffffffffff1916600117905561147993856114cc57611e13565b61147f57005b60008051602061326d833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2908060208101610318565b60008051602061326d833981519152805460ff60401b1916600160401b179055611e13565b60405163f92ee8a960e01b8152600490fd5b90501538611445565b303b15915061143d565b869150611433565b34610262576000366003190112610262576020600454604051908152f35b34610262576040366003190112610262576004356024359060ff6009541660009060001461158a575090611576610d3a92600a5490611cf8565b115b60405190151581529081906020820190565b91600854914381118015611662575b6115ef576115a78493611ce9565b926115c96115bd6007546001600160401b031690565b6001600160401b031690565b935b8115611601575b5090919250156115ef57610d3a926115e991611cf8565b11611578565b60405163b0b4387760e01b8152600490fd5b8261161f6115bd61161184610357565b50546001600160401b031690565b1115611648575b60028110611643578481146116435761163e90612a0b565b6115cb565b6115d2565b945050600161165c6115bd61161187610357565b94611626565b5060038310611599565b3461026257600036600319011261026257602063ffffffff60005416604051908152f35b34610262576020366003190112610262576107736116ac61024c565b6116b4612056565b611fe2565b34610262576000366003190112610262576020600854604051908152f35b634e487b7160e01b600052600060045260246000fd5b9060e060069161174d6001600160401b036117218184511687906001600160401b03166001600160401b0319825416179055565b6020830151865467ffffffffffffffff60401b1916911660401b67ffffffffffffffff60401b16178555565b60408101516001850155606081015160028501556080810151600385015560a0810151600485015560c081015160058501550151910155565b634e487b7160e01b600052601160045260246000fd5b906117b35760028160008093558260018201550155565b6116d7565b8051156103925760200190565b8051600110156103925760400190565b8051600210156103925760600190565b8051600310156103925760800190565b8051600410156103925760a00190565b8051600510156103925760c00190565b8051600610156103925760e00190565b805160071015610392576101000190565b80518210156103925760209160051b010190565b600854600160401b8110156103c8578060016118699201600855610357565b9190916117b357805182546020808401516001600160401b039384166fffffffffffffffffffffffffffffffff1990931692909217604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b90600854600060085580611918575b5060005b8251811015611913578061190d61190760019386611836565b5161184a565b016118ee565b509050565b600390806003029060038204036119805760086000527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3908101905b8181106119625750506118ea565b8061197a849260026000918281558260018201550155565b01611954565b611786565b9190916001600160401b038080941691160291821691820361198057565b9060065460ff8160a01c169081611bf9575b50611be75781516001600160401b0316906119e16115bd6119d4611c4b565b516001600160401b031690565b6001600160401b0380931611801590611bb0575b611b9e578190600054611a45611a3563ffffffff611a1a818516878660601c16611985565b9360401c1663ffffffff166000526005602052604060002090565b5460401c6001600160401b031690565b83821694859116149384159081611b7e575b50611b5b575090611ad17fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6926040860194611a92865161208f565b611a9f606088015161208f565b611aac608088015161208f565b611ab960a088015161208f565b611ac660c088015161208f565b611b4e575b856126e8565b611b0684611b01611aeb60005463ffffffff9060401c1690565b63ffffffff166000526005602052604060002090565b6116ed565b611b15848242168343166128b3565b611b3a6020611b2b86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b611b56612115565b611acb565b60405163036466bf60e31b81526001600160401b03919091166004820152602490fd5b9050611b976115bd60208801516001600160401b031690565b1138611a57565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b031682611bde6115bd6020611bd0611c4b565b01516001600160401b031690565b911611156119f5565b6040516301474c8f60e71b8152600490fd5b6001600160a01b03163314159050386119b5565b60405190611c1a826103cd565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b611c53611c0d565b5063ffffffff60005460401c1660005260056020526040600020600660405191611c7c836103cd565b80546001600160401b038082168552611c9491610cdf565b600181015460408401526002810154606084015260038101546080840152600481015460a0840152600581015460c0840152015460e082015290565b60405190611cdd826103ad565b60006020838281520152565b60001981019190821161198057565b9190820391821161198057565b611d0d611cd0565b5060085490611d23611d1e83611ce9565b610357565b5090611d3d6115bd6001809401546001600160401b031690565b811015611db957611d596115bd6007546001600160401b031690565b838110611d7e575050506001611d74611d1e611d7b93611ce9565b5001610481565b90565b81611d9e6115bd85611d8f85610357565b5001546001600160401b031690565b11611daa578201611d59565b611d7b9350611d749150610357565b604051631856a49960e21b8152600490fd5b60808101519060c060a082015191015160405191602083019384526040830152606082015260608152608081018181106001600160401b038211176103c85760405251902090565b919092611e2a90611e22613158565b6116b4613158565b611e32613158565b600160401b6bffffffffffffffff0000000019600054161792836000556001600160401b039182611e6a85516001600160401b031690565b1615801590611fc3575b8015611fb7575b8015611fab575b8015611f9f575b8015611f93575b8015611f85575b611f7357611f12611f3792611ecc86611b0163ffffffff6104529a60201c1663ffffffff166000526005602052604060002090565b611ee686611b01611aeb60005463ffffffff9060401c1690565b6000805473ffffffffffffffff0000000000000000ffffffff191663ffffffff92909216919091179055565b6006805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b611f68611f4383611dcb565b611f4c81600155565b611f6360e085015191611f5e83600255565b600355565b600455565b8042169043166128b3565b6040516350dd03f760e11b8152600490fd5b5063ffffffff821615611e97565b5060e084015115611e90565b5060c084015115611e89565b5060a084015115611e82565b50608084015115611e7b565b50611fdb6115bd60208601516001600160401b031690565b1515611e74565b6001600160a01b0390811690811561203d5760008051602061322d83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b60008051602061322d833981519152546001600160a01b0316330361207757565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000111156120b857565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b9060016001600160401b038093160191821161198057565b7fdb3558259e039d7e50e816b9dcce30fb114d8a9c86eca5ab14b60194d6945d3f61226c600061225381549163ffffffff604093841c16815260056020526121ca6121bf848320600686519161216a836103cd565b80546001600160401b03808216855290891c1660208401526001810154888401526002810154606084015260038101546080840152600481015460a0840152600581015460c0840152015460e0820152611dcb565b611f5e600354600155565b6121d5600454600255565b6121f660066121ef611aeb845463ffffffff9060401c1690565b0154600455565b61224361221661221183546001600160401b039060601c1690565b6120fd565b6000805467ffffffffffffffff60601b191660609290921b67ffffffffffffffff60601b16919091179055565b5460601c6001600160401b031690565b90516001600160401b0390911681529081906020820190565b0390a1565b6040519061012082018281106001600160401b038211176103c85760405260088252610100366020840137565b90816020910312610262575180151581036102625790565b90815180825260208080930193019160005b8281106122d6575050505090565b8351855293810193928101926001016122c8565b6104609061230383825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190612361610100928386019060208091805184520151910152565b60a081015191612381610140938487019060208091805184520151910152565b60c0820151926123a1610180948588019060208091805184520151910152565b60e0830151916123c16101c0938489019060208091805184520151910152565b8301516123de610200918289019060208091805184520151910152565b610120840151916123ff61024093848a019060208091805184520151910152565b8401519261241d61028094858a019060208091805184520151910152565b612458610160860151966124416102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b9392906126d4610452936104e0926126c56102606109609280518b52602081015160208c0152612501604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c01526126af8b61254d60a08401516101008093019060208091805184520151910152565b6126808d6103c060c0860151612573610140918285019060208091805184520151910152565b61265360e088015195612596610180978887019060208091805184520151910152565b8801516125b36101c0918287019060208091805184520151910152565b6126246101208a0151936125d7610200958689019060208091805184520151910152565b8a0151976125f5610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c08901528701906122b6565b9401906122ea565b6040513d6000823e3d90fd5b6020906126f3612b24565b60606126fd612271565b9260025461270a856117b8565b5261271f6115bd82516001600160401b031690565b612728856117c5565b5261273f6115bd868301516001600160401b031690565b612748856117d5565b526040810151612757856117e5565b520151612763836117f5565b5260056127e261277c60005463ffffffff9060401c1690565b60036127988263ffffffff166000526005602052604060002090565b01546127a386611805565b5260046127c08263ffffffff166000526005602052604060002090565b01546127cb86611815565b5263ffffffff166000526005602052604060002090565b01546127ed83611825565b5261280c6040519485938493630c76545d60e21b8552600485016124bf565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af490811561287d5760009161284e575b501561283c57565b6040516309bde33960e01b8152600490fd5b612870915060203d602011612876575b6128688183610404565b81019061229e565b38612834565b503d61285e565b6126dc565b6001600160401b03918216908216039190821161198057565b6001600160401b038091169081146119805760010190565b9091612922610452936008548015159081612988575b5061292c575b60406128e560208501516001600160401b031690565b9301516129026128f3610445565b6001600160401b039095168552565b60208401526129126128f3610454565b6001600160401b03166020840152565b604082015261184a565b61294a612944611d1e6007546001600160401b031690565b9061179c565b6129836129676129626007546001600160401b031690565b61289b565b6001600160401b03166001600160401b03196007541617600755565b6128cf565b6129cb915061299c611d1e6129ad92611ce9565b505460401c6001600160401b031690565b6129c561299c611d1e6007546001600160401b031690565b90612882565b6001600160401b036129f26129e960065463ffffffff9060a81c1690565b63ffffffff1690565b91161015386128c9565b90816020910312610262575190565b8015611980576000190190565b612a20610461565b906000825260006020830152612a34611cd0565b6040830152612a41611cd0565b6060830152612a4e611cd0565b6080830152612a5b611cd0565b60a0830152612a68611cd0565b60c0830152612a75611cd0565b60e0830152612a82611cd0565b610100830152612a90611cd0565b610120830152612a9e611cd0565b610140830152612aac611cd0565b610160830152612aba611cd0565b610180830152612ac8611cd0565b6101a0830152612ad6611cd0565b6101c0830152612ae4611cd0565b6101e0830152612af2611cd0565b610200830152612b00611cd0565b610220830152612b0e611cd0565b610240830152612b1c611cd0565b610260830152565b612b2c612a18565b906201000082527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab37060206008818501527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b81604086017f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee818151525101527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c81606086017f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d8151525101527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d381608086017f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac88151525101527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea8160a086017f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c8398151525101527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b68160c086017f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce78151525101527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d8160e086017f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a68151525101527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b8161010086017f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f8151525101527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c148161012086017f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e088151525101527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba8161014086017f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e78151525101527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f8161016086017f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba6550228151525101527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e8161018086017f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df28151525101527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b816101a086017f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f78151525101527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc28816101c086017f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec738151525101527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d45690915824816101e086017f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508038151525101527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf8161020086017f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a8151525101527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab8161022086017f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db448151525101527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be18161024086017f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a7581515251015261026084017f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9815152510152565b90813b156131375760008051602061324d83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511561311c5761311991613187565b50565b50503461312557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff60008051602061326d8339815191525460401c161561317557565b604051631afcd79f60e31b8152600490fd5b600080611d7b93602081519101845af43d156131c5573d916131a883610d41565b926131b66040519485610404565b83523d6000602085013e6131c9565b6060915b906131f057508051156131de57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580613223575b613201575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156131f956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a0346200054057601f6200371a38819003918201601f19168301916001600160401b039190828411858510176200052a578085926040958652833981010392610140841262000540576101008094126200054057825191848301838110828211176200052a578452620000738262000545565b83526020916200008581840162000545565b9083850191825285810151918686019283526060820151916060870192835260808101516080880190815260a08201519060a0890191825260c08301519060c08a0191825260e08401519b60e08b019c8d528401620000e4906200055a565b9361012001620000f4906200055a565b99306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008c815480911c60ff166200051957808b8080931603620004d9575b508251161580159150620004cc575b8015620004c2575b8015620004b8575b8015620004ae575b8015620004a4575b801562000495575b6200048457918b95949391898e945116906006549868010000000000000000600160801b0380998951901b16808460018060801b0319809d1617176006558b519182600755519283600855519586600955519485600a55519687600b55519384600c558b600d54161717600d55600e55600f5582601055816011558360125560135560009a8b5463ffffffff8096169060018060601b031916178c556014549063ffffffff60a81b9060a81b169063ffffffff60a81b19161792836014558c51918b83019384528d830152606082015260608152608081018181108a8211176200047057908995949392918d525190209b8c600155519b8c60025560035560049b8c5560165491821515928362000402575b5050506200038d575b51169251875193888501858110878211176200036757895284528584015286519160608301838110868211176200037a5788528443168352858301928542168452888101948552601654680100000000000000008110156200036757806001620002f592016016556200056c565b9890986200035557505187549351939091169085161791871b161784555180516001850180546001600160401b031916919093161790915501516002919091015551613177915081620005a38239608051818181610db90152610f110152f35b634e487b7160e01b8152808b52602490fd5b634e487b7160e01b895260418b52602489fd5b634e487b7160e01b885260418a52602488fd5b906200039d90601554166200056c565b620003f057600281898093558260018201550155601554858116868114620003dd5760010186166001600160401b03199190911617601555849062000287565b634e487b7160e01b895260118b52602489fd5b634e487b7160e01b8852878a52602488fd5b91939450915060001981019081116200045d576200042188916200056c565b50548b1c16876200043681601554166200056c565b50548c1c169003918783116200045d5787939291849160a81c16911610153880806200027e565b634e487b7160e01b8a5260118c5260248afd5b634e487b7160e01b8c52604160045260248cfd5b8b516350dd03f760e11b8152600490fd5b5063ffffffff8516156200016c565b508c511562000164565b508251156200015c565b5083511562000154565b508151156200014c565b5088865116151562000144565b6001600160401b0319161790558b518981527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2908b90a138898162000135565b8d5163f92ee8a960e01b8152600490fd5b634e487b7160e01b600052604160045260246000fd5b600080fd5b51906001600160401b03821682036200054057565b519063ffffffff821682036200054057565b6016548110156200058c5760166000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461026757806302b592f3146102625780630d8e6e2c1461025d578063202a0adb146102585780632d52aad6146102535780632f5f46001461024e5780632f79889d14610249578063313df7b114610244578063382b215a1461023f5780633949d1e91461023a578063409939b7146102355780634847ae5d146102305780634f1ef2861461022b57806352d1902d14610226578063628277331461022157806369cc6a041461021c578063715018a614610217578063766718081461021257806376b6b7cb1461020d5780637f17baad1461020857806382d07ff3146102035780638584d23f146101fe5780638da5cb5b146101f957806396c1ca61146101f45780639fdb54a7146101ef578063aa922732146101ea578063ad3cb1cc146101e5578063bd32519a146101e0578063c23b9e9e146101db578063c8e5e498146101d6578063ca15521c146101d1578063ca6fe855146101cc578063d24d933d146101c7578063e0303301146101c2578063f0682054146101bd578063f2fde38b146101b85763f9e50d19146101b357600080fd5b61173c565b611713565b6116ef565b6115bf565b611577565b611559565b61140d565b6113f0565b6113c9565b6113a3565b611326565b6112f9565b6112b1565b61122c565b6111f6565b6111b9565b611188565b611118565b61107d565b611054565b610fe9565b610f87565b610f69565b610efe565b610d3f565b610ca1565b610aec565b61086a565b61084c565b610823565b6107fc565b610712565b6106d5565b610601565b61053e565b6104c8565b61029e565b600435906001600160a01b038216820361028257565b600080fd5b61014435906001600160a01b038216820361028257565b34610282576020366003190112610282576102b761026c565b6102bf612077565b6001600160a01b0390811690811561034f57601454908116821461033d5760ff60a01b19919091166001600160a81b03199190911617600160a01b1760148190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b6016548110156103b2576003906016600052027fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890190600090565b610361565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b038211176103e857604052565b6103b7565b61010081019081106001600160401b038211176103e857604052565b606081019081106001600160401b038211176103e857604052565b90601f801991011681019081106001600160401b038211176103e857604052565b604051906102e082018281106001600160401b038211176103e857604052565b60405190610472826103cd565b565b6040519061047282610409565b6040519061028082018281106001600160401b038211176103e857604052565b906040516104ae816103cd565b6020600182946001600160401b0381541684520154910152565b3461028257602036600319011261028257600435601654811015610282576104f1608091610377565b5061053c81549161050c60016001600160401b0392016104a1565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610282576000366003190112610282576060604051600181526000602082015260006040820152f35b602435906001600160401b038216820361028257565b35906001600160401b038216820361028257565b61010090600319011261028257604051906105ac826103ed565b816004356001600160401b03811681036102825781526105ca610568565b602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e060e435910152565b3461028257610100366003190112610282576106d360e061062136610592565b61064b6001600160401b038251166001600160401b03166001600160401b0319600d541617600d55565b61068b61066260208301516001600160401b031690565b67ffffffffffffffff60401b600d549160401b169067ffffffffffffffff60401b191617600d55565b6106986040820151600e55565b6106a56060820151600f55565b6106b26080820151601055565b6106bf60a0820151601155565b6106cc60c0820151601255565b0151601355565b005b34610282576020366003190112610282576017805460ff19166001179055600435601855005b6001600160401b0381116103e85760051b60200190565b346102825760208060031936011261028257600435906001600160401b038211610282573660238301121561028257816004013591610750836106fb565b9160409361076085519485610424565b80845260248285019160071b8401019236841161028257602401905b83821061078c576106d385611943565b8136036080811261028257868051916107a483610409565b6107ad8561057e565b83526107ba86860161057e565b83870152603f19011261028257608091849188516107d7816103cd565b6107e28a870161057e565b81526060860135848201528982015281520191019061077c565b346102825760003660031901126102825760206001600160401b0360155416604051908152f35b34610282576000366003190112610282576014546040516001600160a01b039091168152602090f35b34610282576000366003190112610282576020600354604051908152f35b34610282576020366003190112610282576004356001600160401b0381168103610282576106d3906bffffffffffffffff000000006000549160201b16906bffffffffffffffff00000000191617600055565b60409061010319011261028257604051906108d7826103cd565b610104358252610124356020830152565b6040906101431901126102825760405190610902826103cd565b610144358252610164356020830152565b604090610183190112610282576040519061092d826103cd565b6101843582526101a4356020830152565b6040906101c31901126102825760405190610958826103cd565b6101c43582526101e4356020830152565b6040906102031901126102825760405190610983826103cd565b610204358252610224356020830152565b60409061024319011261028257604051906109ae826103cd565b610244358252610264356020830152565b60409061028319011261028257604051906109d9826103cd565b6102843582526102a4356020830152565b6040906102c31901126102825760405190610a04826103cd565b6102c43582526102e4356020830152565b6040906103031901126102825760405190610a2f826103cd565b610304358252610324356020830152565b6040906103431901126102825760405190610a5a826103cd565b610344358252610364356020830152565b6040906103831901126102825760405190610a85826103cd565b6103843582526103a4356020830152565b6040906103c31901126102825760405190610ab0826103cd565b6103c43582526103e4356020830152565b6040906104031901126102825760405190610adb826103cd565b610404358252610424356020830152565b346102825761058036600319011261028257610b0736610592565b61048036610103190112610282576106d390610b21610445565b90610b2b366108bd565b8252610b36366108e8565b6020830152610b4436610913565b6040830152610b523661093e565b6060830152610b6036610969565b6080830152610b6e36610994565b60a0830152610b7c366109bf565b60c0830152610b8a366109ea565b60e0830152610b9836610a15565b610100830152610ba736610a40565b610120830152610bb636610a6b565b610140830152610bc536610a96565b610160830152610bd436610ac1565b610180830152610444356101a0830152610464356101c0830152610484356101e08301526104a4356102008301526104c4356102208301526104e4356102408301526105043561026083015261052435610280830152610544356102a0830152610564356102c0830152611a0b565b91909160e0806101008301946001600160401b03808251168552602082015116602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b3461028257600036600319011261028257610cba611c26565b50610d20604051610cca816103ed565b6006546001600160401b0390818116835260401c166020820152600754604082015260085460608201526009546080820152600a5460a0820152600b5460c0820152600c5460e082015260405191829182610c43565b0390f35b6001600160401b0381116103e857601f01601f191660200190565b60408060031936011261028257610d5461026c565b6024356001600160401b038111610282573660238201121561028257806004013590610d7f82610d24565b91610d8c85519384610424565b80835260209136602483830101116102825781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610ee2575b50610ed1579080600492610df7612077565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610ea2575b5050610e67578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b60008051602061312b8339815191528193929303610e89576106d38383612f8f565b8351632a87526960e21b81526004810191909152602490fd5b610ec2929350803d10610eca575b610eba8183610424565b8101906128da565b903880610e41565b503d610eb0565b845163703e46dd60e11b8152600490fd5b90508160008051602061312b8339815191525416141538610de5565b34610282576000366003190112610282577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610f5757602060405160008051602061312b8339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610282576000366003190112610282576020600254604051908152f35b3461028257600080600319360112610fe657610fa1612077565b60145460ff8160a01c1660001461033d576001600160a81b0319166014557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b3461028257600080600319360112610fe657611003612077565b60008051602061310b83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b346102825760003660031901126102825760206000546001600160401b0360405191831c168152f35b34610282576000366003190112610282576020600154604051908152f35b6004359063ffffffff8216820361028257565b610104359063ffffffff8216820361028257565b610124359063ffffffff8216820361028257565b949198979693909260e0969361010087019a6001600160401b03809216885216602087015260408601526060850152608084015260a083015260c08201520152565b346102825760203660031901126102825763ffffffff61113661109b565b1660005260056020526040600020805490610d206001600160401b039160018101549060028101546003820154600483015491600660058501549401549460405198888a998260401c169116896110d6565b34610282576000366003190112610282576111a1611c26565b50610d206111ad611c64565b60405191829182610c43565b346102825760203660031901126102825760406111d7600435611d07565b61053c82518092602080916001600160401b0381511684520151910152565b346102825760003660031901126102825760008051602061310b833981519152546040516001600160a01b039091168152602090f35b346102825760203660031901126102825761124561109b565b61124d612077565b63ffffffff808216610e10811091821561129f575b505061128d576014805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b60145460a81c16101590503880611262565b3461028257600036600319011261028257600d546001600160401b03610d20600e54600f5460105460115490601254926013549460405198888a998260401c169116896110d6565b346102825761010036600319011261028257602061131e61131936610592565b611dca565b604051908152f35b34610282576000366003190112610282576040805190611345826103cd565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106113905784604081866000838284010152601f80199101168101030190f35b858101830151858201830152820161136e565b3461028257600036600319011261028257602060ff60145460a01c166040519015158152f35b3461028257600036600319011261028257602063ffffffff60145460a81c16604051908152f35b34610282576000366003190112610282576017805460ff19169055005b34610282576101603660031901126102825761142836610592565b6114306110ae565b906114396110c2565b611441610287565b9060008051602061314b83398151915254936001600160401b0360ff8660401c1615951680159081611551575b6001149081611547575b15908161153e575b5061152c5760008051602061314b833981519152805467ffffffffffffffff191660011790556114b4938561150757611e12565b6114ba57005b60008051602061314b833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2908060208101610338565b60008051602061314b833981519152805460ff60401b1916600160401b179055611e12565b60405163f92ee8a960e01b8152600490fd5b90501538611480565b303b159150611478565b86915061146e565b34610282576000366003190112610282576020600454604051908152f35b34610282576000366003190112610282576006546001600160401b03610d20600754600854600954600a5490600b5492600c549460405198888a998260401c169116896110d6565b34610282576040366003190112610282576004356024359060ff6017541660009060001461160d5750906115f9610d209260185490611cfa565b115b60405190151581529081906020820190565b916016549143811180156116e5575b6116725761162a8493611ceb565b9261164c6116406015546001600160401b031690565b6001600160401b031690565b935b8115611684575b50909192501561167257610d209261166c91611cfa565b116115fb565b60405163b0b4387760e01b8152600490fd5b826116a261164061169484610377565b50546001600160401b031690565b11156116cb575b600281106116c6578481146116c6576116c1906128e9565b61164e565b611655565b94505060016116df61164061169487610377565b946116a9565b506003831061161c565b3461028257600036600319011261028257602063ffffffff60005416604051908152f35b34610282576020366003190112610282576106d361172f61026c565b611737612077565b612003565b34610282576000366003190112610282576020601654604051908152f35b634e487b7160e01b600052600060045260246000fd5b60e0906117c26001600160401b03808351166001600160401b0319600d541617600d5560208301511667ffffffffffffffff60401b600d549160401b169067ffffffffffffffff60401b191617600d55565b6040810151600e556060810151600f55608081015160105560a081015160115560c08101516012550151601355565b634e487b7160e01b600052601160045260246000fd5b9061181e5760028160008093558260018201550155565b61175a565b8051156103b25760200190565b8051600110156103b25760400190565b8051600210156103b25760600190565b8051600310156103b25760800190565b8051600410156103b25760a00190565b8051600510156103b25760c00190565b8051600610156103b25760e00190565b8051600710156103b2576101000190565b80518210156103b25760209160051b010190565b601654600160401b8110156103e8578060016118d49201601655610377565b91909161181e57805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b90601654600060165580611980575b5060005b825181101561197b578061197561196f600193866118a1565b516118b5565b01611956565b509050565b600390806003029060038204036119e85760166000527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289908101905b8181106119ca575050611952565b806119e2849260026000918281558260018201550155565b016119bc565b6117f1565b9190916001600160401b03808094169116029182169182036119e857565b9060145460ff8160a01c169081611c12575b50611c005781516001600160401b031690611a49611640611a3c611cbe565b516001600160401b031690565b6001600160401b0380931611801590611bc9575b611bb7578190611a7b6000548363ffffffff82169160201c166119ed565b600d5460401c6001600160401b031683821694859116149384159081611b97575b50611b74575090611b167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6926040860194611ad786516120b0565b611ae460608801516120b0565b611af160808801516120b0565b611afe60a08801516120b0565b611b0b60c08801516120b0565b611b67575b85612629565b611b1f84611770565b611b2e84824216834316612791565b611b536020611b4486516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b611b6f61211e565b611b10565b60405163036466bf60e31b81526001600160401b03919091166004820152602490fd5b9050611bb061164060208801516001600160401b031690565b1138611a9c565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b031682611bf76116406020611be9611cbe565b01516001600160401b031690565b91161115611a5d565b6040516301474c8f60e71b8152600490fd5b6001600160a01b0316331415905038611a1d565b60405190611c33826103ed565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b60405190611c71826103ed565b81600d546001600160401b0390818116835260401c166020820152600e546040820152600f546060820152601054608082015260115460a082015260125460c082015260e0601354910152565b611cc6611c26565b50611ccf611c64565b90565b60405190611cdf826103cd565b60006020838281520152565b6000198101919082116119e857565b919082039182116119e857565b611d0f611cd2565b5060165490611d25611d2083611ceb565b610377565b5090611d3f6116406001809401546001600160401b031690565b811015611db857611d5b6116406015546001600160401b031690565b838110611d7d575050506001611d76611d20611ccf93611ceb565b50016104a1565b81611d9d61164085611d8e85610377565b5001546001600160401b031690565b11611da9578201611d5b565b611ccf9350611d769150610377565b604051631856a49960e21b8152600490fd5b60808101519060c060a082015191015160405191602083019384526040830152606082015260608152608081018181106001600160401b038211176103e85760405251902090565b9192611e2890611e20613036565b611737613036565b611e30613036565b6001600160401b039081611e4b84516001600160401b031690565b1615801590611fe4575b8015611fd8575b8015611fcc575b8015611fc0575b8015611fb4575b8015611fa6575b611f945761047293611f33611f5892611efa8660e0906001600160401b038151166006549067ffffffffffffffff60401b602084015160401b16916fffffffffffffffffffffffffffffffff1916171760065560408101516007556060810151600855608081015160095560a0810151600a5560c0810151600b550151600c55565b611f0386611770565b611f1d6bffffffffffffffff000000001960005416600055565b63ffffffff1663ffffffff196000541617600055565b6014805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b611f89611f6483611dca565b611f6d81600155565b611f8460e085015191611f7f83600255565b600355565b600455565b804216904316612791565b6040516350dd03f760e11b8152600490fd5b5063ffffffff811615611e78565b5060e083015115611e71565b5060c083015115611e6a565b5060a083015115611e63565b50608083015115611e5c565b50611ffc61164060208501516001600160401b031690565b1515611e55565b6001600160a01b0390811690811561205e5760008051602061310b83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b60008051602061310b833981519152546001600160a01b0316330361209857565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000111156120d957565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b612129611319611c64565b6003546001556003556004546002556013546004556001600160401b0360018160005460201c16018181116119e857600080546bffffffffffffffff000000001916602092831b6bffffffffffffffff00000000161790557fdb3558259e039d7e50e816b9dcce30fb114d8a9c86eca5ab14b60194d6945d3f91600054821c16604051908152a1565b6040519061012082018281106001600160401b038211176103e85760405260088252610100366020840137565b90816020910312610282575180151581036102825790565b90815180825260208080930193019160005b828110612217575050505090565b835185529381019392810192600101612209565b6104609061224483825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e08401526080810151906122a2610100928386019060208091805184520151910152565b60a0810151916122c2610140938487019060208091805184520151910152565b60c0820151926122e2610180948588019060208091805184520151910152565b60e0830151916123026101c0938489019060208091805184520151910152565b83015161231f610200918289019060208091805184520151910152565b6101208401519161234061024093848a019060208091805184520151910152565b8401519261235e61028094858a019060208091805184520151910152565b612399610160860151966123826102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b939290612615610472936104e0926126066102606109609280518b52602081015160208c0152612442604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c01526125f08b61248e60a08401516101008093019060208091805184520151910152565b6125c18d6103c060c08601516124b4610140918285019060208091805184520151910152565b61259460e0880151956124d7610180978887019060208091805184520151910152565b8801516124f46101c0918287019060208091805184520151910152565b6125656101208a015193612518610200958689019060208091805184520151910152565b8a015197612536610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c08901528701906121f7565b94019061222b565b6040513d6000823e3d90fd5b602090612634612a02565b606061263e6121b2565b9260025461264b85611823565b5261266061164082516001600160401b031690565b61266985611830565b52612680611640868301516001600160401b031690565b61268985611840565b52604081015161269885611850565b5201516126a483611860565b526010546126b183611870565b526011546126be83611880565b526012546126cb83611890565b526126ea6040519485938493630c76545d60e21b855260048501612400565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af490811561275b5760009161272c575b501561271a57565b6040516309bde33960e01b8152600490fd5b61274e915060203d602011612754575b6127468183610424565b8101906121df565b38612712565b503d61273c565b61261d565b6001600160401b0391821690821603919082116119e857565b6001600160401b038091169081146119e85760010190565b9091612800610472936016548015159081612866575b5061280a575b60406127c360208501516001600160401b031690565b9301516127e06127d1610465565b6001600160401b039095168552565b60208401526127f06127d1610474565b6001600160401b03166020840152565b60408201526118b5565b612828612822611d206015546001600160401b031690565b90611807565b6128616128456128406015546001600160401b031690565b612779565b6001600160401b03166001600160401b03196015541617601555565b6127ad565b6128a9915061287a611d2061288b92611ceb565b505460401c6001600160401b031690565b6128a361287a611d206015546001600160401b031690565b90612760565b6001600160401b036128d06128c760145463ffffffff9060a81c1690565b63ffffffff1690565b91161015386127a7565b90816020910312610282575190565b80156119e8576000190190565b6128fe610481565b906000825260006020830152612912611cd2565b604083015261291f611cd2565b606083015261292c611cd2565b6080830152612939611cd2565b60a0830152612946611cd2565b60c0830152612953611cd2565b60e0830152612960611cd2565b61010083015261296e611cd2565b61012083015261297c611cd2565b61014083015261298a611cd2565b610160830152612998611cd2565b6101808301526129a6611cd2565b6101a08301526129b4611cd2565b6101c08301526129c2611cd2565b6101e08301526129d0611cd2565b6102008301526129de611cd2565b6102208301526129ec611cd2565b6102408301526129fa611cd2565b610260830152565b612a0a6128f6565b906201000082527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab37060206008818501527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b81604086017f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee818151525101527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c81606086017f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d8151525101527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d381608086017f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac88151525101527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea8160a086017f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c8398151525101527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b68160c086017f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce78151525101527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d8160e086017f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a68151525101527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b8161010086017f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f8151525101527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c148161012086017f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e088151525101527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba8161014086017f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e78151525101527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f8161016086017f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba6550228151525101527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e8161018086017f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df28151525101527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b816101a086017f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f78151525101527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc28816101c086017f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec738151525101527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d45690915824816101e086017f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508038151525101527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf8161020086017f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a8151525101527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab8161022086017f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db448151525101527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be18161024086017f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a7581515251015261026084017f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9815152510152565b90813b156130155760008051602061312b83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612ffa57612ff791613065565b50565b50503461300357565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff60008051602061314b8339815191525460401c161561305357565b604051631afcd79f60e31b8152600490fd5b600080611ccf93602081519101845af43d156130a3573d9161308683610d24565b926130946040519485610424565b83523d6000602085013e6130a7565b6060915b906130ce57508051156130bc57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580613101575b6130df575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156130d756fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json index 9d5ff31b5..0d2cdac1f 100644 --- a/contract-bindings/artifacts/LightClient_bytecode.json +++ b/contract-bindings/artifacts/LightClient_bytecode.json @@ -1 +1 @@ -"0x60a080604052346100cd57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100be57506001600160401b036002600160401b031982821601610079575b604051612f5d9081620000d38239608051818181610b160152610c6e0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc146101f757806302b592f3146101f25780630d8e6e2c146101ed5780632f79889d146101e8578063313df7b1146101e3578063382b215a146101de578063409939b7146101d95780634847ae5d146101d45780634f1ef286146101cf57806352d1902d146101ca57806362827733146101c557806369cc6a04146101c0578063715018a6146101bb57806376671808146101b657806376b6b7cb146101b15780637f17baad146101ac57806382d07ff3146101a75780638584d23f146101a25780638da5cb5b1461019d57806396c1ca6114610198578063aa92273214610193578063ad3cb1cc1461018e578063bd32519a14610189578063c23b9e9e14610184578063ca15521c1461017f578063ca6fe8551461017a578063e030330114610175578063f068205414610170578063f2fde38b1461016b5763f9e50d191461016657600080fd5b6113b1565b611388565b611364565b61125f565b611241565b6110f5565b6110ce565b6110a8565b61102b565b610ffe565b610f79565b610f43565b610f06565b610ede565b610e31565b610dd8565b610dae565b610d43565b610ce4565b610cc6565b610c5b565b610a9c565b6109c8565b610811565b61053f565b610516565b6104ef565b6104c5565b61044f565b61022e565b600435906001600160a01b038216820361021257565b600080fd5b61014435906001600160a01b038216820361021257565b34610212576020366003190112610212576102476101fc565b61024f611b61565b6001600160a01b039081169081156102df5760065490811682146102cd5760ff60a01b19919091166001600160a81b03199190911617600160a01b1760068190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600854811015610342576003906008600052027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30190600090565b6102f1565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761037857604052565b610347565b61010081019081106001600160401b0382111761037857604052565b90601f801991011681019081106001600160401b0382111761037857604052565b604051906102e082018281106001600160401b0382111761037857604052565b604051906103e78261035d565b565b60405190606082018281106001600160401b0382111761037857604052565b6040519061028082018281106001600160401b0382111761037857604052565b906040516104358161035d565b6020600182946001600160401b0381541684520154910152565b346102125760203660031901126102125760043560085481101561021257610478608091610307565b506104c381549161049360016001600160401b039201610428565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610212576000366003190112610212576060604051600181526000602082015260006040820152f35b346102125760003660031901126102125760206001600160401b0360075416604051908152f35b34610212576000366003190112610212576006546040516001600160a01b039091168152602090f35b34610212576000366003190112610212576020600354604051908152f35b602435906001600160401b038216820361021257565b610100906003190112610212576040519061058d8261037d565b816004356001600160401b03811681036102125781526105ab61055d565b602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e060e435910152565b60409061010319011261021257604051906105fc8261035d565b610104358252610124356020830152565b60409061014319011261021257604051906106278261035d565b610144358252610164356020830152565b60409061018319011261021257604051906106528261035d565b6101843582526101a4356020830152565b6040906101c3190112610212576040519061067d8261035d565b6101c43582526101e4356020830152565b60409061020319011261021257604051906106a88261035d565b610204358252610224356020830152565b60409061024319011261021257604051906106d38261035d565b610244358252610264356020830152565b60409061028319011261021257604051906106fe8261035d565b6102843582526102a4356020830152565b6040906102c319011261021257604051906107298261035d565b6102c43582526102e4356020830152565b60409061030319011261021257604051906107548261035d565b610304358252610324356020830152565b604090610343190112610212576040519061077f8261035d565b610344358252610364356020830152565b60409061038319011261021257604051906107aa8261035d565b6103843582526103a4356020830152565b6040906103c319011261021257604051906107d58261035d565b6103c43582526103e4356020830152565b60409061040319011261021257604051906108008261035d565b610404358252610424356020830152565b34610212576105803660031901126102125761082c36610573565b6104803661010319011261021257610968906108466103ba565b90610850366105e2565b825261085b3661060d565b602083015261086936610638565b604083015261087736610663565b60608301526108853661068e565b6080830152610893366106b9565b60a08301526108a1366106e4565b60c08301526108af3661070f565b60e08301526108bd3661073a565b6101008301526108cc36610765565b6101208301526108db36610790565b6101408301526108ea366107bb565b6101608301526108f9366107e6565b610180830152610444356101a0830152610464356101c0830152610484356101e08301526104a4356102008301526104c4356102208301526104e4356102408301526105043561026083015261052435610280830152610544356102a0830152610564356102c08301526114a1565b005b91909160e0806101008301946001600160401b03808251168552602082015116602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b3461021257600080600319360112610a7e576040610a7a916109e861170b565b5063ffffffff815460201c168152600560205220600660405191610a0b8361037d565b80546001600160401b038082168552610a35915b60401c1660208501906001600160401b03169052565b600181015460408401526002810154606084015260038101546080840152600481015460a0840152600581015460c0840152015460e08201526040519182918261096a565b0390f35b80fd5b6001600160401b03811161037857601f01601f191660200190565b60408060031936011261021257610ab16101fc565b6024356001600160401b038111610212573660238201121561021257806004013590610adc82610a81565b91610ae985519384610399565b80835260209136602483830101116102125781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610c3f575b50610c2e579080600492610b54611b61565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610bff575b5050610bc4578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612f118339815191528193929303610be6576109688383612d75565b8351632a87526960e21b81526004810191909152602490fd5b610c1f929350803d10610c27575b610c178183610399565b8101906126cc565b903880610b9e565b503d610c0d565b845163703e46dd60e11b8152600490fd5b905081600080516020612f118339815191525416141538610b42565b34610212576000366003190112610212577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610cb4576020604051600080516020612f118339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610212576000366003190112610212576020600254604051908152f35b3461021257600080600319360112610a7e57610cfe611b61565b60065460ff8160a01c166000146102cd576001600160a81b0319166006557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b3461021257600080600319360112610a7e57610d5d611b61565b600080516020612ef183398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b346102125760003660031901126102125760206001600160401b0360005460601c16604051908152f35b34610212576000366003190112610212576020600154604051908152f35b6004359063ffffffff8216820361021257565b610104359063ffffffff8216820361021257565b610124359063ffffffff8216820361021257565b346102125760203660031901126102125763ffffffff610e4f610df6565b1660005260056020526040600020805490610a7a6001600160401b039160018101549060028101546003820154600483015491600660058501549401549460405198888a998260401c16911689949198979693909260e0969361010087019a6001600160401b03809216885216602087015260408601526060850152608084015260a083015260c08201520152565b3461021257600036600319011261021257610a7a610efa611749565b6040519182918261096a565b34610212576020366003190112610212576040610f24600435611803565b6104c382518092602080916001600160401b0381511684520151910152565b3461021257600036600319011261021257600080516020612ef1833981519152546040516001600160a01b039091168152602090f35b3461021257602036600319011261021257610f92610df6565b610f9a611b61565b63ffffffff808216610e108110918215610fec575b5050610fda576006805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b60065460a81c16101590503880610faf565b346102125761010036600319011261021257602061102361101e36610573565b6118c9565b604051908152f35b3461021257600036600319011261021257604080519061104a8261035d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106110955784604081866000838284010152601f80199101168101030190f35b8581018301518582018301528201611073565b3461021257600036600319011261021257602060ff60065460a01c166040519015158152f35b3461021257600036600319011261021257602063ffffffff60065460a81c16604051908152f35b34610212576101603660031901126102125761111036610573565b611118610e09565b90611121610e1d565b611129610217565b90600080516020612f3183398151915254936001600160401b0360ff8660401c1615951680159081611239575b600114908161122f575b159081611226575b5061121457600080516020612f31833981519152805467ffffffffffffffff1916600117905561119c93856111ef57611911565b6111a257005b600080516020612f31833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102c8565b600080516020612f31833981519152805460ff60401b1916600160401b179055611911565b60405163f92ee8a960e01b8152600490fd5b90501538611168565b303b159150611160565b869150611156565b34610212576000366003190112610212576020600454604051908152f35b3461021257604036600319011261021257600435600854438211801561135a575b6112e7576000916112926000926117e7565b916112b46112a86007546001600160401b031690565b6001600160401b031690565b925b81156112f9575b50909150156112e7576112d6610a7a92602435926117f6565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b826113176112a861130984610307565b50546001600160401b031690565b1115611340575b6002811061133b5783811461133b5761133690611ae0565b6112b6565b6112bd565b93505060016113546112a861130986610307565b9361131e565b5060038110611280565b3461021257600036600319011261021257602063ffffffff60005416604051908152f35b34610212576020366003190112610212576109686113a46101fc565b6113ac611b61565b611aed565b34610212576000366003190112610212576020600854604051908152f35b634e487b7160e01b600052601160045260246000fd5b9190916001600160401b038080941691160291821691820361140357565b6113cf565b9060e06006916114686001600160401b0361143c8184511687906001600160401b03166001600160401b0319825416179055565b6020830151865467ffffffffffffffff60401b1916911660401b67ffffffffffffffff60401b16178555565b60408101516001850155606081015160028501556080810151600385015560a0810151600485015560c081015160058501550151910155565b9060065460ff8160a01c1690816116f7575b506116e55781516001600160401b0316906114df6112a86114d2611749565b516001600160401b031690565b6001600160401b03809316118015906116ae575b61169c57819060005461154361153363ffffffff611518818516878660601c166113e5565b9360401c1663ffffffff166000526005602052604060002090565b5460401c6001600160401b031690565b8382169485911614938415908161167c575b506116595750906115cf7fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae69260408601946115908651611b9a565b61159d6060880151611b9a565b6115aa6080880151611b9a565b6115b760a0880151611b9a565b6115c460c0880151611b9a565b61164c575b85612271565b611604846115ff6115e960005463ffffffff9060401c1690565b63ffffffff166000526005602052604060002090565b611408565b61161384824216834316612583565b611638602061162986516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b611654611c20565b6115c9565b60405163036466bf60e31b81526001600160401b03919091166004820152602490fd5b90506116956112a860208801516001600160401b031690565b1138611555565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b0316826116dc6112a860206116ce611749565b01516001600160401b031690565b911611156114f3565b6040516301474c8f60e71b8152600490fd5b6001600160a01b03163314159050386114b3565b604051906117188261037d565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b61175161170b565b5063ffffffff60005460401c166000526005602052604060002060066040519161177a8361037d565b80546001600160401b03808216855261179291610a1f565b600181015460408401526002810154606084015260038101546080840152600481015460a0840152600581015460c0840152015460e082015290565b604051906117db8261035d565b60006020838281520152565b60001981019190821161140357565b9190820391821161140357565b61180b6117ce565b506008549061182161181c836117e7565b610307565b509061183b6112a86001809401546001600160401b031690565b8110156118b7576118576112a86007546001600160401b031690565b83811061187c57505050600161187261181c611879936117e7565b5001610428565b90565b8161189c6112a88561188d85610307565b5001546001600160401b031690565b116118a8578201611857565b61187993506118729150610307565b604051631856a49960e21b8152600490fd5b60808101519060c060a082015191015160405191602083019384526040830152606082015260608152608081018181106001600160401b038211176103785760405251902090565b91909261192890611920612e1c565b6113ac612e1c565b611930612e1c565b600160401b6bffffffffffffffff0000000019600054161792836000556001600160401b03918261196885516001600160401b031690565b1615801590611ac1575b8015611ab5575b8015611aa9575b8015611a9d575b8015611a91575b8015611a83575b611a7157611a10611a35926119ca866115ff63ffffffff6103e79a60201c1663ffffffff166000526005602052604060002090565b6119e4866115ff6115e960005463ffffffff9060401c1690565b6000805473ffffffffffffffff0000000000000000ffffffff191663ffffffff92909216919091179055565b6006805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b611a66611a41836118c9565b611a4a81600155565b611a6160e085015191611a5c83600255565b600355565b600455565b804216904316612583565b6040516350dd03f760e11b8152600490fd5b5063ffffffff821615611995565b5060e08401511561198e565b5060c084015115611987565b5060a084015115611980565b50608084015115611979565b50611ad96112a860208601516001600160401b031690565b1515611972565b8015611403576000190190565b6001600160a01b03908116908115611b4857600080516020612ef183398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612ef1833981519152546001600160a01b03163303611b8257565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611bc357565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b9060016001600160401b038093160191821161140357565b7fdb3558259e039d7e50e816b9dcce30fb114d8a9c86eca5ab14b60194d6945d3f611d776000611d5e81549163ffffffff604093841c1681526005602052611cd5611cca8483206006865191611c758361037d565b80546001600160401b03808216855290891c1660208401526001810154888401526002810154606084015260038101546080840152600481015460a0840152600581015460c0840152015460e08201526118c9565b611a5c600354600155565b611ce0600454600255565b611d016006611cfa6115e9845463ffffffff9060401c1690565b0154600455565b611d4e611d21611d1c83546001600160401b039060601c1690565b611c08565b6000805467ffffffffffffffff60601b191660609290921b67ffffffffffffffff60601b16919091179055565b5460601c6001600160401b031690565b90516001600160401b0390911681529081906020820190565b0390a1565b6040519061012082018281106001600160401b038211176103785760405260088252610100366020840137565b8051156103425760200190565b8051600110156103425760400190565b8051600210156103425760600190565b8051600310156103425760800190565b8051600410156103425760a00190565b8051600510156103425760c00190565b8051600610156103425760e00190565b805160071015610342576101000190565b90816020910312610212575180151581036102125790565b90815180825260208080930193019160005b828110611e5f575050505090565b835185529381019392810192600101611e51565b61046090611e8c83825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611eea610100928386019060208091805184520151910152565b60a081015191611f0a610140938487019060208091805184520151910152565b60c082015192611f2a610180948588019060208091805184520151910152565b60e083015191611f4a6101c0938489019060208091805184520151910152565b830151611f67610200918289019060208091805184520151910152565b61012084015191611f8861024093848a019060208091805184520151910152565b84015192611fa661028094858a019060208091805184520151910152565b611fe161016086015196611fca6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b93929061225d6103e7936104e09261224e6102606109609280518b52602081015160208c015261208a604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c01526122388b6120d660a08401516101008093019060208091805184520151910152565b6122098d6103c060c08601516120fc610140918285019060208091805184520151910152565b6121dc60e08801519561211f610180978887019060208091805184520151910152565b88015161213c6101c0918287019060208091805184520151910152565b6121ad6101208a015193612160610200958689019060208091805184520151910152565b8a01519761217e610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611e3f565b940190611e73565b6040513d6000823e3d90fd5b60209061227c6127e7565b6060612286611d7c565b9260025461229385611da9565b526122a86112a882516001600160401b031690565b6122b185611db6565b526122c86112a8868301516001600160401b031690565b6122d185611dc6565b5260408101516122e085611dd6565b5201516122ec83611de6565b52600561236b61230560005463ffffffff9060401c1690565b60036123218263ffffffff166000526005602052604060002090565b015461232c86611df6565b5260046123498263ffffffff166000526005602052604060002090565b015461235486611e06565b5263ffffffff166000526005602052604060002090565b015461237683611e16565b526123956040519485938493630c76545d60e21b855260048501612048565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af4908115612406576000916123d7575b50156123c557565b6040516309bde33960e01b8152600490fd5b6123f9915060203d6020116123ff575b6123f18183610399565b810190611e27565b386123bd565b503d6123e7565b612265565b6001600160401b03918216908216039190821161140357565b9061243b5760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146114035760010190565b600854600160401b81101561037857600181018060085581101561034257602060037ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5926008600052029261257c6040857ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301926125386001600160401b039461250c8684511682906001600160401b03166001600160401b0319825416179055565b82870151815467ffffffffffffffff60401b191690871660401b67ffffffffffffffff60401b16179055565b0151918251167ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee48601906001600160401b03166001600160401b0319825416179055565b0151910155565b90916125f26103e7936008548015159081612658575b506125fc575b60406125b560208501516001600160401b031690565b9301516125d26125c36103da565b6001600160401b039095168552565b60208401526125e26125c36103e9565b6001600160401b03166020840152565b6040820152612469565b61261a61261461181c6007546001600160401b031690565b90612424565b6126536126376126326007546001600160401b031690565b612451565b6001600160401b03166001600160401b03196007541617600755565b61259f565b61269b915061266c61181c61267d926117e7565b505460401c6001600160401b031690565b61269561266c61181c6007546001600160401b031690565b9061240b565b6001600160401b036126c26126b960065463ffffffff9060a81c1690565b63ffffffff1690565b9116101538612599565b90816020910312610212575190565b6126e3610408565b9060008252600060208301526126f76117ce565b60408301526127046117ce565b60608301526127116117ce565b608083015261271e6117ce565b60a083015261272b6117ce565b60c08301526127386117ce565b60e08301526127456117ce565b6101008301526127536117ce565b6101208301526127616117ce565b61014083015261276f6117ce565b61016083015261277d6117ce565b61018083015261278b6117ce565b6101a08301526127996117ce565b6101c08301526127a76117ce565b6101e08301526127b56117ce565b6102008301526127c36117ce565b6102208301526127d16117ce565b6102408301526127df6117ce565b610260830152565b6127ef6126db565b906210000082527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d560206008818501527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c81604086017f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b338151525101527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e97081606086017f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db8151525101527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d81608086017f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b998151525101527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df600938160a086017f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a58066258151525101527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde288160c086017f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a98151525101527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc038160e086017f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b596938151525101527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad8161010086017f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e78151525101527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea170318161012086017f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e48151525101527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db70368161014086017f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae72488151525101527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e84158161016086017f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e56198151525101527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a38161018086017f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc88151525101527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c816101a086017f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc8151525101527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd5816101c086017f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b408151525101527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd3816101e086017f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc58151525101527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc8161020086017f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa48151525101527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e8161022086017f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a297822268151525101527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd48161024086017f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab261423981515251015261026084017f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82815152510152565b90813b15612dfb57600080516020612f1183398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612de057612ddd91612e4b565b50565b505034612de957565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612f318339815191525460401c1615612e3957565b604051631afcd79f60e31b8152600490fd5b60008061187993602081519101845af43d15612e89573d91612e6c83610a81565b92612e7a6040519485610399565b83523d6000602085013e612e8d565b6060915b90612eb45750805115612ea257805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612ee7575b612ec5575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612ebd56fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a080604052346100cd57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100be57506001600160401b036002600160401b031982821601610079575b604051612e199081620000d38239608051818181610b000152610c580152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461021757806302b592f3146102125780630d8e6e2c1461020d5780632f79889d14610208578063313df7b114610203578063382b215a146101fe578063409939b7146101f95780634847ae5d146101f45780634f1ef286146101ef57806352d1902d146101ea57806362827733146101e557806369cc6a04146101e0578063715018a6146101db57806376671808146101d657806376b6b7cb146101d15780637f17baad146101cc57806382d07ff3146101c75780638584d23f146101c25780638da5cb5b146101bd57806396c1ca61146101b85780639fdb54a7146101b3578063aa922732146101ae578063ad3cb1cc146101a9578063bd32519a146101a4578063c23b9e9e1461019f578063ca15521c1461019a578063ca6fe85514610195578063d24d933d14610190578063e03033011461018b578063f068205414610186578063f2fde38b146101815763f9e50d191461017c57600080fd5b61143b565b611412565b6113ee565b6112e9565b6112a1565b611283565b611137565b611110565b6110ea565b61106d565b611040565b610ff8565b610f73565b610f3d565b610f00565b610ecf565b610e5f565b610dc4565b610d9b565b610d30565b610cce565b610cb0565b610c45565b610a86565b6109e8565b610831565b61055f565b610536565b61050f565b6104e5565b61046f565b61024e565b600435906001600160a01b038216820361023257565b600080fd5b61014435906001600160a01b038216820361023257565b346102325760203660031901126102325761026761021c565b61026f611b68565b6001600160a01b039081169081156102ff5760145490811682146102ed5760ff60a01b19919091166001600160a81b03199190911617600160a01b1760148190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b601654811015610362576003906016600052027fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890190600090565b610311565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761039857604052565b610367565b61010081019081106001600160401b0382111761039857604052565b90601f801991011681019081106001600160401b0382111761039857604052565b604051906102e082018281106001600160401b0382111761039857604052565b604051906104078261037d565b565b60405190606082018281106001600160401b0382111761039857604052565b6040519061028082018281106001600160401b0382111761039857604052565b906040516104558161037d565b6020600182946001600160401b0381541684520154910152565b346102325760203660031901126102325760043560165481101561023257610498608091610327565b506104e38154916104b360016001600160401b039201610448565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610232576000366003190112610232576060604051600181526000602082015260006040820152f35b346102325760003660031901126102325760206001600160401b0360155416604051908152f35b34610232576000366003190112610232576014546040516001600160a01b039091168152602090f35b34610232576000366003190112610232576020600354604051908152f35b602435906001600160401b038216820361023257565b61010090600319011261023257604051906105ad8261039d565b816004356001600160401b03811681036102325781526105cb61057d565b602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e060e435910152565b604090610103190112610232576040519061061c8261037d565b610104358252610124356020830152565b60409061014319011261023257604051906106478261037d565b610144358252610164356020830152565b60409061018319011261023257604051906106728261037d565b6101843582526101a4356020830152565b6040906101c3190112610232576040519061069d8261037d565b6101c43582526101e4356020830152565b60409061020319011261023257604051906106c88261037d565b610204358252610224356020830152565b60409061024319011261023257604051906106f38261037d565b610244358252610264356020830152565b604090610283190112610232576040519061071e8261037d565b6102843582526102a4356020830152565b6040906102c319011261023257604051906107498261037d565b6102c43582526102e4356020830152565b60409061030319011261023257604051906107748261037d565b610304358252610324356020830152565b604090610343190112610232576040519061079f8261037d565b610344358252610364356020830152565b60409061038319011261023257604051906107ca8261037d565b6103843582526103a4356020830152565b6040906103c319011261023257604051906107f58261037d565b6103c43582526103e4356020830152565b60409061040319011261023257604051906108208261037d565b610404358252610424356020830152565b34610232576105803660031901126102325761084c36610593565b6104803661010319011261023257610988906108666103da565b9061087036610602565b825261087b3661062d565b602083015261088936610658565b604083015261089736610683565b60608301526108a5366106ae565b60808301526108b3366106d9565b60a08301526108c136610704565b60c08301526108cf3661072f565b60e08301526108dd3661075a565b6101008301526108ec36610785565b6101208301526108fb366107b0565b61014083015261090a366107db565b61016083015261091936610806565b610180830152610444356101a0830152610464356101c0830152610484356101e08301526104a4356102008301526104c4356102208301526104e4356102408301526105043561026083015261052435610280830152610544356102a0830152610564356102c08301526114f8565b005b91909160e0806101008301946001600160401b03808251168552602082015116602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b3461023257600036600319011261023257610a01611713565b50610a67604051610a118161039d565b6006546001600160401b0390818116835260401c166020820152600754604082015260085460608201526009546080820152600a5460a0820152600b5460c0820152600c5460e08201526040519182918261098a565b0390f35b6001600160401b03811161039857601f01601f191660200190565b60408060031936011261023257610a9b61021c565b6024356001600160401b038111610232573660238201121561023257806004013590610ac682610a6b565b91610ad3855193846103b9565b80835260209136602483830101116102325781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610c29575b50610c18579080600492610b3e611b68565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610be9575b5050610bae578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612dcd8339815191528193929303610bd0576109888383612c31565b8351632a87526960e21b81526004810191909152602490fd5b610c09929350803d10610c11575b610c0181836103b9565b810190612588565b903880610b88565b503d610bf7565b845163703e46dd60e11b8152600490fd5b905081600080516020612dcd8339815191525416141538610b2c565b34610232576000366003190112610232577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610c9e576020604051600080516020612dcd8339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610232576000366003190112610232576020600254604051908152f35b3461023257600080600319360112610d2d57610ce8611b68565b60145460ff8160a01c166000146102ed576001600160a81b0319166014557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b3461023257600080600319360112610d2d57610d4a611b68565b600080516020612dad83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b346102325760003660031901126102325760206000546001600160401b0360405191831c168152f35b34610232576000366003190112610232576020600154604051908152f35b6004359063ffffffff8216820361023257565b610104359063ffffffff8216820361023257565b610124359063ffffffff8216820361023257565b949198979693909260e0969361010087019a6001600160401b03809216885216602087015260408601526060850152608084015260a083015260c08201520152565b346102325760203660031901126102325763ffffffff610e7d610de2565b1660005260056020526040600020805490610a676001600160401b039160018101549060028101546003820154600483015491600660058501549401549460405198888a998260401c16911689610e1d565b3461023257600036600319011261023257610ee8611713565b50610a67610ef4611751565b6040519182918261098a565b34610232576020366003190112610232576040610f1e6004356117f4565b6104e382518092602080916001600160401b0381511684520151910152565b3461023257600036600319011261023257600080516020612dad833981519152546040516001600160a01b039091168152602090f35b3461023257602036600319011261023257610f8c610de2565b610f94611b68565b63ffffffff808216610e108110918215610fe6575b5050610fd4576014805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b60145460a81c16101590503880610fa9565b3461023257600036600319011261023257600d546001600160401b03610a67600e54600f5460105460115490601254926013549460405198888a998260401c16911689610e1d565b346102325761010036600319011261023257602061106561106036610593565b6118b7565b604051908152f35b3461023257600036600319011261023257604080519061108c8261037d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106110d75784604081866000838284010152601f80199101168101030190f35b85810183015185820183015282016110b5565b3461023257600036600319011261023257602060ff60145460a01c166040519015158152f35b3461023257600036600319011261023257602063ffffffff60145460a81c16604051908152f35b34610232576101603660031901126102325761115236610593565b61115a610df5565b90611163610e09565b61116b610237565b90600080516020612ded83398151915254936001600160401b0360ff8660401c161595168015908161127b575b6001149081611271575b159081611268575b5061125657600080516020612ded833981519152805467ffffffffffffffff191660011790556111de9385611231576118ff565b6111e457005b600080516020612ded833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102e8565b600080516020612ded833981519152805460ff60401b1916600160401b1790556118ff565b60405163f92ee8a960e01b8152600490fd5b905015386111aa565b303b1591506111a2565b869150611198565b34610232576000366003190112610232576020600454604051908152f35b34610232576000366003190112610232576006546001600160401b03610a67600754600854600954600a5490600b5492600c549460405198888a998260401c16911689610e1d565b346102325760403660031901126102325760043560165443821180156113e4575b6113715760009161131c6000926117d8565b9161133e6113326015546001600160401b031690565b6001600160401b031690565b925b8115611383575b509091501561137157611360610a6792602435926117e7565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b826113a161133261139384610327565b50546001600160401b031690565b11156113ca575b600281106113c5578381146113c5576113c090611ae7565b611340565b611347565b93505060016113de61133261139386610327565b936113a8565b506003811061130a565b3461023257600036600319011261023257602063ffffffff60005416604051908152f35b346102325760203660031901126102325761098861142e61021c565b611436611b68565b611af4565b34610232576000366003190112610232576020601654604051908152f35b634e487b7160e01b600052601160045260246000fd5b9190916001600160401b038080941691160291821691820361148d57565b611459565b60e0906001600160401b03815116600d549067ffffffffffffffff60401b602084015160401b16916001600160801b0319161717600d556040810151600e556060810151600f55608081015160105560a081015160115560c08101516012550151601355565b9060145460ff8160a01c1690816116ff575b506116ed5781516001600160401b0316906115366113326115296117ab565b516001600160401b031690565b6001600160401b03809316118015906116b6575b6116a45781906115686000548363ffffffff82169160201c1661146f565b600d5460401c6001600160401b031683821694859116149384159081611684575b506116615750906116037fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae69260408601946115c48651611ba1565b6115d16060880151611ba1565b6115de6080880151611ba1565b6115eb60a0880151611ba1565b6115f860c0880151611ba1565b611654575b85612197565b61160c84611492565b61161b8482421683431661243f565b611640602061163186516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b61165c611c0f565b6115fd565b60405163036466bf60e31b81526001600160401b03919091166004820152602490fd5b905061169d61133260208801516001600160401b031690565b1138611589565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b0316826116e461133260206116d66117ab565b01516001600160401b031690565b9116111561154a565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861150a565b604051906117208261039d565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b6040519061175e8261039d565b81600d546001600160401b0390818116835260401c166020820152600e546040820152600f546060820152601054608082015260115460a082015260125460c082015260e0601354910152565b6117b3611713565b506117bc611751565b90565b604051906117cc8261037d565b60006020838281520152565b60001981019190821161148d57565b9190820391821161148d57565b6117fc6117bf565b506016549061181261180d836117d8565b610327565b509061182c6113326001809401546001600160401b031690565b8110156118a5576118486113326015546001600160401b031690565b83811061186a57505050600161186361180d6117bc936117d8565b5001610448565b8161188a6113328561187b85610327565b5001546001600160401b031690565b11611896578201611848565b6117bc93506118639150610327565b604051631856a49960e21b8152600490fd5b60808101519060c060a082015191015160405191602083019384526040830152606082015260608152608081018181106001600160401b038211176103985760405251902090565b91926119159061190d612cd8565b611436612cd8565b61191d612cd8565b6001600160401b03908161193884516001600160401b031690565b1615801590611ac8575b8015611abc575b8015611ab0575b8015611aa4575b8015611a98575b8015611a8a575b611a785761040793611a17611a3c926119de8660e0906001600160401b038151166006549067ffffffffffffffff60401b602084015160401b16916001600160801b031916171760065560408101516007556060810151600855608081015160095560a0810151600a5560c0810151600b550151600c55565b6119e786611492565b611a016bffffffffffffffff000000001960005416600055565b63ffffffff1663ffffffff196000541617600055565b6014805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b611a6d611a48836118b7565b611a5181600155565b611a6860e085015191611a6383600255565b600355565b600455565b80421690431661243f565b6040516350dd03f760e11b8152600490fd5b5063ffffffff811615611965565b5060e08301511561195e565b5060c083015115611957565b5060a083015115611950565b50608083015115611949565b50611ae061133260208501516001600160401b031690565b1515611942565b801561148d576000190190565b6001600160a01b03908116908115611b4f57600080516020612dad83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612dad833981519152546001600160a01b03163303611b8957565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611bca57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b611c1a611060611751565b6003546001556003556004546002556013546004556000546001600160401b036001818360201c16019080821161148d577fdb3558259e039d7e50e816b9dcce30fb114d8a9c86eca5ab14b60194d6945d3f926bffffffffffffffff00000000602093841b16906bffffffffffffffff00000000191617908160005560405191831c168152a1565b6040519061012082018281106001600160401b038211176103985760405260088252610100366020840137565b8051156103625760200190565b8051600110156103625760400190565b8051600210156103625760600190565b8051600310156103625760800190565b8051600410156103625760a00190565b8051600510156103625760c00190565b8051600610156103625760e00190565b805160071015610362576101000190565b90816020910312610232575180151581036102325790565b90815180825260208080930193019160005b828110611d85575050505090565b835185529381019392810192600101611d77565b61046090611db283825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611e10610100928386019060208091805184520151910152565b60a081015191611e30610140938487019060208091805184520151910152565b60c082015192611e50610180948588019060208091805184520151910152565b60e083015191611e706101c0938489019060208091805184520151910152565b830151611e8d610200918289019060208091805184520151910152565b61012084015191611eae61024093848a019060208091805184520151910152565b84015192611ecc61028094858a019060208091805184520151910152565b611f0761016086015196611ef06102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b939290612183610407936104e0926121746102606109609280518b52602081015160208c0152611fb0604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c015261215e8b611ffc60a08401516101008093019060208091805184520151910152565b61212f8d6103c060c0860151612022610140918285019060208091805184520151910152565b61210260e088015195612045610180978887019060208091805184520151910152565b8801516120626101c0918287019060208091805184520151910152565b6120d36101208a015193612086610200958689019060208091805184520151910152565b8a0151976120a4610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611d65565b940190611d99565b6040513d6000823e3d90fd5b6020906121a26126a3565b60606121ac611ca2565b926002546121b985611ccf565b526121ce61133282516001600160401b031690565b6121d785611cdc565b526121ee611332868301516001600160401b031690565b6121f785611cec565b52604081015161220685611cfc565b52015161221283611d0c565b5260105461221f83611d1c565b5260115461222c83611d2c565b5260125461223983611d3c565b526122586040519485938493630c76545d60e21b855260048501611f6e565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af49081156122c95760009161229a575b501561228857565b6040516309bde33960e01b8152600490fd5b6122bc915060203d6020116122c2575b6122b481836103b9565b810190611d4d565b38612280565b503d6122aa565b61218b565b6001600160401b03918216908216039190821161148d57565b906122fe5760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b0380911690811461148d5760010190565b601654600160401b81101561039857600181018060165581101561036257602060037fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428b92601660005202926124386040857fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428901926001600160401b03936123cc8583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428a8601906001600160401b03166001600160401b0319825416179055565b0151910155565b90916124ae610407936016548015159081612514575b506124b8575b604061247160208501516001600160401b031690565b93015161248e61247f6103fa565b6001600160401b039095168552565b602084015261249e61247f610409565b6001600160401b03166020840152565b604082015261232c565b6124d66124d061180d6015546001600160401b031690565b906122e7565b61250f6124f36124ee6015546001600160401b031690565b612314565b6001600160401b03166001600160401b03196015541617601555565b61245b565b612557915061252861180d612539926117d8565b505460401c6001600160401b031690565b61255161252861180d6015546001600160401b031690565b906122ce565b6001600160401b0361257e61257560145463ffffffff9060a81c1690565b63ffffffff1690565b9116101538612455565b90816020910312610232575190565b61259f610428565b9060008252600060208301526125b36117bf565b60408301526125c06117bf565b60608301526125cd6117bf565b60808301526125da6117bf565b60a08301526125e76117bf565b60c08301526125f46117bf565b60e08301526126016117bf565b61010083015261260f6117bf565b61012083015261261d6117bf565b61014083015261262b6117bf565b6101608301526126396117bf565b6101808301526126476117bf565b6101a08301526126556117bf565b6101c08301526126636117bf565b6101e08301526126716117bf565b61020083015261267f6117bf565b61022083015261268d6117bf565b61024083015261269b6117bf565b610260830152565b6126ab612597565b906210000082527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d560206008818501527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c81604086017f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b338151525101527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e97081606086017f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db8151525101527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d81608086017f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b998151525101527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df600938160a086017f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a58066258151525101527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde288160c086017f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a98151525101527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc038160e086017f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b596938151525101527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad8161010086017f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e78151525101527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea170318161012086017f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e48151525101527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db70368161014086017f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae72488151525101527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e84158161016086017f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e56198151525101527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a38161018086017f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc88151525101527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c816101a086017f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc8151525101527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd5816101c086017f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b408151525101527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd3816101e086017f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc58151525101527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc8161020086017f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa48151525101527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e8161022086017f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a297822268151525101527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd48161024086017f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab261423981515251015261026084017f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82815152510152565b90813b15612cb757600080516020612dcd83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612c9c57612c9991612d07565b50565b505034612ca557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612ded8339815191525460401c1615612cf557565b604051631afcd79f60e31b8152600490fd5b6000806117bc93602081519101845af43d15612d45573d91612d2883610a6b565b92612d3660405194856103b9565b83523d6000602085013e612d49565b6060915b90612d705750805115612d5e57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612da3575b612d81575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612d7956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/src/light_client.rs b/contract-bindings/src/light_client.rs index 740f7bbd0..16ed3018a 100644 --- a/contract-bindings/src/light_client.rs +++ b/contract-bindings/src/light_client.rs @@ -109,6 +109,73 @@ pub mod light_client { state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("finalizedState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("finalizedState"), + inputs: ::std::vec![], + 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("frozenStakeTableCommitment"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -141,6 +208,73 @@ pub mod light_client { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), + ( + ::std::borrow::ToOwned::to_owned("genesisState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("genesisState"), + inputs: ::std::vec![], + 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("getFinalizedState"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -1163,6 +1297,26 @@ pub mod light_client { .method_hash([105, 204, 106, 4], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `finalizedState` (0x9fdb54a7) function + pub fn finalized_state( + &self, + ) -> ::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([159, 219, 84, 167], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `frozenStakeTableCommitment` (0x382b215a) function pub fn frozen_stake_table_commitment( &self, @@ -1179,6 +1333,26 @@ pub mod light_client { .method_hash([202, 111, 232, 85], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `genesisState` (0xd24d933d) function + pub fn genesis_state( + &self, + ) -> ::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([210, 77, 147, 61], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `getFinalizedState` (0x82d07ff3) function pub fn get_finalized_state( &self, @@ -2581,6 +2755,21 @@ pub mod light_client { abi = "disablePermissionedProverMode()" )] pub struct DisablePermissionedProverModeCall; + ///Container type for all input parameters for the `finalizedState` function with signature `finalizedState()` and selector `0x9fdb54a7` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "finalizedState", abi = "finalizedState()")] + pub struct FinalizedStateCall; ///Container type for all input parameters for the `frozenStakeTableCommitment` function with signature `frozenStakeTableCommitment()` and selector `0x382b215a` #[derive( Clone, @@ -2614,6 +2803,21 @@ pub mod light_client { )] #[ethcall(name = "frozenThreshold", abi = "frozenThreshold()")] pub struct FrozenThresholdCall; + ///Container type for all input parameters for the `genesisState` function with signature `genesisState()` and selector `0xd24d933d` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "genesisState", abi = "genesisState()")] + pub struct GenesisStateCall; ///Container type for all input parameters for the `getFinalizedState` function with signature `getFinalizedState()` and selector `0x82d07ff3` #[derive( Clone, @@ -3010,8 +3214,10 @@ pub mod light_client { ComputeStakeTableComm(ComputeStakeTableCommCall), CurrentEpoch(CurrentEpochCall), DisablePermissionedProverMode(DisablePermissionedProverModeCall), + FinalizedState(FinalizedStateCall), FrozenStakeTableCommitment(FrozenStakeTableCommitmentCall), FrozenThreshold(FrozenThresholdCall), + GenesisState(GenesisStateCall), GetFinalizedState(GetFinalizedStateCall), GetGenesisState(GetGenesisStateCall), GetHotShotCommitment(GetHotShotCommitmentCall), @@ -3065,6 +3271,11 @@ pub mod light_client { { return Ok(Self::DisablePermissionedProverMode(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::FinalizedState(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -3075,6 +3286,10 @@ pub mod light_client { { return Ok(Self::FrozenThreshold(decoded)); } + if let Ok(decoded) = ::decode(data) + { + return Ok(Self::GenesisState(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -3198,10 +3413,12 @@ pub mod light_client { Self::DisablePermissionedProverMode(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::FinalizedState(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::GenesisState(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::GetHotShotCommitment(element) => { @@ -3260,8 +3477,10 @@ pub mod light_client { Self::DisablePermissionedProverMode(element) => { ::core::fmt::Display::fmt(element, f) } + Self::FinalizedState(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::GenesisState(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::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f), @@ -3315,6 +3534,11 @@ pub mod light_client { Self::DisablePermissionedProverMode(value) } } + impl ::core::convert::From for LightClientCalls { + fn from(value: FinalizedStateCall) -> Self { + Self::FinalizedState(value) + } + } impl ::core::convert::From for LightClientCalls { fn from(value: FrozenStakeTableCommitmentCall) -> Self { Self::FrozenStakeTableCommitment(value) @@ -3325,6 +3549,11 @@ pub mod light_client { Self::FrozenThreshold(value) } } + impl ::core::convert::From for LightClientCalls { + fn from(value: GenesisStateCall) -> Self { + Self::GenesisState(value) + } + } impl ::core::convert::From for LightClientCalls { fn from(value: GetFinalizedStateCall) -> Self { Self::GetFinalizedState(value) @@ -3496,6 +3725,29 @@ pub mod light_client { Hash, )] pub struct CurrentEpochReturn(pub u64); + ///Container type for all return fields from the `finalizedState` function with signature `finalizedState()` and selector `0x9fdb54a7` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct FinalizedStateReturn { + 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 `frozenStakeTableCommitment` function with signature `frozenStakeTableCommitment()` and selector `0x382b215a` #[derive( Clone, @@ -3524,6 +3776,29 @@ pub mod light_client { Hash, )] pub struct FrozenThresholdReturn(pub ::ethers::core::types::U256); + ///Container type for all return fields from the `genesisState` function with signature `genesisState()` and selector `0xd24d933d` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct GenesisStateReturn { + 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 `getFinalizedState` function with signature `getFinalizedState()` and selector `0x82d07ff3` #[derive( Clone, diff --git a/contract-bindings/src/light_client_mock.rs b/contract-bindings/src/light_client_mock.rs index 9eed4bbe8..440b450b8 100644 --- a/contract-bindings/src/light_client_mock.rs +++ b/contract-bindings/src/light_client_mock.rs @@ -140,6 +140,73 @@ pub mod light_client_mock { state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("finalizedState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("finalizedState"), + inputs: ::std::vec![], + 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("frozenStakeTableCommitment"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -172,6 +239,73 @@ pub mod light_client_mock { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), + ( + ::std::borrow::ToOwned::to_owned("genesisState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("genesisState"), + inputs: ::std::vec![], + 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("getFinalizedState"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -1292,6 +1426,26 @@ pub mod light_client_mock { .method_hash([105, 204, 106, 4], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `finalizedState` (0x9fdb54a7) function + pub fn finalized_state( + &self, + ) -> ::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([159, 219, 84, 167], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `frozenStakeTableCommitment` (0x382b215a) function pub fn frozen_stake_table_commitment( &self, @@ -1308,6 +1462,26 @@ pub mod light_client_mock { .method_hash([202, 111, 232, 85], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `genesisState` (0xd24d933d) function + pub fn genesis_state( + &self, + ) -> ::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([210, 77, 147, 61], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `getFinalizedState` (0x82d07ff3) function pub fn get_finalized_state( &self, @@ -2756,6 +2930,21 @@ pub mod light_client_mock { abi = "disablePermissionedProverMode()" )] pub struct DisablePermissionedProverModeCall; + ///Container type for all input parameters for the `finalizedState` function with signature `finalizedState()` and selector `0x9fdb54a7` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "finalizedState", abi = "finalizedState()")] + pub struct FinalizedStateCall; ///Container type for all input parameters for the `frozenStakeTableCommitment` function with signature `frozenStakeTableCommitment()` and selector `0x382b215a` #[derive( Clone, @@ -2789,6 +2978,21 @@ pub mod light_client_mock { )] #[ethcall(name = "frozenThreshold", abi = "frozenThreshold()")] pub struct FrozenThresholdCall; + ///Container type for all input parameters for the `genesisState` function with signature `genesisState()` and selector `0xd24d933d` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "genesisState", abi = "genesisState()")] + pub struct GenesisStateCall; ///Container type for all input parameters for the `getFinalizedState` function with signature `getFinalizedState()` and selector `0x82d07ff3` #[derive( Clone, @@ -3274,8 +3478,10 @@ pub mod light_client_mock { ComputeStakeTableComm(ComputeStakeTableCommCall), CurrentEpoch(CurrentEpochCall), DisablePermissionedProverMode(DisablePermissionedProverModeCall), + FinalizedState(FinalizedStateCall), FrozenStakeTableCommitment(FrozenStakeTableCommitmentCall), FrozenThreshold(FrozenThresholdCall), + GenesisState(GenesisStateCall), GetFinalizedState(GetFinalizedStateCall), GetGenesisState(GetGenesisStateCall), GetHotShotCommitment(GetHotShotCommitmentCall), @@ -3334,6 +3540,11 @@ pub mod light_client_mock { { return Ok(Self::DisablePermissionedProverMode(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::FinalizedState(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -3344,6 +3555,10 @@ pub mod light_client_mock { { return Ok(Self::FrozenThreshold(decoded)); } + if let Ok(decoded) = ::decode(data) + { + return Ok(Self::GenesisState(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -3491,10 +3706,12 @@ pub mod light_client_mock { Self::DisablePermissionedProverMode(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::FinalizedState(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::GenesisState(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::GetHotShotCommitment(element) => { @@ -3560,8 +3777,10 @@ pub mod light_client_mock { Self::DisablePermissionedProverMode(element) => { ::core::fmt::Display::fmt(element, f) } + Self::FinalizedState(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::GenesisState(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::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f), @@ -3620,6 +3839,11 @@ pub mod light_client_mock { Self::DisablePermissionedProverMode(value) } } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: FinalizedStateCall) -> Self { + Self::FinalizedState(value) + } + } impl ::core::convert::From for LightClientMockCalls { fn from(value: FrozenStakeTableCommitmentCall) -> Self { Self::FrozenStakeTableCommitment(value) @@ -3630,6 +3854,11 @@ pub mod light_client_mock { Self::FrozenThreshold(value) } } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: GenesisStateCall) -> Self { + Self::GenesisState(value) + } + } impl ::core::convert::From for LightClientMockCalls { fn from(value: GetFinalizedStateCall) -> Self { Self::GetFinalizedState(value) @@ -3826,6 +4055,29 @@ pub mod light_client_mock { Hash, )] pub struct CurrentEpochReturn(pub u64); + ///Container type for all return fields from the `finalizedState` function with signature `finalizedState()` and selector `0x9fdb54a7` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct FinalizedStateReturn { + 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 `frozenStakeTableCommitment` function with signature `frozenStakeTableCommitment()` and selector `0x382b215a` #[derive( Clone, @@ -3854,6 +4106,29 @@ pub mod light_client_mock { Hash, )] pub struct FrozenThresholdReturn(pub ::ethers::core::types::U256); + ///Container type for all return fields from the `genesisState` function with signature `genesisState()` and selector `0xd24d933d` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct GenesisStateReturn { + 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 `getFinalizedState` function with signature `getFinalizedState()` and selector `0x82d07ff3` #[derive( Clone, diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol index 81f4421a3..b23e311b8 100644 --- a/contracts/src/LightClient.sol +++ b/contracts/src/LightClient.sol @@ -47,12 +47,6 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @notice number of blocks per epoch uint32 public blocksPerEpoch; - /// @notice genesis block commitment index - uint32 internal genesisState; - - /// @notice Finalized HotShot's light client state index - uint32 internal finalizedState; - // === Storage === // /// @notice current (finalized) epoch number @@ -75,6 +69,12 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @notice mapping to store light client states in order to simplify upgrades mapping(uint32 index => LightClientState value) public states; + /// @notice genesis block commitment + LightClientState public genesisState; + + /// @notice Finalized HotShot's light client state + LightClientState public finalizedState; + /// @notice the address of the prover that can call the newFinalizedState function when the /// contract is /// in permissioned prover mode. This address is address(0) when the contract is not in the @@ -191,8 +191,6 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { ) public initializer { __Ownable_init(owner); //sets owner of the contract __UUPSUpgradeable_init(); - genesisState = 0; - finalizedState = 1; _initializeState(_genesis, _blocksPerEpoch, _stateHistoryRetentionPeriod); } @@ -238,8 +236,8 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { ) { revert InvalidArgs(); } - states[genesisState] = _genesis; - states[finalizedState] = _genesis; + genesisState = _genesis; + finalizedState = _genesis; currentEpoch = 0; @@ -289,7 +287,7 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { uint64 epochEndingBlockHeight = currentEpoch * blocksPerEpoch; // TODO consider saving gas in the case BLOCKS_PER_EPOCH == type(uint32).max - bool isNewEpoch = states[finalizedState].blockHeight == epochEndingBlockHeight; + bool isNewEpoch = finalizedState.blockHeight == epochEndingBlockHeight; if (!isNewEpoch && newState.blockHeight > epochEndingBlockHeight) { revert MissingLastBlockForCurrentEpoch(epochEndingBlockHeight); } @@ -309,7 +307,7 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { verifyProof(newState, proof); // upon successful verification, update the latest finalized state - states[finalizedState] = newState; + finalizedState = newState; updateStateHistory(uint64(block.number), uint64(block.timestamp), newState); @@ -318,12 +316,12 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @dev Simple getter function for the genesis state function getGenesisState() public view virtual returns (LightClientState memory) { - return states[genesisState]; + return genesisState; } /// @dev Simple getter function for the finalized state function getFinalizedState() public view virtual returns (LightClientState memory) { - return states[finalizedState]; + return finalizedState; } /// @notice Verify the Plonk proof, marked as `virtual` for easier testing as we can swap VK @@ -341,9 +339,9 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { publicInput[2] = uint256(state.blockHeight); publicInput[3] = BN254.ScalarField.unwrap(state.blockCommRoot); publicInput[4] = BN254.ScalarField.unwrap(state.feeLedgerComm); - publicInput[5] = BN254.ScalarField.unwrap(states[finalizedState].stakeTableBlsKeyComm); - publicInput[6] = BN254.ScalarField.unwrap(states[finalizedState].stakeTableSchnorrKeyComm); - publicInput[7] = BN254.ScalarField.unwrap(states[finalizedState].stakeTableAmountComm); + publicInput[5] = BN254.ScalarField.unwrap(finalizedState.stakeTableBlsKeyComm); + publicInput[6] = BN254.ScalarField.unwrap(finalizedState.stakeTableSchnorrKeyComm); + publicInput[7] = BN254.ScalarField.unwrap(finalizedState.stakeTableAmountComm); if (!PlonkVerifier.verify(vk, publicInput, proof)) { revert InvalidProof(); @@ -353,12 +351,12 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @notice Advance to the next epoch (without any precondition check!) /// @dev This meant to be invoked only internally after appropriate precondition checks are done function _advanceEpoch() internal virtual { - bytes32 newStakeTableComm = computeStakeTableComm(states[finalizedState]); + bytes32 newStakeTableComm = computeStakeTableComm(finalizedState); votingStakeTableCommitment = frozenStakeTableCommitment; frozenStakeTableCommitment = newStakeTableComm; votingThreshold = frozenThreshold; - frozenThreshold = states[finalizedState].threshold; + frozenThreshold = finalizedState.threshold; currentEpoch += 1; emit EpochChanged(currentEpoch); diff --git a/contracts/test/LightClientV2.sol b/contracts/test/LightClientV2.sol index 75fe943aa..87c51d4ab 100644 --- a/contracts/test/LightClientV2.sol +++ b/contracts/test/LightClientV2.sol @@ -22,7 +22,7 @@ contract LightClientV2 is LightClient { } /// @notice mapping to store the extended light client states in order to simplify upgrades - mapping(uint32 index => ExtendedLightClientState state) public extendedStates; + ExtendedLightClientState public extendedFinalzedState; /// @notice Initialize v2 /// @param _newField New field amount @@ -92,16 +92,17 @@ contract LightClientV2 is LightClient { // because newState is in memory and states[finalizedState] is in storage, they have // different data handling mechanisms // and this each field needs to be assigned individually - states[finalizedState].viewNum = newState.viewNum; - states[finalizedState].blockHeight = newState.blockHeight; - states[finalizedState].blockCommRoot = newState.blockCommRoot; - states[finalizedState].feeLedgerComm = newState.feeLedgerComm; - states[finalizedState].stakeTableBlsKeyComm = newState.stakeTableBlsKeyComm; - states[finalizedState].stakeTableSchnorrKeyComm = newState.stakeTableSchnorrKeyComm; - states[finalizedState].stakeTableAmountComm = newState.stakeTableAmountComm; - states[finalizedState].threshold = newState.threshold; - - extendedStates[finalizedState].extraField = 2; + finalizedState = newState; + // states[finalizedState].viewNum = newState.viewNum; + // states[finalizedState].blockHeight = newState.blockHeight; + // states[finalizedState].blockCommRoot = newState.blockCommRoot; + // states[finalizedState].feeLedgerComm = newState.feeLedgerComm; + // states[finalizedState].stakeTableBlsKeyComm = newState.stakeTableBlsKeyComm; + // states[finalizedState].stakeTableSchnorrKeyComm = newState.stakeTableSchnorrKeyComm; + // states[finalizedState].stakeTableAmountComm = newState.stakeTableAmountComm; + // states[finalizedState].threshold = newState.threshold; + + extendedFinalzedState.extraField = 2; emit NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot); } @@ -113,6 +114,6 @@ contract LightClientV2 is LightClient { virtual returns (ExtendedLightClientState memory) { - return extendedStates[finalizedState]; + return extendedFinalzedState; } } diff --git a/contracts/test/mocks/LightClientMock.sol b/contracts/test/mocks/LightClientMock.sol index f2064bcdb..40a8d5df9 100644 --- a/contracts/test/mocks/LightClientMock.sol +++ b/contracts/test/mocks/LightClientMock.sol @@ -28,7 +28,7 @@ contract LightClientMock is LC { /// @dev Directly mutate finalizedState variable for test function setFinalizedState(LC.LightClientState memory state) public { - states[finalizedState] = state; + finalizedState = state; } /// @dev override the production-implementation with test VK. @@ -46,9 +46,9 @@ contract LightClientMock is LC { publicInput[2] = uint256(state.blockHeight); publicInput[3] = BN254.ScalarField.unwrap(state.blockCommRoot); publicInput[4] = BN254.ScalarField.unwrap(state.feeLedgerComm); - publicInput[5] = BN254.ScalarField.unwrap(states[finalizedState].stakeTableBlsKeyComm); - publicInput[6] = BN254.ScalarField.unwrap(states[finalizedState].stakeTableSchnorrKeyComm); - publicInput[7] = BN254.ScalarField.unwrap(states[finalizedState].stakeTableAmountComm); + publicInput[5] = BN254.ScalarField.unwrap(finalizedState.stakeTableBlsKeyComm); + publicInput[6] = BN254.ScalarField.unwrap(finalizedState.stakeTableSchnorrKeyComm); + publicInput[7] = BN254.ScalarField.unwrap(finalizedState.stakeTableAmountComm); if (!PlonkVerifier.verify(vk, publicInput, proof)) { revert InvalidProof(); From c70ae3e3d1466382f9271f34498b88adc0e3f1cf Mon Sep 17 00:00:00 2001 From: Alysia Huggins Date: Fri, 30 Aug 2024 13:35:23 -0400 Subject: [PATCH 02/27] created separate stake struct for the genesis state --- Cargo.lock | 50 ++-- .../artifacts/LightClientMock_bytecode.json | 2 +- .../artifacts/LightClient_bytecode.json | 2 +- contract-bindings/src/light_client.rs | 206 ++++++++++++++++- contract-bindings/src/light_client_mock.rs | 218 +++++++++++++++++- contract-bindings/src/shared_types.rs | 19 ++ contracts/rust/adapter/src/light_client.rs | 102 +++++++- contracts/rust/diff-test/src/main.rs | 1 + contracts/script/LightClient.s.sol | 29 ++- .../script/LightClientWithDefender.s.sol | 11 +- contracts/src/LightClient.sol | 33 ++- .../test/DeployLightClientTestScript.s.sol | 23 +- contracts/test/LightClient.t.sol | 25 +- contracts/test/mocks/LightClientMock.sol | 8 +- hotshot-state-prover/src/service.rs | 27 ++- 15 files changed, 690 insertions(+), 66 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c9eefc113..f9cfdf8b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -356,7 +356,7 @@ dependencies = [ "num-traits", "paste", "rayon", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "zeroize", ] @@ -727,7 +727,7 @@ dependencies = [ "futures-lite 2.3.0", "parking", "polling 3.7.3", - "rustix 0.38.34", + "rustix 0.38.35", "slab", "tracing", "windows-sys 0.59.0", @@ -795,7 +795,7 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.34", + "rustix 0.38.35", "windows-sys 0.48.0", ] @@ -811,7 +811,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.34", + "rustix 0.38.35", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -950,7 +950,7 @@ checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" dependencies = [ "futures", "pharos", - "rustc_version 0.4.0", + "rustc_version 0.4.1", ] [[package]] @@ -2301,7 +2301,7 @@ dependencies = [ "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "subtle", "zeroize", ] @@ -2505,18 +2505,18 @@ dependencies = [ [[package]] name = "derive_builder" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0350b5cb0331628a5916d6c5c0b72e97393b8b6b03b47a9284f4e7f5a405ffd7" +checksum = "cd33f37ee6a119146a1781d3356a7c26028f83d779b2e04ecd45fdc75c76877b" dependencies = [ "derive_builder_macro", ] [[package]] name = "derive_builder_core" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48cda787f839151732d396ac69e3473923d54312c070ee21e9effcaa8ca0b1d" +checksum = "7431fa049613920234f22c47fdc33e6cf3ee83067091ea4277a3f8c4587aae38" dependencies = [ "darling", "proc-macro2", @@ -2526,9 +2526,9 @@ dependencies = [ [[package]] name = "derive_builder_macro" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" +checksum = "4abae7035bf79b9877b779505d8cf3749285b80c43941eda66604841889451dc" dependencies = [ "derive_builder_core", "syn 2.0.76", @@ -2543,7 +2543,7 @@ dependencies = [ "convert_case 0.4.0", "proc-macro2", "quote", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "syn 2.0.76", ] @@ -6057,9 +6057,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "local-ip-address" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136ef34e18462b17bf39a7826f8f3bbc223341f8e83822beb8b77db9a3d49696" +checksum = "b435d7dd476416a905f9634dff8c330cee8d3168fdd1fbd472a17d1a75c00c3e" dependencies = [ "libc", "neli", @@ -7110,7 +7110,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" dependencies = [ "futures", - "rustc_version 0.4.0", + "rustc_version 0.4.1", ] [[package]] @@ -7272,7 +7272,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite 0.2.14", - "rustix 0.38.34", + "rustix 0.38.35", "tracing", "windows-sys 0.59.0", ] @@ -8258,9 +8258,9 @@ dependencies = [ [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver 1.0.23", ] @@ -8290,9 +8290,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" dependencies = [ "bitflags 2.6.0", "errno", @@ -9775,7 +9775,7 @@ dependencies = [ "cfg-if", "fastrand 2.1.1", "once_cell", - "rustix 0.38.34", + "rustix 0.38.35", "windows-sys 0.59.0", ] @@ -10019,9 +10019,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.3" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes 1.7.1", @@ -11213,7 +11213,7 @@ dependencies = [ "js-sys", "log", "pharos", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "send_wrapper 0.6.0", "thiserror", "wasm-bindgen", diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json index 858672f33..01f2f73bc 100644 --- a/contract-bindings/artifacts/LightClientMock_bytecode.json +++ b/contract-bindings/artifacts/LightClientMock_bytecode.json @@ -1 +1 @@ -"0x60a034620004f657601f6200343838819003918201601f1916830192916001600160401b039190828511848610176200044857808492604096875283398101036101208112620004f657610100809112620004f657835181810181811084821117620004485785526200007284620004fb565b81526200008260208501620004fb565b916020820192835285850151928683019384526060860151926060810193845260808701516080820190815260a08801519060a0830191825260c08901519460c0840195865260e08a01519960e085019a8b5201519063ffffffff938483168303620004f657306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054808e1c60ff16620004e557808c8080931603620004a4575b50825116158015915062000497575b80156200048d575b801562000483575b801562000479575b80156200046f575b6200045e57918b96959493918a8c945116906005549968010000000000000000600160801b03809a8951901b16808460018060801b0319809e1617176005558c51918260065551928360075551958660085551998a600955519687600a55519384600b558c600c54161717600c55600d55600e5582600f5586601055836011556012556013549063ffffffff60a81b9060a81b169063ffffffff60a81b19161791826013558b5195602087019283528c87015260608601526060855260808501948086108a871117620004485789958c52519020600099818b55519081600155600255600355601554918215159283620003d9575b50505062000361575b5116925186519387850185811087821117620003395788528452602084015285519160608301838110868211176200034d578752844316835260208301928542168452878101948552601554680100000000000000008110156200033957806001620002c4920160155562000510565b9790976200032557505186549351939091169085161791861b161783555180516001840180546001600160401b0319169190931617909155602001516002919091015551612ef19081620005478239608051818181610d360152610e8e0152f35b634e487b7160e01b81526004819052602490fd5b634e487b7160e01b88526041600452602488fd5b634e487b7160e01b87526041600452602487fd5b9062000371906014541662000510565b620003c557600281888093558260018201550155601454858116868114620003b15760010186166001600160401b03199190911617601455849062000254565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b87526004879052602487fd5b91939450915060001981019081116200043457620003f8889162000510565b50548a1c16876200040d816014541662000510565b50548b1c16900391878311620004345787939291849160a81c16911610153880806200024b565b634e487b7160e01b89526011600452602489fd5b634e487b7160e01b600052604160045260246000fd5b8b516350dd03f760e11b8152600490fd5b508a511562000156565b508651156200014e565b5083511562000146565b508151156200013e565b5089865116151562000136565b6001600160401b0319161790558b518a81527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388a8162000127565b8d5163f92ee8a960e01b8152600490fd5b600080fd5b51906001600160401b0382168203620004f657565b601554811015620005305760156000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461023757806302b592f3146102325780630d8e6e2c1461022d578063202a0adb146102285780632d52aad6146102235780632f5f46001461021e5780632f79889d14610219578063313df7b114610214578063382b215a1461020f578063409939b71461020a5780634847ae5d146102055780634f1ef2861461020057806352d1902d146101fb57806362827733146101f657806369cc6a04146101f1578063715018a6146101ec57806376b6b7cb146101e75780637f17baad146101e257806382d07ff3146101dd5780638584d23f146101d85780638da5cb5b146101d357806396c1ca61146101ce5780639fdb54a7146101c9578063a244d596146101c4578063aa922732146101bf578063ad3cb1cc146101ba578063bd32519a146101b5578063c23b9e9e146101b0578063c8e5e498146101ab578063ca6fe855146101a6578063d24d933d146101a1578063e03033011461019c578063f2fde38b146101975763f9e50d191461019257600080fd5b61164f565b611626565b6114f6565b6114ae565b611490565b611473565b61144c565b611426565b6113a9565b61137c565b611239565b6111f1565b61116c565b611136565b6110f9565b6110c8565b611058565b610fd1565b610f66565b610f04565b610ee6565b610e7b565b610cbc565b610c1e565b610a69565b61081c565b6107f3565b6107cc565b6106e2565b6106a5565b6105d1565b61050e565b610498565b61026e565b600435906001600160a01b038216820361025257565b600080fd5b61012435906001600160a01b038216820361025257565b346102525760203660031901126102525761028761023c565b61028f611e85565b6001600160a01b0390811690811561031f57601354908116821461030d5760ff60a01b19919091166001600160a81b03199190911617600160a01b1760138190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b601554811015610382576003906015600052027f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750190600090565b610331565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b038211176103b857604052565b610387565b61010081019081106001600160401b038211176103b857604052565b606081019081106001600160401b038211176103b857604052565b90601f801991011681019081106001600160401b038211176103b857604052565b604051906102e082018281106001600160401b038211176103b857604052565b604051906104428261039d565b565b60405190610442826103d9565b6040519061028082018281106001600160401b038211176103b857604052565b9060405161047e8161039d565b6020600182946001600160401b0381541684520154910152565b3461025257602036600319011261025257600435601554811015610252576104c1608091610347565b5061050c8154916104dc60016001600160401b039201610471565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610252576000366003190112610252576060604051600181526000602082015260006040820152f35b602435906001600160401b038216820361025257565b35906001600160401b038216820361025257565b610100906003190112610252576040519061057c826103bd565b816004356001600160401b038116810361025257815261059a610538565b602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e060e435910152565b3461025257610100366003190112610252576106a360e06105f136610562565b61061b6001600160401b038251166001600160401b03166001600160401b0319600c541617600c55565b61065b61063260208301516001600160401b031690565b67ffffffffffffffff60401b600c549160401b169067ffffffffffffffff60401b191617600c55565b6106686040820151600d55565b6106756060820151600e55565b6106826080820151600f55565b61068f60a0820151601055565b61069c60c0820151601155565b0151601255565b005b34610252576020366003190112610252576016805460ff19166001179055600435601755005b6001600160401b0381116103b85760051b60200190565b346102525760208060031936011261025257600435906001600160401b038211610252573660238301121561025257816004013591610720836106cb565b91604093610730855194856103f4565b80845260248285019160071b8401019236841161025257602401905b83821061075c576106a385611856565b813603608081126102525786805191610774836103d9565b61077d8561054e565b835261078a86860161054e565b83870152603f19011261025257608091849188516107a78161039d565b6107b28a870161054e565b81526060860135848201528982015281520191019061074c565b346102525760003660031901126102525760206001600160401b0360145416604051908152f35b34610252576000366003190112610252576013546040516001600160a01b039091168152602090f35b34610252576000366003190112610252576020600254604051908152f35b60409061010319011261025257604051906108548261039d565b610104358252610124356020830152565b604090610143190112610252576040519061087f8261039d565b610144358252610164356020830152565b60409061018319011261025257604051906108aa8261039d565b6101843582526101a4356020830152565b6040906101c319011261025257604051906108d58261039d565b6101c43582526101e4356020830152565b60409061020319011261025257604051906109008261039d565b610204358252610224356020830152565b604090610243190112610252576040519061092b8261039d565b610244358252610264356020830152565b60409061028319011261025257604051906109568261039d565b6102843582526102a4356020830152565b6040906102c319011261025257604051906109818261039d565b6102c43582526102e4356020830152565b60409061030319011261025257604051906109ac8261039d565b610304358252610324356020830152565b60409061034319011261025257604051906109d78261039d565b610344358252610364356020830152565b6040906103831901126102525760405190610a028261039d565b6103843582526103a4356020830152565b6040906103c31901126102525760405190610a2d8261039d565b6103c43582526103e4356020830152565b6040906104031901126102525760405190610a588261039d565b610404358252610424356020830152565b346102525761058036600319011261025257610a8436610562565b61048036610103190112610252576106a390610a9e610415565b90610aa83661083a565b8252610ab336610865565b6020830152610ac136610890565b6040830152610acf366108bb565b6060830152610add366108e6565b6080830152610aeb36610911565b60a0830152610af93661093c565b60c0830152610b0736610967565b60e0830152610b1536610992565b610100830152610b24366109bd565b610120830152610b33366109e8565b610140830152610b4236610a13565b610160830152610b5136610a3e565b610180830152610444356101a0830152610464356101c0830152610484356101e08301526104a4356102008301526104c4356102208301526104e4356102408301526105043561026083015261052435610280830152610544356102a0830152610564356102c0830152611900565b91909160e0806101008301946001600160401b03808251168552602082015116602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b3461025257600036600319011261025257610c37611a83565b50610c9d604051610c47816103bd565b6005546001600160401b0390818116835260401c16602082015260065460408201526007546060820152600854608082015260095460a0820152600a5460c0820152600b5460e082015260405191829182610bc0565b0390f35b6001600160401b0381116103b857601f01601f191660200190565b60408060031936011261025257610cd161023c565b6024356001600160401b038111610252573660238201121561025257806004013590610cfc82610ca1565b91610d09855193846103f4565b80835260209136602483830101116102525781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610e5f575b50610e4e579080600492610d74611e85565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610e1f575b5050610de4578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612ea58339815191528193929303610e06576106a38383612d09565b8351632a87526960e21b81526004810191909152602490fd5b610e3f929350803d10610e47575b610e3781836103f4565b810190612654565b903880610dbe565b503d610e2d565b845163703e46dd60e11b8152600490fd5b905081600080516020612ea58339815191525416141538610d62565b34610252576000366003190112610252577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610ed4576020604051600080516020612ea58339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610252576000366003190112610252576020600154604051908152f35b3461025257600080600319360112610f6357610f1e611e85565b60135460ff8160a01c1660001461030d576001600160a81b0319166013557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b3461025257600080600319360112610f6357610f80611e85565b600080516020612e8583398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610252576000366003190112610252576020600054604051908152f35b6004359063ffffffff8216820361025257565b610104359063ffffffff8216820361025257565b949198979693909260e0969361010087019a6001600160401b03809216885216602087015260408601526060850152608084015260a083015260c08201520152565b346102525760203660031901126102525763ffffffff611076610fef565b1660005260046020526040600020805490610c9d6001600160401b039160018101549060028101546003820154600483015491600660058501549401549460405198888a998260401c16911689611016565b34610252576000366003190112610252576110e1611a83565b50610c9d6110ed611ac1565b60405191829182610bc0565b34610252576020366003190112610252576040611117600435611b64565b61050c82518092602080916001600160401b0381511684520151910152565b3461025257600036600319011261025257600080516020612e85833981519152546040516001600160a01b039091168152602090f35b3461025257602036600319011261025257611185610fef565b61118d611e85565b63ffffffff808216610e1081109182156111df575b50506111cd576013805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b60135460a81c161015905038806111a2565b3461025257600036600319011261025257600c546001600160401b03610c9d600d54600e54600f5460105490601154926012549460405198888a998260401c16911689611016565b34610252576101403660031901126102525761125436610562565b61125c611002565b90611265610257565b600080516020612ec583398151915254926001600160401b0360ff8560401c1615941680159081611374575b600114908161136a575b159081611361575b5061134f57600080516020612ec5833981519152805467ffffffffffffffff191660011790556112d7928461132a57611c27565b6112dd57005b600080516020612ec5833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2908060208101610308565b600080516020612ec5833981519152805460ff60401b1916600160401b179055611c27565b60405163f92ee8a960e01b8152600490fd5b905015386112a3565b303b15915061129b565b859150611291565b34610252576101003660031901126102525760206113a161139c36610562565b611dc9565b604051908152f35b346102525760003660031901126102525760408051906113c88261039d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106114135784604081866000838284010152601f80199101168101030190f35b85810183015185820183015282016113f1565b3461025257600036600319011261025257602060ff60135460a01c166040519015158152f35b3461025257600036600319011261025257602063ffffffff60135460a81c16604051908152f35b34610252576000366003190112610252576016805460ff19169055005b34610252576000366003190112610252576020600354604051908152f35b34610252576000366003190112610252576005546001600160401b03610c9d60065460075460085460095490600a5492600b549460405198888a998260401c16911689611016565b34610252576040366003190112610252576004356024359060ff60165416600090600014611544575090611530610c9d9260175490611b57565b115b60405190151581529081906020820190565b9160155491438111801561161c575b6115a9576115618493611b48565b926115836115776014546001600160401b031690565b6001600160401b031690565b935b81156115bb575b5090919250156115a957610c9d926115a391611b57565b11611532565b60405163b0b4387760e01b8152600490fd5b826115d96115776115cb84610347565b50546001600160401b031690565b1115611602575b600281106115fd578481146115fd576115f890612663565b611585565b61158c565b94505060016116166115776115cb87610347565b946115e0565b5060038310611553565b34610252576020366003190112610252576106a361164261023c565b61164a611e85565b611e11565b34610252576000366003190112610252576020601554604051908152f35b634e487b7160e01b600052600060045260246000fd5b60e0906116d56001600160401b03808351166001600160401b0319600c541617600c5560208301511667ffffffffffffffff60401b600c549160401b169067ffffffffffffffff60401b191617600c55565b6040810151600d556060810151600e556080810151600f5560a081015160105560c08101516011550151601255565b634e487b7160e01b600052601160045260246000fd5b906117315760028160008093558260018201550155565b61166d565b8051156103825760200190565b8051600110156103825760400190565b8051600210156103825760600190565b8051600310156103825760800190565b8051600410156103825760a00190565b8051600510156103825760c00190565b8051600610156103825760e00190565b805160071015610382576101000190565b80518210156103825760209160051b010190565b601554600160401b8110156103b8578060016117e79201601555610347565b91909161173157805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b90601554600060155580611893575b5060005b825181101561188e5780611888611882600193866117b4565b516117c8565b01611869565b509050565b600390806003029060038204036118fb5760156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475908101905b8181106118dd575050611865565b806118f5849260026000918281558260018201550155565b016118cf565b611704565b9060135460ff8160a01c169081611a6f575b50611a5d5781516001600160401b031661193d611577611930611b1b565b516001600160401b031690565b6001600160401b0380921611801590611a26575b611a14577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906119c360408501936119898551611ebe565b6119966060870151611ebe565b6119a36080870151611ebe565b6119b060a0870151611ebe565b6119bd60c0870151611ebe565b856123a3565b6119cc84611683565b6119db8482421683431661250b565b611a0060206119f186516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b031681611a546115776020611a46611b1b565b01516001600160401b031690565b91161115611951565b6040516301474c8f60e71b8152600490fd5b6001600160a01b0316331415905038611912565b60405190611a90826103bd565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b60405190611ace826103bd565b81600c546001600160401b0390818116835260401c166020820152600d546040820152600e546060820152600f54608082015260105460a082015260115460c082015260e0601254910152565b611b23611a83565b50611b2c611ac1565b90565b60405190611b3c8261039d565b60006020838281520152565b6000198101919082116118fb57565b919082039182116118fb57565b611b6c611b2f565b5060155490611b82611b7d83611b48565b610347565b5090611b9c6115776001809401546001600160401b031690565b811015611c1557611bb86115776014546001600160401b031690565b838110611bda575050506001611bd3611b7d611b2c93611b48565b5001610471565b81611bfa61157785611beb85610347565b5001546001600160401b031690565b11611c06578201611bb8565b611b2c9350611bd39150610347565b604051631856a49960e21b8152600490fd5b9091611c3d90611c35612db0565b61164a612db0565b611c45612db0565b6001600160401b0380611c5f83516001600160401b031690565b1615801590611daa575b8015611d9e575b8015611d92575b8015611d86575b8015611d7a575b611d6857611d3161044293611d038460e0906001600160401b038151166005549067ffffffffffffffff60401b602084015160401b16916fffffffffffffffffffffffffffffffff1916171760055560408101516006556060810151600755608081015160085560a081015160095560c0810151600a550151600b55565b611d0c84611683565b6013805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b611d5d611d3d83611dc9565b80600055611d5860e085015191611d5383600155565b600255565b600355565b80421690431661250b565b6040516350dd03f760e11b8152600490fd5b5060e082015115611c85565b5060c082015115611c7e565b5060a082015115611c77565b50608082015115611c70565b50611dc261157760208401516001600160401b031690565b1515611c69565b60808101519060c060a082015191015160405191602083019384526040830152606082015260608152608081018181106001600160401b038211176103b85760405251902090565b6001600160a01b03908116908115611e6c57600080516020612e8583398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612e85833981519152546001600160a01b03163303611ea657565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611ee757565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103b85760405260088252610100366020840137565b90816020910312610252575180151581036102525790565b90815180825260208080930193019160005b828110611f91575050505090565b835185529381019392810192600101611f83565b61046090611fbe83825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e084015260808101519061201c610100928386019060208091805184520151910152565b60a08101519161203c610140938487019060208091805184520151910152565b60c08201519261205c610180948588019060208091805184520151910152565b60e08301519161207c6101c0938489019060208091805184520151910152565b830151612099610200918289019060208091805184520151910152565b610120840151916120ba61024093848a019060208091805184520151910152565b840151926120d861028094858a019060208091805184520151910152565b612113610160860151966120fc6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b93929061238f610442936104e0926123806102606109609280518b52602081015160208c01526121bc604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c015261236a8b61220860a08401516101008093019060208091805184520151910152565b61233b8d6103c060c086015161222e610140918285019060208091805184520151910152565b61230e60e088015195612251610180978887019060208091805184520151910152565b88015161226e6101c0918287019060208091805184520151910152565b6122df6101208a015193612292610200958689019060208091805184520151910152565b8a0151976122b0610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611f71565b940190611fa5565b6040513d6000823e3d90fd5b6020906123ae61277c565b60606123b8611f2c565b926001546123c585611736565b526123da61157782516001600160401b031690565b6123e385611743565b526123fa611577868301516001600160401b031690565b61240385611753565b52604081015161241285611763565b52015161241e83611773565b52600f5461242b83611783565b5260105461243883611793565b52601154612445836117a3565b526124646040519485938493630c76545d60e21b85526004850161217a565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af49081156124d5576000916124a6575b501561249457565b6040516309bde33960e01b8152600490fd5b6124c8915060203d6020116124ce575b6124c081836103f4565b810190611f59565b3861248c565b503d6124b6565b612397565b6001600160401b0391821690821603919082116118fb57565b6001600160401b038091169081146118fb5760010190565b909161257a6104429360155480151590816125e0575b50612584575b604061253d60208501516001600160401b031690565b93015161255a61254b610435565b6001600160401b039095168552565b602084015261256a61254b610444565b6001600160401b03166020840152565b60408201526117c8565b6125a261259c611b7d6014546001600160401b031690565b9061171a565b6125db6125bf6125ba6014546001600160401b031690565b6124f3565b6001600160401b03166001600160401b03196014541617601455565b612527565b61262391506125f4611b7d61260592611b48565b505460401c6001600160401b031690565b61261d6125f4611b7d6014546001600160401b031690565b906124da565b6001600160401b0361264a61264160135463ffffffff9060a81c1690565b63ffffffff1690565b9116101538612521565b90816020910312610252575190565b80156118fb576000190190565b612678610451565b90600082526000602083015261268c611b2f565b6040830152612699611b2f565b60608301526126a6611b2f565b60808301526126b3611b2f565b60a08301526126c0611b2f565b60c08301526126cd611b2f565b60e08301526126da611b2f565b6101008301526126e8611b2f565b6101208301526126f6611b2f565b610140830152612704611b2f565b610160830152612712611b2f565b610180830152612720611b2f565b6101a083015261272e611b2f565b6101c083015261273c611b2f565b6101e083015261274a611b2f565b610200830152612758611b2f565b610220830152612766611b2f565b610240830152612774611b2f565b610260830152565b612784612670565b906201000082527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab37060206008818501527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b81604086017f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee818151525101527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c81606086017f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d8151525101527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d381608086017f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac88151525101527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea8160a086017f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c8398151525101527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b68160c086017f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce78151525101527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d8160e086017f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a68151525101527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b8161010086017f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f8151525101527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c148161012086017f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e088151525101527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba8161014086017f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e78151525101527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f8161016086017f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba6550228151525101527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e8161018086017f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df28151525101527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b816101a086017f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f78151525101527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc28816101c086017f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec738151525101527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d45690915824816101e086017f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508038151525101527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf8161020086017f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a8151525101527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab8161022086017f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db448151525101527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be18161024086017f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a7581515251015261026084017f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9815152510152565b90813b15612d8f57600080516020612ea583398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612d7457612d7191612ddf565b50565b505034612d7d57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612ec58339815191525460401c1615612dcd57565b604051631afcd79f60e31b8152600490fd5b600080611b2c93602081519101845af43d15612e1d573d91612e0083610ca1565b92612e0e60405194856103f4565b83523d6000602085013e612e21565b6060915b90612e485750805115612e3657805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612e7b575b612e59575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612e5156fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x346200063857620036a2388190039060a0601f8301601f1916810191906001600160401b038311908310176200054957829160405260a0396101a08112620006385761010081126200063857604051906101008201906001600160401b0382118383101762000549576080916040526200007a60a06200063d565b83526200008860c06200063d565b602084015260e08051604085015261010051606085015260a0838101518486015261014051908501526101605160c0850152610180519084015260ff1901126200063857604051906001600160401b03608083019081119083111762000549576080820160409081526101a05183526101c05160208401526101e05190830152610200516060830152610220519163ffffffff831683036200063857306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1662000626576002600160401b03196001600160401b03821601620005bc575b5081516001600160401b031615801590620005a5575b801562000598575b80156200058b575b80156200057e575b801562000571575b6200055f5760018060401b03825116809360095468010000000000000000600160801b03602086015160401b1692839160018060801b031916171760095560408401519283600a55606085015180600b5560808601519485600c5560a08701519485600d5560c08801519889600e55606060e08a01519586600f55805160055560208101516006556040810151600755015160085560018060801b03196010541617176010556011556012558360135582601455856015556016556017549063ffffffff60a81b9060a81b169063ffffffff60a81b1916179384601755604051916020830193845260408301526060820152606081526080810181811060018060401b0382111762000549576040525190209160009280845560e08301519081600155600255600355601954908115159182620004d2575b505062000443575b602081015160409182015182519290916001600160401b03908116918401908111848210176200041b5760405282526020820152604051906060820182811060018060401b038211176200042f5760409081526001600160401b034381168452421660208401908152908301918252601954909290680100000000000000008110156200041b578060016200037f920160195562000652565b94909462000407575051835492516001600160801b03199093166001600160401b0391821617604093841b6fffffffffffffffff000000000000000016178455905180516001850180546001600160401b03191691909316179091556020015160029290920191909155516130199081620006898239608051818181610dec0152610f440152f35b634e487b7160e01b81526004819052602490fd5b634e487b7160e01b85526041600452602485fd5b634e487b7160e01b84526041600452602484fd5b6018546200045a906001600160401b031662000652565b620004be57828155600181018390556002018290556018546001600160401b03808216908114620004aa576001600160401b03199091166001919091016001600160401b031617601855620002e6565b634e487b7160e01b84526011600452602484fd5b634e487b7160e01b83526004839052602483fd5b9091506000198101908111620004aa57620004ed9062000652565b50546018546001600160401b0360409290921c8216916200050f911662000652565b505460401c6001600160401b0390811690910391908211620004aa5760a81c63ffffffff166001600160401b0390911610153880620002de565b634e487b7160e01b600052604160045260246000fd5b6040516350dd03f760e11b8152600490fd5b5060e082015115620001a6565b5060c0820151156200019e565b5060a08201511562000196565b506080820151156200018e565b5060208201516001600160401b0316151562000186565b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a13862000170565b60405163f92ee8a960e01b8152600490fd5b600080fd5b51906001600160401b03821682036200063857565b601954811015620006725760196000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461025757806302b592f3146102525780630c693a221461024d5780630d8e6e2c14610248578063202a0adb146102435780632d52aad61461023e5780632f5f4600146102395780632f79889d14610234578063313df7b11461022f578063382b215a1461022a578063409939b7146102255780634847ae5d146102205780634f1ef2861461021b57806352d1902d14610216578063628277331461021157806369cc6a041461020c578063715018a61461020757806376b6b7cb146102025780637f17baad146101fd57806382d07ff3146101f85780638584d23f146101f35780638da5cb5b146101ee5780638ed3e045146101e957806396c1ca61146101e45780639fdb54a7146101df578063a9a9c9f5146101da578063aa922732146101d5578063ad3cb1cc146101d0578063bd32519a146101cb578063c23b9e9e146101c6578063c8e5e498146101c1578063ca6fe855146101bc578063d24d933d146101b7578063e0303301146101b2578063f2fde38b146101ad5763f9e50d19146101a857600080fd5b61165b565b611632565b611502565b6114ba565b61149c565b61147f565b611458565b611432565b6113b5565b611388565b611351565b611309565b611284565b61120b565b6111d5565b611198565b611167565b6110f7565b611084565b611019565b610fba565b610f9c565b610f31565b610d72565b610cd4565b610b1f565b6108d2565b6108a9565b610882565b610798565b61075b565b610687565b6105c4565b610544565b6104ce565b61028e565b600435906001600160a01b038216820361027257565b600080fd5b6101a435906001600160a01b038216820361027257565b34610272576020366003190112610272576102a761025c565b6102af611fad565b6001600160a01b0390811690811561033a5760175490811682146103285760ff60a01b19919091166001600160a81b03199190911617600160a01b1760178190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa4607290602090a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b60195481101561039d576003906019600052027f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950190600090565b61034c565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b038211176103d357604052565b6103a2565b608081019081106001600160401b038211176103d357604052565b61010081019081106001600160401b038211176103d357604052565b606081019081106001600160401b038211176103d357604052565b90601f801991011681019081106001600160401b038211176103d357604052565b604051906102e082018281106001600160401b038211176103d357604052565b60405190610478826103b8565b565b604051906104788261040f565b6040519061028082018281106001600160401b038211176103d357604052565b906040516104b4816103b8565b6020600182946001600160401b0381541684520154910152565b3461027257602036600319011261027257600435601954811015610272576104f7608091610362565b5061054281549161051260016001600160401b0392016104a7565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610272576000806003193601126105c15760809060409060608251610569816103d8565b828152826020820152828482015201528051610584816103d8565b6005549182825260065460208301908152600754908284019182526060600854940193845282519485525160208501525190830152516060820152f35b80fd5b34610272576000366003190112610272576060604051600181526000602082015260006040820152f35b602435906001600160401b038216820361027257565b35906001600160401b038216820361027257565b6101009060031901126102725760405190610632826103f3565b816004356001600160401b03811681036102725781526106506105ee565b602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e060e435910152565b34610272576101003660031901126102725761075960e06106a736610618565b6106d16001600160401b038251166001600160401b03166001600160401b03196010541617601055565b6107116106e860208301516001600160401b031690565b67ffffffffffffffff60401b6010549160401b169067ffffffffffffffff60401b191617601055565b61071e6040820151601155565b61072b6060820151601255565b6107386080820151601355565b61074560a0820151601455565b61075260c0820151601555565b0151601655565b005b3461027257602036600319011261027257601a805460ff19166001179055600435601b55005b6001600160401b0381116103d35760051b60200190565b346102725760208060031936011261027257600435906001600160401b0382116102725736602383011215610272578160040135916107d683610781565b916040936107e68551948561042a565b80845260248285019160071b8401019236841161027257602401905b8382106108125761075985611862565b81360360808112610272578680519161082a8361040f565b61083385610604565b8352610840868601610604565b83870152603f190112610272576080918491885161085d816103b8565b6108688a8701610604565b815260608601358482015289820152815201910190610802565b346102725760003660031901126102725760206001600160401b0360185416604051908152f35b34610272576000366003190112610272576017546040516001600160a01b039091168152602090f35b34610272576000366003190112610272576020600254604051908152f35b604090610103190112610272576040519061090a826103b8565b610104358252610124356020830152565b6040906101431901126102725760405190610935826103b8565b610144358252610164356020830152565b6040906101831901126102725760405190610960826103b8565b6101843582526101a4356020830152565b6040906101c3190112610272576040519061098b826103b8565b6101c43582526101e4356020830152565b60409061020319011261027257604051906109b6826103b8565b610204358252610224356020830152565b60409061024319011261027257604051906109e1826103b8565b610244358252610264356020830152565b6040906102831901126102725760405190610a0c826103b8565b6102843582526102a4356020830152565b6040906102c31901126102725760405190610a37826103b8565b6102c43582526102e4356020830152565b6040906103031901126102725760405190610a62826103b8565b610304358252610324356020830152565b6040906103431901126102725760405190610a8d826103b8565b610344358252610364356020830152565b6040906103831901126102725760405190610ab8826103b8565b6103843582526103a4356020830152565b6040906103c31901126102725760405190610ae3826103b8565b6103c43582526103e4356020830152565b6040906104031901126102725760405190610b0e826103b8565b610404358252610424356020830152565b346102725761058036600319011261027257610b3a36610618565b610480366101031901126102725761075990610b5461044b565b90610b5e366108f0565b8252610b693661091b565b6020830152610b7736610946565b6040830152610b8536610971565b6060830152610b933661099c565b6080830152610ba1366109c7565b60a0830152610baf366109f2565b60c0830152610bbd36610a1d565b60e0830152610bcb36610a48565b610100830152610bda36610a73565b610120830152610be936610a9e565b610140830152610bf836610ac9565b610160830152610c0736610af4565b610180830152610444356101a0830152610464356101c0830152610484356101e08301526104a4356102008301526104c4356102208301526104e4356102408301526105043561026083015261052435610280830152610544356102a0830152610564356102c083015261190c565b91909160e0806101008301946001600160401b03808251168552602082015116602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b3461027257600036600319011261027257610ced611a8f565b50610d53604051610cfd816103f3565b6009546001600160401b0390818116835260401c166020820152600a546040820152600b546060820152600c546080820152600d5460a0820152600e5460c0820152600f5460e082015260405191829182610c76565b0390f35b6001600160401b0381116103d357601f01601f191660200190565b60408060031936011261027257610d8761025c565b6024356001600160401b038111610272573660238201121561027257806004013590610db282610d57565b91610dbf8551938461042a565b80835260209136602483830101116102725781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610f15575b50610f04579080600492610e2a611fad565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610ed5575b5050610e9a578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612fcd8339815191528193929303610ebc576107598383612e31565b8351632a87526960e21b81526004810191909152602490fd5b610ef5929350803d10610efd575b610eed818361042a565b81019061277c565b903880610e74565b503d610ee3565b845163703e46dd60e11b8152600490fd5b905081600080516020612fcd8339815191525416141538610e18565b34610272576000366003190112610272577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610f8a576020604051600080516020612fcd8339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610272576000366003190112610272576020600154604051908152f35b34610272576000806003193601126105c157610fd4611fad565b60175460ff8160a01c16600014610328576001600160a81b0319166017557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b34610272576000806003193601126105c157611033611fad565b600080516020612fad83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610272576000366003190112610272576020600054604051908152f35b6004359063ffffffff8216820361027257565b949198979693909260e0969361010087019a6001600160401b03809216885216602087015260408601526060850152608084015260a083015260c08201520152565b346102725760203660031901126102725763ffffffff6111156110a2565b1660005260046020526040600020805490610d536001600160401b039160018101549060028101546003820154600483015491600660058501549401549460405198888a998260401c169116896110b5565b3461027257600036600319011261027257611180611a8f565b50610d5361118c611acd565b60405191829182610c76565b346102725760203660031901126102725760406111b6600435611b70565b61054282518092602080916001600160401b0381511684520151910152565b3461027257600036600319011261027257600080516020612fad833981519152546040516001600160a01b039091168152602090f35b34610272576101c03660031901126102725761122636610618565b6080366101031901126102725760405190611240826103d8565b6101043582526101243560208301526101443560408301526101643560608301526101843563ffffffff81168103610272576107599261127e610277565b92611c33565b346102725760203660031901126102725761129d6110a2565b6112a5611fad565b63ffffffff808216610e1081109182156112f7575b50506112e5576017805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b60175460a81c161015905038806112ba565b34610272576000366003190112610272576010546001600160401b03610d5360115460125460135460145490601554926016549460405198888a998260401c169116896110b5565b3461027257600036600319011261027257608060055460065460075460085491604051938452602084015260408301526060820152f35b34610272576101003660031901126102725760206113ad6113a836610618565b611f01565b604051908152f35b346102725760003660031901126102725760408051906113d4826103b8565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b83811061141f5784604081866000838284010152601f80199101168101030190f35b85810183015185820183015282016113fd565b3461027257600036600319011261027257602060ff60175460a01c166040519015158152f35b3461027257600036600319011261027257602063ffffffff60175460a81c16604051908152f35b3461027257600036600319011261027257601a805460ff19169055005b34610272576000366003190112610272576020600354604051908152f35b34610272576000366003190112610272576009546001600160401b03610d53600a54600b54600c54600d5490600e5492600f549460405198888a998260401c169116896110b5565b34610272576040366003190112610272576004356024359060ff601a541660009060001461155057509061153c610d5392601b5490611b63565b115b60405190151581529081906020820190565b91601954914381118015611628575b6115b55761156d8493611b54565b9261158f6115836018546001600160401b031690565b6001600160401b031690565b935b81156115c7575b5090919250156115b557610d53926115af91611b63565b1161153e565b60405163b0b4387760e01b8152600490fd5b826115e56115836115d784610362565b50546001600160401b031690565b111561160e575b6002811061160957848114611609576116049061278b565b611591565b611598565b94505060016116226115836115d787610362565b946115ec565b506003831061155f565b346102725760203660031901126102725761075961164e61025c565b611656611fad565b611f39565b34610272576000366003190112610272576020601954604051908152f35b634e487b7160e01b600052600060045260246000fd5b60e0906116e16001600160401b03808351166001600160401b0319601054161760105560208301511667ffffffffffffffff60401b6010549160401b169067ffffffffffffffff60401b191617601055565b60408101516011556060810151601255608081015160135560a081015160145560c08101516015550151601655565b634e487b7160e01b600052601160045260246000fd5b9061173d5760028160008093558260018201550155565b611679565b80511561039d5760200190565b80516001101561039d5760400190565b80516002101561039d5760600190565b80516003101561039d5760800190565b80516004101561039d5760a00190565b80516005101561039d5760c00190565b80516006101561039d5760e00190565b80516007101561039d576101000190565b805182101561039d5760209160051b010190565b601954600160401b8110156103d3578060016117f39201601955610362565b91909161173d57805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b9060195460006019558061189f575b5060005b825181101561189a578061189461188e600193866117c0565b516117d4565b01611875565b509050565b600390806003029060038204036119075760196000527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9695908101905b8181106118e9575050611871565b80611901849260026000918281558260018201550155565b016118db565b611710565b9060175460ff8160a01c169081611a7b575b50611a695781516001600160401b031661194961158361193c611b27565b516001600160401b031690565b6001600160401b0380921611801590611a32575b611a20577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906119cf60408501936119958551611fe6565b6119a26060870151611fe6565b6119af6080870151611fe6565b6119bc60a0870151611fe6565b6119c960c0870151611fe6565b856124cb565b6119d88461168f565b6119e784824216834316612633565b611a0c60206119fd86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b031681611a606115836020611a52611b27565b01516001600160401b031690565b9116111561195d565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861191e565b60405190611a9c826103f3565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b60405190611ada826103f3565b816010546001600160401b0390818116835260401c16602082015260115460408201526012546060820152601354608082015260145460a082015260155460c082015260e0601654910152565b611b2f611a8f565b50611b38611acd565b90565b60405190611b48826103b8565b60006020838281520152565b60001981019190821161190757565b9190820391821161190757565b611b78611b3b565b5060195490611b8e611b8983611b54565b610362565b5090611ba86115836001809401546001600160401b031690565b811015611c2157611bc46115836018546001600160401b031690565b838110611be6575050506001611bdf611b89611b3893611b54565b50016104a7565b81611c0661158385611bf785610362565b5001546001600160401b031690565b11611c12578201611bc4565b611b389350611bdf9150610362565b604051631856a49960e21b8152600490fd5b929091600080516020612fed8339815191529283549460ff8660401c1615956001600160401b03811680159081611d34575b6001149081611d2a575b159081611d21575b50611d0f5767ffffffffffffffff1916600117909455611c9b9385611cea57611d3c565b611ca157565b600080516020612fed833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1565b600080516020612fed833981519152805460ff60401b1916600160401b179055611d3c565b60405163f92ee8a960e01b8152600490fd5b90501538611c77565b303b159150611c6f565b889150611c65565b9192611d5290611d4a612ed8565b611656612ed8565b611d5a612ed8565b6001600160401b039081611d7584516001600160401b031690565b1615801590611ee2575b8015611ed6575b8015611eca575b8015611ebe575b8015611eb2575b611ea05761047893611e3b611e6992611e1d8660e0906001600160401b038151166009549067ffffffffffffffff60401b602084015160401b16916fffffffffffffffffffffffffffffffff191617176009556040810151600a556060810151600b556080810151600c5560a0810151600d5560c0810151600e550151600f55565b80516005556020810151600655604081015160075560600151600855565b611e448461168f565b6017805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b611e95611e7583611f01565b80600055611e9060e085015191611e8b83600155565b600255565b600355565b804216904316612633565b6040516350dd03f760e11b8152600490fd5b5060e083015115611d9b565b5060c083015115611d94565b5060a083015115611d8d565b50608083015115611d86565b50611efa61158360208501516001600160401b031690565b1515611d7f565b60808101519060c060a082015191015160405191602083019384526040830152606082015260608152611f33816103d8565b51902090565b6001600160a01b03908116908115611f9457600080516020612fad83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612fad833981519152546001600160a01b03163303611fce57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561200f57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103d35760405260088252610100366020840137565b90816020910312610272575180151581036102725790565b90815180825260208080930193019160005b8281106120b9575050505090565b8351855293810193928101926001016120ab565b610460906120e683825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190612144610100928386019060208091805184520151910152565b60a081015191612164610140938487019060208091805184520151910152565b60c082015192612184610180948588019060208091805184520151910152565b60e0830151916121a46101c0938489019060208091805184520151910152565b8301516121c1610200918289019060208091805184520151910152565b610120840151916121e261024093848a019060208091805184520151910152565b8401519261220061028094858a019060208091805184520151910152565b61223b610160860151966122246102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b9392906124b7610478936104e0926124a86102606109609280518b52602081015160208c01526122e4604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c01526124928b61233060a08401516101008093019060208091805184520151910152565b6124638d6103c060c0860151612356610140918285019060208091805184520151910152565b61243660e088015195612379610180978887019060208091805184520151910152565b8801516123966101c0918287019060208091805184520151910152565b6124076101208a0151936123ba610200958689019060208091805184520151910152565b8a0151976123d8610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190612099565b9401906120cd565b6040513d6000823e3d90fd5b6020906124d66128a4565b60606124e0612054565b926001546124ed85611742565b5261250261158382516001600160401b031690565b61250b8561174f565b52612522611583868301516001600160401b031690565b61252b8561175f565b52604081015161253a8561176f565b5201516125468361177f565b526013546125538361178f565b526014546125608361179f565b5260155461256d836117af565b5261258c6040519485938493630c76545d60e21b8552600485016122a2565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af49081156125fd576000916125ce575b50156125bc57565b6040516309bde33960e01b8152600490fd5b6125f0915060203d6020116125f6575b6125e8818361042a565b810190612081565b386125b4565b503d6125de565b6124bf565b6001600160401b03918216908216039190821161190757565b6001600160401b038091169081146119075760010190565b90916126a2610478936019548015159081612708575b506126ac575b604061266560208501516001600160401b031690565b93015161268261267361046b565b6001600160401b039095168552565b602084015261269261267361047a565b6001600160401b03166020840152565b60408201526117d4565b6126ca6126c4611b896018546001600160401b031690565b90611726565b6127036126e76126e26018546001600160401b031690565b61261b565b6001600160401b03166001600160401b03196018541617601855565b61264f565b61274b915061271c611b8961272d92611b54565b505460401c6001600160401b031690565b61274561271c611b896018546001600160401b031690565b90612602565b6001600160401b0361277261276960175463ffffffff9060a81c1690565b63ffffffff1690565b9116101538612649565b90816020910312610272575190565b8015611907576000190190565b6127a0610487565b9060008252600060208301526127b4611b3b565b60408301526127c1611b3b565b60608301526127ce611b3b565b60808301526127db611b3b565b60a08301526127e8611b3b565b60c08301526127f5611b3b565b60e0830152612802611b3b565b610100830152612810611b3b565b61012083015261281e611b3b565b61014083015261282c611b3b565b61016083015261283a611b3b565b610180830152612848611b3b565b6101a0830152612856611b3b565b6101c0830152612864611b3b565b6101e0830152612872611b3b565b610200830152612880611b3b565b61022083015261288e611b3b565b61024083015261289c611b3b565b610260830152565b6128ac612798565b906201000082527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab37060206008818501527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b81604086017f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee818151525101527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c81606086017f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d8151525101527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d381608086017f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac88151525101527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea8160a086017f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c8398151525101527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b68160c086017f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce78151525101527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d8160e086017f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a68151525101527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b8161010086017f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f8151525101527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c148161012086017f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e088151525101527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba8161014086017f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e78151525101527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f8161016086017f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba6550228151525101527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e8161018086017f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df28151525101527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b816101a086017f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f78151525101527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc28816101c086017f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec738151525101527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d45690915824816101e086017f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508038151525101527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf8161020086017f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a8151525101527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab8161022086017f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db448151525101527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be18161024086017f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a7581515251015261026084017f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9815152510152565b90813b15612eb757600080516020612fcd83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612e9c57612e9991612f07565b50565b505034612ea557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612fed8339815191525460401c1615612ef557565b604051631afcd79f60e31b8152600490fd5b600080611b3893602081519101845af43d15612f45573d91612f2883610d57565b92612f36604051948561042a565b83523d6000602085013e612f49565b6060915b90612f705750805115612f5e57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612fa3575b612f81575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612f7956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json index d1d32d90d..5c16e2b88 100644 --- a/contract-bindings/artifacts/LightClient_bytecode.json +++ b/contract-bindings/artifacts/LightClient_bytecode.json @@ -1 +1 @@ -"0x60a080604052346100cd57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100be57506001600160401b036002600160401b031982821601610079575b604051612bf79081620000d38239608051818181610ae00152610c380152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc146101f757806302b592f3146101f25780630d8e6e2c146101ed5780632f79889d146101e8578063313df7b1146101e3578063382b215a146101de578063409939b7146101d95780634847ae5d146101d45780634f1ef286146101cf57806352d1902d146101ca57806362827733146101c557806369cc6a04146101c0578063715018a6146101bb57806376b6b7cb146101b65780637f17baad146101b157806382d07ff3146101ac5780638584d23f146101a75780638da5cb5b146101a257806396c1ca611461019d5780639fdb54a714610198578063a244d59614610193578063aa9227321461018e578063ad3cb1cc14610189578063bd32519a14610184578063c23b9e9e1461017f578063ca6fe8551461017a578063d24d933d14610175578063e030330114610170578063f2fde38b1461016b5763f9e50d191461016657600080fd5b6113b1565b611388565b611283565b61123b565b61121d565b6111f6565b6111d0565b611153565b611126565b610fe3565b610f9b565b610f16565b610ee0565b610ea3565b610e72565b610e02565b610d7b565b610d10565b610cae565b610c90565b610c25565b610a66565b6109c8565b610811565b61053f565b610516565b6104ef565b6104c5565b61044f565b61022e565b600435906001600160a01b038216820361021257565b600080fd5b61012435906001600160a01b038216820361021257565b34610212576020366003190112610212576102476101fc565b61024f6119d9565b6001600160a01b039081169081156102df5760135490811682146102cd5760ff60a01b19919091166001600160a81b03199190911617600160a01b1760138190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b601554811015610342576003906015600052027f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750190600090565b6102f1565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761037857604052565b610347565b61010081019081106001600160401b0382111761037857604052565b90601f801991011681019081106001600160401b0382111761037857604052565b604051906102e082018281106001600160401b0382111761037857604052565b604051906103e78261035d565b565b60405190606082018281106001600160401b0382111761037857604052565b6040519061028082018281106001600160401b0382111761037857604052565b906040516104358161035d565b6020600182946001600160401b0381541684520154910152565b346102125760203660031901126102125760043560155481101561021257610478608091610307565b506104c381549161049360016001600160401b039201610428565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610212576000366003190112610212576060604051600181526000602082015260006040820152f35b346102125760003660031901126102125760206001600160401b0360145416604051908152f35b34610212576000366003190112610212576013546040516001600160a01b039091168152602090f35b34610212576000366003190112610212576020600254604051908152f35b602435906001600160401b038216820361021257565b610100906003190112610212576040519061058d8261037d565b816004356001600160401b03811681036102125781526105ab61055d565b602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e060e435910152565b60409061010319011261021257604051906105fc8261035d565b610104358252610124356020830152565b60409061014319011261021257604051906106278261035d565b610144358252610164356020830152565b60409061018319011261021257604051906106528261035d565b6101843582526101a4356020830152565b6040906101c3190112610212576040519061067d8261035d565b6101c43582526101e4356020830152565b60409061020319011261021257604051906106a88261035d565b610204358252610224356020830152565b60409061024319011261021257604051906106d38261035d565b610244358252610264356020830152565b60409061028319011261021257604051906106fe8261035d565b6102843582526102a4356020830152565b6040906102c319011261021257604051906107298261035d565b6102c43582526102e4356020830152565b60409061030319011261021257604051906107548261035d565b610304358252610324356020830152565b604090610343190112610212576040519061077f8261035d565b610344358252610364356020830152565b60409061038319011261021257604051906107aa8261035d565b6103843582526103a4356020830152565b6040906103c319011261021257604051906107d58261035d565b6103c43582526103e4356020830152565b60409061040319011261021257604051906108008261035d565b610404358252610424356020830152565b34610212576105803660031901126102125761082c36610573565b6104803661010319011261021257610968906108466103ba565b90610850366105e2565b825261085b3661060d565b602083015261086936610638565b604083015261087736610663565b60608301526108853661068e565b6080830152610893366106b9565b60a08301526108a1366106e4565b60c08301526108af3661070f565b60e08301526108bd3661073a565b6101008301526108cc36610765565b6101208301526108db36610790565b6101408301526108ea366107bb565b6101608301526108f9366107e6565b610180830152610444356101a0830152610464356101c0830152610484356101e08301526104a4356102008301526104c4356102208301526104e4356102408301526105043561026083015261052435610280830152610544356102a0830152610564356102c0830152611435565b005b91909160e0806101008301946001600160401b03808251168552602082015116602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b34610212576000366003190112610212576109e16115b8565b50610a476040516109f18161037d565b6005546001600160401b0390818116835260401c16602082015260065460408201526007546060820152600854608082015260095460a0820152600a5460c0820152600b5460e08201526040519182918261096a565b0390f35b6001600160401b03811161037857601f01601f191660200190565b60408060031936011261021257610a7b6101fc565b6024356001600160401b038111610212573660238201121561021257806004013590610aa682610a4b565b91610ab385519384610399565b80835260209136602483830101116102125781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610c09575b50610bf8579080600492610b1e6119d9565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610bc9575b5050610b8e578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612bab8339815191528193929303610bb0576109688383612a0f565b8351632a87526960e21b81526004810191909152602490fd5b610be9929350803d10610bf1575b610be18183610399565b810190612366565b903880610b68565b503d610bd7565b845163703e46dd60e11b8152600490fd5b905081600080516020612bab8339815191525416141538610b0c565b34610212576000366003190112610212577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610c7e576020604051600080516020612bab8339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610212576000366003190112610212576020600154604051908152f35b3461021257600080600319360112610d0d57610cc86119d9565b60135460ff8160a01c166000146102cd576001600160a81b0319166013557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b3461021257600080600319360112610d0d57610d2a6119d9565b600080516020612b8b83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610212576000366003190112610212576020600054604051908152f35b6004359063ffffffff8216820361021257565b610104359063ffffffff8216820361021257565b949198979693909260e0969361010087019a6001600160401b03809216885216602087015260408601526060850152608084015260a083015260c08201520152565b346102125760203660031901126102125763ffffffff610e20610d99565b1660005260046020526040600020805490610a476001600160401b039160018101549060028101546003820154600483015491600660058501549401549460405198888a998260401c16911689610dc0565b3461021257600036600319011261021257610e8b6115b8565b50610a47610e976115f6565b6040519182918261096a565b34610212576020366003190112610212576040610ec16004356116b4565b6104c382518092602080916001600160401b0381511684520151910152565b3461021257600036600319011261021257600080516020612b8b833981519152546040516001600160a01b039091168152602090f35b3461021257602036600319011261021257610f2f610d99565b610f376119d9565b63ffffffff808216610e108110918215610f89575b5050610f77576013805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b60135460a81c16101590503880610f4c565b3461021257600036600319011261021257600c546001600160401b03610a47600d54600e54600f5460105490601154926012549460405198888a998260401c16911689610dc0565b346102125761014036600319011261021257610ffe36610573565b611006610dac565b9061100f610217565b600080516020612bcb83398151915254926001600160401b0360ff8560401c161594168015908161111e575b6001149081611114575b15908161110b575b506110f957600080516020612bcb833981519152805467ffffffffffffffff1916600117905561108192846110d457611777565b61108757005b600080516020612bcb833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102c8565b600080516020612bcb833981519152805460ff60401b1916600160401b179055611777565b60405163f92ee8a960e01b8152600490fd5b9050153861104d565b303b159150611045565b85915061103b565b346102125761010036600319011261021257602061114b61114636610573565b611910565b604051908152f35b346102125760003660031901126102125760408051906111728261035d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106111bd5784604081866000838284010152601f80199101168101030190f35b858101830151858201830152820161119b565b3461021257600036600319011261021257602060ff60135460a01c166040519015158152f35b3461021257600036600319011261021257602063ffffffff60135460a81c16604051908152f35b34610212576000366003190112610212576020600354604051908152f35b34610212576000366003190112610212576005546001600160401b03610a4760065460075460085460095490600a5492600b549460405198888a998260401c16911689610dc0565b3461021257604036600319011261021257600435601554438211801561137e575b61130b576000916112b6600092611693565b916112d86112cc6014546001600160401b031690565b6001600160401b031690565b925b811561131d575b509091501561130b576112fa610a4792602435926116a7565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b8261133b6112cc61132d84610307565b50546001600160401b031690565b1115611364575b6002811061135f5783811461135f5761135a90611958565b6112da565b6112e1565b93505060016113786112cc61132d86610307565b93611342565b50600381106112a4565b34610212576020366003190112610212576109686113a46101fc565b6113ac6119d9565b611965565b34610212576000366003190112610212576020601554604051908152f35b60e0906001600160401b03815116600c549067ffffffffffffffff60401b602084015160401b16916001600160801b0319161717600c556040810151600d556060810151600e556080810151600f5560a081015160105560c08101516011550151601255565b9060135460ff8160a01c1690816115a4575b506115925781516001600160401b03166114726112cc611465611650565b516001600160401b031690565b6001600160401b038092161180159061155b575b611549577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906114f860408501936114be8551611a12565b6114cb6060870151611a12565b6114d86080870151611a12565b6114e560a0870151611a12565b6114f260c0870151611a12565b85611f75565b611501846113cf565b6115108482421683431661221d565b611535602061152686516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b0316816115896112cc602061157b611650565b01516001600160401b031690565b91161115611486565b6040516301474c8f60e71b8152600490fd5b6001600160a01b0316331415905038611447565b604051906115c58261037d565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b604051906116038261037d565b81600c546001600160401b0390818116835260401c166020820152600d546040820152600e546060820152600f54608082015260105460a082015260115460c082015260e0601254910152565b6116586115b8565b506116616115f6565b90565b604051906116718261035d565b60006020838281520152565b634e487b7160e01b600052601160045260246000fd5b6000198101919082116116a257565b61167d565b919082039182116116a257565b6116bc611664565b50601554906116d26116cd83611693565b610307565b50906116ec6112cc6001809401546001600160401b031690565b811015611765576117086112cc6014546001600160401b031690565b83811061172a5750505060016117236116cd61166193611693565b5001610428565b8161174a6112cc8561173b85610307565b5001546001600160401b031690565b11611756578201611708565b61166193506117239150610307565b604051631856a49960e21b8152600490fd5b909161178d90611785612ab6565b6113ac612ab6565b611795612ab6565b6001600160401b03806117af83516001600160401b031690565b16158015906118f1575b80156118e5575b80156118d9575b80156118cd575b80156118c1575b6118af576118786103e79361184a8460e0906001600160401b038151166005549067ffffffffffffffff60401b602084015160401b16916001600160801b031916171760055560408101516006556060810151600755608081015160085560a081015160095560c0810151600a550151600b55565b611853846113cf565b6013805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b6118a461188483611910565b8060005561189f60e08501519161189a83600155565b600255565b600355565b80421690431661221d565b6040516350dd03f760e11b8152600490fd5b5060e0820151156117d5565b5060c0820151156117ce565b5060a0820151156117c7565b506080820151156117c0565b506119096112cc60208401516001600160401b031690565b15156117b9565b60808101519060c060a082015191015160405191602083019384526040830152606082015260608152608081018181106001600160401b038211176103785760405251902090565b80156116a2576000190190565b6001600160a01b039081169081156119c057600080516020612b8b83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612b8b833981519152546001600160a01b031633036119fa57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611a3b57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103785760405260088252610100366020840137565b8051156103425760200190565b8051600110156103425760400190565b8051600210156103425760600190565b8051600310156103425760800190565b8051600410156103425760a00190565b8051600510156103425760c00190565b8051600610156103425760e00190565b805160071015610342576101000190565b90816020910312610212575180151581036102125790565b90815180825260208080930193019160005b828110611b63575050505090565b835185529381019392810192600101611b55565b61046090611b9083825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611bee610100928386019060208091805184520151910152565b60a081015191611c0e610140938487019060208091805184520151910152565b60c082015192611c2e610180948588019060208091805184520151910152565b60e083015191611c4e6101c0938489019060208091805184520151910152565b830151611c6b610200918289019060208091805184520151910152565b61012084015191611c8c61024093848a019060208091805184520151910152565b84015192611caa61028094858a019060208091805184520151910152565b611ce561016086015196611cce6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b939290611f616103e7936104e092611f526102606109609280518b52602081015160208c0152611d8e604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c0152611f3c8b611dda60a08401516101008093019060208091805184520151910152565b611f0d8d6103c060c0860151611e00610140918285019060208091805184520151910152565b611ee060e088015195611e23610180978887019060208091805184520151910152565b880151611e406101c0918287019060208091805184520151910152565b611eb16101208a015193611e64610200958689019060208091805184520151910152565b8a015197611e82610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611b43565b940190611b77565b6040513d6000823e3d90fd5b602090611f80612481565b6060611f8a611a80565b92600154611f9785611aad565b52611fac6112cc82516001600160401b031690565b611fb585611aba565b52611fcc6112cc868301516001600160401b031690565b611fd585611aca565b526040810151611fe485611ada565b520151611ff083611aea565b52600f54611ffd83611afa565b5260105461200a83611b0a565b5260115461201783611b1a565b526120366040519485938493630c76545d60e21b855260048501611d4c565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af49081156120a757600091612078575b501561206657565b6040516309bde33960e01b8152600490fd5b61209a915060203d6020116120a0575b6120928183610399565b810190611b2b565b3861205e565b503d612088565b611f69565b6001600160401b0391821690821603919082116116a257565b906120dc5760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146116a25760010190565b601554600160401b81101561037857600181018060155581101561034257602060037f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47792601560005202926122166040857f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47501926001600160401b03936121aa8583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4768601906001600160401b03166001600160401b0319825416179055565b0151910155565b909161228c6103e79360155480151590816122f2575b50612296575b604061224f60208501516001600160401b031690565b93015161226c61225d6103da565b6001600160401b039095168552565b602084015261227c61225d6103e9565b6001600160401b03166020840152565b604082015261210a565b6122b46122ae6116cd6014546001600160401b031690565b906120c5565b6122ed6122d16122cc6014546001600160401b031690565b6120f2565b6001600160401b03166001600160401b03196014541617601455565b612239565b61233591506123066116cd61231792611693565b505460401c6001600160401b031690565b61232f6123066116cd6014546001600160401b031690565b906120ac565b6001600160401b0361235c61235360135463ffffffff9060a81c1690565b63ffffffff1690565b9116101538612233565b90816020910312610212575190565b61237d610408565b906000825260006020830152612391611664565b604083015261239e611664565b60608301526123ab611664565b60808301526123b8611664565b60a08301526123c5611664565b60c08301526123d2611664565b60e08301526123df611664565b6101008301526123ed611664565b6101208301526123fb611664565b610140830152612409611664565b610160830152612417611664565b610180830152612425611664565b6101a0830152612433611664565b6101c0830152612441611664565b6101e083015261244f611664565b61020083015261245d611664565b61022083015261246b611664565b610240830152612479611664565b610260830152565b612489612375565b906210000082527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d560206008818501527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c81604086017f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b338151525101527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e97081606086017f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db8151525101527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d81608086017f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b998151525101527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df600938160a086017f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a58066258151525101527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde288160c086017f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a98151525101527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc038160e086017f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b596938151525101527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad8161010086017f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e78151525101527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea170318161012086017f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e48151525101527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db70368161014086017f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae72488151525101527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e84158161016086017f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e56198151525101527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a38161018086017f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc88151525101527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c816101a086017f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc8151525101527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd5816101c086017f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b408151525101527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd3816101e086017f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc58151525101527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc8161020086017f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa48151525101527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e8161022086017f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a297822268151525101527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd48161024086017f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab261423981515251015261026084017f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82815152510152565b90813b15612a9557600080516020612bab83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612a7a57612a7791612ae5565b50565b505034612a8357565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612bcb8339815191525460401c1615612ad357565b604051631afcd79f60e31b8152600490fd5b60008061166193602081519101845af43d15612b23573d91612b0683610a4b565b92612b146040519485610399565b83523d6000602085013e612b27565b6060915b90612b4e5750805115612b3c57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612b81575b612b5f575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612b5756fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a080604052346100cd57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100be57506001600160401b036002600160401b031982821601610079575b604051612d1f9081620000d38239608051818181610b960152610cee0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461021757806302b592f3146102125780630c693a221461020d5780630d8e6e2c146102085780632f79889d14610203578063313df7b1146101fe578063382b215a146101f9578063409939b7146101f45780634847ae5d146101ef5780634f1ef286146101ea57806352d1902d146101e557806362827733146101e057806369cc6a04146101db578063715018a6146101d657806376b6b7cb146101d15780637f17baad146101cc57806382d07ff3146101c75780638584d23f146101c25780638da5cb5b146101bd5780638ed3e045146101b857806396c1ca61146101b35780639fdb54a7146101ae578063a9a9c9f5146101a9578063aa922732146101a4578063ad3cb1cc1461019f578063bd32519a1461019a578063c23b9e9e14610195578063ca6fe85514610190578063d24d933d1461018b578063e030330114610186578063f2fde38b146101815763f9e50d191461017c57600080fd5b6113bd565b611394565b61128f565b611247565b611229565b611202565b6111dc565b61115f565b611132565b6110fb565b6110b3565b61102e565b610fb5565b610f7f565b610f42565b610f11565b610ea1565b610e2e565b610dc3565b610d64565b610d46565b610cdb565b610b1c565b610a7e565b6108c7565b6105f5565b6105cc565b6105a5565b61057b565b6104fb565b610485565b61024e565b600435906001600160a01b038216820361023257565b600080fd5b6101a435906001600160a01b038216820361023257565b346102325760203660031901126102325761026761021c565b61026f611b01565b6001600160a01b039081169081156102fa5760175490811682146102e85760ff60a01b19919091166001600160a81b03199190911617600160a01b1760178190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa4607290602090a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b60195481101561035d576003906019600052027f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950190600090565b61030c565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761039357604052565b610362565b608081019081106001600160401b0382111761039357604052565b61010081019081106001600160401b0382111761039357604052565b90601f801991011681019081106001600160401b0382111761039357604052565b604051906102e082018281106001600160401b0382111761039357604052565b6040519061041d82610378565b565b60405190606082018281106001600160401b0382111761039357604052565b6040519061028082018281106001600160401b0382111761039357604052565b9060405161046b81610378565b6020600182946001600160401b0381541684520154910152565b3461023257602036600319011261023257600435601954811015610232576104ae608091610322565b506104f98154916104c960016001600160401b03920161045e565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b3461023257600080600319360112610578576080906040906060825161052081610398565b82815282602082015282848201520152805161053b81610398565b6005549182825260065460208301908152600754908284019182526060600854940193845282519485525160208501525190830152516060820152f35b80fd5b34610232576000366003190112610232576060604051600181526000602082015260006040820152f35b346102325760003660031901126102325760206001600160401b0360185416604051908152f35b34610232576000366003190112610232576017546040516001600160a01b039091168152602090f35b34610232576000366003190112610232576020600254604051908152f35b602435906001600160401b038216820361023257565b6101009060031901126102325760405190610643826103b3565b816004356001600160401b0381168103610232578152610661610613565b602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e060e435910152565b60409061010319011261023257604051906106b282610378565b610104358252610124356020830152565b60409061014319011261023257604051906106dd82610378565b610144358252610164356020830152565b604090610183190112610232576040519061070882610378565b6101843582526101a4356020830152565b6040906101c3190112610232576040519061073382610378565b6101c43582526101e4356020830152565b604090610203190112610232576040519061075e82610378565b610204358252610224356020830152565b604090610243190112610232576040519061078982610378565b610244358252610264356020830152565b60409061028319011261023257604051906107b482610378565b6102843582526102a4356020830152565b6040906102c319011261023257604051906107df82610378565b6102c43582526102e4356020830152565b604090610303190112610232576040519061080a82610378565b610304358252610324356020830152565b604090610343190112610232576040519061083582610378565b610344358252610364356020830152565b604090610383190112610232576040519061086082610378565b6103843582526103a4356020830152565b6040906103c3190112610232576040519061088b82610378565b6103c43582526103e4356020830152565b60409061040319011261023257604051906108b682610378565b610404358252610424356020830152565b3461023257610580366003190112610232576108e236610629565b6104803661010319011261023257610a1e906108fc6103f0565b9061090636610698565b8252610911366106c3565b602083015261091f366106ee565b604083015261092d36610719565b606083015261093b36610744565b60808301526109493661076f565b60a08301526109573661079a565b60c0830152610965366107c5565b60e0830152610973366107f0565b6101008301526109823661081b565b61012083015261099136610846565b6101408301526109a036610871565b6101608301526109af3661089c565b610180830152610444356101a0830152610464356101c0830152610484356101e08301526104a4356102008301526104c4356102208301526104e4356102408301526105043561026083015261052435610280830152610544356102a0830152610564356102c0830152611441565b005b91909160e0806101008301946001600160401b03808251168552602082015116602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b3461023257600036600319011261023257610a976115c4565b50610afd604051610aa7816103b3565b6009546001600160401b0390818116835260401c166020820152600a546040820152600b546060820152600c546080820152600d5460a0820152600e5460c0820152600f5460e082015260405191829182610a20565b0390f35b6001600160401b03811161039357601f01601f191660200190565b60408060031936011261023257610b3161021c565b6024356001600160401b038111610232573660238201121561023257806004013590610b5c82610b01565b91610b69855193846103cf565b80835260209136602483830101116102325781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610cbf575b50610cae579080600492610bd4611b01565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610c7f575b5050610c44578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612cd38339815191528193929303610c6657610a1e8383612b37565b8351632a87526960e21b81526004810191909152602490fd5b610c9f929350803d10610ca7575b610c9781836103cf565b81019061248e565b903880610c1e565b503d610c8d565b845163703e46dd60e11b8152600490fd5b905081600080516020612cd38339815191525416141538610bc2565b34610232576000366003190112610232577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610d34576020604051600080516020612cd38339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610232576000366003190112610232576020600154604051908152f35b346102325760008060031936011261057857610d7e611b01565b60175460ff8160a01c166000146102e8576001600160a81b0319166017557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b346102325760008060031936011261057857610ddd611b01565b600080516020612cb383398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610232576000366003190112610232576020600054604051908152f35b6004359063ffffffff8216820361023257565b949198979693909260e0969361010087019a6001600160401b03809216885216602087015260408601526060850152608084015260a083015260c08201520152565b346102325760203660031901126102325763ffffffff610ebf610e4c565b1660005260046020526040600020805490610afd6001600160401b039160018101549060028101546003820154600483015491600660058501549401549460405198888a998260401c16911689610e5f565b3461023257600036600319011261023257610f2a6115c4565b50610afd610f36611602565b60405191829182610a20565b34610232576020366003190112610232576040610f606004356116c0565b6104f982518092602080916001600160401b0381511684520151910152565b3461023257600036600319011261023257600080516020612cb3833981519152546040516001600160a01b039091168152602090f35b34610232576101c036600319011261023257610fd036610629565b6080366101031901126102325760405190610fea82610398565b6101043582526101243560208301526101443560408301526101643560608301526101843563ffffffff8116810361023257610a1e92611028610237565b92611783565b3461023257602036600319011261023257611047610e4c565b61104f611b01565b63ffffffff808216610e1081109182156110a1575b505061108f576017805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b60175460a81c16101590503880611064565b34610232576000366003190112610232576010546001600160401b03610afd60115460125460135460145490601554926016549460405198888a998260401c16911689610e5f565b3461023257600036600319011261023257608060055460065460075460085491604051938452602084015260408301526060820152f35b346102325761010036600319011261023257602061115761115236610629565b611a48565b604051908152f35b3461023257600036600319011261023257604080519061117e82610378565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106111c95784604081866000838284010152601f80199101168101030190f35b85810183015185820183015282016111a7565b3461023257600036600319011261023257602060ff60175460a01c166040519015158152f35b3461023257600036600319011261023257602063ffffffff60175460a81c16604051908152f35b34610232576000366003190112610232576020600354604051908152f35b34610232576000366003190112610232576009546001600160401b03610afd600a54600b54600c54600d5490600e5492600f549460405198888a998260401c16911689610e5f565b3461023257604036600319011261023257600435601954438211801561138a575b611317576000916112c260009261169f565b916112e46112d86018546001600160401b031690565b6001600160401b031690565b925b8115611329575b509091501561131757611306610afd92602435926116b3565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b826113476112d861133984610322565b50546001600160401b031690565b1115611370575b6002811061136b5783811461136b5761136690611a80565b6112e6565b6112ed565b93505060016113846112d861133986610322565b9361134e565b50600381106112b0565b3461023257602036600319011261023257610a1e6113b061021c565b6113b8611b01565b611a8d565b34610232576000366003190112610232576020601954604051908152f35b60e0906001600160401b038151166010549067ffffffffffffffff60401b602084015160401b16916001600160801b031916171760105560408101516011556060810151601255608081015160135560a081015160145560c08101516015550151601655565b9060175460ff8160a01c1690816115b0575b5061159e5781516001600160401b031661147e6112d861147161165c565b516001600160401b031690565b6001600160401b0380921611801590611567575b611555577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae69061150460408501936114ca8551611b3a565b6114d76060870151611b3a565b6114e46080870151611b3a565b6114f160a0870151611b3a565b6114fe60c0870151611b3a565b8561209d565b61150d846113db565b61151c84824216834316612345565b611541602061153286516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b0316816115956112d8602061158761165c565b01516001600160401b031690565b91161115611492565b6040516301474c8f60e71b8152600490fd5b6001600160a01b0316331415905038611453565b604051906115d1826103b3565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b6040519061160f826103b3565b816010546001600160401b0390818116835260401c16602082015260115460408201526012546060820152601354608082015260145460a082015260155460c082015260e0601654910152565b6116646115c4565b5061166d611602565b90565b6040519061167d82610378565b60006020838281520152565b634e487b7160e01b600052601160045260246000fd5b6000198101919082116116ae57565b611689565b919082039182116116ae57565b6116c8611670565b50601954906116de6116d98361169f565b610322565b50906116f86112d86001809401546001600160401b031690565b811015611771576117146112d86018546001600160401b031690565b83811061173657505050600161172f6116d961166d9361169f565b500161045e565b816117566112d88561174785610322565b5001546001600160401b031690565b11611762578201611714565b61166d935061172f9150610322565b604051631856a49960e21b8152600490fd5b929091600080516020612cf38339815191529283549460ff8660401c1615956001600160401b03811680159081611884575b600114908161187a575b159081611871575b5061185f5767ffffffffffffffff19166001179094556117eb938561183a5761188c565b6117f157565b600080516020612cf3833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1565b600080516020612cf3833981519152805460ff60401b1916600160401b17905561188c565b60405163f92ee8a960e01b8152600490fd5b905015386117c7565b303b1591506117bf565b8891506117b5565b91926118a29061189a612bde565b6113b8612bde565b6118aa612bde565b6001600160401b0390816118c584516001600160401b031690565b1615801590611a29575b8015611a1d575b8015611a11575b8015611a05575b80156119f9575b6119e75761041d936119826119b0926119648660e0906001600160401b038151166009549067ffffffffffffffff60401b602084015160401b16916001600160801b03191617176009556040810151600a556060810151600b556080810151600c5560a0810151600d5560c0810151600e550151600f55565b80516005556020810151600655604081015160075560600151600855565b61198b846113db565b6017805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b6119dc6119bc83611a48565b806000556119d760e0850151916119d283600155565b600255565b600355565b804216904316612345565b6040516350dd03f760e11b8152600490fd5b5060e0830151156118eb565b5060c0830151156118e4565b5060a0830151156118dd565b506080830151156118d6565b50611a416112d860208501516001600160401b031690565b15156118cf565b60808101519060c060a082015191015160405191602083019384526040830152606082015260608152611a7a81610398565b51902090565b80156116ae576000190190565b6001600160a01b03908116908115611ae857600080516020612cb383398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612cb3833981519152546001600160a01b03163303611b2257565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611b6357565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103935760405260088252610100366020840137565b80511561035d5760200190565b80516001101561035d5760400190565b80516002101561035d5760600190565b80516003101561035d5760800190565b80516004101561035d5760a00190565b80516005101561035d5760c00190565b80516006101561035d5760e00190565b80516007101561035d576101000190565b90816020910312610232575180151581036102325790565b90815180825260208080930193019160005b828110611c8b575050505090565b835185529381019392810192600101611c7d565b61046090611cb883825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611d16610100928386019060208091805184520151910152565b60a081015191611d36610140938487019060208091805184520151910152565b60c082015192611d56610180948588019060208091805184520151910152565b60e083015191611d766101c0938489019060208091805184520151910152565b830151611d93610200918289019060208091805184520151910152565b61012084015191611db461024093848a019060208091805184520151910152565b84015192611dd261028094858a019060208091805184520151910152565b611e0d61016086015196611df66102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b93929061208961041d936104e09261207a6102606109609280518b52602081015160208c0152611eb6604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c01526120648b611f0260a08401516101008093019060208091805184520151910152565b6120358d6103c060c0860151611f28610140918285019060208091805184520151910152565b61200860e088015195611f4b610180978887019060208091805184520151910152565b880151611f686101c0918287019060208091805184520151910152565b611fd96101208a015193611f8c610200958689019060208091805184520151910152565b8a015197611faa610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611c6b565b940190611c9f565b6040513d6000823e3d90fd5b6020906120a86125a9565b60606120b2611ba8565b926001546120bf85611bd5565b526120d46112d882516001600160401b031690565b6120dd85611be2565b526120f46112d8868301516001600160401b031690565b6120fd85611bf2565b52604081015161210c85611c02565b52015161211883611c12565b5260135461212583611c22565b5260145461213283611c32565b5260155461213f83611c42565b5261215e6040519485938493630c76545d60e21b855260048501611e74565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af49081156121cf576000916121a0575b501561218e57565b6040516309bde33960e01b8152600490fd5b6121c2915060203d6020116121c8575b6121ba81836103cf565b810190611c53565b38612186565b503d6121b0565b612091565b6001600160401b0391821690821603919082116116ae57565b906122045760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146116ae5760010190565b601954600160401b81101561039357600181018060195581101561035d57602060037f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9697926019600052029261233e6040857f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c969501926001600160401b03936122d28583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96968601906001600160401b03166001600160401b0319825416179055565b0151910155565b90916123b461041d93601954801515908161241a575b506123be575b604061237760208501516001600160401b031690565b930151612394612385610410565b6001600160401b039095168552565b60208401526123a461238561041f565b6001600160401b03166020840152565b6040820152612232565b6123dc6123d66116d96018546001600160401b031690565b906121ed565b6124156123f96123f46018546001600160401b031690565b61221a565b6001600160401b03166001600160401b03196018541617601855565b612361565b61245d915061242e6116d961243f9261169f565b505460401c6001600160401b031690565b61245761242e6116d96018546001600160401b031690565b906121d4565b6001600160401b0361248461247b60175463ffffffff9060a81c1690565b63ffffffff1690565b911610153861235b565b90816020910312610232575190565b6124a561043e565b9060008252600060208301526124b9611670565b60408301526124c6611670565b60608301526124d3611670565b60808301526124e0611670565b60a08301526124ed611670565b60c08301526124fa611670565b60e0830152612507611670565b610100830152612515611670565b610120830152612523611670565b610140830152612531611670565b61016083015261253f611670565b61018083015261254d611670565b6101a083015261255b611670565b6101c0830152612569611670565b6101e0830152612577611670565b610200830152612585611670565b610220830152612593611670565b6102408301526125a1611670565b610260830152565b6125b161249d565b906210000082527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d560206008818501527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c81604086017f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b338151525101527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e97081606086017f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db8151525101527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d81608086017f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b998151525101527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df600938160a086017f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a58066258151525101527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde288160c086017f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a98151525101527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc038160e086017f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b596938151525101527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad8161010086017f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e78151525101527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea170318161012086017f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e48151525101527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db70368161014086017f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae72488151525101527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e84158161016086017f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e56198151525101527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a38161018086017f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc88151525101527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c816101a086017f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc8151525101527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd5816101c086017f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b408151525101527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd3816101e086017f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc58151525101527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc8161020086017f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa48151525101527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e8161022086017f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a297822268151525101527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd48161024086017f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab261423981515251015261026084017f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82815152510152565b90813b15612bbd57600080516020612cd383398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612ba257612b9f91612c0d565b50565b505034612bab57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612cf38339815191525460401c1615612bfb57565b604051631afcd79f60e31b8152600490fd5b60008061166d93602081519101845af43d15612c4b573d91612c2e83610b01565b92612c3c60405194856103cf565b83523d6000602085013e612c4f565b6060915b90612c765750805115612c6457805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612ca9575b612c87575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612c7f56fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/src/light_client.rs b/contract-bindings/src/light_client.rs index 341d79c31..2924e7ea0 100644 --- a/contract-bindings/src/light_client.rs +++ b/contract-bindings/src/light_client.rs @@ -176,6 +176,45 @@ pub mod light_client { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), + ( + ::std::borrow::ToOwned::to_owned("genesisStakeState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("genesisStakeState"), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::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"), + ), + }, + ::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"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("genesisState"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -270,6 +309,27 @@ pub mod light_client { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), + ( + ::std::borrow::ToOwned::to_owned("getGenesisStakeState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("getGenesisStakeState",), + 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(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.StakeState",), + ), + },], + 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 { @@ -395,6 +455,20 @@ pub mod light_client { ), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("_genesisStakeState",), + kind: ::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), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "struct LightClient.StakeState", + ), + ), + }, ::ethers::core::abi::ethabi::Param { name: ::std::borrow::ToOwned::to_owned( "_stateHistoryRetentionPeriod", @@ -1257,6 +1331,22 @@ pub mod light_client { .method_hash([202, 111, 232, 85], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `genesisStakeState` (0xa9a9c9f5) function + pub fn genesis_stake_state( + &self, + ) -> ::ethers::contract::builders::ContractCall< + M, + ( + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ), + > { + self.0 + .method_hash([169, 169, 201, 245], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `genesisState` (0xd24d933d) function pub fn genesis_state( &self, @@ -1285,6 +1375,14 @@ pub mod light_client { .method_hash([130, 208, 127, 243], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `getGenesisStakeState` (0x0c693a22) function + pub fn get_genesis_stake_state( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([12, 105, 58, 34], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `getGenesisState` (0x4847ae5d) function pub fn get_genesis_state( &self, @@ -1316,17 +1414,23 @@ pub mod light_client { .method_hash([13, 142, 110, 44], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `initialize` (0xa244d596) function + ///Calls the contract's `initialize` (0x8ed3e045) function pub fn initialize( &self, genesis: LightClientState, + genesis_stake_state: StakeState, state_history_retention_period: u32, owner: ::ethers::core::types::Address, ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash( - [162, 68, 213, 150], - (genesis, state_history_retention_period, owner), + [142, 211, 224, 69], + ( + genesis, + genesis_stake_state, + state_history_retention_period, + owner, + ), ) .expect("method not found (this should never happen)") } @@ -2619,6 +2723,21 @@ pub mod light_client { )] #[ethcall(name = "frozenThreshold", abi = "frozenThreshold()")] pub struct FrozenThresholdCall; + ///Container type for all input parameters for the `genesisStakeState` function with signature `genesisStakeState()` and selector `0xa9a9c9f5` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "genesisStakeState", abi = "genesisStakeState()")] + pub struct GenesisStakeStateCall; ///Container type for all input parameters for the `genesisState` function with signature `genesisState()` and selector `0xd24d933d` #[derive( Clone, @@ -2649,6 +2768,21 @@ pub mod light_client { )] #[ethcall(name = "getFinalizedState", abi = "getFinalizedState()")] pub struct GetFinalizedStateCall; + ///Container type for all input parameters for the `getGenesisStakeState` function with signature `getGenesisStakeState()` and selector `0x0c693a22` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "getGenesisStakeState", abi = "getGenesisStakeState()")] + pub struct GetGenesisStakeStateCall; ///Container type for all input parameters for the `getGenesisState` function with signature `getGenesisState()` and selector `0x4847ae5d` #[derive( Clone, @@ -2711,7 +2845,7 @@ pub mod light_client { )] #[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` + ///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256),uint32,address)` and selector `0x8ed3e045` #[derive( Clone, ::ethers::contract::EthCall, @@ -2726,10 +2860,11 @@ pub mod light_client { )] #[ethcall( name = "initialize", - abi = "initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),uint32,address)" + abi = "initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256),uint32,address)" )] pub struct InitializeCall { pub genesis: LightClientState, + pub genesis_stake_state: StakeState, pub state_history_retention_period: u32, pub owner: ::ethers::core::types::Address, } @@ -3030,8 +3165,10 @@ pub mod light_client { FinalizedState(FinalizedStateCall), FrozenStakeTableCommitment(FrozenStakeTableCommitmentCall), FrozenThreshold(FrozenThresholdCall), + GenesisStakeState(GenesisStakeStateCall), GenesisState(GenesisStateCall), GetFinalizedState(GetFinalizedStateCall), + GetGenesisStakeState(GetGenesisStakeStateCall), GetGenesisState(GetGenesisStateCall), GetHotShotCommitment(GetHotShotCommitmentCall), GetStateHistoryCount(GetStateHistoryCountCall), @@ -3090,6 +3227,11 @@ pub mod light_client { { return Ok(Self::FrozenThreshold(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::GenesisStakeState(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::GenesisState(decoded)); @@ -3099,6 +3241,11 @@ pub mod light_client { { return Ok(Self::GetFinalizedState(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::GetGenesisStakeState(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -3220,8 +3367,12 @@ pub mod light_client { ::ethers::core::abi::AbiEncode::encode(element) } Self::FrozenThreshold(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::GenesisStakeState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::GetGenesisStakeState(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::GetGenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GetHotShotCommitment(element) => { ::ethers::core::abi::AbiEncode::encode(element) @@ -3280,8 +3431,10 @@ pub mod light_client { Self::FinalizedState(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::GenesisStakeState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisState(element) => ::core::fmt::Display::fmt(element, f), Self::GetFinalizedState(element) => ::core::fmt::Display::fmt(element, f), + Self::GetGenesisStakeState(element) => ::core::fmt::Display::fmt(element, f), Self::GetGenesisState(element) => ::core::fmt::Display::fmt(element, f), Self::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f), Self::GetStateHistoryCount(element) => ::core::fmt::Display::fmt(element, f), @@ -3339,6 +3492,11 @@ pub mod light_client { Self::FrozenThreshold(value) } } + impl ::core::convert::From for LightClientCalls { + fn from(value: GenesisStakeStateCall) -> Self { + Self::GenesisStakeState(value) + } + } impl ::core::convert::From for LightClientCalls { fn from(value: GenesisStateCall) -> Self { Self::GenesisState(value) @@ -3349,6 +3507,11 @@ pub mod light_client { Self::GetFinalizedState(value) } } + impl ::core::convert::From for LightClientCalls { + fn from(value: GetGenesisStakeStateCall) -> Self { + Self::GetGenesisStakeState(value) + } + } impl ::core::convert::From for LightClientCalls { fn from(value: GetGenesisStateCall) -> Self { Self::GetGenesisState(value) @@ -3538,6 +3701,25 @@ pub mod light_client { Hash, )] pub struct FrozenThresholdReturn(pub ::ethers::core::types::U256); + ///Container type for all return fields from the `genesisStakeState` function with signature `genesisStakeState()` and selector `0xa9a9c9f5` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct GenesisStakeStateReturn { + pub threshold: ::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, + } ///Container type for all return fields from the `genesisState` function with signature `genesisState()` and selector `0xd24d933d` #[derive( Clone, @@ -3575,6 +3757,20 @@ pub mod light_client { Hash, )] pub struct GetFinalizedStateReturn(pub LightClientState); + ///Container type for all return fields from the `getGenesisStakeState` function with signature `getGenesisStakeState()` and selector `0x0c693a22` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct GetGenesisStakeStateReturn(pub StakeState); ///Container type for all return fields from the `getGenesisState` function with signature `getGenesisState()` and selector `0x4847ae5d` #[derive( Clone, diff --git a/contract-bindings/src/light_client_mock.rs b/contract-bindings/src/light_client_mock.rs index a1a8345e6..5df10708c 100644 --- a/contract-bindings/src/light_client_mock.rs +++ b/contract-bindings/src/light_client_mock.rs @@ -32,6 +32,18 @@ pub mod light_client_mock { ::std::borrow::ToOwned::to_owned("struct LightClient.LightClientState",), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("genesisStakeState"), + kind: ::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), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("struct LightClient.StakeState",), + ), + }, ::ethers::core::abi::ethabi::Param { name: ::std::borrow::ToOwned::to_owned("maxHistorySeconds"), kind: ::ethers::core::abi::ethabi::ParamType::Uint(32usize), @@ -200,6 +212,45 @@ pub mod light_client_mock { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), + ( + ::std::borrow::ToOwned::to_owned("genesisStakeState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("genesisStakeState"), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::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"), + ), + }, + ::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"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("genesisState"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -294,6 +345,27 @@ pub mod light_client_mock { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), + ( + ::std::borrow::ToOwned::to_owned("getGenesisStakeState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("getGenesisStakeState",), + 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(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.StakeState",), + ), + },], + 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 { @@ -419,6 +491,20 @@ pub mod light_client_mock { ), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("_genesisStakeState",), + kind: ::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), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "struct LightClient.StakeState", + ), + ), + }, ::ethers::core::abi::ethabi::Param { name: ::std::borrow::ToOwned::to_owned( "_stateHistoryRetentionPeriod", @@ -1363,6 +1449,22 @@ pub mod light_client_mock { .method_hash([202, 111, 232, 85], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `genesisStakeState` (0xa9a9c9f5) function + pub fn genesis_stake_state( + &self, + ) -> ::ethers::contract::builders::ContractCall< + M, + ( + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ), + > { + self.0 + .method_hash([169, 169, 201, 245], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `genesisState` (0xd24d933d) function pub fn genesis_state( &self, @@ -1391,6 +1493,14 @@ pub mod light_client_mock { .method_hash([130, 208, 127, 243], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `getGenesisStakeState` (0x0c693a22) function + pub fn get_genesis_stake_state( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([12, 105, 58, 34], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `getGenesisState` (0x4847ae5d) function pub fn get_genesis_state( &self, @@ -1422,17 +1532,23 @@ pub mod light_client_mock { .method_hash([13, 142, 110, 44], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `initialize` (0xa244d596) function + ///Calls the contract's `initialize` (0x8ed3e045) function pub fn initialize( &self, genesis: LightClientState, + genesis_stake_state: StakeState, state_history_retention_period: u32, owner: ::ethers::core::types::Address, ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash( - [162, 68, 213, 150], - (genesis, state_history_retention_period, owner), + [142, 211, 224, 69], + ( + genesis, + genesis_stake_state, + state_history_retention_period, + owner, + ), ) .expect("method not found (this should never happen)") } @@ -2762,6 +2878,21 @@ pub mod light_client_mock { )] #[ethcall(name = "frozenThreshold", abi = "frozenThreshold()")] pub struct FrozenThresholdCall; + ///Container type for all input parameters for the `genesisStakeState` function with signature `genesisStakeState()` and selector `0xa9a9c9f5` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "genesisStakeState", abi = "genesisStakeState()")] + pub struct GenesisStakeStateCall; ///Container type for all input parameters for the `genesisState` function with signature `genesisState()` and selector `0xd24d933d` #[derive( Clone, @@ -2792,6 +2923,21 @@ pub mod light_client_mock { )] #[ethcall(name = "getFinalizedState", abi = "getFinalizedState()")] pub struct GetFinalizedStateCall; + ///Container type for all input parameters for the `getGenesisStakeState` function with signature `getGenesisStakeState()` and selector `0x0c693a22` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "getGenesisStakeState", abi = "getGenesisStakeState()")] + pub struct GetGenesisStakeStateCall; ///Container type for all input parameters for the `getGenesisState` function with signature `getGenesisState()` and selector `0x4847ae5d` #[derive( Clone, @@ -2854,7 +3000,7 @@ pub mod light_client_mock { )] #[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` + ///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256),uint32,address)` and selector `0x8ed3e045` #[derive( Clone, ::ethers::contract::EthCall, @@ -2869,10 +3015,11 @@ pub mod light_client_mock { )] #[ethcall( name = "initialize", - abi = "initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),uint32,address)" + abi = "initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256),uint32,address)" )] pub struct InitializeCall { pub genesis: LightClientState, + pub genesis_stake_state: StakeState, pub state_history_retention_period: u32, pub owner: ::ethers::core::types::Address, } @@ -3245,8 +3392,10 @@ pub mod light_client_mock { FinalizedState(FinalizedStateCall), FrozenStakeTableCommitment(FrozenStakeTableCommitmentCall), FrozenThreshold(FrozenThresholdCall), + GenesisStakeState(GenesisStakeStateCall), GenesisState(GenesisStateCall), GetFinalizedState(GetFinalizedStateCall), + GetGenesisStakeState(GetGenesisStakeStateCall), GetGenesisState(GetGenesisStateCall), GetHotShotCommitment(GetHotShotCommitmentCall), GetStateHistoryCount(GetStateHistoryCountCall), @@ -3309,6 +3458,11 @@ pub mod light_client_mock { { return Ok(Self::FrozenThreshold(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::GenesisStakeState(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::GenesisState(decoded)); @@ -3318,6 +3472,11 @@ pub mod light_client_mock { { return Ok(Self::GetFinalizedState(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::GetGenesisStakeState(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -3458,8 +3617,12 @@ pub mod light_client_mock { ::ethers::core::abi::AbiEncode::encode(element) } Self::FrozenThreshold(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::GenesisStakeState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::GetGenesisStakeState(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::GetGenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GetHotShotCommitment(element) => { ::ethers::core::abi::AbiEncode::encode(element) @@ -3524,8 +3687,10 @@ pub mod light_client_mock { Self::FinalizedState(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::GenesisStakeState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisState(element) => ::core::fmt::Display::fmt(element, f), Self::GetFinalizedState(element) => ::core::fmt::Display::fmt(element, f), + Self::GetGenesisStakeState(element) => ::core::fmt::Display::fmt(element, f), Self::GetGenesisState(element) => ::core::fmt::Display::fmt(element, f), Self::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f), Self::GetStateHistoryCount(element) => ::core::fmt::Display::fmt(element, f), @@ -3587,6 +3752,11 @@ pub mod light_client_mock { Self::FrozenThreshold(value) } } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: GenesisStakeStateCall) -> Self { + Self::GenesisStakeState(value) + } + } impl ::core::convert::From for LightClientMockCalls { fn from(value: GenesisStateCall) -> Self { Self::GenesisState(value) @@ -3597,6 +3767,11 @@ pub mod light_client_mock { Self::GetFinalizedState(value) } } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: GetGenesisStakeStateCall) -> Self { + Self::GetGenesisStakeState(value) + } + } impl ::core::convert::From for LightClientMockCalls { fn from(value: GetGenesisStateCall) -> Self { Self::GetGenesisState(value) @@ -3806,6 +3981,25 @@ pub mod light_client_mock { Hash, )] pub struct FrozenThresholdReturn(pub ::ethers::core::types::U256); + ///Container type for all return fields from the `genesisStakeState` function with signature `genesisStakeState()` and selector `0xa9a9c9f5` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct GenesisStakeStateReturn { + pub threshold: ::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, + } ///Container type for all return fields from the `genesisState` function with signature `genesisState()` and selector `0xd24d933d` #[derive( Clone, @@ -3843,6 +4037,20 @@ pub mod light_client_mock { Hash, )] pub struct GetFinalizedStateReturn(pub LightClientState); + ///Container type for all return fields from the `getGenesisStakeState` function with signature `getGenesisStakeState()` and selector `0x0c693a22` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct GetGenesisStakeStateReturn(pub StakeState); ///Container type for all return fields from the `getGenesisState` function with signature `getGenesisState()` and selector `0x4847ae5d` #[derive( Clone, diff --git a/contract-bindings/src/shared_types.rs b/contract-bindings/src/shared_types.rs index 11200e7b1..c2531a1ed 100644 --- a/contract-bindings/src/shared_types.rs +++ b/contract-bindings/src/shared_types.rs @@ -128,3 +128,22 @@ pub struct LightClientState { pub stake_table_amount_comm: ::ethers::core::types::U256, pub threshold: ::ethers::core::types::U256, } +///`StakeState(uint256,uint256,uint256,uint256)` +#[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, +)] +pub struct StakeState { + pub threshold: ::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, +} diff --git a/contracts/rust/adapter/src/light_client.rs b/contracts/rust/adapter/src/light_client.rs index 7eda2921a..d84dae998 100644 --- a/contracts/rust/adapter/src/light_client.rs +++ b/contracts/rust/adapter/src/light_client.rs @@ -9,7 +9,7 @@ use ethers::{ prelude::{AbiError, EthAbiCodec, EthAbiType}, types::U256, }; -use hotshot_types::light_client::{CircuitField, LightClientState, PublicInput}; +use hotshot_types::light_client::{CircuitField, LightClientState, PublicInput, StakeState}; /// Intermediate representations for `LightClientState` in Solidity #[derive(Clone, Debug, EthAbiType, EthAbiCodec, PartialEq)] @@ -136,9 +136,107 @@ impl From for contract_bindings::light_client::LightClie } } +/// Parsed Stake State +pub struct ParsedStakeState { + pub threshold: U256, + pub bls_key_comm: U256, + pub schnorr_key_comm: U256, + pub amount_comm: U256, +} + +impl ParsedStakeState { + /// Return a dummy new genesis stake state 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 { + threshold: U256::from(1), + bls_key_comm: U256::from(123), + schnorr_key_comm: U256::from(123), + amount_comm: U256::from(20), + } + } +} + +impl FromStr for ParsedStakeState { + type Err = AbiError; + fn from_str(s: &str) -> Result { + let parsed: (Self,) = AbiDecode::decode_hex(s)?; + Ok(parsed.0) + } +} + +impl From for ParsedStakeState { + fn from(pi: PublicInput) -> Self { + Self { + threshold: field_to_u256(pi.threshold()), + bls_key_comm: field_to_u256(pi.qc_key_comm()), + schnorr_key_comm: field_to_u256(pi.state_key_comm()), + amount_comm: field_to_u256(pi.stake_amount_comm()), + } + } +} + +impl From for ParsedStakeState { + fn from(state: contract_bindings::light_client::StakeState) -> Self { + Self { + threshold: state.threshold, + bls_key_comm: state.stake_table_bls_key_comm, + schnorr_key_comm: state.stake_table_schnorr_key_comm, + amount_comm: state.stake_table_amount_comm, + } + } +} + +impl From for PublicInput { + fn from(s: ParsedStakeState) -> Self { + let fields = vec![ + u256_to_field(s.threshold), + u256_to_field(s.bls_key_comm), + u256_to_field(s.schnorr_key_comm), + u256_to_field(s.amount_comm), + ]; + Self::from(fields) + } +} + +impl From<(U256, U256, U256, U256)> for ParsedStakeState { + fn from(s: (U256, U256, U256, U256)) -> Self { + Self { + threshold: s.7, + bls_key_comm: s.4, + schnorr_key_comm: s.5, + amount_comm: s.6, + } + } +} + +impl From for StakeState { + fn from(s: ParsedStakeState) -> Self { + Self { + stake_table_comm: ( + u256_to_field(s.bls_key_comm), + u256_to_field(s.schnorr_key_comm), + u256_to_field(s.amount_comm), + ), + threshold: u256_to_field(s.threshold), + } + } +} + +impl From for contract_bindings::light_client::StakeState { + fn from(s: ParsedStakeState) -> Self { + // exactly the same struct with same field types, safe to transmute + unsafe { std::mem::transmute(s) } + } +} + /// `LightClientConstructorArgs` holds the arguments required to initialize a light client contract. pub struct LightClientConstructorArgs { pub light_client_state: ParsedLightClientState, + pub stake_state: ParsedStakeState, pub max_history_seconds: u32, } @@ -150,6 +248,7 @@ impl LightClientConstructorArgs { pub fn dummy_genesis() -> Self { Self { light_client_state: ParsedLightClientState::dummy_genesis(), + stake_state: ParsedStakeState::dummy_genesis(), max_history_seconds: 864000, } } @@ -164,6 +263,7 @@ impl Tokenize for LightClientConstructorArgs { fn into_tokens(self) -> Vec { vec![ ethers::abi::Token::Tuple(self.light_client_state.into_tokens()), + ethers::abi::Token::Tuple(self.stake_state.into_tokens()), ethers::abi::Token::Uint(U256::from(self.max_history_seconds)), ] } diff --git a/contracts/rust/diff-test/src/main.rs b/contracts/rust/diff-test/src/main.rs index e92cfd3ce..648d38c3b 100644 --- a/contracts/rust/diff-test/src/main.rs +++ b/contracts/rust/diff-test/src/main.rs @@ -486,6 +486,7 @@ fn main() { let mut ledger = MockLedger::init(pp, num_init_validators as usize); let mut new_states: Vec = vec![]; + let mut new_stake_states: Vec = vec![]; let mut proofs: Vec = vec![]; for i in 1..block_per_epoch + 2 { // only update stake table at the last block, as it would only take effect in next epoch anyway. diff --git a/contracts/script/LightClient.s.sol b/contracts/script/LightClient.s.sol index 6cc4890ea..de9a6fe39 100644 --- a/contracts/script/LightClient.s.sol +++ b/contracts/script/LightClient.s.sol @@ -22,7 +22,14 @@ contract DeployLightClientContractScript is Script { (LC.LightClientState memory state,,) = abi.decode(result, (LC.LightClientState, bytes32, bytes32)); - return deployContract(state, stateHistoryRetentionPeriod); + LC.StakeState memory stakeState = LC.StakeState( + state.threshold, + state.stakeTableBlsKeyComm, + state.stakeTableSchnorrKeyComm, + state.stakeTableAmountComm + ); + + return deployContract(state, stakeState, stateHistoryRetentionPeriod); } function runDemo(uint32 stateHistoryRetentionPeriod) @@ -34,18 +41,25 @@ contract DeployLightClientContractScript is Script { bytes memory result = vm.ffi(cmds); LC.LightClientState memory state = abi.decode(result, (LC.LightClientState)); + LC.StakeState memory stakeState = LC.StakeState( + state.threshold, + state.stakeTableBlsKeyComm, + state.stakeTableSchnorrKeyComm, + state.stakeTableAmountComm + ); - return deployContract(state, stateHistoryRetentionPeriod); + return deployContract(state, stakeState, stateHistoryRetentionPeriod); } /// @notice deploys the impl, proxy & initializes the impl /// @return proxyAddress The address of the proxy /// @return admin The address of the admin - function deployContract(LC.LightClientState memory state, uint32 stateHistoryRetentionPeriod) - private - returns (address payable proxyAddress, address admin, LC.LightClientState memory) - { + function deployContract( + LC.LightClientState memory state, + LC.StakeState memory stakeState, + uint32 stateHistoryRetentionPeriod + ) private returns (address payable proxyAddress, address admin, LC.LightClientState memory) { string memory seedPhrase = vm.envString("MNEMONIC"); (admin,) = deriveRememberKey(seedPhrase, 0); vm.startBroadcast(admin); @@ -54,8 +68,9 @@ contract DeployLightClientContractScript is Script { // Encode the initializer function call bytes memory data = abi.encodeWithSignature( - "initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),uint32,address)", + "initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256),uint32,address)", state, + stakeState, stateHistoryRetentionPeriod, admin ); diff --git a/contracts/script/LightClientWithDefender.s.sol b/contracts/script/LightClientWithDefender.s.sol index 80aa41306..629076b32 100644 --- a/contracts/script/LightClientWithDefender.s.sol +++ b/contracts/script/LightClientWithDefender.s.sol @@ -49,9 +49,18 @@ contract LightClientDefenderDeployScript is Script { opts.defender.useDefenderDeploy = true; opts.defender.salt = bytes32(abi.encodePacked(contractSalt)); + LC.StakeState memory stakeState = LC.StakeState( + state.threshold, + state.stakeTableBlsKeyComm, + state.stakeTableSchnorrKeyComm, + state.stakeTableAmountComm + ); + proxy = Upgrades.deployUUPSProxy( contractName, - abi.encodeCall(LC.initialize, (state, stateHistoryRetentionPeriod, multisig)), + abi.encodeCall( + LC.initialize, (state, stakeState, stateHistoryRetentionPeriod, multisig) + ), opts ); diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol index d7c711423..e9eae5898 100644 --- a/contracts/src/LightClient.sol +++ b/contracts/src/LightClient.sol @@ -56,6 +56,9 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @notice mapping to store light client states in order to simplify upgrades mapping(uint32 index => LightClientState value) public states; + /// @notice genesis stake commitment + StakeState public genesisStakeState; + /// @notice genesis block commitment LightClientState public genesisState; @@ -107,6 +110,18 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { uint256 threshold; } + /// @notice The finalized HotShot Stake state (as the digest of the entire HotShot state) + /// @param threshold The (stake-weighted) quorum threshold for a QC to be considered as valid + /// @param stakeTableBlsKeyComm The commitment to the BlsVerKey column of the stake table + /// @param stakeTableSchnorrKeyComm The commitment to the SchnorrVerKey column of the table + /// @param stakeTableAmountComm The commitment to the stake amount column of the stake table + struct StakeState { + uint256 threshold; + BN254.ScalarField stakeTableBlsKeyComm; + BN254.ScalarField stakeTableSchnorrKeyComm; + BN254.ScalarField stakeTableAmountComm; + } + /// @notice Simplified HotShot commitment struct /// @param blockHeight The block height of the latest finalized HotShot block /// @param blockCommRoot The merkle root of historical block commitments (BN254::ScalarField) @@ -168,12 +183,13 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @param owner The address of the contract owner function initialize( LightClientState memory _genesis, + StakeState memory _genesisStakeState, uint32 _stateHistoryRetentionPeriod, address owner ) public initializer { __Ownable_init(owner); //sets owner of the contract __UUPSUpgradeable_init(); - _initializeState(_genesis, _stateHistoryRetentionPeriod); + _initializeState(_genesis, _genesisStakeState, _stateHistoryRetentionPeriod); } /// @notice Use this to get the implementation contract version @@ -197,11 +213,14 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @dev Initialization of contract variables happens in this method because the LightClient /// contract is upgradable and thus has its constructor method disabled. /// @param _genesis The initial state of the light client + /// @param _genesisStakeState The initial stake state of the light client /// @param _stateHistoryRetentionPeriod The maximum retention period (in seconds) for the state /// history - function _initializeState(LightClientState memory _genesis, uint32 _stateHistoryRetentionPeriod) - internal - { + function _initializeState( + LightClientState memory _genesis, + StakeState memory _genesisStakeState, + uint32 _stateHistoryRetentionPeriod + ) internal { // stake table commitments and threshold cannot be zero, otherwise it's impossible to // generate valid proof to move finalized state forward. // Whereas blockCommRoot can be zero, if we use special value zero to denote empty tree. @@ -216,6 +235,7 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { revert InvalidArgs(); } genesisState = _genesis; + genesisStakeState = _genesisStakeState; finalizedState = _genesis; stateHistoryRetentionPeriod = _stateHistoryRetentionPeriod; @@ -282,6 +302,11 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { return genesisState; } + /// @dev Simple getter function for the genesis stake state + function getGenesisStakeState() public view virtual returns (StakeState memory) { + return genesisStakeState; + } + /// @dev Simple getter function for the finalized state function getFinalizedState() public view virtual returns (LightClientState memory) { return finalizedState; diff --git a/contracts/test/DeployLightClientTestScript.s.sol b/contracts/test/DeployLightClientTestScript.s.sol index 8d11ee0cd..264596600 100644 --- a/contracts/test/DeployLightClientTestScript.s.sol +++ b/contracts/test/DeployLightClientTestScript.s.sol @@ -23,7 +23,14 @@ contract DeployLightClientTestScript is Script { (LC.LightClientState memory state,,) = abi.decode(result, (LC.LightClientState, bytes32, bytes32)); - return deployContract(state, stateHistoryRetentionPeriod, owner); + LC.StakeState memory stakeState = LC.StakeState( + state.threshold, + state.stakeTableBlsKeyComm, + state.stakeTableSchnorrKeyComm, + state.stakeTableAmountComm + ); + + return deployContract(state, stakeState, stateHistoryRetentionPeriod, owner); } function runBench(uint64 numInitValidators, uint32 stateHistoryRetentionPeriod) @@ -53,8 +60,14 @@ contract DeployLightClientTestScript is Script { bytes memory result = vm.ffi(cmds); LC.LightClientState memory state = abi.decode(result, (LC.LightClientState)); + LC.StakeState memory stakeState = LC.StakeState( + state.threshold, + state.stakeTableBlsKeyComm, + state.stakeTableSchnorrKeyComm, + state.stakeTableAmountComm + ); - return deployContract(state, stateHistoryRetentionPeriod, owner); + return deployContract(state, stakeState, stateHistoryRetentionPeriod, owner); } /// @notice deploys the impl, proxy & initializes the impl @@ -63,17 +76,19 @@ contract DeployLightClientTestScript is Script { /// @return the light client state function deployContract( LC.LightClientState memory state, + LC.StakeState memory stakeState, uint32 stateHistoryRetentionPeriod, address owner ) public returns (address payable proxyAddress, address admin, LC.LightClientState memory) { vm.startBroadcast(owner); - LCMock lightClientContract = new LCMock(state, stateHistoryRetentionPeriod); + LCMock lightClientContract = new LCMock(state, stakeState, stateHistoryRetentionPeriod); // Encode the initializer function call bytes memory data = abi.encodeWithSignature( - "initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),uint32,address)", + "initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256),uint32,address)", state, + stakeState, stateHistoryRetentionPeriod, owner ); diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol index 4231bc23b..be4b8475b 100644 --- a/contracts/test/LightClient.t.sol +++ b/contracts/test/LightClient.t.sol @@ -18,6 +18,7 @@ import { BN254 } from "bn254/BN254.sol"; contract LightClientCommonTest is Test { LCMock public lc; LC.LightClientState public genesis; + LC.StakeState public genesisStakeState; uint32 public constant DELAY_THRESHOLD = 6; uint32 public constant MAX_HISTORY_SECONDS = 1 days; uint32 public initialBlockTimestamp = 1 days; @@ -30,12 +31,13 @@ contract LightClientCommonTest is Test { function deployAndInitProxy( LC.LightClientState memory state, + LC.StakeState memory stakeState, uint32 stateHistoryRetentionPeriod ) public returns (address payable, address) { vm.warp(1 days); //deploy light client test with a proxy (lcTestProxy, admin, state) = - deployer.deployContract(state, stateHistoryRetentionPeriod, admin); + deployer.deployContract(state, stakeState, stateHistoryRetentionPeriod, admin); //cast the proxy to be of type light client test lc = LCMock(lcTestProxy); @@ -59,8 +61,14 @@ contract LightClientCommonTest is Test { (LC.LightClientState memory state, bytes32 votingSTComm, bytes32 frozenSTComm) = abi.decode(result, (LC.LightClientState, bytes32, bytes32)); genesis = state; + genesisStakeState = LC.StakeState( + state.threshold, + state.stakeTableBlsKeyComm, + state.stakeTableSchnorrKeyComm, + state.stakeTableAmountComm + ); - (lcTestProxy, admin) = deployAndInitProxy(genesis, MAX_HISTORY_SECONDS); + (lcTestProxy, admin) = deployAndInitProxy(genesis, genesisStakeState, MAX_HISTORY_SECONDS); bytes32 expectedStakeTableComm = lc.computeStakeTableComm(state); assertEq(votingSTComm, expectedStakeTableComm); @@ -96,7 +104,14 @@ contract LightClient_constructor_Test is LightClientCommonTest { uint32 _stateHistoryRetentionPeriod ) private { vm.expectRevert(LC.InvalidArgs.selector); - lc = new LCMock(_genesis, _stateHistoryRetentionPeriod); + LC.StakeState memory _genesisStakeState = LC.StakeState( + _genesis.threshold, + _genesis.stakeTableBlsKeyComm, + _genesis.stakeTableSchnorrKeyComm, + _genesis.stakeTableAmountComm + ); + + lc = new LCMock(_genesis, _genesisStakeState, _stateHistoryRetentionPeriod); } function test_RevertWhen_InvalidGenesis() external { @@ -326,7 +341,7 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { (LC.LightClientState memory state,,) = abi.decode(result, (LC.LightClientState, bytes32, bytes32)); genesis = state; - (lcTestProxy, admin) = deployAndInitProxy(genesis, MAX_HISTORY_SECONDS); + (lcTestProxy, admin) = deployAndInitProxy(genesis, genesisStakeState, MAX_HISTORY_SECONDS); genesis = state; @@ -368,7 +383,7 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { numBlockSkipped = uint32(bound(numBlockSkipped, 1, 3)); // re-assign LightClient with the same genesis - deployAndInitProxy(genesis, MAX_HISTORY_SECONDS); + deployAndInitProxy(genesis, genesisStakeState, MAX_HISTORY_SECONDS); string[] memory cmds = new string[](3); cmds[0] = "diff-test"; diff --git a/contracts/test/mocks/LightClientMock.sol b/contracts/test/mocks/LightClientMock.sol index c3f85e54b..f4b7e5bc9 100644 --- a/contracts/test/mocks/LightClientMock.sol +++ b/contracts/test/mocks/LightClientMock.sol @@ -13,8 +13,12 @@ contract LightClientMock is LC { bool internal hotShotDown; uint256 internal frozenL1Height; - constructor(LC.LightClientState memory genesis, uint32 maxHistorySeconds) LC() { - _initializeState(genesis, maxHistorySeconds); + constructor( + LC.LightClientState memory genesis, + LC.StakeState memory genesisStakeState, + uint32 maxHistorySeconds + ) LC() { + _initializeState(genesis, genesisStakeState, maxHistorySeconds); } /// @dev Directly mutate finalizedState variable for test diff --git a/hotshot-state-prover/src/service.rs b/hotshot-state-prover/src/service.rs index 8fb0d1b1b..34d744743 100644 --- a/hotshot-state-prover/src/service.rs +++ b/hotshot-state-prover/src/service.rs @@ -24,6 +24,7 @@ use futures::FutureExt; use hotshot_contract_adapter::{ jellyfish::{u256_to_field, ParsedPlonkProof}, light_client::ParsedLightClientState, + light_client::ParsedStakeState, }; use hotshot_stake_table::vec_based::{config::FieldType, StakeTable}; use hotshot_types::{ @@ -537,7 +538,7 @@ mod test { abi::AbiEncode, utils::{Anvil, AnvilInstance}, }; - use hotshot_contract_adapter::light_client::LightClientConstructorArgs; + use hotshot_contract_adapter::light_client::{LightClientConstructorArgs, ParsedStakeState}; use hotshot_stake_table::vec_based::StakeTable; use hotshot_types::light_client::StateSignKey; use jf_signature::{schnorr::SchnorrSignatureScheme, SignatureScheme}; @@ -559,6 +560,7 @@ mod test { #[allow(clippy::type_complexity)] fn init_ledger_for_test() -> ( ParsedLightClientState, + ParsedStakeState, Vec, Vec<(StateSignKey, StateVerKey)>, StakeTable, @@ -567,6 +569,12 @@ mod test { let ledger = MockLedger::init(pp, NUM_INIT_VALIDATORS as usize); let genesis = ledger.get_state(); + let stake_genesis: ParsedStakeState = ( + genesis.threshold, + genesis.bls_key_comm.encode_hex(), + genesis.schnorr_key_comm.encode_hex(), + genesis.amount_comm.encode_hex(), + ); let qc_keys = ledger.qc_keys; let state_keys = ledger.state_keys; let st = ledger.st; @@ -586,7 +594,7 @@ mod test { genesis.amount_comm.encode_hex(), genesis.threshold, ); - (genesis, qc_keys, state_keys, st) + (genesis, stake_genesis, qc_keys, state_keys, st) } // everybody signs, then generate a proof @@ -652,6 +660,7 @@ mod test { async fn deploy_contract_for_test( anvil: &AnvilInstance, genesis: ParsedLightClientState, + stake_genesis: ParsedStakeState, ) -> Result<(Arc, LightClient)> { let provider = Provider::::try_from(anvil.endpoint())?; let signer = Wallet::from(anvil.keys()[0].clone()) @@ -660,6 +669,7 @@ mod test { let genesis_constructor_args: LightClientConstructorArgs = LightClientConstructorArgs { light_client_state: genesis, + stake_state: stake_state, max_history_seconds: MAX_HISTORY_SECONDS, }; @@ -706,12 +716,18 @@ mod test { setup_test(); let anvil = Anvil::new().spawn(); let dummy_genesis = ParsedLightClientState::dummy_genesis(); - let (_wallet, contract) = deploy_contract_for_test(&anvil, dummy_genesis.clone()).await?; + let dummy_stake_genesis = ParsedStakeState::dummy_genesis(); + let (_wallet, contract) = + deploy_contract_for_test(&anvil, dummy_genesis.clone(), dummy_stake_genesis.clone()) + .await?; // now test if we can read from the contract let genesis: ParsedLightClientState = contract.get_genesis_state().await?.into(); assert_eq!(genesis, dummy_genesis); + let stake_genesis: ParsedStakeState = contract.get_genesis_stake_state().await?.into(); + assert_eq!(stake_genesis, dummy_stake_genesis); + let mut config = StateProverConfig::default(); config.update_l1_info(&anvil, contract.address()); let state = super::read_contract_state( @@ -729,10 +745,11 @@ mod test { async fn test_submit_state_and_proof() -> Result<()> { setup_test(); - let (genesis, _qc_keys, state_keys, st) = init_ledger_for_test(); + let (genesis, stake_genesis, _qc_keys, state_keys, st) = init_ledger_for_test(); let anvil = Anvil::new().spawn(); - let (_wallet, contract) = deploy_contract_for_test(&anvil, genesis.clone()).await?; + let (_wallet, contract) = + deploy_contract_for_test(&anvil, genesis.clone(), stake_genesis.clone()).await?; let mut config = StateProverConfig::default(); config.update_l1_info(&anvil, contract.address()); From 7c9db1c289a6b38c44ab7e3dc704c78515d30fe7 Mon Sep 17 00:00:00 2001 From: Philippe Camacho Date: Sat, 31 Aug 2024 12:57:19 -0400 Subject: [PATCH 03/27] Point to HotShot branch lc-contract-updates. Initial attempt to fix compilation errors. --- Cargo.lock | 1039 ++++++++++++++++---- Cargo.toml | 19 +- contracts/rust/adapter/src/light_client.rs | 27 +- utils/src/deployer.rs | 9 +- 4 files changed, 862 insertions(+), 232 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f9cfdf8b7..2bca06292 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -540,7 +540,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", "synstructure 0.13.1", ] @@ -552,7 +552,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -893,7 +893,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -923,7 +923,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -1026,7 +1026,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -1043,7 +1043,7 @@ checksum = "edf3ee19dbc0a46d740f6f0926bde8c50f02bdbc7b536842da28f6ac56513a8b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -1310,15 +1310,15 @@ dependencies = [ "espresso-types", "ethers", "futures", - "hotshot", - "hotshot-builder-api", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "hotshot-builder-core", "hotshot-events-service", - "hotshot-example-types", - "hotshot-orchestrator", + "hotshot-example-types 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "hotshot-stake-table", "hotshot-state-prover", - "hotshot-types", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "jf-merkle-tree", "jf-signature", "libp2p", @@ -1725,7 +1725,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2314,7 +2314,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2356,7 +2356,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", "synstructure 0.13.1", ] @@ -2381,7 +2381,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2392,7 +2392,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2443,7 +2443,7 @@ checksum = "4e018fccbeeb50ff26562ece792ed06659b9c2dae79ece77c4456bb10d9bf79b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2500,7 +2500,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2521,7 +2521,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2531,7 +2531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4abae7035bf79b9877b779505d8cf3749285b80c43941eda66604841889451dc" dependencies = [ "derive_builder_core", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2544,7 +2544,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2564,7 +2564,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2695,7 +2695,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2872,7 +2872,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2954,11 +2954,11 @@ dependencies = [ "ethers", "fluent-asserter", "futures", - "hotshot", - "hotshot-orchestrator", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "hotshot-query-service", - "hotshot-testing", - "hotshot-types", + "hotshot-testing 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "itertools 0.12.1", "jf-merkle-tree", "jf-utils", @@ -3129,7 +3129,7 @@ dependencies = [ "reqwest 0.11.27", "serde", "serde_json", - "syn 2.0.76", + "syn 2.0.77", "toml", "walkdir", ] @@ -3147,7 +3147,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -3173,7 +3173,7 @@ dependencies = [ "serde", "serde_json", "strum", - "syn 2.0.76", + "syn 2.0.77", "tempfile", "thiserror", "tiny-keccak", @@ -3620,7 +3620,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -3798,7 +3798,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.4.0", + "indexmap 2.5.0", "slab", "tokio", "tokio-util", @@ -3817,7 +3817,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.4.0", + "indexmap 2.5.0", "slab", "tokio", "tokio-util", @@ -4099,13 +4099,107 @@ dependencies = [ "either", "ethereum-types", "futures", - "hotshot-orchestrator", - "hotshot-task", - "hotshot-task-impls", - "hotshot-types", + "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", "jf-signature", "libp2p-identity", - "libp2p-networking", + "libp2p-networking 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "lru 0.12.4", + "num_enum", + "portpicker", + "rand 0.8.5", + "serde", + "sha2 0.10.8", + "snafu 0.8.4", + "surf-disco", + "time 0.3.36", + "tokio", + "tracing", + "url", + "vbs", +] + +[[package]] +name = "hotshot" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" +dependencies = [ + "anyhow", + "async-broadcast", + "async-compatibility-layer", + "async-lock 2.8.0", + "async-std", + "async-trait", + "bimap", + "bincode", + "blake3", + "cdn-broker 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", + "cdn-client", + "cdn-marshal 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", + "chrono", + "committable", + "custom_debug 0.5.1", + "dashmap", + "derive_more 1.0.0", + "either", + "ethereum-types", + "futures", + "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "jf-signature", + "libp2p-identity", + "libp2p-networking 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "lru 0.12.4", + "num_enum", + "portpicker", + "rand 0.8.5", + "serde", + "sha2 0.10.8", + "snafu 0.8.4", + "surf-disco", + "time 0.3.36", + "tokio", + "tracing", + "url", + "vbs", +] + +[[package]] +name = "hotshot" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +dependencies = [ + "anyhow", + "async-broadcast", + "async-compatibility-layer", + "async-lock 2.8.0", + "async-std", + "async-trait", + "bimap", + "bincode", + "blake3", + "cdn-broker 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", + "cdn-client", + "cdn-marshal 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", + "chrono", + "committable", + "custom_debug 0.5.1", + "dashmap", + "derive_more 1.0.0", + "either", + "ethereum-types", + "futures", + "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "jf-signature", + "libp2p-identity", + "libp2p-networking 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "lru 0.12.4", "num_enum", "portpicker", @@ -4131,7 +4225,45 @@ dependencies = [ "committable", "derive_more 1.0.0", "futures", - "hotshot-types", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "serde", + "snafu 0.8.4", + "tagged-base64", + "tide-disco", + "toml", + "vbs", +] + +[[package]] +name = "hotshot-builder-api" +version = "0.1.7" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" +dependencies = [ + "async-trait", + "clap", + "committable", + "derive_more 1.0.0", + "futures", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "serde", + "snafu 0.8.4", + "tagged-base64", + "tide-disco", + "toml", + "vbs", +] + +[[package]] +name = "hotshot-builder-api" +version = "0.1.7" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +dependencies = [ + "async-trait", + "clap", + "committable", + "derive_more 1.0.0", + "futures", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "serde", "snafu 0.8.4", "tagged-base64", @@ -4157,10 +4289,10 @@ dependencies = [ "derivative", "futures", "hex", - "hotshot", - "hotshot-builder-api", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", "hotshot-events-service", - "hotshot-types", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", "lru 0.12.4", "serde", "sha2 0.10.8", @@ -4185,7 +4317,7 @@ dependencies = [ "contract-bindings", "diff-test-bn254", "ethers", - "hotshot-types", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "jf-pcs", "jf-plonk", "jf-utils", @@ -4208,7 +4340,7 @@ dependencies = [ "derive_more 0.99.18", "either", "futures", - "hotshot-types", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", "rand 0.8.5", "serde", "snafu 0.8.4", @@ -4235,10 +4367,76 @@ dependencies = [ "either", "ethereum-types", "futures", - "hotshot", - "hotshot-task", - "hotshot-task-impls", - "hotshot-types", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "rand 0.8.5", + "reqwest 0.12.7", + "serde", + "sha2 0.10.8", + "sha3", + "snafu 0.8.4", + "time 0.3.36", + "tokio", + "tracing", + "url", + "vbs", +] + +[[package]] +name = "hotshot-example-types" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" +dependencies = [ + "anyhow", + "async-broadcast", + "async-compatibility-layer", + "async-lock 2.8.0", + "async-std", + "async-trait", + "bitvec", + "committable", + "either", + "ethereum-types", + "futures", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "rand 0.8.5", + "reqwest 0.12.7", + "serde", + "sha2 0.10.8", + "sha3", + "snafu 0.8.4", + "time 0.3.36", + "tokio", + "tracing", + "url", + "vbs", +] + +[[package]] +name = "hotshot-example-types" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +dependencies = [ + "anyhow", + "async-broadcast", + "async-compatibility-layer", + "async-lock 2.8.0", + "async-std", + "async-trait", + "bitvec", + "committable", + "either", + "ethereum-types", + "futures", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "rand 0.8.5", "reqwest 0.12.7", "serde", @@ -4261,8 +4459,27 @@ dependencies = [ "async-lock 2.8.0", "async-trait", "futures", - "hotshot-example-types", - "hotshot-types", + "hotshot-example-types 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "rand 0.8.5", + "serde", + "tide-disco", + "toml", + "tracing", + "vbs", +] + +[[package]] +name = "hotshot-fakeapi" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +dependencies = [ + "anyhow", + "async-lock 2.8.0", + "async-trait", + "futures", + "hotshot-example-types 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "rand 0.8.5", "serde", "tide-disco", @@ -4279,7 +4496,18 @@ dependencies = [ "derive_builder", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", +] + +[[package]] +name = "hotshot-macros" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +dependencies = [ + "derive_builder", + "proc-macro2", + "quote", + "syn 2.0.77", ] [[package]] @@ -4296,7 +4524,67 @@ dependencies = [ "clap", "csv", "futures", - "hotshot-types", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "libp2p", + "multiaddr", + "serde", + "serde-inline-default", + "serde_json", + "surf-disco", + "thiserror", + "tide-disco", + "tokio", + "toml", + "tracing", + "vbs", + "vec1", +] + +[[package]] +name = "hotshot-orchestrator" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" +dependencies = [ + "anyhow", + "async-compatibility-layer", + "async-lock 2.8.0", + "async-std", + "bincode", + "blake3", + "clap", + "csv", + "futures", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "libp2p", + "multiaddr", + "serde", + "serde-inline-default", + "serde_json", + "surf-disco", + "thiserror", + "tide-disco", + "tokio", + "toml", + "tracing", + "vbs", + "vec1", +] + +[[package]] +name = "hotshot-orchestrator" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +dependencies = [ + "anyhow", + "async-compatibility-layer", + "async-lock 2.8.0", + "async-std", + "bincode", + "blake3", + "clap", + "csv", + "futures", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "libp2p", "multiaddr", "serde", @@ -4320,209 +4608,469 @@ dependencies = [ "anyhow", "ark-serialize", "async-compatibility-layer", - "async-lock 3.4.0", + "async-lock 3.4.0", + "async-std", + "async-trait", + "atomic_store", + "bincode", + "bit-vec", + "chrono", + "committable", + "custom_debug 0.6.1", + "derivative", + "derive_more 0.99.18", + "either", + "espresso-macros", + "futures", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-example-types 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-testing 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "include_dir", + "itertools 0.12.1", + "jf-merkle-tree", + "jf-vid", + "native-tls", + "portpicker", + "postgres-native-tls", + "prometheus", + "rand 0.8.5", + "refinery", + "serde", + "serde_json", + "snafu 0.8.4", + "spin_sleep", + "surf-disco", + "tagged-base64", + "tempfile", + "tide-disco", + "time 0.3.36", + "tokio", + "tokio-postgres", + "toml", + "tracing", + "trait-variant", + "typenum", + "url", + "vbs", + "vec1", +] + +[[package]] +name = "hotshot-stake-table" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +dependencies = [ + "ark-bn254", + "ark-ed-on-bn254", + "ark-ff", + "ark-serialize", + "ark-std", + "digest 0.10.7", + "ethereum-types", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "jf-crhf", + "jf-rescue", + "jf-signature", + "jf-utils", + "serde", + "tagged-base64", +] + +[[package]] +name = "hotshot-state-prover" +version = "0.1.0" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ec", + "ark-ed-on-bn254", + "ark-ff", + "ark-srs", + "ark-std", + "async-std", + "clap", + "contract-bindings", + "displaydoc", + "espresso-types", + "ethers", + "futures", + "hotshot-contract-adapter", + "hotshot-stake-table", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "itertools 0.12.1", + "jf-crhf", + "jf-pcs", + "jf-plonk", + "jf-relation", + "jf-rescue", + "jf-signature", + "jf-utils", + "reqwest 0.12.7", + "sequencer-utils", + "serde", + "surf-disco", + "tide-disco", + "time 0.3.36", + "toml", + "tracing", + "url", + "vbs", +] + +[[package]] +name = "hotshot-task" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" +dependencies = [ + "anyhow", + "async-broadcast", + "async-compatibility-layer", + "async-std", + "async-trait", + "futures", + "tokio", + "tracing", +] + +[[package]] +name = "hotshot-task" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" +dependencies = [ + "anyhow", + "async-broadcast", + "async-compatibility-layer", + "async-std", + "async-trait", + "futures", + "tokio", + "tracing", +] + +[[package]] +name = "hotshot-task" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +dependencies = [ + "anyhow", + "async-broadcast", + "async-compatibility-layer", + "async-std", + "async-trait", + "futures", + "tokio", + "tracing", +] + +[[package]] +name = "hotshot-task-impls" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" +dependencies = [ + "anyhow", + "async-broadcast", + "async-compatibility-layer", + "async-lock 2.8.0", + "async-std", + "async-trait", + "bincode", + "bitvec", + "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", + "chrono", + "committable", + "either", + "futures", + "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "jf-signature", + "jf-vid", + "rand 0.8.5", + "serde", + "sha2 0.10.8", + "snafu 0.8.4", + "surf-disco", + "tagged-base64", + "time 0.3.36", + "tokio", + "tracing", + "url", + "vbs", + "vec1", +] + +[[package]] +name = "hotshot-task-impls" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" +dependencies = [ + "anyhow", + "async-broadcast", + "async-compatibility-layer", + "async-lock 2.8.0", + "async-std", + "async-trait", + "bincode", + "bitvec", + "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", + "chrono", + "committable", + "either", + "futures", + "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "jf-signature", + "jf-vid", + "rand 0.8.5", + "serde", + "sha2 0.10.8", + "snafu 0.8.4", + "surf-disco", + "tagged-base64", + "time 0.3.36", + "tokio", + "tracing", + "url", + "vbs", + "vec1", +] + +[[package]] +name = "hotshot-task-impls" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +dependencies = [ + "anyhow", + "async-broadcast", + "async-compatibility-layer", + "async-lock 2.8.0", "async-std", "async-trait", - "atomic_store", "bincode", - "bit-vec", + "bitvec", + "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", "chrono", "committable", - "custom_debug 0.6.1", - "derivative", - "derive_more 0.99.18", "either", - "espresso-macros", "futures", - "hotshot", - "hotshot-example-types", - "hotshot-testing", - "hotshot-types", - "include_dir", - "itertools 0.12.1", - "jf-merkle-tree", + "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "jf-signature", "jf-vid", - "native-tls", - "portpicker", - "postgres-native-tls", - "prometheus", "rand 0.8.5", - "refinery", "serde", - "serde_json", + "sha2 0.10.8", "snafu 0.8.4", - "spin_sleep", "surf-disco", "tagged-base64", - "tempfile", - "tide-disco", "time 0.3.36", "tokio", - "tokio-postgres", - "toml", "tracing", - "trait-variant", - "typenum", "url", "vbs", "vec1", ] [[package]] -name = "hotshot-stake-table" +name = "hotshot-testing" version = "0.5.72" source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" -dependencies = [ - "ark-bn254", - "ark-ed-on-bn254", - "ark-ff", - "ark-serialize", - "ark-std", - "digest 0.10.7", - "ethereum-types", - "hotshot-types", - "jf-crhf", - "jf-rescue", - "jf-signature", - "jf-utils", - "serde", - "tagged-base64", -] - -[[package]] -name = "hotshot-state-prover" -version = "0.1.0" dependencies = [ "anyhow", - "ark-bn254", - "ark-ec", - "ark-ed-on-bn254", - "ark-ff", - "ark-srs", - "ark-std", + "async-broadcast", + "async-compatibility-layer", + "async-lock 2.8.0", "async-std", - "clap", - "contract-bindings", - "displaydoc", - "espresso-types", - "ethers", + "async-trait", + "automod", + "bitvec", + "committable", + "either", + "ethereum-types", "futures", - "hotshot-contract-adapter", - "hotshot-stake-table", - "hotshot-types", - "itertools 0.12.1", - "jf-crhf", - "jf-pcs", - "jf-plonk", - "jf-relation", - "jf-rescue", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-example-types 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-fakeapi 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-macros 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "itertools 0.13.0", "jf-signature", - "jf-utils", + "jf-vid", + "lru 0.12.4", + "portpicker", + "rand 0.8.5", "reqwest 0.12.7", - "sequencer-utils", "serde", - "surf-disco", + "sha2 0.10.8", + "sha3", + "snafu 0.8.4", + "tagged-base64", "tide-disco", - "time 0.3.36", - "toml", + "tokio", "tracing", "url", "vbs", + "vec1", ] [[package]] -name = "hotshot-task" +name = "hotshot-testing" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" dependencies = [ "anyhow", "async-broadcast", "async-compatibility-layer", + "async-lock 2.8.0", "async-std", "async-trait", + "automod", + "bitvec", + "committable", + "either", + "ethereum-types", "futures", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-example-types 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-fakeapi 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-macros 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "itertools 0.13.0", + "jf-signature", + "jf-vid", + "lru 0.12.4", + "portpicker", + "rand 0.8.5", + "reqwest 0.12.7", + "serde", + "sha2 0.10.8", + "sha3", + "snafu 0.8.4", + "tagged-base64", + "tide-disco", "tokio", "tracing", + "url", + "vbs", + "vec1", ] [[package]] -name = "hotshot-task-impls" -version = "0.5.72" +name = "hotshot-types" +version = "0.1.11" source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" dependencies = [ "anyhow", - "async-broadcast", + "ark-bn254", + "ark-ed-on-bn254", + "ark-ff", + "ark-serialize", + "ark-srs", + "ark-std", "async-compatibility-layer", "async-lock 2.8.0", "async-std", "async-trait", "bincode", "bitvec", + "blake3", "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", - "chrono", "committable", + "custom_debug 0.5.1", + "derivative", + "digest 0.10.7", + "displaydoc", + "dyn-clone 1.0.17 (git+https://github.com/dtolnay/dyn-clone?tag=1.0.17)", "either", + "espresso-systems-common 0.4.1", + "ethereum-types", "futures", - "hotshot-builder-api", - "hotshot-task", - "hotshot-types", + "generic-array", + "jf-pcs", "jf-signature", + "jf-utils", "jf-vid", + "lazy_static", + "libp2p", + "memoize", "rand 0.8.5", + "rand_chacha 0.3.1", + "reqwest 0.12.7", "serde", + "serde_bytes", "sha2 0.10.8", "snafu 0.8.4", - "surf-disco", "tagged-base64", "time 0.3.36", "tokio", "tracing", + "typenum", "url", "vbs", "vec1", ] [[package]] -name = "hotshot-testing" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" +name = "hotshot-types" +version = "0.1.11" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" dependencies = [ "anyhow", - "async-broadcast", + "ark-bn254", + "ark-ed-on-bn254", + "ark-ff", + "ark-serialize", + "ark-srs", + "ark-std", "async-compatibility-layer", "async-lock 2.8.0", "async-std", "async-trait", - "automod", + "bincode", "bitvec", + "blake3", + "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", "committable", + "custom_debug 0.5.1", + "derivative", + "digest 0.10.7", + "displaydoc", + "dyn-clone 1.0.17 (git+https://github.com/dtolnay/dyn-clone?tag=1.0.17)", "either", + "espresso-systems-common 0.4.1", "ethereum-types", "futures", - "hotshot", - "hotshot-builder-api", - "hotshot-example-types", - "hotshot-fakeapi", - "hotshot-macros", - "hotshot-orchestrator", - "hotshot-task", - "hotshot-task-impls", - "hotshot-types", - "itertools 0.13.0", + "generic-array", + "jf-pcs", "jf-signature", + "jf-utils", "jf-vid", - "lru 0.12.4", - "portpicker", + "lazy_static", + "libp2p", + "memoize", "rand 0.8.5", + "rand_chacha 0.3.1", "reqwest 0.12.7", "serde", + "serde_bytes", "sha2 0.10.8", - "sha3", "snafu 0.8.4", "tagged-base64", - "tide-disco", + "time 0.3.36", "tokio", "tracing", + "typenum", "url", "vbs", "vec1", @@ -4531,7 +5079,7 @@ dependencies = [ [[package]] name = "hotshot-types" version = "0.1.11" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" dependencies = [ "anyhow", "ark-bn254", @@ -4990,9 +5538,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", "hashbrown 0.14.5", @@ -5802,7 +6350,76 @@ dependencies = [ "derive_builder", "either", "futures", - "hotshot-types", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "lazy_static", + "libp2p", + "libp2p-identity", + "libp2p-swarm-derive", + "pin-project", + "rand 0.8.5", + "serde", + "serde_bytes", + "serde_json", + "snafu 0.8.4", + "tokio", + "tokio-stream", + "tracing", + "void", +] + +[[package]] +name = "libp2p-networking" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" +dependencies = [ + "anyhow", + "async-compatibility-layer", + "async-lock 2.8.0", + "async-std", + "async-trait", + "bincode", + "blake3", + "custom_debug 0.5.1", + "delegate", + "derive_builder", + "either", + "futures", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "lazy_static", + "libp2p", + "libp2p-identity", + "libp2p-swarm-derive", + "pin-project", + "portpicker", + "rand 0.8.5", + "serde", + "serde_bytes", + "serde_json", + "snafu 0.8.4", + "tokio", + "tokio-stream", + "tracing", + "void", +] + +[[package]] +name = "libp2p-networking" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +dependencies = [ + "anyhow", + "async-compatibility-layer", + "async-lock 2.8.0", + "async-std", + "async-trait", + "bincode", + "blake3", + "custom_debug 0.5.1", + "delegate", + "derive_builder", + "either", + "futures", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "lazy_static", "libp2p", "libp2p-identity", @@ -5900,7 +6517,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -6149,13 +6766,13 @@ dependencies = [ "espresso-types", "ethers", "futures", - "hotshot", - "hotshot-builder-api", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "hotshot-events-service", - "hotshot-orchestrator", + "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "hotshot-query-service", "hotshot-stake-table", - "hotshot-types", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "jf-merkle-tree", "jf-signature", "marketplace-builder-core", @@ -6189,11 +6806,11 @@ dependencies = [ "either", "futures", "hex", - "hotshot", - "hotshot-builder-api", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", "hotshot-events-service", - "hotshot-task-impls", - "hotshot-types", + "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", "lru 0.12.4", "multimap", "serde", @@ -6224,10 +6841,10 @@ dependencies = [ "committable", "espresso-types", "futures", - "hotshot", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "hotshot-events-service", "hotshot-query-service", - "hotshot-types", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "jf-signature", "portpicker", "rand 0.8.5", @@ -6283,7 +6900,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -6607,10 +7224,10 @@ dependencies = [ "clap", "espresso-types", "futures", - "hotshot", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "hotshot-query-service", "hotshot-stake-table", - "hotshot-types", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "prometheus-parse", "reqwest 0.12.7", "serde", @@ -6769,7 +7386,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -6859,7 +7476,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -7079,7 +7696,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -7100,7 +7717,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.4.0", + "indexmap 2.5.0", ] [[package]] @@ -7143,7 +7760,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -7181,7 +7798,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -7381,7 +7998,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -7480,7 +8097,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -7531,7 +8148,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -7905,7 +8522,7 @@ dependencies = [ "quote", "refinery-core", "regex", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -8611,16 +9228,16 @@ dependencies = [ "espresso-types", "ethers", "futures", - "hotshot", - "hotshot-builder-api", + "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "hotshot-contract-adapter", "hotshot-events-service", - "hotshot-orchestrator", + "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "hotshot-query-service", "hotshot-stake-table", "hotshot-state-prover", - "hotshot-testing", - "hotshot-types", + "hotshot-testing 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", "include_dir", "itertools 0.12.1", "jf-crhf", @@ -8721,7 +9338,7 @@ checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -8787,7 +9404,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.4.0", + "indexmap 2.5.0", "serde", "serde_derive", "serde_json", @@ -8804,7 +9421,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -9082,7 +9699,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -9206,7 +9823,7 @@ dependencies = [ "hashbrown 0.14.5", "hashlink", "hex", - "indexmap 2.4.0", + "indexmap 2.5.0", "log", "memchr", "once_cell", @@ -9235,7 +9852,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -9258,7 +9875,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.76", + "syn 2.0.77", "tempfile", "tokio", "url", @@ -9483,7 +10100,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -9645,9 +10262,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.76" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -9689,7 +10306,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -9807,7 +10424,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -10054,7 +10671,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -10191,7 +10808,7 @@ version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ - "indexmap 2.4.0", + "indexmap 2.5.0", "serde", "serde_spanned", "toml_datetime", @@ -10304,7 +10921,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -10408,7 +11025,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -10599,7 +11216,7 @@ dependencies = [ "rustls 0.23.12", "rustls-pki-types", "url", - "webpki-roots 0.26.3", + "webpki-roots 0.26.5", ] [[package]] @@ -10830,7 +11447,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", "wasm-bindgen-shared", ] @@ -10864,7 +11481,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -10922,9 +11539,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.3" +version = "0.26.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" +checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a" dependencies = [ "rustls-pki-types", ] @@ -11305,7 +11922,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -11325,7 +11942,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 0e899d10e..7c0f8a256 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,23 +53,22 @@ dotenvy = "0.15" ethers = { version = "2.0", features = ["solc"] } futures = "0.3" -hotshot = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.72" } +hotshot = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } # Hotshot imports -hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", tag = "0.5.72" } +hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", branch = "lc-contract-updates" } hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", tag = "0.1.45" } marketplace-builder-core = { git = "https://github.com/EspressoSystems/marketplace-builder-core", tag = "0.0.8" } hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", tag = "0.1.44" } -hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.72" } +hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", tag = "0.1.54" } -hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.72" } +hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } +hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } +hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } +hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } +# Temporary, used to pull in the mock auction results provider +hotshot-example-types = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-changes" } hotshot-state-prover = { version = "0.1.0", path = "hotshot-state-prover" } -hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.72" } -hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.72" } -hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.72" } hotshot-contract-adapter = { version = "0.1.0", path = "contracts/rust/adapter" } -# Temporary, used to pull in the mock auction results provider -hotshot-example-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.72" } - # Push CDN imports cdn-broker = { git = "https://github.com/EspressoSystems/Push-CDN", features = [ "runtime-async-std", diff --git a/contracts/rust/adapter/src/light_client.rs b/contracts/rust/adapter/src/light_client.rs index d84dae998..30ce0933d 100644 --- a/contracts/rust/adapter/src/light_client.rs +++ b/contracts/rust/adapter/src/light_client.rs @@ -137,6 +137,7 @@ impl From for contract_bindings::light_client::LightClie } /// Parsed Stake State +#[derive(Clone, Debug, EthAbiType, EthAbiCodec, PartialEq)] pub struct ParsedStakeState { pub threshold: U256, pub bls_key_comm: U256, @@ -159,6 +160,16 @@ impl ParsedStakeState { } } } +impl From for ParsedStakeState { + fn from(s: ParsedLightClientState) -> Self { + Self { + threshold: s.threshold, + bls_key_comm: s.bls_key_comm, + schnorr_key_comm: s.schnorr_key_comm, + amount_comm: s.amount_comm, + } + } +} impl FromStr for ParsedStakeState { type Err = AbiError; @@ -205,10 +216,10 @@ impl From for PublicInput { impl From<(U256, U256, U256, U256)> for ParsedStakeState { fn from(s: (U256, U256, U256, U256)) -> Self { Self { - threshold: s.7, - bls_key_comm: s.4, - schnorr_key_comm: s.5, - amount_comm: s.6, + threshold: s.0, + bls_key_comm: s.1, + schnorr_key_comm: s.2, + amount_comm: s.3, } } } @@ -216,12 +227,10 @@ impl From<(U256, U256, U256, U256)> for ParsedStakeState { impl From for StakeState { fn from(s: ParsedStakeState) -> Self { Self { - stake_table_comm: ( - u256_to_field(s.bls_key_comm), - u256_to_field(s.schnorr_key_comm), - u256_to_field(s.amount_comm), - ), threshold: u256_to_field(s.threshold), + stake_table_bls_key_comm: u256_to_field(s.bls_key_comm), + stake_table_schnorr_key_comm: u256_to_field(s.schnorr_key_comm), + stake_table_amount_comm: u256_to_field(s.amount_comm), } } } diff --git a/utils/src/deployer.rs b/utils/src/deployer.rs index 788e572f4..14644f469 100644 --- a/utils/src/deployer.rs +++ b/utils/src/deployer.rs @@ -16,7 +16,9 @@ use contract_bindings::{ use derive_more::Display; use ethers::{prelude::*, signers::coins_bip39::English, solc::artifacts::BytecodeObject}; use futures::future::{BoxFuture, FutureExt}; -use hotshot_contract_adapter::light_client::{LightClientConstructorArgs, ParsedLightClientState}; +use hotshot_contract_adapter::light_client::{ + LightClientConstructorArgs, ParsedLightClientState, ParsedStakeState, +}; use url::Url; /// Set of predeployed contracts. @@ -355,8 +357,11 @@ pub async fn deploy( }; let light_client = LightClient::new(lc_address, l1.clone()); + let genesis = genesis.await?.clone(); + let parsed_stake_state: ParsedStakeState = genesis.clone().into(); + let data = light_client - .initialize(genesis.await?.into(), 864000, owner) + .initialize(genesis.into(), parsed_stake_state.into(), 864000, owner) .calldata() .context("calldata for initialize transaction not available")?; contracts From d391f7e16953566b229245ec65713196616e6650 Mon Sep 17 00:00:00 2001 From: Alysia Huggins Date: Tue, 3 Sep 2024 14:45:18 -0400 Subject: [PATCH 04/27] ensure that all repos that depend on hotshot are running the feature branch, lc-contract-updates and ensure that all references to the StakeState compiles --- Cargo.lock | 968 +++++---------------------- Cargo.toml | 10 +- contracts/rust/diff-test/src/main.rs | 1 - hotshot-state-prover/src/service.rs | 15 +- 4 files changed, 183 insertions(+), 811 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2bca06292..d6029af27 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -917,9 +917,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.81" +version = "0.1.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" dependencies = [ "proc-macro2", "quote", @@ -1310,15 +1310,15 @@ dependencies = [ "espresso-types", "ethers", "futures", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot", + "hotshot-builder-api", "hotshot-builder-core", "hotshot-events-service", - "hotshot-example-types 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-example-types", + "hotshot-orchestrator", "hotshot-stake-table", "hotshot-state-prover", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types", "jf-merkle-tree", "jf-signature", "libp2p", @@ -2954,11 +2954,11 @@ dependencies = [ "ethers", "fluent-asserter", "futures", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot", + "hotshot-orchestrator", "hotshot-query-service", - "hotshot-testing 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-testing", + "hotshot-types", "itertools 0.12.1", "jf-merkle-tree", "jf-utils", @@ -4077,7 +4077,7 @@ dependencies = [ [[package]] name = "hotshot" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" dependencies = [ "anyhow", "async-broadcast", @@ -4099,107 +4099,13 @@ dependencies = [ "either", "ethereum-types", "futures", - "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-orchestrator", + "hotshot-task", + "hotshot-task-impls", + "hotshot-types", "jf-signature", "libp2p-identity", - "libp2p-networking 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "lru 0.12.4", - "num_enum", - "portpicker", - "rand 0.8.5", - "serde", - "sha2 0.10.8", - "snafu 0.8.4", - "surf-disco", - "time 0.3.36", - "tokio", - "tracing", - "url", - "vbs", -] - -[[package]] -name = "hotshot" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" -dependencies = [ - "anyhow", - "async-broadcast", - "async-compatibility-layer", - "async-lock 2.8.0", - "async-std", - "async-trait", - "bimap", - "bincode", - "blake3", - "cdn-broker 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", - "cdn-client", - "cdn-marshal 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", - "chrono", - "committable", - "custom_debug 0.5.1", - "dashmap", - "derive_more 1.0.0", - "either", - "ethereum-types", - "futures", - "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "jf-signature", - "libp2p-identity", - "libp2p-networking 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "lru 0.12.4", - "num_enum", - "portpicker", - "rand 0.8.5", - "serde", - "sha2 0.10.8", - "snafu 0.8.4", - "surf-disco", - "time 0.3.36", - "tokio", - "tracing", - "url", - "vbs", -] - -[[package]] -name = "hotshot" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" -dependencies = [ - "anyhow", - "async-broadcast", - "async-compatibility-layer", - "async-lock 2.8.0", - "async-std", - "async-trait", - "bimap", - "bincode", - "blake3", - "cdn-broker 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", - "cdn-client", - "cdn-marshal 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", - "chrono", - "committable", - "custom_debug 0.5.1", - "dashmap", - "derive_more 1.0.0", - "either", - "ethereum-types", - "futures", - "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "jf-signature", - "libp2p-identity", - "libp2p-networking 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "libp2p-networking", "lru 0.12.4", "num_enum", "portpicker", @@ -4218,52 +4124,14 @@ dependencies = [ [[package]] name = "hotshot-builder-api" version = "0.1.7" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" dependencies = [ "async-trait", "clap", "committable", "derive_more 1.0.0", "futures", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "serde", - "snafu 0.8.4", - "tagged-base64", - "tide-disco", - "toml", - "vbs", -] - -[[package]] -name = "hotshot-builder-api" -version = "0.1.7" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" -dependencies = [ - "async-trait", - "clap", - "committable", - "derive_more 1.0.0", - "futures", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "serde", - "snafu 0.8.4", - "tagged-base64", - "tide-disco", - "toml", - "vbs", -] - -[[package]] -name = "hotshot-builder-api" -version = "0.1.7" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" -dependencies = [ - "async-trait", - "clap", - "committable", - "derive_more 1.0.0", - "futures", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types", "serde", "snafu 0.8.4", "tagged-base64", @@ -4275,7 +4143,7 @@ dependencies = [ [[package]] name = "hotshot-builder-core" version = "0.1.45" -source = "git+https://github.com/EspressoSystems/hotshot-builder-core?tag=0.1.45#75b204ff832af5a80a76703ca841b650b25ae2fb" +source = "git+https://github.com/EspressoSystems/hotshot-builder-core?branch=lc-contract-updates#77cc616a61f8fdd99898ab2e08befce64ada8104" dependencies = [ "anyhow", "async-broadcast", @@ -4289,10 +4157,10 @@ dependencies = [ "derivative", "futures", "hex", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot", + "hotshot-builder-api", "hotshot-events-service", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-types", "lru 0.12.4", "serde", "sha2 0.10.8", @@ -4317,7 +4185,7 @@ dependencies = [ "contract-bindings", "diff-test-bn254", "ethers", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types", "jf-pcs", "jf-plonk", "jf-utils", @@ -4328,7 +4196,7 @@ dependencies = [ [[package]] name = "hotshot-events-service" version = "0.1.39" -source = "git+https://github.com/EspressoSystems/hotshot-events-service.git?tag=0.1.44#5fc678322f09179ac0042b97a5675d74a8f3b18e" +source = "git+https://github.com/EspressoSystems/hotshot-events-service.git?branch=lc-contract-updates#e9ecce293c4d8fdfb51d2dcf062c2cb1d3617be9" dependencies = [ "async-broadcast", "async-compatibility-layer", @@ -4340,7 +4208,7 @@ dependencies = [ "derive_more 0.99.18", "either", "futures", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-types", "rand 0.8.5", "serde", "snafu 0.8.4", @@ -4354,40 +4222,7 @@ dependencies = [ [[package]] name = "hotshot-example-types" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" -dependencies = [ - "anyhow", - "async-broadcast", - "async-compatibility-layer", - "async-lock 2.8.0", - "async-std", - "async-trait", - "bitvec", - "committable", - "either", - "ethereum-types", - "futures", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "rand 0.8.5", - "reqwest 0.12.7", - "serde", - "sha2 0.10.8", - "sha3", - "snafu 0.8.4", - "time 0.3.36", - "tokio", - "tracing", - "url", - "vbs", -] - -[[package]] -name = "hotshot-example-types" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" dependencies = [ "anyhow", "async-broadcast", @@ -4400,10 +4235,10 @@ dependencies = [ "either", "ethereum-types", "futures", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", + "hotshot", + "hotshot-task", + "hotshot-task-impls", + "hotshot-types", "rand 0.8.5", "reqwest 0.12.7", "serde", @@ -4417,69 +4252,17 @@ dependencies = [ "vbs", ] -[[package]] -name = "hotshot-example-types" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" -dependencies = [ - "anyhow", - "async-broadcast", - "async-compatibility-layer", - "async-lock 2.8.0", - "async-std", - "async-trait", - "bitvec", - "committable", - "either", - "ethereum-types", - "futures", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "rand 0.8.5", - "reqwest 0.12.7", - "serde", - "sha2 0.10.8", - "sha3", - "snafu 0.8.4", - "time 0.3.36", - "tokio", - "tracing", - "url", - "vbs", -] - -[[package]] -name = "hotshot-fakeapi" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" -dependencies = [ - "anyhow", - "async-lock 2.8.0", - "async-trait", - "futures", - "hotshot-example-types 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "rand 0.8.5", - "serde", - "tide-disco", - "toml", - "tracing", - "vbs", -] - [[package]] name = "hotshot-fakeapi" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" dependencies = [ "anyhow", "async-lock 2.8.0", "async-trait", "futures", - "hotshot-example-types 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-example-types", + "hotshot-types", "rand 0.8.5", "serde", "tide-disco", @@ -4491,18 +4274,7 @@ dependencies = [ [[package]] name = "hotshot-macros" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" -dependencies = [ - "derive_builder", - "proc-macro2", - "quote", - "syn 2.0.77", -] - -[[package]] -name = "hotshot-macros" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" dependencies = [ "derive_builder", "proc-macro2", @@ -4513,7 +4285,7 @@ dependencies = [ [[package]] name = "hotshot-orchestrator" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" dependencies = [ "anyhow", "async-compatibility-layer", @@ -4524,67 +4296,7 @@ dependencies = [ "clap", "csv", "futures", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "libp2p", - "multiaddr", - "serde", - "serde-inline-default", - "serde_json", - "surf-disco", - "thiserror", - "tide-disco", - "tokio", - "toml", - "tracing", - "vbs", - "vec1", -] - -[[package]] -name = "hotshot-orchestrator" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" -dependencies = [ - "anyhow", - "async-compatibility-layer", - "async-lock 2.8.0", - "async-std", - "bincode", - "blake3", - "clap", - "csv", - "futures", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "libp2p", - "multiaddr", - "serde", - "serde-inline-default", - "serde_json", - "surf-disco", - "thiserror", - "tide-disco", - "tokio", - "toml", - "tracing", - "vbs", - "vec1", -] - -[[package]] -name = "hotshot-orchestrator" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" -dependencies = [ - "anyhow", - "async-compatibility-layer", - "async-lock 2.8.0", - "async-std", - "bincode", - "blake3", - "clap", - "csv", - "futures", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types", "libp2p", "multiaddr", "serde", @@ -4603,7 +4315,7 @@ dependencies = [ [[package]] name = "hotshot-query-service" version = "0.1.52" -source = "git+https://github.com/EspressoSystems/hotshot-query-service?tag=0.1.54#058c1969e8be0e07d30d0805f9b8422c7d210a48" +source = "git+https://github.com/EspressoSystems/hotshot-query-service?branch=lc-contract-updates#c2c7ee9d07e7ee14b45ddbf5946a14c5cd236a9a" dependencies = [ "anyhow", "ark-serialize", @@ -4617,460 +4329,200 @@ dependencies = [ "chrono", "committable", "custom_debug 0.6.1", - "derivative", - "derive_more 0.99.18", - "either", - "espresso-macros", - "futures", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-example-types 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-testing 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "include_dir", - "itertools 0.12.1", - "jf-merkle-tree", - "jf-vid", - "native-tls", - "portpicker", - "postgres-native-tls", - "prometheus", - "rand 0.8.5", - "refinery", - "serde", - "serde_json", - "snafu 0.8.4", - "spin_sleep", - "surf-disco", - "tagged-base64", - "tempfile", - "tide-disco", - "time 0.3.36", - "tokio", - "tokio-postgres", - "toml", - "tracing", - "trait-variant", - "typenum", - "url", - "vbs", - "vec1", -] - -[[package]] -name = "hotshot-stake-table" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" -dependencies = [ - "ark-bn254", - "ark-ed-on-bn254", - "ark-ff", - "ark-serialize", - "ark-std", - "digest 0.10.7", - "ethereum-types", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "jf-crhf", - "jf-rescue", - "jf-signature", - "jf-utils", - "serde", - "tagged-base64", -] - -[[package]] -name = "hotshot-state-prover" -version = "0.1.0" -dependencies = [ - "anyhow", - "ark-bn254", - "ark-ec", - "ark-ed-on-bn254", - "ark-ff", - "ark-srs", - "ark-std", - "async-std", - "clap", - "contract-bindings", - "displaydoc", - "espresso-types", - "ethers", - "futures", - "hotshot-contract-adapter", - "hotshot-stake-table", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "itertools 0.12.1", - "jf-crhf", - "jf-pcs", - "jf-plonk", - "jf-relation", - "jf-rescue", - "jf-signature", - "jf-utils", - "reqwest 0.12.7", - "sequencer-utils", - "serde", - "surf-disco", - "tide-disco", - "time 0.3.36", - "toml", - "tracing", - "url", - "vbs", -] - -[[package]] -name = "hotshot-task" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" -dependencies = [ - "anyhow", - "async-broadcast", - "async-compatibility-layer", - "async-std", - "async-trait", - "futures", - "tokio", - "tracing", -] - -[[package]] -name = "hotshot-task" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" -dependencies = [ - "anyhow", - "async-broadcast", - "async-compatibility-layer", - "async-std", - "async-trait", - "futures", - "tokio", - "tracing", -] - -[[package]] -name = "hotshot-task" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" -dependencies = [ - "anyhow", - "async-broadcast", - "async-compatibility-layer", - "async-std", - "async-trait", - "futures", - "tokio", - "tracing", -] - -[[package]] -name = "hotshot-task-impls" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" -dependencies = [ - "anyhow", - "async-broadcast", - "async-compatibility-layer", - "async-lock 2.8.0", - "async-std", - "async-trait", - "bincode", - "bitvec", - "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", - "chrono", - "committable", - "either", - "futures", - "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "jf-signature", - "jf-vid", - "rand 0.8.5", - "serde", - "sha2 0.10.8", - "snafu 0.8.4", - "surf-disco", - "tagged-base64", - "time 0.3.36", - "tokio", - "tracing", - "url", - "vbs", - "vec1", -] - -[[package]] -name = "hotshot-task-impls" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" -dependencies = [ - "anyhow", - "async-broadcast", - "async-compatibility-layer", - "async-lock 2.8.0", - "async-std", - "async-trait", - "bincode", - "bitvec", - "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", - "chrono", - "committable", - "either", - "futures", - "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "jf-signature", - "jf-vid", - "rand 0.8.5", - "serde", - "sha2 0.10.8", - "snafu 0.8.4", - "surf-disco", - "tagged-base64", - "time 0.3.36", - "tokio", - "tracing", - "url", - "vbs", - "vec1", -] - -[[package]] -name = "hotshot-task-impls" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" -dependencies = [ - "anyhow", - "async-broadcast", - "async-compatibility-layer", - "async-lock 2.8.0", - "async-std", - "async-trait", - "bincode", - "bitvec", - "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", - "chrono", - "committable", + "derivative", + "derive_more 0.99.18", "either", + "espresso-macros", "futures", - "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "jf-signature", + "hotshot", + "hotshot-example-types", + "hotshot-testing", + "hotshot-types", + "include_dir", + "itertools 0.12.1", + "jf-merkle-tree", "jf-vid", + "native-tls", + "portpicker", + "postgres-native-tls", + "prometheus", "rand 0.8.5", + "refinery", "serde", - "sha2 0.10.8", + "serde_json", "snafu 0.8.4", + "spin_sleep", "surf-disco", "tagged-base64", + "tempfile", + "tide-disco", "time 0.3.36", "tokio", + "tokio-postgres", + "toml", "tracing", + "trait-variant", + "typenum", "url", "vbs", "vec1", ] [[package]] -name = "hotshot-testing" +name = "hotshot-stake-table" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" +dependencies = [ + "ark-bn254", + "ark-ed-on-bn254", + "ark-ff", + "ark-serialize", + "ark-std", + "digest 0.10.7", + "ethereum-types", + "hotshot-types", + "jf-crhf", + "jf-rescue", + "jf-signature", + "jf-utils", + "serde", + "tagged-base64", +] + +[[package]] +name = "hotshot-state-prover" +version = "0.1.0" dependencies = [ "anyhow", - "async-broadcast", - "async-compatibility-layer", - "async-lock 2.8.0", + "ark-bn254", + "ark-ec", + "ark-ed-on-bn254", + "ark-ff", + "ark-srs", + "ark-std", "async-std", - "async-trait", - "automod", - "bitvec", - "committable", - "either", - "ethereum-types", + "clap", + "contract-bindings", + "displaydoc", + "espresso-types", + "ethers", "futures", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-example-types 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-fakeapi 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-macros 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "itertools 0.13.0", + "hotshot-contract-adapter", + "hotshot-stake-table", + "hotshot-types", + "itertools 0.12.1", + "jf-crhf", + "jf-pcs", + "jf-plonk", + "jf-relation", + "jf-rescue", "jf-signature", - "jf-vid", - "lru 0.12.4", - "portpicker", - "rand 0.8.5", + "jf-utils", "reqwest 0.12.7", + "sequencer-utils", "serde", - "sha2 0.10.8", - "sha3", - "snafu 0.8.4", - "tagged-base64", + "surf-disco", "tide-disco", - "tokio", + "time 0.3.36", + "toml", "tracing", "url", "vbs", - "vec1", ] [[package]] -name = "hotshot-testing" +name = "hotshot-task" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" dependencies = [ "anyhow", "async-broadcast", "async-compatibility-layer", - "async-lock 2.8.0", "async-std", "async-trait", - "automod", - "bitvec", - "committable", - "either", - "ethereum-types", "futures", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-example-types 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-fakeapi 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-macros 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-task 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "itertools 0.13.0", - "jf-signature", - "jf-vid", - "lru 0.12.4", - "portpicker", - "rand 0.8.5", - "reqwest 0.12.7", - "serde", - "sha2 0.10.8", - "sha3", - "snafu 0.8.4", - "tagged-base64", - "tide-disco", "tokio", "tracing", - "url", - "vbs", - "vec1", ] [[package]] -name = "hotshot-types" -version = "0.1.11" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" +name = "hotshot-task-impls" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" dependencies = [ "anyhow", - "ark-bn254", - "ark-ed-on-bn254", - "ark-ff", - "ark-serialize", - "ark-srs", - "ark-std", + "async-broadcast", "async-compatibility-layer", "async-lock 2.8.0", "async-std", "async-trait", "bincode", "bitvec", - "blake3", "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", + "chrono", "committable", - "custom_debug 0.5.1", - "derivative", - "digest 0.10.7", - "displaydoc", - "dyn-clone 1.0.17 (git+https://github.com/dtolnay/dyn-clone?tag=1.0.17)", "either", - "espresso-systems-common 0.4.1", - "ethereum-types", "futures", - "generic-array", - "jf-pcs", + "hotshot-builder-api", + "hotshot-task", + "hotshot-types", "jf-signature", - "jf-utils", "jf-vid", - "lazy_static", - "libp2p", - "memoize", "rand 0.8.5", - "rand_chacha 0.3.1", - "reqwest 0.12.7", "serde", - "serde_bytes", "sha2 0.10.8", "snafu 0.8.4", + "surf-disco", "tagged-base64", "time 0.3.36", "tokio", "tracing", - "typenum", "url", "vbs", "vec1", ] [[package]] -name = "hotshot-types" -version = "0.1.11" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" +name = "hotshot-testing" +version = "0.5.72" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" dependencies = [ "anyhow", - "ark-bn254", - "ark-ed-on-bn254", - "ark-ff", - "ark-serialize", - "ark-srs", - "ark-std", + "async-broadcast", "async-compatibility-layer", "async-lock 2.8.0", "async-std", "async-trait", - "bincode", + "automod", "bitvec", - "blake3", - "cdn-proto 0.4.0 (git+https://github.com/EspressoSystems/Push-CDN?tag=0.4.6)", "committable", - "custom_debug 0.5.1", - "derivative", - "digest 0.10.7", - "displaydoc", - "dyn-clone 1.0.17 (git+https://github.com/dtolnay/dyn-clone?tag=1.0.17)", "either", - "espresso-systems-common 0.4.1", "ethereum-types", "futures", - "generic-array", - "jf-pcs", + "hotshot", + "hotshot-builder-api", + "hotshot-example-types", + "hotshot-fakeapi", + "hotshot-macros", + "hotshot-orchestrator", + "hotshot-task", + "hotshot-task-impls", + "hotshot-types", + "itertools 0.13.0", "jf-signature", - "jf-utils", "jf-vid", - "lazy_static", - "libp2p", - "memoize", + "lru 0.12.4", + "portpicker", "rand 0.8.5", - "rand_chacha 0.3.1", "reqwest 0.12.7", "serde", - "serde_bytes", "sha2 0.10.8", + "sha3", "snafu 0.8.4", "tagged-base64", - "time 0.3.36", + "tide-disco", "tokio", "tracing", - "typenum", "url", "vbs", "vec1", @@ -5079,7 +4531,7 @@ dependencies = [ [[package]] name = "hotshot-types" version = "0.1.11" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" dependencies = [ "anyhow", "ark-bn254", @@ -6336,76 +5788,7 @@ dependencies = [ [[package]] name = "libp2p-networking" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.72#165cbadba6e3ea4ac440625b0b6d0a7a01c2d97b" -dependencies = [ - "anyhow", - "async-compatibility-layer", - "async-lock 2.8.0", - "async-std", - "async-trait", - "bincode", - "blake3", - "custom_debug 0.5.1", - "delegate", - "derive_builder", - "either", - "futures", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "lazy_static", - "libp2p", - "libp2p-identity", - "libp2p-swarm-derive", - "pin-project", - "rand 0.8.5", - "serde", - "serde_bytes", - "serde_json", - "snafu 0.8.4", - "tokio", - "tokio-stream", - "tracing", - "void", -] - -[[package]] -name = "libp2p-networking" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes#b65219548288f67f6a6660360cd74312c55646a3" -dependencies = [ - "anyhow", - "async-compatibility-layer", - "async-lock 2.8.0", - "async-std", - "async-trait", - "bincode", - "blake3", - "custom_debug 0.5.1", - "delegate", - "derive_builder", - "either", - "futures", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-changes)", - "lazy_static", - "libp2p", - "libp2p-identity", - "libp2p-swarm-derive", - "pin-project", - "portpicker", - "rand 0.8.5", - "serde", - "serde_bytes", - "serde_json", - "snafu 0.8.4", - "tokio", - "tokio-stream", - "tracing", - "void", -] - -[[package]] -name = "libp2p-networking" -version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#998dd79848c607f69d441d89cd6385421788fd7a" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" dependencies = [ "anyhow", "async-compatibility-layer", @@ -6419,7 +5802,7 @@ dependencies = [ "derive_builder", "either", "futures", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types", "lazy_static", "libp2p", "libp2p-identity", @@ -6766,13 +6149,13 @@ dependencies = [ "espresso-types", "ethers", "futures", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot", + "hotshot-builder-api", "hotshot-events-service", - "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-orchestrator", "hotshot-query-service", "hotshot-stake-table", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types", "jf-merkle-tree", "jf-signature", "marketplace-builder-core", @@ -6791,8 +6174,8 @@ dependencies = [ [[package]] name = "marketplace-builder-core" -version = "0.0.7" -source = "git+https://github.com/EspressoSystems/marketplace-builder-core?tag=0.0.8#4747d43f950ed24fece68eeddaa766734ab1789f" +version = "0.1.46" +source = "git+https://github.com/EspressoSystems/marketplace-builder-core?branch=lc-contract-updates#64c7321204240c880672deb884cb82cae7759b20" dependencies = [ "anyhow", "async-broadcast", @@ -6806,11 +6189,11 @@ dependencies = [ "either", "futures", "hex", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot", + "hotshot-builder-api", "hotshot-events-service", - "hotshot-task-impls 0.5.72 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?tag=0.5.72)", + "hotshot-task-impls", + "hotshot-types", "lru 0.12.4", "multimap", "serde", @@ -6841,10 +6224,10 @@ dependencies = [ "committable", "espresso-types", "futures", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot", "hotshot-events-service", "hotshot-query-service", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types", "jf-signature", "portpicker", "rand 0.8.5", @@ -7224,10 +6607,10 @@ dependencies = [ "clap", "espresso-types", "futures", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot", "hotshot-query-service", "hotshot-stake-table", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-types", "prometheus-parse", "reqwest 0.12.7", "serde", @@ -7575,7 +6958,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.3", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] @@ -8229,9 +7612,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.3" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b22d8e7369034b9a7132bc2008cac12f2013c8132b45e0554e6e20e2617f2156" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" dependencies = [ "async-io 2.3.4", "async-std", @@ -8250,9 +7633,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.6" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba92fb39ec7ad06ca2582c0ca834dfeadcaf06ddfc8e635c80aa7e1c05315fdd" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes 1.7.1", "rand 0.8.5", @@ -8267,15 +7650,15 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" +checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" dependencies = [ "libc", "once_cell", "socket2 0.5.7", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -8451,15 +7834,6 @@ dependencies = [ "url", ] -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.5.3" @@ -9228,16 +8602,16 @@ dependencies = [ "espresso-types", "ethers", "futures", - "hotshot 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-builder-api 0.1.7 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot", + "hotshot-builder-api", "hotshot-contract-adapter", "hotshot-events-service", - "hotshot-orchestrator 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-orchestrator", "hotshot-query-service", "hotshot-stake-table", "hotshot-state-prover", - "hotshot-testing 0.5.72 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", - "hotshot-types 0.1.11 (git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates)", + "hotshot-testing", + "hotshot-types", "include_dir", "itertools 0.12.1", "jf-crhf", @@ -11548,11 +10922,11 @@ dependencies = [ [[package]] name = "whoami" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.4.1", + "redox_syscall", "wasite", "web-sys", ] diff --git a/Cargo.toml b/Cargo.toml index 7c0f8a256..9d18e06b1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -56,17 +56,17 @@ futures = "0.3" hotshot = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } # Hotshot imports hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", branch = "lc-contract-updates" } -hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", tag = "0.1.45" } -marketplace-builder-core = { git = "https://github.com/EspressoSystems/marketplace-builder-core", tag = "0.0.8" } -hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", tag = "0.1.44" } +hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", branch = "lc-contract-updates" } +marketplace-builder-core = { git = "https://github.com/EspressoSystems/marketplace-builder-core", branch = "lc-contract-updates" } +hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", branch = "lc-contract-updates" } hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } -hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", tag = "0.1.54" } +hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", branch = "lc-contract-updates" } hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } # Temporary, used to pull in the mock auction results provider -hotshot-example-types = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-changes" } +hotshot-example-types = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } hotshot-state-prover = { version = "0.1.0", path = "hotshot-state-prover" } hotshot-contract-adapter = { version = "0.1.0", path = "contracts/rust/adapter" } # Push CDN imports diff --git a/contracts/rust/diff-test/src/main.rs b/contracts/rust/diff-test/src/main.rs index 648d38c3b..e92cfd3ce 100644 --- a/contracts/rust/diff-test/src/main.rs +++ b/contracts/rust/diff-test/src/main.rs @@ -486,7 +486,6 @@ fn main() { let mut ledger = MockLedger::init(pp, num_init_validators as usize); let mut new_states: Vec = vec![]; - let mut new_stake_states: Vec = vec![]; let mut proofs: Vec = vec![]; for i in 1..block_per_epoch + 2 { // only update stake table at the last block, as it would only take effect in next epoch anyway. diff --git a/hotshot-state-prover/src/service.rs b/hotshot-state-prover/src/service.rs index 34d744743..e7ff14ac2 100644 --- a/hotshot-state-prover/src/service.rs +++ b/hotshot-state-prover/src/service.rs @@ -24,7 +24,6 @@ use futures::FutureExt; use hotshot_contract_adapter::{ jellyfish::{u256_to_field, ParsedPlonkProof}, light_client::ParsedLightClientState, - light_client::ParsedStakeState, }; use hotshot_stake_table::vec_based::{config::FieldType, StakeTable}; use hotshot_types::{ @@ -569,12 +568,12 @@ mod test { let ledger = MockLedger::init(pp, NUM_INIT_VALIDATORS as usize); let genesis = ledger.get_state(); - let stake_genesis: ParsedStakeState = ( - genesis.threshold, - genesis.bls_key_comm.encode_hex(), - genesis.schnorr_key_comm.encode_hex(), - genesis.amount_comm.encode_hex(), - ); + let stake_genesis: ParsedStakeState = ParsedStakeState { + threshold: genesis.threshold, + bls_key_comm: genesis.bls_key_comm, + schnorr_key_comm: genesis.schnorr_key_comm, + amount_comm: genesis.amount_comm, + }; let qc_keys = ledger.qc_keys; let state_keys = ledger.state_keys; let st = ledger.st; @@ -669,7 +668,7 @@ mod test { let genesis_constructor_args: LightClientConstructorArgs = LightClientConstructorArgs { light_client_state: genesis, - stake_state: stake_state, + stake_state: stake_genesis, max_history_seconds: MAX_HISTORY_SECONDS, }; From 3a27dda9fce8ab076fbd629ea9b4e327e9f39c2c Mon Sep 17 00:00:00 2001 From: Alysia Huggins Date: Tue, 3 Sep 2024 22:36:25 -0400 Subject: [PATCH 05/27] remove fields from light cilent state that are not needed and began the process of updating the related adapte and hotshot-state-prover code e.g. the MockGenesis action --- Cargo.lock | 52 ++-- .../artifacts/LightClientMock_bytecode.json | 2 +- .../artifacts/LightClient_bytecode.json | 2 +- contract-bindings/src/light_client.rs | 223 ++-------------- contract-bindings/src/light_client_mock.rs | 241 ++---------------- contract-bindings/src/shared_types.rs | 7 +- contracts/rust/adapter/src/light_client.rs | 89 +------ contracts/rust/diff-test/src/main.rs | 29 ++- contracts/script/LightClient.s.sol | 66 ++--- .../script/LightClientWithDefender.s.sol | 11 +- contracts/src/LightClient.sol | 39 +-- .../test/DeployLightClientTestScript.s.sol | 47 ++-- contracts/test/LightClient.t.sol | 144 ++++------- .../test/LightClientUpgradeSameContract.t.sol | 21 +- contracts/test/LightClientUpgradeToVx.t.sol | 57 +---- contracts/test/LightClientV2.sol | 12 - contracts/test/mocks/LightClientMock.sol | 4 - hotshot-state-prover/src/circuit.rs | 23 +- hotshot-state-prover/src/mock_ledger.rs | 63 +++-- hotshot-state-prover/src/service.rs | 46 +++- hotshot-state-prover/src/snark.rs | 6 +- sequencer/src/api.rs | 5 + sequencer/src/bin/deploy.rs | 5 +- sequencer/src/bin/espresso-dev-node.rs | 2 + sequencer/src/state_signature.rs | 2 - sequencer/src/state_signature/relay_server.rs | 2 +- utils/src/deployer.rs | 5 +- 27 files changed, 348 insertions(+), 857 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d6029af27..6cfabcbde 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4077,7 +4077,7 @@ dependencies = [ [[package]] name = "hotshot" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" dependencies = [ "anyhow", "async-broadcast", @@ -4124,7 +4124,7 @@ dependencies = [ [[package]] name = "hotshot-builder-api" version = "0.1.7" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" dependencies = [ "async-trait", "clap", @@ -4222,7 +4222,7 @@ dependencies = [ [[package]] name = "hotshot-example-types" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" dependencies = [ "anyhow", "async-broadcast", @@ -4255,7 +4255,7 @@ dependencies = [ [[package]] name = "hotshot-fakeapi" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" dependencies = [ "anyhow", "async-lock 2.8.0", @@ -4274,7 +4274,7 @@ dependencies = [ [[package]] name = "hotshot-macros" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" dependencies = [ "derive_builder", "proc-macro2", @@ -4285,7 +4285,7 @@ dependencies = [ [[package]] name = "hotshot-orchestrator" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" dependencies = [ "anyhow", "async-compatibility-layer", @@ -4371,7 +4371,7 @@ dependencies = [ [[package]] name = "hotshot-stake-table" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" dependencies = [ "ark-bn254", "ark-ed-on-bn254", @@ -4433,7 +4433,7 @@ dependencies = [ [[package]] name = "hotshot-task" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" dependencies = [ "anyhow", "async-broadcast", @@ -4448,7 +4448,7 @@ dependencies = [ [[package]] name = "hotshot-task-impls" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" dependencies = [ "anyhow", "async-broadcast", @@ -4485,7 +4485,7 @@ dependencies = [ [[package]] name = "hotshot-testing" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" dependencies = [ "anyhow", "async-broadcast", @@ -4531,7 +4531,7 @@ dependencies = [ [[package]] name = "hotshot-types" version = "0.1.11" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" dependencies = [ "anyhow", "ark-bn254", @@ -5788,7 +5788,7 @@ dependencies = [ [[package]] name = "libp2p-networking" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#a24cb7d3f48b0b61899b12a6e4d6d8efd8235dce" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" dependencies = [ "anyhow", "async-compatibility-layer", @@ -9165,9 +9165,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcfa89bea9500db4a0d038513d7a060566bfc51d46d1c014847049a45cce85e8" +checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" dependencies = [ "sqlx-core", "sqlx-macros", @@ -9178,9 +9178,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d06e2f2bd861719b1f3f0c7dbe1d80c30bf59e76cf019f07d9014ed7eefb8e08" +checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" dependencies = [ "atoi", "byteorder", @@ -9218,9 +9218,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f998a9defdbd48ed005a89362bd40dd2117502f15294f61c8d47034107dbbdc" +checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" dependencies = [ "proc-macro2", "quote", @@ -9231,9 +9231,9 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d100558134176a2629d46cec0c8891ba0be8910f7896abfdb75ef4ab6f4e7ce" +checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" dependencies = [ "dotenvy", "either", @@ -9257,9 +9257,9 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cac0ab331b14cb3921c62156d913e4c15b74fb6ec0f3146bd4ef6e4fb3c12" +checksum = "64bb4714269afa44aef2755150a0fc19d756fb580a67db8885608cf02f47d06a" dependencies = [ "atoi", "base64 0.22.1", @@ -9300,9 +9300,9 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9734dbce698c67ecf67c442f768a5e90a49b2a4d61a9f1d59f73874bd4cf0710" +checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" dependencies = [ "atoi", "base64 0.22.1", @@ -9339,9 +9339,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75b419c3c1b1697833dd927bdc4c6545a620bc1bbafabd44e1efbe9afcd337e" +checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" dependencies = [ "atoi", "flume 0.11.0", diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json index 01f2f73bc..c2f3e7b91 100644 --- a/contract-bindings/artifacts/LightClientMock_bytecode.json +++ b/contract-bindings/artifacts/LightClientMock_bytecode.json @@ -1 +1 @@ -"0x346200063857620036a2388190039060a0601f8301601f1916810191906001600160401b038311908310176200054957829160405260a0396101a08112620006385761010081126200063857604051906101008201906001600160401b0382118383101762000549576080916040526200007a60a06200063d565b83526200008860c06200063d565b602084015260e08051604085015261010051606085015260a0838101518486015261014051908501526101605160c0850152610180519084015260ff1901126200063857604051906001600160401b03608083019081119083111762000549576080820160409081526101a05183526101c05160208401526101e05190830152610200516060830152610220519163ffffffff831683036200063857306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1662000626576002600160401b03196001600160401b03821601620005bc575b5081516001600160401b031615801590620005a5575b801562000598575b80156200058b575b80156200057e575b801562000571575b6200055f5760018060401b03825116809360095468010000000000000000600160801b03602086015160401b1692839160018060801b031916171760095560408401519283600a55606085015180600b5560808601519485600c5560a08701519485600d5560c08801519889600e55606060e08a01519586600f55805160055560208101516006556040810151600755015160085560018060801b03196010541617176010556011556012558360135582601455856015556016556017549063ffffffff60a81b9060a81b169063ffffffff60a81b1916179384601755604051916020830193845260408301526060820152606081526080810181811060018060401b0382111762000549576040525190209160009280845560e08301519081600155600255600355601954908115159182620004d2575b505062000443575b602081015160409182015182519290916001600160401b03908116918401908111848210176200041b5760405282526020820152604051906060820182811060018060401b038211176200042f5760409081526001600160401b034381168452421660208401908152908301918252601954909290680100000000000000008110156200041b578060016200037f920160195562000652565b94909462000407575051835492516001600160801b03199093166001600160401b0391821617604093841b6fffffffffffffffff000000000000000016178455905180516001850180546001600160401b03191691909316179091556020015160029290920191909155516130199081620006898239608051818181610dec0152610f440152f35b634e487b7160e01b81526004819052602490fd5b634e487b7160e01b85526041600452602485fd5b634e487b7160e01b84526041600452602484fd5b6018546200045a906001600160401b031662000652565b620004be57828155600181018390556002018290556018546001600160401b03808216908114620004aa576001600160401b03199091166001919091016001600160401b031617601855620002e6565b634e487b7160e01b84526011600452602484fd5b634e487b7160e01b83526004839052602483fd5b9091506000198101908111620004aa57620004ed9062000652565b50546018546001600160401b0360409290921c8216916200050f911662000652565b505460401c6001600160401b0390811690910391908211620004aa5760a81c63ffffffff166001600160401b0390911610153880620002de565b634e487b7160e01b600052604160045260246000fd5b6040516350dd03f760e11b8152600490fd5b5060e082015115620001a6565b5060c0820151156200019e565b5060a08201511562000196565b506080820151156200018e565b5060208201516001600160401b0316151562000186565b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a13862000170565b60405163f92ee8a960e01b8152600490fd5b600080fd5b51906001600160401b03821682036200063857565b601954811015620006725760196000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461025757806302b592f3146102525780630c693a221461024d5780630d8e6e2c14610248578063202a0adb146102435780632d52aad61461023e5780632f5f4600146102395780632f79889d14610234578063313df7b11461022f578063382b215a1461022a578063409939b7146102255780634847ae5d146102205780634f1ef2861461021b57806352d1902d14610216578063628277331461021157806369cc6a041461020c578063715018a61461020757806376b6b7cb146102025780637f17baad146101fd57806382d07ff3146101f85780638584d23f146101f35780638da5cb5b146101ee5780638ed3e045146101e957806396c1ca61146101e45780639fdb54a7146101df578063a9a9c9f5146101da578063aa922732146101d5578063ad3cb1cc146101d0578063bd32519a146101cb578063c23b9e9e146101c6578063c8e5e498146101c1578063ca6fe855146101bc578063d24d933d146101b7578063e0303301146101b2578063f2fde38b146101ad5763f9e50d19146101a857600080fd5b61165b565b611632565b611502565b6114ba565b61149c565b61147f565b611458565b611432565b6113b5565b611388565b611351565b611309565b611284565b61120b565b6111d5565b611198565b611167565b6110f7565b611084565b611019565b610fba565b610f9c565b610f31565b610d72565b610cd4565b610b1f565b6108d2565b6108a9565b610882565b610798565b61075b565b610687565b6105c4565b610544565b6104ce565b61028e565b600435906001600160a01b038216820361027257565b600080fd5b6101a435906001600160a01b038216820361027257565b34610272576020366003190112610272576102a761025c565b6102af611fad565b6001600160a01b0390811690811561033a5760175490811682146103285760ff60a01b19919091166001600160a81b03199190911617600160a01b1760178190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa4607290602090a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b60195481101561039d576003906019600052027f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950190600090565b61034c565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b038211176103d357604052565b6103a2565b608081019081106001600160401b038211176103d357604052565b61010081019081106001600160401b038211176103d357604052565b606081019081106001600160401b038211176103d357604052565b90601f801991011681019081106001600160401b038211176103d357604052565b604051906102e082018281106001600160401b038211176103d357604052565b60405190610478826103b8565b565b604051906104788261040f565b6040519061028082018281106001600160401b038211176103d357604052565b906040516104b4816103b8565b6020600182946001600160401b0381541684520154910152565b3461027257602036600319011261027257600435601954811015610272576104f7608091610362565b5061054281549161051260016001600160401b0392016104a7565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610272576000806003193601126105c15760809060409060608251610569816103d8565b828152826020820152828482015201528051610584816103d8565b6005549182825260065460208301908152600754908284019182526060600854940193845282519485525160208501525190830152516060820152f35b80fd5b34610272576000366003190112610272576060604051600181526000602082015260006040820152f35b602435906001600160401b038216820361027257565b35906001600160401b038216820361027257565b6101009060031901126102725760405190610632826103f3565b816004356001600160401b03811681036102725781526106506105ee565b602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e060e435910152565b34610272576101003660031901126102725761075960e06106a736610618565b6106d16001600160401b038251166001600160401b03166001600160401b03196010541617601055565b6107116106e860208301516001600160401b031690565b67ffffffffffffffff60401b6010549160401b169067ffffffffffffffff60401b191617601055565b61071e6040820151601155565b61072b6060820151601255565b6107386080820151601355565b61074560a0820151601455565b61075260c0820151601555565b0151601655565b005b3461027257602036600319011261027257601a805460ff19166001179055600435601b55005b6001600160401b0381116103d35760051b60200190565b346102725760208060031936011261027257600435906001600160401b0382116102725736602383011215610272578160040135916107d683610781565b916040936107e68551948561042a565b80845260248285019160071b8401019236841161027257602401905b8382106108125761075985611862565b81360360808112610272578680519161082a8361040f565b61083385610604565b8352610840868601610604565b83870152603f190112610272576080918491885161085d816103b8565b6108688a8701610604565b815260608601358482015289820152815201910190610802565b346102725760003660031901126102725760206001600160401b0360185416604051908152f35b34610272576000366003190112610272576017546040516001600160a01b039091168152602090f35b34610272576000366003190112610272576020600254604051908152f35b604090610103190112610272576040519061090a826103b8565b610104358252610124356020830152565b6040906101431901126102725760405190610935826103b8565b610144358252610164356020830152565b6040906101831901126102725760405190610960826103b8565b6101843582526101a4356020830152565b6040906101c3190112610272576040519061098b826103b8565b6101c43582526101e4356020830152565b60409061020319011261027257604051906109b6826103b8565b610204358252610224356020830152565b60409061024319011261027257604051906109e1826103b8565b610244358252610264356020830152565b6040906102831901126102725760405190610a0c826103b8565b6102843582526102a4356020830152565b6040906102c31901126102725760405190610a37826103b8565b6102c43582526102e4356020830152565b6040906103031901126102725760405190610a62826103b8565b610304358252610324356020830152565b6040906103431901126102725760405190610a8d826103b8565b610344358252610364356020830152565b6040906103831901126102725760405190610ab8826103b8565b6103843582526103a4356020830152565b6040906103c31901126102725760405190610ae3826103b8565b6103c43582526103e4356020830152565b6040906104031901126102725760405190610b0e826103b8565b610404358252610424356020830152565b346102725761058036600319011261027257610b3a36610618565b610480366101031901126102725761075990610b5461044b565b90610b5e366108f0565b8252610b693661091b565b6020830152610b7736610946565b6040830152610b8536610971565b6060830152610b933661099c565b6080830152610ba1366109c7565b60a0830152610baf366109f2565b60c0830152610bbd36610a1d565b60e0830152610bcb36610a48565b610100830152610bda36610a73565b610120830152610be936610a9e565b610140830152610bf836610ac9565b610160830152610c0736610af4565b610180830152610444356101a0830152610464356101c0830152610484356101e08301526104a4356102008301526104c4356102208301526104e4356102408301526105043561026083015261052435610280830152610544356102a0830152610564356102c083015261190c565b91909160e0806101008301946001600160401b03808251168552602082015116602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b3461027257600036600319011261027257610ced611a8f565b50610d53604051610cfd816103f3565b6009546001600160401b0390818116835260401c166020820152600a546040820152600b546060820152600c546080820152600d5460a0820152600e5460c0820152600f5460e082015260405191829182610c76565b0390f35b6001600160401b0381116103d357601f01601f191660200190565b60408060031936011261027257610d8761025c565b6024356001600160401b038111610272573660238201121561027257806004013590610db282610d57565b91610dbf8551938461042a565b80835260209136602483830101116102725781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610f15575b50610f04579080600492610e2a611fad565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610ed5575b5050610e9a578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612fcd8339815191528193929303610ebc576107598383612e31565b8351632a87526960e21b81526004810191909152602490fd5b610ef5929350803d10610efd575b610eed818361042a565b81019061277c565b903880610e74565b503d610ee3565b845163703e46dd60e11b8152600490fd5b905081600080516020612fcd8339815191525416141538610e18565b34610272576000366003190112610272577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610f8a576020604051600080516020612fcd8339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610272576000366003190112610272576020600154604051908152f35b34610272576000806003193601126105c157610fd4611fad565b60175460ff8160a01c16600014610328576001600160a81b0319166017557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b34610272576000806003193601126105c157611033611fad565b600080516020612fad83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610272576000366003190112610272576020600054604051908152f35b6004359063ffffffff8216820361027257565b949198979693909260e0969361010087019a6001600160401b03809216885216602087015260408601526060850152608084015260a083015260c08201520152565b346102725760203660031901126102725763ffffffff6111156110a2565b1660005260046020526040600020805490610d536001600160401b039160018101549060028101546003820154600483015491600660058501549401549460405198888a998260401c169116896110b5565b3461027257600036600319011261027257611180611a8f565b50610d5361118c611acd565b60405191829182610c76565b346102725760203660031901126102725760406111b6600435611b70565b61054282518092602080916001600160401b0381511684520151910152565b3461027257600036600319011261027257600080516020612fad833981519152546040516001600160a01b039091168152602090f35b34610272576101c03660031901126102725761122636610618565b6080366101031901126102725760405190611240826103d8565b6101043582526101243560208301526101443560408301526101643560608301526101843563ffffffff81168103610272576107599261127e610277565b92611c33565b346102725760203660031901126102725761129d6110a2565b6112a5611fad565b63ffffffff808216610e1081109182156112f7575b50506112e5576017805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b60175460a81c161015905038806112ba565b34610272576000366003190112610272576010546001600160401b03610d5360115460125460135460145490601554926016549460405198888a998260401c169116896110b5565b3461027257600036600319011261027257608060055460065460075460085491604051938452602084015260408301526060820152f35b34610272576101003660031901126102725760206113ad6113a836610618565b611f01565b604051908152f35b346102725760003660031901126102725760408051906113d4826103b8565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b83811061141f5784604081866000838284010152601f80199101168101030190f35b85810183015185820183015282016113fd565b3461027257600036600319011261027257602060ff60175460a01c166040519015158152f35b3461027257600036600319011261027257602063ffffffff60175460a81c16604051908152f35b3461027257600036600319011261027257601a805460ff19169055005b34610272576000366003190112610272576020600354604051908152f35b34610272576000366003190112610272576009546001600160401b03610d53600a54600b54600c54600d5490600e5492600f549460405198888a998260401c169116896110b5565b34610272576040366003190112610272576004356024359060ff601a541660009060001461155057509061153c610d5392601b5490611b63565b115b60405190151581529081906020820190565b91601954914381118015611628575b6115b55761156d8493611b54565b9261158f6115836018546001600160401b031690565b6001600160401b031690565b935b81156115c7575b5090919250156115b557610d53926115af91611b63565b1161153e565b60405163b0b4387760e01b8152600490fd5b826115e56115836115d784610362565b50546001600160401b031690565b111561160e575b6002811061160957848114611609576116049061278b565b611591565b611598565b94505060016116226115836115d787610362565b946115ec565b506003831061155f565b346102725760203660031901126102725761075961164e61025c565b611656611fad565b611f39565b34610272576000366003190112610272576020601954604051908152f35b634e487b7160e01b600052600060045260246000fd5b60e0906116e16001600160401b03808351166001600160401b0319601054161760105560208301511667ffffffffffffffff60401b6010549160401b169067ffffffffffffffff60401b191617601055565b60408101516011556060810151601255608081015160135560a081015160145560c08101516015550151601655565b634e487b7160e01b600052601160045260246000fd5b9061173d5760028160008093558260018201550155565b611679565b80511561039d5760200190565b80516001101561039d5760400190565b80516002101561039d5760600190565b80516003101561039d5760800190565b80516004101561039d5760a00190565b80516005101561039d5760c00190565b80516006101561039d5760e00190565b80516007101561039d576101000190565b805182101561039d5760209160051b010190565b601954600160401b8110156103d3578060016117f39201601955610362565b91909161173d57805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b9060195460006019558061189f575b5060005b825181101561189a578061189461188e600193866117c0565b516117d4565b01611875565b509050565b600390806003029060038204036119075760196000527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9695908101905b8181106118e9575050611871565b80611901849260026000918281558260018201550155565b016118db565b611710565b9060175460ff8160a01c169081611a7b575b50611a695781516001600160401b031661194961158361193c611b27565b516001600160401b031690565b6001600160401b0380921611801590611a32575b611a20577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906119cf60408501936119958551611fe6565b6119a26060870151611fe6565b6119af6080870151611fe6565b6119bc60a0870151611fe6565b6119c960c0870151611fe6565b856124cb565b6119d88461168f565b6119e784824216834316612633565b611a0c60206119fd86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b031681611a606115836020611a52611b27565b01516001600160401b031690565b9116111561195d565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861191e565b60405190611a9c826103f3565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b60405190611ada826103f3565b816010546001600160401b0390818116835260401c16602082015260115460408201526012546060820152601354608082015260145460a082015260155460c082015260e0601654910152565b611b2f611a8f565b50611b38611acd565b90565b60405190611b48826103b8565b60006020838281520152565b60001981019190821161190757565b9190820391821161190757565b611b78611b3b565b5060195490611b8e611b8983611b54565b610362565b5090611ba86115836001809401546001600160401b031690565b811015611c2157611bc46115836018546001600160401b031690565b838110611be6575050506001611bdf611b89611b3893611b54565b50016104a7565b81611c0661158385611bf785610362565b5001546001600160401b031690565b11611c12578201611bc4565b611b389350611bdf9150610362565b604051631856a49960e21b8152600490fd5b929091600080516020612fed8339815191529283549460ff8660401c1615956001600160401b03811680159081611d34575b6001149081611d2a575b159081611d21575b50611d0f5767ffffffffffffffff1916600117909455611c9b9385611cea57611d3c565b611ca157565b600080516020612fed833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1565b600080516020612fed833981519152805460ff60401b1916600160401b179055611d3c565b60405163f92ee8a960e01b8152600490fd5b90501538611c77565b303b159150611c6f565b889150611c65565b9192611d5290611d4a612ed8565b611656612ed8565b611d5a612ed8565b6001600160401b039081611d7584516001600160401b031690565b1615801590611ee2575b8015611ed6575b8015611eca575b8015611ebe575b8015611eb2575b611ea05761047893611e3b611e6992611e1d8660e0906001600160401b038151166009549067ffffffffffffffff60401b602084015160401b16916fffffffffffffffffffffffffffffffff191617176009556040810151600a556060810151600b556080810151600c5560a0810151600d5560c0810151600e550151600f55565b80516005556020810151600655604081015160075560600151600855565b611e448461168f565b6017805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b611e95611e7583611f01565b80600055611e9060e085015191611e8b83600155565b600255565b600355565b804216904316612633565b6040516350dd03f760e11b8152600490fd5b5060e083015115611d9b565b5060c083015115611d94565b5060a083015115611d8d565b50608083015115611d86565b50611efa61158360208501516001600160401b031690565b1515611d7f565b60808101519060c060a082015191015160405191602083019384526040830152606082015260608152611f33816103d8565b51902090565b6001600160a01b03908116908115611f9457600080516020612fad83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612fad833981519152546001600160a01b03163303611fce57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561200f57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103d35760405260088252610100366020840137565b90816020910312610272575180151581036102725790565b90815180825260208080930193019160005b8281106120b9575050505090565b8351855293810193928101926001016120ab565b610460906120e683825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190612144610100928386019060208091805184520151910152565b60a081015191612164610140938487019060208091805184520151910152565b60c082015192612184610180948588019060208091805184520151910152565b60e0830151916121a46101c0938489019060208091805184520151910152565b8301516121c1610200918289019060208091805184520151910152565b610120840151916121e261024093848a019060208091805184520151910152565b8401519261220061028094858a019060208091805184520151910152565b61223b610160860151966122246102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b9392906124b7610478936104e0926124a86102606109609280518b52602081015160208c01526122e4604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c01526124928b61233060a08401516101008093019060208091805184520151910152565b6124638d6103c060c0860151612356610140918285019060208091805184520151910152565b61243660e088015195612379610180978887019060208091805184520151910152565b8801516123966101c0918287019060208091805184520151910152565b6124076101208a0151936123ba610200958689019060208091805184520151910152565b8a0151976123d8610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190612099565b9401906120cd565b6040513d6000823e3d90fd5b6020906124d66128a4565b60606124e0612054565b926001546124ed85611742565b5261250261158382516001600160401b031690565b61250b8561174f565b52612522611583868301516001600160401b031690565b61252b8561175f565b52604081015161253a8561176f565b5201516125468361177f565b526013546125538361178f565b526014546125608361179f565b5260155461256d836117af565b5261258c6040519485938493630c76545d60e21b8552600485016122a2565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af49081156125fd576000916125ce575b50156125bc57565b6040516309bde33960e01b8152600490fd5b6125f0915060203d6020116125f6575b6125e8818361042a565b810190612081565b386125b4565b503d6125de565b6124bf565b6001600160401b03918216908216039190821161190757565b6001600160401b038091169081146119075760010190565b90916126a2610478936019548015159081612708575b506126ac575b604061266560208501516001600160401b031690565b93015161268261267361046b565b6001600160401b039095168552565b602084015261269261267361047a565b6001600160401b03166020840152565b60408201526117d4565b6126ca6126c4611b896018546001600160401b031690565b90611726565b6127036126e76126e26018546001600160401b031690565b61261b565b6001600160401b03166001600160401b03196018541617601855565b61264f565b61274b915061271c611b8961272d92611b54565b505460401c6001600160401b031690565b61274561271c611b896018546001600160401b031690565b90612602565b6001600160401b0361277261276960175463ffffffff9060a81c1690565b63ffffffff1690565b9116101538612649565b90816020910312610272575190565b8015611907576000190190565b6127a0610487565b9060008252600060208301526127b4611b3b565b60408301526127c1611b3b565b60608301526127ce611b3b565b60808301526127db611b3b565b60a08301526127e8611b3b565b60c08301526127f5611b3b565b60e0830152612802611b3b565b610100830152612810611b3b565b61012083015261281e611b3b565b61014083015261282c611b3b565b61016083015261283a611b3b565b610180830152612848611b3b565b6101a0830152612856611b3b565b6101c0830152612864611b3b565b6101e0830152612872611b3b565b610200830152612880611b3b565b61022083015261288e611b3b565b61024083015261289c611b3b565b610260830152565b6128ac612798565b906201000082527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab37060206008818501527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b81604086017f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee818151525101527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c81606086017f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d8151525101527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d381608086017f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac88151525101527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea8160a086017f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c8398151525101527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b68160c086017f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce78151525101527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d8160e086017f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a68151525101527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b8161010086017f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f8151525101527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c148161012086017f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e088151525101527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba8161014086017f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e78151525101527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f8161016086017f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba6550228151525101527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e8161018086017f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df28151525101527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b816101a086017f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f78151525101527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc28816101c086017f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec738151525101527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d45690915824816101e086017f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508038151525101527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf8161020086017f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a8151525101527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab8161022086017f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db448151525101527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be18161024086017f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a7581515251015261026084017f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9815152510152565b90813b15612eb757600080516020612fcd83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612e9c57612e9991612f07565b50565b505034612ea557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612fed8339815191525460401c1615612ef557565b604051631afcd79f60e31b8152600490fd5b600080611b3893602081519101845af43d15612f45573d91612f2883610d57565b92612f36604051948561042a565b83523d6000602085013e612f49565b6060915b90612f705750805115612f5e57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612fa3575b612f81575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612f7956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a034620004be576001600160401b0390601f6200328c38819003918201601f191683019184831184841017620004115780849260409485528339810103916101008312620004be5760608312620004be578151936200005f85620004c3565b6200006a82620004df565b85526020906200007c828401620004df565b95828101968752848401519085810191825260808097605f190112620004be578551948786018681108582111762000411578752606081015186528781015198858701998a5260a08201519288880193845260e060c08401519360608a0194855201519363ffffffff918286168603620004be57308c527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054808d1c60ff16620004ad57808a80809316036200046d575b50825116158015915062000460575b801562000456575b80156200044c575b801562000442575b801562000438575b620004275787905116906009549568010000000000000000600160801b039d8e8d8751901b16808560018060801b0319809b16171760095589519182600a558d5160055551938460065551978860075551948560085589600b54161717600b55600c55600d549063ffffffff60a81b9060a81b169063ffffffff60a81b1916179182600d558b51958a87019283528c8701526060860152606085528b85019480861089871117620004115788958c52519020600099818b55519081600155600255600355600f54918215159283620003a2575b5050506200032a575b5116915186519287840184811086821117620003165788528352848301528551976200026589620004c3565b8343168952848901918442168352878a01938452600f54680100000000000000008110156200031657806001620002a09201600f55620004f4565b9790976200030257508460029798999a51169088549260018060401b03199483868616178b55518b1b169216171786556001860191519283511690825416179055015191015551612d6191826200052b833951818181610c600152610db80152f35b634e487b7160e01b81526004819052602490fd5b634e487b7160e01b88526041600452602488fd5b906200033a90600e5416620004f4565b6200038e57600281888093558260018201550155600e548481168581146200037a5760010185166001600160401b03199190911617600e55839062000239565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b87526004879052602487fd5b9193945091506000198101908111620003fd57620003c18791620004f4565b50548a1c1686620003d681600e5416620004f4565b50548b1c16900391868311620003fd5786939291849160a81c169116101538808062000230565b634e487b7160e01b89526011600452602489fd5b634e487b7160e01b600052604160045260246000fd5b8a516350dd03f760e11b8152600490fd5b508951156200015d565b5084511562000155565b508151156200014d565b508c511562000145565b508784511615156200013d565b6001600160401b0319161790558a518881527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2908a90a13888816200012e565b8c5163f92ee8a960e01b8152600490fd5b600080fd5b606081019081106001600160401b038211176200041157604052565b51906001600160401b0382168203620004be57565b600f548110156200051457600f6000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461025757806302b592f3146102525780630c693a221461024d5780630d8e6e2c146102485780632063d4f7146102435780632d52aad61461023e5780632f5f4600146102395780632f79889d14610234578063313df7b11461022f578063382b215a1461022a5780634847ae5d146102255780634f1ef2861461022057806352d1902d1461021b578063628277331461021657806369cc6a04146102115780636f96bdae1461020c578063715018a61461020757806376b6b7cb146102025780637f17baad146101fd57806382d07ff3146101f85780638584d23f146101f35780638da5cb5b146101ee57806396c1ca61146101e95780639baa3cc9146101e45780639fdb54a7146101df578063a9a9c9f5146101da578063ad3cb1cc146101d5578063b5adea3c146101d0578063bd32519a146101cb578063c23b9e9e146101c6578063c8e5e498146101c1578063ca6fe855146101bc578063d24d933d146101b7578063e0303301146101b2578063f2fde38b146101ad5763f9e50d19146101a857600080fd5b61161d565b6115f4565b6114c4565b611489565b61146b565b61144e565b611427565b611401565b6113a8565b61132b565b6112f4565b6112b9565b61116c565b6110e7565b6110b1565b611074565b61101d565b610fbf565b610f7b565b610f10565b610ec5565b610e2e565b610e10565b610da5565b610be6565b610b4a565b610b2c565b610b03565b610adc565b6109f2565b6109b5565b61085d565b6105ad565b61052d565b6104b7565b61028e565b600435906001600160a01b038216820361027257565b600080fd5b61010435906001600160a01b038216820361027257565b34610272576020366003190112610272576102a761025c565b6102af611d2b565b6001600160a01b0390811690811561033f57600d54908116821461032d5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600d8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600f548110156103a257600390600f600052027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020190600090565b610351565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b038211176103d857604052565b6103a7565b608081019081106001600160401b038211176103d857604052565b606081019081106001600160401b038211176103d857604052565b90601f801991011681019081106001600160401b038211176103d857604052565b604051906102e082018281106001600160401b038211176103d857604052565b60405190610461826103bd565b565b60405190610461826103f8565b6040519061028082018281106001600160401b038211176103d857604052565b9060405161049d816103bd565b6020600182946001600160401b0381541684520154910152565b3461027257602036600319011261027257600435600f54811015610272576104e0608091610367565b5061052b8154916104fb60016001600160401b039201610490565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610272576000806003193601126105aa5760809060409060608251610552816103dd565b82815282602082015282848201520152805161056d816103dd565b6005549182825260065460208301908152600754908284019182526060600854940193845282519485525160208501525190830152516060820152f35b80fd5b34610272576000366003190112610272576060604051600181526000602082015260006040820152f35b35906001600160401b038216820361027257565b60609060031901126102725760405190610604826103f8565b816001600160401b03600435818116810361027257825260243590811681036102725760208201526040604435910152565b6040906063190112610272576040519061064f826103bd565b60643582526084356020830152565b60409060a31901126102725760405190610677826103bd565b60a435825260c4356020830152565b60409060e3190112610272576040519061069f826103bd565b60e4358252610104356020830152565b60409061012319011261027257604051906106c9826103bd565b610124358252610144356020830152565b60409061016319011261027257604051906106f4826103bd565b610164358252610184356020830152565b6040906101a3190112610272576040519061071f826103bd565b6101a43582526101c4356020830152565b6040906101e3190112610272576040519061074a826103bd565b6101e4358252610204356020830152565b6040906102231901126102725760405190610775826103bd565b610224358252610244356020830152565b60409061026319011261027257604051906107a0826103bd565b610264358252610284356020830152565b6040906102a319011261027257604051906107cb826103bd565b6102a43582526102c4356020830152565b6040906102e319011261027257604051906107f6826103bd565b6102e4358252610304356020830152565b6040906103231901126102725760405190610821826103bd565b610324358252610344356020830152565b604090610363190112610272576040519061084c826103bd565b610364358252610384356020830152565b34610272576104e036600319011261027257610878366105eb565b610480366063190112610272576109b390610891610434565b9061089b36610636565b82526108a63661065e565b60208301526108b436610686565b60408301526108c2366106af565b60608301526108d0366106da565b60808301526108de36610705565b60a08301526108ec36610730565b60c08301526108fa3661075b565b60e083015261090836610786565b610100830152610917366107b1565b610120830152610926366107dc565b61014083015261093536610807565b61016083015261094436610832565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c083015261168e565b005b34610272576020366003190112610272576010805460ff19166001179055600435601155005b6001600160401b0381116103d85760051b60200190565b346102725760208060031936011261027257600435906001600160401b038211610272573660238301121561027257816004013591610a30836109db565b91604093610a4085519485610413565b80845260248285019160071b8401019236841161027257602401905b838210610a6c576109b3856118ee565b813603608081126102725786805191610a84836103f8565b610a8d856105d7565b8352610a9a8686016105d7565b83870152603f1901126102725760809184918851610ab7816103bd565b610ac28a87016105d7565b815260608601358482015289820152815201910190610a5c565b346102725760003660031901126102725760206001600160401b03600e5416604051908152f35b3461027257600036600319011261027257600d546040516001600160a01b039091168152602090f35b34610272576000366003190112610272576020600254604051908152f35b3461027257600036600319011261027257610b63611998565b50610bc7604051610b73816103f8565b6009546001600160401b0390818116835260401c166020820152600a5460408201526040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b0390f35b6001600160401b0381116103d857601f01601f191660200190565b60408060031936011261027257610bfb61025c565b6024356001600160401b038111610272573660238201121561027257806004013590610c2682610bcb565b91610c3385519384610413565b80835260209136602483830101116102725781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610d89575b50610d78579080600492610c9e611d2b565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610d49575b5050610d0e578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612d158339815191528193929303610d30576109b38383612b79565b8351632a87526960e21b81526004810191909152602490fd5b610d69929350803d10610d71575b610d618183610413565b8101906124c4565b903880610ce8565b503d610d57565b845163703e46dd60e11b8152600490fd5b905081600080516020612d158339815191525416141538610c8c565b34610272576000366003190112610272577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610dfe576020604051600080516020612d158339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610272576000366003190112610272576020600154604051908152f35b34610272576000806003193601126105aa57610e48611d2b565b600d5460ff8160a01c1660001461032d576001600160a81b031916600d557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b60809060631901126102725760405190610ea6826103dd565b6064358252608435602083015260a435604083015260c4356060830152565b34610272576080366003190112610272576020610f08604051610ee7816103dd565b600435815260243583820152604435604082015260643560608201526119e9565b604051908152f35b34610272576000806003193601126105aa57610f2a611d2b565b600080516020612cf583398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610272576000366003190112610272576020600054604051908152f35b6004359063ffffffff8216820361027257565b60e4359063ffffffff8216820361027257565b346102725760203660031901126102725763ffffffff610fdd610f99565b16600090815260046020908152604091829020805460019091015483516001600160401b03808416825292851c9092169282019290925291820152606090f35b3461027257600036600319011261027257611036611998565b50610bc76110426119b7565b6040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b34610272576020366003190112610272576040611092600435611a6a565b61052b82518092602080916001600160401b0381511684520151910152565b3461027257600036600319011261027257600080516020612cf5833981519152546040516001600160a01b039091168152602090f35b3461027257602036600319011261027257611100610f99565b611108611d2b565b63ffffffff808216610e10811091821561115a575b505061114857600d805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600d5460a81c1610159050388061111d565b346102725761012036600319011261027257611187366105eb565b61119036610e8d565b90611199610fac565b6111a1610277565b90600080516020612d3583398151915254936001600160401b0360ff8660401c16159516801590816112b1575b60011490816112a7575b15908161129e575b5061128c57600080516020612d35833981519152805467ffffffffffffffff19166001179055611214938561126757611b2d565b61121a57005b600080516020612d35833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2908060208101610328565b600080516020612d35833981519152805460ff60401b1916600160401b179055611b2d565b60405163f92ee8a960e01b8152600490fd5b905015386111e0565b303b1591506111d8565b8691506111ce565b3461027257600036600319011261027257600b54600c54604080516001600160401b03808516825293821c9093166020840152820152606090f35b3461027257600036600319011261027257608060055460065460075460085491604051938452602084015260408301526060820152f35b3461027257600036600319011261027257604080519061134a826103bd565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106113955784604081866000838284010152601f80199101168101030190f35b8581018301518582018301528201611373565b346102725760603660031901126102725760406113c4366105eb565b6001600160401b03815116600b549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600b550151600c55600080f35b3461027257600036600319011261027257602060ff600d5460a01c166040519015158152f35b3461027257600036600319011261027257602063ffffffff600d5460a81c16604051908152f35b34610272576000366003190112610272576010805460ff19169055005b34610272576000366003190112610272576020600354604051908152f35b3461027257600036600319011261027257600954600a54604080516001600160401b03808516825293821c9093166020840152820152606090f35b34610272576040366003190112610272576004356024359060ff601054166000906000146115125750906114fe610bc79260115490611a5d565b115b60405190151581529081906020820190565b91600f549143811180156115ea575b6115775761152f8493611a4e565b92611551611545600e546001600160401b031690565b6001600160401b031690565b935b8115611589575b50909192501561157757610bc79261157191611a5d565b11611500565b60405163b0b4387760e01b8152600490fd5b826115a761154561159984610367565b50546001600160401b031690565b11156115d0575b600281106115cb578481146115cb576115c6906124d3565b611553565b61155a565b94505060016115e461154561159987610367565b946115ae565b5060038310611521565b34610272576020366003190112610272576109b361161061025c565b611618611d2b565b611cb7565b34610272576000366003190112610272576020600f54604051908152f35b634e487b7160e01b600052600060045260246000fd5b6040906001600160401b03815116600b549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600b550151600c55565b90600d5460ff8160a01c1690816117c9575b506117b75781516001600160401b03166116cb6115456116be611a21565b516001600160401b031690565b6001600160401b0380921611801590611780575b61176e577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae69061171d60408501936117178551611d64565b85612249565b61172684611651565b6117358482421683431661237b565b61175a602061174b86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b0316816117ae61154560206117a0611a21565b01516001600160401b031690565b911611156116df565b6040516301474c8f60e71b8152600490fd5b6001600160a01b03163314159050386116a0565b634e487b7160e01b600052601160045260246000fd5b9061180a5760028160008093558260018201550155565b61163b565b8051156103a25760200190565b8051600110156103a25760400190565b8051600210156103a25760600190565b8051600310156103a25760800190565b80518210156103a25760209160051b010190565b600f54600160401b8110156103d85780600161187f9201600f55610367565b91909161180a57805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b90600f546000600f558061192b575b5060005b8251811015611926578061192061191a6001938661184c565b51611860565b01611901565b509050565b6003908060030290600382040361199357600f6000527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802908101905b8181106119755750506118fd565b8061198d849260026000918281558260018201550155565b01611967565b6117dd565b604051906119a5826103f8565b60006040838281528260208201520152565b604051906119c4826103f8565b81600b546001600160401b0390818116835260401c1660208201526040600c54910152565b6020810151906060604082015191015160405191602083019384526040830152606082015260608152611a1b816103dd565b51902090565b611a29611998565b50611a326119b7565b90565b60405190611a42826103bd565b60006020838281520152565b60001981019190821161199357565b9190820391821161199357565b611a72611a35565b50600f5490611a88611a8383611a4e565b610367565b5090611aa26115456001809401546001600160401b031690565b811015611b1b57611abe611545600e546001600160401b031690565b838110611ae0575050506001611ad9611a83611a3293611a4e565b5001610490565b81611b0061154585611af185610367565b5001546001600160401b031690565b11611b0c578201611abe565b611a329350611ad99150610367565b604051631856a49960e21b8152600490fd5b919092611b4490611b3c612c20565b611618612c20565b611b4c612c20565b6001600160401b039081611b6784516001600160401b031690565b1615801590611c98575b8015611c8c575b8015611c80575b8015611c74575b8015611c6b575b611c595761046193611c28611c4e92611bdd866040906001600160401b038151166009549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176009550151600a55565b8251600555602083015160065560408301516007556060830151600855611c0386611651565b600d805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b611c49611c34826119e9565b91826000555191611c4483600155565b600255565b600355565b80421690431661237b565b6040516350dd03f760e11b8152600490fd5b50835115611b8d565b50606084015115611b86565b50604084015115611b7f565b50602084015115611b78565b50611cb061154560208501516001600160401b031690565b1515611b71565b6001600160a01b03908116908115611d1257600080516020612cf583398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612cf5833981519152546001600160a01b03163303611d4c57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611d8d57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103d85760405260088252610100366020840137565b90816020910312610272575180151581036102725790565b90815180825260208080930193019160005b828110611e37575050505090565b835185529381019392810192600101611e29565b61046090611e6483825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611ec2610100928386019060208091805184520151910152565b60a081015191611ee2610140938487019060208091805184520151910152565b60c082015192611f02610180948588019060208091805184520151910152565b60e083015191611f226101c0938489019060208091805184520151910152565b830151611f3f610200918289019060208091805184520151910152565b61012084015191611f6061024093848a019060208091805184520151910152565b84015192611f7e61028094858a019060208091805184520151910152565b611fb961016086015196611fa26102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b939290612235610461936104e0926122266102606109609280518b52602081015160208c0152612062604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c01526122108b6120ae60a08401516101008093019060208091805184520151910152565b6121e18d6103c060c08601516120d4610140918285019060208091805184520151910152565b6121b460e0880151956120f7610180978887019060208091805184520151910152565b8801516121146101c0918287019060208091805184520151910152565b6121856101208a015193612138610200958689019060208091805184520151910152565b8a015197612156610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611e17565b940190611e4b565b6040513d6000823e3d90fd5b6020906122546125ec565b604061225e611dd2565b9260015461226b8561180f565b5261228061154582516001600160401b031690565b6122898561181c565b526122a0611545868301516001600160401b031690565b6122a98561182c565b5201516122b58361183c565b526122d46040519485938493630c76545d60e21b855260048501612020565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af490811561234557600091612316575b501561230457565b6040516309bde33960e01b8152600490fd5b612338915060203d60201161233e575b6123308183610413565b810190611dff565b386122fc565b503d612326565b61223d565b6001600160401b03918216908216039190821161199357565b6001600160401b038091169081146119935760010190565b90916123ea61046193600f548015159081612450575b506123f4575b60406123ad60208501516001600160401b031690565b9301516123ca6123bb610454565b6001600160401b039095168552565b60208401526123da6123bb610463565b6001600160401b03166020840152565b6040820152611860565b61241261240c611a83600e546001600160401b031690565b906117f3565b61244b61242f61242a600e546001600160401b031690565b612363565b6001600160401b03166001600160401b0319600e541617600e55565b612397565b6124939150612464611a8361247592611a4e565b505460401c6001600160401b031690565b61248d612464611a83600e546001600160401b031690565b9061234a565b6001600160401b036124ba6124b1600d5463ffffffff9060a81c1690565b63ffffffff1690565b9116101538612391565b90816020910312610272575190565b8015611993576000190190565b6124e8610470565b9060008252600060208301526124fc611a35565b6040830152612509611a35565b6060830152612516611a35565b6080830152612523611a35565b60a0830152612530611a35565b60c083015261253d611a35565b60e083015261254a611a35565b610100830152612558611a35565b610120830152612566611a35565b610140830152612574611a35565b610160830152612582611a35565b610180830152612590611a35565b6101a083015261259e611a35565b6101c08301526125ac611a35565b6101e08301526125ba611a35565b6102008301526125c8611a35565b6102208301526125d6611a35565b6102408301526125e4611a35565b610260830152565b6125f46124e0565b906201000082527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab37060206008818501527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b81604086017f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee818151525101527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c81606086017f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d8151525101527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d381608086017f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac88151525101527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea8160a086017f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c8398151525101527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b68160c086017f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce78151525101527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d8160e086017f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a68151525101527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b8161010086017f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f8151525101527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c148161012086017f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e088151525101527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba8161014086017f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e78151525101527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f8161016086017f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba6550228151525101527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e8161018086017f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df28151525101527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b816101a086017f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f78151525101527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc28816101c086017f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec738151525101527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d45690915824816101e086017f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508038151525101527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf8161020086017f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a8151525101527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab8161022086017f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db448151525101527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be18161024086017f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a7581515251015261026084017f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9815152510152565b90813b15612bff57600080516020612d1583398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612be457612be191612c4f565b50565b505034612bed57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612d358339815191525460401c1615612c3d57565b604051631afcd79f60e31b8152600490fd5b600080611a3293602081519101845af43d15612c8d573d91612c7083610bcb565b92612c7e6040519485610413565b83523d6000602085013e612c91565b6060915b90612cb85750805115612ca657805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612ceb575b612cc9575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612cc156fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json index 5c16e2b88..c3f5f758a 100644 --- a/contract-bindings/artifacts/LightClient_bytecode.json +++ b/contract-bindings/artifacts/LightClient_bytecode.json @@ -1 +1 @@ -"0x60a080604052346100cd57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100be57506001600160401b036002600160401b031982821601610079575b604051612d1f9081620000d38239608051818181610b960152610cee0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461021757806302b592f3146102125780630c693a221461020d5780630d8e6e2c146102085780632f79889d14610203578063313df7b1146101fe578063382b215a146101f9578063409939b7146101f45780634847ae5d146101ef5780634f1ef286146101ea57806352d1902d146101e557806362827733146101e057806369cc6a04146101db578063715018a6146101d657806376b6b7cb146101d15780637f17baad146101cc57806382d07ff3146101c75780638584d23f146101c25780638da5cb5b146101bd5780638ed3e045146101b857806396c1ca61146101b35780639fdb54a7146101ae578063a9a9c9f5146101a9578063aa922732146101a4578063ad3cb1cc1461019f578063bd32519a1461019a578063c23b9e9e14610195578063ca6fe85514610190578063d24d933d1461018b578063e030330114610186578063f2fde38b146101815763f9e50d191461017c57600080fd5b6113bd565b611394565b61128f565b611247565b611229565b611202565b6111dc565b61115f565b611132565b6110fb565b6110b3565b61102e565b610fb5565b610f7f565b610f42565b610f11565b610ea1565b610e2e565b610dc3565b610d64565b610d46565b610cdb565b610b1c565b610a7e565b6108c7565b6105f5565b6105cc565b6105a5565b61057b565b6104fb565b610485565b61024e565b600435906001600160a01b038216820361023257565b600080fd5b6101a435906001600160a01b038216820361023257565b346102325760203660031901126102325761026761021c565b61026f611b01565b6001600160a01b039081169081156102fa5760175490811682146102e85760ff60a01b19919091166001600160a81b03199190911617600160a01b1760178190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa4607290602090a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b60195481101561035d576003906019600052027f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950190600090565b61030c565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761039357604052565b610362565b608081019081106001600160401b0382111761039357604052565b61010081019081106001600160401b0382111761039357604052565b90601f801991011681019081106001600160401b0382111761039357604052565b604051906102e082018281106001600160401b0382111761039357604052565b6040519061041d82610378565b565b60405190606082018281106001600160401b0382111761039357604052565b6040519061028082018281106001600160401b0382111761039357604052565b9060405161046b81610378565b6020600182946001600160401b0381541684520154910152565b3461023257602036600319011261023257600435601954811015610232576104ae608091610322565b506104f98154916104c960016001600160401b03920161045e565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b3461023257600080600319360112610578576080906040906060825161052081610398565b82815282602082015282848201520152805161053b81610398565b6005549182825260065460208301908152600754908284019182526060600854940193845282519485525160208501525190830152516060820152f35b80fd5b34610232576000366003190112610232576060604051600181526000602082015260006040820152f35b346102325760003660031901126102325760206001600160401b0360185416604051908152f35b34610232576000366003190112610232576017546040516001600160a01b039091168152602090f35b34610232576000366003190112610232576020600254604051908152f35b602435906001600160401b038216820361023257565b6101009060031901126102325760405190610643826103b3565b816004356001600160401b0381168103610232578152610661610613565b602082015260443560408201526064356060820152608435608082015260a43560a082015260c43560c082015260e060e435910152565b60409061010319011261023257604051906106b282610378565b610104358252610124356020830152565b60409061014319011261023257604051906106dd82610378565b610144358252610164356020830152565b604090610183190112610232576040519061070882610378565b6101843582526101a4356020830152565b6040906101c3190112610232576040519061073382610378565b6101c43582526101e4356020830152565b604090610203190112610232576040519061075e82610378565b610204358252610224356020830152565b604090610243190112610232576040519061078982610378565b610244358252610264356020830152565b60409061028319011261023257604051906107b482610378565b6102843582526102a4356020830152565b6040906102c319011261023257604051906107df82610378565b6102c43582526102e4356020830152565b604090610303190112610232576040519061080a82610378565b610304358252610324356020830152565b604090610343190112610232576040519061083582610378565b610344358252610364356020830152565b604090610383190112610232576040519061086082610378565b6103843582526103a4356020830152565b6040906103c3190112610232576040519061088b82610378565b6103c43582526103e4356020830152565b60409061040319011261023257604051906108b682610378565b610404358252610424356020830152565b3461023257610580366003190112610232576108e236610629565b6104803661010319011261023257610a1e906108fc6103f0565b9061090636610698565b8252610911366106c3565b602083015261091f366106ee565b604083015261092d36610719565b606083015261093b36610744565b60808301526109493661076f565b60a08301526109573661079a565b60c0830152610965366107c5565b60e0830152610973366107f0565b6101008301526109823661081b565b61012083015261099136610846565b6101408301526109a036610871565b6101608301526109af3661089c565b610180830152610444356101a0830152610464356101c0830152610484356101e08301526104a4356102008301526104c4356102208301526104e4356102408301526105043561026083015261052435610280830152610544356102a0830152610564356102c0830152611441565b005b91909160e0806101008301946001600160401b03808251168552602082015116602085015260408101516040850152606081015160608501526080810151608085015260a081015160a085015260c081015160c08501520151910152565b3461023257600036600319011261023257610a976115c4565b50610afd604051610aa7816103b3565b6009546001600160401b0390818116835260401c166020820152600a546040820152600b546060820152600c546080820152600d5460a0820152600e5460c0820152600f5460e082015260405191829182610a20565b0390f35b6001600160401b03811161039357601f01601f191660200190565b60408060031936011261023257610b3161021c565b6024356001600160401b038111610232573660238201121561023257806004013590610b5c82610b01565b91610b69855193846103cf565b80835260209136602483830101116102325781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610cbf575b50610cae579080600492610bd4611b01565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610c7f575b5050610c44578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612cd38339815191528193929303610c6657610a1e8383612b37565b8351632a87526960e21b81526004810191909152602490fd5b610c9f929350803d10610ca7575b610c9781836103cf565b81019061248e565b903880610c1e565b503d610c8d565b845163703e46dd60e11b8152600490fd5b905081600080516020612cd38339815191525416141538610bc2565b34610232576000366003190112610232577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610d34576020604051600080516020612cd38339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610232576000366003190112610232576020600154604051908152f35b346102325760008060031936011261057857610d7e611b01565b60175460ff8160a01c166000146102e8576001600160a81b0319166017557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b346102325760008060031936011261057857610ddd611b01565b600080516020612cb383398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610232576000366003190112610232576020600054604051908152f35b6004359063ffffffff8216820361023257565b949198979693909260e0969361010087019a6001600160401b03809216885216602087015260408601526060850152608084015260a083015260c08201520152565b346102325760203660031901126102325763ffffffff610ebf610e4c565b1660005260046020526040600020805490610afd6001600160401b039160018101549060028101546003820154600483015491600660058501549401549460405198888a998260401c16911689610e5f565b3461023257600036600319011261023257610f2a6115c4565b50610afd610f36611602565b60405191829182610a20565b34610232576020366003190112610232576040610f606004356116c0565b6104f982518092602080916001600160401b0381511684520151910152565b3461023257600036600319011261023257600080516020612cb3833981519152546040516001600160a01b039091168152602090f35b34610232576101c036600319011261023257610fd036610629565b6080366101031901126102325760405190610fea82610398565b6101043582526101243560208301526101443560408301526101643560608301526101843563ffffffff8116810361023257610a1e92611028610237565b92611783565b3461023257602036600319011261023257611047610e4c565b61104f611b01565b63ffffffff808216610e1081109182156110a1575b505061108f576017805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b60175460a81c16101590503880611064565b34610232576000366003190112610232576010546001600160401b03610afd60115460125460135460145490601554926016549460405198888a998260401c16911689610e5f565b3461023257600036600319011261023257608060055460065460075460085491604051938452602084015260408301526060820152f35b346102325761010036600319011261023257602061115761115236610629565b611a48565b604051908152f35b3461023257600036600319011261023257604080519061117e82610378565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106111c95784604081866000838284010152601f80199101168101030190f35b85810183015185820183015282016111a7565b3461023257600036600319011261023257602060ff60175460a01c166040519015158152f35b3461023257600036600319011261023257602063ffffffff60175460a81c16604051908152f35b34610232576000366003190112610232576020600354604051908152f35b34610232576000366003190112610232576009546001600160401b03610afd600a54600b54600c54600d5490600e5492600f549460405198888a998260401c16911689610e5f565b3461023257604036600319011261023257600435601954438211801561138a575b611317576000916112c260009261169f565b916112e46112d86018546001600160401b031690565b6001600160401b031690565b925b8115611329575b509091501561131757611306610afd92602435926116b3565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b826113476112d861133984610322565b50546001600160401b031690565b1115611370575b6002811061136b5783811461136b5761136690611a80565b6112e6565b6112ed565b93505060016113846112d861133986610322565b9361134e565b50600381106112b0565b3461023257602036600319011261023257610a1e6113b061021c565b6113b8611b01565b611a8d565b34610232576000366003190112610232576020601954604051908152f35b60e0906001600160401b038151166010549067ffffffffffffffff60401b602084015160401b16916001600160801b031916171760105560408101516011556060810151601255608081015160135560a081015160145560c08101516015550151601655565b9060175460ff8160a01c1690816115b0575b5061159e5781516001600160401b031661147e6112d861147161165c565b516001600160401b031690565b6001600160401b0380921611801590611567575b611555577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae69061150460408501936114ca8551611b3a565b6114d76060870151611b3a565b6114e46080870151611b3a565b6114f160a0870151611b3a565b6114fe60c0870151611b3a565b8561209d565b61150d846113db565b61151c84824216834316612345565b611541602061153286516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b0316816115956112d8602061158761165c565b01516001600160401b031690565b91161115611492565b6040516301474c8f60e71b8152600490fd5b6001600160a01b0316331415905038611453565b604051906115d1826103b3565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b6040519061160f826103b3565b816010546001600160401b0390818116835260401c16602082015260115460408201526012546060820152601354608082015260145460a082015260155460c082015260e0601654910152565b6116646115c4565b5061166d611602565b90565b6040519061167d82610378565b60006020838281520152565b634e487b7160e01b600052601160045260246000fd5b6000198101919082116116ae57565b611689565b919082039182116116ae57565b6116c8611670565b50601954906116de6116d98361169f565b610322565b50906116f86112d86001809401546001600160401b031690565b811015611771576117146112d86018546001600160401b031690565b83811061173657505050600161172f6116d961166d9361169f565b500161045e565b816117566112d88561174785610322565b5001546001600160401b031690565b11611762578201611714565b61166d935061172f9150610322565b604051631856a49960e21b8152600490fd5b929091600080516020612cf38339815191529283549460ff8660401c1615956001600160401b03811680159081611884575b600114908161187a575b159081611871575b5061185f5767ffffffffffffffff19166001179094556117eb938561183a5761188c565b6117f157565b600080516020612cf3833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1565b600080516020612cf3833981519152805460ff60401b1916600160401b17905561188c565b60405163f92ee8a960e01b8152600490fd5b905015386117c7565b303b1591506117bf565b8891506117b5565b91926118a29061189a612bde565b6113b8612bde565b6118aa612bde565b6001600160401b0390816118c584516001600160401b031690565b1615801590611a29575b8015611a1d575b8015611a11575b8015611a05575b80156119f9575b6119e75761041d936119826119b0926119648660e0906001600160401b038151166009549067ffffffffffffffff60401b602084015160401b16916001600160801b03191617176009556040810151600a556060810151600b556080810151600c5560a0810151600d5560c0810151600e550151600f55565b80516005556020810151600655604081015160075560600151600855565b61198b846113db565b6017805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b6119dc6119bc83611a48565b806000556119d760e0850151916119d283600155565b600255565b600355565b804216904316612345565b6040516350dd03f760e11b8152600490fd5b5060e0830151156118eb565b5060c0830151156118e4565b5060a0830151156118dd565b506080830151156118d6565b50611a416112d860208501516001600160401b031690565b15156118cf565b60808101519060c060a082015191015160405191602083019384526040830152606082015260608152611a7a81610398565b51902090565b80156116ae576000190190565b6001600160a01b03908116908115611ae857600080516020612cb383398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612cb3833981519152546001600160a01b03163303611b2257565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611b6357565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103935760405260088252610100366020840137565b80511561035d5760200190565b80516001101561035d5760400190565b80516002101561035d5760600190565b80516003101561035d5760800190565b80516004101561035d5760a00190565b80516005101561035d5760c00190565b80516006101561035d5760e00190565b80516007101561035d576101000190565b90816020910312610232575180151581036102325790565b90815180825260208080930193019160005b828110611c8b575050505090565b835185529381019392810192600101611c7d565b61046090611cb883825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611d16610100928386019060208091805184520151910152565b60a081015191611d36610140938487019060208091805184520151910152565b60c082015192611d56610180948588019060208091805184520151910152565b60e083015191611d766101c0938489019060208091805184520151910152565b830151611d93610200918289019060208091805184520151910152565b61012084015191611db461024093848a019060208091805184520151910152565b84015192611dd261028094858a019060208091805184520151910152565b611e0d61016086015196611df66102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b93929061208961041d936104e09261207a6102606109609280518b52602081015160208c0152611eb6604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c01526120648b611f0260a08401516101008093019060208091805184520151910152565b6120358d6103c060c0860151611f28610140918285019060208091805184520151910152565b61200860e088015195611f4b610180978887019060208091805184520151910152565b880151611f686101c0918287019060208091805184520151910152565b611fd96101208a015193611f8c610200958689019060208091805184520151910152565b8a015197611faa610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611c6b565b940190611c9f565b6040513d6000823e3d90fd5b6020906120a86125a9565b60606120b2611ba8565b926001546120bf85611bd5565b526120d46112d882516001600160401b031690565b6120dd85611be2565b526120f46112d8868301516001600160401b031690565b6120fd85611bf2565b52604081015161210c85611c02565b52015161211883611c12565b5260135461212583611c22565b5260145461213283611c32565b5260155461213f83611c42565b5261215e6040519485938493630c76545d60e21b855260048501611e74565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af49081156121cf576000916121a0575b501561218e57565b6040516309bde33960e01b8152600490fd5b6121c2915060203d6020116121c8575b6121ba81836103cf565b810190611c53565b38612186565b503d6121b0565b612091565b6001600160401b0391821690821603919082116116ae57565b906122045760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146116ae5760010190565b601954600160401b81101561039357600181018060195581101561035d57602060037f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9697926019600052029261233e6040857f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c969501926001600160401b03936122d28583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96968601906001600160401b03166001600160401b0319825416179055565b0151910155565b90916123b461041d93601954801515908161241a575b506123be575b604061237760208501516001600160401b031690565b930151612394612385610410565b6001600160401b039095168552565b60208401526123a461238561041f565b6001600160401b03166020840152565b6040820152612232565b6123dc6123d66116d96018546001600160401b031690565b906121ed565b6124156123f96123f46018546001600160401b031690565b61221a565b6001600160401b03166001600160401b03196018541617601855565b612361565b61245d915061242e6116d961243f9261169f565b505460401c6001600160401b031690565b61245761242e6116d96018546001600160401b031690565b906121d4565b6001600160401b0361248461247b60175463ffffffff9060a81c1690565b63ffffffff1690565b911610153861235b565b90816020910312610232575190565b6124a561043e565b9060008252600060208301526124b9611670565b60408301526124c6611670565b60608301526124d3611670565b60808301526124e0611670565b60a08301526124ed611670565b60c08301526124fa611670565b60e0830152612507611670565b610100830152612515611670565b610120830152612523611670565b610140830152612531611670565b61016083015261253f611670565b61018083015261254d611670565b6101a083015261255b611670565b6101c0830152612569611670565b6101e0830152612577611670565b610200830152612585611670565b610220830152612593611670565b6102408301526125a1611670565b610260830152565b6125b161249d565b906210000082527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d560206008818501527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c81604086017f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b338151525101527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e97081606086017f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db8151525101527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d81608086017f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b998151525101527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df600938160a086017f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a58066258151525101527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde288160c086017f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a98151525101527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc038160e086017f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b596938151525101527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad8161010086017f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e78151525101527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea170318161012086017f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e48151525101527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db70368161014086017f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae72488151525101527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e84158161016086017f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e56198151525101527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a38161018086017f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc88151525101527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c816101a086017f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc8151525101527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd5816101c086017f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b408151525101527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd3816101e086017f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc58151525101527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc8161020086017f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa48151525101527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e8161022086017f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a297822268151525101527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd48161024086017f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab261423981515251015261026084017f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82815152510152565b90813b15612bbd57600080516020612cd383398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612ba257612b9f91612c0d565b50565b505034612bab57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612cf38339815191525460401c1615612bfb57565b604051631afcd79f60e31b8152600490fd5b60008061166d93602081519101845af43d15612c4b573d91612c2e83610b01565b92612c3c60405194856103cf565b83523d6000602085013e612c4f565b6060915b90612c765750805115612c6457805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612ca9575b612c87575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612c7f56fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a080604052346100cd57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100be57506001600160401b036002600160401b031982821601610079575b604051612b0d9081620000d38239608051818181610ae50152610c3d0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461021757806302b592f3146102125780630c693a221461020d5780630d8e6e2c146102085780632063d4f7146102035780632f79889d146101fe578063313df7b1146101f9578063382b215a146101f45780634847ae5d146101ef5780634f1ef286146101ea57806352d1902d146101e557806362827733146101e057806369cc6a04146101db5780636f96bdae146101d6578063715018a6146101d157806376b6b7cb146101cc5780637f17baad146101c757806382d07ff3146101c25780638584d23f146101bd5780638da5cb5b146101b857806396c1ca61146101b35780639baa3cc9146101ae5780639fdb54a7146101a9578063a9a9c9f5146101a4578063ad3cb1cc1461019f578063bd32519a1461019a578063c23b9e9e14610195578063ca6fe85514610190578063d24d933d1461018b578063e030330114610186578063f2fde38b146101815763f9e50d191461017c57600080fd5b611401565b6113d8565b6112d3565b611298565b61127a565b611253565b61122d565b6111b0565b611179565b61113e565b610ff1565b610f6c565b610f36565b610ef9565b610ea2565b610e44565b610e00565b610d95565b610d4a565b610cb3565b610c95565b610c2a565b610a6b565b6109cf565b6109b1565b610988565b610961565b610809565b61056d565b6104ed565b610477565b61024e565b600435906001600160a01b038216820361023257565b600080fd5b61010435906001600160a01b038216820361023257565b346102325760203660031901126102325761026761021c565b61026f611966565b6001600160a01b039081169081156102ff57600d5490811682146102ed5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600d8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600f5481101561036257600390600f600052027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020190600090565b610311565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761039857604052565b610367565b608081019081106001600160401b0382111761039857604052565b606081019081106001600160401b0382111761039857604052565b90601f801991011681019081106001600160401b0382111761039857604052565b604051906102e082018281106001600160401b0382111761039857604052565b604051906104218261037d565b565b60405190610421826103b8565b6040519061028082018281106001600160401b0382111761039857604052565b9060405161045d8161037d565b6020600182946001600160401b0381541684520154910152565b3461023257602036600319011261023257600435600f54811015610232576104a0608091610327565b506104eb8154916104bb60016001600160401b039201610450565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b346102325760008060031936011261056a57608090604090606082516105128161039d565b82815282602082015282848201520152805161052d8161039d565b6005549182825260065460208301908152600754908284019182526060600854940193845282519485525160208501525190830152516060820152f35b80fd5b34610232576000366003190112610232576060604051600181526000602082015260006040820152f35b606090600319011261023257604051906105b0826103b8565b816001600160401b03600435818116810361023257825260243590811681036102325760208201526040604435910152565b604090606319011261023257604051906105fb8261037d565b60643582526084356020830152565b60409060a319011261023257604051906106238261037d565b60a435825260c4356020830152565b60409060e3190112610232576040519061064b8261037d565b60e4358252610104356020830152565b60409061012319011261023257604051906106758261037d565b610124358252610144356020830152565b60409061016319011261023257604051906106a08261037d565b610164358252610184356020830152565b6040906101a319011261023257604051906106cb8261037d565b6101a43582526101c4356020830152565b6040906101e319011261023257604051906106f68261037d565b6101e4358252610204356020830152565b60409061022319011261023257604051906107218261037d565b610224358252610244356020830152565b604090610263190112610232576040519061074c8261037d565b610264358252610284356020830152565b6040906102a319011261023257604051906107778261037d565b6102a43582526102c4356020830152565b6040906102e319011261023257604051906107a28261037d565b6102e4358252610304356020830152565b60409061032319011261023257604051906107cd8261037d565b610324358252610344356020830152565b60409061036319011261023257604051906107f88261037d565b610364358252610384356020830152565b34610232576104e03660031901126102325761082436610597565b6104803660631901126102325761095f9061083d6103f4565b90610847366105e2565b82526108523661060a565b602083015261086036610632565b604083015261086e3661065b565b606083015261087c36610686565b608083015261088a366106b1565b60a0830152610898366106dc565b60c08301526108a636610707565b60e08301526108b436610732565b6101008301526108c33661075d565b6101208301526108d236610788565b6101408301526108e1366107b3565b6101608301526108f0366107de565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c083015261145c565b005b346102325760003660031901126102325760206001600160401b03600e5416604051908152f35b3461023257600036600319011261023257600d546040516001600160a01b039091168152602090f35b34610232576000366003190112610232576020600254604051908152f35b34610232576000366003190112610232576109e86115ab565b50610a4c6040516109f8816103b8565b6009546001600160401b0390818116835260401c166020820152600a5460408201526040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b0390f35b6001600160401b03811161039857601f01601f191660200190565b60408060031936011261023257610a8061021c565b6024356001600160401b038111610232573660238201121561023257806004013590610aab82610a50565b91610ab8855193846103d3565b80835260209136602483830101116102325781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610c0e575b50610bfd579080600492610b23611966565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610bce575b5050610b93578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612ac18339815191528193929303610bb55761095f8383612925565b8351632a87526960e21b81526004810191909152602490fd5b610bee929350803d10610bf6575b610be681836103d3565b81019061227c565b903880610b6d565b503d610bdc565b845163703e46dd60e11b8152600490fd5b905081600080516020612ac18339815191525416141538610b11565b34610232576000366003190112610232577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610c83576020604051600080516020612ac18339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610232576000366003190112610232576020600154604051908152f35b346102325760008060031936011261056a57610ccd611966565b600d5460ff8160a01c166000146102ed576001600160a81b031916600d557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b60809060631901126102325760405190610d2b8261039d565b6064358252608435602083015260a435604083015260c4356060830152565b34610232576080366003190112610232576020610d8d604051610d6c8161039d565b600435815260243583820152604435604082015260643560608201526115fc565b604051908152f35b346102325760008060031936011261056a57610daf611966565b600080516020612aa183398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610232576000366003190112610232576020600054604051908152f35b6004359063ffffffff8216820361023257565b60e4359063ffffffff8216820361023257565b346102325760203660031901126102325763ffffffff610e62610e1e565b16600090815260046020908152604091829020805460019091015483516001600160401b03808416825292851c9092169282019290925291820152606090f35b3461023257600036600319011261023257610ebb6115ab565b50610a4c610ec76115ca565b6040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b34610232576020366003190112610232576040610f17600435611698565b6104eb82518092602080916001600160401b0381511684520151910152565b3461023257600036600319011261023257600080516020612aa1833981519152546040516001600160a01b039091168152602090f35b3461023257602036600319011261023257610f85610e1e565b610f8d611966565b63ffffffff808216610e108110918215610fdf575b5050610fcd57600d805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600d5460a81c16101590503880610fa2565b34610232576101203660031901126102325761100c36610597565b61101536610d12565b9061101e610e31565b611026610237565b90600080516020612ae183398151915254936001600160401b0360ff8660401c1615951680159081611136575b600114908161112c575b159081611123575b5061111157600080516020612ae1833981519152805467ffffffffffffffff1916600117905561109993856110ec5761175b565b61109f57005b600080516020612ae1833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102e8565b600080516020612ae1833981519152805460ff60401b1916600160401b17905561175b565b60405163f92ee8a960e01b8152600490fd5b90501538611065565b303b15915061105d565b869150611053565b3461023257600036600319011261023257600b54600c54604080516001600160401b03808516825293821c9093166020840152820152606090f35b3461023257600036600319011261023257608060055460065460075460085491604051938452602084015260408301526060820152f35b346102325760003660031901126102325760408051906111cf8261037d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b83811061121a5784604081866000838284010152601f80199101168101030190f35b85810183015185820183015282016111f8565b3461023257600036600319011261023257602060ff600d5460a01c166040519015158152f35b3461023257600036600319011261023257602063ffffffff600d5460a81c16604051908152f35b34610232576000366003190112610232576020600354604051908152f35b3461023257600036600319011261023257600954600a54604080516001600160401b03808516825293821c9093166020840152820152606090f35b3461023257604036600319011261023257600435600f5443821180156113ce575b61135b57600091611306600092611677565b9161132861131c600e546001600160401b031690565b6001600160401b031690565b925b811561136d575b509091501561135b5761134a610a4c926024359261168b565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b8261138b61131c61137d84610327565b50546001600160401b031690565b11156113b4575b600281106113af578381146113af576113aa906118e5565b61132a565b611331565b93505060016113c861131c61137d86610327565b93611392565b50600381106112f4565b346102325760203660031901126102325761095f6113f461021c565b6113fc611966565b6118f2565b34610232576000366003190112610232576020600f54604051908152f35b6040906001600160401b03815116600b549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600b550151600c55565b90600d5460ff8160a01c169081611597575b506115855781516001600160401b031661149961131c61148c611634565b516001600160401b031690565b6001600160401b038092161180159061154e575b61153c577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906114eb60408501936114e5855161199f565b85611ec1565b6114f48461141f565b61150384824216834316612133565b611528602061151986516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b03168161157c61131c602061156e611634565b01516001600160401b031690565b911611156114ad565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861146e565b604051906115b8826103b8565b60006040838281528260208201520152565b604051906115d7826103b8565b81600b546001600160401b0390818116835260401c1660208201526040600c54910152565b602081015190606060408201519101516040519160208301938452604083015260608201526060815261162e8161039d565b51902090565b61163c6115ab565b506116456115ca565b90565b604051906116558261037d565b60006020838281520152565b634e487b7160e01b600052601160045260246000fd5b60001981019190821161168657565b611661565b9190820391821161168657565b6116a0611648565b50600f54906116b66116b183611677565b610327565b50906116d061131c6001809401546001600160401b031690565b811015611749576116ec61131c600e546001600160401b031690565b83811061170e5750505060016117076116b161164593611677565b5001610450565b8161172e61131c8561171f85610327565b5001546001600160401b031690565b1161173a5782016116ec565b61164593506117079150610327565b604051631856a49960e21b8152600490fd5b9190926117729061176a6129cc565b6113fc6129cc565b61177a6129cc565b6001600160401b03908161179584516001600160401b031690565b16158015906118c6575b80156118ba575b80156118ae575b80156118a2575b8015611899575b611887576104219361185661187c9261180b866040906001600160401b038151166009549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176009550151600a55565b82516005556020830151600655604083015160075560608301516008556118318661141f565b600d805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b611877611862826115fc565b9182600055519161187283600155565b600255565b600355565b804216904316612133565b6040516350dd03f760e11b8152600490fd5b508351156117bb565b506060840151156117b4565b506040840151156117ad565b506020840151156117a6565b506118de61131c60208501516001600160401b031690565b151561179f565b8015611686576000190190565b6001600160a01b0390811690811561194d57600080516020612aa183398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612aa1833981519152546001600160a01b0316330361198757565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000111156119c857565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103985760405260088252610100366020840137565b8051156103625760200190565b8051600110156103625760400190565b8051600210156103625760600190565b8051600310156103625760800190565b90816020910312610232575180151581036102325790565b90815180825260208080930193019160005b828110611aaf575050505090565b835185529381019392810192600101611aa1565b61046090611adc83825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611b3a610100928386019060208091805184520151910152565b60a081015191611b5a610140938487019060208091805184520151910152565b60c082015192611b7a610180948588019060208091805184520151910152565b60e083015191611b9a6101c0938489019060208091805184520151910152565b830151611bb7610200918289019060208091805184520151910152565b61012084015191611bd861024093848a019060208091805184520151910152565b84015192611bf661028094858a019060208091805184520151910152565b611c3161016086015196611c1a6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b939290611ead610421936104e092611e9e6102606109609280518b52602081015160208c0152611cda604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c0152611e888b611d2660a08401516101008093019060208091805184520151910152565b611e598d6103c060c0860151611d4c610140918285019060208091805184520151910152565b611e2c60e088015195611d6f610180978887019060208091805184520151910152565b880151611d8c6101c0918287019060208091805184520151910152565b611dfd6101208a015193611db0610200958689019060208091805184520151910152565b8a015197611dce610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611a8f565b940190611ac3565b6040513d6000823e3d90fd5b602090611ecc612397565b6040611ed6611a0d565b92600154611ee385611a3a565b52611ef861131c82516001600160401b031690565b611f0185611a47565b52611f1861131c868301516001600160401b031690565b611f2185611a57565b520151611f2d83611a67565b52611f4c6040519485938493630c76545d60e21b855260048501611c98565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af4908115611fbd57600091611f8e575b5015611f7c57565b6040516309bde33960e01b8152600490fd5b611fb0915060203d602011611fb6575b611fa881836103d3565b810190611a77565b38611f74565b503d611f9e565b611eb5565b6001600160401b03918216908216039190821161168657565b90611ff25760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146116865760010190565b600f54600160401b811015610398576001810180600f5581101561036257602060037f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80492600f600052029261212c6040857f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201926001600160401b03936120c08583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8038601906001600160401b03166001600160401b0319825416179055565b0151910155565b90916121a261042193600f548015159081612208575b506121ac575b604061216560208501516001600160401b031690565b930151612182612173610414565b6001600160401b039095168552565b6020840152612192612173610423565b6001600160401b03166020840152565b6040820152612020565b6121ca6121c46116b1600e546001600160401b031690565b90611fdb565b6122036121e76121e2600e546001600160401b031690565b612008565b6001600160401b03166001600160401b0319600e541617600e55565b61214f565b61224b915061221c6116b161222d92611677565b505460401c6001600160401b031690565b61224561221c6116b1600e546001600160401b031690565b90611fc2565b6001600160401b03612272612269600d5463ffffffff9060a81c1690565b63ffffffff1690565b9116101538612149565b90816020910312610232575190565b612293610430565b9060008252600060208301526122a7611648565b60408301526122b4611648565b60608301526122c1611648565b60808301526122ce611648565b60a08301526122db611648565b60c08301526122e8611648565b60e08301526122f5611648565b610100830152612303611648565b610120830152612311611648565b61014083015261231f611648565b61016083015261232d611648565b61018083015261233b611648565b6101a0830152612349611648565b6101c0830152612357611648565b6101e0830152612365611648565b610200830152612373611648565b610220830152612381611648565b61024083015261238f611648565b610260830152565b61239f61228b565b906210000082527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d560206008818501527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c81604086017f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b338151525101527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e97081606086017f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db8151525101527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d81608086017f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b998151525101527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df600938160a086017f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a58066258151525101527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde288160c086017f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a98151525101527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc038160e086017f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b596938151525101527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad8161010086017f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e78151525101527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea170318161012086017f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e48151525101527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db70368161014086017f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae72488151525101527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e84158161016086017f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e56198151525101527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a38161018086017f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc88151525101527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c816101a086017f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc8151525101527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd5816101c086017f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b408151525101527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd3816101e086017f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc58151525101527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc8161020086017f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa48151525101527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e8161022086017f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a297822268151525101527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd48161024086017f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab261423981515251015261026084017f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82815152510152565b90813b156129ab57600080516020612ac183398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28051156129905761298d916129fb565b50565b50503461299957565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612ae18339815191525460401c16156129e957565b604051631afcd79f60e31b8152600490fd5b60008061164593602081519101845af43d15612a39573d91612a1c83610a50565b92612a2a60405194856103d3565b83523d6000602085013e612a3d565b6060915b90612a645750805115612a5257805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612a97575b612a75575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612a6d56fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/src/light_client.rs b/contract-bindings/src/light_client.rs index 2924e7ea0..d86a130cf 100644 --- a/contract-bindings/src/light_client.rs +++ b/contract-bindings/src/light_client.rs @@ -41,19 +41,13 @@ pub mod light_client { 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", - ), + ::std::borrow::ToOwned::to_owned("struct LightClient.StakeState",), ), },], outputs: ::std::vec![::ethers::core::abi::ethabi::Param { @@ -104,41 +98,6 @@ pub mod light_client { ::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, @@ -242,41 +201,6 @@ pub mod light_client { ::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, @@ -293,11 +217,6 @@ pub mod light_client { ::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( @@ -341,11 +260,6 @@ pub mod light_client { ::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( @@ -443,11 +357,6 @@ pub mod light_client { ::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( @@ -533,11 +442,6 @@ pub mod light_client { ::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( @@ -837,41 +741,6 @@ pub mod light_client { ::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, @@ -1278,13 +1147,13 @@ pub mod light_client { .method_hash([173, 60, 177, 204], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `computeStakeTableComm` (0xaa922732) function + ///Calls the contract's `computeStakeTableComm` (0x6f96bdae) function pub fn compute_stake_table_comm( &self, - state: LightClientState, + state: StakeState, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([170, 146, 39, 50], (state,)) + .method_hash([111, 150, 189, 174], (state,)) .expect("method not found (this should never happen)") } ///Calls the contract's `disablePermissionedProverMode` (0x69cc6a04) function @@ -1298,19 +1167,8 @@ pub mod light_client { ///Calls the contract's `finalizedState` (0x9fdb54a7) function pub fn finalized_state( &self, - ) -> ::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, - ), - > { + ) -> ::ethers::contract::builders::ContractCall + { self.0 .method_hash([159, 219, 84, 167], ()) .expect("method not found (this should never happen)") @@ -1350,19 +1208,8 @@ pub mod light_client { ///Calls the contract's `genesisState` (0xd24d933d) function pub fn genesis_state( &self, - ) -> ::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, - ), - > { + ) -> ::ethers::contract::builders::ContractCall + { self.0 .method_hash([210, 77, 147, 61], ()) .expect("method not found (this should never happen)") @@ -1414,7 +1261,7 @@ pub mod light_client { .method_hash([13, 142, 110, 44], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `initialize` (0x8ed3e045) function + ///Calls the contract's `initialize` (0x9baa3cc9) function pub fn initialize( &self, genesis: LightClientState, @@ -1424,7 +1271,7 @@ pub mod light_client { ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash( - [142, 211, 224, 69], + [155, 170, 60, 201], ( genesis, genesis_stake_state, @@ -1444,14 +1291,14 @@ pub mod light_client { .method_hash([224, 48, 51, 1], (block_number, threshold)) .expect("method not found (this should never happen)") } - ///Calls the contract's `newFinalizedState` (0x409939b7) function + ///Calls the contract's `newFinalizedState` (0x2063d4f7) 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)) + .method_hash([32, 99, 212, 247], (new_state, proof)) .expect("method not found (this should never happen)") } ///Calls the contract's `owner` (0x8da5cb5b) function @@ -1537,19 +1384,8 @@ pub mod light_client { 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, - ), - > { + ) -> ::ethers::contract::builders::ContractCall + { self.0 .method_hash([127, 23, 186, 173], index) .expect("method not found (this should never happen)") @@ -2637,7 +2473,7 @@ pub mod light_client { abi = "UPGRADE_INTERFACE_VERSION()" )] pub struct UpgradeInterfaceVersionCall; - ///Container type for all input parameters for the `computeStakeTableComm` function with signature `computeStakeTableComm((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0xaa922732` + ///Container type for all input parameters for the `computeStakeTableComm` function with signature `computeStakeTableComm((uint256,uint256,uint256,uint256))` and selector `0x6f96bdae` #[derive( Clone, ::ethers::contract::EthCall, @@ -2652,10 +2488,10 @@ pub mod light_client { )] #[ethcall( name = "computeStakeTableComm", - abi = "computeStakeTableComm((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256))" + abi = "computeStakeTableComm((uint256,uint256,uint256,uint256))" )] pub struct ComputeStakeTableCommCall { - pub state: LightClientState, + pub state: StakeState, } ///Container type for all input parameters for the `disablePermissionedProverMode` function with signature `disablePermissionedProverMode()` and selector `0x69cc6a04` #[derive( @@ -2845,7 +2681,7 @@ pub mod light_client { )] #[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),(uint256,uint256,uint256,uint256),uint32,address)` and selector `0x8ed3e045` + ///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)` and selector `0x9baa3cc9` #[derive( Clone, ::ethers::contract::EthCall, @@ -2860,7 +2696,7 @@ pub mod light_client { )] #[ethcall( name = "initialize", - abi = "initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256),uint32,address)" + abi = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)" )] pub struct InitializeCall { pub genesis: LightClientState, @@ -2889,7 +2725,7 @@ pub mod light_client { pub block_number: ::ethers::core::types::U256, pub threshold: ::ethers::core::types::U256, } - ///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` + ///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))` and selector `0x2063d4f7` #[derive( Clone, ::ethers::contract::EthCall, @@ -2899,7 +2735,7 @@ pub mod light_client { )] #[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))" + 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))" )] pub struct NewFinalizedStateCall { pub new_state: LightClientState, @@ -3636,7 +3472,7 @@ pub mod light_client { Hash, )] pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); - ///Container type for all return fields from the `computeStakeTableComm` function with signature `computeStakeTableComm((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0xaa922732` + ///Container type for all return fields from the `computeStakeTableComm` function with signature `computeStakeTableComm((uint256,uint256,uint256,uint256))` and selector `0x6f96bdae` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3667,11 +3503,6 @@ pub mod light_client { 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 `frozenStakeTableCommitment` function with signature `frozenStakeTableCommitment()` and selector `0x382b215a` #[derive( @@ -3737,11 +3568,6 @@ pub mod light_client { 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 `getFinalizedState` function with signature `getFinalizedState()` and selector `0x82d07ff3` #[derive( @@ -3964,11 +3790,6 @@ pub mod light_client { 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( diff --git a/contract-bindings/src/light_client_mock.rs b/contract-bindings/src/light_client_mock.rs index 5df10708c..7dc2aec66 100644 --- a/contract-bindings/src/light_client_mock.rs +++ b/contract-bindings/src/light_client_mock.rs @@ -22,11 +22,6 @@ pub mod light_client_mock { ::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",), @@ -77,19 +72,13 @@ pub mod light_client_mock { 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", - ), + ::std::borrow::ToOwned::to_owned("struct LightClient.StakeState",), ), },], outputs: ::std::vec![::ethers::core::abi::ethabi::Param { @@ -140,41 +129,6 @@ pub mod light_client_mock { ::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, @@ -278,41 +232,6 @@ pub mod light_client_mock { ::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, @@ -329,11 +248,6 @@ pub mod light_client_mock { ::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( @@ -377,11 +291,6 @@ pub mod light_client_mock { ::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( @@ -479,11 +388,6 @@ pub mod light_client_mock { ::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( @@ -569,11 +473,6 @@ pub mod light_client_mock { ::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( @@ -743,11 +642,6 @@ pub mod light_client_mock { ::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( @@ -955,41 +849,6 @@ pub mod light_client_mock { ::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, @@ -1396,13 +1255,13 @@ pub mod light_client_mock { .method_hash([173, 60, 177, 204], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `computeStakeTableComm` (0xaa922732) function + ///Calls the contract's `computeStakeTableComm` (0x6f96bdae) function pub fn compute_stake_table_comm( &self, - state: LightClientState, + state: StakeState, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([170, 146, 39, 50], (state,)) + .method_hash([111, 150, 189, 174], (state,)) .expect("method not found (this should never happen)") } ///Calls the contract's `disablePermissionedProverMode` (0x69cc6a04) function @@ -1416,19 +1275,8 @@ pub mod light_client_mock { ///Calls the contract's `finalizedState` (0x9fdb54a7) function pub fn finalized_state( &self, - ) -> ::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, - ), - > { + ) -> ::ethers::contract::builders::ContractCall + { self.0 .method_hash([159, 219, 84, 167], ()) .expect("method not found (this should never happen)") @@ -1468,19 +1316,8 @@ pub mod light_client_mock { ///Calls the contract's `genesisState` (0xd24d933d) function pub fn genesis_state( &self, - ) -> ::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, - ), - > { + ) -> ::ethers::contract::builders::ContractCall + { self.0 .method_hash([210, 77, 147, 61], ()) .expect("method not found (this should never happen)") @@ -1532,7 +1369,7 @@ pub mod light_client_mock { .method_hash([13, 142, 110, 44], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `initialize` (0x8ed3e045) function + ///Calls the contract's `initialize` (0x9baa3cc9) function pub fn initialize( &self, genesis: LightClientState, @@ -1542,7 +1379,7 @@ pub mod light_client_mock { ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash( - [142, 211, 224, 69], + [155, 170, 60, 201], ( genesis, genesis_stake_state, @@ -1562,14 +1399,14 @@ pub mod light_client_mock { .method_hash([224, 48, 51, 1], (block_number, threshold)) .expect("method not found (this should never happen)") } - ///Calls the contract's `newFinalizedState` (0x409939b7) function + ///Calls the contract's `newFinalizedState` (0x2063d4f7) 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)) + .method_hash([32, 99, 212, 247], (new_state, proof)) .expect("method not found (this should never happen)") } ///Calls the contract's `owner` (0x8da5cb5b) function @@ -1608,13 +1445,13 @@ pub mod light_client_mock { .method_hash([113, 80, 24, 166], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `setFinalizedState` (0x202a0adb) function + ///Calls the contract's `setFinalizedState` (0xb5adea3c) function pub fn set_finalized_state( &self, state: LightClientState, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([32, 42, 10, 219], (state,)) + .method_hash([181, 173, 234, 60], (state,)) .expect("method not found (this should never happen)") } ///Calls the contract's `setHotShotDownSince` (0x2d52aad6) function @@ -1688,19 +1525,8 @@ pub mod light_client_mock { 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, - ), - > { + ) -> ::ethers::contract::builders::ContractCall + { self.0 .method_hash([127, 23, 186, 173], index) .expect("method not found (this should never happen)") @@ -2792,7 +2618,7 @@ pub mod light_client_mock { abi = "UPGRADE_INTERFACE_VERSION()" )] pub struct UpgradeInterfaceVersionCall; - ///Container type for all input parameters for the `computeStakeTableComm` function with signature `computeStakeTableComm((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0xaa922732` + ///Container type for all input parameters for the `computeStakeTableComm` function with signature `computeStakeTableComm((uint256,uint256,uint256,uint256))` and selector `0x6f96bdae` #[derive( Clone, ::ethers::contract::EthCall, @@ -2807,10 +2633,10 @@ pub mod light_client_mock { )] #[ethcall( name = "computeStakeTableComm", - abi = "computeStakeTableComm((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256))" + abi = "computeStakeTableComm((uint256,uint256,uint256,uint256))" )] pub struct ComputeStakeTableCommCall { - pub state: LightClientState, + pub state: StakeState, } ///Container type for all input parameters for the `disablePermissionedProverMode` function with signature `disablePermissionedProverMode()` and selector `0x69cc6a04` #[derive( @@ -3000,7 +2826,7 @@ pub mod light_client_mock { )] #[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),(uint256,uint256,uint256,uint256),uint32,address)` and selector `0x8ed3e045` + ///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)` and selector `0x9baa3cc9` #[derive( Clone, ::ethers::contract::EthCall, @@ -3015,7 +2841,7 @@ pub mod light_client_mock { )] #[ethcall( name = "initialize", - abi = "initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256),uint32,address)" + abi = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)" )] pub struct InitializeCall { pub genesis: LightClientState, @@ -3044,7 +2870,7 @@ pub mod light_client_mock { pub block_number: ::ethers::core::types::U256, pub threshold: ::ethers::core::types::U256, } - ///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` + ///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))` and selector `0x2063d4f7` #[derive( Clone, ::ethers::contract::EthCall, @@ -3054,7 +2880,7 @@ pub mod light_client_mock { )] #[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))" + 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))" )] pub struct NewFinalizedStateCall { pub new_state: LightClientState, @@ -3138,7 +2964,7 @@ pub mod light_client_mock { )] #[ethcall(name = "renounceOwnership", abi = "renounceOwnership()")] pub struct RenounceOwnershipCall; - ///Container type for all input parameters for the `setFinalizedState` function with signature `setFinalizedState((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x202a0adb` + ///Container type for all input parameters for the `setFinalizedState` function with signature `setFinalizedState((uint64,uint64,uint256))` and selector `0xb5adea3c` #[derive( Clone, ::ethers::contract::EthCall, @@ -3153,7 +2979,7 @@ pub mod light_client_mock { )] #[ethcall( name = "setFinalizedState", - abi = "setFinalizedState((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256))" + abi = "setFinalizedState((uint64,uint64,uint256))" )] pub struct SetFinalizedStateCall { pub state: LightClientState, @@ -3916,7 +3742,7 @@ pub mod light_client_mock { Hash, )] pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); - ///Container type for all return fields from the `computeStakeTableComm` function with signature `computeStakeTableComm((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0xaa922732` + ///Container type for all return fields from the `computeStakeTableComm` function with signature `computeStakeTableComm((uint256,uint256,uint256,uint256))` and selector `0x6f96bdae` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3947,11 +3773,6 @@ pub mod light_client_mock { 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 `frozenStakeTableCommitment` function with signature `frozenStakeTableCommitment()` and selector `0x382b215a` #[derive( @@ -4017,11 +3838,6 @@ pub mod light_client_mock { 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 `getFinalizedState` function with signature `getFinalizedState()` and selector `0x82d07ff3` #[derive( @@ -4244,11 +4060,6 @@ pub mod light_client_mock { 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( diff --git a/contract-bindings/src/shared_types.rs b/contract-bindings/src/shared_types.rs index c2531a1ed..ff73ac624 100644 --- a/contract-bindings/src/shared_types.rs +++ b/contract-bindings/src/shared_types.rs @@ -105,7 +105,7 @@ pub struct HotShotCommitment { pub block_height: u64, pub block_comm_root: ::ethers::core::types::U256, } -///`LightClientState(uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256)` +///`LightClientState(uint64,uint64,uint256)` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -122,11 +122,6 @@ 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, } ///`StakeState(uint256,uint256,uint256,uint256)` #[derive( diff --git a/contracts/rust/adapter/src/light_client.rs b/contracts/rust/adapter/src/light_client.rs index 30ce0933d..5b905d913 100644 --- a/contracts/rust/adapter/src/light_client.rs +++ b/contracts/rust/adapter/src/light_client.rs @@ -17,11 +17,6 @@ pub struct ParsedLightClientState { pub view_num: u64, pub block_height: u64, pub block_comm_root: U256, - pub fee_ledger_comm: U256, - pub bls_key_comm: U256, - pub schnorr_key_comm: U256, - pub amount_comm: U256, - pub threshold: U256, } impl ParsedLightClientState { @@ -35,11 +30,6 @@ impl ParsedLightClientState { 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), } } } @@ -58,11 +48,6 @@ impl From for ParsedLightClientState { view_num: field_to_u256(pi.view_number()).as_u64(), block_height: field_to_u256(pi.block_height()).as_u64(), block_comm_root: field_to_u256(pi.block_comm_root()), - fee_ledger_comm: field_to_u256(pi.fee_ledger_comm()), - bls_key_comm: field_to_u256(pi.qc_key_comm()), - schnorr_key_comm: field_to_u256(pi.state_key_comm()), - amount_comm: field_to_u256(pi.stake_amount_comm()), - threshold: field_to_u256(pi.threshold()), } } } @@ -73,42 +58,27 @@ impl From for ParsedLightClie view_num: state.view_num, block_height: state.block_height, block_comm_root: state.block_comm_root, - fee_ledger_comm: state.fee_ledger_comm, - bls_key_comm: state.stake_table_bls_key_comm, - schnorr_key_comm: state.stake_table_schnorr_key_comm, - amount_comm: state.stake_table_amount_comm, - threshold: state.threshold, } } } impl From for PublicInput { fn from(s: ParsedLightClientState) -> Self { - let fields = vec![ - u256_to_field(s.threshold), + let fields: Vec, 4>> = vec![ CircuitField::from(s.view_num), CircuitField::from(s.block_height), u256_to_field(s.block_comm_root), - u256_to_field(s.fee_ledger_comm), - u256_to_field(s.bls_key_comm), - u256_to_field(s.schnorr_key_comm), - u256_to_field(s.amount_comm), ]; Self::from(fields) } } -impl From<(u64, u64, U256, U256, U256, U256, U256, U256)> for ParsedLightClientState { - fn from(s: (u64, u64, U256, U256, U256, U256, U256, U256)) -> Self { +impl From<(u64, u64, U256)> for ParsedLightClientState { + fn from(s: (u64, u64, U256)) -> Self { Self { view_num: s.0, block_height: s.1, block_comm_root: s.2, - fee_ledger_comm: s.3, - bls_key_comm: s.4, - schnorr_key_comm: s.5, - amount_comm: s.6, - threshold: s.7, } } } @@ -119,12 +89,6 @@ impl From for LightClientState { view_number: s.view_num as usize, block_height: s.block_height as usize, block_comm_root: u256_to_field(s.block_comm_root), - fee_ledger_comm: u256_to_field(s.fee_ledger_comm), - stake_table_comm: ( - u256_to_field(s.bls_key_comm), - u256_to_field(s.schnorr_key_comm), - u256_to_field(s.amount_comm), - ), } } } @@ -160,13 +124,14 @@ impl ParsedStakeState { } } } -impl From for ParsedStakeState { - fn from(s: ParsedLightClientState) -> Self { + +impl From for StakeState { + fn from(s: ParsedStakeState) -> Self { Self { - threshold: s.threshold, - bls_key_comm: s.bls_key_comm, - schnorr_key_comm: s.schnorr_key_comm, - amount_comm: s.amount_comm, + threshold: u256_to_field(s.threshold), + stake_table_bls_key_comm: u256_to_field(s.bls_key_comm), + stake_table_schnorr_key_comm: u256_to_field(s.schnorr_key_comm), + stake_table_amount_comm: u256_to_field(s.amount_comm), } } } @@ -179,17 +144,6 @@ impl FromStr for ParsedStakeState { } } -impl From for ParsedStakeState { - fn from(pi: PublicInput) -> Self { - Self { - threshold: field_to_u256(pi.threshold()), - bls_key_comm: field_to_u256(pi.qc_key_comm()), - schnorr_key_comm: field_to_u256(pi.state_key_comm()), - amount_comm: field_to_u256(pi.stake_amount_comm()), - } - } -} - impl From for ParsedStakeState { fn from(state: contract_bindings::light_client::StakeState) -> Self { Self { @@ -201,18 +155,6 @@ impl From for ParsedStakeState { } } -impl From for PublicInput { - fn from(s: ParsedStakeState) -> Self { - let fields = vec![ - u256_to_field(s.threshold), - u256_to_field(s.bls_key_comm), - u256_to_field(s.schnorr_key_comm), - u256_to_field(s.amount_comm), - ]; - Self::from(fields) - } -} - impl From<(U256, U256, U256, U256)> for ParsedStakeState { fn from(s: (U256, U256, U256, U256)) -> Self { Self { @@ -224,17 +166,6 @@ impl From<(U256, U256, U256, U256)> for ParsedStakeState { } } -impl From for StakeState { - fn from(s: ParsedStakeState) -> Self { - Self { - threshold: u256_to_field(s.threshold), - stake_table_bls_key_comm: u256_to_field(s.bls_key_comm), - stake_table_schnorr_key_comm: u256_to_field(s.schnorr_key_comm), - stake_table_amount_comm: u256_to_field(s.amount_comm), - } - } -} - impl From for contract_bindings::light_client::StakeState { fn from(s: ParsedStakeState) -> Self { // exactly the same struct with same field types, safe to transmute diff --git a/contracts/rust/diff-test/src/main.rs b/contracts/rust/diff-test/src/main.rs index e92cfd3ce..f2f5d3859 100644 --- a/contracts/rust/diff-test/src/main.rs +++ b/contracts/rust/diff-test/src/main.rs @@ -10,7 +10,10 @@ use ethers::{ abi::{AbiDecode, AbiEncode, Address}, types::{Bytes, U256}, }; -use hotshot_contract_adapter::{jellyfish::*, light_client::ParsedLightClientState}; +use hotshot_contract_adapter::{ + jellyfish::*, + light_client::{ParsedLightClientState, ParsedStakeState}, +}; use hotshot_state_prover::mock_ledger::{ gen_plonk_proof_for_test, MockLedger, MockSystemParam, BLOCKS_PER_EPOCH, STAKE_TABLE_CAPACITY, }; @@ -469,8 +472,13 @@ fn main() { let pp = MockSystemParam::init(BLOCKS_PER_EPOCH); let ledger = MockLedger::init(pp, num_init_validators as usize); - let (voting_st_comm, frozen_st_comm) = ledger.get_stake_table_comms(); - let res = (ledger.get_state(), voting_st_comm, frozen_st_comm); + let (voting_st_comm, frozen_st_comm, stake_table) = ledger.get_stake_table_comms(); + let res = ( + ledger.get_state(), + voting_st_comm, + frozen_st_comm, + stake_table, + ); println!("{}", res.encode_hex()); } Action::MockConsecutiveFinalizedStates => { @@ -487,6 +495,7 @@ fn main() { let mut new_states: Vec = vec![]; let mut proofs: Vec = vec![]; + let mut stake_stakes: Vec = vec![]; for i in 1..block_per_epoch + 2 { // only update stake table at the last block, as it would only take effect in next epoch anyway. if i == block_per_epoch { @@ -503,9 +512,17 @@ fn main() { ledger.elapse_with_block(); - let (pi, proof) = ledger.gen_state_proof(); + let (pi, proof, stt) = ledger.gen_state_proof(); new_states.push(pi.into()); proofs.push(proof.into()); + + let parsed_stake_state = ParsedStakeState { + threshold: field_to_u256(stt.threshold), + bls_key_comm: field_to_u256(stt.stake_table_bls_key_comm), + schnorr_key_comm: field_to_u256(stt.stake_table_schnorr_key_comm), + amount_comm: field_to_u256(stt.stake_table_amount_comm), + }; + stake_stakes.push(parsed_stake_state.into()); } let res = (new_states, proofs); @@ -533,7 +550,7 @@ fn main() { } let res = if require_valid_proof { - let (pi, proof) = ledger.gen_state_proof(); + let (pi, proof, stt) = ledger.gen_state_proof(); let pi_parsed: ParsedLightClientState = pi.into(); let proof_parsed: ParsedPlonkProof = proof.into(); (pi_parsed, proof_parsed) @@ -555,7 +572,7 @@ fn main() { ledger.elapse_with_block(); // first block in epoch 1 - let (pi, proof) = ledger.gen_state_proof(); + let (pi, proof, stt) = ledger.gen_state_proof(); new_states.push(pi.into()); proofs.push(proof.into()); diff --git a/contracts/script/LightClient.s.sol b/contracts/script/LightClient.s.sol index de9a6fe39..03ea91260 100644 --- a/contracts/script/LightClient.s.sol +++ b/contracts/script/LightClient.s.sol @@ -9,7 +9,12 @@ import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy contract DeployLightClientContractScript is Script { function run(uint32 numInitValidators, uint32 stateHistoryRetentionPeriod) external - returns (address payable proxyAddress, address admin, LC.LightClientState memory) + returns ( + address payable proxyAddress, + address admin, + LC.LightClientState memory, + LC.StakeState memory + ) { // TODO for a production deployment provide the right genesis state and value @@ -19,37 +24,30 @@ contract DeployLightClientContractScript is Script { cmds[2] = vm.toString(uint256(numInitValidators)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory state,,) = - abi.decode(result, (LC.LightClientState, bytes32, bytes32)); - - LC.StakeState memory stakeState = LC.StakeState( - state.threshold, - state.stakeTableBlsKeyComm, - state.stakeTableSchnorrKeyComm, - state.stakeTableAmountComm - ); + (LC.LightClientState memory state,,, LC.StakeState memory stakeState) = + abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeState)); return deployContract(state, stakeState, stateHistoryRetentionPeriod); } - function runDemo(uint32 stateHistoryRetentionPeriod) - external - returns (address payable proxyAddress, address admin, LC.LightClientState memory) - { - string[] memory cmds = new string[](1); - cmds[0] = "gen-demo-genesis"; - - bytes memory result = vm.ffi(cmds); - LC.LightClientState memory state = abi.decode(result, (LC.LightClientState)); - LC.StakeState memory stakeState = LC.StakeState( - state.threshold, - state.stakeTableBlsKeyComm, - state.stakeTableSchnorrKeyComm, - state.stakeTableAmountComm - ); - - return deployContract(state, stakeState, stateHistoryRetentionPeriod); - } + // function runDemo(uint32 stateHistoryRetentionPeriod) + // external + // returns (address payable proxyAddress, address admin, LC.LightClientState memory) + // { + // string[] memory cmds = new string[](1); + // cmds[0] = "gen-demo-genesis"; + + // bytes memory result = vm.ffi(cmds); + // LC.LightClientState memory state = abi.decode(result, (LC.LightClientState)); + // LC.StakeState memory stakeState = LC.StakeState( + // state.threshold, + // state.stakeTableBlsKeyComm, + // state.stakeTableSchnorrKeyComm, + // state.stakeTableAmountComm + // ); + + // return deployContract(state, stakeState, stateHistoryRetentionPeriod); + // } /// @notice deploys the impl, proxy & initializes the impl /// @return proxyAddress The address of the proxy @@ -59,7 +57,15 @@ contract DeployLightClientContractScript is Script { LC.LightClientState memory state, LC.StakeState memory stakeState, uint32 stateHistoryRetentionPeriod - ) private returns (address payable proxyAddress, address admin, LC.LightClientState memory) { + ) + private + returns ( + address payable proxyAddress, + address admin, + LC.LightClientState memory, + LC.StakeState memory + ) + { string memory seedPhrase = vm.envString("MNEMONIC"); (admin,) = deriveRememberKey(seedPhrase, 0); vm.startBroadcast(admin); @@ -81,6 +87,6 @@ contract DeployLightClientContractScript is Script { proxyAddress = payable(address(proxy)); - return (proxyAddress, admin, state); + return (proxyAddress, admin, state, stakeState); } } diff --git a/contracts/script/LightClientWithDefender.s.sol b/contracts/script/LightClientWithDefender.s.sol index 629076b32..c0fd0ffbf 100644 --- a/contracts/script/LightClientWithDefender.s.sol +++ b/contracts/script/LightClientWithDefender.s.sol @@ -30,7 +30,9 @@ contract LightClientDefenderDeployScript is Script { cmds[2] = vm.toString(uint256(numInitValidators)); bytes memory result = vm.ffi(cmds); - (state,,) = abi.decode(result, (LC.LightClientState, bytes32, bytes32)); + LC.StakeState memory stakeState; + (state,,, stakeState) = + abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeState)); ApprovalProcessResponse memory upgradeApprovalProcess = Defender.getUpgradeApprovalProcess(); multisig = upgradeApprovalProcess.via; @@ -49,13 +51,6 @@ contract LightClientDefenderDeployScript is Script { opts.defender.useDefenderDeploy = true; opts.defender.salt = bytes32(abi.encodePacked(contractSalt)); - LC.StakeState memory stakeState = LC.StakeState( - state.threshold, - state.stakeTableBlsKeyComm, - state.stakeTableSchnorrKeyComm, - state.stakeTableAmountComm - ); - proxy = Upgrades.deployUUPSProxy( contractName, abi.encodeCall( diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol index e9eae5898..0a2bb62cf 100644 --- a/contracts/src/LightClient.sol +++ b/contracts/src/LightClient.sol @@ -94,20 +94,10 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @param viewNum The latest view number of the finalized HotShot chain /// @param blockHeight The block height of the latest finalized block /// @param blockCommRoot The merkle root of historical block commitments (BN254::ScalarField) - /// @param feeLedgerComm The commitment to the fee ledger state (type: BN254::ScalarField) - /// @param stakeTableBlsKeyComm The commitment to the BlsVerKey column of the stake table - /// @param stakeTableSchnorrKeyComm The commitment to the SchnorrVerKey column of the table - /// @param stakeTableAmountComm The commitment to the stake amount column of the stake table - /// @param threshold The (stake-weighted) quorum threshold for a QC to be considered as valid struct LightClientState { uint64 viewNum; uint64 blockHeight; BN254.ScalarField blockCommRoot; - BN254.ScalarField feeLedgerComm; - BN254.ScalarField stakeTableBlsKeyComm; - BN254.ScalarField stakeTableSchnorrKeyComm; - BN254.ScalarField stakeTableAmountComm; - uint256 threshold; } /// @notice The finalized HotShot Stake state (as the digest of the entire HotShot state) @@ -227,10 +217,10 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { // feeLedgerComm can be zero, if we optionally support fee ledger yet. if ( _genesis.viewNum != 0 || _genesis.blockHeight != 0 - || BN254.ScalarField.unwrap(_genesis.stakeTableBlsKeyComm) == 0 - || BN254.ScalarField.unwrap(_genesis.stakeTableSchnorrKeyComm) == 0 - || BN254.ScalarField.unwrap(_genesis.stakeTableAmountComm) == 0 - || _genesis.threshold == 0 + || BN254.ScalarField.unwrap(_genesisStakeState.stakeTableBlsKeyComm) == 0 + || BN254.ScalarField.unwrap(_genesisStakeState.stakeTableSchnorrKeyComm) == 0 + || BN254.ScalarField.unwrap(_genesisStakeState.stakeTableAmountComm) == 0 + || _genesisStakeState.threshold == 0 ) { revert InvalidArgs(); } @@ -240,11 +230,11 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { stateHistoryRetentionPeriod = _stateHistoryRetentionPeriod; - bytes32 initStakeTableComm = computeStakeTableComm(_genesis); + bytes32 initStakeTableComm = computeStakeTableComm(_genesisStakeState); votingStakeTableCommitment = initStakeTableComm; - votingThreshold = _genesis.threshold; + votingThreshold = _genesisStakeState.threshold; frozenStakeTableCommitment = initStakeTableComm; - frozenThreshold = _genesis.threshold; + frozenThreshold = _genesisStakeState.threshold; updateStateHistory(uint64(block.number), uint64(block.timestamp), _genesis); } @@ -281,10 +271,6 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { } // format validity check BN254.validateScalarField(newState.blockCommRoot); - BN254.validateScalarField(newState.feeLedgerComm); - BN254.validateScalarField(newState.stakeTableBlsKeyComm); - BN254.validateScalarField(newState.stakeTableSchnorrKeyComm); - BN254.validateScalarField(newState.stakeTableAmountComm); // check plonk proof verifyProof(newState, proof); @@ -326,10 +312,6 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { publicInput[1] = uint256(state.viewNum); publicInput[2] = uint256(state.blockHeight); publicInput[3] = BN254.ScalarField.unwrap(state.blockCommRoot); - publicInput[4] = BN254.ScalarField.unwrap(state.feeLedgerComm); - publicInput[5] = BN254.ScalarField.unwrap(finalizedState.stakeTableBlsKeyComm); - publicInput[6] = BN254.ScalarField.unwrap(finalizedState.stakeTableSchnorrKeyComm); - publicInput[7] = BN254.ScalarField.unwrap(finalizedState.stakeTableAmountComm); if (!PlonkVerifier.verify(vk, publicInput, proof)) { revert InvalidProof(); @@ -337,12 +319,7 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { } /// @notice Given the light client state, compute the short commitment of the stake table - function computeStakeTableComm(LightClientState memory state) - public - pure - virtual - returns (bytes32) - { + function computeStakeTableComm(StakeState memory state) public pure virtual returns (bytes32) { return keccak256( abi.encodePacked( state.stakeTableBlsKeyComm, diff --git a/contracts/test/DeployLightClientTestScript.s.sol b/contracts/test/DeployLightClientTestScript.s.sol index 264596600..1b489b383 100644 --- a/contracts/test/DeployLightClientTestScript.s.sol +++ b/contracts/test/DeployLightClientTestScript.s.sol @@ -20,15 +20,8 @@ contract DeployLightClientTestScript is Script { cmds[2] = vm.toString(uint256(numInitValidators)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory state,,) = - abi.decode(result, (LC.LightClientState, bytes32, bytes32)); - - LC.StakeState memory stakeState = LC.StakeState( - state.threshold, - state.stakeTableBlsKeyComm, - state.stakeTableSchnorrKeyComm, - state.stakeTableAmountComm - ); + (LC.LightClientState memory state,,, LC.StakeState memory stakeState) = + abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeState)); return deployContract(state, stakeState, stateHistoryRetentionPeriod, owner); } @@ -51,24 +44,24 @@ contract DeployLightClientTestScript is Script { return (lcTestProxy, admin, state); } - function runDemo(uint32 stateHistoryRetentionPeriod, address owner) - external - returns (address payable proxyAddress, address admin, LC.LightClientState memory) - { - string[] memory cmds = new string[](1); - cmds[0] = "gen-demo-genesis"; - - bytes memory result = vm.ffi(cmds); - LC.LightClientState memory state = abi.decode(result, (LC.LightClientState)); - LC.StakeState memory stakeState = LC.StakeState( - state.threshold, - state.stakeTableBlsKeyComm, - state.stakeTableSchnorrKeyComm, - state.stakeTableAmountComm - ); - - return deployContract(state, stakeState, stateHistoryRetentionPeriod, owner); - } + // function runDemo(uint32 stateHistoryRetentionPeriod, address owner) + // external + // returns (address payable proxyAddress, address admin, LC.LightClientState memory) + // { + // string[] memory cmds = new string[](1); + // cmds[0] = "gen-demo-genesis"; + + // bytes memory result = vm.ffi(cmds); + // LC.LightClientState memory state = abi.decode(result, (LC.LightClientState)); + // LC.StakeState memory stakeState = LC.StakeState( + // state.threshold, + // state.stakeTableBlsKeyComm, + // state.stakeTableSchnorrKeyComm, + // state.stakeTableAmountComm + // ); + + // return deployContract(state, stakeState, stateHistoryRetentionPeriod, owner); + // } /// @notice deploys the impl, proxy & initializes the impl /// @return proxyAddress The address of the proxy diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol index be4b8475b..3778ab8f8 100644 --- a/contracts/test/LightClient.t.sol +++ b/contracts/test/LightClient.t.sol @@ -58,21 +58,21 @@ contract LightClientCommonTest is Test { cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory state, bytes32 votingSTComm, bytes32 frozenSTComm) = - abi.decode(result, (LC.LightClientState, bytes32, bytes32)); + ( + LC.LightClientState memory state, + bytes32 votingSTComm, + bytes32 frozenSTComm, + LC.StakeState memory stakeState + ) = abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeState)); genesis = state; - genesisStakeState = LC.StakeState( - state.threshold, - state.stakeTableBlsKeyComm, - state.stakeTableSchnorrKeyComm, - state.stakeTableAmountComm - ); + genesisStakeState = stakeState; (lcTestProxy, admin) = deployAndInitProxy(genesis, genesisStakeState, MAX_HISTORY_SECONDS); - bytes32 expectedStakeTableComm = lc.computeStakeTableComm(state); + bytes32 expectedStakeTableComm = lc.computeStakeTableComm(genesisStakeState); assertEq(votingSTComm, expectedStakeTableComm); assertEq(frozenSTComm, expectedStakeTableComm); + // assertEq(genesisStakeState, lc.genesisStakeState()); } function assertEq(BN254.ScalarField a, BN254.ScalarField b) public pure { @@ -91,58 +91,59 @@ contract LightClient_constructor_Test is LightClientCommonTest { assertEq(abi.encode(lc.getGenesisState()), abi.encode(genesis)); assertEq(abi.encode(lc.getFinalizedState()), abi.encode(genesis)); - bytes32 stakeTableComm = lc.computeStakeTableComm(genesis); + bytes32 stakeTableComm = lc.computeStakeTableComm(genesisStakeState); assertEq(lc.votingStakeTableCommitment(), stakeTableComm); assertEq(lc.frozenStakeTableCommitment(), stakeTableComm); - assertEq(lc.votingThreshold(), genesis.threshold); - assertEq(lc.frozenThreshold(), genesis.threshold); + assertEq(lc.votingThreshold(), genesisStakeState.threshold); + assertEq(lc.frozenThreshold(), genesisStakeState.threshold); } // @dev helper function to be able to initialize the contract and capture the revert error function initWithExpectRevert( LC.LightClientState memory _genesis, + LC.StakeState memory _genesisStakeState, uint32 _stateHistoryRetentionPeriod ) private { vm.expectRevert(LC.InvalidArgs.selector); - LC.StakeState memory _genesisStakeState = LC.StakeState( - _genesis.threshold, - _genesis.stakeTableBlsKeyComm, - _genesis.stakeTableSchnorrKeyComm, - _genesis.stakeTableAmountComm - ); lc = new LCMock(_genesis, _genesisStakeState, _stateHistoryRetentionPeriod); } function test_RevertWhen_InvalidGenesis() external { LC.LightClientState memory badGenesis = genesis; + LC.StakeState memory badGenesisStakeState = genesisStakeState; // wrong viewNum would revert badGenesis.viewNum = 1; - initWithExpectRevert(badGenesis, MAX_HISTORY_SECONDS); + initWithExpectRevert(badGenesis, badGenesisStakeState, MAX_HISTORY_SECONDS); badGenesis.viewNum = genesis.viewNum; // revert to correct // wrong blockHeight would revert badGenesis.blockHeight = 1; - initWithExpectRevert(badGenesis, MAX_HISTORY_SECONDS); + initWithExpectRevert(badGenesis, badGenesisStakeState, MAX_HISTORY_SECONDS); badGenesis.blockHeight = genesis.blockHeight; // revert to correct // zero-valued stake table commitments would revert - badGenesis.stakeTableBlsKeyComm = BN254.ScalarField.wrap(0); - initWithExpectRevert(badGenesis, MAX_HISTORY_SECONDS); - badGenesis.stakeTableBlsKeyComm = genesis.stakeTableBlsKeyComm; // revert to correct - badGenesis.stakeTableSchnorrKeyComm = BN254.ScalarField.wrap(0); - initWithExpectRevert(badGenesis, MAX_HISTORY_SECONDS); - badGenesis.stakeTableSchnorrKeyComm = genesis.stakeTableSchnorrKeyComm; // revert to correct - badGenesis.stakeTableAmountComm = BN254.ScalarField.wrap(0); + badGenesisStakeState.stakeTableBlsKeyComm = BN254.ScalarField.wrap(0); + initWithExpectRevert(badGenesis, badGenesisStakeState, MAX_HISTORY_SECONDS); + + badGenesisStakeState.stakeTableBlsKeyComm = badGenesisStakeState.stakeTableBlsKeyComm; // revert + // to correct + badGenesisStakeState.stakeTableSchnorrKeyComm = BN254.ScalarField.wrap(0); + initWithExpectRevert(badGenesis, badGenesisStakeState, MAX_HISTORY_SECONDS); + + badGenesisStakeState.stakeTableSchnorrKeyComm = + badGenesisStakeState.stakeTableSchnorrKeyComm; // revert to correct + badGenesisStakeState.stakeTableAmountComm = BN254.ScalarField.wrap(0); - initWithExpectRevert(badGenesis, MAX_HISTORY_SECONDS); - badGenesis.stakeTableAmountComm = genesis.stakeTableAmountComm; // revert to correct + initWithExpectRevert(badGenesis, badGenesisStakeState, MAX_HISTORY_SECONDS); + badGenesisStakeState.stakeTableAmountComm = badGenesisStakeState.stakeTableAmountComm; // revert + // to correct // zero-valued threshold would revert - badGenesis.threshold = 0; - initWithExpectRevert(badGenesis, MAX_HISTORY_SECONDS); - badGenesis.threshold = genesis.threshold; // revert to correct + badGenesisStakeState.threshold = 0; + initWithExpectRevert(badGenesis, badGenesisStakeState, MAX_HISTORY_SECONDS); + badGenesisStakeState.threshold = badGenesisStakeState.threshold; // revert to correct } } @@ -338,8 +339,8 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[2] = vm.toString(numInitValidators); bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory state,,) = - abi.decode(result, (LC.LightClientState, bytes32, bytes32)); + (LC.LightClientState memory state,,,) = + abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeState)); genesis = state; (lcTestProxy, admin) = deployAndInitProxy(genesis, genesisStakeState, MAX_HISTORY_SECONDS); @@ -367,11 +368,11 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { assertEq(abi.encode(lc.getFinalizedState()), abi.encode(states[i])); - bytes32 stakeTableComm = lc.computeStakeTableComm(genesis); + bytes32 stakeTableComm = lc.computeStakeTableComm(genesisStakeState); assertEq(lc.votingStakeTableCommitment(), stakeTableComm); assertEq(lc.frozenStakeTableCommitment(), stakeTableComm); - assertEq(lc.votingThreshold(), genesis.threshold); - assertEq(lc.frozenThreshold(), genesis.threshold); + assertEq(lc.votingThreshold(), genesisStakeState.threshold); + assertEq(lc.frozenThreshold(), genesisStakeState.threshold); } } @@ -399,11 +400,11 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { vm.prank(permissionedProver); lc.newFinalizedState(state, proof); - bytes32 stakeTableComm = lc.computeStakeTableComm(genesis); + bytes32 stakeTableComm = lc.computeStakeTableComm(genesisStakeState); assertEq(lc.votingStakeTableCommitment(), stakeTableComm); assertEq(lc.frozenStakeTableCommitment(), stakeTableComm); - assertEq(lc.votingThreshold(), genesis.threshold); - assertEq(lc.frozenThreshold(), genesis.threshold); + assertEq(lc.votingThreshold(), genesisStakeState.threshold); + assertEq(lc.frozenThreshold(), genesisStakeState.threshold); } /// @dev Test unhappy path when a valid but oudated finalized state is submitted @@ -457,31 +458,6 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { vm.expectRevert("Bn254: invalid scalar field"); lc.newFinalizedState(badState, proof); badState.blockCommRoot = newState.blockCommRoot; - - // invalid scalar for feeLedgerComm - badState.feeLedgerComm = BN254.ScalarField.wrap(BN254.R_MOD + 1); - vm.expectRevert("Bn254: invalid scalar field"); - lc.newFinalizedState(badState, proof); - badState.feeLedgerComm = newState.feeLedgerComm; - - // invalid scalar for stakeTableBlsKeyComm - badState.stakeTableBlsKeyComm = BN254.ScalarField.wrap(BN254.R_MOD + 2); - vm.expectRevert("Bn254: invalid scalar field"); - lc.newFinalizedState(badState, proof); - badState.stakeTableBlsKeyComm = newState.stakeTableBlsKeyComm; - - // invalid scalar for stakeTableSchnorrKeyComm - badState.stakeTableSchnorrKeyComm = BN254.ScalarField.wrap(BN254.R_MOD + 3); - vm.expectRevert("Bn254: invalid scalar field"); - lc.newFinalizedState(badState, proof); - badState.stakeTableSchnorrKeyComm = newState.stakeTableSchnorrKeyComm; - - // invalid scalar for stakeTableAmountComm - badState.stakeTableAmountComm = BN254.ScalarField.wrap(BN254.R_MOD + 4); - vm.expectRevert("Bn254: invalid scalar field"); - lc.newFinalizedState(badState, proof); - badState.stakeTableAmountComm = newState.stakeTableAmountComm; - vm.stopPrank(); } /// @dev Test unhappy path when the plonk proof or the public inputs are wrong @@ -498,7 +474,11 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { abi.decode(result, (LC.LightClientState, V.PlonkProof)); BN254.ScalarField randScalar = BN254.ScalarField.wrap(1234); - LC.LightClientState memory badState = newState; + LC.LightClientState memory badState = LC.LightClientState({ + viewNum: newState.viewNum, + blockHeight: newState.blockHeight, + blockCommRoot: newState.blockCommRoot + }); // wrong view num vm.startPrank(permissionedProver); @@ -519,30 +499,6 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { lc.newFinalizedState(badState, proof); badState.blockCommRoot = newState.blockCommRoot; - // wrong feeLedgerComm - badState.feeLedgerComm = randScalar; - vm.expectRevert(LC.InvalidProof.selector); - lc.newFinalizedState(badState, proof); - badState.feeLedgerComm = newState.feeLedgerComm; - - // wrong stakeTableBlsKeyComm - badState.stakeTableBlsKeyComm = randScalar; - vm.expectRevert(LC.InvalidProof.selector); - lc.newFinalizedState(badState, proof); - badState.stakeTableBlsKeyComm = newState.stakeTableBlsKeyComm; - - // wrong stakeTableSchnorrKeyComm - badState.stakeTableSchnorrKeyComm = randScalar; - vm.expectRevert(LC.InvalidProof.selector); - lc.newFinalizedState(badState, proof); - badState.stakeTableSchnorrKeyComm = newState.stakeTableSchnorrKeyComm; - - // wrong stakeTableAmountComm - badState.stakeTableAmountComm = randScalar; - vm.expectRevert(LC.InvalidProof.selector); - lc.newFinalizedState(badState, proof); - badState.stakeTableAmountComm = newState.stakeTableAmountComm; - cmds = new string[](3); cmds[0] = "diff-test"; cmds[1] = "dummy-proof"; @@ -566,9 +522,15 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { (LC.LightClientState memory newState, V.PlonkProof memory proof) = abi.decode(result, (LC.LightClientState, V.PlonkProof)); + LC.LightClientState memory newLCState = LC.LightClientState({ + viewNum: newState.viewNum, + blockHeight: newState.blockHeight, + blockCommRoot: newState.blockCommRoot + }); + vm.expectRevert(LC.InvalidProof.selector); vm.prank(permissionedProver); - lc.newFinalizedState(newState, proof); + lc.newFinalizedState(newLCState, proof); } } diff --git a/contracts/test/LightClientUpgradeSameContract.t.sol b/contracts/test/LightClientUpgradeSameContract.t.sol index ca094a69a..4333de9ab 100644 --- a/contracts/test/LightClientUpgradeSameContract.t.sol +++ b/contracts/test/LightClientUpgradeSameContract.t.sol @@ -16,6 +16,7 @@ contract LightClientUpgradeSameContractTest is Test { UpgradeLightClientScript public upgrader = new UpgradeLightClientScript(); LCV1.LightClientState public stateV1; + LCV1.StakeState public stakeStateV1; address public admin; address public proxy; @@ -24,7 +25,7 @@ contract LightClientUpgradeSameContractTest is Test { // deploy the first implementation with its proxy function setUp() public { - (proxy, admin, stateV1) = deployer.run(5, MAX_HISTORY_SECONDS); + (proxy, admin, stateV1, stakeStateV1) = deployer.run(5, MAX_HISTORY_SECONDS); lcV1Proxy = LCV1(proxy); } @@ -33,11 +34,11 @@ contract LightClientUpgradeSameContractTest is Test { assertEq(abi.encode(lcV1Proxy.getFinalizedState()), abi.encode(stateV1)); - bytes32 stakeTableComm = lcV1Proxy.computeStakeTableComm(stateV1); + bytes32 stakeTableComm = lcV1Proxy.computeStakeTableComm(stakeStateV1); assertEq(lcV1Proxy.votingStakeTableCommitment(), stakeTableComm); assertEq(lcV1Proxy.frozenStakeTableCommitment(), stakeTableComm); - assertEq(lcV1Proxy.votingThreshold(), stateV1.threshold); - assertEq(lcV1Proxy.frozenThreshold(), stateV1.threshold); + assertEq(lcV1Proxy.votingThreshold(), stakeStateV1.threshold); + assertEq(lcV1Proxy.frozenThreshold(), stakeStateV1.threshold); } // that the data remains the same after upgrading the implementation @@ -47,16 +48,8 @@ contract LightClientUpgradeSameContractTest is Test { // of the upgraded contract is set to 0 lcV2Proxy = LCV2(upgrader.run(0, proxy)); - LCV2.LightClientState memory expectedLightClientState = LCV2.LightClientState( - stateV1.viewNum, - stateV1.blockHeight, - stateV1.blockCommRoot, - stateV1.feeLedgerComm, - stateV1.stakeTableBlsKeyComm, - stateV1.stakeTableSchnorrKeyComm, - stateV1.stakeTableAmountComm, - stateV1.threshold - ); + LCV2.LightClientState memory expectedLightClientState = + LCV2.LightClientState(stateV1.viewNum, stateV1.blockHeight, stateV1.blockCommRoot); assertEq(abi.encode(lcV2Proxy.getFinalizedState()), abi.encode(expectedLightClientState)); } diff --git a/contracts/test/LightClientUpgradeToVx.t.sol b/contracts/test/LightClientUpgradeToVx.t.sol index 66227c41e..98ae33974 100644 --- a/contracts/test/LightClientUpgradeToVx.t.sol +++ b/contracts/test/LightClientUpgradeToVx.t.sol @@ -23,6 +23,7 @@ contract LightClientUpgradeToVxTest is Test { ULCV3 public upgraderV3 = new ULCV3(); LCV1.LightClientState public stateV1; + LCV1.StakeState public stakeStateV1; address public admin; address public proxy; @@ -31,7 +32,7 @@ contract LightClientUpgradeToVxTest is Test { // deploy the first implementation with its proxy function setUp() public { - (proxy, admin, stateV1) = deployer.run(5, MAX_HISTORY_SECONDS); + (proxy, admin, stateV1, stakeStateV1) = deployer.run(5, MAX_HISTORY_SECONDS); lcV1Proxy = LCV1(proxy); } @@ -40,11 +41,11 @@ contract LightClientUpgradeToVxTest is Test { assertEq(abi.encode(lcV1Proxy.getFinalizedState()), abi.encode(stateV1)); - bytes32 stakeTableComm = lcV1Proxy.computeStakeTableComm(stateV1); + bytes32 stakeTableComm = lcV1Proxy.computeStakeTableComm(stakeStateV1); assertEq(lcV1Proxy.votingStakeTableCommitment(), stakeTableComm); assertEq(lcV1Proxy.frozenStakeTableCommitment(), stakeTableComm); - assertEq(lcV1Proxy.votingThreshold(), stateV1.threshold); - assertEq(lcV1Proxy.frozenThreshold(), stateV1.threshold); + assertEq(lcV1Proxy.votingThreshold(), stakeStateV1.threshold); + assertEq(lcV1Proxy.frozenThreshold(), stakeStateV1.threshold); } // test that the data remains the same after upgrading the implementation @@ -57,16 +58,8 @@ contract LightClientUpgradeToVxTest is Test { assertEq(lcV2Proxy.newField(), myNewField); - LCV1.LightClientState memory expectedLightClientState = LCV1.LightClientState( - stateV1.viewNum, - stateV1.blockHeight, - stateV1.blockCommRoot, - stateV1.feeLedgerComm, - stateV1.stakeTableBlsKeyComm, - stateV1.stakeTableSchnorrKeyComm, - stateV1.stakeTableAmountComm, - stateV1.threshold - ); + LCV1.LightClientState memory expectedLightClientState = + LCV1.LightClientState(stateV1.viewNum, stateV1.blockHeight, stateV1.blockCommRoot); LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = LCV2.ExtendedLightClientState(0); @@ -88,16 +81,8 @@ contract LightClientUpgradeToVxTest is Test { assertEq(lcV2Proxy.newField(), myNewField); - LCV1.LightClientState memory expectedLightClientState = LCV1.LightClientState( - stateV1.viewNum, - stateV1.blockHeight, - stateV1.blockCommRoot, - stateV1.feeLedgerComm, - stateV1.stakeTableBlsKeyComm, - stateV1.stakeTableSchnorrKeyComm, - stateV1.stakeTableAmountComm, - stateV1.threshold - ); + LCV1.LightClientState memory expectedLightClientState = + LCV1.LightClientState(stateV1.viewNum, stateV1.blockHeight, stateV1.blockCommRoot); LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = LCV2.ExtendedLightClientState(0); @@ -124,16 +109,8 @@ contract LightClientUpgradeToVxTest is Test { assertEq(lcV2Proxy.newField(), myNewField); - LCV1.LightClientState memory expectedLightClientState = LCV1.LightClientState( - stateV1.viewNum, - stateV1.blockHeight, - stateV1.blockCommRoot, - stateV1.feeLedgerComm, - stateV1.stakeTableBlsKeyComm, - stateV1.stakeTableSchnorrKeyComm, - stateV1.stakeTableAmountComm, - stateV1.threshold - ); + LCV1.LightClientState memory expectedLightClientState = + LCV1.LightClientState(stateV1.viewNum, stateV1.blockHeight, stateV1.blockCommRoot); LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = LCV2.ExtendedLightClientState(0); @@ -169,16 +146,8 @@ contract LightClientUpgradeToVxTest is Test { assertEq(lcV2Proxy.newField(), myNewField); - LCV1.LightClientState memory expectedLightClientState = LCV1.LightClientState( - stateV1.viewNum, - stateV1.blockHeight, - stateV1.blockCommRoot, - stateV1.feeLedgerComm, - stateV1.stakeTableBlsKeyComm, - stateV1.stakeTableSchnorrKeyComm, - stateV1.stakeTableAmountComm, - stateV1.threshold - ); + LCV1.LightClientState memory expectedLightClientState = + LCV1.LightClientState(stateV1.viewNum, stateV1.blockHeight, stateV1.blockCommRoot); LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = LCV2.ExtendedLightClientState(0); diff --git a/contracts/test/LightClientV2.sol b/contracts/test/LightClientV2.sol index 418aaf41c..a598ad70c 100644 --- a/contracts/test/LightClientV2.sol +++ b/contracts/test/LightClientV2.sol @@ -63,10 +63,6 @@ contract LightClientV2 is LightClient { } // format validity check BN254.validateScalarField(newState.blockCommRoot); - BN254.validateScalarField(newState.feeLedgerComm); - BN254.validateScalarField(newState.stakeTableBlsKeyComm); - BN254.validateScalarField(newState.stakeTableSchnorrKeyComm); - BN254.validateScalarField(newState.stakeTableAmountComm); // check plonk proof verifyProof(newState, proof); @@ -79,14 +75,6 @@ contract LightClientV2 is LightClient { // different data handling mechanisms // and this each field needs to be assigned individually finalizedState = newState; - // states[finalizedState].viewNum = newState.viewNum; - // states[finalizedState].blockHeight = newState.blockHeight; - // states[finalizedState].blockCommRoot = newState.blockCommRoot; - // states[finalizedState].feeLedgerComm = newState.feeLedgerComm; - // states[finalizedState].stakeTableBlsKeyComm = newState.stakeTableBlsKeyComm; - // states[finalizedState].stakeTableSchnorrKeyComm = newState.stakeTableSchnorrKeyComm; - // states[finalizedState].stakeTableAmountComm = newState.stakeTableAmountComm; - // states[finalizedState].threshold = newState.threshold; extendedFinalzedState.extraField = 2; diff --git a/contracts/test/mocks/LightClientMock.sol b/contracts/test/mocks/LightClientMock.sol index f4b7e5bc9..242efeeee 100644 --- a/contracts/test/mocks/LightClientMock.sol +++ b/contracts/test/mocks/LightClientMock.sol @@ -40,10 +40,6 @@ contract LightClientMock is LC { publicInput[1] = uint256(state.viewNum); publicInput[2] = uint256(state.blockHeight); publicInput[3] = BN254.ScalarField.unwrap(state.blockCommRoot); - publicInput[4] = BN254.ScalarField.unwrap(state.feeLedgerComm); - publicInput[5] = BN254.ScalarField.unwrap(finalizedState.stakeTableBlsKeyComm); - publicInput[6] = BN254.ScalarField.unwrap(finalizedState.stakeTableSchnorrKeyComm); - publicInput[7] = BN254.ScalarField.unwrap(finalizedState.stakeTableAmountComm); if (!PlonkVerifier.verify(vk, publicInput, proof)) { revert InvalidProof(); diff --git a/hotshot-state-prover/src/circuit.rs b/hotshot-state-prover/src/circuit.rs index c903473f9..7fb3907e7 100644 --- a/hotshot-state-prover/src/circuit.rs +++ b/hotshot-state-prover/src/circuit.rs @@ -51,7 +51,7 @@ pub struct LightClientStateVar { /// `vars[2]`: block commitment root /// `vars[3]`: fee ledger commitment /// `vars[4-6]`: stake table commitment - vars: [Variable; 7], + vars: [Variable; 3], } impl LightClientStateVar { @@ -68,10 +68,6 @@ impl LightClientStateVar { circuit.create_public_variable(view_number_f)?, circuit.create_public_variable(block_height_f)?, circuit.create_public_variable(state.block_comm_root)?, - circuit.create_public_variable(state.fee_ledger_comm)?, - circuit.create_public_variable(state.stake_table_comm.0)?, - circuit.create_public_variable(state.stake_table_comm.1)?, - circuit.create_public_variable(state.stake_table_comm.2)?, ], }) } @@ -257,10 +253,6 @@ where view_number_f, block_height_f, lightclient_state.block_comm_root, - lightclient_state.fee_ledger_comm, - lightclient_state.stake_table_comm.0, - lightclient_state.stake_table_comm.1, - lightclient_state.stake_table_comm.2, ]; // Checking whether the accumulated weight exceeds the quorum threshold @@ -359,8 +351,6 @@ where view_number: 0, block_height: 0, block_comm_root: F::default(), - fee_ledger_comm: F::default(), - stake_table_comm: (F::default(), F::default(), F::default()), }; build::( &[], @@ -410,18 +400,13 @@ mod tests { let block_comm_root = VariableLengthRescueCRHF::::evaluate(vec![F::from(1u32), F::from(2u32)]).unwrap() [0]; - let fee_ledger_comm = - VariableLengthRescueCRHF::::evaluate(vec![F::from(3u32), F::from(5u32)]).unwrap() - [0]; let lightclient_state = GenericLightClientState { view_number: 100, block_height: 73, block_comm_root, - fee_ledger_comm, - stake_table_comm: st.commitment(SnapshotVersion::LastEpochStart).unwrap(), }; - let state_msg: [F; 7] = lightclient_state.clone().into(); + let state_msg: [F; 3] = lightclient_state.clone().into(); let sigs = state_keys .iter() @@ -527,7 +512,7 @@ mod tests { // bad path: bad stake table commitment let mut bad_lightclient_state = lightclient_state.clone(); bad_lightclient_state.stake_table_comm.1 = F::default(); - let bad_state_msg: [F; 7] = bad_lightclient_state.clone().into(); + let bad_state_msg: [F; 3] = bad_lightclient_state.clone().into(); let sig_for_bad_state = state_keys .iter() .map(|(key, _)| { @@ -552,7 +537,7 @@ mod tests { let mut wrong_light_client_state = lightclient_state.clone(); // state with a different qc key commitment wrong_light_client_state.stake_table_comm.0 = F::default(); - let wrong_state_msg: [F; 7] = wrong_light_client_state.into(); + let wrong_state_msg: [F; 3] = wrong_light_client_state.into(); let wrong_sigs = state_keys .iter() .map(|(key, _)| { diff --git a/hotshot-state-prover/src/mock_ledger.rs b/hotshot-state-prover/src/mock_ledger.rs index f31f641a3..b33ffc73f 100644 --- a/hotshot-state-prover/src/mock_ledger.rs +++ b/hotshot-state-prover/src/mock_ledger.rs @@ -15,12 +15,15 @@ use ethers::{ utils, }; use hotshot_contract_adapter::{ - jellyfish::{field_to_u256, open_key, u256_to_field}, - light_client::ParsedLightClientState, + jellyfish::{field_to_u256, open_key, u256_to_field /* , u256_to_field*/}, + light_client::{ParsedLightClientState, ParsedStakeState}, }; use hotshot_stake_table::vec_based::StakeTable; use hotshot_types::{ - light_client::{GenericLightClientState, GenericPublicInput, LightClientState}, + light_client::{ + GenericLightClientState, GenericPublicInput, GenericStakeState, LightClientState, + StakeState, + }, traits::stake_table::{SnapshotVersion, StakeTableScheme}, }; use itertools::izip; @@ -99,14 +102,14 @@ impl MockLedger { // arbitrary commitment values as they don't affect logic being tested let block_comm_root = F::from(1234); - let fee_ledger_comm = F::from(5678); + // let fee_ledger_comm: ark_ff::Fp, 4> = F::from(5678); let genesis = LightClientState { view_number: 0, block_height: 0, block_comm_root, - fee_ledger_comm, - stake_table_comm: st.commitment(SnapshotVersion::LastEpochStart).unwrap(), + // fee_ledger_comm, + // stake_table_comm: st.commitment(SnapshotVersion::LastEpochStart).unwrap(), }; Self { pp, @@ -137,12 +140,11 @@ impl MockLedger { } let new_root = self.new_dummy_comm(); - let new_fee_ledger_comm = self.new_dummy_comm(); + // let new_fee_ledger_comm = self.new_dummy_comm(); self.state.view_number += 1; self.state.block_height += 1; self.state.block_comm_root = new_root; - self.state.fee_ledger_comm = new_fee_ledger_comm; } /// Elapse a view without a new finalized block @@ -208,8 +210,8 @@ impl MockLedger { } /// Return the light client state and proof of consensus on this finalized state - pub fn gen_state_proof(&mut self) -> (GenericPublicInput, Proof) { - let state_msg: [F; 7] = self.state.clone().into(); + pub fn gen_state_proof(&mut self) -> (GenericPublicInput, Proof, GenericStakeState) { + let state_msg: [F; 3] = self.state.clone().into(); let st: Vec<(BLSVerKey, U256, SchnorrVerKey)> = self .st @@ -282,22 +284,35 @@ impl MockLedger { STAKE_TABLE_CAPACITY, ) .expect("Fail to generate state proof"); - (pi, proof) + + let stake_table_comm = self + .st + .clone() + .commitment(SnapshotVersion::LastEpochStart) + .unwrap(); + let stt = StakeState { + threshold: u256_to_field(self.threshold), + stake_table_bls_key_comm: stake_table_comm.clone().0, + stake_table_schnorr_key_comm: stake_table_comm.clone().1, + stake_table_amount_comm: stake_table_comm.clone().2, + }; + + (pi, proof, stt) } /// a malicious attack, generating a fake stake table full of adversarial stakers /// adv-controlled stakers signed the state and replace the stake table commitment with that of the fake one /// in an attempt to hijack the correct stake table. pub fn gen_state_proof_with_fake_stakers(&mut self) -> (GenericPublicInput, Proof) { - let mut new_state = self.state.clone(); + let new_state = self.state.clone(); let (adv_qc_keys, adv_state_keys) = key_pairs_for_testing(STAKE_TABLE_CAPACITY, &mut self.rng); let adv_st = stake_table_for_testing(&adv_qc_keys, &adv_state_keys); // replace new state with adversarial stake table commitment - new_state.stake_table_comm = adv_st.commitment(SnapshotVersion::EpochStart).unwrap(); - let state_msg: [F; 7] = new_state.clone().into(); + // new_state.stake_table_comm = adv_st.commitment(SnapshotVersion::EpochStart).unwrap(); + let state_msg: [F; 3] = new_state.clone().into(); // every fake stakers sign on the adverarial new state let bit_vec = vec![true; STAKE_TABLE_CAPACITY]; @@ -347,21 +362,16 @@ impl MockLedger { pub fn get_state(&self) -> ParsedLightClientState { // The ugly conversion due to slight difference of `LightClientState` in solidity containing `threshold` let pi = vec![ - u256_to_field(self.threshold), F::from(self.state.view_number as u64), F::from(self.state.block_height as u64), self.state.block_comm_root, - self.state.fee_ledger_comm, - self.state.stake_table_comm.0, - self.state.stake_table_comm.1, - self.state.stake_table_comm.2, ]; let pi: GenericPublicInput = pi.into(); pi.into() } /// Returns the (bytes32 votingStakeTableComm, bytes32 frozenStakeTableComm) used in contract - pub fn get_stake_table_comms(&self) -> (H256, H256) { + pub fn get_stake_table_comms(&self) -> (H256, H256, ParsedStakeState) { let (bls_key_comm, schnorr_key_comm, amount_comm) = self.st.commitment(SnapshotVersion::EpochStart).unwrap(); let frozen_st_comm = utils::keccak256( @@ -384,7 +394,18 @@ impl MockLedger { .unwrap(), ); - (voting_st_comm.into(), frozen_st_comm.into()) + let stake_table: ParsedStakeState = ParsedStakeState { + threshold: self.threshold, + bls_key_comm: field_to_u256(bls_key_comm), + schnorr_key_comm: field_to_u256(schnorr_key_comm), + amount_comm: field_to_u256(amount_comm), + }; + + ( + voting_st_comm.into(), + frozen_st_comm.into(), + stake_table.into(), + ) } // return a dummy commitment value diff --git a/hotshot-state-prover/src/service.rs b/hotshot-state-prover/src/service.rs index e7ff14ac2..3def06ec2 100644 --- a/hotshot-state-prover/src/service.rs +++ b/hotshot-state-prover/src/service.rs @@ -22,8 +22,8 @@ use ethers::{ }; use futures::FutureExt; use hotshot_contract_adapter::{ - jellyfish::{u256_to_field, ParsedPlonkProof}, - light_client::ParsedLightClientState, + jellyfish::{field_to_u256, u256_to_field, ParsedPlonkProof}, + light_client::{ParsedLightClientState, ParsedStakeState}, }; use hotshot_stake_table::vec_based::{config::FieldType, StakeTable}; use hotshot_types::{ @@ -200,6 +200,35 @@ pub fn light_client_genesis_from_stake_table( Ok(pi.into()) } +pub async fn light_client_genesis_stake( + sequencer_url: &Url, + stake_table_capacity: usize, +) -> anyhow::Result { + let st = init_stake_table_from_sequencer(sequencer_url, stake_table_capacity) + .await + .with_context(|| "Failed to initialize stake table")?; + light_client_genesis_stake_from_stake_table(st) +} + +#[inline] +pub fn light_client_genesis_stake_from_stake_table( + st: StakeTable, +) -> anyhow::Result { + let (bls_comm, schnorr_comm, stake_comm) = st + .commitment(SnapshotVersion::LastEpochStart) + .expect("Commitment computation shouldn't fail."); + let threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart)?); + + let stt = ParsedStakeState { + threshold: threshold, + bls_key_comm: field_to_u256(bls_comm), + schnorr_key_comm: field_to_u256(schnorr_comm), + amount_comm: field_to_u256(stake_comm), + }; + + Ok(stt) +} + pub fn load_proving_key(stake_table_capacity: usize) -> ProvingKey { let srs = { let num_gates = crate::circuit::build_for_preprocessing::< @@ -352,7 +381,7 @@ pub async fn sync_state( entries.iter().enumerate().for_each(|(i, (key, stake))| { if let Some(sig) = bundle.signatures.get(key) { // Check if the signature is valid - let state_msg: [FieldType; 7] = (&bundle.state).into(); + let state_msg: [FieldType; 3] = (&bundle.state).into(); if key.verify(&state_msg, sig, CS_ID_SCHNORR).is_ok() { signer_bit_vec[i] = true; signatures[i] = sig.clone(); @@ -584,14 +613,7 @@ mod test { schnorr_key_comm: {:x?},\ amount_comm: {:x?},\ threshold: {}", - genesis.view_num, - genesis.block_height, - genesis.block_comm_root, - genesis.fee_ledger_comm, - genesis.bls_key_comm.encode_hex(), - genesis.schnorr_key_comm.encode_hex(), - genesis.amount_comm.encode_hex(), - genesis.threshold, + genesis.view_num, genesis.block_height, genesis.block_comm_root, ); (genesis, stake_genesis, qc_keys, state_keys, st) } @@ -605,7 +627,7 @@ mod test { ) -> (PublicInput, Proof) { let mut rng = test_rng(); - let new_state_msg: [CircuitField; 7] = { + let new_state_msg: [CircuitField; 3] = { // sorry for the complicated .into() conversion chain, might improve in the future let pi_msg: LightClientState = new_state.clone().into(); pi_msg.into() diff --git a/hotshot-state-prover/src/snark.rs b/hotshot-state-prover/src/snark.rs index 08ab7a80b..89c60922f 100644 --- a/hotshot-state-prover/src/snark.rs +++ b/hotshot-state-prover/src/snark.rs @@ -215,10 +215,10 @@ mod tests { view_number: 100, block_height: 73, block_comm_root, - fee_ledger_comm, - stake_table_comm: st.commitment(SnapshotVersion::LastEpochStart).unwrap(), + // fee_ledger_comm, + // stake_table_comm: st.commitment(SnapshotVersion::LastEpochStart).unwrap(), }; - let state_msg: [CircuitField; 7] = lightclient_state.clone().into(); + let state_msg: [CircuitField; 3] = lightclient_state.clone().into(); let sigs = schnorr_keys .iter() diff --git a/sequencer/src/api.rs b/sequencer/src/api.rs index 0e628ab78..4dedce900 100644 --- a/sequencer/src/api.rs +++ b/sequencer/src/api.rs @@ -628,6 +628,11 @@ pub mod test_helpers { light_client_genesis_from_stake_table(st).unwrap() } + pub fn light_client_genesis_stake(&self) -> ParsedStakeState { + let st = self.cfg.stake_table(); + light_client_genesis_stake_from_stake_table(st).unwrap() + } + pub async fn stop_consensus(&mut self) { self.server.shutdown_consensus().await; diff --git a/sequencer/src/bin/deploy.rs b/sequencer/src/bin/deploy.rs index 5552ff5d8..8e98fb04b 100644 --- a/sequencer/src/bin/deploy.rs +++ b/sequencer/src/bin/deploy.rs @@ -3,7 +3,7 @@ use std::{fs::File, io::stdout, path::PathBuf}; use clap::Parser; use futures::FutureExt; use hotshot_stake_table::config::STAKE_TABLE_CAPACITY; -use hotshot_state_prover::service::light_client_genesis; +use hotshot_state_prover::service::{light_client_genesis, light_client_genesis_stake}; use sequencer_utils::{ deployer::{deploy, ContractGroup, Contracts, DeployedContracts}, logging, @@ -101,6 +101,8 @@ async fn main() -> anyhow::Result<()> { let sequencer_url = opt.sequencer_url.clone(); let genesis = light_client_genesis(&sequencer_url, opt.stake_table_capacity).boxed(); + let genesis_stake = + light_client_genesis_stake(&sequencer_url, opt.stake_table_capacity).boxed(); let contracts = deploy( opt.rpc_url, @@ -109,6 +111,7 @@ async fn main() -> anyhow::Result<()> { opt.use_mock_contract, opt.only, genesis, + genesis_stake, contracts, ) .await?; diff --git a/sequencer/src/bin/espresso-dev-node.rs b/sequencer/src/bin/espresso-dev-node.rs index f5172b607..1329451f9 100644 --- a/sequencer/src/bin/espresso-dev-node.rs +++ b/sequencer/src/bin/espresso-dev-node.rs @@ -196,6 +196,7 @@ async fn main() -> anyhow::Result<()> { tracing::info!("Hotshot config {config:?}"); let light_client_genesis = network.light_client_genesis(); + let light_client_genesis_stake = network.light_client_genesis_stake(); let contracts = Contracts::new(); let mut light_client_addresses = vec![]; @@ -240,6 +241,7 @@ async fn main() -> anyhow::Result<()> { true, None, async { Ok(light_client_genesis.clone()) }.boxed(), + async { Ok(light_client_genesis_stake.clone()) }.boxed(), contracts.clone(), ) .await?; diff --git a/sequencer/src/state_signature.rs b/sequencer/src/state_signature.rs index cf4e7e041..997366526 100644 --- a/sequencer/src/state_signature.rs +++ b/sequencer/src/state_signature.rs @@ -164,8 +164,6 @@ fn form_light_client_state( view_number: leaf.view_number().u64() as usize, block_height: leaf.height() as usize, block_comm_root: hash_bytes_to_field(&block_comm_root_bytes)?, - fee_ledger_comm: hash_bytes_to_field(&fee_ledger_comm_bytes)?, - stake_table_comm: *stake_table_comm, }) } diff --git a/sequencer/src/state_signature/relay_server.rs b/sequencer/src/state_signature/relay_server.rs index de61ba92d..d17b728a5 100644 --- a/sequencer/src/state_signature/relay_server.rs +++ b/sequencer/src/state_signature/relay_server.rs @@ -114,7 +114,7 @@ impl StateRelayServerDataSource for StateRelayServerState { // StatusCode::Unauthorized, // "The posted key is not found in the stake table.".to_owned(), // ))?; - let state_msg: [FieldType; 7] = (&state).into(); + let state_msg: [FieldType; 3] = (&state).into(); if StateSignatureScheme::verify(&(), &key, state_msg, &signature).is_err() { return Err(tide_disco::error::ServerError::catch_all( StatusCode::BAD_REQUEST, diff --git a/utils/src/deployer.rs b/utils/src/deployer.rs index 14644f469..948f11100 100644 --- a/utils/src/deployer.rs +++ b/utils/src/deployer.rs @@ -311,6 +311,7 @@ pub async fn deploy( use_mock_contract: bool, only: Option>, genesis: BoxFuture<'_, anyhow::Result>, + genesis_stake: BoxFuture<'_, anyhow::Result>, mut contracts: Contracts, ) -> anyhow::Result { let provider = Provider::::try_from(l1url.to_string())?; @@ -358,10 +359,10 @@ pub async fn deploy( let light_client = LightClient::new(lc_address, l1.clone()); let genesis = genesis.await?.clone(); - let parsed_stake_state: ParsedStakeState = genesis.clone().into(); + let genesis_stake = genesis_stake.await?.clone(); let data = light_client - .initialize(genesis.into(), parsed_stake_state.into(), 864000, owner) + .initialize(genesis.into(), genesis_stake.into(), 864000, owner) .calldata() .context("calldata for initialize transaction not available")?; contracts From b28fb7cc38be7e5e2a6d8772ac2d2d3e3083d0c4 Mon Sep 17 00:00:00 2001 From: Alysia Huggins Date: Wed, 4 Sep 2024 15:15:10 -0400 Subject: [PATCH 06/27] not verified: working on changes to circuit.rs to support new struct --- Cargo.lock | 38 ++++++++-------- contracts/rust/diff-test/src/main.rs | 5 ++- contracts/script/LightClient.s.sol | 2 +- .../LightClientCallNewFinalizedState.s.sol | 4 +- .../test/DeployLightClientTestScript.s.sol | 2 +- contracts/test/LightClient.t.sol | 44 +++++++++++-------- contracts/test/LightClientBenchmark.t.sol | 4 +- hotshot-state-prover/src/circuit.rs | 28 ++++++++++-- hotshot-state-prover/src/mock_ledger.rs | 32 +++++++++++--- 9 files changed, 104 insertions(+), 55 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6cfabcbde..041b072dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1480,9 +1480,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.15" +version = "1.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b" dependencies = [ "jobserver", "libc", @@ -2789,9 +2789,9 @@ dependencies = [ [[package]] name = "edit-distance" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "853fc7035888bd1c9320f3a05bfe7f344f49b8766a4bb4209b1ac5f0503d9577" +checksum = "e3f497e87b038c09a155dfd169faa5ec940d0644635555ef6bd464ac20e97397" [[package]] name = "either" @@ -4077,7 +4077,7 @@ dependencies = [ [[package]] name = "hotshot" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#764b95b406f3a5e5ce042f1c333276cfd61e705c" dependencies = [ "anyhow", "async-broadcast", @@ -4124,7 +4124,7 @@ dependencies = [ [[package]] name = "hotshot-builder-api" version = "0.1.7" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#764b95b406f3a5e5ce042f1c333276cfd61e705c" dependencies = [ "async-trait", "clap", @@ -4222,7 +4222,7 @@ dependencies = [ [[package]] name = "hotshot-example-types" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#764b95b406f3a5e5ce042f1c333276cfd61e705c" dependencies = [ "anyhow", "async-broadcast", @@ -4255,7 +4255,7 @@ dependencies = [ [[package]] name = "hotshot-fakeapi" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#764b95b406f3a5e5ce042f1c333276cfd61e705c" dependencies = [ "anyhow", "async-lock 2.8.0", @@ -4274,7 +4274,7 @@ dependencies = [ [[package]] name = "hotshot-macros" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#764b95b406f3a5e5ce042f1c333276cfd61e705c" dependencies = [ "derive_builder", "proc-macro2", @@ -4285,7 +4285,7 @@ dependencies = [ [[package]] name = "hotshot-orchestrator" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#764b95b406f3a5e5ce042f1c333276cfd61e705c" dependencies = [ "anyhow", "async-compatibility-layer", @@ -4371,7 +4371,7 @@ dependencies = [ [[package]] name = "hotshot-stake-table" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#764b95b406f3a5e5ce042f1c333276cfd61e705c" dependencies = [ "ark-bn254", "ark-ed-on-bn254", @@ -4433,7 +4433,7 @@ dependencies = [ [[package]] name = "hotshot-task" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#764b95b406f3a5e5ce042f1c333276cfd61e705c" dependencies = [ "anyhow", "async-broadcast", @@ -4448,7 +4448,7 @@ dependencies = [ [[package]] name = "hotshot-task-impls" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#764b95b406f3a5e5ce042f1c333276cfd61e705c" dependencies = [ "anyhow", "async-broadcast", @@ -4485,7 +4485,7 @@ dependencies = [ [[package]] name = "hotshot-testing" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#764b95b406f3a5e5ce042f1c333276cfd61e705c" dependencies = [ "anyhow", "async-broadcast", @@ -4531,7 +4531,7 @@ dependencies = [ [[package]] name = "hotshot-types" version = "0.1.11" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#764b95b406f3a5e5ce042f1c333276cfd61e705c" dependencies = [ "anyhow", "ark-bn254", @@ -4753,9 +4753,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", @@ -5788,7 +5788,7 @@ dependencies = [ [[package]] name = "libp2p-networking" version = "0.5.72" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#fab485203813d8ae684f65cdd6b9241db2e46f54" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#764b95b406f3a5e5ce042f1c333276cfd61e705c" dependencies = [ "anyhow", "async-compatibility-layer", @@ -8009,7 +8009,7 @@ dependencies = [ "http-body 1.0.1", "http-body-util", "hyper 1.4.1", - "hyper-rustls 0.27.2", + "hyper-rustls 0.27.3", "hyper-tls", "hyper-util", "ipnet", diff --git a/contracts/rust/diff-test/src/main.rs b/contracts/rust/diff-test/src/main.rs index f2f5d3859..421ca5947 100644 --- a/contracts/rust/diff-test/src/main.rs +++ b/contracts/rust/diff-test/src/main.rs @@ -496,6 +496,7 @@ fn main() { let mut new_states: Vec = vec![]; let mut proofs: Vec = vec![]; let mut stake_stakes: Vec = vec![]; + for i in 1..block_per_epoch + 2 { // only update stake table at the last block, as it would only take effect in next epoch anyway. if i == block_per_epoch { @@ -525,7 +526,7 @@ fn main() { stake_stakes.push(parsed_stake_state.into()); } - let res = (new_states, proofs); + let res = (new_states, proofs, stake_stakes); println!("{}", res.encode_hex()); } Action::MockSkipBlocks => { @@ -593,7 +594,7 @@ fn main() { let mut ledger = MockLedger::init(pp, STAKE_TABLE_CAPACITY / 2); ledger.elapse_with_block(); - let (pi, proof) = ledger.gen_state_proof_with_fake_stakers(); + let (pi, proof, stt) = ledger.gen_state_proof_with_fake_stakers(); let new_state: ParsedLightClientState = pi.into(); let proof: ParsedPlonkProof = proof.into(); diff --git a/contracts/script/LightClient.s.sol b/contracts/script/LightClient.s.sol index 03ea91260..87c9f4ac9 100644 --- a/contracts/script/LightClient.s.sol +++ b/contracts/script/LightClient.s.sol @@ -74,7 +74,7 @@ contract DeployLightClientContractScript is Script { // Encode the initializer function call bytes memory data = abi.encodeWithSignature( - "initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256),uint32,address)", + "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)", state, stakeState, stateHistoryRetentionPeriod, diff --git a/contracts/script/LightClientCallNewFinalizedState.s.sol b/contracts/script/LightClientCallNewFinalizedState.s.sol index f5f25c290..5a664879c 100644 --- a/contracts/script/LightClientCallNewFinalizedState.s.sol +++ b/contracts/script/LightClientCallNewFinalizedState.s.sol @@ -24,8 +24,8 @@ contract CallNewFinalizedState is Script { cmds[4] = vm.toString(numExits); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, ) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); address admin; string memory seedPhrase = vm.envString("MNEMONIC"); diff --git a/contracts/test/DeployLightClientTestScript.s.sol b/contracts/test/DeployLightClientTestScript.s.sol index 1b489b383..a0fb6eed3 100644 --- a/contracts/test/DeployLightClientTestScript.s.sol +++ b/contracts/test/DeployLightClientTestScript.s.sol @@ -79,7 +79,7 @@ contract DeployLightClientTestScript is Script { // Encode the initializer function call bytes memory data = abi.encodeWithSignature( - "initialize((uint64,uint64,uint256,uint256,uint256,uint256,uint256,uint256),(uint256,uint256,uint256,uint256),uint32,address)", + "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)", state, stakeState, stateHistoryRetentionPeriod, diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol index 3778ab8f8..56442640c 100644 --- a/contracts/test/LightClient.t.sol +++ b/contracts/test/LightClient.t.sol @@ -150,6 +150,7 @@ contract LightClient_constructor_Test is LightClientCommonTest { contract LightClient_permissionedProver_Test is LightClientCommonTest { LC.LightClientState internal newState; V.PlonkProof internal newProof; + LC.StakeState internal newStakeState; function setUp() public { init(); @@ -162,11 +163,12 @@ contract LightClient_permissionedProver_Test is LightClientCommonTest { cmds[4] = vm.toString(uint64(1)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, LC.StakeState[] memory stakeStates) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); newState = states[0]; newProof = proofs[0]; + newStakeState = stakeStates[0]; } function test_NoProverPermissionsRequired() external { @@ -309,8 +311,9 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[4] = vm.toString(uint64(3)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, ) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + vm.expectEmit(true, true, true, true); emit LC.NewState(states[0].viewNum, states[0].blockHeight, states[0].blockCommRoot); vm.prank(permissionedProver); @@ -355,8 +358,8 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[4] = vm.toString(numExits); result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, LC.StakeState[] memory stakeStates) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); uint256 statesLen = states.length; @@ -368,11 +371,11 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { assertEq(abi.encode(lc.getFinalizedState()), abi.encode(states[i])); - bytes32 stakeTableComm = lc.computeStakeTableComm(genesisStakeState); + bytes32 stakeTableComm = lc.computeStakeTableComm(stakeStates[i]); assertEq(lc.votingStakeTableCommitment(), stakeTableComm); assertEq(lc.frozenStakeTableCommitment(), stakeTableComm); - assertEq(lc.votingThreshold(), genesisStakeState.threshold); - assertEq(lc.frozenThreshold(), genesisStakeState.threshold); + assertEq(lc.votingThreshold(), stakeStates[i].threshold); + assertEq(lc.frozenThreshold(), stakeStates[i].threshold); } } @@ -537,6 +540,7 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { contract LightClient_StateUpdatesTest is LightClientCommonTest { LC.LightClientState internal newState; V.PlonkProof internal newProof; + LC.StakeState internal newStakeState; function assertInitialStateHistoryConditions() internal view { // assert that stateHistoryFirstIndex starts at 0. @@ -576,11 +580,12 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { assertGe(lc.stateHistoryRetentionPeriod(), 1 days); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, LC.StakeState[] memory stakeStates) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); newState = states[1]; newProof = proofs[1]; + newStakeState = stakeStates[1]; } function test_1lBlockUpdatesIsUpdated() public { @@ -633,8 +638,8 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { assertInitialStateHistoryConditions(); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, ) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); // Add one numDays worth of a new state uint256 i; @@ -703,8 +708,8 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { uint32 numDays = 2; bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, ) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); assertInitialStateHistoryConditions(); @@ -1154,8 +1159,9 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { cmds[4] = vm.toString(uint64(1)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + assertEq(result, '0xddaf'); + (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs, ) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); newState = _states[1]; newProof = _proofs[1]; @@ -1192,8 +1198,8 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { cmds[4] = vm.toString(uint64(1)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs, ) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); uint256 statesCount = _states.length - 1; // Update the state and thus the l1BlockUpdates array would be updated diff --git a/contracts/test/LightClientBenchmark.t.sol b/contracts/test/LightClientBenchmark.t.sol index b3305728d..37ee428e7 100644 --- a/contracts/test/LightClientBenchmark.t.sol +++ b/contracts/test/LightClientBenchmark.t.sol @@ -29,8 +29,8 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[4] = vm.toString(uint64(3)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, ) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); vm.prank(permissionedProver); vm.resumeGasMetering(); lc.newFinalizedState(states[0], proofs[0]); diff --git a/hotshot-state-prover/src/circuit.rs b/hotshot-state-prover/src/circuit.rs index 7fb3907e7..5afc76841 100644 --- a/hotshot-state-prover/src/circuit.rs +++ b/hotshot-state-prover/src/circuit.rs @@ -2,9 +2,10 @@ use ark_ec::twisted_edwards::TECurveConfig; use ark_ff::PrimeField; +use ark_bn254::Fr; use ark_std::borrow::Borrow; use ethers::types::U256; -use hotshot_types::light_client::{GenericLightClientState, GenericPublicInput}; +use hotshot_types::light_client::{GenericLightClientState, GenericPublicInput, GenericStakeState, StakeState}; use jf_plonk::PlonkError; use jf_relation::{BoolVar, Circuit, CircuitError, PlonkCircuit, Variable}; use jf_rescue::{gadgets::RescueNativeGadget, RescueParameter}; @@ -249,12 +250,15 @@ where let view_number_f = F::from(lightclient_state.view_number as u64); let block_height_f = F::from(lightclient_state.block_height as u64); let public_inputs = vec![ - threshold, view_number_f, block_height_f, lightclient_state.block_comm_root, ]; + let stake_state = vec![ + threshold + ]; + // Checking whether the accumulated weight exceeds the quorum threshold let mut signed_amount_var = (0..stake_table_capacity / 2) .map(|i| { @@ -352,6 +356,14 @@ where block_height: 0, block_comm_root: F::default(), }; + + let stake_state = GenericStakeState { + threshold: F::default(), + stake_table_bls_key_comm: F::default(), + stake_table_schnorr_key_comm: F::default(), + stake_table_amount_comm: F::default(), + }; + build::( &[], &[], @@ -365,8 +377,9 @@ where #[cfg(test)] mod tests { use ark_ed_on_bn254::EdwardsConfig as Config; - use ethers::types::U256; - use hotshot_types::traits::stake_table::{SnapshotVersion, StakeTableScheme}; + use ethers::{core::k256::schnorr, types::U256}; + use hotshot_contract_adapter::jellyfish::u256_to_field; + use hotshot_types::{light_client::GenericStakeState, traits::stake_table::{SnapshotVersion, StakeTableScheme}}; use jf_crhf::CRHF; use jf_relation::Circuit; use jf_rescue::crhf::VariableLengthRescueCRHF; @@ -407,6 +420,13 @@ mod tests { block_comm_root, }; let state_msg: [F; 3] = lightclient_state.clone().into(); + let (bls_comm, schnorr_comm, amount_comm) = st.commitment(SnapshotVersion::LastEpochStart).unwrap(); + let stake_state = GenericStakeState{ + threshold: 0, + stake_table_bls_key_comm: bls_comm, + stake_table_schnorr_key_comm: schnorr_comm, + stake_table_amount_comm: amount_comm + }; let sigs = state_keys .iter() diff --git a/hotshot-state-prover/src/mock_ledger.rs b/hotshot-state-prover/src/mock_ledger.rs index b33ffc73f..013efa557 100644 --- a/hotshot-state-prover/src/mock_ledger.rs +++ b/hotshot-state-prover/src/mock_ledger.rs @@ -23,8 +23,7 @@ use hotshot_types::{ light_client::{ GenericLightClientState, GenericPublicInput, GenericStakeState, LightClientState, StakeState, - }, - traits::stake_table::{SnapshotVersion, StakeTableScheme}, + }, stake_table, traits::stake_table::{SnapshotVersion, StakeTableScheme} }; use itertools::izip; use jf_pcs::prelude::UnivariateUniversalParams; @@ -79,6 +78,7 @@ pub struct MockLedger { pub rng: StdRng, epoch: u64, state: GenericLightClientState, + stake_state: GenericStakeState, pub(crate) st: StakeTable, threshold: U256, // quorum threshold for SnapShot::LastEpochStart pub(crate) qc_keys: Vec, @@ -97,9 +97,19 @@ impl MockLedger { key_archive.insert(qc_keys[i], state_keys[i].0.clone()); } let st = stake_table_for_testing(&qc_keys, &state_keys); + let (bls_key_comm, schnorr_key_comm, amount_comm) = + st.commitment(SnapshotVersion::LastEpochStart).unwrap(); + let threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart).unwrap()); + let stake_table = StakeState { + threshold: u256_to_field(threshold), + stake_table_bls_key_comm: bls_key_comm, + stake_table_schnorr_key_comm: schnorr_key_comm, + stake_table_amount_comm: amount_comm, + }; + // arbitrary commitment values as they don't affect logic being tested let block_comm_root = F::from(1234); // let fee_ledger_comm: ark_ff::Fp, 4> = F::from(5678); @@ -111,11 +121,13 @@ impl MockLedger { // fee_ledger_comm, // stake_table_comm: st.commitment(SnapshotVersion::LastEpochStart).unwrap(), }; + Self { pp, rng, epoch: 0, state: genesis, + stake_state: stake_table, st, threshold, qc_keys, @@ -296,14 +308,15 @@ impl MockLedger { stake_table_schnorr_key_comm: stake_table_comm.clone().1, stake_table_amount_comm: stake_table_comm.clone().2, }; - + println!("{:?}", pi); + panic!("here"); (pi, proof, stt) } /// a malicious attack, generating a fake stake table full of adversarial stakers /// adv-controlled stakers signed the state and replace the stake table commitment with that of the fake one /// in an attempt to hijack the correct stake table. - pub fn gen_state_proof_with_fake_stakers(&mut self) -> (GenericPublicInput, Proof) { + pub fn gen_state_proof_with_fake_stakers(&mut self) -> (GenericPublicInput, Proof, GenericStakeState) { let new_state = self.state.clone(); let (adv_qc_keys, adv_state_keys) = @@ -355,8 +368,17 @@ impl MockLedger { STAKE_TABLE_CAPACITY, ) .expect("Fail to generate state proof"); + + let (bls_key_comm, schnorr_key_comm, amount_comm) = adv_st.commitment(SnapshotVersion::LastEpochStart).unwrap(); + let stake_table = StakeState { + threshold: u256_to_field(self.threshold), + stake_table_bls_key_comm: bls_key_comm, + stake_table_schnorr_key_comm: schnorr_key_comm, + stake_table_amount_comm: amount_comm, + }; + - (pi, proof) + (pi, proof, stake_table) } /// Returns the `LightClientState` for solidity pub fn get_state(&self) -> ParsedLightClientState { From 6daee0ef8b269a85429f0b5365121f561834d401 Mon Sep 17 00:00:00 2001 From: Alysia Huggins Date: Wed, 4 Sep 2024 20:55:15 -0400 Subject: [PATCH 07/27] in the process of updating the circuit, ledger and snark code to include the new stake state struct, not all tests pass and the proofs need to be assessed more carefully --- contracts/rust/diff-test/src/main.rs | 10 +-- .../LightClientCallNewFinalizedState.s.sol | 2 +- contracts/test/LightClient.t.sol | 32 ++++--- contracts/test/LightClientBenchmark.t.sol | 2 +- hotshot-state-prover/src/circuit.rs | 88 +++++++------------ hotshot-state-prover/src/mock_ledger.rs | 47 +++++----- hotshot-state-prover/src/service.rs | 29 ++---- hotshot-state-prover/src/snark.rs | 3 +- sequencer/src/api.rs | 6 +- sequencer/src/state_signature.rs | 4 +- utils/src/deployer.rs | 1 + 11 files changed, 101 insertions(+), 123 deletions(-) diff --git a/contracts/rust/diff-test/src/main.rs b/contracts/rust/diff-test/src/main.rs index 421ca5947..d753fa90c 100644 --- a/contracts/rust/diff-test/src/main.rs +++ b/contracts/rust/diff-test/src/main.rs @@ -496,7 +496,7 @@ fn main() { let mut new_states: Vec = vec![]; let mut proofs: Vec = vec![]; let mut stake_stakes: Vec = vec![]; - + for i in 1..block_per_epoch + 2 { // only update stake table at the last block, as it would only take effect in next epoch anyway. if i == block_per_epoch { @@ -523,7 +523,7 @@ fn main() { schnorr_key_comm: field_to_u256(stt.stake_table_schnorr_key_comm), amount_comm: field_to_u256(stt.stake_table_amount_comm), }; - stake_stakes.push(parsed_stake_state.into()); + stake_stakes.push(parsed_stake_state); } let res = (new_states, proofs, stake_stakes); @@ -551,7 +551,7 @@ fn main() { } let res = if require_valid_proof { - let (pi, proof, stt) = ledger.gen_state_proof(); + let (pi, proof, _) = ledger.gen_state_proof(); let pi_parsed: ParsedLightClientState = pi.into(); let proof_parsed: ParsedPlonkProof = proof.into(); (pi_parsed, proof_parsed) @@ -573,7 +573,7 @@ fn main() { ledger.elapse_with_block(); // first block in epoch 1 - let (pi, proof, stt) = ledger.gen_state_proof(); + let (pi, proof, _) = ledger.gen_state_proof(); new_states.push(pi.into()); proofs.push(proof.into()); @@ -594,7 +594,7 @@ fn main() { let mut ledger = MockLedger::init(pp, STAKE_TABLE_CAPACITY / 2); ledger.elapse_with_block(); - let (pi, proof, stt) = ledger.gen_state_proof_with_fake_stakers(); + let (pi, proof, _) = ledger.gen_state_proof_with_fake_stakers(); let new_state: ParsedLightClientState = pi.into(); let proof: ParsedPlonkProof = proof.into(); diff --git a/contracts/script/LightClientCallNewFinalizedState.s.sol b/contracts/script/LightClientCallNewFinalizedState.s.sol index 5a664879c..e8316d1a4 100644 --- a/contracts/script/LightClientCallNewFinalizedState.s.sol +++ b/contracts/script/LightClientCallNewFinalizedState.s.sol @@ -24,7 +24,7 @@ contract CallNewFinalizedState is Script { cmds[4] = vm.toString(numExits); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, ) = + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); address admin; diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol index 56442640c..6cc79aee7 100644 --- a/contracts/test/LightClient.t.sol +++ b/contracts/test/LightClient.t.sol @@ -163,8 +163,11 @@ contract LightClient_permissionedProver_Test is LightClientCommonTest { cmds[4] = vm.toString(uint64(1)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, LC.StakeState[] memory stakeStates) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + ( + LC.LightClientState[] memory states, + V.PlonkProof[] memory proofs, + LC.StakeState[] memory stakeStates + ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); newState = states[0]; newProof = proofs[0]; @@ -311,7 +314,7 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[4] = vm.toString(uint64(3)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, ) = + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); vm.expectEmit(true, true, true, true); @@ -358,8 +361,11 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[4] = vm.toString(numExits); result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, LC.StakeState[] memory stakeStates) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + ( + LC.LightClientState[] memory states, + V.PlonkProof[] memory proofs, + LC.StakeState[] memory stakeStates + ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); uint256 statesLen = states.length; @@ -580,8 +586,11 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { assertGe(lc.stateHistoryRetentionPeriod(), 1 days); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, LC.StakeState[] memory stakeStates) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + ( + LC.LightClientState[] memory states, + V.PlonkProof[] memory proofs, + LC.StakeState[] memory stakeStates + ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); newState = states[1]; newProof = proofs[1]; @@ -638,7 +647,7 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { assertInitialStateHistoryConditions(); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, ) = + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); // Add one numDays worth of a new state @@ -708,7 +717,7 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { uint32 numDays = 2; bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, ) = + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); assertInitialStateHistoryConditions(); @@ -1159,8 +1168,7 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { cmds[4] = vm.toString(uint64(1)); bytes memory result = vm.ffi(cmds); - assertEq(result, '0xddaf'); - (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs, ) = + (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs,) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); newState = _states[1]; @@ -1198,7 +1206,7 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { cmds[4] = vm.toString(uint64(1)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs, ) = + (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs,) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); uint256 statesCount = _states.length - 1; diff --git a/contracts/test/LightClientBenchmark.t.sol b/contracts/test/LightClientBenchmark.t.sol index 37ee428e7..c423b5584 100644 --- a/contracts/test/LightClientBenchmark.t.sol +++ b/contracts/test/LightClientBenchmark.t.sol @@ -29,7 +29,7 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[4] = vm.toString(uint64(3)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, ) = + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); vm.prank(permissionedProver); vm.resumeGasMetering(); diff --git a/hotshot-state-prover/src/circuit.rs b/hotshot-state-prover/src/circuit.rs index 5afc76841..a1cfb0e5c 100644 --- a/hotshot-state-prover/src/circuit.rs +++ b/hotshot-state-prover/src/circuit.rs @@ -2,10 +2,9 @@ use ark_ec::twisted_edwards::TECurveConfig; use ark_ff::PrimeField; -use ark_bn254::Fr; use ark_std::borrow::Borrow; use ethers::types::U256; -use hotshot_types::light_client::{GenericLightClientState, GenericPublicInput, GenericStakeState, StakeState}; +use hotshot_types::light_client::{GenericLightClientState, GenericPublicInput}; use jf_plonk::PlonkError; use jf_relation::{BoolVar, Circuit, CircuitError, PlonkCircuit, Variable}; use jf_rescue::{gadgets::RescueNativeGadget, RescueParameter}; @@ -91,21 +90,21 @@ impl LightClientStateVar { self.vars[2] } - /// Returns the commitment of the fee ledger - #[must_use] - pub fn fee_ledger_comm(&self) -> Variable { - self.vars[3] - } - - /// Returns the commitment of the associated stake table - #[must_use] - pub fn stake_table_comm(&self) -> StakeTableCommVar { - StakeTableCommVar { - qc_keys_comm: self.vars[4], - state_keys_comm: self.vars[5], - stake_amount_comm: self.vars[6], - } - } + // /// Returns the commitment of the fee ledger + // #[must_use] + // pub fn fee_ledger_comm(&self) -> Variable { + // self.vars[3] + // } + + // /// Returns the commitment of the associated stake table + // #[must_use] + // pub fn stake_table_comm(&self) -> StakeTableCommVar { + // StakeTableCommVar { + // qc_keys_comm: self.vars[4], + // state_keys_comm: self.vars[5], + // stake_amount_comm: self.vars[6], + // } + // } } impl AsRef<[Variable]> for LightClientStateVar { @@ -255,10 +254,6 @@ where lightclient_state.block_comm_root, ]; - let stake_state = vec![ - threshold - ]; - // Checking whether the accumulated weight exceeds the quorum threshold let mut signed_amount_var = (0..stake_table_capacity / 2) .map(|i| { @@ -288,32 +283,32 @@ where .iter() .flat_map(|var| [var.state_ver_key.0.get_x(), var.state_ver_key.0.get_y()]) .collect::>(); - let state_ver_key_comm = RescueNativeGadget::::rescue_sponge_with_padding( + let _state_ver_key_comm = RescueNativeGadget::::rescue_sponge_with_padding( &mut circuit, &state_ver_key_preimage_vars, 1, )?[0]; - circuit.enforce_equal( - state_ver_key_comm, - lightclient_state_pub_var.stake_table_comm().state_keys_comm, - )?; + // circuit.enforce_equal( + // state_ver_key_comm, + // lightclient_state_pub_var.stake_table_comm().state_keys_comm, + // )?; // checking the commitment for the list of stake amounts let stake_amount_preimage_vars = stake_table_var .iter() .map(|var| var.stake_amount) .collect::>(); - let stake_amount_comm = RescueNativeGadget::::rescue_sponge_with_padding( + let _stake_amount_comm = RescueNativeGadget::::rescue_sponge_with_padding( &mut circuit, &stake_amount_preimage_vars, 1, )?[0]; - circuit.enforce_equal( - stake_amount_comm, - lightclient_state_pub_var - .stake_table_comm() - .stake_amount_comm, - )?; + // circuit.enforce_equal( + // stake_amount_comm, + // lightclient_state_pub_var + // .stake_table_comm() + // .stake_amount_comm, + // )?; // checking all signatures let verification_result_vars = stake_table_var @@ -357,13 +352,6 @@ where block_comm_root: F::default(), }; - let stake_state = GenericStakeState { - threshold: F::default(), - stake_table_bls_key_comm: F::default(), - stake_table_schnorr_key_comm: F::default(), - stake_table_amount_comm: F::default(), - }; - build::( &[], &[], @@ -377,9 +365,8 @@ where #[cfg(test)] mod tests { use ark_ed_on_bn254::EdwardsConfig as Config; - use ethers::{core::k256::schnorr, types::U256}; - use hotshot_contract_adapter::jellyfish::u256_to_field; - use hotshot_types::{light_client::GenericStakeState, traits::stake_table::{SnapshotVersion, StakeTableScheme}}; + use ethers::types::U256; + use hotshot_types::traits::stake_table::{SnapshotVersion, StakeTableScheme}; use jf_crhf::CRHF; use jf_relation::Circuit; use jf_rescue::crhf::VariableLengthRescueCRHF; @@ -420,13 +407,6 @@ mod tests { block_comm_root, }; let state_msg: [F; 3] = lightclient_state.clone().into(); - let (bls_comm, schnorr_comm, amount_comm) = st.commitment(SnapshotVersion::LastEpochStart).unwrap(); - let stake_state = GenericStakeState{ - threshold: 0, - stake_table_bls_key_comm: bls_comm, - stake_table_schnorr_key_comm: schnorr_comm, - stake_table_amount_comm: amount_comm - }; let sigs = state_keys .iter() @@ -530,8 +510,8 @@ mod tests { .is_err()); // bad path: bad stake table commitment - let mut bad_lightclient_state = lightclient_state.clone(); - bad_lightclient_state.stake_table_comm.1 = F::default(); + let bad_lightclient_state = lightclient_state.clone(); + // bad_lightclient_state.stake_table_comm.1 = F::default(); let bad_state_msg: [F; 3] = bad_lightclient_state.clone().into(); let sig_for_bad_state = state_keys .iter() @@ -554,9 +534,9 @@ mod tests { .is_err()); // bad path: incorrect signatures - let mut wrong_light_client_state = lightclient_state.clone(); + let wrong_light_client_state = lightclient_state.clone(); // state with a different qc key commitment - wrong_light_client_state.stake_table_comm.0 = F::default(); + // wrong_light_client_state.stake_table_comm.0 = F::default(); let wrong_state_msg: [F; 3] = wrong_light_client_state.into(); let wrong_sigs = state_keys .iter() diff --git a/hotshot-state-prover/src/mock_ledger.rs b/hotshot-state-prover/src/mock_ledger.rs index 013efa557..27734565e 100644 --- a/hotshot-state-prover/src/mock_ledger.rs +++ b/hotshot-state-prover/src/mock_ledger.rs @@ -23,7 +23,8 @@ use hotshot_types::{ light_client::{ GenericLightClientState, GenericPublicInput, GenericStakeState, LightClientState, StakeState, - }, stake_table, traits::stake_table::{SnapshotVersion, StakeTableScheme} + }, + traits::stake_table::{SnapshotVersion, StakeTableScheme}, }; use itertools::izip; use jf_pcs::prelude::UnivariateUniversalParams; @@ -78,7 +79,7 @@ pub struct MockLedger { pub rng: StdRng, epoch: u64, state: GenericLightClientState, - stake_state: GenericStakeState, + // stake_state: GenericStakeState, pub(crate) st: StakeTable, threshold: U256, // quorum threshold for SnapShot::LastEpochStart pub(crate) qc_keys: Vec, @@ -97,18 +98,18 @@ impl MockLedger { key_archive.insert(qc_keys[i], state_keys[i].0.clone()); } let st = stake_table_for_testing(&qc_keys, &state_keys); - let (bls_key_comm, schnorr_key_comm, amount_comm) = - st.commitment(SnapshotVersion::LastEpochStart).unwrap(); + // let (bls_key_comm, schnorr_key_comm, amount_comm) = + // st.commitment(SnapshotVersion::LastEpochStart).unwrap(); let threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart).unwrap()); - let stake_table = StakeState { - threshold: u256_to_field(threshold), - stake_table_bls_key_comm: bls_key_comm, - stake_table_schnorr_key_comm: schnorr_key_comm, - stake_table_amount_comm: amount_comm, - }; + // let stake_state = StakeState { + // threshold: u256_to_field(threshold), + // stake_table_bls_key_comm: bls_key_comm, + // stake_table_schnorr_key_comm: schnorr_key_comm, + // stake_table_amount_comm: amount_comm, + // }; // arbitrary commitment values as they don't affect logic being tested let block_comm_root = F::from(1234); @@ -127,7 +128,7 @@ impl MockLedger { rng, epoch: 0, state: genesis, - stake_state: stake_table, + // stake_state, st, threshold, qc_keys, @@ -304,19 +305,19 @@ impl MockLedger { .unwrap(); let stt = StakeState { threshold: u256_to_field(self.threshold), - stake_table_bls_key_comm: stake_table_comm.clone().0, - stake_table_schnorr_key_comm: stake_table_comm.clone().1, - stake_table_amount_comm: stake_table_comm.clone().2, + stake_table_bls_key_comm: stake_table_comm.0, + stake_table_schnorr_key_comm: stake_table_comm.1, + stake_table_amount_comm: stake_table_comm.2, }; - println!("{:?}", pi); - panic!("here"); (pi, proof, stt) } /// a malicious attack, generating a fake stake table full of adversarial stakers /// adv-controlled stakers signed the state and replace the stake table commitment with that of the fake one /// in an attempt to hijack the correct stake table. - pub fn gen_state_proof_with_fake_stakers(&mut self) -> (GenericPublicInput, Proof, GenericStakeState) { + pub fn gen_state_proof_with_fake_stakers( + &mut self, + ) -> (GenericPublicInput, Proof, GenericStakeState) { let new_state = self.state.clone(); let (adv_qc_keys, adv_state_keys) = @@ -368,8 +369,9 @@ impl MockLedger { STAKE_TABLE_CAPACITY, ) .expect("Fail to generate state proof"); - - let (bls_key_comm, schnorr_key_comm, amount_comm) = adv_st.commitment(SnapshotVersion::LastEpochStart).unwrap(); + + let (bls_key_comm, schnorr_key_comm, amount_comm) = + adv_st.commitment(SnapshotVersion::LastEpochStart).unwrap(); let stake_table = StakeState { threshold: u256_to_field(self.threshold), stake_table_bls_key_comm: bls_key_comm, @@ -377,7 +379,6 @@ impl MockLedger { stake_table_amount_comm: amount_comm, }; - (pi, proof, stake_table) } /// Returns the `LightClientState` for solidity @@ -423,11 +424,7 @@ impl MockLedger { amount_comm: field_to_u256(amount_comm), }; - ( - voting_st_comm.into(), - frozen_st_comm.into(), - stake_table.into(), - ) + (voting_st_comm.into(), frozen_st_comm.into(), stake_table) } // return a dummy commitment value diff --git a/hotshot-state-prover/src/service.rs b/hotshot-state-prover/src/service.rs index 3def06ec2..edd649b93 100644 --- a/hotshot-state-prover/src/service.rs +++ b/hotshot-state-prover/src/service.rs @@ -217,10 +217,10 @@ pub fn light_client_genesis_stake_from_stake_table( let (bls_comm, schnorr_comm, stake_comm) = st .commitment(SnapshotVersion::LastEpochStart) .expect("Commitment computation shouldn't fail."); - let threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart)?); + let honest_threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart)?); let stt = ParsedStakeState { - threshold: threshold, + threshold: honest_threshold, bls_key_comm: field_to_u256(bls_comm), schnorr_key_comm: field_to_u256(schnorr_comm), amount_comm: field_to_u256(stake_comm), @@ -562,10 +562,7 @@ mod test { use anyhow::Result; use ark_ed_on_bn254::EdwardsConfig; - use ethers::{ - abi::AbiEncode, - utils::{Anvil, AnvilInstance}, - }; + use ethers::utils::{Anvil, AnvilInstance}; use hotshot_contract_adapter::light_client::{LightClientConstructorArgs, ParsedStakeState}; use hotshot_stake_table::vec_based::StakeTable; use hotshot_types::light_client::StateSignKey; @@ -597,22 +594,14 @@ mod test { let ledger = MockLedger::init(pp, NUM_INIT_VALIDATORS as usize); let genesis = ledger.get_state(); - let stake_genesis: ParsedStakeState = ParsedStakeState { - threshold: genesis.threshold, - bls_key_comm: genesis.bls_key_comm, - schnorr_key_comm: genesis.schnorr_key_comm, - amount_comm: genesis.amount_comm, - }; + let (_, _, stake_genesis) = ledger.get_stake_table_comms(); + let qc_keys = ledger.qc_keys; let state_keys = ledger.state_keys; let st = ledger.st; eprintln!( - "Genesis: view_num: {}, block_height: {}, block_comm_root: {}, fee_ledger_comm: {}\ - bls_key_comm: {:x?},\ - schnorr_key_comm: {:x?},\ - amount_comm: {:x?},\ - threshold: {}", + "Genesis: view_num: {}, block_height: {}, block_comm_root: {}", genesis.view_num, genesis.block_height, genesis.block_comm_root, ); (genesis, stake_genesis, qc_keys, state_keys, st) @@ -620,8 +609,8 @@ mod test { // everybody signs, then generate a proof fn gen_state_proof( - old_state: &ParsedLightClientState, new_state: ParsedLightClientState, + genesis_stake_state: &ParsedStakeState, state_keypairs: &[(StateSignKey, StateVerKey)], st: &StakeTable, ) -> (PublicInput, Proof) { @@ -668,7 +657,7 @@ mod test { &bit_vec, &sigs, &new_state.into(), - &old_state.threshold, + &genesis_stake_state.threshold, STAKE_TABLE_CAPACITY_FOR_TEST, ) .expect("Fail to generate state proof"); @@ -781,7 +770,7 @@ mod test { new_state.view_num = 5; new_state.block_height = 1; - let (pi, proof) = gen_state_proof(&genesis, new_state.clone(), &state_keys, &st); + let (pi, proof) = gen_state_proof(new_state.clone(), &stake_genesis, &state_keys, &st); tracing::info!("Successfully generated proof for new state."); super::submit_state_and_proof( diff --git a/hotshot-state-prover/src/snark.rs b/hotshot-state-prover/src/snark.rs index 89c60922f..54f0c13a8 100644 --- a/hotshot-state-prover/src/snark.rs +++ b/hotshot-state-prover/src/snark.rs @@ -84,6 +84,7 @@ where CircuitField::from(0u64) } }); + let (circuit, public_inputs) = crate::circuit::build( stake_table_entries, signer_bit_vec, @@ -205,7 +206,7 @@ mod tests { CircuitField::from(2u32), ]) .unwrap()[0]; - let fee_ledger_comm = VariableLengthRescueCRHF::::evaluate(vec![ + let _fee_ledger_comm = VariableLengthRescueCRHF::::evaluate(vec![ CircuitField::from(3u32), CircuitField::from(5u32), ]) diff --git a/sequencer/src/api.rs b/sequencer/src/api.rs index 4dedce900..854461808 100644 --- a/sequencer/src/api.rs +++ b/sequencer/src/api.rs @@ -22,7 +22,9 @@ use hotshot_events_service::events_source::{ }; use hotshot_orchestrator::config::NetworkConfig; use hotshot_query_service::data_source::ExtensibleDataSource; -use hotshot_state_prover::service::light_client_genesis_from_stake_table; +use hotshot_state_prover::service::{ + light_client_genesis_from_stake_table, light_client_genesis_stake_from_stake_table, +}; use hotshot_types::{ data::ViewNumber, light_client::StateSignatureRequestBody, @@ -382,7 +384,7 @@ pub mod test_helpers { stream::StreamExt, }; use hotshot::types::{Event, EventType}; - use hotshot_contract_adapter::light_client::ParsedLightClientState; + use hotshot_contract_adapter::light_client::{ParsedLightClientState, ParsedStakeState}; use hotshot_types::{ event::LeafInfo, traits::{metrics::NoMetrics, node_implementation::ConsensusTime}, diff --git a/sequencer/src/state_signature.rs b/sequencer/src/state_signature.rs index 997366526..ed81f61da 100644 --- a/sequencer/src/state_signature.rs +++ b/sequencer/src/state_signature.rs @@ -111,7 +111,7 @@ impl StateSigner { /// Sign the light client state at given height and store it. async fn sign_new_state(&self, state: &LightClientState) -> StateSignature { - let msg: [CircuitField; 7] = state.into(); + let msg: [CircuitField; 3] = state.into(); let signature = StateSignatureScheme::sign( &(), self.key_pair.sign_key_ref(), @@ -148,7 +148,7 @@ fn hash_bytes_to_field(bytes: &[u8]) -> Result { fn form_light_client_state( leaf: &Leaf, - stake_table_comm: &StakeTableCommitmentType, + _stake_table_comm: &StakeTableCommitmentType, ) -> anyhow::Result { let header = leaf.block_header(); let mut block_comm_root_bytes = vec![]; diff --git a/utils/src/deployer.rs b/utils/src/deployer.rs index 948f11100..aa0c301c5 100644 --- a/utils/src/deployer.rs +++ b/utils/src/deployer.rs @@ -304,6 +304,7 @@ pub async fn deploy_mock_light_client_contract( Ok(contract.address()) } +#[allow(clippy::too_many_arguments)] pub async fn deploy( l1url: Url, mnemonic: String, From 3f4417012c9b75e967b24de3ae35b02b9c7f504b Mon Sep 17 00:00:00 2001 From: Alysia Huggins Date: Wed, 4 Sep 2024 21:25:43 -0400 Subject: [PATCH 08/27] remove states mapping as it is no longer used --- .../artifacts/LightClientMock_bytecode.json | 2 +- .../artifacts/LightClient_bytecode.json | 2 +- contract-bindings/src/light_client.rs | 94 ------------------- contract-bindings/src/light_client_mock.rs | 94 ------------------- contracts/src/LightClient.sol | 3 - 5 files changed, 2 insertions(+), 193 deletions(-) diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json index c2f3e7b91..064dd8a2d 100644 --- a/contract-bindings/artifacts/LightClientMock_bytecode.json +++ b/contract-bindings/artifacts/LightClientMock_bytecode.json @@ -1 +1 @@ -"0x60a034620004be576001600160401b0390601f6200328c38819003918201601f191683019184831184841017620004115780849260409485528339810103916101008312620004be5760608312620004be578151936200005f85620004c3565b6200006a82620004df565b85526020906200007c828401620004df565b95828101968752848401519085810191825260808097605f190112620004be578551948786018681108582111762000411578752606081015186528781015198858701998a5260a08201519288880193845260e060c08401519360608a0194855201519363ffffffff918286168603620004be57308c527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054808d1c60ff16620004ad57808a80809316036200046d575b50825116158015915062000460575b801562000456575b80156200044c575b801562000442575b801562000438575b620004275787905116906009549568010000000000000000600160801b039d8e8d8751901b16808560018060801b0319809b16171760095589519182600a558d5160055551938460065551978860075551948560085589600b54161717600b55600c55600d549063ffffffff60a81b9060a81b169063ffffffff60a81b1916179182600d558b51958a87019283528c8701526060860152606085528b85019480861089871117620004115788958c52519020600099818b55519081600155600255600355600f54918215159283620003a2575b5050506200032a575b5116915186519287840184811086821117620003165788528352848301528551976200026589620004c3565b8343168952848901918442168352878a01938452600f54680100000000000000008110156200031657806001620002a09201600f55620004f4565b9790976200030257508460029798999a51169088549260018060401b03199483868616178b55518b1b169216171786556001860191519283511690825416179055015191015551612d6191826200052b833951818181610c600152610db80152f35b634e487b7160e01b81526004819052602490fd5b634e487b7160e01b88526041600452602488fd5b906200033a90600e5416620004f4565b6200038e57600281888093558260018201550155600e548481168581146200037a5760010185166001600160401b03199190911617600e55839062000239565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b87526004879052602487fd5b9193945091506000198101908111620003fd57620003c18791620004f4565b50548a1c1686620003d681600e5416620004f4565b50548b1c16900391868311620003fd5786939291849160a81c169116101538808062000230565b634e487b7160e01b89526011600452602489fd5b634e487b7160e01b600052604160045260246000fd5b8a516350dd03f760e11b8152600490fd5b508951156200015d565b5084511562000155565b508151156200014d565b508c511562000145565b508784511615156200013d565b6001600160401b0319161790558a518881527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2908a90a13888816200012e565b8c5163f92ee8a960e01b8152600490fd5b600080fd5b606081019081106001600160401b038211176200041157604052565b51906001600160401b0382168203620004be57565b600f548110156200051457600f6000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461025757806302b592f3146102525780630c693a221461024d5780630d8e6e2c146102485780632063d4f7146102435780632d52aad61461023e5780632f5f4600146102395780632f79889d14610234578063313df7b11461022f578063382b215a1461022a5780634847ae5d146102255780634f1ef2861461022057806352d1902d1461021b578063628277331461021657806369cc6a04146102115780636f96bdae1461020c578063715018a61461020757806376b6b7cb146102025780637f17baad146101fd57806382d07ff3146101f85780638584d23f146101f35780638da5cb5b146101ee57806396c1ca61146101e95780639baa3cc9146101e45780639fdb54a7146101df578063a9a9c9f5146101da578063ad3cb1cc146101d5578063b5adea3c146101d0578063bd32519a146101cb578063c23b9e9e146101c6578063c8e5e498146101c1578063ca6fe855146101bc578063d24d933d146101b7578063e0303301146101b2578063f2fde38b146101ad5763f9e50d19146101a857600080fd5b61161d565b6115f4565b6114c4565b611489565b61146b565b61144e565b611427565b611401565b6113a8565b61132b565b6112f4565b6112b9565b61116c565b6110e7565b6110b1565b611074565b61101d565b610fbf565b610f7b565b610f10565b610ec5565b610e2e565b610e10565b610da5565b610be6565b610b4a565b610b2c565b610b03565b610adc565b6109f2565b6109b5565b61085d565b6105ad565b61052d565b6104b7565b61028e565b600435906001600160a01b038216820361027257565b600080fd5b61010435906001600160a01b038216820361027257565b34610272576020366003190112610272576102a761025c565b6102af611d2b565b6001600160a01b0390811690811561033f57600d54908116821461032d5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600d8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600f548110156103a257600390600f600052027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020190600090565b610351565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b038211176103d857604052565b6103a7565b608081019081106001600160401b038211176103d857604052565b606081019081106001600160401b038211176103d857604052565b90601f801991011681019081106001600160401b038211176103d857604052565b604051906102e082018281106001600160401b038211176103d857604052565b60405190610461826103bd565b565b60405190610461826103f8565b6040519061028082018281106001600160401b038211176103d857604052565b9060405161049d816103bd565b6020600182946001600160401b0381541684520154910152565b3461027257602036600319011261027257600435600f54811015610272576104e0608091610367565b5061052b8154916104fb60016001600160401b039201610490565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610272576000806003193601126105aa5760809060409060608251610552816103dd565b82815282602082015282848201520152805161056d816103dd565b6005549182825260065460208301908152600754908284019182526060600854940193845282519485525160208501525190830152516060820152f35b80fd5b34610272576000366003190112610272576060604051600181526000602082015260006040820152f35b35906001600160401b038216820361027257565b60609060031901126102725760405190610604826103f8565b816001600160401b03600435818116810361027257825260243590811681036102725760208201526040604435910152565b6040906063190112610272576040519061064f826103bd565b60643582526084356020830152565b60409060a31901126102725760405190610677826103bd565b60a435825260c4356020830152565b60409060e3190112610272576040519061069f826103bd565b60e4358252610104356020830152565b60409061012319011261027257604051906106c9826103bd565b610124358252610144356020830152565b60409061016319011261027257604051906106f4826103bd565b610164358252610184356020830152565b6040906101a3190112610272576040519061071f826103bd565b6101a43582526101c4356020830152565b6040906101e3190112610272576040519061074a826103bd565b6101e4358252610204356020830152565b6040906102231901126102725760405190610775826103bd565b610224358252610244356020830152565b60409061026319011261027257604051906107a0826103bd565b610264358252610284356020830152565b6040906102a319011261027257604051906107cb826103bd565b6102a43582526102c4356020830152565b6040906102e319011261027257604051906107f6826103bd565b6102e4358252610304356020830152565b6040906103231901126102725760405190610821826103bd565b610324358252610344356020830152565b604090610363190112610272576040519061084c826103bd565b610364358252610384356020830152565b34610272576104e036600319011261027257610878366105eb565b610480366063190112610272576109b390610891610434565b9061089b36610636565b82526108a63661065e565b60208301526108b436610686565b60408301526108c2366106af565b60608301526108d0366106da565b60808301526108de36610705565b60a08301526108ec36610730565b60c08301526108fa3661075b565b60e083015261090836610786565b610100830152610917366107b1565b610120830152610926366107dc565b61014083015261093536610807565b61016083015261094436610832565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c083015261168e565b005b34610272576020366003190112610272576010805460ff19166001179055600435601155005b6001600160401b0381116103d85760051b60200190565b346102725760208060031936011261027257600435906001600160401b038211610272573660238301121561027257816004013591610a30836109db565b91604093610a4085519485610413565b80845260248285019160071b8401019236841161027257602401905b838210610a6c576109b3856118ee565b813603608081126102725786805191610a84836103f8565b610a8d856105d7565b8352610a9a8686016105d7565b83870152603f1901126102725760809184918851610ab7816103bd565b610ac28a87016105d7565b815260608601358482015289820152815201910190610a5c565b346102725760003660031901126102725760206001600160401b03600e5416604051908152f35b3461027257600036600319011261027257600d546040516001600160a01b039091168152602090f35b34610272576000366003190112610272576020600254604051908152f35b3461027257600036600319011261027257610b63611998565b50610bc7604051610b73816103f8565b6009546001600160401b0390818116835260401c166020820152600a5460408201526040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b0390f35b6001600160401b0381116103d857601f01601f191660200190565b60408060031936011261027257610bfb61025c565b6024356001600160401b038111610272573660238201121561027257806004013590610c2682610bcb565b91610c3385519384610413565b80835260209136602483830101116102725781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610d89575b50610d78579080600492610c9e611d2b565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610d49575b5050610d0e578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612d158339815191528193929303610d30576109b38383612b79565b8351632a87526960e21b81526004810191909152602490fd5b610d69929350803d10610d71575b610d618183610413565b8101906124c4565b903880610ce8565b503d610d57565b845163703e46dd60e11b8152600490fd5b905081600080516020612d158339815191525416141538610c8c565b34610272576000366003190112610272577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610dfe576020604051600080516020612d158339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610272576000366003190112610272576020600154604051908152f35b34610272576000806003193601126105aa57610e48611d2b565b600d5460ff8160a01c1660001461032d576001600160a81b031916600d557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b60809060631901126102725760405190610ea6826103dd565b6064358252608435602083015260a435604083015260c4356060830152565b34610272576080366003190112610272576020610f08604051610ee7816103dd565b600435815260243583820152604435604082015260643560608201526119e9565b604051908152f35b34610272576000806003193601126105aa57610f2a611d2b565b600080516020612cf583398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610272576000366003190112610272576020600054604051908152f35b6004359063ffffffff8216820361027257565b60e4359063ffffffff8216820361027257565b346102725760203660031901126102725763ffffffff610fdd610f99565b16600090815260046020908152604091829020805460019091015483516001600160401b03808416825292851c9092169282019290925291820152606090f35b3461027257600036600319011261027257611036611998565b50610bc76110426119b7565b6040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b34610272576020366003190112610272576040611092600435611a6a565b61052b82518092602080916001600160401b0381511684520151910152565b3461027257600036600319011261027257600080516020612cf5833981519152546040516001600160a01b039091168152602090f35b3461027257602036600319011261027257611100610f99565b611108611d2b565b63ffffffff808216610e10811091821561115a575b505061114857600d805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600d5460a81c1610159050388061111d565b346102725761012036600319011261027257611187366105eb565b61119036610e8d565b90611199610fac565b6111a1610277565b90600080516020612d3583398151915254936001600160401b0360ff8660401c16159516801590816112b1575b60011490816112a7575b15908161129e575b5061128c57600080516020612d35833981519152805467ffffffffffffffff19166001179055611214938561126757611b2d565b61121a57005b600080516020612d35833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2908060208101610328565b600080516020612d35833981519152805460ff60401b1916600160401b179055611b2d565b60405163f92ee8a960e01b8152600490fd5b905015386111e0565b303b1591506111d8565b8691506111ce565b3461027257600036600319011261027257600b54600c54604080516001600160401b03808516825293821c9093166020840152820152606090f35b3461027257600036600319011261027257608060055460065460075460085491604051938452602084015260408301526060820152f35b3461027257600036600319011261027257604080519061134a826103bd565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106113955784604081866000838284010152601f80199101168101030190f35b8581018301518582018301528201611373565b346102725760603660031901126102725760406113c4366105eb565b6001600160401b03815116600b549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600b550151600c55600080f35b3461027257600036600319011261027257602060ff600d5460a01c166040519015158152f35b3461027257600036600319011261027257602063ffffffff600d5460a81c16604051908152f35b34610272576000366003190112610272576010805460ff19169055005b34610272576000366003190112610272576020600354604051908152f35b3461027257600036600319011261027257600954600a54604080516001600160401b03808516825293821c9093166020840152820152606090f35b34610272576040366003190112610272576004356024359060ff601054166000906000146115125750906114fe610bc79260115490611a5d565b115b60405190151581529081906020820190565b91600f549143811180156115ea575b6115775761152f8493611a4e565b92611551611545600e546001600160401b031690565b6001600160401b031690565b935b8115611589575b50909192501561157757610bc79261157191611a5d565b11611500565b60405163b0b4387760e01b8152600490fd5b826115a761154561159984610367565b50546001600160401b031690565b11156115d0575b600281106115cb578481146115cb576115c6906124d3565b611553565b61155a565b94505060016115e461154561159987610367565b946115ae565b5060038310611521565b34610272576020366003190112610272576109b361161061025c565b611618611d2b565b611cb7565b34610272576000366003190112610272576020600f54604051908152f35b634e487b7160e01b600052600060045260246000fd5b6040906001600160401b03815116600b549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600b550151600c55565b90600d5460ff8160a01c1690816117c9575b506117b75781516001600160401b03166116cb6115456116be611a21565b516001600160401b031690565b6001600160401b0380921611801590611780575b61176e577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae69061171d60408501936117178551611d64565b85612249565b61172684611651565b6117358482421683431661237b565b61175a602061174b86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b0316816117ae61154560206117a0611a21565b01516001600160401b031690565b911611156116df565b6040516301474c8f60e71b8152600490fd5b6001600160a01b03163314159050386116a0565b634e487b7160e01b600052601160045260246000fd5b9061180a5760028160008093558260018201550155565b61163b565b8051156103a25760200190565b8051600110156103a25760400190565b8051600210156103a25760600190565b8051600310156103a25760800190565b80518210156103a25760209160051b010190565b600f54600160401b8110156103d85780600161187f9201600f55610367565b91909161180a57805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b90600f546000600f558061192b575b5060005b8251811015611926578061192061191a6001938661184c565b51611860565b01611901565b509050565b6003908060030290600382040361199357600f6000527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802908101905b8181106119755750506118fd565b8061198d849260026000918281558260018201550155565b01611967565b6117dd565b604051906119a5826103f8565b60006040838281528260208201520152565b604051906119c4826103f8565b81600b546001600160401b0390818116835260401c1660208201526040600c54910152565b6020810151906060604082015191015160405191602083019384526040830152606082015260608152611a1b816103dd565b51902090565b611a29611998565b50611a326119b7565b90565b60405190611a42826103bd565b60006020838281520152565b60001981019190821161199357565b9190820391821161199357565b611a72611a35565b50600f5490611a88611a8383611a4e565b610367565b5090611aa26115456001809401546001600160401b031690565b811015611b1b57611abe611545600e546001600160401b031690565b838110611ae0575050506001611ad9611a83611a3293611a4e565b5001610490565b81611b0061154585611af185610367565b5001546001600160401b031690565b11611b0c578201611abe565b611a329350611ad99150610367565b604051631856a49960e21b8152600490fd5b919092611b4490611b3c612c20565b611618612c20565b611b4c612c20565b6001600160401b039081611b6784516001600160401b031690565b1615801590611c98575b8015611c8c575b8015611c80575b8015611c74575b8015611c6b575b611c595761046193611c28611c4e92611bdd866040906001600160401b038151166009549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176009550151600a55565b8251600555602083015160065560408301516007556060830151600855611c0386611651565b600d805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b611c49611c34826119e9565b91826000555191611c4483600155565b600255565b600355565b80421690431661237b565b6040516350dd03f760e11b8152600490fd5b50835115611b8d565b50606084015115611b86565b50604084015115611b7f565b50602084015115611b78565b50611cb061154560208501516001600160401b031690565b1515611b71565b6001600160a01b03908116908115611d1257600080516020612cf583398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612cf5833981519152546001600160a01b03163303611d4c57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611d8d57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103d85760405260088252610100366020840137565b90816020910312610272575180151581036102725790565b90815180825260208080930193019160005b828110611e37575050505090565b835185529381019392810192600101611e29565b61046090611e6483825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611ec2610100928386019060208091805184520151910152565b60a081015191611ee2610140938487019060208091805184520151910152565b60c082015192611f02610180948588019060208091805184520151910152565b60e083015191611f226101c0938489019060208091805184520151910152565b830151611f3f610200918289019060208091805184520151910152565b61012084015191611f6061024093848a019060208091805184520151910152565b84015192611f7e61028094858a019060208091805184520151910152565b611fb961016086015196611fa26102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b939290612235610461936104e0926122266102606109609280518b52602081015160208c0152612062604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c01526122108b6120ae60a08401516101008093019060208091805184520151910152565b6121e18d6103c060c08601516120d4610140918285019060208091805184520151910152565b6121b460e0880151956120f7610180978887019060208091805184520151910152565b8801516121146101c0918287019060208091805184520151910152565b6121856101208a015193612138610200958689019060208091805184520151910152565b8a015197612156610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611e17565b940190611e4b565b6040513d6000823e3d90fd5b6020906122546125ec565b604061225e611dd2565b9260015461226b8561180f565b5261228061154582516001600160401b031690565b6122898561181c565b526122a0611545868301516001600160401b031690565b6122a98561182c565b5201516122b58361183c565b526122d46040519485938493630c76545d60e21b855260048501612020565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af490811561234557600091612316575b501561230457565b6040516309bde33960e01b8152600490fd5b612338915060203d60201161233e575b6123308183610413565b810190611dff565b386122fc565b503d612326565b61223d565b6001600160401b03918216908216039190821161199357565b6001600160401b038091169081146119935760010190565b90916123ea61046193600f548015159081612450575b506123f4575b60406123ad60208501516001600160401b031690565b9301516123ca6123bb610454565b6001600160401b039095168552565b60208401526123da6123bb610463565b6001600160401b03166020840152565b6040820152611860565b61241261240c611a83600e546001600160401b031690565b906117f3565b61244b61242f61242a600e546001600160401b031690565b612363565b6001600160401b03166001600160401b0319600e541617600e55565b612397565b6124939150612464611a8361247592611a4e565b505460401c6001600160401b031690565b61248d612464611a83600e546001600160401b031690565b9061234a565b6001600160401b036124ba6124b1600d5463ffffffff9060a81c1690565b63ffffffff1690565b9116101538612391565b90816020910312610272575190565b8015611993576000190190565b6124e8610470565b9060008252600060208301526124fc611a35565b6040830152612509611a35565b6060830152612516611a35565b6080830152612523611a35565b60a0830152612530611a35565b60c083015261253d611a35565b60e083015261254a611a35565b610100830152612558611a35565b610120830152612566611a35565b610140830152612574611a35565b610160830152612582611a35565b610180830152612590611a35565b6101a083015261259e611a35565b6101c08301526125ac611a35565b6101e08301526125ba611a35565b6102008301526125c8611a35565b6102208301526125d6611a35565b6102408301526125e4611a35565b610260830152565b6125f46124e0565b906201000082527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab37060206008818501527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b81604086017f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee818151525101527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c81606086017f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d8151525101527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d381608086017f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac88151525101527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea8160a086017f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c8398151525101527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b68160c086017f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce78151525101527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d8160e086017f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a68151525101527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b8161010086017f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f8151525101527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c148161012086017f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e088151525101527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba8161014086017f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e78151525101527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f8161016086017f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba6550228151525101527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e8161018086017f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df28151525101527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b816101a086017f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f78151525101527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc28816101c086017f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec738151525101527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d45690915824816101e086017f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508038151525101527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf8161020086017f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a8151525101527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab8161022086017f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db448151525101527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be18161024086017f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a7581515251015261026084017f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9815152510152565b90813b15612bff57600080516020612d1583398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612be457612be191612c4f565b50565b505034612bed57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612d358339815191525460401c1615612c3d57565b604051631afcd79f60e31b8152600490fd5b600080611a3293602081519101845af43d15612c8d573d91612c7083610bcb565b92612c7e6040519485610413565b83523d6000602085013e612c91565b6060915b90612cb85750805115612ca657805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612ceb575b612cc9575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612cc156fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a0346200057857620032c738819003601f8101601f191683016001600160401b03811184821017620004aa57839282916040528339810103610100811262000578576060811262000578576080604051916200005c836200057d565b620000678462000599565b8352620000776020850162000599565b602084015260408401516040840152605f19011262000578576040519160808301906001600160401b03821184831017620004aa5760e091604052606081015184526080810151602085015260a0810151604085015260c08101516060850152015163ffffffff811681036200057857306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8160401c1662000566576002600160401b03196001600160401b038216016200051a575b505081516001600160401b03161580159062000503575b8015620004f6575b8015620004e9575b8015620004dc575b8015620004d2575b620004c05760018060401b03825116908160085468010000000000000000600160801b03602086015160401b1691829160018060801b031916171760085560408401519182600955855160045560208601519283600555604087015192836006556060880151958660075560018060801b0319600a54161717600a55600b55600c549063ffffffff60a81b9060a81b169063ffffffff60a81b1916179283600c55604051916020830193845260408301526060820152606081526080810181811060018060401b03821117620004aa57604052519020600093818555519081600155600255600355600e5490811515918262000433575b5050620003a4575b602081015160409182015182519290916001600160401b039081169184019081118482101762000390576040528252602082015260405190620002ad826200057d565b6001600160401b03438116835242166020830190815260408301918252600e54909290680100000000000000008110156200039057806001620002f49201600e55620005ae565b9490946200037c575051835492516001600160801b03199093166001600160401b0391821617604093841b6fffffffffffffffff000000000000000016178455905180516001850180546001600160401b0319169190931617909155602001516002929092019190915551612ce29081620005e58239608051818181610c500152610da80152f35b634e487b7160e01b81526004819052602490fd5b634e487b7160e01b85526041600452602485fd5b600d54620003bb906001600160401b0316620005ae565b6200041f5782815560018101839055600201829055600d546001600160401b038082169081146200040b576001600160401b03199091166001919091016001600160401b031617600d556200026a565b634e487b7160e01b84526011600452602484fd5b634e487b7160e01b83526004839052602483fd5b90915060001981019081116200040b576200044e90620005ae565b5054600d546001600160401b0360409290921c821691620004709116620005ae565b505460401c6001600160401b03908116909103919082116200040b5760a81c63ffffffff166001600160401b039091161015388062000262565b634e487b7160e01b600052604160045260246000fd5b6040516350dd03f760e11b8152600490fd5b508251156200016b565b5060608301511562000163565b506040830151156200015b565b5060208301511562000153565b5060208201516001600160401b031615156200014b565b6001600160401b0319166001600160401b039081179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388062000134565b60405163f92ee8a960e01b8152600490fd5b600080fd5b606081019081106001600160401b03821117620004aa57604052565b51906001600160401b03821682036200057857565b600e54811015620005ce57600e6000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461024757806302b592f3146102425780630c693a221461023d5780630d8e6e2c146102385780632063d4f7146102335780632d52aad61461022e5780632f5f4600146102295780632f79889d14610224578063313df7b11461021f578063382b215a1461021a5780634847ae5d146102155780634f1ef2861461021057806352d1902d1461020b578063628277331461020657806369cc6a04146102015780636f96bdae146101fc578063715018a6146101f757806376b6b7cb146101f257806382d07ff3146101ed5780638584d23f146101e85780638da5cb5b146101e357806396c1ca61146101de5780639baa3cc9146101d95780639fdb54a7146101d4578063a9a9c9f5146101cf578063ad3cb1cc146101ca578063b5adea3c146101c5578063bd32519a146101c0578063c23b9e9e146101bb578063c8e5e498146101b6578063ca6fe855146101b1578063d24d933d146101ac578063e0303301146101a7578063f2fde38b146101a25763f9e50d191461019d57600080fd5b61159e565b611575565b611445565b61140a565b6113ec565b6113cf565b6113a8565b611382565b611329565b6112ac565b611275565b61123a565b6110ed565b611066565b61101d565b610fe0565b610f89565b610f6b565b610f00565b610eb5565b610e1e565b610e00565b610d95565b610bd6565b610b3a565b610b1c565b610af3565b610acc565b6109e2565b6109a5565b61084d565b61059d565b61051d565b6104a7565b61027e565b600435906001600160a01b038216820361026257565b600080fd5b61010435906001600160a01b038216820361026257565b346102625760203660031901126102625761029761024c565b61029f611cac565b6001600160a01b0390811690811561032f57600c54908116821461031d5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561039257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b610341565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b038211176103c857604052565b610397565b608081019081106001600160401b038211176103c857604052565b606081019081106001600160401b038211176103c857604052565b90601f801991011681019081106001600160401b038211176103c857604052565b604051906102e082018281106001600160401b038211176103c857604052565b60405190610451826103ad565b565b60405190610451826103e8565b6040519061028082018281106001600160401b038211176103c857604052565b9060405161048d816103ad565b6020600182946001600160401b0381541684520154910152565b3461026257602036600319011261026257600435600e54811015610262576104d0608091610357565b5061051b8154916104eb60016001600160401b039201610480565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b346102625760008060031936011261059a5760809060409060608251610542816103cd565b82815282602082015282848201520152805161055d816103cd565b6004549182825260055460208301908152600654908284019182526060600754940193845282519485525160208501525190830152516060820152f35b80fd5b34610262576000366003190112610262576060604051600181526000602082015260006040820152f35b35906001600160401b038216820361026257565b606090600319011261026257604051906105f4826103e8565b816001600160401b03600435818116810361026257825260243590811681036102625760208201526040604435910152565b6040906063190112610262576040519061063f826103ad565b60643582526084356020830152565b60409060a31901126102625760405190610667826103ad565b60a435825260c4356020830152565b60409060e3190112610262576040519061068f826103ad565b60e4358252610104356020830152565b60409061012319011261026257604051906106b9826103ad565b610124358252610144356020830152565b60409061016319011261026257604051906106e4826103ad565b610164358252610184356020830152565b6040906101a3190112610262576040519061070f826103ad565b6101a43582526101c4356020830152565b6040906101e3190112610262576040519061073a826103ad565b6101e4358252610204356020830152565b6040906102231901126102625760405190610765826103ad565b610224358252610244356020830152565b6040906102631901126102625760405190610790826103ad565b610264358252610284356020830152565b6040906102a319011261026257604051906107bb826103ad565b6102a43582526102c4356020830152565b6040906102e319011261026257604051906107e6826103ad565b6102e4358252610304356020830152565b6040906103231901126102625760405190610811826103ad565b610324358252610344356020830152565b604090610363190112610262576040519061083c826103ad565b610364358252610384356020830152565b34610262576104e036600319011261026257610868366105db565b610480366063190112610262576109a390610881610424565b9061088b36610626565b82526108963661064e565b60208301526108a436610676565b60408301526108b23661069f565b60608301526108c0366106ca565b60808301526108ce366106f5565b60a08301526108dc36610720565b60c08301526108ea3661074b565b60e08301526108f836610776565b610100830152610907366107a1565b610120830152610916366107cc565b610140830152610925366107f7565b61016083015261093436610822565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c083015261160f565b005b3461026257602036600319011261026257600f805460ff19166001179055600435601055005b6001600160401b0381116103c85760051b60200190565b346102625760208060031936011261026257600435906001600160401b038211610262573660238301121561026257816004013591610a20836109cb565b91604093610a3085519485610403565b80845260248285019160071b8401019236841161026257602401905b838210610a5c576109a38561186f565b813603608081126102625786805191610a74836103e8565b610a7d856105c7565b8352610a8a8686016105c7565b83870152603f1901126102625760809184918851610aa7816103ad565b610ab28a87016105c7565b815260608601358482015289820152815201910190610a4c565b346102625760003660031901126102625760206001600160401b03600d5416604051908152f35b3461026257600036600319011261026257600c546040516001600160a01b039091168152602090f35b34610262576000366003190112610262576020600254604051908152f35b3461026257600036600319011261026257610b53611919565b50610bb7604051610b63816103e8565b6008546001600160401b0390818116835260401c16602082015260095460408201526040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b0390f35b6001600160401b0381116103c857601f01601f191660200190565b60408060031936011261026257610beb61024c565b6024356001600160401b038111610262573660238201121561026257806004013590610c1682610bbb565b91610c2385519384610403565b80835260209136602483830101116102625781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610d79575b50610d68579080600492610c8e611cac565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610d39575b5050610cfe578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612c968339815191528193929303610d20576109a38383612afa565b8351632a87526960e21b81526004810191909152602490fd5b610d59929350803d10610d61575b610d518183610403565b810190612445565b903880610cd8565b503d610d47565b845163703e46dd60e11b8152600490fd5b905081600080516020612c968339815191525416141538610c7c565b34610262576000366003190112610262577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610dee576020604051600080516020612c968339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610262576000366003190112610262576020600154604051908152f35b346102625760008060031936011261059a57610e38611cac565b600c5460ff8160a01c1660001461031d576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b60809060631901126102625760405190610e96826103cd565b6064358252608435602083015260a435604083015260c4356060830152565b34610262576080366003190112610262576020610ef8604051610ed7816103cd565b6004358152602435838201526044356040820152606435606082015261196a565b604051908152f35b346102625760008060031936011261059a57610f1a611cac565b600080516020612c7683398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610262576000366003190112610262576020600054604051908152f35b3461026257600036600319011261026257610fa2611919565b50610bb7610fae611938565b6040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b34610262576020366003190112610262576040610ffe6004356119eb565b61051b82518092602080916001600160401b0381511684520151910152565b3461026257600036600319011261026257600080516020612c76833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff8216820361026257565b346102625760203660031901126102625760043563ffffffff80821680830361026257611091611cac565b610e1081109182156110db575b50506110c957600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c1610159050388061109e565b346102625761012036600319011261026257611108366105db565b61111136610e7d565b9061111a611053565b611122610267565b90600080516020612cb683398151915254936001600160401b0360ff8660401c1615951680159081611232575b6001149081611228575b15908161121f575b5061120d57600080516020612cb6833981519152805467ffffffffffffffff1916600117905561119593856111e857611aae565b61119b57005b600080516020612cb6833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2908060208101610318565b600080516020612cb6833981519152805460ff60401b1916600160401b179055611aae565b60405163f92ee8a960e01b8152600490fd5b90501538611161565b303b159150611159565b86915061114f565b3461026257600036600319011261026257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b3461026257600036600319011261026257608060045460055460065460075491604051938452602084015260408301526060820152f35b346102625760003660031901126102625760408051906112cb826103ad565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106113165784604081866000838284010152601f80199101168101030190f35b85810183015185820183015282016112f4565b34610262576060366003190112610262576040611345366105db565b6001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55600080f35b3461026257600036600319011261026257602060ff600c5460a01c166040519015158152f35b3461026257600036600319011261026257602063ffffffff600c5460a81c16604051908152f35b3461026257600036600319011261026257600f805460ff19169055005b34610262576000366003190112610262576020600354604051908152f35b3461026257600036600319011261026257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b34610262576040366003190112610262576004356024359060ff600f541660009060001461149357509061147f610bb792601054906119de565b115b60405190151581529081906020820190565b91600e5491438111801561156b575b6114f8576114b084936119cf565b926114d26114c6600d546001600160401b031690565b6001600160401b031690565b935b811561150a575b5090919250156114f857610bb7926114f2916119de565b11611481565b60405163b0b4387760e01b8152600490fd5b826115286114c661151a84610357565b50546001600160401b031690565b1115611551575b6002811061154c5784811461154c5761154790612454565b6114d4565b6114db565b94505060016115656114c661151a87610357565b9461152f565b50600383106114a2565b34610262576020366003190112610262576109a361159161024c565b611599611cac565b611c38565b34610262576000366003190112610262576020600e54604051908152f35b634e487b7160e01b600052600060045260246000fd5b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c16908161174a575b506117385781516001600160401b031661164c6114c661163f6119a2565b516001600160401b031690565b6001600160401b0380921611801590611701575b6116ef577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae69061169e60408501936116988551611ce5565b856121ca565b6116a7846115d2565b6116b6848242168343166122fc565b6116db60206116cc86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b03168161172f6114c660206117216119a2565b01516001600160401b031690565b91161115611660565b6040516301474c8f60e71b8152600490fd5b6001600160a01b0316331415905038611621565b634e487b7160e01b600052601160045260246000fd5b9061178b5760028160008093558260018201550155565b6115bc565b8051156103925760200190565b8051600110156103925760400190565b8051600210156103925760600190565b8051600310156103925760800190565b80518210156103925760209160051b010190565b600e54600160401b8110156103c8578060016118009201600e55610357565b91909161178b57805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b90600e546000600e55806118ac575b5060005b82518110156118a757806118a161189b600193866117cd565b516117e1565b01611882565b509050565b6003908060030290600382040361191457600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd908101905b8181106118f657505061187e565b8061190e849260026000918281558260018201550155565b016118e8565b61175e565b60405190611926826103e8565b60006040838281528260208201520152565b60405190611945826103e8565b81600a546001600160401b0390818116835260401c1660208201526040600b54910152565b602081015190606060408201519101516040519160208301938452604083015260608201526060815261199c816103cd565b51902090565b6119aa611919565b506119b3611938565b90565b604051906119c3826103ad565b60006020838281520152565b60001981019190821161191457565b9190820391821161191457565b6119f36119b6565b50600e5490611a09611a04836119cf565b610357565b5090611a236114c66001809401546001600160401b031690565b811015611a9c57611a3f6114c6600d546001600160401b031690565b838110611a61575050506001611a5a611a046119b3936119cf565b5001610480565b81611a816114c685611a7285610357565b5001546001600160401b031690565b11611a8d578201611a3f565b6119b39350611a5a9150610357565b604051631856a49960e21b8152600490fd5b919092611ac590611abd612ba1565b611599612ba1565b611acd612ba1565b6001600160401b039081611ae884516001600160401b031690565b1615801590611c19575b8015611c0d575b8015611c01575b8015611bf5575b8015611bec575b611bda5761045193611ba9611bcf92611b5e866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b8251600455602083015160055560408301516006556060830151600755611b84866115d2565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b611bca611bb58261196a565b91826000555191611bc583600155565b600255565b600355565b8042169043166122fc565b6040516350dd03f760e11b8152600490fd5b50835115611b0e565b50606084015115611b07565b50604084015115611b00565b50602084015115611af9565b50611c316114c660208501516001600160401b031690565b1515611af2565b6001600160a01b03908116908115611c9357600080516020612c7683398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612c76833981519152546001600160a01b03163303611ccd57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611d0e57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103c85760405260088252610100366020840137565b90816020910312610262575180151581036102625790565b90815180825260208080930193019160005b828110611db8575050505090565b835185529381019392810192600101611daa565b61046090611de583825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611e43610100928386019060208091805184520151910152565b60a081015191611e63610140938487019060208091805184520151910152565b60c082015192611e83610180948588019060208091805184520151910152565b60e083015191611ea36101c0938489019060208091805184520151910152565b830151611ec0610200918289019060208091805184520151910152565b61012084015191611ee161024093848a019060208091805184520151910152565b84015192611eff61028094858a019060208091805184520151910152565b611f3a61016086015196611f236102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b9392906121b6610451936104e0926121a76102606109609280518b52602081015160208c0152611fe3604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c01526121918b61202f60a08401516101008093019060208091805184520151910152565b6121628d6103c060c0860151612055610140918285019060208091805184520151910152565b61213560e088015195612078610180978887019060208091805184520151910152565b8801516120956101c0918287019060208091805184520151910152565b6121066101208a0151936120b9610200958689019060208091805184520151910152565b8a0151976120d7610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611d98565b940190611dcc565b6040513d6000823e3d90fd5b6020906121d561256d565b60406121df611d53565b926001546121ec85611790565b526122016114c682516001600160401b031690565b61220a8561179d565b526122216114c6868301516001600160401b031690565b61222a856117ad565b520151612236836117bd565b526122556040519485938493630c76545d60e21b855260048501611fa1565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af49081156122c657600091612297575b501561228557565b6040516309bde33960e01b8152600490fd5b6122b9915060203d6020116122bf575b6122b18183610403565b810190611d80565b3861227d565b503d6122a7565b6121be565b6001600160401b03918216908216039190821161191457565b6001600160401b038091169081146119145760010190565b909161236b61045193600e5480151590816123d1575b50612375575b604061232e60208501516001600160401b031690565b93015161234b61233c610444565b6001600160401b039095168552565b602084015261235b61233c610453565b6001600160401b03166020840152565b60408201526117e1565b61239361238d611a04600d546001600160401b031690565b90611774565b6123cc6123b06123ab600d546001600160401b031690565b6122e4565b6001600160401b03166001600160401b0319600d541617600d55565b612318565b61241491506123e5611a046123f6926119cf565b505460401c6001600160401b031690565b61240e6123e5611a04600d546001600160401b031690565b906122cb565b6001600160401b0361243b612432600c5463ffffffff9060a81c1690565b63ffffffff1690565b9116101538612312565b90816020910312610262575190565b8015611914576000190190565b612469610460565b90600082526000602083015261247d6119b6565b604083015261248a6119b6565b60608301526124976119b6565b60808301526124a46119b6565b60a08301526124b16119b6565b60c08301526124be6119b6565b60e08301526124cb6119b6565b6101008301526124d96119b6565b6101208301526124e76119b6565b6101408301526124f56119b6565b6101608301526125036119b6565b6101808301526125116119b6565b6101a083015261251f6119b6565b6101c083015261252d6119b6565b6101e083015261253b6119b6565b6102008301526125496119b6565b6102208301526125576119b6565b6102408301526125656119b6565b610260830152565b612575612461565b906201000082527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab37060206008818501527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b81604086017f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee818151525101527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c81606086017f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d8151525101527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d381608086017f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac88151525101527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea8160a086017f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c8398151525101527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b68160c086017f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce78151525101527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d8160e086017f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a68151525101527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b8161010086017f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f8151525101527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c148161012086017f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e088151525101527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba8161014086017f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e78151525101527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f8161016086017f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba6550228151525101527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e8161018086017f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df28151525101527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b816101a086017f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f78151525101527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc28816101c086017f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec738151525101527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d45690915824816101e086017f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508038151525101527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf8161020086017f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a8151525101527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab8161022086017f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db448151525101527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be18161024086017f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a7581515251015261026084017f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9815152510152565b90813b15612b8057600080516020612c9683398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612b6557612b6291612bd0565b50565b505034612b6e57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612cb68339815191525460401c1615612bbe57565b604051631afcd79f60e31b8152600490fd5b6000806119b393602081519101845af43d15612c0e573d91612bf183610bbb565b92612bff6040519485610403565b83523d6000602085013e612c12565b6060915b90612c395750805115612c2757805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612c6c575b612c4a575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612c4256fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json index c3f5f758a..9d36c0f26 100644 --- a/contract-bindings/artifacts/LightClient_bytecode.json +++ b/contract-bindings/artifacts/LightClient_bytecode.json @@ -1 +1 @@ -"0x60a080604052346100cd57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100be57506001600160401b036002600160401b031982821601610079575b604051612b0d9081620000d38239608051818181610ae50152610c3d0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461021757806302b592f3146102125780630c693a221461020d5780630d8e6e2c146102085780632063d4f7146102035780632f79889d146101fe578063313df7b1146101f9578063382b215a146101f45780634847ae5d146101ef5780634f1ef286146101ea57806352d1902d146101e557806362827733146101e057806369cc6a04146101db5780636f96bdae146101d6578063715018a6146101d157806376b6b7cb146101cc5780637f17baad146101c757806382d07ff3146101c25780638584d23f146101bd5780638da5cb5b146101b857806396c1ca61146101b35780639baa3cc9146101ae5780639fdb54a7146101a9578063a9a9c9f5146101a4578063ad3cb1cc1461019f578063bd32519a1461019a578063c23b9e9e14610195578063ca6fe85514610190578063d24d933d1461018b578063e030330114610186578063f2fde38b146101815763f9e50d191461017c57600080fd5b611401565b6113d8565b6112d3565b611298565b61127a565b611253565b61122d565b6111b0565b611179565b61113e565b610ff1565b610f6c565b610f36565b610ef9565b610ea2565b610e44565b610e00565b610d95565b610d4a565b610cb3565b610c95565b610c2a565b610a6b565b6109cf565b6109b1565b610988565b610961565b610809565b61056d565b6104ed565b610477565b61024e565b600435906001600160a01b038216820361023257565b600080fd5b61010435906001600160a01b038216820361023257565b346102325760203660031901126102325761026761021c565b61026f611966565b6001600160a01b039081169081156102ff57600d5490811682146102ed5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600d8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600f5481101561036257600390600f600052027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020190600090565b610311565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761039857604052565b610367565b608081019081106001600160401b0382111761039857604052565b606081019081106001600160401b0382111761039857604052565b90601f801991011681019081106001600160401b0382111761039857604052565b604051906102e082018281106001600160401b0382111761039857604052565b604051906104218261037d565b565b60405190610421826103b8565b6040519061028082018281106001600160401b0382111761039857604052565b9060405161045d8161037d565b6020600182946001600160401b0381541684520154910152565b3461023257602036600319011261023257600435600f54811015610232576104a0608091610327565b506104eb8154916104bb60016001600160401b039201610450565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b346102325760008060031936011261056a57608090604090606082516105128161039d565b82815282602082015282848201520152805161052d8161039d565b6005549182825260065460208301908152600754908284019182526060600854940193845282519485525160208501525190830152516060820152f35b80fd5b34610232576000366003190112610232576060604051600181526000602082015260006040820152f35b606090600319011261023257604051906105b0826103b8565b816001600160401b03600435818116810361023257825260243590811681036102325760208201526040604435910152565b604090606319011261023257604051906105fb8261037d565b60643582526084356020830152565b60409060a319011261023257604051906106238261037d565b60a435825260c4356020830152565b60409060e3190112610232576040519061064b8261037d565b60e4358252610104356020830152565b60409061012319011261023257604051906106758261037d565b610124358252610144356020830152565b60409061016319011261023257604051906106a08261037d565b610164358252610184356020830152565b6040906101a319011261023257604051906106cb8261037d565b6101a43582526101c4356020830152565b6040906101e319011261023257604051906106f68261037d565b6101e4358252610204356020830152565b60409061022319011261023257604051906107218261037d565b610224358252610244356020830152565b604090610263190112610232576040519061074c8261037d565b610264358252610284356020830152565b6040906102a319011261023257604051906107778261037d565b6102a43582526102c4356020830152565b6040906102e319011261023257604051906107a28261037d565b6102e4358252610304356020830152565b60409061032319011261023257604051906107cd8261037d565b610324358252610344356020830152565b60409061036319011261023257604051906107f88261037d565b610364358252610384356020830152565b34610232576104e03660031901126102325761082436610597565b6104803660631901126102325761095f9061083d6103f4565b90610847366105e2565b82526108523661060a565b602083015261086036610632565b604083015261086e3661065b565b606083015261087c36610686565b608083015261088a366106b1565b60a0830152610898366106dc565b60c08301526108a636610707565b60e08301526108b436610732565b6101008301526108c33661075d565b6101208301526108d236610788565b6101408301526108e1366107b3565b6101608301526108f0366107de565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c083015261145c565b005b346102325760003660031901126102325760206001600160401b03600e5416604051908152f35b3461023257600036600319011261023257600d546040516001600160a01b039091168152602090f35b34610232576000366003190112610232576020600254604051908152f35b34610232576000366003190112610232576109e86115ab565b50610a4c6040516109f8816103b8565b6009546001600160401b0390818116835260401c166020820152600a5460408201526040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b0390f35b6001600160401b03811161039857601f01601f191660200190565b60408060031936011261023257610a8061021c565b6024356001600160401b038111610232573660238201121561023257806004013590610aab82610a50565b91610ab8855193846103d3565b80835260209136602483830101116102325781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610c0e575b50610bfd579080600492610b23611966565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610bce575b5050610b93578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612ac18339815191528193929303610bb55761095f8383612925565b8351632a87526960e21b81526004810191909152602490fd5b610bee929350803d10610bf6575b610be681836103d3565b81019061227c565b903880610b6d565b503d610bdc565b845163703e46dd60e11b8152600490fd5b905081600080516020612ac18339815191525416141538610b11565b34610232576000366003190112610232577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610c83576020604051600080516020612ac18339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610232576000366003190112610232576020600154604051908152f35b346102325760008060031936011261056a57610ccd611966565b600d5460ff8160a01c166000146102ed576001600160a81b031916600d557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b60809060631901126102325760405190610d2b8261039d565b6064358252608435602083015260a435604083015260c4356060830152565b34610232576080366003190112610232576020610d8d604051610d6c8161039d565b600435815260243583820152604435604082015260643560608201526115fc565b604051908152f35b346102325760008060031936011261056a57610daf611966565b600080516020612aa183398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610232576000366003190112610232576020600054604051908152f35b6004359063ffffffff8216820361023257565b60e4359063ffffffff8216820361023257565b346102325760203660031901126102325763ffffffff610e62610e1e565b16600090815260046020908152604091829020805460019091015483516001600160401b03808416825292851c9092169282019290925291820152606090f35b3461023257600036600319011261023257610ebb6115ab565b50610a4c610ec76115ca565b6040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b34610232576020366003190112610232576040610f17600435611698565b6104eb82518092602080916001600160401b0381511684520151910152565b3461023257600036600319011261023257600080516020612aa1833981519152546040516001600160a01b039091168152602090f35b3461023257602036600319011261023257610f85610e1e565b610f8d611966565b63ffffffff808216610e108110918215610fdf575b5050610fcd57600d805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600d5460a81c16101590503880610fa2565b34610232576101203660031901126102325761100c36610597565b61101536610d12565b9061101e610e31565b611026610237565b90600080516020612ae183398151915254936001600160401b0360ff8660401c1615951680159081611136575b600114908161112c575b159081611123575b5061111157600080516020612ae1833981519152805467ffffffffffffffff1916600117905561109993856110ec5761175b565b61109f57005b600080516020612ae1833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102e8565b600080516020612ae1833981519152805460ff60401b1916600160401b17905561175b565b60405163f92ee8a960e01b8152600490fd5b90501538611065565b303b15915061105d565b869150611053565b3461023257600036600319011261023257600b54600c54604080516001600160401b03808516825293821c9093166020840152820152606090f35b3461023257600036600319011261023257608060055460065460075460085491604051938452602084015260408301526060820152f35b346102325760003660031901126102325760408051906111cf8261037d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b83811061121a5784604081866000838284010152601f80199101168101030190f35b85810183015185820183015282016111f8565b3461023257600036600319011261023257602060ff600d5460a01c166040519015158152f35b3461023257600036600319011261023257602063ffffffff600d5460a81c16604051908152f35b34610232576000366003190112610232576020600354604051908152f35b3461023257600036600319011261023257600954600a54604080516001600160401b03808516825293821c9093166020840152820152606090f35b3461023257604036600319011261023257600435600f5443821180156113ce575b61135b57600091611306600092611677565b9161132861131c600e546001600160401b031690565b6001600160401b031690565b925b811561136d575b509091501561135b5761134a610a4c926024359261168b565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b8261138b61131c61137d84610327565b50546001600160401b031690565b11156113b4575b600281106113af578381146113af576113aa906118e5565b61132a565b611331565b93505060016113c861131c61137d86610327565b93611392565b50600381106112f4565b346102325760203660031901126102325761095f6113f461021c565b6113fc611966565b6118f2565b34610232576000366003190112610232576020600f54604051908152f35b6040906001600160401b03815116600b549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600b550151600c55565b90600d5460ff8160a01c169081611597575b506115855781516001600160401b031661149961131c61148c611634565b516001600160401b031690565b6001600160401b038092161180159061154e575b61153c577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906114eb60408501936114e5855161199f565b85611ec1565b6114f48461141f565b61150384824216834316612133565b611528602061151986516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b03168161157c61131c602061156e611634565b01516001600160401b031690565b911611156114ad565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861146e565b604051906115b8826103b8565b60006040838281528260208201520152565b604051906115d7826103b8565b81600b546001600160401b0390818116835260401c1660208201526040600c54910152565b602081015190606060408201519101516040519160208301938452604083015260608201526060815261162e8161039d565b51902090565b61163c6115ab565b506116456115ca565b90565b604051906116558261037d565b60006020838281520152565b634e487b7160e01b600052601160045260246000fd5b60001981019190821161168657565b611661565b9190820391821161168657565b6116a0611648565b50600f54906116b66116b183611677565b610327565b50906116d061131c6001809401546001600160401b031690565b811015611749576116ec61131c600e546001600160401b031690565b83811061170e5750505060016117076116b161164593611677565b5001610450565b8161172e61131c8561171f85610327565b5001546001600160401b031690565b1161173a5782016116ec565b61164593506117079150610327565b604051631856a49960e21b8152600490fd5b9190926117729061176a6129cc565b6113fc6129cc565b61177a6129cc565b6001600160401b03908161179584516001600160401b031690565b16158015906118c6575b80156118ba575b80156118ae575b80156118a2575b8015611899575b611887576104219361185661187c9261180b866040906001600160401b038151166009549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176009550151600a55565b82516005556020830151600655604083015160075560608301516008556118318661141f565b600d805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b611877611862826115fc565b9182600055519161187283600155565b600255565b600355565b804216904316612133565b6040516350dd03f760e11b8152600490fd5b508351156117bb565b506060840151156117b4565b506040840151156117ad565b506020840151156117a6565b506118de61131c60208501516001600160401b031690565b151561179f565b8015611686576000190190565b6001600160a01b0390811690811561194d57600080516020612aa183398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612aa1833981519152546001600160a01b0316330361198757565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000111156119c857565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103985760405260088252610100366020840137565b8051156103625760200190565b8051600110156103625760400190565b8051600210156103625760600190565b8051600310156103625760800190565b90816020910312610232575180151581036102325790565b90815180825260208080930193019160005b828110611aaf575050505090565b835185529381019392810192600101611aa1565b61046090611adc83825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611b3a610100928386019060208091805184520151910152565b60a081015191611b5a610140938487019060208091805184520151910152565b60c082015192611b7a610180948588019060208091805184520151910152565b60e083015191611b9a6101c0938489019060208091805184520151910152565b830151611bb7610200918289019060208091805184520151910152565b61012084015191611bd861024093848a019060208091805184520151910152565b84015192611bf661028094858a019060208091805184520151910152565b611c3161016086015196611c1a6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b939290611ead610421936104e092611e9e6102606109609280518b52602081015160208c0152611cda604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c0152611e888b611d2660a08401516101008093019060208091805184520151910152565b611e598d6103c060c0860151611d4c610140918285019060208091805184520151910152565b611e2c60e088015195611d6f610180978887019060208091805184520151910152565b880151611d8c6101c0918287019060208091805184520151910152565b611dfd6101208a015193611db0610200958689019060208091805184520151910152565b8a015197611dce610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611a8f565b940190611ac3565b6040513d6000823e3d90fd5b602090611ecc612397565b6040611ed6611a0d565b92600154611ee385611a3a565b52611ef861131c82516001600160401b031690565b611f0185611a47565b52611f1861131c868301516001600160401b031690565b611f2185611a57565b520151611f2d83611a67565b52611f4c6040519485938493630c76545d60e21b855260048501611c98565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af4908115611fbd57600091611f8e575b5015611f7c57565b6040516309bde33960e01b8152600490fd5b611fb0915060203d602011611fb6575b611fa881836103d3565b810190611a77565b38611f74565b503d611f9e565b611eb5565b6001600160401b03918216908216039190821161168657565b90611ff25760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146116865760010190565b600f54600160401b811015610398576001810180600f5581101561036257602060037f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80492600f600052029261212c6040857f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201926001600160401b03936120c08583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8038601906001600160401b03166001600160401b0319825416179055565b0151910155565b90916121a261042193600f548015159081612208575b506121ac575b604061216560208501516001600160401b031690565b930151612182612173610414565b6001600160401b039095168552565b6020840152612192612173610423565b6001600160401b03166020840152565b6040820152612020565b6121ca6121c46116b1600e546001600160401b031690565b90611fdb565b6122036121e76121e2600e546001600160401b031690565b612008565b6001600160401b03166001600160401b0319600e541617600e55565b61214f565b61224b915061221c6116b161222d92611677565b505460401c6001600160401b031690565b61224561221c6116b1600e546001600160401b031690565b90611fc2565b6001600160401b03612272612269600d5463ffffffff9060a81c1690565b63ffffffff1690565b9116101538612149565b90816020910312610232575190565b612293610430565b9060008252600060208301526122a7611648565b60408301526122b4611648565b60608301526122c1611648565b60808301526122ce611648565b60a08301526122db611648565b60c08301526122e8611648565b60e08301526122f5611648565b610100830152612303611648565b610120830152612311611648565b61014083015261231f611648565b61016083015261232d611648565b61018083015261233b611648565b6101a0830152612349611648565b6101c0830152612357611648565b6101e0830152612365611648565b610200830152612373611648565b610220830152612381611648565b61024083015261238f611648565b610260830152565b61239f61228b565b906210000082527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d560206008818501527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c81604086017f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b338151525101527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e97081606086017f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db8151525101527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d81608086017f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b998151525101527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df600938160a086017f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a58066258151525101527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde288160c086017f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a98151525101527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc038160e086017f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b596938151525101527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad8161010086017f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e78151525101527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea170318161012086017f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e48151525101527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db70368161014086017f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae72488151525101527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e84158161016086017f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e56198151525101527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a38161018086017f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc88151525101527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c816101a086017f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc8151525101527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd5816101c086017f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b408151525101527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd3816101e086017f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc58151525101527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc8161020086017f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa48151525101527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e8161022086017f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a297822268151525101527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd48161024086017f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab261423981515251015261026084017f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82815152510152565b90813b156129ab57600080516020612ac183398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28051156129905761298d916129fb565b50565b50503461299957565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612ae18339815191525460401c16156129e957565b604051631afcd79f60e31b8152600490fd5b60008061164593602081519101845af43d15612a39573d91612a1c83610a50565b92612a2a60405194856103d3565b83523d6000602085013e612a3d565b6060915b90612a645750805115612a5257805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612a97575b612a75575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612a6d56fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b604051612a8e90816100d28239608051818181610ad50152610c2d0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461020757806302b592f3146102025780630c693a22146101fd5780630d8e6e2c146101f85780632063d4f7146101f35780632f79889d146101ee578063313df7b1146101e9578063382b215a146101e45780634847ae5d146101df5780634f1ef286146101da57806352d1902d146101d557806362827733146101d057806369cc6a04146101cb5780636f96bdae146101c6578063715018a6146101c157806376b6b7cb146101bc57806382d07ff3146101b75780638584d23f146101b25780638da5cb5b146101ad57806396c1ca61146101a85780639baa3cc9146101a35780639fdb54a71461019e578063a9a9c9f514610199578063ad3cb1cc14610194578063bd32519a1461018f578063c23b9e9e1461018a578063ca6fe85514610185578063d24d933d14610180578063e03033011461017b578063f2fde38b146101765763f9e50d191461017157600080fd5b611382565b611359565b611254565b611219565b6111fb565b6111d4565b6111ae565b611131565b6110fa565b6110bf565b610f72565b610eeb565b610ea2565b610e65565b610e0e565b610df0565b610d85565b610d3a565b610ca3565b610c85565b610c1a565b610a5b565b6109bf565b6109a1565b610978565b610951565b6107f9565b61055d565b6104dd565b610467565b61023e565b600435906001600160a01b038216820361022257565b600080fd5b61010435906001600160a01b038216820361022257565b346102225760203660031901126102225761025761020c565b61025f6118e7565b6001600160a01b039081169081156102ef57600c5490811682146102dd5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561035257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b610301565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761038857604052565b610357565b608081019081106001600160401b0382111761038857604052565b606081019081106001600160401b0382111761038857604052565b90601f801991011681019081106001600160401b0382111761038857604052565b604051906102e082018281106001600160401b0382111761038857604052565b604051906104118261036d565b565b60405190610411826103a8565b6040519061028082018281106001600160401b0382111761038857604052565b9060405161044d8161036d565b6020600182946001600160401b0381541684520154910152565b3461022257602036600319011261022257600435600e5481101561022257610490608091610317565b506104db8154916104ab60016001600160401b039201610440565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b346102225760008060031936011261055a57608090604090606082516105028161038d565b82815282602082015282848201520152805161051d8161038d565b6004549182825260055460208301908152600654908284019182526060600754940193845282519485525160208501525190830152516060820152f35b80fd5b34610222576000366003190112610222576060604051600181526000602082015260006040820152f35b606090600319011261022257604051906105a0826103a8565b816001600160401b03600435818116810361022257825260243590811681036102225760208201526040604435910152565b604090606319011261022257604051906105eb8261036d565b60643582526084356020830152565b60409060a319011261022257604051906106138261036d565b60a435825260c4356020830152565b60409060e3190112610222576040519061063b8261036d565b60e4358252610104356020830152565b60409061012319011261022257604051906106658261036d565b610124358252610144356020830152565b60409061016319011261022257604051906106908261036d565b610164358252610184356020830152565b6040906101a319011261022257604051906106bb8261036d565b6101a43582526101c4356020830152565b6040906101e319011261022257604051906106e68261036d565b6101e4358252610204356020830152565b60409061022319011261022257604051906107118261036d565b610224358252610244356020830152565b604090610263190112610222576040519061073c8261036d565b610264358252610284356020830152565b6040906102a319011261022257604051906107678261036d565b6102a43582526102c4356020830152565b6040906102e319011261022257604051906107928261036d565b6102e4358252610304356020830152565b60409061032319011261022257604051906107bd8261036d565b610324358252610344356020830152565b60409061036319011261022257604051906107e88261036d565b610364358252610384356020830152565b34610222576104e03660031901126102225761081436610587565b6104803660631901126102225761094f9061082d6103e4565b90610837366105d2565b8252610842366105fa565b602083015261085036610622565b604083015261085e3661064b565b606083015261086c36610676565b608083015261087a366106a1565b60a0830152610888366106cc565b60c0830152610896366106f7565b60e08301526108a436610722565b6101008301526108b33661074d565b6101208301526108c236610778565b6101408301526108d1366107a3565b6101608301526108e0366107ce565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c08301526113dd565b005b346102225760003660031901126102225760206001600160401b03600d5416604051908152f35b3461022257600036600319011261022257600c546040516001600160a01b039091168152602090f35b34610222576000366003190112610222576020600254604051908152f35b34610222576000366003190112610222576109d861152c565b50610a3c6040516109e8816103a8565b6008546001600160401b0390818116835260401c16602082015260095460408201526040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b0390f35b6001600160401b03811161038857601f01601f191660200190565b60408060031936011261022257610a7061020c565b6024356001600160401b038111610222573660238201121561022257806004013590610a9b82610a40565b91610aa8855193846103c3565b80835260209136602483830101116102225781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610bfe575b50610bed579080600492610b136118e7565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610bbe575b5050610b83578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612a428339815191528193929303610ba55761094f83836128a6565b8351632a87526960e21b81526004810191909152602490fd5b610bde929350803d10610be6575b610bd681836103c3565b8101906121fd565b903880610b5d565b503d610bcc565b845163703e46dd60e11b8152600490fd5b905081600080516020612a428339815191525416141538610b01565b34610222576000366003190112610222577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610c73576020604051600080516020612a428339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610222576000366003190112610222576020600154604051908152f35b346102225760008060031936011261055a57610cbd6118e7565b600c5460ff8160a01c166000146102dd576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b60809060631901126102225760405190610d1b8261038d565b6064358252608435602083015260a435604083015260c4356060830152565b34610222576080366003190112610222576020610d7d604051610d5c8161038d565b6004358152602435838201526044356040820152606435606082015261157d565b604051908152f35b346102225760008060031936011261055a57610d9f6118e7565b600080516020612a2283398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610222576000366003190112610222576020600054604051908152f35b3461022257600036600319011261022257610e2761152c565b50610a3c610e3361154b565b6040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b34610222576020366003190112610222576040610e83600435611619565b6104db82518092602080916001600160401b0381511684520151910152565b3461022257600036600319011261022257600080516020612a22833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff8216820361022257565b346102225760203660031901126102225760043563ffffffff80821680830361022257610f166118e7565b610e108110918215610f60575b5050610f4e57600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610f23565b346102225761012036600319011261022257610f8d36610587565b610f9636610d02565b90610f9f610ed8565b610fa7610227565b90600080516020612a6283398151915254936001600160401b0360ff8660401c16159516801590816110b7575b60011490816110ad575b1590816110a4575b5061109257600080516020612a62833981519152805467ffffffffffffffff1916600117905561101a938561106d576116dc565b61102057005b600080516020612a62833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102d8565b600080516020612a62833981519152805460ff60401b1916600160401b1790556116dc565b60405163f92ee8a960e01b8152600490fd5b90501538610fe6565b303b159150610fde565b869150610fd4565b3461022257600036600319011261022257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b3461022257600036600319011261022257608060045460055460065460075491604051938452602084015260408301526060820152f35b346102225760003660031901126102225760408051906111508261036d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b83811061119b5784604081866000838284010152601f80199101168101030190f35b8581018301518582018301528201611179565b3461022257600036600319011261022257602060ff600c5460a01c166040519015158152f35b3461022257600036600319011261022257602063ffffffff600c5460a81c16604051908152f35b34610222576000366003190112610222576020600354604051908152f35b3461022257600036600319011261022257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b3461022257604036600319011261022257600435600e54438211801561134f575b6112dc576000916112876000926115f8565b916112a961129d600d546001600160401b031690565b6001600160401b031690565b925b81156112ee575b50909150156112dc576112cb610a3c926024359261160c565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b8261130c61129d6112fe84610317565b50546001600160401b031690565b1115611335575b60028110611330578381146113305761132b90611866565b6112ab565b6112b2565b935050600161134961129d6112fe86610317565b93611313565b5060038110611275565b346102225760203660031901126102225761094f61137561020c565b61137d6118e7565b611873565b34610222576000366003190112610222576020600e54604051908152f35b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c169081611518575b506115065781516001600160401b031661141a61129d61140d6115b5565b516001600160401b031690565b6001600160401b03809216118015906114cf575b6114bd577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae69061146c60408501936114668551611920565b85611e42565b611475846113a0565b611484848242168343166120b4565b6114a9602061149a86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b0316816114fd61129d60206114ef6115b5565b01516001600160401b031690565b9116111561142e565b6040516301474c8f60e71b8152600490fd5b6001600160a01b03163314159050386113ef565b60405190611539826103a8565b60006040838281528260208201520152565b60405190611558826103a8565b81600a546001600160401b0390818116835260401c1660208201526040600b54910152565b60208101519060606040820151910151604051916020830193845260408301526060820152606081526115af8161038d565b51902090565b6115bd61152c565b506115c661154b565b90565b604051906115d68261036d565b60006020838281520152565b634e487b7160e01b600052601160045260246000fd5b60001981019190821161160757565b6115e2565b9190820391821161160757565b6116216115c9565b50600e5490611637611632836115f8565b610317565b509061165161129d6001809401546001600160401b031690565b8110156116ca5761166d61129d600d546001600160401b031690565b83811061168f5750505060016116886116326115c6936115f8565b5001610440565b816116af61129d856116a085610317565b5001546001600160401b031690565b116116bb57820161166d565b6115c693506116889150610317565b604051631856a49960e21b8152600490fd5b9190926116f3906116eb61294d565b61137d61294d565b6116fb61294d565b6001600160401b03908161171684516001600160401b031690565b1615801590611847575b801561183b575b801561182f575b8015611823575b801561181a575b61180857610411936117d76117fd9261178c866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b82516004556020830151600555604083015160065560608301516007556117b2866113a0565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b6117f86117e38261157d565b918260005551916117f383600155565b600255565b600355565b8042169043166120b4565b6040516350dd03f760e11b8152600490fd5b5083511561173c565b50606084015115611735565b5060408401511561172e565b50602084015115611727565b5061185f61129d60208501516001600160401b031690565b1515611720565b8015611607576000190190565b6001600160a01b039081169081156118ce57600080516020612a2283398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612a22833981519152546001600160a01b0316330361190857565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561194957565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103885760405260088252610100366020840137565b8051156103525760200190565b8051600110156103525760400190565b8051600210156103525760600190565b8051600310156103525760800190565b90816020910312610222575180151581036102225790565b90815180825260208080930193019160005b828110611a30575050505090565b835185529381019392810192600101611a22565b61046090611a5d83825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611abb610100928386019060208091805184520151910152565b60a081015191611adb610140938487019060208091805184520151910152565b60c082015192611afb610180948588019060208091805184520151910152565b60e083015191611b1b6101c0938489019060208091805184520151910152565b830151611b38610200918289019060208091805184520151910152565b61012084015191611b5961024093848a019060208091805184520151910152565b84015192611b7761028094858a019060208091805184520151910152565b611bb261016086015196611b9b6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b939290611e2e610411936104e092611e1f6102606109609280518b52602081015160208c0152611c5b604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c0152611e098b611ca760a08401516101008093019060208091805184520151910152565b611dda8d6103c060c0860151611ccd610140918285019060208091805184520151910152565b611dad60e088015195611cf0610180978887019060208091805184520151910152565b880151611d0d6101c0918287019060208091805184520151910152565b611d7e6101208a015193611d31610200958689019060208091805184520151910152565b8a015197611d4f610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611a10565b940190611a44565b6040513d6000823e3d90fd5b602090611e4d612318565b6040611e5761198e565b92600154611e64856119bb565b52611e7961129d82516001600160401b031690565b611e82856119c8565b52611e9961129d868301516001600160401b031690565b611ea2856119d8565b520151611eae836119e8565b52611ecd6040519485938493630c76545d60e21b855260048501611c19565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af4908115611f3e57600091611f0f575b5015611efd57565b6040516309bde33960e01b8152600490fd5b611f31915060203d602011611f37575b611f2981836103c3565b8101906119f8565b38611ef5565b503d611f1f565b611e36565b6001600160401b03918216908216039190821161160757565b90611f735760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146116075760010190565b600e54600160401b811015610388576001810180600e5581101561035257602060037fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff92600e60005202926120ad6040857fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01926001600160401b03936120418583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe8601906001600160401b03166001600160401b0319825416179055565b0151910155565b909161212361041193600e548015159081612189575b5061212d575b60406120e660208501516001600160401b031690565b9301516121036120f4610404565b6001600160401b039095168552565b60208401526121136120f4610413565b6001600160401b03166020840152565b6040820152611fa1565b61214b612145611632600d546001600160401b031690565b90611f5c565b612184612168612163600d546001600160401b031690565b611f89565b6001600160401b03166001600160401b0319600d541617600d55565b6120d0565b6121cc915061219d6116326121ae926115f8565b505460401c6001600160401b031690565b6121c661219d611632600d546001600160401b031690565b90611f43565b6001600160401b036121f36121ea600c5463ffffffff9060a81c1690565b63ffffffff1690565b91161015386120ca565b90816020910312610222575190565b612214610420565b9060008252600060208301526122286115c9565b60408301526122356115c9565b60608301526122426115c9565b608083015261224f6115c9565b60a083015261225c6115c9565b60c08301526122696115c9565b60e08301526122766115c9565b6101008301526122846115c9565b6101208301526122926115c9565b6101408301526122a06115c9565b6101608301526122ae6115c9565b6101808301526122bc6115c9565b6101a08301526122ca6115c9565b6101c08301526122d86115c9565b6101e08301526122e66115c9565b6102008301526122f46115c9565b6102208301526123026115c9565b6102408301526123106115c9565b610260830152565b61232061220c565b906210000082527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d560206008818501527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c81604086017f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b338151525101527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e97081606086017f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db8151525101527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d81608086017f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b998151525101527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df600938160a086017f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a58066258151525101527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde288160c086017f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a98151525101527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc038160e086017f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b596938151525101527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad8161010086017f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e78151525101527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea170318161012086017f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e48151525101527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db70368161014086017f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae72488151525101527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e84158161016086017f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e56198151525101527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a38161018086017f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc88151525101527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c816101a086017f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc8151525101527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd5816101c086017f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b408151525101527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd3816101e086017f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc58151525101527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc8161020086017f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa48151525101527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e8161022086017f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a297822268151525101527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd48161024086017f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab261423981515251015261026084017f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82815152510152565b90813b1561292c57600080516020612a4283398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28051156129115761290e9161297c565b50565b50503461291a57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612a628339815191525460401c161561296a57565b604051631afcd79f60e31b8152600490fd5b6000806115c693602081519101845af43d156129ba573d9161299d83610a40565b926129ab60405194856103c3565b83523d6000602085013e6129be565b6060915b906129e557508051156129d357805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612a18575b6129f6575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156129ee56fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/src/light_client.rs b/contract-bindings/src/light_client.rs index d86a130cf..6f8fe5894 100644 --- a/contract-bindings/src/light_client.rs +++ b/contract-bindings/src/light_client.rs @@ -708,44 +708,6 @@ pub mod light_client { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), - ( - ::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"), - ), - }, - ], - 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 { @@ -1380,16 +1342,6 @@ pub mod light_client { .method_hash([194, 59, 158, 158], ()) .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 - { - 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, @@ -2907,23 +2859,6 @@ pub mod light_client { abi = "stateHistoryRetentionPeriod()" )] pub struct StateHistoryRetentionPeriodCall; - ///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, @@ -3022,7 +2957,6 @@ pub mod light_client { StateHistoryCommitments(StateHistoryCommitmentsCall), StateHistoryFirstIndex(StateHistoryFirstIndexCall), StateHistoryRetentionPeriod(StateHistoryRetentionPeriodCall), - States(StatesCall), TransferOwnership(TransferOwnershipCall), UpgradeToAndCall(UpgradeToAndCallCall), VotingStakeTableCommitment(VotingStakeTableCommitmentCall), @@ -3160,9 +3094,6 @@ pub mod light_client { { return Ok(Self::StateHistoryRetentionPeriod(decoded)); } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::States(decoded)); - } if let Ok(decoded) = ::decode(data) { @@ -3246,7 +3177,6 @@ pub mod light_client { Self::StateHistoryRetentionPeriod(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) => { @@ -3290,7 +3220,6 @@ pub mod light_client { Self::StateHistoryCommitments(element) => ::core::fmt::Display::fmt(element, f), Self::StateHistoryFirstIndex(element) => ::core::fmt::Display::fmt(element, f), Self::StateHistoryRetentionPeriod(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), @@ -3433,11 +3362,6 @@ pub mod light_client { Self::StateHistoryRetentionPeriod(value) } } - impl ::core::convert::From for LightClientCalls { - fn from(value: StatesCall) -> Self { - Self::States(value) - } - } impl ::core::convert::From for LightClientCalls { fn from(value: TransferOwnershipCall) -> Self { Self::TransferOwnership(value) @@ -3773,24 +3697,6 @@ pub mod light_client { Hash, )] pub struct StateHistoryRetentionPeriodReturn(pub u32); - ///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, - } ///Container type for all return fields from the `votingStakeTableCommitment` function with signature `votingStakeTableCommitment()` and selector `0x76b6b7cb` #[derive( Clone, diff --git a/contract-bindings/src/light_client_mock.rs b/contract-bindings/src/light_client_mock.rs index 7dc2aec66..82bd9134d 100644 --- a/contract-bindings/src/light_client_mock.rs +++ b/contract-bindings/src/light_client_mock.rs @@ -816,44 +816,6 @@ pub mod light_client_mock { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), - ( - ::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"), - ), - }, - ], - 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 { @@ -1521,16 +1483,6 @@ pub mod light_client_mock { .method_hash([194, 59, 158, 158], ()) .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 - { - 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, @@ -3124,23 +3076,6 @@ pub mod light_client_mock { abi = "stateHistoryRetentionPeriod()" )] pub struct StateHistoryRetentionPeriodCall; - ///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, @@ -3243,7 +3178,6 @@ pub mod light_client_mock { StateHistoryCommitments(StateHistoryCommitmentsCall), StateHistoryFirstIndex(StateHistoryFirstIndexCall), StateHistoryRetentionPeriod(StateHistoryRetentionPeriodCall), - States(StatesCall), TransferOwnership(TransferOwnershipCall), UpgradeToAndCall(UpgradeToAndCallCall), VotingStakeTableCommitment(VotingStakeTableCommitmentCall), @@ -3400,9 +3334,6 @@ pub mod light_client_mock { { return Ok(Self::StateHistoryRetentionPeriod(decoded)); } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::States(decoded)); - } if let Ok(decoded) = ::decode(data) { @@ -3492,7 +3423,6 @@ pub mod light_client_mock { Self::StateHistoryRetentionPeriod(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) => { @@ -3540,7 +3470,6 @@ pub mod light_client_mock { Self::StateHistoryCommitments(element) => ::core::fmt::Display::fmt(element, f), Self::StateHistoryFirstIndex(element) => ::core::fmt::Display::fmt(element, f), Self::StateHistoryRetentionPeriod(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), @@ -3703,11 +3632,6 @@ pub mod light_client_mock { Self::StateHistoryRetentionPeriod(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) @@ -4043,24 +3967,6 @@ pub mod light_client_mock { Hash, )] pub struct StateHistoryRetentionPeriodReturn(pub u32); - ///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, - } ///Container type for all return fields from the `votingStakeTableCommitment` function with signature `votingStakeTableCommitment()` and selector `0x76b6b7cb` #[derive( Clone, diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol index 0a2bb62cf..566a10860 100644 --- a/contracts/src/LightClient.sol +++ b/contracts/src/LightClient.sol @@ -53,9 +53,6 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @notice The quorum threshold for the frozen stake table uint256 public frozenThreshold; - /// @notice mapping to store light client states in order to simplify upgrades - mapping(uint32 index => LightClientState value) public states; - /// @notice genesis stake commitment StakeState public genesisStakeState; From 56b88cd34eeab65ce00ba3e8a954accfc850937f Mon Sep 17 00:00:00 2001 From: Alysia Huggins Date: Wed, 4 Sep 2024 23:30:05 -0400 Subject: [PATCH 09/27] remove getter functions for genesis and finalized states --- .../artifacts/LightClientMock_bytecode.json | 2 +- .../artifacts/LightClient_bytecode.json | 2 +- contract-bindings/src/light_client.rs | 217 ------------------ contract-bindings/src/light_client_mock.rs | 217 ------------------ contracts/src/LightClient.sol | 19 +- contracts/test/LightClient.t.sol | 15 +- .../test/LightClientUpgradeSameContract.t.sol | 18 +- contracts/test/LightClientUpgradeToVx.t.sol | 52 ++++- contracts/test/LightClientV2.sol | 4 +- doc/zk-integration.md | 4 +- hotshot-state-prover/src/service.rs | 10 +- 11 files changed, 83 insertions(+), 477 deletions(-) diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json index 064dd8a2d..6e5054f4f 100644 --- a/contract-bindings/artifacts/LightClientMock_bytecode.json +++ b/contract-bindings/artifacts/LightClientMock_bytecode.json @@ -1 +1 @@ -"0x60a0346200057857620032c738819003601f8101601f191683016001600160401b03811184821017620004aa57839282916040528339810103610100811262000578576060811262000578576080604051916200005c836200057d565b620000678462000599565b8352620000776020850162000599565b602084015260408401516040840152605f19011262000578576040519160808301906001600160401b03821184831017620004aa5760e091604052606081015184526080810151602085015260a0810151604085015260c08101516060850152015163ffffffff811681036200057857306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8160401c1662000566576002600160401b03196001600160401b038216016200051a575b505081516001600160401b03161580159062000503575b8015620004f6575b8015620004e9575b8015620004dc575b8015620004d2575b620004c05760018060401b03825116908160085468010000000000000000600160801b03602086015160401b1691829160018060801b031916171760085560408401519182600955855160045560208601519283600555604087015192836006556060880151958660075560018060801b0319600a54161717600a55600b55600c549063ffffffff60a81b9060a81b169063ffffffff60a81b1916179283600c55604051916020830193845260408301526060820152606081526080810181811060018060401b03821117620004aa57604052519020600093818555519081600155600255600355600e5490811515918262000433575b5050620003a4575b602081015160409182015182519290916001600160401b039081169184019081118482101762000390576040528252602082015260405190620002ad826200057d565b6001600160401b03438116835242166020830190815260408301918252600e54909290680100000000000000008110156200039057806001620002f49201600e55620005ae565b9490946200037c575051835492516001600160801b03199093166001600160401b0391821617604093841b6fffffffffffffffff000000000000000016178455905180516001850180546001600160401b0319169190931617909155602001516002929092019190915551612ce29081620005e58239608051818181610c500152610da80152f35b634e487b7160e01b81526004819052602490fd5b634e487b7160e01b85526041600452602485fd5b600d54620003bb906001600160401b0316620005ae565b6200041f5782815560018101839055600201829055600d546001600160401b038082169081146200040b576001600160401b03199091166001919091016001600160401b031617600d556200026a565b634e487b7160e01b84526011600452602484fd5b634e487b7160e01b83526004839052602483fd5b90915060001981019081116200040b576200044e90620005ae565b5054600d546001600160401b0360409290921c821691620004709116620005ae565b505460401c6001600160401b03908116909103919082116200040b5760a81c63ffffffff166001600160401b039091161015388062000262565b634e487b7160e01b600052604160045260246000fd5b6040516350dd03f760e11b8152600490fd5b508251156200016b565b5060608301511562000163565b506040830151156200015b565b5060208301511562000153565b5060208201516001600160401b031615156200014b565b6001600160401b0319166001600160401b039081179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388062000134565b60405163f92ee8a960e01b8152600490fd5b600080fd5b606081019081106001600160401b03821117620004aa57604052565b51906001600160401b03821682036200057857565b600e54811015620005ce57600e6000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461024757806302b592f3146102425780630c693a221461023d5780630d8e6e2c146102385780632063d4f7146102335780632d52aad61461022e5780632f5f4600146102295780632f79889d14610224578063313df7b11461021f578063382b215a1461021a5780634847ae5d146102155780634f1ef2861461021057806352d1902d1461020b578063628277331461020657806369cc6a04146102015780636f96bdae146101fc578063715018a6146101f757806376b6b7cb146101f257806382d07ff3146101ed5780638584d23f146101e85780638da5cb5b146101e357806396c1ca61146101de5780639baa3cc9146101d95780639fdb54a7146101d4578063a9a9c9f5146101cf578063ad3cb1cc146101ca578063b5adea3c146101c5578063bd32519a146101c0578063c23b9e9e146101bb578063c8e5e498146101b6578063ca6fe855146101b1578063d24d933d146101ac578063e0303301146101a7578063f2fde38b146101a25763f9e50d191461019d57600080fd5b61159e565b611575565b611445565b61140a565b6113ec565b6113cf565b6113a8565b611382565b611329565b6112ac565b611275565b61123a565b6110ed565b611066565b61101d565b610fe0565b610f89565b610f6b565b610f00565b610eb5565b610e1e565b610e00565b610d95565b610bd6565b610b3a565b610b1c565b610af3565b610acc565b6109e2565b6109a5565b61084d565b61059d565b61051d565b6104a7565b61027e565b600435906001600160a01b038216820361026257565b600080fd5b61010435906001600160a01b038216820361026257565b346102625760203660031901126102625761029761024c565b61029f611cac565b6001600160a01b0390811690811561032f57600c54908116821461031d5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561039257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b610341565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b038211176103c857604052565b610397565b608081019081106001600160401b038211176103c857604052565b606081019081106001600160401b038211176103c857604052565b90601f801991011681019081106001600160401b038211176103c857604052565b604051906102e082018281106001600160401b038211176103c857604052565b60405190610451826103ad565b565b60405190610451826103e8565b6040519061028082018281106001600160401b038211176103c857604052565b9060405161048d816103ad565b6020600182946001600160401b0381541684520154910152565b3461026257602036600319011261026257600435600e54811015610262576104d0608091610357565b5061051b8154916104eb60016001600160401b039201610480565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b346102625760008060031936011261059a5760809060409060608251610542816103cd565b82815282602082015282848201520152805161055d816103cd565b6004549182825260055460208301908152600654908284019182526060600754940193845282519485525160208501525190830152516060820152f35b80fd5b34610262576000366003190112610262576060604051600181526000602082015260006040820152f35b35906001600160401b038216820361026257565b606090600319011261026257604051906105f4826103e8565b816001600160401b03600435818116810361026257825260243590811681036102625760208201526040604435910152565b6040906063190112610262576040519061063f826103ad565b60643582526084356020830152565b60409060a31901126102625760405190610667826103ad565b60a435825260c4356020830152565b60409060e3190112610262576040519061068f826103ad565b60e4358252610104356020830152565b60409061012319011261026257604051906106b9826103ad565b610124358252610144356020830152565b60409061016319011261026257604051906106e4826103ad565b610164358252610184356020830152565b6040906101a3190112610262576040519061070f826103ad565b6101a43582526101c4356020830152565b6040906101e3190112610262576040519061073a826103ad565b6101e4358252610204356020830152565b6040906102231901126102625760405190610765826103ad565b610224358252610244356020830152565b6040906102631901126102625760405190610790826103ad565b610264358252610284356020830152565b6040906102a319011261026257604051906107bb826103ad565b6102a43582526102c4356020830152565b6040906102e319011261026257604051906107e6826103ad565b6102e4358252610304356020830152565b6040906103231901126102625760405190610811826103ad565b610324358252610344356020830152565b604090610363190112610262576040519061083c826103ad565b610364358252610384356020830152565b34610262576104e036600319011261026257610868366105db565b610480366063190112610262576109a390610881610424565b9061088b36610626565b82526108963661064e565b60208301526108a436610676565b60408301526108b23661069f565b60608301526108c0366106ca565b60808301526108ce366106f5565b60a08301526108dc36610720565b60c08301526108ea3661074b565b60e08301526108f836610776565b610100830152610907366107a1565b610120830152610916366107cc565b610140830152610925366107f7565b61016083015261093436610822565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c083015261160f565b005b3461026257602036600319011261026257600f805460ff19166001179055600435601055005b6001600160401b0381116103c85760051b60200190565b346102625760208060031936011261026257600435906001600160401b038211610262573660238301121561026257816004013591610a20836109cb565b91604093610a3085519485610403565b80845260248285019160071b8401019236841161026257602401905b838210610a5c576109a38561186f565b813603608081126102625786805191610a74836103e8565b610a7d856105c7565b8352610a8a8686016105c7565b83870152603f1901126102625760809184918851610aa7816103ad565b610ab28a87016105c7565b815260608601358482015289820152815201910190610a4c565b346102625760003660031901126102625760206001600160401b03600d5416604051908152f35b3461026257600036600319011261026257600c546040516001600160a01b039091168152602090f35b34610262576000366003190112610262576020600254604051908152f35b3461026257600036600319011261026257610b53611919565b50610bb7604051610b63816103e8565b6008546001600160401b0390818116835260401c16602082015260095460408201526040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b0390f35b6001600160401b0381116103c857601f01601f191660200190565b60408060031936011261026257610beb61024c565b6024356001600160401b038111610262573660238201121561026257806004013590610c1682610bbb565b91610c2385519384610403565b80835260209136602483830101116102625781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610d79575b50610d68579080600492610c8e611cac565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610d39575b5050610cfe578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612c968339815191528193929303610d20576109a38383612afa565b8351632a87526960e21b81526004810191909152602490fd5b610d59929350803d10610d61575b610d518183610403565b810190612445565b903880610cd8565b503d610d47565b845163703e46dd60e11b8152600490fd5b905081600080516020612c968339815191525416141538610c7c565b34610262576000366003190112610262577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610dee576020604051600080516020612c968339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610262576000366003190112610262576020600154604051908152f35b346102625760008060031936011261059a57610e38611cac565b600c5460ff8160a01c1660001461031d576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b60809060631901126102625760405190610e96826103cd565b6064358252608435602083015260a435604083015260c4356060830152565b34610262576080366003190112610262576020610ef8604051610ed7816103cd565b6004358152602435838201526044356040820152606435606082015261196a565b604051908152f35b346102625760008060031936011261059a57610f1a611cac565b600080516020612c7683398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610262576000366003190112610262576020600054604051908152f35b3461026257600036600319011261026257610fa2611919565b50610bb7610fae611938565b6040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b34610262576020366003190112610262576040610ffe6004356119eb565b61051b82518092602080916001600160401b0381511684520151910152565b3461026257600036600319011261026257600080516020612c76833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff8216820361026257565b346102625760203660031901126102625760043563ffffffff80821680830361026257611091611cac565b610e1081109182156110db575b50506110c957600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c1610159050388061109e565b346102625761012036600319011261026257611108366105db565b61111136610e7d565b9061111a611053565b611122610267565b90600080516020612cb683398151915254936001600160401b0360ff8660401c1615951680159081611232575b6001149081611228575b15908161121f575b5061120d57600080516020612cb6833981519152805467ffffffffffffffff1916600117905561119593856111e857611aae565b61119b57005b600080516020612cb6833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2908060208101610318565b600080516020612cb6833981519152805460ff60401b1916600160401b179055611aae565b60405163f92ee8a960e01b8152600490fd5b90501538611161565b303b159150611159565b86915061114f565b3461026257600036600319011261026257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b3461026257600036600319011261026257608060045460055460065460075491604051938452602084015260408301526060820152f35b346102625760003660031901126102625760408051906112cb826103ad565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106113165784604081866000838284010152601f80199101168101030190f35b85810183015185820183015282016112f4565b34610262576060366003190112610262576040611345366105db565b6001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55600080f35b3461026257600036600319011261026257602060ff600c5460a01c166040519015158152f35b3461026257600036600319011261026257602063ffffffff600c5460a81c16604051908152f35b3461026257600036600319011261026257600f805460ff19169055005b34610262576000366003190112610262576020600354604051908152f35b3461026257600036600319011261026257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b34610262576040366003190112610262576004356024359060ff600f541660009060001461149357509061147f610bb792601054906119de565b115b60405190151581529081906020820190565b91600e5491438111801561156b575b6114f8576114b084936119cf565b926114d26114c6600d546001600160401b031690565b6001600160401b031690565b935b811561150a575b5090919250156114f857610bb7926114f2916119de565b11611481565b60405163b0b4387760e01b8152600490fd5b826115286114c661151a84610357565b50546001600160401b031690565b1115611551575b6002811061154c5784811461154c5761154790612454565b6114d4565b6114db565b94505060016115656114c661151a87610357565b9461152f565b50600383106114a2565b34610262576020366003190112610262576109a361159161024c565b611599611cac565b611c38565b34610262576000366003190112610262576020600e54604051908152f35b634e487b7160e01b600052600060045260246000fd5b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c16908161174a575b506117385781516001600160401b031661164c6114c661163f6119a2565b516001600160401b031690565b6001600160401b0380921611801590611701575b6116ef577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae69061169e60408501936116988551611ce5565b856121ca565b6116a7846115d2565b6116b6848242168343166122fc565b6116db60206116cc86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b03168161172f6114c660206117216119a2565b01516001600160401b031690565b91161115611660565b6040516301474c8f60e71b8152600490fd5b6001600160a01b0316331415905038611621565b634e487b7160e01b600052601160045260246000fd5b9061178b5760028160008093558260018201550155565b6115bc565b8051156103925760200190565b8051600110156103925760400190565b8051600210156103925760600190565b8051600310156103925760800190565b80518210156103925760209160051b010190565b600e54600160401b8110156103c8578060016118009201600e55610357565b91909161178b57805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b90600e546000600e55806118ac575b5060005b82518110156118a757806118a161189b600193866117cd565b516117e1565b01611882565b509050565b6003908060030290600382040361191457600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd908101905b8181106118f657505061187e565b8061190e849260026000918281558260018201550155565b016118e8565b61175e565b60405190611926826103e8565b60006040838281528260208201520152565b60405190611945826103e8565b81600a546001600160401b0390818116835260401c1660208201526040600b54910152565b602081015190606060408201519101516040519160208301938452604083015260608201526060815261199c816103cd565b51902090565b6119aa611919565b506119b3611938565b90565b604051906119c3826103ad565b60006020838281520152565b60001981019190821161191457565b9190820391821161191457565b6119f36119b6565b50600e5490611a09611a04836119cf565b610357565b5090611a236114c66001809401546001600160401b031690565b811015611a9c57611a3f6114c6600d546001600160401b031690565b838110611a61575050506001611a5a611a046119b3936119cf565b5001610480565b81611a816114c685611a7285610357565b5001546001600160401b031690565b11611a8d578201611a3f565b6119b39350611a5a9150610357565b604051631856a49960e21b8152600490fd5b919092611ac590611abd612ba1565b611599612ba1565b611acd612ba1565b6001600160401b039081611ae884516001600160401b031690565b1615801590611c19575b8015611c0d575b8015611c01575b8015611bf5575b8015611bec575b611bda5761045193611ba9611bcf92611b5e866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b8251600455602083015160055560408301516006556060830151600755611b84866115d2565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b611bca611bb58261196a565b91826000555191611bc583600155565b600255565b600355565b8042169043166122fc565b6040516350dd03f760e11b8152600490fd5b50835115611b0e565b50606084015115611b07565b50604084015115611b00565b50602084015115611af9565b50611c316114c660208501516001600160401b031690565b1515611af2565b6001600160a01b03908116908115611c9357600080516020612c7683398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612c76833981519152546001600160a01b03163303611ccd57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611d0e57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103c85760405260088252610100366020840137565b90816020910312610262575180151581036102625790565b90815180825260208080930193019160005b828110611db8575050505090565b835185529381019392810192600101611daa565b61046090611de583825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611e43610100928386019060208091805184520151910152565b60a081015191611e63610140938487019060208091805184520151910152565b60c082015192611e83610180948588019060208091805184520151910152565b60e083015191611ea36101c0938489019060208091805184520151910152565b830151611ec0610200918289019060208091805184520151910152565b61012084015191611ee161024093848a019060208091805184520151910152565b84015192611eff61028094858a019060208091805184520151910152565b611f3a61016086015196611f236102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b9392906121b6610451936104e0926121a76102606109609280518b52602081015160208c0152611fe3604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c01526121918b61202f60a08401516101008093019060208091805184520151910152565b6121628d6103c060c0860151612055610140918285019060208091805184520151910152565b61213560e088015195612078610180978887019060208091805184520151910152565b8801516120956101c0918287019060208091805184520151910152565b6121066101208a0151936120b9610200958689019060208091805184520151910152565b8a0151976120d7610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611d98565b940190611dcc565b6040513d6000823e3d90fd5b6020906121d561256d565b60406121df611d53565b926001546121ec85611790565b526122016114c682516001600160401b031690565b61220a8561179d565b526122216114c6868301516001600160401b031690565b61222a856117ad565b520151612236836117bd565b526122556040519485938493630c76545d60e21b855260048501611fa1565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af49081156122c657600091612297575b501561228557565b6040516309bde33960e01b8152600490fd5b6122b9915060203d6020116122bf575b6122b18183610403565b810190611d80565b3861227d565b503d6122a7565b6121be565b6001600160401b03918216908216039190821161191457565b6001600160401b038091169081146119145760010190565b909161236b61045193600e5480151590816123d1575b50612375575b604061232e60208501516001600160401b031690565b93015161234b61233c610444565b6001600160401b039095168552565b602084015261235b61233c610453565b6001600160401b03166020840152565b60408201526117e1565b61239361238d611a04600d546001600160401b031690565b90611774565b6123cc6123b06123ab600d546001600160401b031690565b6122e4565b6001600160401b03166001600160401b0319600d541617600d55565b612318565b61241491506123e5611a046123f6926119cf565b505460401c6001600160401b031690565b61240e6123e5611a04600d546001600160401b031690565b906122cb565b6001600160401b0361243b612432600c5463ffffffff9060a81c1690565b63ffffffff1690565b9116101538612312565b90816020910312610262575190565b8015611914576000190190565b612469610460565b90600082526000602083015261247d6119b6565b604083015261248a6119b6565b60608301526124976119b6565b60808301526124a46119b6565b60a08301526124b16119b6565b60c08301526124be6119b6565b60e08301526124cb6119b6565b6101008301526124d96119b6565b6101208301526124e76119b6565b6101408301526124f56119b6565b6101608301526125036119b6565b6101808301526125116119b6565b6101a083015261251f6119b6565b6101c083015261252d6119b6565b6101e083015261253b6119b6565b6102008301526125496119b6565b6102208301526125576119b6565b6102408301526125656119b6565b610260830152565b612575612461565b906201000082527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab37060206008818501527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b81604086017f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee818151525101527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c81606086017f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d8151525101527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d381608086017f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac88151525101527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea8160a086017f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c8398151525101527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b68160c086017f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce78151525101527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d8160e086017f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a68151525101527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b8161010086017f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f8151525101527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c148161012086017f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e088151525101527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba8161014086017f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e78151525101527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f8161016086017f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba6550228151525101527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e8161018086017f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df28151525101527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b816101a086017f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f78151525101527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc28816101c086017f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec738151525101527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d45690915824816101e086017f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508038151525101527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf8161020086017f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a8151525101527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab8161022086017f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db448151525101527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be18161024086017f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a7581515251015261026084017f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9815152510152565b90813b15612b8057600080516020612c9683398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612b6557612b6291612bd0565b50565b505034612b6e57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612cb68339815191525460401c1615612bbe57565b604051631afcd79f60e31b8152600490fd5b6000806119b393602081519101845af43d15612c0e573d91612bf183610bbb565b92612bff6040519485610403565b83523d6000602085013e612c12565b6060915b90612c395750805115612c2757805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612c6c575b612c4a575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612c4256fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a0346200057857620030b938819003601f8101601f191683016001600160401b03811184821017620004aa57839282916040528339810103610100811262000578576060811262000578576080604051916200005c836200057d565b620000678462000599565b8352620000776020850162000599565b602084015260408401516040840152605f19011262000578576040519160808301906001600160401b03821184831017620004aa5760e091604052606081015184526080810151602085015260a0810151604085015260c08101516060850152015163ffffffff811681036200057857306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8160401c1662000566576002600160401b03196001600160401b038216016200051a575b505081516001600160401b03161580159062000503575b8015620004f6575b8015620004e9575b8015620004dc575b8015620004d2575b620004c05760018060401b03825116908160085468010000000000000000600160801b03602086015160401b1691829160018060801b031916171760085560408401519182600955855160045560208601519283600555604087015192836006556060880151958660075560018060801b0319600a54161717600a55600b55600c549063ffffffff60a81b9060a81b169063ffffffff60a81b1916179283600c55604051916020830193845260408301526060820152606081526080810181811060018060401b03821117620004aa57604052519020600093818555519081600155600255600355600e5490811515918262000433575b5050620003a4575b602081015160409182015182519290916001600160401b039081169184019081118482101762000390576040528252602082015260405190620002ad826200057d565b6001600160401b03438116835242166020830190815260408301918252600e54909290680100000000000000008110156200039057806001620002f49201600e55620005ae565b9490946200037c575051835492516001600160801b03199093166001600160401b0391821617604093841b6fffffffffffffffff000000000000000016178455905180516001850180546001600160401b0319169190931617909155602001516002929092019190915551612ad49081620005e58239608051818181610b1f0152610c770152f35b634e487b7160e01b81526004819052602490fd5b634e487b7160e01b85526041600452602485fd5b600d54620003bb906001600160401b0316620005ae565b6200041f5782815560018101839055600201829055600d546001600160401b038082169081146200040b576001600160401b03199091166001919091016001600160401b031617600d556200026a565b634e487b7160e01b84526011600452602484fd5b634e487b7160e01b83526004839052602483fd5b90915060001981019081116200040b576200044e90620005ae565b5054600d546001600160401b0360409290921c821691620004709116620005ae565b505460401c6001600160401b03908116909103919082116200040b5760a81c63ffffffff166001600160401b039091161015388062000262565b634e487b7160e01b600052604160045260246000fd5b6040516350dd03f760e11b8152600490fd5b508251156200016b565b5060608301511562000163565b506040830151156200015b565b5060208301511562000153565b5060208201516001600160401b031615156200014b565b6001600160401b0319166001600160401b039081179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388062000134565b60405163f92ee8a960e01b8152600490fd5b600080fd5b606081019081106001600160401b03821117620004aa57604052565b51906001600160401b03821682036200057857565b600e54811015620005ce57600e6000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461021757806302b592f3146102125780630d8e6e2c1461020d5780632063d4f7146102085780632d52aad6146102035780632f5f4600146101fe5780632f79889d146101f9578063313df7b1146101f4578063382b215a146101ef5780634f1ef286146101ea57806352d1902d146101e557806362827733146101e057806369cc6a04146101db5780636f96bdae146101d6578063715018a6146101d157806376b6b7cb146101cc5780638584d23f146101c75780638da5cb5b146101c257806396c1ca61146101bd5780639baa3cc9146101b85780639fdb54a7146101b3578063a9a9c9f5146101ae578063ad3cb1cc146101a9578063b5adea3c146101a4578063bd32519a1461019f578063c23b9e9e1461019a578063c8e5e49814610195578063ca6fe85514610190578063d24d933d1461018b578063e030330114610186578063f2fde38b146101815763f9e50d191461017c57600080fd5b61141d565b6113f4565b6112c4565b611289565b61126b565b61124e565b611227565b611201565b6111a8565b61112b565b6110f4565b6110b5565b610f68565b610ee1565b610e98565b610e5b565b610e3d565b610dd2565b610d87565b610ced565b610ccf565b610c64565b610aa5565b610a6c565b610a43565b610a1c565b610932565b6108f5565b61079d565b6104ed565b610477565b61024e565b600435906001600160a01b038216820361023257565b600080fd5b61010435906001600160a01b038216820361023257565b346102325760203660031901126102325761026761021c565b61026f611a9e565b6001600160a01b039081169081156102ff57600c5490811682146102ed5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561036257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b610311565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761039857604052565b610367565b606081019081106001600160401b0382111761039857604052565b608081019081106001600160401b0382111761039857604052565b90601f801991011681019081106001600160401b0382111761039857604052565b604051906102e082018281106001600160401b0382111761039857604052565b604051906104218261037d565b565b604051906104218261039d565b6040519061028082018281106001600160401b0382111761039857604052565b9060405161045d8161037d565b6020600182946001600160401b0381541684520154910152565b3461023257602036600319011261023257600435600e54811015610232576104a0608091610327565b506104eb8154916104bb60016001600160401b039201610450565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610232576000366003190112610232576060604051600181526000602082015260006040820152f35b35906001600160401b038216820361023257565b606090600319011261023257604051906105448261039d565b816001600160401b03600435818116810361023257825260243590811681036102325760208201526040604435910152565b6040906063190112610232576040519061058f8261037d565b60643582526084356020830152565b60409060a319011261023257604051906105b78261037d565b60a435825260c4356020830152565b60409060e319011261023257604051906105df8261037d565b60e4358252610104356020830152565b60409061012319011261023257604051906106098261037d565b610124358252610144356020830152565b60409061016319011261023257604051906106348261037d565b610164358252610184356020830152565b6040906101a3190112610232576040519061065f8261037d565b6101a43582526101c4356020830152565b6040906101e3190112610232576040519061068a8261037d565b6101e4358252610204356020830152565b60409061022319011261023257604051906106b58261037d565b610224358252610244356020830152565b60409061026319011261023257604051906106e08261037d565b610264358252610284356020830152565b6040906102a3190112610232576040519061070b8261037d565b6102a43582526102c4356020830152565b6040906102e319011261023257604051906107368261037d565b6102e4358252610304356020830152565b60409061032319011261023257604051906107618261037d565b610324358252610344356020830152565b604090610363190112610232576040519061078c8261037d565b610364358252610384356020830152565b34610232576104e0366003190112610232576107b83661052b565b610480366063190112610232576108f3906107d16103f4565b906107db36610576565b82526107e63661059e565b60208301526107f4366105c6565b6040830152610802366105ef565b60608301526108103661061a565b608083015261081e36610645565b60a083015261082c36610670565b60c083015261083a3661069b565b60e0830152610848366106c6565b610100830152610857366106f1565b6101208301526108663661071c565b61014083015261087536610747565b61016083015261088436610772565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c083015261148e565b005b3461023257602036600319011261023257600f805460ff19166001179055600435601055005b6001600160401b0381116103985760051b60200190565b346102325760208060031936011261023257600435906001600160401b0382116102325736602383011215610232578160040135916109708361091b565b91604093610980855194856103d3565b80845260248285019160071b8401019236841161023257602401905b8382106109ac576108f3856116c3565b8136036080811261023257868051916109c48361039d565b6109cd85610517565b83526109da868601610517565b83870152603f19011261023257608091849188516109f78161037d565b610a028a8701610517565b81526060860135848201528982015281520191019061099c565b346102325760003660031901126102325760206001600160401b03600d5416604051908152f35b3461023257600036600319011261023257600c546040516001600160a01b039091168152602090f35b34610232576000366003190112610232576020600254604051908152f35b6001600160401b03811161039857601f01601f191660200190565b60408060031936011261023257610aba61021c565b6024356001600160401b038111610232573660238201121561023257806004013590610ae582610a8a565b91610af2855193846103d3565b80835260209136602483830101116102325781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610c48575b50610c37579080600492610b5d611a9e565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610c08575b5050610bcd578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612a888339815191528193929303610bef576108f383836128ec565b8351632a87526960e21b81526004810191909152602490fd5b610c28929350803d10610c30575b610c2081836103d3565b810190612237565b903880610ba7565b503d610c16565b845163703e46dd60e11b8152600490fd5b905081600080516020612a888339815191525416141538610b4b565b34610232576000366003190112610232577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610cbd576020604051600080516020612a888339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610232576000366003190112610232576020600154604051908152f35b3461023257600080600319360112610d4c57610d07611a9e565b600c5460ff8160a01c166000146102ed576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b60809060631901126102325760405190610d68826103b8565b6064358252608435602083015260a435604083015260c4356060830152565b34610232576080366003190112610232576020610dca604051610da9816103b8565b6004358152602435838201526044356040820152606435606082015261176d565b604051908152f35b3461023257600080600319360112610d4c57610dec611a9e565b600080516020612a6883398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610232576000366003190112610232576020600054604051908152f35b34610232576020366003190112610232576040610e796004356117da565b6104eb82518092602080916001600160401b0381511684520151910152565b3461023257600036600319011261023257600080516020612a68833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff8216820361023257565b346102325760203660031901126102325760043563ffffffff80821680830361023257610f0c611a9e565b610e108110918215610f56575b5050610f4457600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610f19565b346102325761012036600319011261023257610f833661052b565b610f8c36610d4f565b90610f95610ece565b610f9d610237565b90600080516020612aa883398151915254936001600160401b0360ff8660401c16159516801590816110ad575b60011490816110a3575b15908161109a575b5061108857600080516020612aa8833981519152805467ffffffffffffffff191660011790556110109385611063576118a0565b61101657005b600080516020612aa8833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102e8565b600080516020612aa8833981519152805460ff60401b1916600160401b1790556118a0565b60405163f92ee8a960e01b8152600490fd5b90501538610fdc565b303b159150610fd4565b869150610fca565b3461023257600036600319011261023257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b0390f35b3461023257600036600319011261023257608060045460055460065460075491604051938452602084015260408301526060820152f35b3461023257600036600319011261023257604080519061114a8261037d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106111955784604081866000838284010152601f80199101168101030190f35b8581018301518582018301528201611173565b346102325760603660031901126102325760406111c43661052b565b6001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55600080f35b3461023257600036600319011261023257602060ff600c5460a01c166040519015158152f35b3461023257600036600319011261023257602063ffffffff600c5460a81c16604051908152f35b3461023257600036600319011261023257600f805460ff19169055005b34610232576000366003190112610232576020600354604051908152f35b3461023257600036600319011261023257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b34610232576040366003190112610232576004356024359060ff600f54166000906000146113125750906112fe6110f092601054906117cd565b115b60405190151581529081906020820190565b91600e549143811180156113ea575b6113775761132f84936117be565b92611351611345600d546001600160401b031690565b6001600160401b031690565b935b8115611389575b509091925015611377576110f092611371916117cd565b11611300565b60405163b0b4387760e01b8152600490fd5b826113a761134561139984610327565b50546001600160401b031690565b11156113d0575b600281106113cb578481146113cb576113c690612246565b611353565b61135a565b94505060016113e461134561139987610327565b946113ae565b5060038310611321565b34610232576020366003190112610232576108f361141061021c565b611418611a9e565b611a2a565b34610232576000366003190112610232576020600e54604051908152f35b634e487b7160e01b600052600060045260246000fd5b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c16908161159e575b5061158c578151600a546001600160401b03918183169083161180159190611565575b50611553577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae69061150260408501936114fc8551611ad7565b85611fbc565b61150b84611451565b61151a848242168343166120ee565b61153f602061153086516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b9050818061157d60208701516001600160401b031690565b9260401c1691161115386114c3565b6040516301474c8f60e71b8152600490fd5b6001600160a01b03163314159050386114a0565b634e487b7160e01b600052601160045260246000fd5b906115df5760028160008093558260018201550155565b61143b565b8051156103625760200190565b8051600110156103625760400190565b8051600210156103625760600190565b8051600310156103625760800190565b80518210156103625760209160051b010190565b600e54600160401b811015610398578060016116549201600e55610327565b9190916115df57805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b90600e546000600e5580611700575b5060005b82518110156116fb57806116f56116ef60019386611621565b51611635565b016116d6565b509050565b6003908060030290600382040361176857600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd908101905b81811061174a5750506116d2565b80611762849260026000918281558260018201550155565b0161173c565b6115b2565b602081015190606060408201519101516040519160208301938452604083015260608201526060815261179f816103b8565b51902090565b604051906117b28261037d565b60006020838281520152565b60001981019190821161176857565b9190820391821161176857565b6117e26117a5565b50600e54906117f86117f3836117be565b610327565b50906118126113456001809401546001600160401b031690565b81101561188e5761182e611345600d546001600160401b031690565b8381106118535750505060016118496117f3611850936117be565b5001610450565b90565b816118736113458561186485610327565b5001546001600160401b031690565b1161187f57820161182e565b61185093506118499150610327565b604051631856a49960e21b8152600490fd5b9190926118b7906118af612993565b611418612993565b6118bf612993565b6001600160401b0390816118da84516001600160401b031690565b1615801590611a0b575b80156119ff575b80156119f3575b80156119e7575b80156119de575b6119cc576104219361199b6119c192611950866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b825160045560208301516005556040830151600655606083015160075561197686611451565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b6119bc6119a78261176d565b918260005551916119b783600155565b600255565b600355565b8042169043166120ee565b6040516350dd03f760e11b8152600490fd5b50835115611900565b506060840151156118f9565b506040840151156118f2565b506020840151156118eb565b50611a2361134560208501516001600160401b031690565b15156118e4565b6001600160a01b03908116908115611a8557600080516020612a6883398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612a68833981519152546001600160a01b03163303611abf57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611b0057565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103985760405260088252610100366020840137565b90816020910312610232575180151581036102325790565b90815180825260208080930193019160005b828110611baa575050505090565b835185529381019392810192600101611b9c565b61046090611bd783825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611c35610100928386019060208091805184520151910152565b60a081015191611c55610140938487019060208091805184520151910152565b60c082015192611c75610180948588019060208091805184520151910152565b60e083015191611c956101c0938489019060208091805184520151910152565b830151611cb2610200918289019060208091805184520151910152565b61012084015191611cd361024093848a019060208091805184520151910152565b84015192611cf161028094858a019060208091805184520151910152565b611d2c61016086015196611d156102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b939290611fa8610421936104e092611f996102606109609280518b52602081015160208c0152611dd5604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c0152611f838b611e2160a08401516101008093019060208091805184520151910152565b611f548d6103c060c0860151611e47610140918285019060208091805184520151910152565b611f2760e088015195611e6a610180978887019060208091805184520151910152565b880151611e876101c0918287019060208091805184520151910152565b611ef86101208a015193611eab610200958689019060208091805184520151910152565b8a015197611ec9610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611b8a565b940190611bbe565b6040513d6000823e3d90fd5b602090611fc761235f565b6040611fd1611b45565b92600154611fde856115e4565b52611ff361134582516001600160401b031690565b611ffc856115f1565b52612013611345868301516001600160401b031690565b61201c85611601565b52015161202883611611565b526120476040519485938493630c76545d60e21b855260048501611d93565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af49081156120b857600091612089575b501561207757565b6040516309bde33960e01b8152600490fd5b6120ab915060203d6020116120b1575b6120a381836103d3565b810190611b72565b3861206f565b503d612099565b611fb0565b6001600160401b03918216908216039190821161176857565b6001600160401b038091169081146117685760010190565b909161215d61042193600e5480151590816121c3575b50612167575b604061212060208501516001600160401b031690565b93015161213d61212e610414565b6001600160401b039095168552565b602084015261214d61212e610423565b6001600160401b03166020840152565b6040820152611635565b61218561217f6117f3600d546001600160401b031690565b906115c8565b6121be6121a261219d600d546001600160401b031690565b6120d6565b6001600160401b03166001600160401b0319600d541617600d55565b61210a565b61220691506121d76117f36121e8926117be565b505460401c6001600160401b031690565b6122006121d76117f3600d546001600160401b031690565b906120bd565b6001600160401b0361222d612224600c5463ffffffff9060a81c1690565b63ffffffff1690565b9116101538612104565b90816020910312610232575190565b8015611768576000190190565b61225b610430565b90600082526000602083015261226f6117a5565b604083015261227c6117a5565b60608301526122896117a5565b60808301526122966117a5565b60a08301526122a36117a5565b60c08301526122b06117a5565b60e08301526122bd6117a5565b6101008301526122cb6117a5565b6101208301526122d96117a5565b6101408301526122e76117a5565b6101608301526122f56117a5565b6101808301526123036117a5565b6101a08301526123116117a5565b6101c083015261231f6117a5565b6101e083015261232d6117a5565b61020083015261233b6117a5565b6102208301526123496117a5565b6102408301526123576117a5565b610260830152565b612367612253565b906201000082527f08e80a5c8e4c9b9f26f3003cc59403a18d3136afd030868d25cc8b807e2ab37060206008818501527f16b88dc7439a6d841e1a1103f5a3d2d2440137f18d02763503bac7b45dcb983b81604086017f013d1d4b425179258b577860397955cbfa0816e32b1c25a1fd734c91b951ee818151525101527f169ba15107f2eff9b9341bf30742a838d27dbd69e88b2353dca8592f15f1111c81606086017f0c3c864f195f59119927f53857f1de8bf575941748b735351fd31373c7875c2d8151525101527f0326ff06391ed5d26ec1bc080b8d46014ee22c0c68ed022f1620c4d9d38437d381608086017f11d4ceb15961d10b6156ae3d09bb78b4df45fb8543060884e7d400755beb4ac88151525101527e1379342a4d77d4708743aff01ff27aa11917478fdc8e2b7d463081735772ea8160a086017f23610cb43e21033c368a93622dd405b905a0eb344c98b9d7cf08b0c5ebf7c8398151525101527f25280b124624911c7f87b4c2d87f59c6c07e3eeeb10d614da216f6219ffe50b68160c086017f194daf85d9eed9937b28e2a680fcc5a76922c15cd31dc4f600e14939b8200ce78151525101527f1bae9f36e6190738c711501be53f299bf61348e61e2ef9d577760e64f629368d8160e086017f04882ef39899ea38c9677a48b8f8cc6a67284e17ff940289faaa359eec9b33a68151525101527f0b25394da5a1d435daccc2eadd039e2c2709f5f42fabd9afba815ed62d6af36b8161010086017f2d810d30120cb93e1a254b89ed0ae86c761f49b4f129459cd534f9551851350f8151525101527f1a0255ec8c7c8769335bc9dc6b222ac6a04e766d08b45c8cc573592c05bc9c148161012086017f1c2ce7be570bea9e43f3d3d7cbca84bdb4fc89b53ae657531de72670a6105e088151525101527f272eb7d633cedb68ce0113f4420ab5610b81b8ba1ab9348db15761d40e8df5ba8161014086017f1c164159136b8f5b4773e133f483a8a192ab15d6d3ee012f171b3d02fd4506e78151525101527f033e195a9ea3a9ce40b72b673afb45444ca1b15f0543f44d10f5c640a780676f8161016086017f0e446639aa6caf25e93ef747084e39b8ea90abf23bb48c28fd5f9ba7ba6550228151525101527f0f4c69895451af15052aa81a03eba9752c9e7891dd08e264e0bd593d0357858e8161018086017f0e8db2b2893df23d3c55f0b3a3b54ab2e2ed775b31c4c90e472eb31582582df28151525101527f1f4dcf4dd484e3ab1ae487603d2245397ac78fe6ca7584645eba3926d383902b816101a086017f2bc091fefe2416ec83c6fba8fb82fb48cb9ca00182ec792c212bf5532958c8f78151525101527f19eb12a7827c0ddf6383fe806c3953bd06b08aae7bf2a01f55c986a84f50cc28816101c086017f2daf78c5a2829a9418081dd7e8743a683ed6817996f75f10009d99220793ec738151525101527f1ffd789b155b8acb13e0f6a48b50f7aa8092540888d009141057d45690915824816101e086017f015691308846e68ea856a2cb24c9903f0c8605dea190829180ff6bdd1c6508038151525101527f16b7f250842ecf4e3690706a1e152d7a57f70f556f92076da785fdd363c19fcf8161020086017f0545ac7aa66dcf3719988438c806fc624de57ab43f8580392f88c86c1378ce4a8151525101527f149f415744707468bdaa4e8545201ab40d1931a7d31f23768fa7c65574ee3eab8161022086017f20cb7ff35a83a7dc314036e470f14c30fb0e98d35d663b243b222caa6fc7db448151525101527f0a521ff30c8f3666798f847c5d4c379658fba10156e7a9499f2713fae9bf2be18161024086017f0a25c1b7573906dc4e193b4ea82fd1fe7ccebc4d925dad26f0ff09c84c9f1a7581515251015261026084017f03db6510c3f13629fded9a5a2d41654bbce4ef6d024cad53100051d4a3f3ebc9815152510152565b90813b1561297257600080516020612a8883398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511561295757612954916129c2565b50565b50503461296057565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612aa88339815191525460401c16156129b057565b604051631afcd79f60e31b8152600490fd5b60008061185093602081519101845af43d15612a00573d916129e383610a8a565b926129f160405194856103d3565b83523d6000602085013e612a04565b6060915b90612a2b5750805115612a1957805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612a5e575b612a3c575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612a3456fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json index 9d36c0f26..5ed45a2f2 100644 --- a/contract-bindings/artifacts/LightClient_bytecode.json +++ b/contract-bindings/artifacts/LightClient_bytecode.json @@ -1 +1 @@ -"0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b604051612a8e90816100d28239608051818181610ad50152610c2d0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461020757806302b592f3146102025780630c693a22146101fd5780630d8e6e2c146101f85780632063d4f7146101f35780632f79889d146101ee578063313df7b1146101e9578063382b215a146101e45780634847ae5d146101df5780634f1ef286146101da57806352d1902d146101d557806362827733146101d057806369cc6a04146101cb5780636f96bdae146101c6578063715018a6146101c157806376b6b7cb146101bc57806382d07ff3146101b75780638584d23f146101b25780638da5cb5b146101ad57806396c1ca61146101a85780639baa3cc9146101a35780639fdb54a71461019e578063a9a9c9f514610199578063ad3cb1cc14610194578063bd32519a1461018f578063c23b9e9e1461018a578063ca6fe85514610185578063d24d933d14610180578063e03033011461017b578063f2fde38b146101765763f9e50d191461017157600080fd5b611382565b611359565b611254565b611219565b6111fb565b6111d4565b6111ae565b611131565b6110fa565b6110bf565b610f72565b610eeb565b610ea2565b610e65565b610e0e565b610df0565b610d85565b610d3a565b610ca3565b610c85565b610c1a565b610a5b565b6109bf565b6109a1565b610978565b610951565b6107f9565b61055d565b6104dd565b610467565b61023e565b600435906001600160a01b038216820361022257565b600080fd5b61010435906001600160a01b038216820361022257565b346102225760203660031901126102225761025761020c565b61025f6118e7565b6001600160a01b039081169081156102ef57600c5490811682146102dd5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561035257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b610301565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761038857604052565b610357565b608081019081106001600160401b0382111761038857604052565b606081019081106001600160401b0382111761038857604052565b90601f801991011681019081106001600160401b0382111761038857604052565b604051906102e082018281106001600160401b0382111761038857604052565b604051906104118261036d565b565b60405190610411826103a8565b6040519061028082018281106001600160401b0382111761038857604052565b9060405161044d8161036d565b6020600182946001600160401b0381541684520154910152565b3461022257602036600319011261022257600435600e5481101561022257610490608091610317565b506104db8154916104ab60016001600160401b039201610440565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b346102225760008060031936011261055a57608090604090606082516105028161038d565b82815282602082015282848201520152805161051d8161038d565b6004549182825260055460208301908152600654908284019182526060600754940193845282519485525160208501525190830152516060820152f35b80fd5b34610222576000366003190112610222576060604051600181526000602082015260006040820152f35b606090600319011261022257604051906105a0826103a8565b816001600160401b03600435818116810361022257825260243590811681036102225760208201526040604435910152565b604090606319011261022257604051906105eb8261036d565b60643582526084356020830152565b60409060a319011261022257604051906106138261036d565b60a435825260c4356020830152565b60409060e3190112610222576040519061063b8261036d565b60e4358252610104356020830152565b60409061012319011261022257604051906106658261036d565b610124358252610144356020830152565b60409061016319011261022257604051906106908261036d565b610164358252610184356020830152565b6040906101a319011261022257604051906106bb8261036d565b6101a43582526101c4356020830152565b6040906101e319011261022257604051906106e68261036d565b6101e4358252610204356020830152565b60409061022319011261022257604051906107118261036d565b610224358252610244356020830152565b604090610263190112610222576040519061073c8261036d565b610264358252610284356020830152565b6040906102a319011261022257604051906107678261036d565b6102a43582526102c4356020830152565b6040906102e319011261022257604051906107928261036d565b6102e4358252610304356020830152565b60409061032319011261022257604051906107bd8261036d565b610324358252610344356020830152565b60409061036319011261022257604051906107e88261036d565b610364358252610384356020830152565b34610222576104e03660031901126102225761081436610587565b6104803660631901126102225761094f9061082d6103e4565b90610837366105d2565b8252610842366105fa565b602083015261085036610622565b604083015261085e3661064b565b606083015261086c36610676565b608083015261087a366106a1565b60a0830152610888366106cc565b60c0830152610896366106f7565b60e08301526108a436610722565b6101008301526108b33661074d565b6101208301526108c236610778565b6101408301526108d1366107a3565b6101608301526108e0366107ce565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c08301526113dd565b005b346102225760003660031901126102225760206001600160401b03600d5416604051908152f35b3461022257600036600319011261022257600c546040516001600160a01b039091168152602090f35b34610222576000366003190112610222576020600254604051908152f35b34610222576000366003190112610222576109d861152c565b50610a3c6040516109e8816103a8565b6008546001600160401b0390818116835260401c16602082015260095460408201526040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b0390f35b6001600160401b03811161038857601f01601f191660200190565b60408060031936011261022257610a7061020c565b6024356001600160401b038111610222573660238201121561022257806004013590610a9b82610a40565b91610aa8855193846103c3565b80835260209136602483830101116102225781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610bfe575b50610bed579080600492610b136118e7565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610bbe575b5050610b83578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612a428339815191528193929303610ba55761094f83836128a6565b8351632a87526960e21b81526004810191909152602490fd5b610bde929350803d10610be6575b610bd681836103c3565b8101906121fd565b903880610b5d565b503d610bcc565b845163703e46dd60e11b8152600490fd5b905081600080516020612a428339815191525416141538610b01565b34610222576000366003190112610222577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610c73576020604051600080516020612a428339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610222576000366003190112610222576020600154604051908152f35b346102225760008060031936011261055a57610cbd6118e7565b600c5460ff8160a01c166000146102dd576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b60809060631901126102225760405190610d1b8261038d565b6064358252608435602083015260a435604083015260c4356060830152565b34610222576080366003190112610222576020610d7d604051610d5c8161038d565b6004358152602435838201526044356040820152606435606082015261157d565b604051908152f35b346102225760008060031936011261055a57610d9f6118e7565b600080516020612a2283398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610222576000366003190112610222576020600054604051908152f35b3461022257600036600319011261022257610e2761152c565b50610a3c610e3361154b565b6040519182918291909160408060608301946001600160401b0380825116855260208201511660208501520151910152565b34610222576020366003190112610222576040610e83600435611619565b6104db82518092602080916001600160401b0381511684520151910152565b3461022257600036600319011261022257600080516020612a22833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff8216820361022257565b346102225760203660031901126102225760043563ffffffff80821680830361022257610f166118e7565b610e108110918215610f60575b5050610f4e57600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610f23565b346102225761012036600319011261022257610f8d36610587565b610f9636610d02565b90610f9f610ed8565b610fa7610227565b90600080516020612a6283398151915254936001600160401b0360ff8660401c16159516801590816110b7575b60011490816110ad575b1590816110a4575b5061109257600080516020612a62833981519152805467ffffffffffffffff1916600117905561101a938561106d576116dc565b61102057005b600080516020612a62833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102d8565b600080516020612a62833981519152805460ff60401b1916600160401b1790556116dc565b60405163f92ee8a960e01b8152600490fd5b90501538610fe6565b303b159150610fde565b869150610fd4565b3461022257600036600319011261022257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b3461022257600036600319011261022257608060045460055460065460075491604051938452602084015260408301526060820152f35b346102225760003660031901126102225760408051906111508261036d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b83811061119b5784604081866000838284010152601f80199101168101030190f35b8581018301518582018301528201611179565b3461022257600036600319011261022257602060ff600c5460a01c166040519015158152f35b3461022257600036600319011261022257602063ffffffff600c5460a81c16604051908152f35b34610222576000366003190112610222576020600354604051908152f35b3461022257600036600319011261022257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b3461022257604036600319011261022257600435600e54438211801561134f575b6112dc576000916112876000926115f8565b916112a961129d600d546001600160401b031690565b6001600160401b031690565b925b81156112ee575b50909150156112dc576112cb610a3c926024359261160c565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b8261130c61129d6112fe84610317565b50546001600160401b031690565b1115611335575b60028110611330578381146113305761132b90611866565b6112ab565b6112b2565b935050600161134961129d6112fe86610317565b93611313565b5060038110611275565b346102225760203660031901126102225761094f61137561020c565b61137d6118e7565b611873565b34610222576000366003190112610222576020600e54604051908152f35b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c169081611518575b506115065781516001600160401b031661141a61129d61140d6115b5565b516001600160401b031690565b6001600160401b03809216118015906114cf575b6114bd577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae69061146c60408501936114668551611920565b85611e42565b611475846113a0565b611484848242168343166120b4565b6114a9602061149a86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b5060208301516001600160401b0316816114fd61129d60206114ef6115b5565b01516001600160401b031690565b9116111561142e565b6040516301474c8f60e71b8152600490fd5b6001600160a01b03163314159050386113ef565b60405190611539826103a8565b60006040838281528260208201520152565b60405190611558826103a8565b81600a546001600160401b0390818116835260401c1660208201526040600b54910152565b60208101519060606040820151910151604051916020830193845260408301526060820152606081526115af8161038d565b51902090565b6115bd61152c565b506115c661154b565b90565b604051906115d68261036d565b60006020838281520152565b634e487b7160e01b600052601160045260246000fd5b60001981019190821161160757565b6115e2565b9190820391821161160757565b6116216115c9565b50600e5490611637611632836115f8565b610317565b509061165161129d6001809401546001600160401b031690565b8110156116ca5761166d61129d600d546001600160401b031690565b83811061168f5750505060016116886116326115c6936115f8565b5001610440565b816116af61129d856116a085610317565b5001546001600160401b031690565b116116bb57820161166d565b6115c693506116889150610317565b604051631856a49960e21b8152600490fd5b9190926116f3906116eb61294d565b61137d61294d565b6116fb61294d565b6001600160401b03908161171684516001600160401b031690565b1615801590611847575b801561183b575b801561182f575b8015611823575b801561181a575b61180857610411936117d76117fd9261178c866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b82516004556020830151600555604083015160065560608301516007556117b2866113a0565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b6117f86117e38261157d565b918260005551916117f383600155565b600255565b600355565b8042169043166120b4565b6040516350dd03f760e11b8152600490fd5b5083511561173c565b50606084015115611735565b5060408401511561172e565b50602084015115611727565b5061185f61129d60208501516001600160401b031690565b1515611720565b8015611607576000190190565b6001600160a01b039081169081156118ce57600080516020612a2283398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612a22833981519152546001600160a01b0316330361190857565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561194957565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103885760405260088252610100366020840137565b8051156103525760200190565b8051600110156103525760400190565b8051600210156103525760600190565b8051600310156103525760800190565b90816020910312610222575180151581036102225790565b90815180825260208080930193019160005b828110611a30575050505090565b835185529381019392810192600101611a22565b61046090611a5d83825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611abb610100928386019060208091805184520151910152565b60a081015191611adb610140938487019060208091805184520151910152565b60c082015192611afb610180948588019060208091805184520151910152565b60e083015191611b1b6101c0938489019060208091805184520151910152565b830151611b38610200918289019060208091805184520151910152565b61012084015191611b5961024093848a019060208091805184520151910152565b84015192611b7761028094858a019060208091805184520151910152565b611bb261016086015196611b9b6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b939290611e2e610411936104e092611e1f6102606109609280518b52602081015160208c0152611c5b604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c0152611e098b611ca760a08401516101008093019060208091805184520151910152565b611dda8d6103c060c0860151611ccd610140918285019060208091805184520151910152565b611dad60e088015195611cf0610180978887019060208091805184520151910152565b880151611d0d6101c0918287019060208091805184520151910152565b611d7e6101208a015193611d31610200958689019060208091805184520151910152565b8a015197611d4f610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611a10565b940190611a44565b6040513d6000823e3d90fd5b602090611e4d612318565b6040611e5761198e565b92600154611e64856119bb565b52611e7961129d82516001600160401b031690565b611e82856119c8565b52611e9961129d868301516001600160401b031690565b611ea2856119d8565b520151611eae836119e8565b52611ecd6040519485938493630c76545d60e21b855260048501611c19565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af4908115611f3e57600091611f0f575b5015611efd57565b6040516309bde33960e01b8152600490fd5b611f31915060203d602011611f37575b611f2981836103c3565b8101906119f8565b38611ef5565b503d611f1f565b611e36565b6001600160401b03918216908216039190821161160757565b90611f735760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146116075760010190565b600e54600160401b811015610388576001810180600e5581101561035257602060037fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff92600e60005202926120ad6040857fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01926001600160401b03936120418583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe8601906001600160401b03166001600160401b0319825416179055565b0151910155565b909161212361041193600e548015159081612189575b5061212d575b60406120e660208501516001600160401b031690565b9301516121036120f4610404565b6001600160401b039095168552565b60208401526121136120f4610413565b6001600160401b03166020840152565b6040820152611fa1565b61214b612145611632600d546001600160401b031690565b90611f5c565b612184612168612163600d546001600160401b031690565b611f89565b6001600160401b03166001600160401b0319600d541617600d55565b6120d0565b6121cc915061219d6116326121ae926115f8565b505460401c6001600160401b031690565b6121c661219d611632600d546001600160401b031690565b90611f43565b6001600160401b036121f36121ea600c5463ffffffff9060a81c1690565b63ffffffff1690565b91161015386120ca565b90816020910312610222575190565b612214610420565b9060008252600060208301526122286115c9565b60408301526122356115c9565b60608301526122426115c9565b608083015261224f6115c9565b60a083015261225c6115c9565b60c08301526122696115c9565b60e08301526122766115c9565b6101008301526122846115c9565b6101208301526122926115c9565b6101408301526122a06115c9565b6101608301526122ae6115c9565b6101808301526122bc6115c9565b6101a08301526122ca6115c9565b6101c08301526122d86115c9565b6101e08301526122e66115c9565b6102008301526122f46115c9565b6102208301526123026115c9565b6102408301526123106115c9565b610260830152565b61232061220c565b906210000082527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d560206008818501527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c81604086017f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b338151525101527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e97081606086017f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db8151525101527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d81608086017f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b998151525101527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df600938160a086017f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a58066258151525101527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde288160c086017f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a98151525101527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc038160e086017f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b596938151525101527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad8161010086017f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e78151525101527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea170318161012086017f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e48151525101527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db70368161014086017f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae72488151525101527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e84158161016086017f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e56198151525101527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a38161018086017f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc88151525101527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c816101a086017f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc8151525101527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd5816101c086017f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b408151525101527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd3816101e086017f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc58151525101527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc8161020086017f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa48151525101527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e8161022086017f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a297822268151525101527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd48161024086017f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab261423981515251015261026084017f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82815152510152565b90813b1561292c57600080516020612a4283398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28051156129115761290e9161297c565b50565b50503461291a57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612a628339815191525460401c161561296a57565b604051631afcd79f60e31b8152600490fd5b6000806115c693602081519101845af43d156129ba573d9161299d83610a40565b926129ab60405194856103c3565b83523d6000602085013e6129be565b6060915b906129e557508051156129d357805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612a18575b6129f6575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156129ee56fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b60405161288090816100d282396080518181816109a40152610afc0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc146101d757806302b592f3146101d25780630d8e6e2c146101cd5780632063d4f7146101c85780632f79889d146101c3578063313df7b1146101be578063382b215a146101b95780634f1ef286146101b457806352d1902d146101af57806362827733146101aa57806369cc6a04146101a55780636f96bdae146101a0578063715018a61461019b57806376b6b7cb146101965780638584d23f146101915780638da5cb5b1461018c57806396c1ca61146101875780639baa3cc9146101825780639fdb54a71461017d578063a9a9c9f514610178578063ad3cb1cc14610173578063bd32519a1461016e578063c23b9e9e14610169578063ca6fe85514610164578063d24d933d1461015f578063e03033011461015a578063f2fde38b146101555763f9e50d191461015057600080fd5b611201565b6111d8565b6110d3565b611098565b61107a565b611053565b61102d565b610fb0565b610f79565b610f3a565b610ded565b610d66565b610d1d565b610ce0565b610cc2565b610c57565b610c0c565b610b72565b610b54565b610ae9565b61092a565b6108f1565b6108c8565b6108a1565b610749565b6104ad565b610437565b61020e565b600435906001600160a01b03821682036101f257565b600080fd5b61010435906001600160a01b03821682036101f257565b346101f25760203660031901126101f2576102276101dc565b61022f6116d9565b6001600160a01b039081169081156102bf57600c5490811682146102ad5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561032257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b6102d1565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761035857604052565b610327565b606081019081106001600160401b0382111761035857604052565b608081019081106001600160401b0382111761035857604052565b90601f801991011681019081106001600160401b0382111761035857604052565b604051906102e082018281106001600160401b0382111761035857604052565b604051906103e18261033d565b565b604051906103e18261035d565b6040519061028082018281106001600160401b0382111761035857604052565b9060405161041d8161033d565b6020600182946001600160401b0381541684520154910152565b346101f25760203660031901126101f257600435600e548110156101f2576104606080916102e7565b506104ab81549161047b60016001600160401b039201610410565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b346101f25760003660031901126101f2576060604051600181526000602082015260006040820152f35b60609060031901126101f257604051906104f08261035d565b816001600160401b0360043581811681036101f257825260243590811681036101f25760208201526040604435910152565b60409060631901126101f2576040519061053b8261033d565b60643582526084356020830152565b60409060a31901126101f257604051906105638261033d565b60a435825260c4356020830152565b60409060e31901126101f2576040519061058b8261033d565b60e4358252610104356020830152565b6040906101231901126101f257604051906105b58261033d565b610124358252610144356020830152565b6040906101631901126101f257604051906105e08261033d565b610164358252610184356020830152565b6040906101a31901126101f2576040519061060b8261033d565b6101a43582526101c4356020830152565b6040906101e31901126101f257604051906106368261033d565b6101e4358252610204356020830152565b6040906102231901126101f257604051906106618261033d565b610224358252610244356020830152565b6040906102631901126101f2576040519061068c8261033d565b610264358252610284356020830152565b6040906102a31901126101f257604051906106b78261033d565b6102a43582526102c4356020830152565b6040906102e31901126101f257604051906106e28261033d565b6102e4358252610304356020830152565b6040906103231901126101f2576040519061070d8261033d565b610324358252610344356020830152565b6040906103631901126101f257604051906107388261033d565b610364358252610384356020830152565b346101f2576104e03660031901126101f257610764366104d7565b6104803660631901126101f25761089f9061077d6103b4565b9061078736610522565b82526107923661054a565b60208301526107a036610572565b60408301526107ae3661059b565b60608301526107bc366105c6565b60808301526107ca366105f1565b60a08301526107d83661061c565b60c08301526107e636610647565b60e08301526107f436610672565b6101008301526108033661069d565b610120830152610812366106c8565b610140830152610821366106f3565b6101608301526108303661071e565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c083015261125c565b005b346101f25760003660031901126101f25760206001600160401b03600d5416604051908152f35b346101f25760003660031901126101f257600c546040516001600160a01b039091168152602090f35b346101f25760003660031901126101f2576020600254604051908152f35b6001600160401b03811161035857601f01601f191660200190565b6040806003193601126101f25761093f6101dc565b6024356001600160401b0381116101f257366023820112156101f25780600401359061096a8261090f565b9161097785519384610393565b80835260209136602483830101116101f25781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610acd575b50610abc5790806004926109e26116d9565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610a8d575b5050610a52578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b6000805160206128348339815191528193929303610a745761089f8383612698565b8351632a87526960e21b81526004810191909152602490fd5b610aad929350803d10610ab5575b610aa58183610393565b810190611fef565b903880610a2c565b503d610a9b565b845163703e46dd60e11b8152600490fd5b90508160008051602061283483398151915254161415386109d0565b346101f25760003660031901126101f2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610b425760206040516000805160206128348339815191528152f35b60405163703e46dd60e11b8152600490fd5b346101f25760003660031901126101f2576020600154604051908152f35b346101f257600080600319360112610bd157610b8c6116d9565b600c5460ff8160a01c166000146102ad576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b60809060631901126101f25760405190610bed82610378565b6064358252608435602083015260a435604083015260c4356060830152565b346101f25760803660031901126101f2576020610c4f604051610c2e81610378565b60043581526024358382015260443560408201526064356060820152611380565b604051908152f35b346101f257600080600319360112610bd157610c716116d9565b60008051602061281483398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b346101f25760003660031901126101f2576020600054604051908152f35b346101f25760203660031901126101f2576040610cfe600435611408565b6104ab82518092602080916001600160401b0381511684520151910152565b346101f25760003660031901126101f257600080516020612814833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff821682036101f257565b346101f25760203660031901126101f25760043563ffffffff8082168083036101f257610d916116d9565b610e108110918215610ddb575b5050610dc957600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610d9e565b346101f2576101203660031901126101f257610e08366104d7565b610e1136610bd4565b90610e1a610d53565b610e226101f7565b9060008051602061285483398151915254936001600160401b0360ff8660401c1615951680159081610f32575b6001149081610f28575b159081610f1f575b50610f0d57600080516020612854833981519152805467ffffffffffffffff19166001179055610e959385610ee8576114ce565b610e9b57005b600080516020612854833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102a8565b600080516020612854833981519152805460ff60401b1916600160401b1790556114ce565b60405163f92ee8a960e01b8152600490fd5b90501538610e61565b303b159150610e59565b869150610e4f565b346101f25760003660031901126101f257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b0390f35b346101f25760003660031901126101f257608060045460055460065460075491604051938452602084015260408301526060820152f35b346101f25760003660031901126101f2576040805190610fcf8261033d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b83811061101a5784604081866000838284010152601f80199101168101030190f35b8581018301518582018301528201610ff8565b346101f25760003660031901126101f257602060ff600c5460a01c166040519015158152f35b346101f25760003660031901126101f257602063ffffffff600c5460a81c16604051908152f35b346101f25760003660031901126101f2576020600354604051908152f35b346101f25760003660031901126101f257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b346101f25760403660031901126101f257600435600e5443821180156111ce575b61115b576000916111066000926113e7565b9161112861111c600d546001600160401b031690565b6001600160401b031690565b925b811561116d575b509091501561115b5761114a610f7592602435926113fb565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b8261118b61111c61117d846102e7565b50546001600160401b031690565b11156111b4575b600281106111af578381146111af576111aa90611658565b61112a565b611131565b93505060016111c861111c61117d866102e7565b93611192565b50600381106110f4565b346101f25760203660031901126101f25761089f6111f46101dc565b6111fc6116d9565b611665565b346101f25760003660031901126101f2576020600e54604051908152f35b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c16908161136c575b5061135a578151600a546001600160401b03918183169083161180159190611333575b50611321577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906112d060408501936112ca8551611712565b85611c34565b6112d98461121f565b6112e884824216834316611ea6565b61130d60206112fe86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b9050818061134b60208701516001600160401b031690565b9260401c169116111538611291565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861126e565b60208101519060606040820151910151604051916020830193845260408301526060820152606081526113b281610378565b51902090565b604051906113c58261033d565b60006020838281520152565b634e487b7160e01b600052601160045260246000fd5b6000198101919082116113f657565b6113d1565b919082039182116113f657565b6114106113b8565b50600e5490611426611421836113e7565b6102e7565b509061144061111c6001809401546001600160401b031690565b8110156114bc5761145c61111c600d546001600160401b031690565b83811061148157505050600161147761142161147e936113e7565b5001610410565b90565b816114a161111c85611492856102e7565b5001546001600160401b031690565b116114ad57820161145c565b61147e935061147791506102e7565b604051631856a49960e21b8152600490fd5b9190926114e5906114dd61273f565b6111fc61273f565b6114ed61273f565b6001600160401b03908161150884516001600160401b031690565b1615801590611639575b801561162d575b8015611621575b8015611615575b801561160c575b6115fa576103e1936115c96115ef9261157e866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b82516004556020830151600555604083015160065560608301516007556115a48661121f565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b6115ea6115d582611380565b918260005551916115e583600155565b600255565b600355565b804216904316611ea6565b6040516350dd03f760e11b8152600490fd5b5083511561152e565b50606084015115611527565b50604084015115611520565b50602084015115611519565b5061165161111c60208501516001600160401b031690565b1515611512565b80156113f6576000190190565b6001600160a01b039081169081156116c05760008051602061281483398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612814833981519152546001600160a01b031633036116fa57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561173b57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519061012082018281106001600160401b038211176103585760405260088252610100366020840137565b8051156103225760200190565b8051600110156103225760400190565b8051600210156103225760600190565b8051600310156103225760800190565b908160209103126101f2575180151581036101f25790565b90815180825260208080930193019160005b828110611822575050505090565b835185529381019392810192600101611814565b6104609061184f83825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e08401526080810151906118ad610100928386019060208091805184520151910152565b60a0810151916118cd610140938487019060208091805184520151910152565b60c0820151926118ed610180948588019060208091805184520151910152565b60e08301519161190d6101c0938489019060208091805184520151910152565b83015161192a610200918289019060208091805184520151910152565b6101208401519161194b61024093848a019060208091805184520151910152565b8401519261196961028094858a019060208091805184520151910152565b6119a46101608601519661198d6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b939290611c206103e1936104e092611c116102606109609280518b52602081015160208c0152611a4d604082015160408d019060208091805184520151910152565b6060810151805160808d01526020015160a08c01526080810151805160c08d01526020015160e08c0152611bfb8b611a9960a08401516101008093019060208091805184520151910152565b611bcc8d6103c060c0860151611abf610140918285019060208091805184520151910152565b611b9f60e088015195611ae2610180978887019060208091805184520151910152565b880151611aff6101c0918287019060208091805184520151910152565b611b706101208a015193611b23610200958689019060208091805184520151910152565b8a015197611b41610240998a89019060208091805184520151910152565b6101608b01518051610280890152602001516102a08801528a015180516102c0880152602001516102e0870152565b6101a0890151805161030087015260200151610320860152880151805161034086015260200151610360850152565b6101e08701518051610380850152602001516103a084015286015191019060208091805184520151910152565b61022083015180516104008f0152602001516104208e015282015180516104408e0152602001516104608d0152565b015180516104808b0152602001516104a08a0152565b806104c0890152870190611802565b940190611836565b6040513d6000823e3d90fd5b602090611c3f61210a565b6040611c49611780565b92600154611c56856117ad565b52611c6b61111c82516001600160401b031690565b611c74856117ba565b52611c8b61111c868301516001600160401b031690565b611c94856117ca565b520151611ca0836117da565b52611cbf6040519485938493630c76545d60e21b855260048501611a0b565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af4908115611d3057600091611d01575b5015611cef57565b6040516309bde33960e01b8152600490fd5b611d23915060203d602011611d29575b611d1b8183610393565b8101906117ea565b38611ce7565b503d611d11565b611c28565b6001600160401b0391821690821603919082116113f657565b90611d655760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146113f65760010190565b600e54600160401b811015610358576001810180600e5581101561032257602060037fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff92600e6000520292611e9f6040857fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01926001600160401b0393611e338583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe8601906001600160401b03166001600160401b0319825416179055565b0151910155565b9091611f156103e193600e548015159081611f7b575b50611f1f575b6040611ed860208501516001600160401b031690565b930151611ef5611ee66103d4565b6001600160401b039095168552565b6020840152611f05611ee66103e3565b6001600160401b03166020840152565b6040820152611d93565b611f3d611f37611421600d546001600160401b031690565b90611d4e565b611f76611f5a611f55600d546001600160401b031690565b611d7b565b6001600160401b03166001600160401b0319600d541617600d55565b611ec2565b611fbe9150611f8f611421611fa0926113e7565b505460401c6001600160401b031690565b611fb8611f8f611421600d546001600160401b031690565b90611d35565b6001600160401b03611fe5611fdc600c5463ffffffff9060a81c1690565b63ffffffff1690565b9116101538611ebc565b908160209103126101f2575190565b6120066103f0565b90600082526000602083015261201a6113b8565b60408301526120276113b8565b60608301526120346113b8565b60808301526120416113b8565b60a083015261204e6113b8565b60c083015261205b6113b8565b60e08301526120686113b8565b6101008301526120766113b8565b6101208301526120846113b8565b6101408301526120926113b8565b6101608301526120a06113b8565b6101808301526120ae6113b8565b6101a08301526120bc6113b8565b6101c08301526120ca6113b8565b6101e08301526120d86113b8565b6102008301526120e66113b8565b6102208301526120f46113b8565b6102408301526121026113b8565b610260830152565b612112611ffe565b906210000082527f2ce6cc664a32147bfe6a0c94a95bf0496679405ccae01648cd4ec021145120d560206008818501527f03a0a9acc3e3815a7ed6cb1379f7d157e6343164729376392a693acbd3ec283c81604086017f20c9403133dfde9a9d382df76fb0523571648725abc0a7c12830bb690ec83b338151525101527f21be232a42246a5663ebf483470cca666ffe9d4f0e63b929c596a7658714e97081606086017f2866c18ad1df10ef13542cce6250ce02cb2a6b72ae00a9852e271187e9e4e0db8151525101527f0be0f448839080132d47de17de0099b4cd74ae1e6b71cdda06cdebb868a50c6d81608086017f07d77873b9860074118e75808c79468b83c8ed64ba14db5cb5afa8e534de7b998151525101527f18f95cdda42ce11d9d10a3b335acc214e3807c578c5359405d810c208df600938160a086017f13bd45a023491eadea44cc3f24cfbd1796eade9c0e39ee81d9f63ea0a58066258151525101527f28c2217f7bacf6f8b2b8ee4a90fcf8b5bca04205ea84e8e1eb54b85dd41bde288160c086017f0970d978763461f09e9ec63454073497386e4d282fedc2ac5b967cb9fd3fa8a98151525101527f202c3e390cee7c5c8525da2329a19f4936f6f71ca97dde6c6fa32b382d5acc038160e086017f02fe3d02988db718380052970aba46a3296df5f29b736ba1f2c4ccffc8b596938151525101527f1c8c2b856cdade256ba3237f39afd5e170a9532012f7aecae49d459b29f6f6ad8161010086017f23ac10ae6ca5cacee8744bb939aaa835390954b91ae668a2c8d0edda558a89e78151525101527f29392152723097e07113c3d7786d245ec40c30928015cd50b5668a4f4ea170318161012086017f16ec03d260bd7ac1c50ffa63565d5274b4582ceea52ff40b81cdfe8f444f01e48151525101527f07fea127dae943b8dc148f1408d40cff465c9c4721943669b1e4fd5a39db70368161014086017f2cdbfb3a4053c8489b0c94e74338ac19118df7a06bc56b1eb4d0e0dc4eae72488151525101527f118623e6bc136ee6d3f9907cd4ad04a9418ea03ba99ad753227cdfee598e84158161016086017f031455a79a2e0ce78a6cb53526ec04ac19716a86b08a93df48d178f8b77e56198151525101527f0805e392bcbc12e40a722778632d73fe981e4bc6fa6d1178b70af7be1cb9a3a38161018086017f0861d1997761a852226aac7ba9717bf6ae56451099be774cdf02ef352a58cbc88151525101527f089eb9c727e6cb07082bc3e6f40cf04f439fe48000602b584774dad7efc6607c816101a086017f101d1e3978cb9f1e303d413144ebe67682c9eb0cfe11242959aa6029d78cdbbc8151525101527f18e45d627aadd4df2794ecd9909fac1a753f0c6fa8a9c6654a7a58b0912fffd5816101c086017f2d489f2493263aa873bcd94f21efb45bf257a61d81c0c95c3297916506653b408151525101527f0eaba9f429c5f6fc3103d4cc4056c500ff42425d8e6465c5b8e145219f9c5cd3816101e086017f0e43e3a4b13cb438e2ad924614261ad0240214fa1c83fcda6a0bf779eb39ffc58151525101527f2b7bc74608d7ec7dadd0597d6a4010d8bfc2b31900281901cedc42bdbb0fb8fc8161020086017f29ae351d09dcf41c0a80ab05393738358baab37e6fbc464b3bb13258994a1fa48151525101527f27ec80e811e636f3348267923c8e641bd98a7e37c5216670cbff14ae323f9e0e8161022086017f066802c7ceb9e913d4f65433a20661e097acac1affecbb534a54f76a297822268151525101527f1588579e6c3378ea32cb641205ef762a63cd353a0bd670394528ad2081ee8dd48161024086017f12604d1f87c583f6c9710c73eaf590af9d07aa743d1381d0e9dff0eab261423981515251015261026084017f247d65261d3a4ab042ba937331f6d0c0c5eb9ea78753a92084db1a6939e19e82815152510152565b90813b1561271e5760008051602061283483398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612703576127009161276e565b50565b50503461270c57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff6000805160206128548339815191525460401c161561275c57565b604051631afcd79f60e31b8152600490fd5b60008061147e93602081519101845af43d156127ac573d9161278f8361090f565b9261279d6040519485610393565b83523d6000602085013e6127b0565b6060915b906127d757508051156127c557805190602001fd5b604051630a12f52160e11b8152600490fd5b8151158061280a575b6127e8575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156127e056fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/src/light_client.rs b/contract-bindings/src/light_client.rs index 6f8fe5894..362695980 100644 --- a/contract-bindings/src/light_client.rs +++ b/contract-bindings/src/light_client.rs @@ -206,71 +206,6 @@ pub mod light_client { 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), - ],), - 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("getGenesisStakeState"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("getGenesisStakeState",), - 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(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.StakeState",), - ), - },], - 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), - ],), - 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("getHotShotCommitment"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -1176,30 +1111,6 @@ pub mod light_client { .method_hash([210, 77, 147, 61], ()) .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 `getGenesisStakeState` (0x0c693a22) function - pub fn get_genesis_stake_state( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([12, 105, 58, 34], ()) - .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 `getHotShotCommitment` (0x8584d23f) function pub fn get_hot_shot_commitment( &self, @@ -2541,51 +2452,6 @@ pub mod light_client { )] #[ethcall(name = "genesisState", abi = "genesisState()")] pub struct GenesisStateCall; - ///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 `getGenesisStakeState` function with signature `getGenesisStakeState()` and selector `0x0c693a22` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "getGenesisStakeState", abi = "getGenesisStakeState()")] - pub struct GetGenesisStakeStateCall; - ///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 `getHotShotCommitment` function with signature `getHotShotCommitment(uint256)` and selector `0x8584d23f` #[derive( Clone, @@ -2938,9 +2804,6 @@ pub mod light_client { FrozenThreshold(FrozenThresholdCall), GenesisStakeState(GenesisStakeStateCall), GenesisState(GenesisStateCall), - GetFinalizedState(GetFinalizedStateCall), - GetGenesisStakeState(GetGenesisStakeStateCall), - GetGenesisState(GetGenesisStateCall), GetHotShotCommitment(GetHotShotCommitmentCall), GetStateHistoryCount(GetStateHistoryCountCall), GetVersion(GetVersionCall), @@ -3006,21 +2869,6 @@ pub mod light_client { { return Ok(Self::GenesisState(decoded)); } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::GetFinalizedState(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::GetGenesisStakeState(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::GetGenesisState(decoded)); - } if let Ok(decoded) = ::decode(data) { @@ -3136,11 +2984,6 @@ pub mod light_client { Self::FrozenThreshold(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GenesisStakeState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::GetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::GetGenesisStakeState(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::GetGenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GetHotShotCommitment(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -3199,9 +3042,6 @@ pub mod light_client { Self::FrozenThreshold(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisStakeState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisState(element) => ::core::fmt::Display::fmt(element, f), - Self::GetFinalizedState(element) => ::core::fmt::Display::fmt(element, f), - Self::GetGenesisStakeState(element) => ::core::fmt::Display::fmt(element, f), - Self::GetGenesisState(element) => ::core::fmt::Display::fmt(element, f), Self::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f), Self::GetStateHistoryCount(element) => ::core::fmt::Display::fmt(element, f), Self::GetVersion(element) => ::core::fmt::Display::fmt(element, f), @@ -3267,21 +3107,6 @@ pub mod light_client { Self::GenesisState(value) } } - impl ::core::convert::From for LightClientCalls { - fn from(value: GetFinalizedStateCall) -> Self { - Self::GetFinalizedState(value) - } - } - impl ::core::convert::From for LightClientCalls { - fn from(value: GetGenesisStakeStateCall) -> Self { - Self::GetGenesisStakeState(value) - } - } - impl ::core::convert::From for LightClientCalls { - fn from(value: GetGenesisStateCall) -> Self { - Self::GetGenesisState(value) - } - } impl ::core::convert::From for LightClientCalls { fn from(value: GetHotShotCommitmentCall) -> Self { Self::GetHotShotCommitment(value) @@ -3493,48 +3318,6 @@ pub mod light_client { pub block_height: u64, pub block_comm_root: ::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 `getGenesisStakeState` function with signature `getGenesisStakeState()` and selector `0x0c693a22` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct GetGenesisStakeStateReturn(pub StakeState); - ///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 `getHotShotCommitment` function with signature `getHotShotCommitment(uint256)` and selector `0x8584d23f` #[derive( Clone, diff --git a/contract-bindings/src/light_client_mock.rs b/contract-bindings/src/light_client_mock.rs index 82bd9134d..b661f831b 100644 --- a/contract-bindings/src/light_client_mock.rs +++ b/contract-bindings/src/light_client_mock.rs @@ -237,71 +237,6 @@ pub mod light_client_mock { 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), - ],), - 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("getGenesisStakeState"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("getGenesisStakeState",), - 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(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.StakeState",), - ), - },], - 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), - ],), - 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("getHotShotCommitment"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -1284,30 +1219,6 @@ pub mod light_client_mock { .method_hash([210, 77, 147, 61], ()) .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 `getGenesisStakeState` (0x0c693a22) function - pub fn get_genesis_stake_state( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([12, 105, 58, 34], ()) - .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 `getHotShotCommitment` (0x8584d23f) function pub fn get_hot_shot_commitment( &self, @@ -2686,51 +2597,6 @@ pub mod light_client_mock { )] #[ethcall(name = "genesisState", abi = "genesisState()")] pub struct GenesisStateCall; - ///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 `getGenesisStakeState` function with signature `getGenesisStakeState()` and selector `0x0c693a22` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "getGenesisStakeState", abi = "getGenesisStakeState()")] - pub struct GetGenesisStakeStateCall; - ///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 `getHotShotCommitment` function with signature `getHotShotCommitment(uint256)` and selector `0x8584d23f` #[derive( Clone, @@ -3155,9 +3021,6 @@ pub mod light_client_mock { FrozenThreshold(FrozenThresholdCall), GenesisStakeState(GenesisStakeStateCall), GenesisState(GenesisStateCall), - GetFinalizedState(GetFinalizedStateCall), - GetGenesisStakeState(GetGenesisStakeStateCall), - GetGenesisState(GetGenesisStateCall), GetHotShotCommitment(GetHotShotCommitmentCall), GetStateHistoryCount(GetStateHistoryCountCall), GetVersion(GetVersionCall), @@ -3227,21 +3090,6 @@ pub mod light_client_mock { { return Ok(Self::GenesisState(decoded)); } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::GetFinalizedState(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::GetGenesisStakeState(decoded)); - } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::GetGenesisState(decoded)); - } if let Ok(decoded) = ::decode(data) { @@ -3376,11 +3224,6 @@ pub mod light_client_mock { Self::FrozenThreshold(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GenesisStakeState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::GetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::GetGenesisStakeState(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } - Self::GetGenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GetHotShotCommitment(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -3445,9 +3288,6 @@ pub mod light_client_mock { Self::FrozenThreshold(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisStakeState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisState(element) => ::core::fmt::Display::fmt(element, f), - Self::GetFinalizedState(element) => ::core::fmt::Display::fmt(element, f), - Self::GetGenesisStakeState(element) => ::core::fmt::Display::fmt(element, f), - Self::GetGenesisState(element) => ::core::fmt::Display::fmt(element, f), Self::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f), Self::GetStateHistoryCount(element) => ::core::fmt::Display::fmt(element, f), Self::GetVersion(element) => ::core::fmt::Display::fmt(element, f), @@ -3517,21 +3357,6 @@ pub mod light_client_mock { Self::GenesisState(value) } } - impl ::core::convert::From for LightClientMockCalls { - fn from(value: GetFinalizedStateCall) -> Self { - Self::GetFinalizedState(value) - } - } - impl ::core::convert::From for LightClientMockCalls { - fn from(value: GetGenesisStakeStateCall) -> Self { - Self::GetGenesisStakeState(value) - } - } - impl ::core::convert::From for LightClientMockCalls { - fn from(value: GetGenesisStateCall) -> Self { - Self::GetGenesisState(value) - } - } impl ::core::convert::From for LightClientMockCalls { fn from(value: GetHotShotCommitmentCall) -> Self { Self::GetHotShotCommitment(value) @@ -3763,48 +3588,6 @@ pub mod light_client_mock { pub block_height: u64, pub block_comm_root: ::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 `getGenesisStakeState` function with signature `getGenesisStakeState()` and selector `0x0c693a22` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct GetGenesisStakeStateReturn(pub StakeState); - ///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 `getHotShotCommitment` function with signature `getHotShotCommitment(uint256)` and selector `0x8584d23f` #[derive( Clone, diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol index 566a10860..a296becfb 100644 --- a/contracts/src/LightClient.sol +++ b/contracts/src/LightClient.sol @@ -261,8 +261,8 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { } if ( - newState.viewNum <= getFinalizedState().viewNum - || newState.blockHeight <= getFinalizedState().blockHeight + newState.viewNum <= finalizedState.viewNum + || newState.blockHeight <= finalizedState.blockHeight ) { revert OutdatedState(); } @@ -280,21 +280,6 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { emit NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot); } - /// @dev Simple getter function for the genesis state - function getGenesisState() public view virtual returns (LightClientState memory) { - return genesisState; - } - - /// @dev Simple getter function for the genesis stake state - function getGenesisStakeState() public view virtual returns (StakeState memory) { - return genesisStakeState; - } - - /// @dev Simple getter function for the finalized state - function getFinalizedState() public view virtual returns (LightClientState memory) { - return finalizedState; - } - /// @notice Verify the Plonk proof, marked as `virtual` for easier testing as we can swap VK /// used in inherited contracts. function verifyProof(LightClientState memory state, IPlonkVerifier.PlonkProof memory proof) diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol index 6cc79aee7..62e27131c 100644 --- a/contracts/test/LightClient.t.sol +++ b/contracts/test/LightClient.t.sol @@ -88,8 +88,10 @@ contract LightClient_constructor_Test is LightClientCommonTest { /// @dev Test the constructor has initialized the contract state properly, especially genesis /// block. function test_CorrectInitialization() external view { - assertEq(abi.encode(lc.getGenesisState()), abi.encode(genesis)); - assertEq(abi.encode(lc.getFinalizedState()), abi.encode(genesis)); + (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot) = lc.genesisState(); + assertEq(viewNum, genesis.viewNum); + assertEq(blockHeight, genesis.blockHeight); + assertEq(abi.encode(blockCommRoot), abi.encode(genesis.blockCommRoot)); bytes32 stakeTableComm = lc.computeStakeTableComm(genesisStakeState); assertEq(lc.votingStakeTableCommitment(), stakeTableComm); @@ -368,14 +370,19 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); uint256 statesLen = states.length; - + uint64 viewNum; + uint64 blockHeight; + BN254.ScalarField blockCommRoot; for (uint256 i = 0; i < statesLen; i++) { vm.expectEmit(true, true, true, true); emit LC.NewState(states[i].viewNum, states[i].blockHeight, states[i].blockCommRoot); vm.prank(permissionedProver); lc.newFinalizedState(states[i], proofs[i]); - assertEq(abi.encode(lc.getFinalizedState()), abi.encode(states[i])); + (viewNum, blockHeight, blockCommRoot) = lc.finalizedState(); + assertEq(viewNum, states[i].viewNum); + assertEq(blockHeight, states[i].blockHeight); + assertEq(abi.encode(blockCommRoot), abi.encode(states[i].blockCommRoot)); bytes32 stakeTableComm = lc.computeStakeTableComm(stakeStates[i]); assertEq(lc.votingStakeTableCommitment(), stakeTableComm); diff --git a/contracts/test/LightClientUpgradeSameContract.t.sol b/contracts/test/LightClientUpgradeSameContract.t.sol index 4333de9ab..3146ab249 100644 --- a/contracts/test/LightClientUpgradeSameContract.t.sol +++ b/contracts/test/LightClientUpgradeSameContract.t.sol @@ -7,6 +7,7 @@ import { LightClient as LCV1 } from "../src/LightClient.sol"; import { LightClient as LCV2 } from "../src/LightClient.sol"; import { DeployLightClientContractScript } from "../script/LightClient.s.sol"; import { UpgradeLightClientScript } from "../script/UpgradeSameLightClient.s.sol"; +import { BN254 } from "bn254/BN254.sol"; contract LightClientUpgradeSameContractTest is Test { LCV1 public lcV1Proxy; @@ -30,9 +31,16 @@ contract LightClientUpgradeSameContractTest is Test { } function testCorrectInitialization() public view { - assertEq(abi.encode(lcV1Proxy.getGenesisState()), abi.encode(stateV1)); + (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot) = + lcV1Proxy.genesisState(); + assertEq(viewNum, stateV1.viewNum); + assertEq(blockHeight, stateV1.blockHeight); + assertEq(abi.encode(blockCommRoot), abi.encode(stateV1.blockCommRoot)); - assertEq(abi.encode(lcV1Proxy.getFinalizedState()), abi.encode(stateV1)); + (viewNum, blockHeight, blockCommRoot) = lcV1Proxy.finalizedState(); + assertEq(viewNum, stateV1.viewNum); + assertEq(blockHeight, stateV1.blockHeight); + assertEq(abi.encode(blockCommRoot), abi.encode(stateV1.blockCommRoot)); bytes32 stakeTableComm = lcV1Proxy.computeStakeTableComm(stakeStateV1); assertEq(lcV1Proxy.votingStakeTableCommitment(), stakeTableComm); @@ -51,7 +59,11 @@ contract LightClientUpgradeSameContractTest is Test { LCV2.LightClientState memory expectedLightClientState = LCV2.LightClientState(stateV1.viewNum, stateV1.blockHeight, stateV1.blockCommRoot); - assertEq(abi.encode(lcV2Proxy.getFinalizedState()), abi.encode(expectedLightClientState)); + (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot) = + lcV1Proxy.finalizedState(); + assertEq(viewNum, expectedLightClientState.viewNum); + assertEq(blockHeight, expectedLightClientState.blockHeight); + assertEq(abi.encode(blockCommRoot), abi.encode(expectedLightClientState.blockCommRoot)); } // check that the proxy address remains the same diff --git a/contracts/test/LightClientUpgradeToVx.t.sol b/contracts/test/LightClientUpgradeToVx.t.sol index 98ae33974..b6b5b79b0 100644 --- a/contracts/test/LightClientUpgradeToVx.t.sol +++ b/contracts/test/LightClientUpgradeToVx.t.sol @@ -12,6 +12,7 @@ import { UpgradeLightClientScript as ULCV3 } from "./UpgradeLightClientToV3.s.so import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import { BN254 } from "bn254/BN254.sol"; contract LightClientUpgradeToVxTest is Test { LCV1 public lcV1Proxy; @@ -37,9 +38,16 @@ contract LightClientUpgradeToVxTest is Test { } function testCorrectInitialization() public view { - assertEq(abi.encode(lcV1Proxy.getGenesisState()), abi.encode(stateV1)); + (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot) = + lcV1Proxy.genesisState(); + assertEq(viewNum, stateV1.viewNum); + assertEq(blockHeight, stateV1.blockHeight); + assertEq(abi.encode(blockCommRoot), abi.encode(stateV1.blockCommRoot)); - assertEq(abi.encode(lcV1Proxy.getFinalizedState()), abi.encode(stateV1)); + (viewNum, blockHeight, blockCommRoot) = lcV1Proxy.finalizedState(); + assertEq(viewNum, stateV1.viewNum); + assertEq(blockHeight, stateV1.blockHeight); + assertEq(abi.encode(blockCommRoot), abi.encode(stateV1.blockCommRoot)); bytes32 stakeTableComm = lcV1Proxy.computeStakeTableComm(stakeStateV1); assertEq(lcV1Proxy.votingStakeTableCommitment(), stakeTableComm); @@ -64,7 +72,12 @@ contract LightClientUpgradeToVxTest is Test { LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = LCV2.ExtendedLightClientState(0); - assertEq(abi.encode(lcV2Proxy.getFinalizedState()), abi.encode(expectedLightClientState)); + (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot) = + lcV2Proxy.finalizedState(); + assertEq(viewNum, expectedLightClientState.viewNum); + assertEq(blockHeight, expectedLightClientState.blockHeight); + assertEq(abi.encode(blockCommRoot), abi.encode(expectedLightClientState.blockCommRoot)); + assertEq( abi.encode(lcV2Proxy.getExtendedFinalizedState()), abi.encode(expectedExtendedLightClientState) @@ -87,7 +100,12 @@ contract LightClientUpgradeToVxTest is Test { LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = LCV2.ExtendedLightClientState(0); - assertEq(abi.encode(lcV2Proxy.getFinalizedState()), abi.encode(expectedLightClientState)); + (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot) = + lcV2Proxy.finalizedState(); + assertEq(viewNum, expectedLightClientState.viewNum); + assertEq(blockHeight, expectedLightClientState.blockHeight); + assertEq(abi.encode(blockCommRoot), abi.encode(expectedLightClientState.blockCommRoot)); + assertEq( abi.encode(lcV2Proxy.getExtendedFinalizedState()), abi.encode(expectedExtendedLightClientState) @@ -115,7 +133,12 @@ contract LightClientUpgradeToVxTest is Test { LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = LCV2.ExtendedLightClientState(0); - assertEq(abi.encode(lcV2Proxy.getFinalizedState()), abi.encode(expectedLightClientState)); + (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot) = + lcV2Proxy.finalizedState(); + assertEq(viewNum, expectedLightClientState.viewNum); + assertEq(blockHeight, expectedLightClientState.blockHeight); + assertEq(abi.encode(blockCommRoot), abi.encode(expectedLightClientState.blockCommRoot)); + assertEq( abi.encode(lcV2Proxy.getExtendedFinalizedState()), abi.encode(expectedExtendedLightClientState) @@ -127,7 +150,11 @@ contract LightClientUpgradeToVxTest is Test { assertEq(lcV3Proxy.newField(), myNewField); assertEq(lcV3Proxy.anotherField(), myNewFieldV3); - assertEq(abi.encode(lcV3Proxy.getFinalizedState()), abi.encode(expectedLightClientState)); + (viewNum, blockHeight, blockCommRoot) = lcV3Proxy.finalizedState(); + assertEq(viewNum, expectedLightClientState.viewNum); + assertEq(blockHeight, expectedLightClientState.blockHeight); + assertEq(abi.encode(blockCommRoot), abi.encode(expectedLightClientState.blockCommRoot)); + assertEq( abi.encode(lcV3Proxy.getExtendedFinalizedState()), abi.encode(expectedExtendedLightClientState) @@ -152,7 +179,12 @@ contract LightClientUpgradeToVxTest is Test { LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = LCV2.ExtendedLightClientState(0); - assertEq(abi.encode(lcV2Proxy.getFinalizedState()), abi.encode(expectedLightClientState)); + (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot) = + lcV2Proxy.finalizedState(); + assertEq(viewNum, expectedLightClientState.viewNum); + assertEq(blockHeight, expectedLightClientState.blockHeight); + assertEq(abi.encode(blockCommRoot), abi.encode(expectedLightClientState.blockCommRoot)); + assertEq( abi.encode(lcV2Proxy.getExtendedFinalizedState()), abi.encode(expectedExtendedLightClientState) @@ -164,7 +196,11 @@ contract LightClientUpgradeToVxTest is Test { assertEq(lcV3Proxy.newField(), myNewField); assertEq(lcV3Proxy.anotherField(), myNewFieldV3); - assertEq(abi.encode(lcV3Proxy.getFinalizedState()), abi.encode(expectedLightClientState)); + (viewNum, blockHeight, blockCommRoot) = lcV3Proxy.finalizedState(); + assertEq(viewNum, expectedLightClientState.viewNum); + assertEq(blockHeight, expectedLightClientState.blockHeight); + assertEq(abi.encode(blockCommRoot), abi.encode(expectedLightClientState.blockCommRoot)); + assertEq( abi.encode(lcV3Proxy.getExtendedFinalizedState()), abi.encode(expectedExtendedLightClientState) diff --git a/contracts/test/LightClientV2.sol b/contracts/test/LightClientV2.sol index a598ad70c..863869cd0 100644 --- a/contracts/test/LightClientV2.sol +++ b/contracts/test/LightClientV2.sol @@ -56,8 +56,8 @@ contract LightClientV2 is LightClient { IPlonkVerifier.PlonkProof memory proof ) external virtual override { if ( - newState.viewNum <= getFinalizedState().viewNum - || newState.blockHeight <= getFinalizedState().blockHeight + newState.viewNum <= finalizedState.viewNum + || newState.blockHeight <= finalizedState.blockHeight ) { revert OutdatedState(); } diff --git a/doc/zk-integration.md b/doc/zk-integration.md index 18266cbfd..a43c503af 100644 --- a/doc/zk-integration.md +++ b/doc/zk-integration.md @@ -81,7 +81,7 @@ contract RollupContract { /// Detects if the escape hatch is activated or not. function isEscapeHatchActivated() private returns (bool) { - if (lcContract.getFinalizedState().blockHeight > lastEspressoBlockNumber){ + if (lcContract.finalizedState().blockHeight > lastEspressoBlockNumber){ return false; } else { return lcContract.lagOverEscapeHatchThreshold(block.number, escapeHatchThreshold); @@ -205,7 +205,7 @@ contract RollupContract1 is RollupContract { if (isEscapeHatchActivated()){ this.updateStateBackupSequencingMode(commTxsRollup,newVMState,snarkProof); } else { // No escape hatch, use the state of Espresso consensus - lightClientState = lcContract.getFinalizedState(); + lightClientState = lcContract.finalizedState(); newEspressoState = lightClientState.blockCommRoot; blockNumberEspresso = lightClientState.blockHeight; this.updateStateFromEspresso(newEspressoState, blockNumberEspresso, commTxsRollup, newVMState, snarkProof); diff --git a/hotshot-state-prover/src/service.rs b/hotshot-state-prover/src/service.rs index edd649b93..c539449e4 100644 --- a/hotshot-state-prover/src/service.rs +++ b/hotshot-state-prover/src/service.rs @@ -296,7 +296,7 @@ pub async fn read_contract_state( light_client_address: Address, ) -> Result { let contract = prepare_contract(provider, key, light_client_address).await?; - let state: ParsedLightClientState = match contract.get_finalized_state().call().await { + let state: ParsedLightClientState = match contract.finalized_state().call().await { Ok(s) => s.into(), Err(e) => { tracing::error!("unable to read finalized_state from contract: {}", e); @@ -732,10 +732,10 @@ mod test { .await?; // now test if we can read from the contract - let genesis: ParsedLightClientState = contract.get_genesis_state().await?.into(); + let genesis: ParsedLightClientState = contract.genesis_state().await?.into(); assert_eq!(genesis, dummy_genesis); - let stake_genesis: ParsedStakeState = contract.get_genesis_stake_state().await?.into(); + let stake_genesis: ParsedStakeState = contract.genesis_stake_state().await?.into(); assert_eq!(stake_genesis, dummy_stake_genesis); let mut config = StateProverConfig::default(); @@ -763,7 +763,7 @@ mod test { let mut config = StateProverConfig::default(); config.update_l1_info(&anvil, contract.address()); - let genesis_l1: ParsedLightClientState = contract.get_genesis_state().await?.into(); + let genesis_l1: ParsedLightClientState = contract.genesis_state().await?.into(); assert_eq!(genesis_l1, genesis, "mismatched genesis, aborting tests"); let mut new_state = genesis.clone(); @@ -783,7 +783,7 @@ mod test { .await?; tracing::info!("Successfully submitted new finalized state to L1."); // test if new state is updated in l1 - let finalized_l1: ParsedLightClientState = contract.get_finalized_state().await?.into(); + let finalized_l1: ParsedLightClientState = contract.finalized_state().await?.into(); assert_eq!(finalized_l1, new_state); Ok(()) } From a7a33978d0033e2006c90e01e0d1d901a64eb23d Mon Sep 17 00:00:00 2001 From: Alex Xiong Date: Thu, 5 Sep 2024 14:33:58 +0800 Subject: [PATCH 10/27] allow --mock arg for gen-vk-contract; update vk --- Cargo.lock | 1 + contracts/rust/gen-vk-contract/Cargo.toml | 1 + contracts/rust/gen-vk-contract/src/main.rs | 50 +++++++++++-- .../libraries/LightClientStateUpdateVK.sol | 74 +++++++++---------- .../mocks/LightClientStateUpdateVKMock.sol | 74 +++++++++---------- 5 files changed, 119 insertions(+), 81 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 041b072dc..c8cd0989c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3699,6 +3699,7 @@ name = "gen-vk-contract" version = "0.1.0" dependencies = [ "ark-srs", + "clap", "hotshot-contract-adapter", "hotshot-stake-table", "hotshot-state-prover", diff --git a/contracts/rust/gen-vk-contract/Cargo.toml b/contracts/rust/gen-vk-contract/Cargo.toml index dc4920fc7..49b6ec19f 100644 --- a/contracts/rust/gen-vk-contract/Cargo.toml +++ b/contracts/rust/gen-vk-contract/Cargo.toml @@ -11,3 +11,4 @@ hotshot-contract-adapter = { path = "../adapter" } hotshot-stake-table = { workspace = true } hotshot-state-prover = { path = "../../../hotshot-state-prover" } jf-pcs = { workspace = true } +clap = { workspace = true } diff --git a/contracts/rust/gen-vk-contract/src/main.rs b/contracts/rust/gen-vk-contract/src/main.rs index 24530124c..a3de8ce7e 100644 --- a/contracts/rust/gen-vk-contract/src/main.rs +++ b/contracts/rust/gen-vk-contract/src/main.rs @@ -1,5 +1,6 @@ //! This executable generates the solidity files with hardcoded verifying keys for //! LightClient updates by running `cargo run -p gen-vk-contract --release`. +//! LightClientMock updates by running `cargo run -p gen-vk-contract --release -- --mock`. //! Adapted from [CAPE project][https://github.com/EspressoSystems/cape/blob/main/contracts/rust/src/bin/gen-vk-libraries.rs] use std::{fs::OpenOptions, io::Write, path::PathBuf, process::Command}; @@ -8,11 +9,27 @@ use hotshot_contract_adapter::jellyfish::ParsedVerifyingKey; use hotshot_stake_table::config::STAKE_TABLE_CAPACITY; use jf_pcs::prelude::UnivariateUniversalParams; +use clap::Parser; + +#[derive(Parser)] +struct Cli { + /// indicate if it's for the mock verification key + #[arg(long, default_value_t = false)] + mock: bool, +} + fn main() { + let mock = Cli::parse().mock; + let srs = { // load SRS from Aztec's ceremony - let srs = ark_srs::kzg10::aztec20::setup(2u64.pow(20) as usize + 2) - .expect("Aztec SRS fail to load"); + let srs = if mock { + ark_srs::kzg10::aztec20::setup(2u64.pow(16) as usize + 2) + .expect("Aztec SRS fail to load") + } else { + ark_srs::kzg10::aztec20::setup(2u64.pow(20) as usize + 2) + .expect("Aztec SRS fail to load") + }; // convert to Jellyfish type // TODO: (alex) use constructor instead https://github.com/EspressoSystems/jellyfish/issues/440 UnivariateUniversalParams { @@ -22,17 +39,29 @@ fn main() { powers_of_h: vec![srs.h, srs.beta_h], } }; - let (_, vk) = hotshot_state_prover::preprocess(&srs, STAKE_TABLE_CAPACITY) - .expect("Circuit preprocess failed"); + let (_, vk) = if mock { + hotshot_state_prover::preprocess(&srs, 10).expect("Circuit preprocess failed") + } else { + hotshot_state_prover::preprocess(&srs, STAKE_TABLE_CAPACITY) + .expect("Circuit preprocess failed") + }; let vk: ParsedVerifyingKey = vk.into(); // calculate the path to solidity file - let contract_name = "LightClientStateUpdateVK"; + let contract_name = if mock { + "LightClientStateUpdateVKMock" + } else { + "LightClientStateUpdateVK" + }; let mut path = PathBuf::new(); path.push(env!("CARGO_MANIFEST_DIR")); path.pop(); path.pop(); - path.push("src/libraries"); + if mock { + path.push("test/mocks"); + } else { + path.push("src/libraries"); + } path.push(contract_name); path.set_extension("sol"); println!("Path:{:?}", path.to_str()); @@ -45,6 +74,12 @@ fn main() { .open(path) .unwrap(); + let import_path = if mock { + "import { IPlonkVerifier } from \"../../src/interfaces/IPlonkVerifier.sol\";" + } else { + "import { IPlonkVerifier } from \"../interfaces/IPlonkVerifier.sol\";" + }; + let code = format!( "// SPDX-License-Identifier: GPL-3.0-or-later // @@ -58,7 +93,7 @@ fn main() { // NOTE: DO NOT MODIFY! GENERATED BY SCRIPT VIA `cargo run --bin gen-vk-contract --release`. pragma solidity ^0.8.0; - import {{ IPlonkVerifier }} from \"../interfaces/IPlonkVerifier.sol\"; + {} /* solhint-disable no-inline-assembly */ @@ -130,6 +165,7 @@ fn main() { }} }} }}", + import_path, contract_name, vk.domain_size, vk.num_inputs, diff --git a/contracts/src/libraries/LightClientStateUpdateVK.sol b/contracts/src/libraries/LightClientStateUpdateVK.sol index 8188c5409..ac5dc87b8 100644 --- a/contracts/src/libraries/LightClientStateUpdateVK.sol +++ b/contracts/src/libraries/LightClientStateUpdateVK.sol @@ -25,172 +25,172 @@ library LightClientStateUpdateVK { // domain size mstore(vk, 1048576) // num of public inputs - mstore(add(vk, 0x20), 8) + mstore(add(vk, 0x20), 4) // sigma0 mstore( mload(add(vk, 0x40)), - 14829590452951582429597937921803746951066352088554415416011470961765685672755 + 16998694615579553089155874235793867672199587172454671092177469580512964996958 ) mstore( add(mload(add(vk, 0x40)), 0x20), - 1640805128987262135097000798716519252415689101125171714241944191382225430588 + 14913826609548226082638726512972809701476246236323364924963463506303833260496 ) // sigma1 mstore( mload(add(vk, 0x60)), - 18274068123557654431658802492586722727412966290987193881329212617379409092827 + 16011493707035639931534162117491453383106763751836815206648905058016608669414 ) mstore( add(mload(add(vk, 0x60)), 0x20), - 15262267645961173197854134224641529185383299058832029120242801083020131756400 + 14388337539414483026957313358914935908135528975692221819766569817991107147509 ) // sigma2 mstore( mload(add(vk, 0x80)), - 3546893388503598029379371535595161595693832489221556391602992086886519831449 + 13703053324325359330807185043437520838180663451594181288098705061547972032806 ) mstore( add(mload(add(vk, 0x80)), 0x20), - 5372901058006419475432857030090030698039020632248561039251432764657711254637 + 7918750352115682079617962789983677878433816245702145361769062720089763403276 ) // sigma3 mstore( mload(add(vk, 0xa0)), - 8928358756130581276782896781228211285855331943263768176288185111880065377829 + 13204842395853711359779501868742648845147496821494941512193666818383658538957 ) mstore( add(mload(add(vk, 0xa0)), 0x20), - 11296094221230007321906902566798665556326310712938157478561243271436961185939 + 6288695024259467804863820352232692613451432067819650190625073863086458569747 ) // sigma4 mstore( mload(add(vk, 0xc0)), - 4270203435103829510210885065469080215759206247600073141969144340825736456361 + 14040324856970655299835654144202400654814421740434059377565899259781188799728 ) mstore( add(mload(add(vk, 0xc0)), 0x20), - 18435513468464898350668089458023802596061834199836906544891249686171357011496 + 834927786053040465657288239208351618292029645055491714782381530747781592418 ) // q1 mstore( mload(add(vk, 0xe0)), - 1353825928133056546105071835787168542506364373349693671191581615121126233747 + 20544572990331653135731505780346223934798623123944840034213073023563475633800 ) mstore( add(mload(add(vk, 0xe0)), 0x20), - 14552181871867089243248249259028502752341497337283269364895091407532060232707 + 7550911007406754226376516859815557397303730847970858309323990044427329644102 ) // q2 mstore( mload(add(vk, 0x100)), - 16134962525970404894447932095148604805089607916596239986859009518831961541095 + 18956139365826315484332454907058381265609921251964078522092401394457299997830 ) mstore( add(mload(add(vk, 0x100)), 0x20), - 12912418721630015879588720063744969517312801940994098982636356180615148009133 + 9788587892818848699376557857403480861962950394272020572265563326270836160853 ) // q3 mstore( mload(add(vk, 0x120)), - 10367884953135327072589416694300506531675903043698271118039737017003907416548 + 14944087736485927361587552840560835650155434953441391165695836700062143169913 ) mstore( add(mload(add(vk, 0x120)), 0x20), - 18645767054976951986441477674607729822362900191642269701059692086595011309617 + 12259474077603385628738286132424764984742349966390776825596861993344622164294 ) // q4 mstore( mload(add(vk, 0x140)), - 20290438753634591112566805159744566085943118086910415955566637541975611306568 + 12197100474889712366030113889288384374271280568148734018082366471981780315735 ) mstore( add(mload(add(vk, 0x140)), 0x20), - 3616081350190366687413620745033189240584091802830669829058164649134460203062 + 13924717995877468902081617840526261717992163369146998334077705192817969100151 ) // qM12 mstore( mload(add(vk, 0x160)), - 1392866654032974419818610994350340752885270300830841653620814131913125942809 + 4761744642254166165214745077362540222932129018196121566475099635847171238660 ) mstore( add(mload(add(vk, 0x160)), 0x20), - 7926323714312408409342288501031785033608020789818750772083444352168852620309 + 6160449879339783698137050851589287422912864722866490311805770855855163898265 ) // qM34 mstore( mload(add(vk, 0x180)), - 3791333556380290364066652753532128031853997955294626527563616698625259260872 + 16019000954689754674593063440664003812452865678864153761623503615040839458731 ) mstore( add(mload(add(vk, 0x180)), 0x20), - 3628907676439037794810640678014156959914018154448361319066535585239352845219 + 17381929236650272454670090686309297525519442421631348854786802259803071993361 ) // qO mstore( mload(add(vk, 0x1a0)), - 7288452744039439153187019986732880627393606422995836790888938928792979430332 + 20775553829796351538875640647761226289796822451382188824751919155603475031120 ) mstore( add(mload(add(vk, 0x1a0)), 0x20), - 3898946817206780988021496513282121271248375416352393169747615149428446748796 + 16387305174440748744164810428371325931833493744277542543307443448742579568958 ) // qC mstore( mload(add(vk, 0x1c0)), - 20482389538634884293964815753989066984137903177461009416710382582511144614720 + 10561189404881783228238637998299055616027595156938649247416787347069381768829 ) mstore( add(mload(add(vk, 0x1c0)), 0x20), - 11258994014172499578597433237341729986035258019178718124058091521884134834133 + 3943406444165977440881486577514784600711380627384453436931443980733458339721 ) // qH1 mstore( mload(add(vk, 0x1e0)), - 6452329770023103857611525837563150030587644522618711966359232731854161969093 + 4889516819694721837358304784193252947490111520088045204520047536170849858888 ) mstore( add(mload(add(vk, 0x1e0)), 0x20), - 6635683706001669495270751033107447145849321869191941901164391368358042033363 + 4852876225040588964292323378399805668815216441959750201604927324046694192208 ) // qH2 mstore( mload(add(vk, 0x200)), - 18852624756618899688471924454580455174040214747122588704978836212290318639012 + 5795241947074845452142105074293485315890012937126510399092193478110678425250 ) mstore( add(mload(add(vk, 0x200)), 0x20), - 19668150013698798224912707568562000682376208453509380984273539880691910555900 + 21134337090425282422832414599718123763071137889703540520295427274384203705493 ) // qH3 mstore( mload(add(vk, 0x220)), - 2897648376529441855171451962918729606513806930163982507283513591881780437542 + 6606186238266267238550749463315925213609734249860657171964295777390082553197 ) mstore( add(mload(add(vk, 0x220)), 0x20), - 18058066682160117591143604241687402897699656641104339334068174388078565105166 + 2813969982045804558958174990765446958943095294464107506708510616571612999661 ) // qH4 mstore( mload(add(vk, 0x240)), - 8311780877242981974134745557347343806199562160806780762496164569715285508665 + 7594747784798376376858886229708671341141985648424878807573224827438208330262 ) mstore( add(mload(add(vk, 0x240)), 0x20), - 9739465744057100599476346315622632649775803938784339749244299845794851098068 + 6835212894886893695211938895795741650252589108614387458070592221374863976851 ) // qEcc mstore( mload(add(vk, 0x260)), - 16504816536031923515595107276719833176967746018194462214393291822653673414274 + 18418591436859210472987001470790664263135421335281477510498260703209065940337 ) mstore( add(mload(add(vk, 0x260)), 0x20), - 20309550876545766116130682111350015544103338784776768395329281357767924326613 + 9993635555108627048825987579258725039654497454015072112166907062603793732862 ) } } diff --git a/contracts/test/mocks/LightClientStateUpdateVKMock.sol b/contracts/test/mocks/LightClientStateUpdateVKMock.sol index e474b7e5b..c6ca390a4 100644 --- a/contracts/test/mocks/LightClientStateUpdateVKMock.sol +++ b/contracts/test/mocks/LightClientStateUpdateVKMock.sol @@ -25,172 +25,172 @@ library LightClientStateUpdateVKMock { // domain size mstore(vk, 65536) // num of public inputs - mstore(add(vk, 0x20), 8) + mstore(add(vk, 0x20), 4) // sigma0 mstore( mload(add(vk, 0x40)), - 560292699158932187709021872580168940954720229866488907098569949929442242177 + 6088904265573808865748522029138006317194361279606554867165703727167729137832 ) mstore( add(mload(add(vk, 0x40)), 0x20), - 10276961047134818946140351477110286957012577407066030912672129568036927281211 + 9955095018968506534441048970159911343289070413047889845208695603072669098426 ) // sigma1 mstore( mload(add(vk, 0x60)), - 5534691973404187513605300960613202894867859952192206103239775316623040666669 + 8272407924239308790897016741071136690858972255217114029193400287719051999939 ) mstore( add(mload(add(vk, 0x60)), 0x20), - 10225857329627148128400064151472994355082888467374671967750208354120864174364 + 1579963292631487791550226848934606325179599024330423638350684055249850005662 ) // sigma2 mstore( mload(add(vk, 0x80)), - 8065316544719578387524358523310127191771093880959343997429567102465329547976 + 1402360621940842422618017724395753804093885927027017453763663806005588190611 ) mstore( add(mload(add(vk, 0x80)), 0x20), - 1425838847304974874311980929869327314909669168012057463110471764544460175315 + 13893707948956669470828390339446321405757890506813776755760611664341885671348 ) // sigma3 mstore( mload(add(vk, 0xa0)), - 16002421545987331141742569210718550255048146570834778937216220592368925526073 + 5660526272093562214694977270320090310970096465665660533464975039268380207382 ) mstore( add(mload(add(vk, 0xa0)), 0x20), - 34406611910962424253489125268856278032073593664804046642631011552934195946 + 3020475395904829817487205855641583787360488822241734291131614958312073282990 ) // sigma4 mstore( mload(add(vk, 0xc0)), - 11445079852804214826955859524249708877020358389341999422387741783694875036903 + 13867389252854274409456433144766803560101522531117517660087709767128730289557 ) mstore( add(mload(add(vk, 0xc0)), 0x20), - 16806325692047749590626692981966359137981378903927139580947916716525859262646 + 16028931892087420834703776063652692412379808279229805369619643135968327120880 ) // q1 mstore( mload(add(vk, 0xe0)), - 2049866642812703568753016349662964168730767811710438483177174408835851039654 + 14917685842131406325120344741320385933092382950109928374974151865027936135461 ) mstore( add(mload(add(vk, 0xe0)), 0x20), - 12520977158758014177420538652287908177326457213281949696327363920289084290701 + 10771152981589983233112040901872897076224489900467648966602683982711269285546 ) // q2 mstore( mload(add(vk, 0x100)), - 20582092476284202792941358171210260863634115075334011296845760245911069472015 + 10203431164915116572574899008477590878502347642086936032264033913602824952482 ) mstore( add(mload(add(vk, 0x100)), 0x20), - 5041210168713491617697141661806293072927086571150532100480295734981490832235 + 20547118756604796933768226604664346089096301961445924480372692859669316908079 ) // q3 mstore( mload(add(vk, 0x120)), - 12744100466144754693458928600543682017448502839404097849586581378869048139272 + 19102468977698458888204306335581684238459394495297656552165798947351232258553 ) mstore( add(mload(add(vk, 0x120)), 0x20), - 11764260783076322583704446914819686577350606893571049363874746256947123362836 + 10792992953330175389925424964958973430588487704430242946943025378682430809297 ) // q4 mstore( mload(add(vk, 0x140)), - 12704081410749559246476563784072861760155485913911911764179820885978638517991 + 13569675765509201437841796168910359478590822579301808243803045555243814038982 ) mstore( add(mload(add(vk, 0x140)), 0x20), - 17722744854193267206230430932758110965125306922752471356921456991435364365754 + 3256253664247689331164320111009453976768026492072647059820555684988549357205 ) // qM12 mstore( mload(add(vk, 0x160)), - 6453231013362791895563067262275060970010067539446154128869944296180105433122 + 4578535055397788927300012345409975292088066403933071874143459428220011493670 ) mstore( add(mload(add(vk, 0x160)), 0x20), - 1466658050526598062748535808722945599695400833147334646997674472844201846639 + 15699655206346774966952817841201435512620492599231063424373468065154767824705 ) // qM34 mstore( mload(add(vk, 0x180)), - 6582738640472984267346656690527485562185761247737941478591031706350232546802 + 8649045521046512020246812954113611791420207930864802444045564814718983958551 ) mstore( add(mload(add(vk, 0x180)), 0x20), - 6919701491431094757031650741401030626916011721122969127785414082976995050894 + 7269940676617226033557017158774981242559551735020117596091006665347292306700 ) // qO mstore( mload(add(vk, 0x1a0)), - 19789694753328811041438186861226325089790478291812954405045375609840541944055 + 19082454924274503771317845865937521798237448911836152925551713293178151848884 ) mstore( add(mload(add(vk, 0x1a0)), 0x20), - 14159176289859745983359799835148658319127567280652459795489469350208679940139 + 6568876324819809477961856736880428893559203399248299353039639553670135657026 ) // qC mstore( mload(add(vk, 0x1c0)), - 20664109960368631577285527855658840591636553141399541580771225677830051589235 + 16853050533444065914578047615738518087842729700468544233178586306481688647819 ) mstore( add(mload(add(vk, 0x1c0)), 0x20), - 11723159022291546521707967932910777135698138237746209764135700920558934871080 + 5722244766346437957668750553129548150637123317523545680556873076958148045899 ) // qH1 mstore( mload(add(vk, 0x1e0)), - 605263757803570583600546503867857172101348083423514878846581641569710180355 + 18279658636913239406461248779993875565095679624315793602808155467238704277088 ) mstore( add(mload(add(vk, 0x1e0)), 0x20), - 14469543004072753936869227821948184518584703336183789537429868167655429593124 + 3441277161432124201466559496830840292734718234571053223520348268617142260011 ) // qH2 mstore( mload(add(vk, 0x200)), - 2384667097398195228168221363677899853742498411390397795446900595952239300170 + 3678434997024236548300073262218716375615282659526172787360629244046211207407 ) mstore( add(mload(add(vk, 0x200)), 0x20), - 10275888075018440494800367902299829818984504834118006945310306262240918085583 + 10346801070770624840438166318201076689294579749619631696719225139256389377514 ) // qH3 mstore( mload(add(vk, 0x220)), - 14833564191399885231304073197823073829536924923735425096809852677520137640772 + 15245981269684440694865215979100312195723682495838381930420156798715946791002 ) mstore( add(mload(add(vk, 0x220)), 0x20), - 9327636621200489327971248548047951027037698837088692977367835437950105960107 + 17771359266315463065946701716949479499127948028026834266475460023649247415816 ) // qH4 mstore( mload(add(vk, 0x240)), - 4589838807130263610917801857966804873014329823411582139693177043027499096693 + 15236448222681780631374197064304662174394077083666475702144696580008299731540 ) mstore( add(mload(add(vk, 0x240)), 0x20), - 4668230451870943729688296544612578377074246843166351853548960747414322359265 + 4455087468085405113449530963538607004372733480992469653300468993540544949202 ) // qEcc mstore( mload(add(vk, 0x260)), - 1744575581311563417840597254368489349676731531441718204253650123654132132809 + 18950741019977133609412835372131153201910349848619035858126948587016554379310 ) mstore( add(mload(add(vk, 0x260)), 0x20), - 4028482820459137632881945408189551152935873937068798814930695801575907701616 + 7340531586894031137911171437535895150082108255870826703349877706931499230371 ) } } From f7c5afa0b52200c2e9ac8573ef6ca92c7aed7471 Mon Sep 17 00:00:00 2001 From: Alex Xiong Date: Fri, 6 Sep 2024 01:02:43 +0800 Subject: [PATCH 11/27] rename: stake_state -> stake_table_state; remove stakeStable prefix --- Cargo.lock | 26 ++--- .../artifacts/LightClientMock_bytecode.json | 2 +- .../artifacts/LightClient_bytecode.json | 2 +- contract-bindings/src/light_client.rs | 68 ++++++------ contract-bindings/src/light_client_mock.rs | 72 +++++++------ contract-bindings/src/shared_types.rs | 10 +- contracts/rust/adapter/src/light_client.rs | 75 +++++-------- contracts/script/LightClient.s.sol | 12 +-- .../LightClientCallNewFinalizedState.s.sol | 2 +- .../script/LightClientWithDefender.s.sol | 4 +- contracts/src/LightClient.sol | 48 ++++----- .../test/DeployLightClientTestScript.s.sol | 8 +- contracts/test/LightClient.t.sol | 100 +++++++++--------- contracts/test/LightClientBenchmark.t.sol | 2 +- .../test/LightClientUpgradeSameContract.t.sol | 2 +- contracts/test/LightClientUpgradeToVx.t.sol | 2 +- contracts/test/mocks/LightClientMock.sol | 4 +- hotshot-state-prover/src/mock_ledger.rs | 32 +++--- hotshot-state-prover/src/service.rs | 2 +- utils/src/deployer.rs | 4 +- 20 files changed, 230 insertions(+), 247 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ee4a6dbcf..4f9bae2b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4080,7 +4080,7 @@ dependencies = [ [[package]] name = "hotshot" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#da227a0dad0d012b5474b5713110a82e66a109fe" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" dependencies = [ "anyhow", "async-broadcast", @@ -4127,7 +4127,7 @@ dependencies = [ [[package]] name = "hotshot-builder-api" version = "0.1.7" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#da227a0dad0d012b5474b5713110a82e66a109fe" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" dependencies = [ "async-trait", "clap", @@ -4228,7 +4228,7 @@ dependencies = [ [[package]] name = "hotshot-example-types" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#da227a0dad0d012b5474b5713110a82e66a109fe" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" dependencies = [ "anyhow", "async-broadcast", @@ -4261,7 +4261,7 @@ dependencies = [ [[package]] name = "hotshot-fakeapi" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#da227a0dad0d012b5474b5713110a82e66a109fe" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" dependencies = [ "anyhow", "async-lock 2.8.0", @@ -4280,7 +4280,7 @@ dependencies = [ [[package]] name = "hotshot-macros" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#da227a0dad0d012b5474b5713110a82e66a109fe" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" dependencies = [ "derive_builder", "proc-macro2", @@ -4291,7 +4291,7 @@ dependencies = [ [[package]] name = "hotshot-orchestrator" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#da227a0dad0d012b5474b5713110a82e66a109fe" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" dependencies = [ "anyhow", "async-compatibility-layer", @@ -4377,7 +4377,7 @@ dependencies = [ [[package]] name = "hotshot-stake-table" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#da227a0dad0d012b5474b5713110a82e66a109fe" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" dependencies = [ "ark-bn254", "ark-ed-on-bn254", @@ -4439,7 +4439,7 @@ dependencies = [ [[package]] name = "hotshot-task" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#da227a0dad0d012b5474b5713110a82e66a109fe" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" dependencies = [ "anyhow", "async-broadcast", @@ -4454,7 +4454,7 @@ dependencies = [ [[package]] name = "hotshot-task-impls" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#da227a0dad0d012b5474b5713110a82e66a109fe" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" dependencies = [ "anyhow", "async-broadcast", @@ -4491,7 +4491,7 @@ dependencies = [ [[package]] name = "hotshot-testing" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#da227a0dad0d012b5474b5713110a82e66a109fe" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" dependencies = [ "anyhow", "async-broadcast", @@ -4537,7 +4537,7 @@ dependencies = [ [[package]] name = "hotshot-types" version = "0.1.11" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#da227a0dad0d012b5474b5713110a82e66a109fe" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" dependencies = [ "anyhow", "ark-bn254", @@ -5794,7 +5794,7 @@ dependencies = [ [[package]] name = "libp2p-networking" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#da227a0dad0d012b5474b5713110a82e66a109fe" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" dependencies = [ "anyhow", "async-compatibility-layer", @@ -7535,7 +7535,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.11.0", "proc-macro2", "quote", "syn 2.0.77", diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json index 525b7efbf..7ce526a08 100644 --- a/contract-bindings/artifacts/LightClientMock_bytecode.json +++ b/contract-bindings/artifacts/LightClientMock_bytecode.json @@ -1 +1 @@ -"0x60a0346200057857620030ae38819003601f8101601f191683016001600160401b03811184821017620004aa57839282916040528339810103610100811262000578576060811262000578576080604051916200005c836200057d565b620000678462000599565b8352620000776020850162000599565b602084015260408401516040840152605f19011262000578576040519160808301906001600160401b03821184831017620004aa5760e091604052606081015184526080810151602085015260a0810151604085015260c08101516060850152015163ffffffff811681036200057857306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8160401c1662000566576002600160401b03196001600160401b038216016200051a575b505081516001600160401b03161580159062000503575b8015620004f6575b8015620004e9575b8015620004dc575b8015620004d2575b620004c05760018060401b03825116908160085468010000000000000000600160801b03602086015160401b1691829160018060801b031916171760085560408401519182600955855160045560208601519283600555604087015192836006556060880151958660075560018060801b0319600a54161717600a55600b55600c549063ffffffff60a81b9060a81b169063ffffffff60a81b1916179283600c55604051916020830193845260408301526060820152606081526080810181811060018060401b03821117620004aa57604052519020600093818555519081600155600255600355600e5490811515918262000433575b5050620003a4575b602081015160409182015182519290916001600160401b039081169184019081118482101762000390576040528252602082015260405190620002ad826200057d565b6001600160401b03438116835242166020830190815260408301918252600e54909290680100000000000000008110156200039057806001620002f49201600e55620005ae565b9490946200037c575051835492516001600160801b03199093166001600160401b0391821617604093841b6fffffffffffffffff000000000000000016178455905180516001850180546001600160401b0319169190931617909155602001516002929092019190915551612ac99081620005e58239608051818181610b0a0152610c620152f35b634e487b7160e01b81526004819052602490fd5b634e487b7160e01b85526041600452602485fd5b600d54620003bb906001600160401b0316620005ae565b6200041f5782815560018101839055600201829055600d546001600160401b038082169081146200040b576001600160401b03199091166001919091016001600160401b031617600d556200026a565b634e487b7160e01b84526011600452602484fd5b634e487b7160e01b83526004839052602483fd5b90915060001981019081116200040b576200044e90620005ae565b5054600d546001600160401b0360409290921c821691620004709116620005ae565b505460401c6001600160401b03908116909103919082116200040b5760a81c63ffffffff166001600160401b039091161015388062000262565b634e487b7160e01b600052604160045260246000fd5b6040516350dd03f760e11b8152600490fd5b508251156200016b565b5060608301511562000163565b506040830151156200015b565b5060208301511562000153565b5060208201516001600160401b031615156200014b565b6001600160401b0319166001600160401b039081179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388062000134565b60405163f92ee8a960e01b8152600490fd5b600080fd5b606081019081106001600160401b03821117620004aa57604052565b51906001600160401b03821682036200057857565b600e54811015620005ce57600e6000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461021757806302b592f3146102125780630d8e6e2c1461020d5780632063d4f7146102085780632d52aad6146102035780632f5f4600146101fe5780632f79889d146101f9578063313df7b1146101f4578063382b215a146101ef5780634f1ef286146101ea57806352d1902d146101e557806362827733146101e057806369cc6a04146101db5780636f96bdae146101d6578063715018a6146101d157806376b6b7cb146101cc5780638584d23f146101c75780638da5cb5b146101c257806396c1ca61146101bd5780639baa3cc9146101b85780639fdb54a7146101b3578063a9a9c9f5146101ae578063ad3cb1cc146101a9578063b5adea3c146101a4578063bd32519a1461019f578063c23b9e9e1461019a578063c8e5e49814610195578063ca6fe85514610190578063d24d933d1461018b578063e030330114610186578063f2fde38b146101815763f9e50d191461017c57600080fd5b611408565b6113df565b6112af565b611274565b611256565b611239565b611212565b6111ec565b611193565b611116565b6110df565b6110a0565b610f53565b610ecc565b610e83565b610e46565b610e28565b610dbd565b610d72565b610cd8565b610cba565b610c4f565b610a90565b610a57565b610a2e565b610a07565b61091b565b6108f5565b61079d565b6104ed565b610477565b61024e565b600435906001600160a01b038216820361023257565b600080fd5b61010435906001600160a01b038216820361023257565b346102325760203660031901126102325761026761021c565b61026f611a4c565b6001600160a01b039081169081156102ff57600c5490811682146102ed5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561036257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b610311565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761039857604052565b610367565b606081019081106001600160401b0382111761039857604052565b608081019081106001600160401b0382111761039857604052565b90601f801991011681019081106001600160401b0382111761039857604052565b604051906102e082018281106001600160401b0382111761039857604052565b604051906104218261037d565b565b604051906104218261039d565b604051906102c082018281106001600160401b0382111761039857604052565b9060405161045d8161037d565b6020600182946001600160401b0381541684520154910152565b3461023257602036600319011261023257600435600e54811015610232576104a0608091610327565b506104eb8154916104bb60016001600160401b039201610450565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610232576000366003190112610232576060604051600181526000602082015260006040820152f35b35906001600160401b038216820361023257565b606090600319011261023257604051906105448261039d565b816001600160401b03600435818116810361023257825260243590811681036102325760208201526040604435910152565b6040906063190112610232576040519061058f8261037d565b60643582526084356020830152565b60409060a319011261023257604051906105b78261037d565b60a435825260c4356020830152565b60409060e319011261023257604051906105df8261037d565b60e4358252610104356020830152565b60409061012319011261023257604051906106098261037d565b610124358252610144356020830152565b60409061016319011261023257604051906106348261037d565b610164358252610184356020830152565b6040906101a3190112610232576040519061065f8261037d565b6101a43582526101c4356020830152565b6040906101e3190112610232576040519061068a8261037d565b6101e4358252610204356020830152565b60409061022319011261023257604051906106b58261037d565b610224358252610244356020830152565b60409061026319011261023257604051906106e08261037d565b610264358252610284356020830152565b6040906102a3190112610232576040519061070b8261037d565b6102a43582526102c4356020830152565b6040906102e319011261023257604051906107368261037d565b6102e4358252610304356020830152565b60409061032319011261023257604051906107618261037d565b610324358252610344356020830152565b604090610363190112610232576040519061078c8261037d565b610364358252610384356020830152565b34610232576104e0366003190112610232576107b83661052b565b610480366063190112610232576108f3906107d16103f4565b906107db36610576565b82526107e63661059e565b60208301526107f4366105c6565b6040830152610802366105ef565b60608301526108103661061a565b608083015261081e36610645565b60a083015261082c36610670565b60c083015261083a3661069b565b60e0830152610848366106c6565b610100830152610857366106f1565b6101208301526108663661071c565b61014083015261087536610747565b61016083015261088436610772565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c0830152611479565b005b3461023257602036600319011261023257600f805460ff19166001179055600435601055005b3461023257602080600319360112610232576001600160401b0360043581811161023257366023820112156102325780600401359182116103985760409283519261096b828260051b01856103d3565b80845260248285019160071b8401019236841161023257602401905b838210610997576108f385611671565b8136036080811261023257868051916109af8361039d565b6109b885610517565b83526109c5868601610517565b83870152603f19011261023257608091849188516109e28161037d565b6109ed8a8701610517565b815260608601358482015289820152815201910190610987565b346102325760003660031901126102325760206001600160401b03600d5416604051908152f35b3461023257600036600319011261023257600c546040516001600160a01b039091168152602090f35b34610232576000366003190112610232576020600254604051908152f35b6001600160401b03811161039857601f01601f191660200190565b60408060031936011261023257610aa561021c565b6024356001600160401b038111610232573660238201121561023257806004013590610ad082610a75565b91610add855193846103d3565b80835260209136602483830101116102325781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610c33575b50610c22579080600492610b48611a4c565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610bf3575b5050610bb8578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612a7d8339815191528193929303610bda576108f383836128e1565b8351632a87526960e21b81526004810191909152602490fd5b610c13929350803d10610c1b575b610c0b81836103d3565b8101906121cd565b903880610b92565b503d610c01565b845163703e46dd60e11b8152600490fd5b905081600080516020612a7d8339815191525416141538610b36565b34610232576000366003190112610232577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610ca8576020604051600080516020612a7d8339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610232576000366003190112610232576020600154604051908152f35b3461023257600080600319360112610d3757610cf2611a4c565b600c5460ff8160a01c166000146102ed576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b60809060631901126102325760405190610d53826103b8565b6064358252608435602083015260a435604083015260c4356060830152565b34610232576080366003190112610232576020610db5604051610d94816103b8565b6004358152602435838201526044356040820152606435606082015261171b565b604051908152f35b3461023257600080600319360112610d3757610dd7611a4c565b600080516020612a5d83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610232576000366003190112610232576020600054604051908152f35b34610232576020366003190112610232576040610e64600435611788565b6104eb82518092602080916001600160401b0381511684520151910152565b3461023257600036600319011261023257600080516020612a5d833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff8216820361023257565b346102325760203660031901126102325760043563ffffffff80821680830361023257610ef7611a4c565b610e108110918215610f41575b5050610f2f57600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610f04565b346102325761012036600319011261023257610f6e3661052b565b610f7736610d3a565b90610f80610eb9565b610f88610237565b90600080516020612a9d83398151915254936001600160401b0360ff8660401c1615951680159081611098575b600114908161108e575b159081611085575b5061107357600080516020612a9d833981519152805467ffffffffffffffff19166001179055610ffb938561104e5761184e565b61100157005b600080516020612a9d833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102e8565b600080516020612a9d833981519152805460ff60401b1916600160401b17905561184e565b60405163f92ee8a960e01b8152600490fd5b90501538610fc7565b303b159150610fbf565b869150610fb5565b3461023257600036600319011261023257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b0390f35b3461023257600036600319011261023257608060045460055460065460075491604051938452602084015260408301526060820152f35b346102325760003660031901126102325760408051906111358261037d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106111805784604081866000838284010152601f80199101168101030190f35b858101830151858201830152820161115e565b346102325760603660031901126102325760406111af3661052b565b6001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55600080f35b3461023257600036600319011261023257602060ff600c5460a01c166040519015158152f35b3461023257600036600319011261023257602063ffffffff600c5460a81c16604051908152f35b3461023257600036600319011261023257600f805460ff19169055005b34610232576000366003190112610232576020600354604051908152f35b3461023257600036600319011261023257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b34610232576040366003190112610232576004356024359060ff600f54166000906000146112fd5750906112e96110db926010549061177b565b115b60405190151581529081906020820190565b91600e549143811180156113d5575b6113625761131a849361176c565b9261133c611330600d546001600160401b031690565b6001600160401b031690565b935b8115611374575b509091925015611362576110db9261135c9161177b565b116112eb565b60405163b0b4387760e01b8152600490fd5b8261139261133061138484610327565b50546001600160401b031690565b11156113bb575b600281106113b6578481146113b6576113b1906121dc565b61133e565b611345565b94505060016113cf61133061138487610327565b94611399565b506003831061130c565b34610232576020366003190112610232576108f36113fb61021c565b611403611a4c565b6119d8565b34610232576000366003190112610232576020600e54604051908152f35b634e487b7160e01b600052600060045260246000fd5b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c169081611589575b50611577578151600a546001600160401b03918183169083161180159190611550575b5061153e577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906114ed60408501936114e78551611a85565b85611f6b565b6114f68461143c565b61150584824216834316612084565b61152a602061151b86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b9050818061156860208701516001600160401b031690565b9260401c1691161115386114ae565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861148b565b634e487b7160e01b600052601160045260246000fd5b906115ca5760028160008093558260018201550155565b611426565b80518210156103625760209160051b010190565b600e54600160401b811015610398578060016116029201600e55610327565b9190916115ca57805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b90600e546000600e55806116ae575b5060005b82518110156116a957806116a361169d600193866115cf565b516115e3565b01611684565b509050565b6003908060030290600382040361171657600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd908101905b8181106116f8575050611680565b80611710849260026000918281558260018201550155565b016116ea565b61159d565b602081015190606060408201519101516040519160208301938452604083015260608201526060815261174d816103b8565b51902090565b604051906117608261037d565b60006020838281520152565b60001981019190821161171657565b9190820391821161171657565b611790611753565b50600e54906117a66117a18361176c565b610327565b50906117c06113306001809401546001600160401b031690565b81101561183c576117dc611330600d546001600160401b031690565b8381106118015750505060016117f76117a16117fe9361176c565b5001610450565b90565b816118216113308561181285610327565b5001546001600160401b031690565b1161182d5782016117dc565b6117fe93506117f79150610327565b604051631856a49960e21b8152600490fd5b9190926118659061185d612988565b611403612988565b61186d612988565b6001600160401b03908161188884516001600160401b031690565b16158015906119b9575b80156119ad575b80156119a1575b8015611995575b801561198c575b61197a576104219361194961196f926118fe866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b82516004556020830151600555604083015160065560608301516007556119248661143c565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b61196a6119558261171b565b9182600055519161196583600155565b600255565b600355565b804216904316612084565b6040516350dd03f760e11b8152600490fd5b508351156118ae565b506060840151156118a7565b506040840151156118a0565b50602084015115611899565b506119d161133060208501516001600160401b031690565b1515611892565b6001600160a01b03908116908115611a3357600080516020612a5d83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612a5d833981519152546001600160a01b03163303611a6d57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611aae57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b604051906101008083018381106001600160401b0382111761039857604052368337565b90816020910312610232575180151581036102325790565b6000915b60088310611b4057505050565b600190825181526020809101920192019190611b33565b61046090611b7083825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611bce610100928386019060208091805184520151910152565b60a081015191611bee610140938487019060208091805184520151910152565b60c082015192611c0e610180948588019060208091805184520151910152565b60e083015191611c2e6101c0938489019060208091805184520151910152565b830151611c4b610200918289019060208091805184520151910152565b61012084015191611c6c61024093848a019060208091805184520151910152565b84015192611c8a61028094858a019060208091805184520151910152565b611cc561016086015196611cae6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b61060090611f5861042194969593966102a0610a808401988051855260208101516020860152611d6e6040820151604087019060208091805184520151910152565b6060810151805160808701526020015160a08601526080810151805160c08701526020015160e086015260a0810151611db7610100918288019060208091805184520151910152565b611f2486611ef560c0850151611ddd610140918285019060208091805184520151910152565b611ec660e087015195611e00610180978887019060208091805184520151910152565b870151611e1d6101c0918287019060208091805184520151910152565b611e5a61012089015193611e41610200958689019060208091805184520151910152565b8901516102408097019060208091805184520151910152565b611e978c6102c06101608b015199611e826102809b8c85019060208091805184520151910152565b8b015191019060208091805184520151910152565b6101a088015180516103008e0152602001516103208d015287015180516103408d0152602001516103608c0152565b6101e086015180516103808c0152602001516103a08b015285015180516103c08b0152602001516103e08a0152565b61022084015180516104008a015260200151610420890152830151805161044089015260200151610460880152565b6102608201518051610480880152602001516104a08701528101516104c086015201516104e0840152610500830190611b2f565b0190611b57565b6040513d6000823e3d90fd5b602090611f76612305565b6040611f80611af3565b926001548452611f9a61133082516001600160401b031690565b85850152611fb4611330868301516001600160401b031690565b8285015201516060830152611fdd60405194859384936350f8d1a760e11b855260048501611d2c565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af490811561204e5760009161201f575b501561200d57565b6040516309bde33960e01b8152600490fd5b612041915060203d602011612047575b61203981836103d3565b810190611b17565b38612005565b503d61202f565b611f5f565b6001600160401b03918216908216039190821161171657565b6001600160401b038091169081146117165760010190565b90916120f361042193600e548015159081612159575b506120fd575b60406120b660208501516001600160401b031690565b9301516120d36120c4610414565b6001600160401b039095168552565b60208401526120e36120c4610423565b6001600160401b03166020840152565b60408201526115e3565b61211b6121156117a1600d546001600160401b031690565b906115b3565b612154612138612133600d546001600160401b031690565b61206c565b6001600160401b03166001600160401b0319600d541617600d55565b6120a0565b61219c915061216d6117a161217e9261176c565b505460401c6001600160401b031690565b61219661216d6117a1600d546001600160401b031690565b90612053565b6001600160401b036121c36121ba600c5463ffffffff9060a81c1690565b63ffffffff1690565b911610153861209a565b90816020910312610232575190565b8015611716576000190190565b6121f1610430565b906000825260006020830152612205611753565b6040830152612212611753565b606083015261221f611753565b608083015261222c611753565b60a0830152612239611753565b60c0830152612246611753565b60e0830152612253611753565b610100830152612261611753565b61012083015261226f611753565b61014083015261227d611753565b61016083015261228b611753565b610180830152612299611753565b6101a08301526122a7611753565b6101c08301526122b5611753565b6101e08301526122c3611753565b6102008301526122d1611753565b6102208301526122df611753565b6102408301526122ed611753565b610260830152600061028083015260006102a0830152565b61230d6121e9565b906201000082527f103a97f91d3df0aa53d6b2d7f29c4ebf4f323896827a8b8eeba30b7b039ce4a360206004818501527f16026254c01764d8b4fd70dc4cc51a74e0b32ba5f59e2a9e5ef169feeb7ca1ba81604086017f0d76329b8733b0b734ff0f60a40cb4c474064a8c755c1f6cbece5f7ea09d78a88151525101527f037e3a3fa0fefa3c08d50c07d472cba4274fd25c444f369d0d77db93e284f89e81606086017f124a0457892caf44e89d24b4f6eea80a0b1d532a3e59f1178b19e4caca8fbac38151525101527f1eb78f5dcd1e962bc4e33ff6caa12c4161f09ed217cdb213cebbffb63e9e57b481608086017f0319b53e71a0078028b4f021e0d4448d3e849198f25f0fb47f36ae764c06e5938151525101527f06ad874b2a3707a73260072b13799115f94f048d9065f7730d710511dcd945ae8160a086017f0c83be8ca5514d2b5527eec4871feb09b1be54fcc00fec9477fd525c563be9168151525101527f23700dcfa17c63b4681f477ab548eeae1daba4aad95d02a8d8b4619fa6d637f08160c086017f1ea8aa071b4c9346a585bbdbeb45762f4e26c395a015ad67ad732ef431b3c5958151525101527f17d041ace4a15d7297ebdccc0e098c72542e30d9b3cf6fc37edc14025a9edeaa8160e086017f20fb1c68cbebab5356eb21d126b6f596bea1168a768b59e5fbf308d6382829258151525101527f2d6d41d0b5833fb077c78ee3705435ea113a71a6537b6980f58073701224342f8161010086017f168eeff859a5f7b2781aa3c72a2c0a7a58fa9408489e7b0c13ae2feb848f5aa28151525101527f17dc9e1677dad495da48a1d95f94351c2197990789f4168f1e5dd9a31dc3e4d18161012086017f2a3b9d424102b9787e4fbfc217805739be51dbe872181dc40138dc706ce421f98151525101527f0732f969323e1586a21a2f363cd625237adeb6c9e884b5f6afd0fb862fb05e958161014086017f1e002a101f63386609be9700527a3508421d17ce7b127a3b04887704cdbd2dc68151525101527f22b5b0a08cefb39624d5260eac0cb6c63fa3942325134470f05dfcc69660a7418161016086017f0a1f5be7e2dda4ee17525ca86d1e20a1656c8bb3ac88490903d71324abaf39268151525101527f1012a3feba794457614f15434858e921c06088ca254352b6668971005bb59d0c8161018086017f131f2fb07141ec50c2c72b3a2c5bc061ef04d8a451f6093303ece094fd0770178151525101527f0e85da2cabd81a33dd542840af2640c7087dd3aa2ec7267bfc1a6fe6b117b242816101a086017f2a304967c0db314ac3c0a6613e636fd620e3fc3a5e284d28fa2a33e770cf4bb48151525101527f0ca6acfed4a97c404df14351b34dd68181ecdc2a723e80ce4b4cf3a5ff2e2c4b816101c086017f25427d12f7080ca1c010c4a710f1718446ac78ddfbf8fc9024030914c5b7988b8151525101527f079bb1a022509123aeaa6861001db5f4e9b9729c98727adff2aba5d588ae512b816101e086017f2869eb8e7c2c4223b37279eb988b696041ca315cdb14c05f463e73f24a0de6608151525101527f16e014f5b76709d9268e9c375854edb6451a9d895d2d2b4f0f0369566df19dea8161020086017f0821eba1289e0cbcbb088a218b11556d799dfd9748eee76d18c656d2b1f2d0ef8151525101527f274a3b9ef788ddae87b2d74b7d4ee2cdd10eea605fdd631caf43ef705477ce088161022086017f21b4eb6afcdfa42cd369fd0c20fc38cb7e6d8b5e88fbcc488983ea79238ef05a8151525101527f09d97d7a627d8ec24a5fb1495fee2d5cec5cd9e5c5b42c4e4bea06d9e6726bd28161024086017f21af862a9f3c7ffb2f3ef7f0e22bf4678e94296b7fbe0b37516e9b6c5e581a5481515251015261026084017f29e5bd43838ac1cfc29f172286db4a41408faed0d08a9ce4998b2a2e22bd782e8151525101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808301527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a0830152565b90813b1561296757600080516020612a7d83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511561294c57612949916129b7565b50565b50503461295557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612a9d8339815191525460401c16156129a557565b604051631afcd79f60e31b8152600490fd5b6000806117fe93602081519101845af43d156129f5573d916129d883610a75565b926129e660405194856103d3565b83523d6000602085013e6129f9565b6060915b90612a205750805115612a0e57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612a53575b612a31575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612a2956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a0346200057857620030ae38819003601f8101601f191683016001600160401b03811184821017620004aa57839282916040528339810103610100811262000578576060811262000578576080604051916200005c836200057d565b620000678462000599565b8352620000776020850162000599565b602084015260408401516040840152605f19011262000578576040519160808301906001600160401b03821184831017620004aa5760e091604052606081015184526080810151602085015260a0810151604085015260c08101516060850152015163ffffffff811681036200057857306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8160401c1662000566576002600160401b03196001600160401b038216016200051a575b505081516001600160401b03161580159062000503575b8015620004f6575b8015620004e9575b8015620004dc575b8015620004d2575b620004c05760018060401b03825116908160085468010000000000000000600160801b03602086015160401b1691829160018060801b031916171760085560408401519182600955855160045560208601519283600555604087015192836006556060880151958660075560018060801b0319600a54161717600a55600b55600c549063ffffffff60a81b9060a81b169063ffffffff60a81b1916179283600c55604051916020830193845260408301526060820152606081526080810181811060018060401b03821117620004aa57604052519020600093818555519081600155600255600355600e5490811515918262000433575b5050620003a4575b602081015160409182015182519290916001600160401b039081169184019081118482101762000390576040528252602082015260405190620002ad826200057d565b6001600160401b03438116835242166020830190815260408301918252600e54909290680100000000000000008110156200039057806001620002f49201600e55620005ae565b9490946200037c575051835492516001600160801b03199093166001600160401b0391821617604093841b6fffffffffffffffff000000000000000016178455905180516001850180546001600160401b0319169190931617909155602001516002929092019190915551612ac99081620005e58239608051818181610b410152610c990152f35b634e487b7160e01b81526004819052602490fd5b634e487b7160e01b85526041600452602485fd5b600d54620003bb906001600160401b0316620005ae565b6200041f5782815560018101839055600201829055600d546001600160401b038082169081146200040b576001600160401b03199091166001919091016001600160401b031617600d556200026a565b634e487b7160e01b84526011600452602484fd5b634e487b7160e01b83526004839052602483fd5b90915060001981019081116200040b576200044e90620005ae565b5054600d546001600160401b0360409290921c821691620004709116620005ae565b505460401c6001600160401b03908116909103919082116200040b5760a81c63ffffffff166001600160401b039091161015388062000262565b634e487b7160e01b600052604160045260246000fd5b6040516350dd03f760e11b8152600490fd5b508251156200016b565b5060608301511562000163565b506040830151156200015b565b5060208301511562000153565b5060208201516001600160401b031615156200014b565b6001600160401b0319166001600160401b039081179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388062000134565b60405163f92ee8a960e01b8152600490fd5b600080fd5b606081019081106001600160401b03821117620004aa57604052565b51906001600160401b03821682036200057857565b600e54811015620005ce57600e6000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461021757806302b592f3146102125780630d8e6e2c1461020d5780632063d4f7146102085780632d52aad6146102035780632f5f4600146101fe5780632f79889d146101f9578063313df7b1146101f4578063382b215a146101ef578063426d3194146101ea5780634f1ef286146101e557806352d1902d146101e057806362827733146101db57806369cc6a04146101d65780636f96bdae146101d1578063715018a6146101cc57806376b6b7cb146101c75780638584d23f146101c25780638da5cb5b146101bd57806396c1ca61146101b85780639baa3cc9146101b35780639fdb54a7146101ae578063ad3cb1cc146101a9578063b5adea3c146101a4578063bd32519a1461019f578063c23b9e9e1461019a578063c8e5e49814610195578063ca6fe85514610190578063d24d933d1461018b578063e030330114610186578063f2fde38b146101815763f9e50d191461017c57600080fd5b611408565b6113df565b6112af565b611274565b611256565b611239565b611212565b6111ec565b611193565b611116565b6110d7565b610f8a565b610f03565b610eba565b610e7d565b610e5f565b610df4565b610da9565b610d0f565b610cf1565b610c86565b610ac7565b610a75565b610a57565b610a2e565b610a07565b61091b565b6108f5565b61079d565b6104ed565b610477565b61024e565b600435906001600160a01b038216820361023257565b600080fd5b61010435906001600160a01b038216820361023257565b346102325760203660031901126102325761026761021c565b61026f611a4c565b6001600160a01b039081169081156102ff57600c5490811682146102ed5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561036257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b610311565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761039857604052565b610367565b606081019081106001600160401b0382111761039857604052565b608081019081106001600160401b0382111761039857604052565b90601f801991011681019081106001600160401b0382111761039857604052565b604051906102e082018281106001600160401b0382111761039857604052565b604051906104218261037d565b565b604051906104218261039d565b604051906102c082018281106001600160401b0382111761039857604052565b9060405161045d8161037d565b6020600182946001600160401b0381541684520154910152565b3461023257602036600319011261023257600435600e54811015610232576104a0608091610327565b506104eb8154916104bb60016001600160401b039201610450565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610232576000366003190112610232576060604051600181526000602082015260006040820152f35b35906001600160401b038216820361023257565b606090600319011261023257604051906105448261039d565b816001600160401b03600435818116810361023257825260243590811681036102325760208201526040604435910152565b6040906063190112610232576040519061058f8261037d565b60643582526084356020830152565b60409060a319011261023257604051906105b78261037d565b60a435825260c4356020830152565b60409060e319011261023257604051906105df8261037d565b60e4358252610104356020830152565b60409061012319011261023257604051906106098261037d565b610124358252610144356020830152565b60409061016319011261023257604051906106348261037d565b610164358252610184356020830152565b6040906101a3190112610232576040519061065f8261037d565b6101a43582526101c4356020830152565b6040906101e3190112610232576040519061068a8261037d565b6101e4358252610204356020830152565b60409061022319011261023257604051906106b58261037d565b610224358252610244356020830152565b60409061026319011261023257604051906106e08261037d565b610264358252610284356020830152565b6040906102a3190112610232576040519061070b8261037d565b6102a43582526102c4356020830152565b6040906102e319011261023257604051906107368261037d565b6102e4358252610304356020830152565b60409061032319011261023257604051906107618261037d565b610324358252610344356020830152565b604090610363190112610232576040519061078c8261037d565b610364358252610384356020830152565b34610232576104e0366003190112610232576107b83661052b565b610480366063190112610232576108f3906107d16103f4565b906107db36610576565b82526107e63661059e565b60208301526107f4366105c6565b6040830152610802366105ef565b60608301526108103661061a565b608083015261081e36610645565b60a083015261082c36610670565b60c083015261083a3661069b565b60e0830152610848366106c6565b610100830152610857366106f1565b6101208301526108663661071c565b61014083015261087536610747565b61016083015261088436610772565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c0830152611479565b005b3461023257602036600319011261023257600f805460ff19166001179055600435601055005b3461023257602080600319360112610232576001600160401b0360043581811161023257366023820112156102325780600401359182116103985760409283519261096b828260051b01856103d3565b80845260248285019160071b8401019236841161023257602401905b838210610997576108f385611671565b8136036080811261023257868051916109af8361039d565b6109b885610517565b83526109c5868601610517565b83870152603f19011261023257608091849188516109e28161037d565b6109ed8a8701610517565b815260608601358482015289820152815201910190610987565b346102325760003660031901126102325760206001600160401b03600d5416604051908152f35b3461023257600036600319011261023257600c546040516001600160a01b039091168152602090f35b34610232576000366003190112610232576020600254604051908152f35b3461023257600036600319011261023257608060045460055460065460075491604051938452602084015260408301526060820152f35b6001600160401b03811161039857601f01601f191660200190565b60408060031936011261023257610adc61021c565b6024356001600160401b038111610232573660238201121561023257806004013590610b0782610aac565b91610b14855193846103d3565b80835260209136602483830101116102325781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610c6a575b50610c59579080600492610b7f611a4c565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610c2a575b5050610bef578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612a7d8339815191528193929303610c11576108f383836128e1565b8351632a87526960e21b81526004810191909152602490fd5b610c4a929350803d10610c52575b610c4281836103d3565b8101906121cd565b903880610bc9565b503d610c38565b845163703e46dd60e11b8152600490fd5b905081600080516020612a7d8339815191525416141538610b6d565b34610232576000366003190112610232577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610cdf576020604051600080516020612a7d8339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610232576000366003190112610232576020600154604051908152f35b3461023257600080600319360112610d6e57610d29611a4c565b600c5460ff8160a01c166000146102ed576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b60809060631901126102325760405190610d8a826103b8565b6064358252608435602083015260a435604083015260c4356060830152565b34610232576080366003190112610232576020610dec604051610dcb816103b8565b6004358152602435838201526044356040820152606435606082015261171b565b604051908152f35b3461023257600080600319360112610d6e57610e0e611a4c565b600080516020612a5d83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610232576000366003190112610232576020600054604051908152f35b34610232576020366003190112610232576040610e9b600435611788565b6104eb82518092602080916001600160401b0381511684520151910152565b3461023257600036600319011261023257600080516020612a5d833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff8216820361023257565b346102325760203660031901126102325760043563ffffffff80821680830361023257610f2e611a4c565b610e108110918215610f78575b5050610f6657600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610f3b565b346102325761012036600319011261023257610fa53661052b565b610fae36610d71565b90610fb7610ef0565b610fbf610237565b90600080516020612a9d83398151915254936001600160401b0360ff8660401c16159516801590816110cf575b60011490816110c5575b1590816110bc575b506110aa57600080516020612a9d833981519152805467ffffffffffffffff1916600117905561103293856110855761184e565b61103857005b600080516020612a9d833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102e8565b600080516020612a9d833981519152805460ff60401b1916600160401b17905561184e565b60405163f92ee8a960e01b8152600490fd5b90501538610ffe565b303b159150610ff6565b869150610fec565b3461023257600036600319011261023257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b0390f35b346102325760003660031901126102325760408051906111358261037d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106111805784604081866000838284010152601f80199101168101030190f35b858101830151858201830152820161115e565b346102325760603660031901126102325760406111af3661052b565b6001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55600080f35b3461023257600036600319011261023257602060ff600c5460a01c166040519015158152f35b3461023257600036600319011261023257602063ffffffff600c5460a81c16604051908152f35b3461023257600036600319011261023257600f805460ff19169055005b34610232576000366003190112610232576020600354604051908152f35b3461023257600036600319011261023257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b34610232576040366003190112610232576004356024359060ff600f54166000906000146112fd5750906112e9611112926010549061177b565b115b60405190151581529081906020820190565b91600e549143811180156113d5575b6113625761131a849361176c565b9261133c611330600d546001600160401b031690565b6001600160401b031690565b935b8115611374575b509091925015611362576111129261135c9161177b565b116112eb565b60405163b0b4387760e01b8152600490fd5b8261139261133061138484610327565b50546001600160401b031690565b11156113bb575b600281106113b6578481146113b6576113b1906121dc565b61133e565b611345565b94505060016113cf61133061138487610327565b94611399565b506003831061130c565b34610232576020366003190112610232576108f36113fb61021c565b611403611a4c565b6119d8565b34610232576000366003190112610232576020600e54604051908152f35b634e487b7160e01b600052600060045260246000fd5b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c169081611589575b50611577578151600a546001600160401b03918183169083161180159190611550575b5061153e577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906114ed60408501936114e78551611a85565b85611f6b565b6114f68461143c565b61150584824216834316612084565b61152a602061151b86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b9050818061156860208701516001600160401b031690565b9260401c1691161115386114ae565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861148b565b634e487b7160e01b600052601160045260246000fd5b906115ca5760028160008093558260018201550155565b611426565b80518210156103625760209160051b010190565b600e54600160401b811015610398578060016116029201600e55610327565b9190916115ca57805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b90600e546000600e55806116ae575b5060005b82518110156116a957806116a361169d600193866115cf565b516115e3565b01611684565b509050565b6003908060030290600382040361171657600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd908101905b8181106116f8575050611680565b80611710849260026000918281558260018201550155565b016116ea565b61159d565b602081015190606060408201519101516040519160208301938452604083015260608201526060815261174d816103b8565b51902090565b604051906117608261037d565b60006020838281520152565b60001981019190821161171657565b9190820391821161171657565b611790611753565b50600e54906117a66117a18361176c565b610327565b50906117c06113306001809401546001600160401b031690565b81101561183c576117dc611330600d546001600160401b031690565b8381106118015750505060016117f76117a16117fe9361176c565b5001610450565b90565b816118216113308561181285610327565b5001546001600160401b031690565b1161182d5782016117dc565b6117fe93506117f79150610327565b604051631856a49960e21b8152600490fd5b9190926118659061185d612988565b611403612988565b61186d612988565b6001600160401b03908161188884516001600160401b031690565b16158015906119b9575b80156119ad575b80156119a1575b8015611995575b801561198c575b61197a576104219361194961196f926118fe866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b82516004556020830151600555604083015160065560608301516007556119248661143c565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b61196a6119558261171b565b9182600055519161196583600155565b600255565b600355565b804216904316612084565b6040516350dd03f760e11b8152600490fd5b508351156118ae565b506060840151156118a7565b506040840151156118a0565b50602084015115611899565b506119d161133060208501516001600160401b031690565b1515611892565b6001600160a01b03908116908115611a3357600080516020612a5d83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612a5d833981519152546001600160a01b03163303611a6d57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611aae57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b604051906101008083018381106001600160401b0382111761039857604052368337565b90816020910312610232575180151581036102325790565b6000915b60088310611b4057505050565b600190825181526020809101920192019190611b33565b61046090611b7083825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611bce610100928386019060208091805184520151910152565b60a081015191611bee610140938487019060208091805184520151910152565b60c082015192611c0e610180948588019060208091805184520151910152565b60e083015191611c2e6101c0938489019060208091805184520151910152565b830151611c4b610200918289019060208091805184520151910152565b61012084015191611c6c61024093848a019060208091805184520151910152565b84015192611c8a61028094858a019060208091805184520151910152565b611cc561016086015196611cae6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b61060090611f5861042194969593966102a0610a808401988051855260208101516020860152611d6e6040820151604087019060208091805184520151910152565b6060810151805160808701526020015160a08601526080810151805160c08701526020015160e086015260a0810151611db7610100918288019060208091805184520151910152565b611f2486611ef560c0850151611ddd610140918285019060208091805184520151910152565b611ec660e087015195611e00610180978887019060208091805184520151910152565b870151611e1d6101c0918287019060208091805184520151910152565b611e5a61012089015193611e41610200958689019060208091805184520151910152565b8901516102408097019060208091805184520151910152565b611e978c6102c06101608b015199611e826102809b8c85019060208091805184520151910152565b8b015191019060208091805184520151910152565b6101a088015180516103008e0152602001516103208d015287015180516103408d0152602001516103608c0152565b6101e086015180516103808c0152602001516103a08b015285015180516103c08b0152602001516103e08a0152565b61022084015180516104008a015260200151610420890152830151805161044089015260200151610460880152565b6102608201518051610480880152602001516104a08701528101516104c086015201516104e0840152610500830190611b2f565b0190611b57565b6040513d6000823e3d90fd5b602090611f76612305565b6040611f80611af3565b926001548452611f9a61133082516001600160401b031690565b85850152611fb4611330868301516001600160401b031690565b8285015201516060830152611fdd60405194859384936350f8d1a760e11b855260048501611d2c565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af490811561204e5760009161201f575b501561200d57565b6040516309bde33960e01b8152600490fd5b612041915060203d602011612047575b61203981836103d3565b810190611b17565b38612005565b503d61202f565b611f5f565b6001600160401b03918216908216039190821161171657565b6001600160401b038091169081146117165760010190565b90916120f361042193600e548015159081612159575b506120fd575b60406120b660208501516001600160401b031690565b9301516120d36120c4610414565b6001600160401b039095168552565b60208401526120e36120c4610423565b6001600160401b03166020840152565b60408201526115e3565b61211b6121156117a1600d546001600160401b031690565b906115b3565b612154612138612133600d546001600160401b031690565b61206c565b6001600160401b03166001600160401b0319600d541617600d55565b6120a0565b61219c915061216d6117a161217e9261176c565b505460401c6001600160401b031690565b61219661216d6117a1600d546001600160401b031690565b90612053565b6001600160401b036121c36121ba600c5463ffffffff9060a81c1690565b63ffffffff1690565b911610153861209a565b90816020910312610232575190565b8015611716576000190190565b6121f1610430565b906000825260006020830152612205611753565b6040830152612212611753565b606083015261221f611753565b608083015261222c611753565b60a0830152612239611753565b60c0830152612246611753565b60e0830152612253611753565b610100830152612261611753565b61012083015261226f611753565b61014083015261227d611753565b61016083015261228b611753565b610180830152612299611753565b6101a08301526122a7611753565b6101c08301526122b5611753565b6101e08301526122c3611753565b6102008301526122d1611753565b6102208301526122df611753565b6102408301526122ed611753565b610260830152600061028083015260006102a0830152565b61230d6121e9565b906201000082527f103a97f91d3df0aa53d6b2d7f29c4ebf4f323896827a8b8eeba30b7b039ce4a360206004818501527f16026254c01764d8b4fd70dc4cc51a74e0b32ba5f59e2a9e5ef169feeb7ca1ba81604086017f0d76329b8733b0b734ff0f60a40cb4c474064a8c755c1f6cbece5f7ea09d78a88151525101527f037e3a3fa0fefa3c08d50c07d472cba4274fd25c444f369d0d77db93e284f89e81606086017f124a0457892caf44e89d24b4f6eea80a0b1d532a3e59f1178b19e4caca8fbac38151525101527f1eb78f5dcd1e962bc4e33ff6caa12c4161f09ed217cdb213cebbffb63e9e57b481608086017f0319b53e71a0078028b4f021e0d4448d3e849198f25f0fb47f36ae764c06e5938151525101527f06ad874b2a3707a73260072b13799115f94f048d9065f7730d710511dcd945ae8160a086017f0c83be8ca5514d2b5527eec4871feb09b1be54fcc00fec9477fd525c563be9168151525101527f23700dcfa17c63b4681f477ab548eeae1daba4aad95d02a8d8b4619fa6d637f08160c086017f1ea8aa071b4c9346a585bbdbeb45762f4e26c395a015ad67ad732ef431b3c5958151525101527f17d041ace4a15d7297ebdccc0e098c72542e30d9b3cf6fc37edc14025a9edeaa8160e086017f20fb1c68cbebab5356eb21d126b6f596bea1168a768b59e5fbf308d6382829258151525101527f2d6d41d0b5833fb077c78ee3705435ea113a71a6537b6980f58073701224342f8161010086017f168eeff859a5f7b2781aa3c72a2c0a7a58fa9408489e7b0c13ae2feb848f5aa28151525101527f17dc9e1677dad495da48a1d95f94351c2197990789f4168f1e5dd9a31dc3e4d18161012086017f2a3b9d424102b9787e4fbfc217805739be51dbe872181dc40138dc706ce421f98151525101527f0732f969323e1586a21a2f363cd625237adeb6c9e884b5f6afd0fb862fb05e958161014086017f1e002a101f63386609be9700527a3508421d17ce7b127a3b04887704cdbd2dc68151525101527f22b5b0a08cefb39624d5260eac0cb6c63fa3942325134470f05dfcc69660a7418161016086017f0a1f5be7e2dda4ee17525ca86d1e20a1656c8bb3ac88490903d71324abaf39268151525101527f1012a3feba794457614f15434858e921c06088ca254352b6668971005bb59d0c8161018086017f131f2fb07141ec50c2c72b3a2c5bc061ef04d8a451f6093303ece094fd0770178151525101527f0e85da2cabd81a33dd542840af2640c7087dd3aa2ec7267bfc1a6fe6b117b242816101a086017f2a304967c0db314ac3c0a6613e636fd620e3fc3a5e284d28fa2a33e770cf4bb48151525101527f0ca6acfed4a97c404df14351b34dd68181ecdc2a723e80ce4b4cf3a5ff2e2c4b816101c086017f25427d12f7080ca1c010c4a710f1718446ac78ddfbf8fc9024030914c5b7988b8151525101527f079bb1a022509123aeaa6861001db5f4e9b9729c98727adff2aba5d588ae512b816101e086017f2869eb8e7c2c4223b37279eb988b696041ca315cdb14c05f463e73f24a0de6608151525101527f16e014f5b76709d9268e9c375854edb6451a9d895d2d2b4f0f0369566df19dea8161020086017f0821eba1289e0cbcbb088a218b11556d799dfd9748eee76d18c656d2b1f2d0ef8151525101527f274a3b9ef788ddae87b2d74b7d4ee2cdd10eea605fdd631caf43ef705477ce088161022086017f21b4eb6afcdfa42cd369fd0c20fc38cb7e6d8b5e88fbcc488983ea79238ef05a8151525101527f09d97d7a627d8ec24a5fb1495fee2d5cec5cd9e5c5b42c4e4bea06d9e6726bd28161024086017f21af862a9f3c7ffb2f3ef7f0e22bf4678e94296b7fbe0b37516e9b6c5e581a5481515251015261026084017f29e5bd43838ac1cfc29f172286db4a41408faed0d08a9ce4998b2a2e22bd782e8151525101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808301527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a0830152565b90813b1561296757600080516020612a7d83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511561294c57612949916129b7565b50565b50503461295557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612a9d8339815191525460401c16156129a557565b604051631afcd79f60e31b8152600490fd5b6000806117fe93602081519101845af43d156129f5573d916129d883610aac565b926129e660405194856103d3565b83523d6000602085013e6129f9565b6060915b90612a205750805115612a0e57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612a53575b612a31575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612a2956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json index 613b0568c..9a972c70d 100644 --- a/contract-bindings/artifacts/LightClient_bytecode.json +++ b/contract-bindings/artifacts/LightClient_bytecode.json @@ -1 +1 @@ -"0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b60405161288990816100d282396080518181816109a40152610afc0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc146101d757806302b592f3146101d25780630d8e6e2c146101cd5780632063d4f7146101c85780632f79889d146101c3578063313df7b1146101be578063382b215a146101b95780634f1ef286146101b457806352d1902d146101af57806362827733146101aa57806369cc6a04146101a55780636f96bdae146101a0578063715018a61461019b57806376b6b7cb146101965780638584d23f146101915780638da5cb5b1461018c57806396c1ca61146101875780639baa3cc9146101825780639fdb54a71461017d578063a9a9c9f514610178578063ad3cb1cc14610173578063bd32519a1461016e578063c23b9e9e14610169578063ca6fe85514610164578063d24d933d1461015f578063e03033011461015a578063f2fde38b146101555763f9e50d191461015057600080fd5b611201565b6111d8565b6110d3565b611098565b61107a565b611053565b61102d565b610fb0565b610f79565b610f3a565b610ded565b610d66565b610d1d565b610ce0565b610cc2565b610c57565b610c0c565b610b72565b610b54565b610ae9565b61092a565b6108f1565b6108c8565b6108a1565b610749565b6104ad565b610437565b61020e565b600435906001600160a01b03821682036101f257565b600080fd5b61010435906001600160a01b03821682036101f257565b346101f25760203660031901126101f2576102276101dc565b61022f6116d9565b6001600160a01b039081169081156102bf57600c5490811682146102ad5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561032257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b6102d1565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761035857604052565b610327565b606081019081106001600160401b0382111761035857604052565b608081019081106001600160401b0382111761035857604052565b90601f801991011681019081106001600160401b0382111761035857604052565b604051906102e082018281106001600160401b0382111761035857604052565b604051906103e18261033d565b565b604051906103e18261035d565b604051906102c082018281106001600160401b0382111761035857604052565b9060405161041d8161033d565b6020600182946001600160401b0381541684520154910152565b346101f25760203660031901126101f257600435600e548110156101f2576104606080916102e7565b506104ab81549161047b60016001600160401b039201610410565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b346101f25760003660031901126101f2576060604051600181526000602082015260006040820152f35b60609060031901126101f257604051906104f08261035d565b816001600160401b0360043581811681036101f257825260243590811681036101f25760208201526040604435910152565b60409060631901126101f2576040519061053b8261033d565b60643582526084356020830152565b60409060a31901126101f257604051906105638261033d565b60a435825260c4356020830152565b60409060e31901126101f2576040519061058b8261033d565b60e4358252610104356020830152565b6040906101231901126101f257604051906105b58261033d565b610124358252610144356020830152565b6040906101631901126101f257604051906105e08261033d565b610164358252610184356020830152565b6040906101a31901126101f2576040519061060b8261033d565b6101a43582526101c4356020830152565b6040906101e31901126101f257604051906106368261033d565b6101e4358252610204356020830152565b6040906102231901126101f257604051906106618261033d565b610224358252610244356020830152565b6040906102631901126101f2576040519061068c8261033d565b610264358252610284356020830152565b6040906102a31901126101f257604051906106b78261033d565b6102a43582526102c4356020830152565b6040906102e31901126101f257604051906106e28261033d565b6102e4358252610304356020830152565b6040906103231901126101f2576040519061070d8261033d565b610324358252610344356020830152565b6040906103631901126101f257604051906107388261033d565b610364358252610384356020830152565b346101f2576104e03660031901126101f257610764366104d7565b6104803660631901126101f25761089f9061077d6103b4565b9061078736610522565b82526107923661054a565b60208301526107a036610572565b60408301526107ae3661059b565b60608301526107bc366105c6565b60808301526107ca366105f1565b60a08301526107d83661061c565b60c08301526107e636610647565b60e08301526107f436610672565b6101008301526108033661069d565b610120830152610812366106c8565b610140830152610821366106f3565b6101608301526108303661071e565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c083015261125c565b005b346101f25760003660031901126101f25760206001600160401b03600d5416604051908152f35b346101f25760003660031901126101f257600c546040516001600160a01b039091168152602090f35b346101f25760003660031901126101f2576020600254604051908152f35b6001600160401b03811161035857601f01601f191660200190565b6040806003193601126101f25761093f6101dc565b6024356001600160401b0381116101f257366023820112156101f25780600401359061096a8261090f565b9161097785519384610393565b80835260209136602483830101116101f25781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610acd575b50610abc5790806004926109e26116d9565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610a8d575b5050610a52578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b60008051602061283d8339815191528193929303610a745761089f83836126a1565b8351632a87526960e21b81526004810191909152602490fd5b610aad929350803d10610ab5575b610aa58183610393565b810190611f9a565b903880610a2c565b503d610a9b565b845163703e46dd60e11b8152600490fd5b90508160008051602061283d83398151915254161415386109d0565b346101f25760003660031901126101f2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610b4257602060405160008051602061283d8339815191528152f35b60405163703e46dd60e11b8152600490fd5b346101f25760003660031901126101f2576020600154604051908152f35b346101f257600080600319360112610bd157610b8c6116d9565b600c5460ff8160a01c166000146102ad576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b60809060631901126101f25760405190610bed82610378565b6064358252608435602083015260a435604083015260c4356060830152565b346101f25760803660031901126101f2576020610c4f604051610c2e81610378565b60043581526024358382015260443560408201526064356060820152611380565b604051908152f35b346101f257600080600319360112610bd157610c716116d9565b60008051602061281d83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b346101f25760003660031901126101f2576020600054604051908152f35b346101f25760203660031901126101f2576040610cfe600435611408565b6104ab82518092602080916001600160401b0381511684520151910152565b346101f25760003660031901126101f25760008051602061281d833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff821682036101f257565b346101f25760203660031901126101f25760043563ffffffff8082168083036101f257610d916116d9565b610e108110918215610ddb575b5050610dc957600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610d9e565b346101f2576101203660031901126101f257610e08366104d7565b610e1136610bd4565b90610e1a610d53565b610e226101f7565b9060008051602061285d83398151915254936001600160401b0360ff8660401c1615951680159081610f32575b6001149081610f28575b159081610f1f575b50610f0d5760008051602061285d833981519152805467ffffffffffffffff19166001179055610e959385610ee8576114ce565b610e9b57005b60008051602061285d833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102a8565b60008051602061285d833981519152805460ff60401b1916600160401b1790556114ce565b60405163f92ee8a960e01b8152600490fd5b90501538610e61565b303b159150610e59565b869150610e4f565b346101f25760003660031901126101f257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b0390f35b346101f25760003660031901126101f257608060045460055460065460075491604051938452602084015260408301526060820152f35b346101f25760003660031901126101f2576040805190610fcf8261033d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b83811061101a5784604081866000838284010152601f80199101168101030190f35b8581018301518582018301528201610ff8565b346101f25760003660031901126101f257602060ff600c5460a01c166040519015158152f35b346101f25760003660031901126101f257602063ffffffff600c5460a81c16604051908152f35b346101f25760003660031901126101f2576020600354604051908152f35b346101f25760003660031901126101f257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b346101f25760403660031901126101f257600435600e5443821180156111ce575b61115b576000916111066000926113e7565b9161112861111c600d546001600160401b031690565b6001600160401b031690565b925b811561116d575b509091501561115b5761114a610f7592602435926113fb565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b8261118b61111c61117d846102e7565b50546001600160401b031690565b11156111b4575b600281106111af578381146111af576111aa90611658565b61112a565b611131565b93505060016111c861111c61117d866102e7565b93611192565b50600381106110f4565b346101f25760203660031901126101f25761089f6111f46101dc565b6111fc6116d9565b611665565b346101f25760003660031901126101f2576020600e54604051908152f35b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c16908161136c575b5061135a578151600a546001600160401b03918183169083161180159190611333575b50611321577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906112d060408501936112ca8551611712565b85611bf8565b6112d98461121f565b6112e884824216834316611e51565b61130d60206112fe86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b9050818061134b60208701516001600160401b031690565b9260401c169116111538611291565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861126e565b60208101519060606040820151910151604051916020830193845260408301526060820152606081526113b281610378565b51902090565b604051906113c58261033d565b60006020838281520152565b634e487b7160e01b600052601160045260246000fd5b6000198101919082116113f657565b6113d1565b919082039182116113f657565b6114106113b8565b50600e5490611426611421836113e7565b6102e7565b509061144061111c6001809401546001600160401b031690565b8110156114bc5761145c61111c600d546001600160401b031690565b83811061148157505050600161147761142161147e936113e7565b5001610410565b90565b816114a161111c85611492856102e7565b5001546001600160401b031690565b116114ad57820161145c565b61147e935061147791506102e7565b604051631856a49960e21b8152600490fd5b9190926114e5906114dd612748565b6111fc612748565b6114ed612748565b6001600160401b03908161150884516001600160401b031690565b1615801590611639575b801561162d575b8015611621575b8015611615575b801561160c575b6115fa576103e1936115c96115ef9261157e866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b82516004556020830151600555604083015160065560608301516007556115a48661121f565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b6115ea6115d582611380565b918260005551916115e583600155565b600255565b600355565b804216904316611e51565b6040516350dd03f760e11b8152600490fd5b5083511561152e565b50606084015115611527565b50604084015115611520565b50602084015115611519565b5061165161111c60208501516001600160401b031690565b1515611512565b80156113f6576000190190565b6001600160a01b039081169081156116c05760008051602061281d83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b60008051602061281d833981519152546001600160a01b031633036116fa57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561173b57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b604051906101008083018381106001600160401b0382111761035857604052368337565b908160209103126101f2575180151581036101f25790565b6000915b600883106117cd57505050565b6001908251815260208091019201920191906117c0565b610460906117fd83825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e084015260808101519061185b610100928386019060208091805184520151910152565b60a08101519161187b610140938487019060208091805184520151910152565b60c08201519261189b610180948588019060208091805184520151910152565b60e0830151916118bb6101c0938489019060208091805184520151910152565b8301516118d8610200918289019060208091805184520151910152565b610120840151916118f961024093848a019060208091805184520151910152565b8401519261191761028094858a019060208091805184520151910152565b6119526101608601519661193b6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b61060090611be56103e194969593966102a0610a8084019880518552602081015160208601526119fb6040820151604087019060208091805184520151910152565b6060810151805160808701526020015160a08601526080810151805160c08701526020015160e086015260a0810151611a44610100918288019060208091805184520151910152565b611bb186611b8260c0850151611a6a610140918285019060208091805184520151910152565b611b5360e087015195611a8d610180978887019060208091805184520151910152565b870151611aaa6101c0918287019060208091805184520151910152565b611ae761012089015193611ace610200958689019060208091805184520151910152565b8901516102408097019060208091805184520151910152565b611b248c6102c06101608b015199611b0f6102809b8c85019060208091805184520151910152565b8b015191019060208091805184520151910152565b6101a088015180516103008e0152602001516103208d015287015180516103408d0152602001516103608c0152565b6101e086015180516103808c0152602001516103a08b015285015180516103c08b0152602001516103e08a0152565b61022084015180516104008a015260200151610420890152830151805161044089015260200151610460880152565b6102608201518051610480880152602001516104a08701528101516104c086015201516104e08401526105008301906117bc565b01906117e4565b6040513d6000823e3d90fd5b602090611c036120c5565b6040611c0d611780565b926001548452611c2761111c82516001600160401b031690565b85850152611c4161111c868301516001600160401b031690565b8285015201516060830152611c6a60405194859384936350f8d1a760e11b8552600485016119b9565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af4908115611cdb57600091611cac575b5015611c9a57565b6040516309bde33960e01b8152600490fd5b611cce915060203d602011611cd4575b611cc68183610393565b8101906117a4565b38611c92565b503d611cbc565b611bec565b6001600160401b0391821690821603919082116113f657565b90611d105760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146113f65760010190565b600e54600160401b811015610358576001810180600e5581101561032257602060037fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff92600e6000520292611e4a6040857fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01926001600160401b0393611dde8583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe8601906001600160401b03166001600160401b0319825416179055565b0151910155565b9091611ec06103e193600e548015159081611f26575b50611eca575b6040611e8360208501516001600160401b031690565b930151611ea0611e916103d4565b6001600160401b039095168552565b6020840152611eb0611e916103e3565b6001600160401b03166020840152565b6040820152611d3e565b611ee8611ee2611421600d546001600160401b031690565b90611cf9565b611f21611f05611f00600d546001600160401b031690565b611d26565b6001600160401b03166001600160401b0319600d541617600d55565b611e6d565b611f699150611f3a611421611f4b926113e7565b505460401c6001600160401b031690565b611f63611f3a611421600d546001600160401b031690565b90611ce0565b6001600160401b03611f90611f87600c5463ffffffff9060a81c1690565b63ffffffff1690565b9116101538611e67565b908160209103126101f2575190565b611fb16103f0565b906000825260006020830152611fc56113b8565b6040830152611fd26113b8565b6060830152611fdf6113b8565b6080830152611fec6113b8565b60a0830152611ff96113b8565b60c08301526120066113b8565b60e08301526120136113b8565b6101008301526120216113b8565b61012083015261202f6113b8565b61014083015261203d6113b8565b61016083015261204b6113b8565b6101808301526120596113b8565b6101a08301526120676113b8565b6101c08301526120756113b8565b6101e08301526120836113b8565b6102008301526120916113b8565b61022083015261209f6113b8565b6102408301526120ad6113b8565b610260830152600061028083015260006102a0830152565b6120cd611fa9565b906210000082527f16183280aff7c1ca4982013d14907ffc00ad9aaf62e3060c60fd5650310294fe60206004818501527f20f8ed3de77af84f07ab14e0e3a6af9609d179bd825068fca7f5d10de9cec1d081604086017f2594eb9237b7cc992b0aff6541c0b4f6dbaa9235366de2e5e08eb7ed415d6f5e8151525101527f1fcf82acfe5e7b819ff344ac2a25dfbaa3fb12fb03696ab24f52210896a976f581606086017f23662f2d65f6af786069b0feb61ab3d9cc2dd3e67ccbf422a223c7fa55f44ee68151525101527f1181da971e46128143c9f733b3dfb9ccfed793481cec98e4576d550342a4d60c81608086017f1e4ba740bce3f5c1b696a6b838a9267e00de6cb86fb635db305eeb4874f0f9268151525101527f0de74676a34741220f476bae49ec09f859d46c7f8c63cc5f76d494a09e4484138160a086017f1d31ad0a55e8f8c6f922b0841d4ed606339ed063e86932328c202647a70ed7cd8151525101527f01d88d68cb48acf2ebd1d69e0fc38d5fb188c1c87792d9debfde6e48b52135628160c086017f1f0a8ad12bd711b801c05a04926676385733cd886b30414dc8a9455f5ee1ccf08151525101527f10b1aa078508c19c234d1c48764ecea93aeeb26627aa9169b3c3f8dd9722a6468160e086017f2d6bd0f4fd66b3f1183ef8e83be754d47b3f2108d5583c80d669f65fa8a6c6888151525101527f15a424f82f95e588a93ce0eb93369b35291fd603e490dece7bab07e181d9b9558161010086017f29e8cb6f4a4499852ba317b86e5fa40e53476c42e37c1a87d9a2ad21625d54868151525101527f1b1a9dce8744e1accfa8ee724b09cad428a70cbd569efe2b46e927565f6479468161012086017f210a0dcd7c615d5963ba67f22090dd66843d3757b9a17d0729971812c03345798151525101527f1ec91c705e7482be0f5768f598869716b93e1aba284ab207a01acaf5b90875778161014086017f1af7507105277eafd94dc06bd01521a9fa91f7743cfcd896c2289df0696e2e578151525101527f0d9eb0e9d5a0f218673c5b8883b1bc65064c7c57ddf370b534da88e737e6f9998161016086017f0a870d4d26887f446f5d0cbace89ea87592732161a7adf4fed3c1bcd72d56b048151525101527f266dd2c45a9d95cd00c622c047eacb1e29c90c0ea7ab708406fe754ce27656118161018086017f236a6ee8b0a5bfcbe26f5609cc2f6a8a13d23dfd88b7c47c590b44a0fbc39fab8151525101527f243ae2d376579c21c88e353b3891b6f670ab016dbcae7a8cad2d010b01d8813e816101a086017f2dee8bf87e82bcee84ceb104d6cb4c9bec614129c7f9c1f8ccd1408293cc64508151525101527f08b7e3925fa4cfb08693c23f91307f6332f8c2d00d10fe22007e8f557f12d789816101c086017f17596bdefddb079bb27dcae8142e341f1a248b03ea686331fad0851af951f67d8151525101527f0abaa16f6ca8f4eb2effd49b0d1faea26a038bc6e138383882e6dfc86c729450816101e086017f0acf5e529d7177887ba6dc79a167a88cd6b7c11d863088959e76d07bb91cf5488151525101527f2eb99c6343db7834e1fc40625ac8b70cd64e8036b1e3d20d72f00efef151ec958161020086017f0ccffd9ebf84a35352134e5d30ac279f3259373b8894d7e8abe5d2a45c1d1ea28151525101527f0638a68ba70ce87098fccf3bf2b8d0c3558af5a1a349fc5081fce5684b3bafed8161022086017f0e9af80a46903c8d29d9593683381c704192d777d9736c0648401b2ff6e6756d8151525101527f0f1c97e91c16e627c4329e2f5c0c03e9980c6c0748b238d3ad661237c7c129938161024086017f10ca7993f6831bdcf2471213babb2e37f21decaeb08ff2cb817a28d6095f2a1681515251015261026084017f28b88da6722afe7e95789cb5fd5a74c97977d73c88d4eebd7bb45368807605718151525101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808301527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a0830152565b90813b156127275760008051602061283d83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511561270c5761270991612777565b50565b50503461271557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff60008051602061285d8339815191525460401c161561276557565b604051631afcd79f60e31b8152600490fd5b60008061147e93602081519101845af43d156127b5573d916127988361090f565b926127a66040519485610393565b83523d6000602085013e6127b9565b6060915b906127e057508051156127ce57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612813575b6127f1575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156127e956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b60405161288990816100d282396080518181816109db0152610b330152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc146101d757806302b592f3146101d25780630d8e6e2c146101cd5780632063d4f7146101c85780632f79889d146101c3578063313df7b1146101be578063382b215a146101b9578063426d3194146101b45780634f1ef286146101af57806352d1902d146101aa57806362827733146101a557806369cc6a04146101a05780636f96bdae1461019b578063715018a61461019657806376b6b7cb146101915780638584d23f1461018c5780638da5cb5b1461018757806396c1ca61146101825780639baa3cc91461017d5780639fdb54a714610178578063ad3cb1cc14610173578063bd32519a1461016e578063c23b9e9e14610169578063ca6fe85514610164578063d24d933d1461015f578063e03033011461015a578063f2fde38b146101555763f9e50d191461015057600080fd5b611201565b6111d8565b6110d3565b611098565b61107a565b611053565b61102d565b610fb0565b610f71565b610e24565b610d9d565b610d54565b610d17565b610cf9565b610c8e565b610c43565b610ba9565b610b8b565b610b20565b610961565b61090f565b6108f1565b6108c8565b6108a1565b610749565b6104ad565b610437565b61020e565b600435906001600160a01b03821682036101f257565b600080fd5b61010435906001600160a01b03821682036101f257565b346101f25760203660031901126101f2576102276101dc565b61022f6116d9565b6001600160a01b039081169081156102bf57600c5490811682146102ad5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561032257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b6102d1565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761035857604052565b610327565b606081019081106001600160401b0382111761035857604052565b608081019081106001600160401b0382111761035857604052565b90601f801991011681019081106001600160401b0382111761035857604052565b604051906102e082018281106001600160401b0382111761035857604052565b604051906103e18261033d565b565b604051906103e18261035d565b604051906102c082018281106001600160401b0382111761035857604052565b9060405161041d8161033d565b6020600182946001600160401b0381541684520154910152565b346101f25760203660031901126101f257600435600e548110156101f2576104606080916102e7565b506104ab81549161047b60016001600160401b039201610410565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b346101f25760003660031901126101f2576060604051600181526000602082015260006040820152f35b60609060031901126101f257604051906104f08261035d565b816001600160401b0360043581811681036101f257825260243590811681036101f25760208201526040604435910152565b60409060631901126101f2576040519061053b8261033d565b60643582526084356020830152565b60409060a31901126101f257604051906105638261033d565b60a435825260c4356020830152565b60409060e31901126101f2576040519061058b8261033d565b60e4358252610104356020830152565b6040906101231901126101f257604051906105b58261033d565b610124358252610144356020830152565b6040906101631901126101f257604051906105e08261033d565b610164358252610184356020830152565b6040906101a31901126101f2576040519061060b8261033d565b6101a43582526101c4356020830152565b6040906101e31901126101f257604051906106368261033d565b6101e4358252610204356020830152565b6040906102231901126101f257604051906106618261033d565b610224358252610244356020830152565b6040906102631901126101f2576040519061068c8261033d565b610264358252610284356020830152565b6040906102a31901126101f257604051906106b78261033d565b6102a43582526102c4356020830152565b6040906102e31901126101f257604051906106e28261033d565b6102e4358252610304356020830152565b6040906103231901126101f2576040519061070d8261033d565b610324358252610344356020830152565b6040906103631901126101f257604051906107388261033d565b610364358252610384356020830152565b346101f2576104e03660031901126101f257610764366104d7565b6104803660631901126101f25761089f9061077d6103b4565b9061078736610522565b82526107923661054a565b60208301526107a036610572565b60408301526107ae3661059b565b60608301526107bc366105c6565b60808301526107ca366105f1565b60a08301526107d83661061c565b60c08301526107e636610647565b60e08301526107f436610672565b6101008301526108033661069d565b610120830152610812366106c8565b610140830152610821366106f3565b6101608301526108303661071e565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c083015261125c565b005b346101f25760003660031901126101f25760206001600160401b03600d5416604051908152f35b346101f25760003660031901126101f257600c546040516001600160a01b039091168152602090f35b346101f25760003660031901126101f2576020600254604051908152f35b346101f25760003660031901126101f257608060045460055460065460075491604051938452602084015260408301526060820152f35b6001600160401b03811161035857601f01601f191660200190565b6040806003193601126101f2576109766101dc565b6024356001600160401b0381116101f257366023820112156101f2578060040135906109a182610946565b916109ae85519384610393565b80835260209136602483830101116101f25781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610b04575b50610af3579080600492610a196116d9565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610ac4575b5050610a89578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b60008051602061283d8339815191528193929303610aab5761089f83836126a1565b8351632a87526960e21b81526004810191909152602490fd5b610ae4929350803d10610aec575b610adc8183610393565b810190611f9a565b903880610a63565b503d610ad2565b845163703e46dd60e11b8152600490fd5b90508160008051602061283d8339815191525416141538610a07565b346101f25760003660031901126101f2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610b7957602060405160008051602061283d8339815191528152f35b60405163703e46dd60e11b8152600490fd5b346101f25760003660031901126101f2576020600154604051908152f35b346101f257600080600319360112610c0857610bc36116d9565b600c5460ff8160a01c166000146102ad576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b60809060631901126101f25760405190610c2482610378565b6064358252608435602083015260a435604083015260c4356060830152565b346101f25760803660031901126101f2576020610c86604051610c6581610378565b60043581526024358382015260443560408201526064356060820152611380565b604051908152f35b346101f257600080600319360112610c0857610ca86116d9565b60008051602061281d83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b346101f25760003660031901126101f2576020600054604051908152f35b346101f25760203660031901126101f2576040610d35600435611408565b6104ab82518092602080916001600160401b0381511684520151910152565b346101f25760003660031901126101f25760008051602061281d833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff821682036101f257565b346101f25760203660031901126101f25760043563ffffffff8082168083036101f257610dc86116d9565b610e108110918215610e12575b5050610e0057600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610dd5565b346101f2576101203660031901126101f257610e3f366104d7565b610e4836610c0b565b90610e51610d8a565b610e596101f7565b9060008051602061285d83398151915254936001600160401b0360ff8660401c1615951680159081610f69575b6001149081610f5f575b159081610f56575b50610f445760008051602061285d833981519152805467ffffffffffffffff19166001179055610ecc9385610f1f576114ce565b610ed257005b60008051602061285d833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102a8565b60008051602061285d833981519152805460ff60401b1916600160401b1790556114ce565b60405163f92ee8a960e01b8152600490fd5b90501538610e98565b303b159150610e90565b869150610e86565b346101f25760003660031901126101f257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b0390f35b346101f25760003660031901126101f2576040805190610fcf8261033d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b83811061101a5784604081866000838284010152601f80199101168101030190f35b8581018301518582018301528201610ff8565b346101f25760003660031901126101f257602060ff600c5460a01c166040519015158152f35b346101f25760003660031901126101f257602063ffffffff600c5460a81c16604051908152f35b346101f25760003660031901126101f2576020600354604051908152f35b346101f25760003660031901126101f257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b346101f25760403660031901126101f257600435600e5443821180156111ce575b61115b576000916111066000926113e7565b9161112861111c600d546001600160401b031690565b6001600160401b031690565b925b811561116d575b509091501561115b5761114a610fac92602435926113fb565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b8261118b61111c61117d846102e7565b50546001600160401b031690565b11156111b4575b600281106111af578381146111af576111aa90611658565b61112a565b611131565b93505060016111c861111c61117d866102e7565b93611192565b50600381106110f4565b346101f25760203660031901126101f25761089f6111f46101dc565b6111fc6116d9565b611665565b346101f25760003660031901126101f2576020600e54604051908152f35b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c16908161136c575b5061135a578151600a546001600160401b03918183169083161180159190611333575b50611321577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906112d060408501936112ca8551611712565b85611bf8565b6112d98461121f565b6112e884824216834316611e51565b61130d60206112fe86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b9050818061134b60208701516001600160401b031690565b9260401c169116111538611291565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861126e565b60208101519060606040820151910151604051916020830193845260408301526060820152606081526113b281610378565b51902090565b604051906113c58261033d565b60006020838281520152565b634e487b7160e01b600052601160045260246000fd5b6000198101919082116113f657565b6113d1565b919082039182116113f657565b6114106113b8565b50600e5490611426611421836113e7565b6102e7565b509061144061111c6001809401546001600160401b031690565b8110156114bc5761145c61111c600d546001600160401b031690565b83811061148157505050600161147761142161147e936113e7565b5001610410565b90565b816114a161111c85611492856102e7565b5001546001600160401b031690565b116114ad57820161145c565b61147e935061147791506102e7565b604051631856a49960e21b8152600490fd5b9190926114e5906114dd612748565b6111fc612748565b6114ed612748565b6001600160401b03908161150884516001600160401b031690565b1615801590611639575b801561162d575b8015611621575b8015611615575b801561160c575b6115fa576103e1936115c96115ef9261157e866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b82516004556020830151600555604083015160065560608301516007556115a48661121f565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b6115ea6115d582611380565b918260005551916115e583600155565b600255565b600355565b804216904316611e51565b6040516350dd03f760e11b8152600490fd5b5083511561152e565b50606084015115611527565b50604084015115611520565b50602084015115611519565b5061165161111c60208501516001600160401b031690565b1515611512565b80156113f6576000190190565b6001600160a01b039081169081156116c05760008051602061281d83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b60008051602061281d833981519152546001600160a01b031633036116fa57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561173b57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b604051906101008083018381106001600160401b0382111761035857604052368337565b908160209103126101f2575180151581036101f25790565b6000915b600883106117cd57505050565b6001908251815260208091019201920191906117c0565b610460906117fd83825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e084015260808101519061185b610100928386019060208091805184520151910152565b60a08101519161187b610140938487019060208091805184520151910152565b60c08201519261189b610180948588019060208091805184520151910152565b60e0830151916118bb6101c0938489019060208091805184520151910152565b8301516118d8610200918289019060208091805184520151910152565b610120840151916118f961024093848a019060208091805184520151910152565b8401519261191761028094858a019060208091805184520151910152565b6119526101608601519661193b6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b61060090611be56103e194969593966102a0610a8084019880518552602081015160208601526119fb6040820151604087019060208091805184520151910152565b6060810151805160808701526020015160a08601526080810151805160c08701526020015160e086015260a0810151611a44610100918288019060208091805184520151910152565b611bb186611b8260c0850151611a6a610140918285019060208091805184520151910152565b611b5360e087015195611a8d610180978887019060208091805184520151910152565b870151611aaa6101c0918287019060208091805184520151910152565b611ae761012089015193611ace610200958689019060208091805184520151910152565b8901516102408097019060208091805184520151910152565b611b248c6102c06101608b015199611b0f6102809b8c85019060208091805184520151910152565b8b015191019060208091805184520151910152565b6101a088015180516103008e0152602001516103208d015287015180516103408d0152602001516103608c0152565b6101e086015180516103808c0152602001516103a08b015285015180516103c08b0152602001516103e08a0152565b61022084015180516104008a015260200151610420890152830151805161044089015260200151610460880152565b6102608201518051610480880152602001516104a08701528101516104c086015201516104e08401526105008301906117bc565b01906117e4565b6040513d6000823e3d90fd5b602090611c036120c5565b6040611c0d611780565b926001548452611c2761111c82516001600160401b031690565b85850152611c4161111c868301516001600160401b031690565b8285015201516060830152611c6a60405194859384936350f8d1a760e11b8552600485016119b9565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af4908115611cdb57600091611cac575b5015611c9a57565b6040516309bde33960e01b8152600490fd5b611cce915060203d602011611cd4575b611cc68183610393565b8101906117a4565b38611c92565b503d611cbc565b611bec565b6001600160401b0391821690821603919082116113f657565b90611d105760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146113f65760010190565b600e54600160401b811015610358576001810180600e5581101561032257602060037fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff92600e6000520292611e4a6040857fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01926001600160401b0393611dde8583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe8601906001600160401b03166001600160401b0319825416179055565b0151910155565b9091611ec06103e193600e548015159081611f26575b50611eca575b6040611e8360208501516001600160401b031690565b930151611ea0611e916103d4565b6001600160401b039095168552565b6020840152611eb0611e916103e3565b6001600160401b03166020840152565b6040820152611d3e565b611ee8611ee2611421600d546001600160401b031690565b90611cf9565b611f21611f05611f00600d546001600160401b031690565b611d26565b6001600160401b03166001600160401b0319600d541617600d55565b611e6d565b611f699150611f3a611421611f4b926113e7565b505460401c6001600160401b031690565b611f63611f3a611421600d546001600160401b031690565b90611ce0565b6001600160401b03611f90611f87600c5463ffffffff9060a81c1690565b63ffffffff1690565b9116101538611e67565b908160209103126101f2575190565b611fb16103f0565b906000825260006020830152611fc56113b8565b6040830152611fd26113b8565b6060830152611fdf6113b8565b6080830152611fec6113b8565b60a0830152611ff96113b8565b60c08301526120066113b8565b60e08301526120136113b8565b6101008301526120216113b8565b61012083015261202f6113b8565b61014083015261203d6113b8565b61016083015261204b6113b8565b6101808301526120596113b8565b6101a08301526120676113b8565b6101c08301526120756113b8565b6101e08301526120836113b8565b6102008301526120916113b8565b61022083015261209f6113b8565b6102408301526120ad6113b8565b610260830152600061028083015260006102a0830152565b6120cd611fa9565b906210000082527f16183280aff7c1ca4982013d14907ffc00ad9aaf62e3060c60fd5650310294fe60206004818501527f20f8ed3de77af84f07ab14e0e3a6af9609d179bd825068fca7f5d10de9cec1d081604086017f2594eb9237b7cc992b0aff6541c0b4f6dbaa9235366de2e5e08eb7ed415d6f5e8151525101527f1fcf82acfe5e7b819ff344ac2a25dfbaa3fb12fb03696ab24f52210896a976f581606086017f23662f2d65f6af786069b0feb61ab3d9cc2dd3e67ccbf422a223c7fa55f44ee68151525101527f1181da971e46128143c9f733b3dfb9ccfed793481cec98e4576d550342a4d60c81608086017f1e4ba740bce3f5c1b696a6b838a9267e00de6cb86fb635db305eeb4874f0f9268151525101527f0de74676a34741220f476bae49ec09f859d46c7f8c63cc5f76d494a09e4484138160a086017f1d31ad0a55e8f8c6f922b0841d4ed606339ed063e86932328c202647a70ed7cd8151525101527f01d88d68cb48acf2ebd1d69e0fc38d5fb188c1c87792d9debfde6e48b52135628160c086017f1f0a8ad12bd711b801c05a04926676385733cd886b30414dc8a9455f5ee1ccf08151525101527f10b1aa078508c19c234d1c48764ecea93aeeb26627aa9169b3c3f8dd9722a6468160e086017f2d6bd0f4fd66b3f1183ef8e83be754d47b3f2108d5583c80d669f65fa8a6c6888151525101527f15a424f82f95e588a93ce0eb93369b35291fd603e490dece7bab07e181d9b9558161010086017f29e8cb6f4a4499852ba317b86e5fa40e53476c42e37c1a87d9a2ad21625d54868151525101527f1b1a9dce8744e1accfa8ee724b09cad428a70cbd569efe2b46e927565f6479468161012086017f210a0dcd7c615d5963ba67f22090dd66843d3757b9a17d0729971812c03345798151525101527f1ec91c705e7482be0f5768f598869716b93e1aba284ab207a01acaf5b90875778161014086017f1af7507105277eafd94dc06bd01521a9fa91f7743cfcd896c2289df0696e2e578151525101527f0d9eb0e9d5a0f218673c5b8883b1bc65064c7c57ddf370b534da88e737e6f9998161016086017f0a870d4d26887f446f5d0cbace89ea87592732161a7adf4fed3c1bcd72d56b048151525101527f266dd2c45a9d95cd00c622c047eacb1e29c90c0ea7ab708406fe754ce27656118161018086017f236a6ee8b0a5bfcbe26f5609cc2f6a8a13d23dfd88b7c47c590b44a0fbc39fab8151525101527f243ae2d376579c21c88e353b3891b6f670ab016dbcae7a8cad2d010b01d8813e816101a086017f2dee8bf87e82bcee84ceb104d6cb4c9bec614129c7f9c1f8ccd1408293cc64508151525101527f08b7e3925fa4cfb08693c23f91307f6332f8c2d00d10fe22007e8f557f12d789816101c086017f17596bdefddb079bb27dcae8142e341f1a248b03ea686331fad0851af951f67d8151525101527f0abaa16f6ca8f4eb2effd49b0d1faea26a038bc6e138383882e6dfc86c729450816101e086017f0acf5e529d7177887ba6dc79a167a88cd6b7c11d863088959e76d07bb91cf5488151525101527f2eb99c6343db7834e1fc40625ac8b70cd64e8036b1e3d20d72f00efef151ec958161020086017f0ccffd9ebf84a35352134e5d30ac279f3259373b8894d7e8abe5d2a45c1d1ea28151525101527f0638a68ba70ce87098fccf3bf2b8d0c3558af5a1a349fc5081fce5684b3bafed8161022086017f0e9af80a46903c8d29d9593683381c704192d777d9736c0648401b2ff6e6756d8151525101527f0f1c97e91c16e627c4329e2f5c0c03e9980c6c0748b238d3ad661237c7c129938161024086017f10ca7993f6831bdcf2471213babb2e37f21decaeb08ff2cb817a28d6095f2a1681515251015261026084017f28b88da6722afe7e95789cb5fd5a74c97977d73c88d4eebd7bb45368807605718151525101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808301527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a0830152565b90813b156127275760008051602061283d83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511561270c5761270991612777565b50565b50503461271557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff60008051602061285d8339815191525460401c161561276557565b604051631afcd79f60e31b8152600490fd5b60008061147e93602081519101845af43d156127b5573d9161279883610946565b926127a66040519485610393565b83523d6000602085013e6127b9565b6060915b906127e057508051156127ce57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612813575b6127f1575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156127e956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/src/light_client.rs b/contract-bindings/src/light_client.rs index 362695980..df474c11a 100644 --- a/contract-bindings/src/light_client.rs +++ b/contract-bindings/src/light_client.rs @@ -47,7 +47,9 @@ pub mod light_client { ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ],), internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("struct LightClient.StakeState",), + ::std::borrow::ToOwned::to_owned( + "struct LightClient.StakeTableState", + ), ), },], outputs: ::std::vec![::ethers::core::abi::ethabi::Param { @@ -136,9 +138,9 @@ pub mod light_client { },], ), ( - ::std::borrow::ToOwned::to_owned("genesisStakeState"), + ::std::borrow::ToOwned::to_owned("genesisStakeTableState"), ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("genesisStakeState"), + name: ::std::borrow::ToOwned::to_owned("genesisStakeTableState",), inputs: ::std::vec![], outputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { @@ -149,21 +151,21 @@ pub mod light_client { ), }, ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("stakeTableBlsKeyComm",), + name: ::std::borrow::ToOwned::to_owned("blsKeyComm"), 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",), + name: ::std::borrow::ToOwned::to_owned("schnorrKeyComm"), 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",), + name: ::std::borrow::ToOwned::to_owned("amountComm"), kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), internal_type: ::core::option::Option::Some( ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), @@ -300,7 +302,7 @@ pub mod light_client { ), }, ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_genesisStakeState",), + name: ::std::borrow::ToOwned::to_owned("_genesisStakeTableState",), kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), @@ -309,7 +311,7 @@ pub mod light_client { ],), internal_type: ::core::option::Option::Some( ::std::borrow::ToOwned::to_owned( - "struct LightClient.StakeState", + "struct LightClient.StakeTableState", ), ), }, @@ -1047,7 +1049,7 @@ pub mod light_client { ///Calls the contract's `computeStakeTableComm` (0x6f96bdae) function pub fn compute_stake_table_comm( &self, - state: StakeState, + state: StakeTableState, ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash([111, 150, 189, 174], (state,)) @@ -1086,8 +1088,8 @@ pub mod light_client { .method_hash([202, 111, 232, 85], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `genesisStakeState` (0xa9a9c9f5) function - pub fn genesis_stake_state( + ///Calls the contract's `genesisStakeTableState` (0x426d3194) function + pub fn genesis_stake_table_state( &self, ) -> ::ethers::contract::builders::ContractCall< M, @@ -1099,7 +1101,7 @@ pub mod light_client { ), > { self.0 - .method_hash([169, 169, 201, 245], ()) + .method_hash([66, 109, 49, 148], ()) .expect("method not found (this should never happen)") } ///Calls the contract's `genesisState` (0xd24d933d) function @@ -1138,7 +1140,7 @@ pub mod light_client { pub fn initialize( &self, genesis: LightClientState, - genesis_stake_state: StakeState, + genesis_stake_table_state: StakeTableState, state_history_retention_period: u32, owner: ::ethers::core::types::Address, ) -> ::ethers::contract::builders::ContractCall { @@ -1147,7 +1149,7 @@ pub mod light_client { [155, 170, 60, 201], ( genesis, - genesis_stake_state, + genesis_stake_table_state, state_history_retention_period, owner, ), @@ -2354,7 +2356,7 @@ pub mod light_client { abi = "computeStakeTableComm((uint256,uint256,uint256,uint256))" )] pub struct ComputeStakeTableCommCall { - pub state: StakeState, + pub state: StakeTableState, } ///Container type for all input parameters for the `disablePermissionedProverMode` function with signature `disablePermissionedProverMode()` and selector `0x69cc6a04` #[derive( @@ -2422,7 +2424,7 @@ pub mod light_client { )] #[ethcall(name = "frozenThreshold", abi = "frozenThreshold()")] pub struct FrozenThresholdCall; - ///Container type for all input parameters for the `genesisStakeState` function with signature `genesisStakeState()` and selector `0xa9a9c9f5` + ///Container type for all input parameters for the `genesisStakeTableState` function with signature `genesisStakeTableState()` and selector `0x426d3194` #[derive( Clone, ::ethers::contract::EthCall, @@ -2435,8 +2437,8 @@ pub mod light_client { Eq, Hash, )] - #[ethcall(name = "genesisStakeState", abi = "genesisStakeState()")] - pub struct GenesisStakeStateCall; + #[ethcall(name = "genesisStakeTableState", abi = "genesisStakeTableState()")] + pub struct GenesisStakeTableStateCall; ///Container type for all input parameters for the `genesisState` function with signature `genesisState()` and selector `0xd24d933d` #[derive( Clone, @@ -2518,7 +2520,7 @@ pub mod light_client { )] pub struct InitializeCall { pub genesis: LightClientState, - pub genesis_stake_state: StakeState, + pub genesis_stake_table_state: StakeTableState, pub state_history_retention_period: u32, pub owner: ::ethers::core::types::Address, } @@ -2802,7 +2804,7 @@ pub mod light_client { FinalizedState(FinalizedStateCall), FrozenStakeTableCommitment(FrozenStakeTableCommitmentCall), FrozenThreshold(FrozenThresholdCall), - GenesisStakeState(GenesisStakeStateCall), + GenesisStakeTableState(GenesisStakeTableStateCall), GenesisState(GenesisStateCall), GetHotShotCommitment(GetHotShotCommitmentCall), GetStateHistoryCount(GetStateHistoryCountCall), @@ -2861,9 +2863,9 @@ pub mod light_client { return Ok(Self::FrozenThreshold(decoded)); } if let Ok(decoded) = - ::decode(data) + ::decode(data) { - return Ok(Self::GenesisStakeState(decoded)); + return Ok(Self::GenesisStakeTableState(decoded)); } if let Ok(decoded) = ::decode(data) { @@ -2982,7 +2984,9 @@ pub mod light_client { ::ethers::core::abi::AbiEncode::encode(element) } Self::FrozenThreshold(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::GenesisStakeState(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::GenesisStakeTableState(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::GenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GetHotShotCommitment(element) => { ::ethers::core::abi::AbiEncode::encode(element) @@ -3040,7 +3044,7 @@ pub mod light_client { Self::FinalizedState(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::GenesisStakeState(element) => ::core::fmt::Display::fmt(element, f), + Self::GenesisStakeTableState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisState(element) => ::core::fmt::Display::fmt(element, f), Self::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f), Self::GetStateHistoryCount(element) => ::core::fmt::Display::fmt(element, f), @@ -3097,9 +3101,9 @@ pub mod light_client { Self::FrozenThreshold(value) } } - impl ::core::convert::From for LightClientCalls { - fn from(value: GenesisStakeStateCall) -> Self { - Self::GenesisStakeState(value) + impl ::core::convert::From for LightClientCalls { + fn from(value: GenesisStakeTableStateCall) -> Self { + Self::GenesisStakeTableState(value) } } impl ::core::convert::From for LightClientCalls { @@ -3281,7 +3285,7 @@ pub mod light_client { Hash, )] pub struct FrozenThresholdReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `genesisStakeState` function with signature `genesisStakeState()` and selector `0xa9a9c9f5` + ///Container type for all return fields from the `genesisStakeTableState` function with signature `genesisStakeTableState()` and selector `0x426d3194` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3294,11 +3298,11 @@ pub mod light_client { Eq, Hash, )] - pub struct GenesisStakeStateReturn { + pub struct GenesisStakeTableStateReturn { pub threshold: ::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 bls_key_comm: ::ethers::core::types::U256, + pub schnorr_key_comm: ::ethers::core::types::U256, + pub amount_comm: ::ethers::core::types::U256, } ///Container type for all return fields from the `genesisState` function with signature `genesisState()` and selector `0xd24d933d` #[derive( diff --git a/contract-bindings/src/light_client_mock.rs b/contract-bindings/src/light_client_mock.rs index b661f831b..f1d07f1a9 100644 --- a/contract-bindings/src/light_client_mock.rs +++ b/contract-bindings/src/light_client_mock.rs @@ -28,7 +28,7 @@ pub mod light_client_mock { ), }, ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("genesisStakeState"), + name: ::std::borrow::ToOwned::to_owned("genesisStakeTableState"), kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), @@ -36,7 +36,7 @@ pub mod light_client_mock { ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ],), internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("struct LightClient.StakeState",), + ::std::borrow::ToOwned::to_owned("struct LightClient.StakeTableState",), ), }, ::ethers::core::abi::ethabi::Param { @@ -78,7 +78,9 @@ pub mod light_client_mock { ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ],), internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("struct LightClient.StakeState",), + ::std::borrow::ToOwned::to_owned( + "struct LightClient.StakeTableState", + ), ), },], outputs: ::std::vec![::ethers::core::abi::ethabi::Param { @@ -167,9 +169,9 @@ pub mod light_client_mock { },], ), ( - ::std::borrow::ToOwned::to_owned("genesisStakeState"), + ::std::borrow::ToOwned::to_owned("genesisStakeTableState"), ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("genesisStakeState"), + name: ::std::borrow::ToOwned::to_owned("genesisStakeTableState",), inputs: ::std::vec![], outputs: ::std::vec![ ::ethers::core::abi::ethabi::Param { @@ -180,21 +182,21 @@ pub mod light_client_mock { ), }, ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("stakeTableBlsKeyComm",), + name: ::std::borrow::ToOwned::to_owned("blsKeyComm"), 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",), + name: ::std::borrow::ToOwned::to_owned("schnorrKeyComm"), 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",), + name: ::std::borrow::ToOwned::to_owned("amountComm"), kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), internal_type: ::core::option::Option::Some( ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), @@ -331,7 +333,7 @@ pub mod light_client_mock { ), }, ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("_genesisStakeState",), + name: ::std::borrow::ToOwned::to_owned("_genesisStakeTableState",), kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ::ethers::core::abi::ethabi::ParamType::Uint(256usize), @@ -340,7 +342,7 @@ pub mod light_client_mock { ],), internal_type: ::core::option::Option::Some( ::std::borrow::ToOwned::to_owned( - "struct LightClient.StakeState", + "struct LightClient.StakeTableState", ), ), }, @@ -1155,7 +1157,7 @@ pub mod light_client_mock { ///Calls the contract's `computeStakeTableComm` (0x6f96bdae) function pub fn compute_stake_table_comm( &self, - state: StakeState, + state: StakeTableState, ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash([111, 150, 189, 174], (state,)) @@ -1194,8 +1196,8 @@ pub mod light_client_mock { .method_hash([202, 111, 232, 85], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `genesisStakeState` (0xa9a9c9f5) function - pub fn genesis_stake_state( + ///Calls the contract's `genesisStakeTableState` (0x426d3194) function + pub fn genesis_stake_table_state( &self, ) -> ::ethers::contract::builders::ContractCall< M, @@ -1207,7 +1209,7 @@ pub mod light_client_mock { ), > { self.0 - .method_hash([169, 169, 201, 245], ()) + .method_hash([66, 109, 49, 148], ()) .expect("method not found (this should never happen)") } ///Calls the contract's `genesisState` (0xd24d933d) function @@ -1246,7 +1248,7 @@ pub mod light_client_mock { pub fn initialize( &self, genesis: LightClientState, - genesis_stake_state: StakeState, + genesis_stake_table_state: StakeTableState, state_history_retention_period: u32, owner: ::ethers::core::types::Address, ) -> ::ethers::contract::builders::ContractCall { @@ -1255,7 +1257,7 @@ pub mod light_client_mock { [155, 170, 60, 201], ( genesis, - genesis_stake_state, + genesis_stake_table_state, state_history_retention_period, owner, ), @@ -2499,7 +2501,7 @@ pub mod light_client_mock { abi = "computeStakeTableComm((uint256,uint256,uint256,uint256))" )] pub struct ComputeStakeTableCommCall { - pub state: StakeState, + pub state: StakeTableState, } ///Container type for all input parameters for the `disablePermissionedProverMode` function with signature `disablePermissionedProverMode()` and selector `0x69cc6a04` #[derive( @@ -2567,7 +2569,7 @@ pub mod light_client_mock { )] #[ethcall(name = "frozenThreshold", abi = "frozenThreshold()")] pub struct FrozenThresholdCall; - ///Container type for all input parameters for the `genesisStakeState` function with signature `genesisStakeState()` and selector `0xa9a9c9f5` + ///Container type for all input parameters for the `genesisStakeTableState` function with signature `genesisStakeTableState()` and selector `0x426d3194` #[derive( Clone, ::ethers::contract::EthCall, @@ -2580,8 +2582,8 @@ pub mod light_client_mock { Eq, Hash, )] - #[ethcall(name = "genesisStakeState", abi = "genesisStakeState()")] - pub struct GenesisStakeStateCall; + #[ethcall(name = "genesisStakeTableState", abi = "genesisStakeTableState()")] + pub struct GenesisStakeTableStateCall; ///Container type for all input parameters for the `genesisState` function with signature `genesisState()` and selector `0xd24d933d` #[derive( Clone, @@ -2663,7 +2665,7 @@ pub mod light_client_mock { )] pub struct InitializeCall { pub genesis: LightClientState, - pub genesis_stake_state: StakeState, + pub genesis_stake_table_state: StakeTableState, pub state_history_retention_period: u32, pub owner: ::ethers::core::types::Address, } @@ -3019,7 +3021,7 @@ pub mod light_client_mock { FinalizedState(FinalizedStateCall), FrozenStakeTableCommitment(FrozenStakeTableCommitmentCall), FrozenThreshold(FrozenThresholdCall), - GenesisStakeState(GenesisStakeStateCall), + GenesisStakeTableState(GenesisStakeTableStateCall), GenesisState(GenesisStateCall), GetHotShotCommitment(GetHotShotCommitmentCall), GetStateHistoryCount(GetStateHistoryCountCall), @@ -3082,9 +3084,9 @@ pub mod light_client_mock { return Ok(Self::FrozenThreshold(decoded)); } if let Ok(decoded) = - ::decode(data) + ::decode(data) { - return Ok(Self::GenesisStakeState(decoded)); + return Ok(Self::GenesisStakeTableState(decoded)); } if let Ok(decoded) = ::decode(data) { @@ -3222,7 +3224,9 @@ pub mod light_client_mock { ::ethers::core::abi::AbiEncode::encode(element) } Self::FrozenThreshold(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::GenesisStakeState(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::GenesisStakeTableState(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::GenesisState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GetHotShotCommitment(element) => { ::ethers::core::abi::AbiEncode::encode(element) @@ -3286,7 +3290,7 @@ pub mod light_client_mock { Self::FinalizedState(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::GenesisStakeState(element) => ::core::fmt::Display::fmt(element, f), + Self::GenesisStakeTableState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisState(element) => ::core::fmt::Display::fmt(element, f), Self::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f), Self::GetStateHistoryCount(element) => ::core::fmt::Display::fmt(element, f), @@ -3347,9 +3351,9 @@ pub mod light_client_mock { Self::FrozenThreshold(value) } } - impl ::core::convert::From for LightClientMockCalls { - fn from(value: GenesisStakeStateCall) -> Self { - Self::GenesisStakeState(value) + impl ::core::convert::From for LightClientMockCalls { + fn from(value: GenesisStakeTableStateCall) -> Self { + Self::GenesisStakeTableState(value) } } impl ::core::convert::From for LightClientMockCalls { @@ -3551,7 +3555,7 @@ pub mod light_client_mock { Hash, )] pub struct FrozenThresholdReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `genesisStakeState` function with signature `genesisStakeState()` and selector `0xa9a9c9f5` + ///Container type for all return fields from the `genesisStakeTableState` function with signature `genesisStakeTableState()` and selector `0x426d3194` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3564,11 +3568,11 @@ pub mod light_client_mock { Eq, Hash, )] - pub struct GenesisStakeStateReturn { + pub struct GenesisStakeTableStateReturn { pub threshold: ::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 bls_key_comm: ::ethers::core::types::U256, + pub schnorr_key_comm: ::ethers::core::types::U256, + pub amount_comm: ::ethers::core::types::U256, } ///Container type for all return fields from the `genesisState` function with signature `genesisState()` and selector `0xd24d933d` #[derive( diff --git a/contract-bindings/src/shared_types.rs b/contract-bindings/src/shared_types.rs index 454fe3985..fb663b4c4 100644 --- a/contract-bindings/src/shared_types.rs +++ b/contract-bindings/src/shared_types.rs @@ -125,7 +125,7 @@ pub struct LightClientState { pub block_height: u64, pub block_comm_root: ::ethers::core::types::U256, } -///`StakeState(uint256,uint256,uint256,uint256)` +///`StakeTableState(uint256,uint256,uint256,uint256)` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -138,9 +138,9 @@ pub struct LightClientState { Eq, Hash, )] -pub struct StakeState { +pub struct StakeTableState { pub threshold: ::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 bls_key_comm: ::ethers::core::types::U256, + pub schnorr_key_comm: ::ethers::core::types::U256, + pub amount_comm: ::ethers::core::types::U256, } diff --git a/contracts/rust/adapter/src/light_client.rs b/contracts/rust/adapter/src/light_client.rs index 5b905d913..a5efb0e19 100644 --- a/contracts/rust/adapter/src/light_client.rs +++ b/contracts/rust/adapter/src/light_client.rs @@ -9,7 +9,7 @@ use ethers::{ prelude::{AbiError, EthAbiCodec, EthAbiType}, types::U256, }; -use hotshot_types::light_client::{CircuitField, LightClientState, PublicInput, StakeState}; +use hotshot_types::light_client::{CircuitField, LightClientState, PublicInput, StakeTableState}; /// Intermediate representations for `LightClientState` in Solidity #[derive(Clone, Debug, EthAbiType, EthAbiCodec, PartialEq)] @@ -42,16 +42,6 @@ impl FromStr for ParsedLightClientState { } } -impl From for ParsedLightClientState { - fn from(pi: PublicInput) -> Self { - Self { - view_num: field_to_u256(pi.view_number()).as_u64(), - block_height: field_to_u256(pi.block_height()).as_u64(), - block_comm_root: field_to_u256(pi.block_comm_root()), - } - } -} - impl From for ParsedLightClientState { fn from(state: contract_bindings::light_client::LightClientState) -> Self { Self { @@ -62,14 +52,13 @@ impl From for ParsedLightClie } } -impl From for PublicInput { - fn from(s: ParsedLightClientState) -> Self { - let fields: Vec, 4>> = vec![ - CircuitField::from(s.view_num), - CircuitField::from(s.block_height), - u256_to_field(s.block_comm_root), - ]; - Self::from(fields) +impl From for LightClientState { + fn from(v: ParsedLightClientState) -> Self { + Self { + view_number: v.view_num as usize, + block_height: v.block_height as usize, + block_comm_root: u256_to_field(v.block_comm_root), + } } } @@ -83,16 +72,6 @@ impl From<(u64, u64, U256)> for ParsedLightClientState { } } -impl From for LightClientState { - fn from(s: ParsedLightClientState) -> Self { - Self { - view_number: s.view_num as usize, - block_height: s.block_height as usize, - block_comm_root: u256_to_field(s.block_comm_root), - } - } -} - impl From for contract_bindings::light_client::LightClientState { fn from(s: ParsedLightClientState) -> Self { // exactly the same struct with same field types, safe to transmute @@ -102,14 +81,14 @@ impl From for contract_bindings::light_client::LightClie /// Parsed Stake State #[derive(Clone, Debug, EthAbiType, EthAbiCodec, PartialEq)] -pub struct ParsedStakeState { +pub struct ParsedStakeTableState { pub threshold: U256, pub bls_key_comm: U256, pub schnorr_key_comm: U256, pub amount_comm: U256, } -impl ParsedStakeState { +impl ParsedStakeTableState { /// Return a dummy new genesis stake state that will pass constructor/initializer sanity checks /// in the contract. /// @@ -125,18 +104,18 @@ impl ParsedStakeState { } } -impl From for StakeState { - fn from(s: ParsedStakeState) -> Self { +impl From for StakeTableState { + fn from(s: ParsedStakeTableState) -> Self { Self { threshold: u256_to_field(s.threshold), - stake_table_bls_key_comm: u256_to_field(s.bls_key_comm), - stake_table_schnorr_key_comm: u256_to_field(s.schnorr_key_comm), - stake_table_amount_comm: u256_to_field(s.amount_comm), + bls_key_comm: u256_to_field(s.bls_key_comm), + schnorr_key_comm: u256_to_field(s.schnorr_key_comm), + amount_comm: u256_to_field(s.amount_comm), } } } -impl FromStr for ParsedStakeState { +impl FromStr for ParsedStakeTableState { type Err = AbiError; fn from_str(s: &str) -> Result { let parsed: (Self,) = AbiDecode::decode_hex(s)?; @@ -144,18 +123,18 @@ impl FromStr for ParsedStakeState { } } -impl From for ParsedStakeState { - fn from(state: contract_bindings::light_client::StakeState) -> Self { +impl From for ParsedStakeTableState { + fn from(state: contract_bindings::light_client::StakeTableState) -> Self { Self { threshold: state.threshold, - bls_key_comm: state.stake_table_bls_key_comm, - schnorr_key_comm: state.stake_table_schnorr_key_comm, - amount_comm: state.stake_table_amount_comm, + bls_key_comm: state.bls_key_comm, + schnorr_key_comm: state.schnorr_key_comm, + amount_comm: state.amount_comm, } } } -impl From<(U256, U256, U256, U256)> for ParsedStakeState { +impl From<(U256, U256, U256, U256)> for ParsedStakeTableState { fn from(s: (U256, U256, U256, U256)) -> Self { Self { threshold: s.0, @@ -166,8 +145,8 @@ impl From<(U256, U256, U256, U256)> for ParsedStakeState { } } -impl From for contract_bindings::light_client::StakeState { - fn from(s: ParsedStakeState) -> Self { +impl From for contract_bindings::light_client::StakeTableState { + fn from(s: ParsedStakeTableState) -> Self { // exactly the same struct with same field types, safe to transmute unsafe { std::mem::transmute(s) } } @@ -176,7 +155,7 @@ impl From for contract_bindings::light_client::StakeState { /// `LightClientConstructorArgs` holds the arguments required to initialize a light client contract. pub struct LightClientConstructorArgs { pub light_client_state: ParsedLightClientState, - pub stake_state: ParsedStakeState, + pub stake_table_state: ParsedStakeTableState, pub max_history_seconds: u32, } @@ -188,7 +167,7 @@ impl LightClientConstructorArgs { pub fn dummy_genesis() -> Self { Self { light_client_state: ParsedLightClientState::dummy_genesis(), - stake_state: ParsedStakeState::dummy_genesis(), + stake_table_state: ParsedStakeTableState::dummy_genesis(), max_history_seconds: 864000, } } @@ -203,7 +182,7 @@ impl Tokenize for LightClientConstructorArgs { fn into_tokens(self) -> Vec { vec![ ethers::abi::Token::Tuple(self.light_client_state.into_tokens()), - ethers::abi::Token::Tuple(self.stake_state.into_tokens()), + ethers::abi::Token::Tuple(self.stake_table_state.into_tokens()), ethers::abi::Token::Uint(U256::from(self.max_history_seconds)), ] } diff --git a/contracts/script/LightClient.s.sol b/contracts/script/LightClient.s.sol index 87c9f4ac9..ca1b70342 100644 --- a/contracts/script/LightClient.s.sol +++ b/contracts/script/LightClient.s.sol @@ -13,7 +13,7 @@ contract DeployLightClientContractScript is Script { address payable proxyAddress, address admin, LC.LightClientState memory, - LC.StakeState memory + LC.StakeTableState memory ) { // TODO for a production deployment provide the right genesis state and value @@ -24,8 +24,8 @@ contract DeployLightClientContractScript is Script { cmds[2] = vm.toString(uint256(numInitValidators)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory state,,, LC.StakeState memory stakeState) = - abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeState)); + (LC.LightClientState memory state,,, LC.StakeTableState memory stakeState) = + abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeTableState)); return deployContract(state, stakeState, stateHistoryRetentionPeriod); } @@ -39,7 +39,7 @@ contract DeployLightClientContractScript is Script { // bytes memory result = vm.ffi(cmds); // LC.LightClientState memory state = abi.decode(result, (LC.LightClientState)); - // LC.StakeState memory stakeState = LC.StakeState( + // LC.StakeTableState memory stakeState = LC.StakeTableState( // state.threshold, // state.stakeTableBlsKeyComm, // state.stakeTableSchnorrKeyComm, @@ -55,7 +55,7 @@ contract DeployLightClientContractScript is Script { function deployContract( LC.LightClientState memory state, - LC.StakeState memory stakeState, + LC.StakeTableState memory stakeState, uint32 stateHistoryRetentionPeriod ) private @@ -63,7 +63,7 @@ contract DeployLightClientContractScript is Script { address payable proxyAddress, address admin, LC.LightClientState memory, - LC.StakeState memory + LC.StakeTableState memory ) { string memory seedPhrase = vm.envString("MNEMONIC"); diff --git a/contracts/script/LightClientCallNewFinalizedState.s.sol b/contracts/script/LightClientCallNewFinalizedState.s.sol index e8316d1a4..9e176d54c 100644 --- a/contracts/script/LightClientCallNewFinalizedState.s.sol +++ b/contracts/script/LightClientCallNewFinalizedState.s.sol @@ -25,7 +25,7 @@ contract CallNewFinalizedState is Script { bytes memory result = vm.ffi(cmds); (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); address admin; string memory seedPhrase = vm.envString("MNEMONIC"); diff --git a/contracts/script/LightClientWithDefender.s.sol b/contracts/script/LightClientWithDefender.s.sol index c0fd0ffbf..9738002f3 100644 --- a/contracts/script/LightClientWithDefender.s.sol +++ b/contracts/script/LightClientWithDefender.s.sol @@ -30,9 +30,9 @@ contract LightClientDefenderDeployScript is Script { cmds[2] = vm.toString(uint256(numInitValidators)); bytes memory result = vm.ffi(cmds); - LC.StakeState memory stakeState; + LC.StakeTableState memory stakeState; (state,,, stakeState) = - abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeState)); + abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeTableState)); ApprovalProcessResponse memory upgradeApprovalProcess = Defender.getUpgradeApprovalProcess(); multisig = upgradeApprovalProcess.via; diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol index f29285f2e..2601daec4 100644 --- a/contracts/src/LightClient.sol +++ b/contracts/src/LightClient.sol @@ -56,7 +56,7 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { uint256 public frozenThreshold; /// @notice genesis stake commitment - StakeState public genesisStakeState; + StakeTableState public genesisStakeTableState; /// @notice genesis block commitment LightClientState public genesisState; @@ -101,14 +101,14 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @notice The finalized HotShot Stake state (as the digest of the entire HotShot state) /// @param threshold The (stake-weighted) quorum threshold for a QC to be considered as valid - /// @param stakeTableBlsKeyComm The commitment to the BlsVerKey column of the stake table - /// @param stakeTableSchnorrKeyComm The commitment to the SchnorrVerKey column of the table - /// @param stakeTableAmountComm The commitment to the stake amount column of the stake table - struct StakeState { + /// @param blsKeyComm The commitment to the BlsVerKey column of the stake table + /// @param schnorrKeyComm The commitment to the SchnorrVerKey column of the table + /// @param amountComm The commitment to the stake amount column of the stake table + struct StakeTableState { uint256 threshold; - BN254.ScalarField stakeTableBlsKeyComm; - BN254.ScalarField stakeTableSchnorrKeyComm; - BN254.ScalarField stakeTableAmountComm; + BN254.ScalarField blsKeyComm; + BN254.ScalarField schnorrKeyComm; + BN254.ScalarField amountComm; } /// @notice Simplified HotShot commitment struct @@ -172,13 +172,13 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @param owner The address of the contract owner function initialize( LightClientState memory _genesis, - StakeState memory _genesisStakeState, + StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, address owner ) public initializer { __Ownable_init(owner); //sets owner of the contract __UUPSUpgradeable_init(); - _initializeState(_genesis, _genesisStakeState, _stateHistoryRetentionPeriod); + _initializeState(_genesis, _genesisStakeTableState, _stateHistoryRetentionPeriod); } /// @notice Use this to get the implementation contract version @@ -202,12 +202,12 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @dev Initialization of contract variables happens in this method because the LightClient /// contract is upgradable and thus has its constructor method disabled. /// @param _genesis The initial state of the light client - /// @param _genesisStakeState The initial stake state of the light client + /// @param _genesisStakeTableState The initial stake state of the light client /// @param _stateHistoryRetentionPeriod The maximum retention period (in seconds) for the state /// history function _initializeState( LightClientState memory _genesis, - StakeState memory _genesisStakeState, + StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod ) internal { // stake table commitments and threshold cannot be zero, otherwise it's impossible to @@ -216,24 +216,24 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { // feeLedgerComm can be zero, if we optionally support fee ledger yet. if ( _genesis.viewNum != 0 || _genesis.blockHeight != 0 - || BN254.ScalarField.unwrap(_genesisStakeState.stakeTableBlsKeyComm) == 0 - || BN254.ScalarField.unwrap(_genesisStakeState.stakeTableSchnorrKeyComm) == 0 - || BN254.ScalarField.unwrap(_genesisStakeState.stakeTableAmountComm) == 0 - || _genesisStakeState.threshold == 0 + || BN254.ScalarField.unwrap(_genesisStakeTableState.blsKeyComm) == 0 + || BN254.ScalarField.unwrap(_genesisStakeTableState.schnorrKeyComm) == 0 + || BN254.ScalarField.unwrap(_genesisStakeTableState.amountComm) == 0 + || _genesisStakeTableState.threshold == 0 ) { revert InvalidArgs(); } genesisState = _genesis; - genesisStakeState = _genesisStakeState; + genesisStakeTableState = _genesisStakeTableState; finalizedState = _genesis; stateHistoryRetentionPeriod = _stateHistoryRetentionPeriod; - bytes32 initStakeTableComm = computeStakeTableComm(_genesisStakeState); + bytes32 initStakeTableComm = computeStakeTableComm(_genesisStakeTableState); votingStakeTableCommitment = initStakeTableComm; - votingThreshold = _genesisStakeState.threshold; + votingThreshold = _genesisStakeTableState.threshold; frozenStakeTableCommitment = initStakeTableComm; - frozenThreshold = _genesisStakeState.threshold; + frozenThreshold = _genesisStakeTableState.threshold; updateStateHistory(uint64(block.number), uint64(block.timestamp), _genesis); } @@ -303,12 +303,12 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { } /// @notice Given the light client state, compute the short commitment of the stake table - function computeStakeTableComm(StakeState memory state) public pure virtual returns (bytes32) { + function computeStakeTableComm(StakeTableState memory state) public pure virtual returns (bytes32) { return keccak256( abi.encodePacked( - state.stakeTableBlsKeyComm, - state.stakeTableSchnorrKeyComm, - state.stakeTableAmountComm + state.blsKeyComm, + state.schnorrKeyComm, + state.amountComm ) ); } diff --git a/contracts/test/DeployLightClientTestScript.s.sol b/contracts/test/DeployLightClientTestScript.s.sol index a0fb6eed3..7eaaa754a 100644 --- a/contracts/test/DeployLightClientTestScript.s.sol +++ b/contracts/test/DeployLightClientTestScript.s.sol @@ -20,8 +20,8 @@ contract DeployLightClientTestScript is Script { cmds[2] = vm.toString(uint256(numInitValidators)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory state,,, LC.StakeState memory stakeState) = - abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeState)); + (LC.LightClientState memory state,,, LC.StakeTableState memory stakeState) = + abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeTableState)); return deployContract(state, stakeState, stateHistoryRetentionPeriod, owner); } @@ -53,7 +53,7 @@ contract DeployLightClientTestScript is Script { // bytes memory result = vm.ffi(cmds); // LC.LightClientState memory state = abi.decode(result, (LC.LightClientState)); - // LC.StakeState memory stakeState = LC.StakeState( + // LC.StakeTableState memory stakeState = LC.StakeTableState( // state.threshold, // state.stakeTableBlsKeyComm, // state.stakeTableSchnorrKeyComm, @@ -69,7 +69,7 @@ contract DeployLightClientTestScript is Script { /// @return the light client state function deployContract( LC.LightClientState memory state, - LC.StakeState memory stakeState, + LC.StakeTableState memory stakeState, uint32 stateHistoryRetentionPeriod, address owner ) public returns (address payable proxyAddress, address admin, LC.LightClientState memory) { diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol index 62e27131c..d12f1458a 100644 --- a/contracts/test/LightClient.t.sol +++ b/contracts/test/LightClient.t.sol @@ -18,7 +18,7 @@ import { BN254 } from "bn254/BN254.sol"; contract LightClientCommonTest is Test { LCMock public lc; LC.LightClientState public genesis; - LC.StakeState public genesisStakeState; + LC.StakeTableState public genesisStakeTableState; uint32 public constant DELAY_THRESHOLD = 6; uint32 public constant MAX_HISTORY_SECONDS = 1 days; uint32 public initialBlockTimestamp = 1 days; @@ -31,7 +31,7 @@ contract LightClientCommonTest is Test { function deployAndInitProxy( LC.LightClientState memory state, - LC.StakeState memory stakeState, + LC.StakeTableState memory stakeState, uint32 stateHistoryRetentionPeriod ) public returns (address payable, address) { vm.warp(1 days); @@ -62,17 +62,17 @@ contract LightClientCommonTest is Test { LC.LightClientState memory state, bytes32 votingSTComm, bytes32 frozenSTComm, - LC.StakeState memory stakeState - ) = abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeState)); + LC.StakeTableState memory stakeState + ) = abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeTableState)); genesis = state; - genesisStakeState = stakeState; + genesisStakeTableState = stakeState; - (lcTestProxy, admin) = deployAndInitProxy(genesis, genesisStakeState, MAX_HISTORY_SECONDS); + (lcTestProxy, admin) = deployAndInitProxy(genesis, genesisStakeTableState, MAX_HISTORY_SECONDS); - bytes32 expectedStakeTableComm = lc.computeStakeTableComm(genesisStakeState); + bytes32 expectedStakeTableComm = lc.computeStakeTableComm(genesisStakeTableState); assertEq(votingSTComm, expectedStakeTableComm); assertEq(frozenSTComm, expectedStakeTableComm); - // assertEq(genesisStakeState, lc.genesisStakeState()); + // assertEq(genesisStakeTableState, lc.genesisStakeTableState()); } function assertEq(BN254.ScalarField a, BN254.ScalarField b) public pure { @@ -93,66 +93,66 @@ contract LightClient_constructor_Test is LightClientCommonTest { assertEq(blockHeight, genesis.blockHeight); assertEq(abi.encode(blockCommRoot), abi.encode(genesis.blockCommRoot)); - bytes32 stakeTableComm = lc.computeStakeTableComm(genesisStakeState); + bytes32 stakeTableComm = lc.computeStakeTableComm(genesisStakeTableState); assertEq(lc.votingStakeTableCommitment(), stakeTableComm); assertEq(lc.frozenStakeTableCommitment(), stakeTableComm); - assertEq(lc.votingThreshold(), genesisStakeState.threshold); - assertEq(lc.frozenThreshold(), genesisStakeState.threshold); + assertEq(lc.votingThreshold(), genesisStakeTableState.threshold); + assertEq(lc.frozenThreshold(), genesisStakeTableState.threshold); } // @dev helper function to be able to initialize the contract and capture the revert error function initWithExpectRevert( LC.LightClientState memory _genesis, - LC.StakeState memory _genesisStakeState, + LC.StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod ) private { vm.expectRevert(LC.InvalidArgs.selector); - lc = new LCMock(_genesis, _genesisStakeState, _stateHistoryRetentionPeriod); + lc = new LCMock(_genesis, _genesisStakeTableState, _stateHistoryRetentionPeriod); } function test_RevertWhen_InvalidGenesis() external { LC.LightClientState memory badGenesis = genesis; - LC.StakeState memory badGenesisStakeState = genesisStakeState; + LC.StakeTableState memory badGenesisStakeTableState = genesisStakeTableState; // wrong viewNum would revert badGenesis.viewNum = 1; - initWithExpectRevert(badGenesis, badGenesisStakeState, MAX_HISTORY_SECONDS); + initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); badGenesis.viewNum = genesis.viewNum; // revert to correct // wrong blockHeight would revert badGenesis.blockHeight = 1; - initWithExpectRevert(badGenesis, badGenesisStakeState, MAX_HISTORY_SECONDS); + initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); badGenesis.blockHeight = genesis.blockHeight; // revert to correct // zero-valued stake table commitments would revert - badGenesisStakeState.stakeTableBlsKeyComm = BN254.ScalarField.wrap(0); - initWithExpectRevert(badGenesis, badGenesisStakeState, MAX_HISTORY_SECONDS); + badGenesisStakeTableState.blsKeyComm = BN254.ScalarField.wrap(0); + initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); - badGenesisStakeState.stakeTableBlsKeyComm = badGenesisStakeState.stakeTableBlsKeyComm; // revert + badGenesisStakeTableState.blsKeyComm = badGenesisStakeTableState.blsKeyComm; // revert // to correct - badGenesisStakeState.stakeTableSchnorrKeyComm = BN254.ScalarField.wrap(0); - initWithExpectRevert(badGenesis, badGenesisStakeState, MAX_HISTORY_SECONDS); + badGenesisStakeTableState.schnorrKeyComm = BN254.ScalarField.wrap(0); + initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); - badGenesisStakeState.stakeTableSchnorrKeyComm = - badGenesisStakeState.stakeTableSchnorrKeyComm; // revert to correct - badGenesisStakeState.stakeTableAmountComm = BN254.ScalarField.wrap(0); + badGenesisStakeTableState.schnorrKeyComm = + badGenesisStakeTableState.schnorrKeyComm; // revert to correct + badGenesisStakeTableState.amountComm = BN254.ScalarField.wrap(0); - initWithExpectRevert(badGenesis, badGenesisStakeState, MAX_HISTORY_SECONDS); - badGenesisStakeState.stakeTableAmountComm = badGenesisStakeState.stakeTableAmountComm; // revert + initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); + badGenesisStakeTableState.amountComm = badGenesisStakeTableState.amountComm; // revert // to correct // zero-valued threshold would revert - badGenesisStakeState.threshold = 0; - initWithExpectRevert(badGenesis, badGenesisStakeState, MAX_HISTORY_SECONDS); - badGenesisStakeState.threshold = badGenesisStakeState.threshold; // revert to correct + badGenesisStakeTableState.threshold = 0; + initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); + badGenesisStakeTableState.threshold = badGenesisStakeTableState.threshold; // revert to correct } } contract LightClient_permissionedProver_Test is LightClientCommonTest { LC.LightClientState internal newState; V.PlonkProof internal newProof; - LC.StakeState internal newStakeState; + LC.StakeTableState internal newStakeTableState; function setUp() public { init(); @@ -168,12 +168,12 @@ contract LightClient_permissionedProver_Test is LightClientCommonTest { ( LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, - LC.StakeState[] memory stakeStates - ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + LC.StakeTableState[] memory stakeStates + ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); newState = states[0]; newProof = proofs[0]; - newStakeState = stakeStates[0]; + newStakeTableState = stakeStates[0]; } function test_NoProverPermissionsRequired() external { @@ -317,7 +317,7 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { bytes memory result = vm.ffi(cmds); (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); vm.expectEmit(true, true, true, true); emit LC.NewState(states[0].viewNum, states[0].blockHeight, states[0].blockCommRoot); @@ -348,9 +348,9 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { bytes memory result = vm.ffi(cmds); (LC.LightClientState memory state,,,) = - abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeState)); + abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeTableState)); genesis = state; - (lcTestProxy, admin) = deployAndInitProxy(genesis, genesisStakeState, MAX_HISTORY_SECONDS); + (lcTestProxy, admin) = deployAndInitProxy(genesis, genesisStakeTableState, MAX_HISTORY_SECONDS); genesis = state; @@ -366,8 +366,8 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { ( LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, - LC.StakeState[] memory stakeStates - ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + LC.StakeTableState[] memory stakeStates + ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); uint256 statesLen = states.length; uint64 viewNum; @@ -400,7 +400,7 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { numBlockSkipped = uint32(bound(numBlockSkipped, 1, 3)); // re-assign LightClient with the same genesis - deployAndInitProxy(genesis, genesisStakeState, MAX_HISTORY_SECONDS); + deployAndInitProxy(genesis, genesisStakeTableState, MAX_HISTORY_SECONDS); string[] memory cmds = new string[](3); cmds[0] = "diff-test"; @@ -416,11 +416,11 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { vm.prank(permissionedProver); lc.newFinalizedState(state, proof); - bytes32 stakeTableComm = lc.computeStakeTableComm(genesisStakeState); + bytes32 stakeTableComm = lc.computeStakeTableComm(genesisStakeTableState); assertEq(lc.votingStakeTableCommitment(), stakeTableComm); assertEq(lc.frozenStakeTableCommitment(), stakeTableComm); - assertEq(lc.votingThreshold(), genesisStakeState.threshold); - assertEq(lc.frozenThreshold(), genesisStakeState.threshold); + assertEq(lc.votingThreshold(), genesisStakeTableState.threshold); + assertEq(lc.frozenThreshold(), genesisStakeTableState.threshold); } /// @dev Test unhappy path when a valid but oudated finalized state is submitted @@ -553,7 +553,7 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { contract LightClient_StateUpdatesTest is LightClientCommonTest { LC.LightClientState internal newState; V.PlonkProof internal newProof; - LC.StakeState internal newStakeState; + LC.StakeTableState internal newStakeTableState; function assertInitialStateHistoryConditions() internal view { // assert that stateHistoryFirstIndex starts at 0. @@ -596,12 +596,12 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { ( LC.LightClientState[] memory states, V.PlonkProof[] memory proofs, - LC.StakeState[] memory stakeStates - ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + LC.StakeTableState[] memory stakeStates + ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); newState = states[1]; newProof = proofs[1]; - newStakeState = stakeStates[1]; + newStakeTableState = stakeStates[1]; } function test_1lBlockUpdatesIsUpdated() public { @@ -655,7 +655,7 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { bytes memory result = vm.ffi(cmds); (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); // Add one numDays worth of a new state uint256 i; @@ -725,7 +725,7 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { bytes memory result = vm.ffi(cmds); (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); assertInitialStateHistoryConditions(); @@ -1176,7 +1176,7 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { bytes memory result = vm.ffi(cmds); (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); newState = _states[1]; newProof = _proofs[1]; @@ -1214,7 +1214,7 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { bytes memory result = vm.ffi(cmds); (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); uint256 statesCount = _states.length - 1; // Update the state and thus the l1BlockUpdates array would be updated diff --git a/contracts/test/LightClientBenchmark.t.sol b/contracts/test/LightClientBenchmark.t.sol index 5905a60f5..d8bf5a096 100644 --- a/contracts/test/LightClientBenchmark.t.sol +++ b/contracts/test/LightClientBenchmark.t.sol @@ -28,7 +28,7 @@ contract LightClientBench is LightClientCommonTest { bytes memory result = vm.ffi(cmds); (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeState[])); + abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); state = states[0]; proof = proofs[0]; diff --git a/contracts/test/LightClientUpgradeSameContract.t.sol b/contracts/test/LightClientUpgradeSameContract.t.sol index 3146ab249..8e6fcdfa8 100644 --- a/contracts/test/LightClientUpgradeSameContract.t.sol +++ b/contracts/test/LightClientUpgradeSameContract.t.sol @@ -17,7 +17,7 @@ contract LightClientUpgradeSameContractTest is Test { UpgradeLightClientScript public upgrader = new UpgradeLightClientScript(); LCV1.LightClientState public stateV1; - LCV1.StakeState public stakeStateV1; + LCV1.StakeTableState public stakeStateV1; address public admin; address public proxy; diff --git a/contracts/test/LightClientUpgradeToVx.t.sol b/contracts/test/LightClientUpgradeToVx.t.sol index b6b5b79b0..dbf56a834 100644 --- a/contracts/test/LightClientUpgradeToVx.t.sol +++ b/contracts/test/LightClientUpgradeToVx.t.sol @@ -24,7 +24,7 @@ contract LightClientUpgradeToVxTest is Test { ULCV3 public upgraderV3 = new ULCV3(); LCV1.LightClientState public stateV1; - LCV1.StakeState public stakeStateV1; + LCV1.StakeTableState public stakeStateV1; address public admin; address public proxy; diff --git a/contracts/test/mocks/LightClientMock.sol b/contracts/test/mocks/LightClientMock.sol index 8d0475556..c0414ebae 100644 --- a/contracts/test/mocks/LightClientMock.sol +++ b/contracts/test/mocks/LightClientMock.sol @@ -15,10 +15,10 @@ contract LightClientMock is LC { constructor( LC.LightClientState memory genesis, - LC.StakeState memory genesisStakeState, + LC.StakeTableState memory genesisStakeTableState, uint32 maxHistorySeconds ) LC() { - _initializeState(genesis, genesisStakeState, maxHistorySeconds); + _initializeState(genesis, genesisStakeTableState, maxHistorySeconds); } /// @dev Directly mutate finalizedState variable for test diff --git a/hotshot-state-prover/src/mock_ledger.rs b/hotshot-state-prover/src/mock_ledger.rs index 27734565e..73b232b12 100644 --- a/hotshot-state-prover/src/mock_ledger.rs +++ b/hotshot-state-prover/src/mock_ledger.rs @@ -16,13 +16,13 @@ use ethers::{ }; use hotshot_contract_adapter::{ jellyfish::{field_to_u256, open_key, u256_to_field /* , u256_to_field*/}, - light_client::{ParsedLightClientState, ParsedStakeState}, + light_client::{ParsedLightClientState, ParsedStakeTableState}, }; use hotshot_stake_table::vec_based::StakeTable; use hotshot_types::{ light_client::{ - GenericLightClientState, GenericPublicInput, GenericStakeState, LightClientState, - StakeState, + GenericLightClientState, GenericPublicInput, GenericStakeTableState, LightClientState, + StakeTableState, }, traits::stake_table::{SnapshotVersion, StakeTableScheme}, }; @@ -79,7 +79,7 @@ pub struct MockLedger { pub rng: StdRng, epoch: u64, state: GenericLightClientState, - // stake_state: GenericStakeState, + stake_table_state: GenericStakeTableState, pub(crate) st: StakeTable, threshold: U256, // quorum threshold for SnapShot::LastEpochStart pub(crate) qc_keys: Vec, @@ -98,29 +98,25 @@ impl MockLedger { key_archive.insert(qc_keys[i], state_keys[i].0.clone()); } let st = stake_table_for_testing(&qc_keys, &state_keys); - // let (bls_key_comm, schnorr_key_comm, amount_comm) = - // st.commitment(SnapshotVersion::LastEpochStart).unwrap(); - + let (bls_key_comm, schnorr_key_comm, amount_comm) = + st.commitment(SnapshotVersion::LastEpochStart).unwrap(); let threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart).unwrap()); - // let stake_state = StakeState { - // threshold: u256_to_field(threshold), - // stake_table_bls_key_comm: bls_key_comm, - // stake_table_schnorr_key_comm: schnorr_key_comm, - // stake_table_amount_comm: amount_comm, - // }; + let stake_table_state = StakeTableState { + threshold: u256_to_field(threshold), + bls_key_comm, + schnorr_key_comm, + amount_comm, + }; // arbitrary commitment values as they don't affect logic being tested let block_comm_root = F::from(1234); - // let fee_ledger_comm: ark_ff::Fp, 4> = F::from(5678); let genesis = LightClientState { view_number: 0, block_height: 0, block_comm_root, - // fee_ledger_comm, - // stake_table_comm: st.commitment(SnapshotVersion::LastEpochStart).unwrap(), }; Self { @@ -128,7 +124,7 @@ impl MockLedger { rng, epoch: 0, state: genesis, - // stake_state, + stake_table_state, st, threshold, qc_keys, @@ -394,7 +390,7 @@ impl MockLedger { } /// Returns the (bytes32 votingStakeTableComm, bytes32 frozenStakeTableComm) used in contract - pub fn get_stake_table_comms(&self) -> (H256, H256, ParsedStakeState) { + pub fn get_stake_table_comms(&self) -> (H256, H256, ParsedStakeTableState) { let (bls_key_comm, schnorr_key_comm, amount_comm) = self.st.commitment(SnapshotVersion::EpochStart).unwrap(); let frozen_st_comm = utils::keccak256( diff --git a/hotshot-state-prover/src/service.rs b/hotshot-state-prover/src/service.rs index c539449e4..1cb2954a4 100644 --- a/hotshot-state-prover/src/service.rs +++ b/hotshot-state-prover/src/service.rs @@ -23,7 +23,7 @@ use ethers::{ use futures::FutureExt; use hotshot_contract_adapter::{ jellyfish::{field_to_u256, u256_to_field, ParsedPlonkProof}, - light_client::{ParsedLightClientState, ParsedStakeState}, + light_client::{ParsedLightClientState, ParsedStakeTableState}, }; use hotshot_stake_table::vec_based::{config::FieldType, StakeTable}; use hotshot_types::{ diff --git a/utils/src/deployer.rs b/utils/src/deployer.rs index c28eb9798..b1e35ce7b 100644 --- a/utils/src/deployer.rs +++ b/utils/src/deployer.rs @@ -15,7 +15,7 @@ use derive_more::Display; use ethers::{prelude::*, signers::coins_bip39::English, solc::artifacts::BytecodeObject}; use futures::future::{BoxFuture, FutureExt}; use hotshot_contract_adapter::light_client::{ - LightClientConstructorArgs, ParsedLightClientState, ParsedStakeState, + LightClientConstructorArgs, ParsedLightClientState, ParsedStakeTableState, }; use std::{collections::HashMap, io::Write, ops::Deref}; use url::Url; @@ -311,7 +311,7 @@ pub async fn deploy( use_mock_contract: bool, only: Option>, genesis: BoxFuture<'_, anyhow::Result>, - genesis_stake: BoxFuture<'_, anyhow::Result>, + genesis_stake: BoxFuture<'_, anyhow::Result>, mut contracts: Contracts, ) -> anyhow::Result { let provider = Provider::::try_from(l1url.to_string())?; From ab81b0bad7497dbcedc4434cd1881cb6891d7c58 Mon Sep 17 00:00:00 2001 From: Alex Xiong Date: Fri, 6 Sep 2024 01:06:04 +0800 Subject: [PATCH 12/27] wip: compile now --- contracts/rust/adapter/src/light_client.rs | 17 +- hotshot-state-prover/src/circuit.rs | 176 +++++++++------------ hotshot-state-prover/src/mock_ledger.rs | 31 ++-- hotshot-state-prover/src/service.rs | 82 ++++------ hotshot-state-prover/src/snark.rs | 33 ++-- hotshot-state-prover/src/test_utils.rs | 23 ++- sequencer/src/api.rs | 14 +- 7 files changed, 175 insertions(+), 201 deletions(-) diff --git a/contracts/rust/adapter/src/light_client.rs b/contracts/rust/adapter/src/light_client.rs index a5efb0e19..b6d71a712 100644 --- a/contracts/rust/adapter/src/light_client.rs +++ b/contracts/rust/adapter/src/light_client.rs @@ -1,5 +1,6 @@ //! Helpers and test mocks for Light Client logic +use ark_ff::PrimeField; use ark_std::str::FromStr; use diff_test_bn254::{field_to_u256, u256_to_field}; use ethers::{ @@ -9,7 +10,7 @@ use ethers::{ prelude::{AbiError, EthAbiCodec, EthAbiType}, types::U256, }; -use hotshot_types::light_client::{CircuitField, LightClientState, PublicInput, StakeTableState}; +use hotshot_types::light_client::{GenericLightClientState, GenericStakeTableState, PublicInput}; /// Intermediate representations for `LightClientState` in Solidity #[derive(Clone, Debug, EthAbiType, EthAbiCodec, PartialEq)] @@ -52,7 +53,7 @@ impl From for ParsedLightClie } } -impl From for LightClientState { +impl From for GenericLightClientState { fn from(v: ParsedLightClientState) -> Self { Self { view_number: v.view_num as usize, @@ -62,6 +63,16 @@ impl From for LightClientState { } } +impl From for ParsedLightClientState { + fn from(pi: PublicInput) -> Self { + Self { + view_num: field_to_u256(pi.view_number()).as_u64(), + block_height: field_to_u256(pi.block_height()).as_u64(), + block_comm_root: field_to_u256(pi.block_comm_root()), + } + } +} + impl From<(u64, u64, U256)> for ParsedLightClientState { fn from(s: (u64, u64, U256)) -> Self { Self { @@ -104,7 +115,7 @@ impl ParsedStakeTableState { } } -impl From for StakeTableState { +impl From for GenericStakeTableState { fn from(s: ParsedStakeTableState) -> Self { Self { threshold: u256_to_field(s.threshold), diff --git a/hotshot-state-prover/src/circuit.rs b/hotshot-state-prover/src/circuit.rs index a1cfb0e5c..1edc13085 100644 --- a/hotshot-state-prover/src/circuit.rs +++ b/hotshot-state-prover/src/circuit.rs @@ -4,7 +4,10 @@ use ark_ec::twisted_edwards::TECurveConfig; use ark_ff::PrimeField; use ark_std::borrow::Borrow; use ethers::types::U256; -use hotshot_types::light_client::{GenericLightClientState, GenericPublicInput}; +use hotshot_contract_adapter::light_client::{ParsedLightClientState, ParsedStakeTableState}; +use hotshot_types::light_client::{ + GenericLightClientState, GenericPublicInput, GenericStakeTableState, +}; use jf_plonk::PlonkError; use jf_relation::{BoolVar, Circuit, CircuitError, PlonkCircuit, Variable}; use jf_rescue::{gadgets::RescueNativeGadget, RescueParameter}; @@ -33,25 +36,39 @@ pub struct StakeTableEntryVar { /// The stake table commitment is a triple `(qc_keys_comm, state_keys_comm, stake_amount_comm)`. /// Variable for a stake table commitment #[derive(Clone, Debug)] -pub struct StakeTableCommVar { +pub struct StakeTableVar { /// Commitment for QC verification keys pub qc_keys_comm: Variable, /// Commitment for state verification keys pub state_keys_comm: Variable, /// Commitment for stake amount pub stake_amount_comm: Variable, + /// Threshold for quorum signatures + pub threshold: Variable, +} + +impl StakeTableVar { + /// # Errors + /// if unable to create any of the public variables + pub fn new( + circuit: &mut PlonkCircuit, + st: &GenericStakeTableState, + ) -> Result { + Ok(Self { + qc_keys_comm: circuit.create_public_variable(st.bls_key_comm)?, + state_keys_comm: circuit.create_public_variable(st.schnorr_key_comm)?, + stake_amount_comm: circuit.create_public_variable(st.amount_comm)?, + threshold: circuit.create_public_variable(st.threshold)?, + }) + } } /// Light client state Variable #[derive(Clone, Debug)] pub struct LightClientStateVar { - /// Private list holding all variables - /// `vars[0]`: view number - /// `vars[1]`: block height - /// `vars[2]`: block commitment root - /// `vars[3]`: fee ledger commitment - /// `vars[4-6]`: stake table commitment - vars: [Variable; 3], + pub(crate) view_num: Variable, + pub(crate) block_height: Variable, + pub(crate) block_comm_root: Variable, } impl LightClientStateVar { @@ -61,64 +78,20 @@ impl LightClientStateVar { circuit: &mut PlonkCircuit, state: &GenericLightClientState, ) -> Result { - let view_number_f = F::from(state.view_number as u64); - let block_height_f = F::from(state.block_height as u64); Ok(Self { - vars: [ - circuit.create_public_variable(view_number_f)?, - circuit.create_public_variable(block_height_f)?, - circuit.create_public_variable(state.block_comm_root)?, - ], + view_num: circuit.create_public_variable(F::from(state.view_number as u64))?, + block_height: circuit.create_public_variable(F::from(state.block_height as u64))?, + block_comm_root: circuit.create_public_variable(state.block_comm_root)?, }) } - - /// Returns the view number - #[must_use] - pub fn view_number(&self) -> Variable { - self.vars[0] - } - - /// Returns the block height - #[must_use] - pub fn block_height(&self) -> Variable { - self.vars[1] - } - - /// Returns the Merkle root of the block commitments - #[must_use] - pub fn block_comm_root(&self) -> Variable { - self.vars[2] - } - - // /// Returns the commitment of the fee ledger - // #[must_use] - // pub fn fee_ledger_comm(&self) -> Variable { - // self.vars[3] - // } - - // /// Returns the commitment of the associated stake table - // #[must_use] - // pub fn stake_table_comm(&self) -> StakeTableCommVar { - // StakeTableCommVar { - // qc_keys_comm: self.vars[4], - // state_keys_comm: self.vars[5], - // stake_amount_comm: self.vars[6], - // } - // } -} - -impl AsRef<[Variable]> for LightClientStateVar { - fn as_ref(&self) -> &[Variable] { - &self.vars - } } /// A function that takes as input: /// - a list of stake table entries (`Vec<(SchnorrVerKey, Amount)>`) /// - a bit vector indicates the signers /// - 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 +/// - updated light client state (`(view_number, block_height, block_comm_root)`) +/// - the static stake table state (containing 3 commitments to the 3 columns of the stake table and a 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`. @@ -138,7 +111,7 @@ pub(crate) fn build( signer_bit_vec: BitIter, signatures: SigIter, lightclient_state: &GenericLightClientState, - threshold: &U256, + stake_table_state: &GenericStakeTableState, stake_table_capacity: usize, ) -> Result<(PlonkCircuit, GenericPublicInput), PlonkError> where @@ -241,18 +214,9 @@ where .collect::, CircuitError>>()?, ); - let threshold = u256_to_field::(threshold); - let threshold_pub_var = circuit.create_public_variable(threshold)?; - + // public inputs let lightclient_state_pub_var = LightClientStateVar::new(&mut circuit, lightclient_state)?; - - let view_number_f = F::from(lightclient_state.view_number as u64); - let block_height_f = F::from(lightclient_state.block_height as u64); - let public_inputs = vec![ - view_number_f, - block_height_f, - lightclient_state.block_comm_root, - ]; + let stake_table_state_pub_var = StakeTableVar::new(&mut circuit, stake_table_state)?; // Checking whether the accumulated weight exceeds the quorum threshold let mut signed_amount_var = (0..stake_table_capacity / 2) @@ -276,39 +240,37 @@ where )?); } let acc_amount_var = circuit.sum(&signed_amount_var)?; - circuit.enforce_leq(threshold_pub_var, acc_amount_var)?; + circuit.enforce_leq(stake_table_state_pub_var.threshold, acc_amount_var)?; // checking the commitment for the list of schnorr keys let state_ver_key_preimage_vars = stake_table_var .iter() .flat_map(|var| [var.state_ver_key.0.get_x(), var.state_ver_key.0.get_y()]) .collect::>(); - let _state_ver_key_comm = RescueNativeGadget::::rescue_sponge_with_padding( + let state_ver_key_comm = RescueNativeGadget::::rescue_sponge_with_padding( &mut circuit, &state_ver_key_preimage_vars, 1, )?[0]; - // circuit.enforce_equal( - // state_ver_key_comm, - // lightclient_state_pub_var.stake_table_comm().state_keys_comm, - // )?; + circuit.enforce_equal( + state_ver_key_comm, + stake_table_state_pub_var.state_keys_comm, + )?; // checking the commitment for the list of stake amounts let stake_amount_preimage_vars = stake_table_var .iter() .map(|var| var.stake_amount) .collect::>(); - let _stake_amount_comm = RescueNativeGadget::::rescue_sponge_with_padding( + let stake_amount_comm = RescueNativeGadget::::rescue_sponge_with_padding( &mut circuit, &stake_amount_preimage_vars, 1, )?[0]; - // circuit.enforce_equal( - // stake_amount_comm, - // lightclient_state_pub_var - // .stake_table_comm() - // .stake_amount_comm, - // )?; + circuit.enforce_equal( + stake_amount_comm, + stake_table_state_pub_var.stake_amount_comm, + )?; // checking all signatures let verification_result_vars = stake_table_var @@ -318,7 +280,11 @@ where SignatureGadget::<_, P>::check_signature_validity( &mut circuit, &entry.state_ver_key, - lightclient_state_pub_var.as_ref(), + &[ + lightclient_state_pub_var.view_num, + lightclient_state_pub_var.block_height, + lightclient_state_pub_var.block_comm_root, + ], &sig, ) }) @@ -335,7 +301,10 @@ where circuit.enforce_true(sig_ver_result.0)?; circuit.finalize_for_arithmetization()?; - Ok((circuit, public_inputs.into())) + Ok(( + circuit, + GenericPublicInput::new(lightclient_state.clone(), stake_table_state.clone()), + )) } /// Internal function to build a dummy circuit @@ -346,18 +315,15 @@ where F: RescueParameter, P: TECurveConfig, { - let lightclient_state = GenericLightClientState { - view_number: 0, - block_height: 0, - block_comm_root: F::default(), - }; + let lightclient_state = ParsedLightClientState::dummy_genesis().into(); + let stake_table_state = ParsedStakeTableState::dummy_genesis().into(); build::( &[], &[], &[], &lightclient_state, - &U256::zero(), + &stake_table_state, stake_table_capacity, ) } @@ -365,7 +331,7 @@ where #[cfg(test)] mod tests { use ark_ed_on_bn254::EdwardsConfig as Config; - use ethers::types::U256; + use hotshot_types::light_client::LightClientState; use hotshot_types::traits::stake_table::{SnapshotVersion, StakeTableScheme}; use jf_crhf::CRHF; use jf_relation::Circuit; @@ -376,8 +342,10 @@ mod tests { }; use jf_utils::test_rng; - use super::{build, GenericLightClientState}; - use crate::test_utils::{key_pairs_for_testing, stake_table_for_testing}; + use super::build; + use crate::test_utils::{ + genesis_stake_table_state, key_pairs_for_testing, stake_table_for_testing, + }; type F = ark_ed_on_bn254::Fq; const ST_CAPACITY: usize = 20; @@ -390,6 +358,7 @@ mod tests { let (qc_keys, state_keys) = key_pairs_for_testing(num_validators, &mut prng); let st = stake_table_for_testing(ST_CAPACITY, &qc_keys, &state_keys); + let st_state = genesis_stake_table_state(&st); let entries = st .try_iter(SnapshotVersion::LastEpochStart) @@ -401,7 +370,7 @@ mod tests { VariableLengthRescueCRHF::::evaluate(vec![F::from(1u32), F::from(2u32)]).unwrap() [0]; - let lightclient_state = GenericLightClientState { + let lightclient_state = LightClientState { view_number: 100, block_height: 73, block_comm_root, @@ -434,12 +403,14 @@ mod tests { .map(|b| if b { F::from(1u64) } else { F::from(0u64) }) .collect::>(); // good path + let mut good_st_state = st_state.clone(); + good_st_state.threshold = F::from(26u32); let (circuit, public_inputs) = build( &entries, &bit_vec, &bit_masked_sigs, &lightclient_state, - &U256::from(26u32), + &good_st_state, ST_CAPACITY, ) .unwrap(); @@ -447,12 +418,13 @@ mod tests { .check_circuit_satisfiability(public_inputs.as_ref()) .is_ok()); + good_st_state.threshold = F::from(10u32); let (circuit, public_inputs) = build( &entries, &bit_vec, &bit_masked_sigs, &lightclient_state, - &U256::from(10u32), + &good_st_state, ST_CAPACITY, ) .unwrap(); @@ -467,7 +439,7 @@ mod tests { &bit_vec, &bit_masked_sigs, &lightclient_state, - &U256::from(26u32), + &st_state, ST_CAPACITY, ) .unwrap(); @@ -501,7 +473,7 @@ mod tests { &bad_bit_vec, &bad_bit_masked_sigs, &lightclient_state, - &U256::from(25u32), + &st_state, ST_CAPACITY, ) .unwrap(); @@ -525,7 +497,7 @@ mod tests { &bit_vec, &sig_for_bad_state, &bad_lightclient_state, - &U256::from(26u32), + &st_state, ST_CAPACITY, ) .unwrap(); @@ -550,7 +522,7 @@ mod tests { &bit_vec, &wrong_sigs, &lightclient_state, - &U256::from(26u32), + &st_state, ST_CAPACITY, ) .unwrap(); @@ -564,7 +536,7 @@ mod tests { &bit_vec, &bit_masked_sigs, &lightclient_state, - &U256::from(26u32), + &st_state, 9 ) .is_err()); diff --git a/hotshot-state-prover/src/mock_ledger.rs b/hotshot-state-prover/src/mock_ledger.rs index 73b232b12..c4e1631c4 100644 --- a/hotshot-state-prover/src/mock_ledger.rs +++ b/hotshot-state-prover/src/mock_ledger.rs @@ -219,7 +219,7 @@ impl MockLedger { } /// Return the light client state and proof of consensus on this finalized state - pub fn gen_state_proof(&mut self) -> (GenericPublicInput, Proof, GenericStakeState) { + pub fn gen_state_proof(&mut self) -> (GenericPublicInput, Proof) { let state_msg: [F; 3] = self.state.clone().into(); let st: Vec<(BLSVerKey, U256, SchnorrVerKey)> = self @@ -289,23 +289,12 @@ impl MockLedger { &bit_vec, &sigs, &self.state, - &self.threshold, + &self.stake_table_state, STAKE_TABLE_CAPACITY, ) .expect("Fail to generate state proof"); - let stake_table_comm = self - .st - .clone() - .commitment(SnapshotVersion::LastEpochStart) - .unwrap(); - let stt = StakeState { - threshold: u256_to_field(self.threshold), - stake_table_bls_key_comm: stake_table_comm.0, - stake_table_schnorr_key_comm: stake_table_comm.1, - stake_table_amount_comm: stake_table_comm.2, - }; - (pi, proof, stt) + (pi, proof) } /// a malicious attack, generating a fake stake table full of adversarial stakers @@ -313,7 +302,7 @@ impl MockLedger { /// in an attempt to hijack the correct stake table. pub fn gen_state_proof_with_fake_stakers( &mut self, - ) -> (GenericPublicInput, Proof, GenericStakeState) { + ) -> (GenericPublicInput, Proof, GenericStakeTableState) { let new_state = self.state.clone(); let (adv_qc_keys, adv_state_keys) = @@ -361,18 +350,18 @@ impl MockLedger { &bit_vec, &sigs, &new_state, - &self.threshold, // it's fine to use the old threshold + &self.stake_table_state, STAKE_TABLE_CAPACITY, ) .expect("Fail to generate state proof"); let (bls_key_comm, schnorr_key_comm, amount_comm) = adv_st.commitment(SnapshotVersion::LastEpochStart).unwrap(); - let stake_table = StakeState { + let stake_table = StakeTableState { threshold: u256_to_field(self.threshold), - stake_table_bls_key_comm: bls_key_comm, - stake_table_schnorr_key_comm: schnorr_key_comm, - stake_table_amount_comm: amount_comm, + bls_key_comm, + schnorr_key_comm, + amount_comm, }; (pi, proof, stake_table) @@ -413,7 +402,7 @@ impl MockLedger { .unwrap(), ); - let stake_table: ParsedStakeState = ParsedStakeState { + let stake_table = ParsedStakeTableState { threshold: self.threshold, bls_key_comm: field_to_u256(bls_key_comm), schnorr_key_comm: field_to_u256(schnorr_key_comm), diff --git a/hotshot-state-prover/src/service.rs b/hotshot-state-prover/src/service.rs index 1cb2954a4..84e2209f1 100644 --- a/hotshot-state-prover/src/service.rs +++ b/hotshot-state-prover/src/service.rs @@ -28,8 +28,7 @@ use hotshot_contract_adapter::{ use hotshot_stake_table::vec_based::{config::FieldType, StakeTable}; use hotshot_types::{ light_client::{ - CircuitField, GenericPublicInput, LightClientState, PublicInput, StateSignaturesBundle, - StateVerKey, + CircuitField, GenericPublicInput, LightClientState, PublicInput, StakeTableState, StateSignaturesBundle, StateVerKey }, signature_key::BLSPubKey, traits::{ @@ -187,47 +186,27 @@ pub fn light_client_genesis_from_stake_table( .expect("Commitment computation shouldn't fail."); let threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart)?); let pi = vec![ - u256_to_field(threshold), F::from(0_u64), // Arbitrary value for view number F::from(0_u64), // Arbitrary value for block height F::from(0_u64), // Arbitrary value for state commitment - F::from(0_u64), // Arbitrary value for fee ledger commitment bls_comm, schnorr_comm, stake_comm, + u256_to_field(threshold), ]; let pi: GenericPublicInput = pi.into(); Ok(pi.into()) } -pub async fn light_client_genesis_stake( - sequencer_url: &Url, - stake_table_capacity: usize, -) -> anyhow::Result { - let st = init_stake_table_from_sequencer(sequencer_url, stake_table_capacity) - .await - .with_context(|| "Failed to initialize stake table")?; - light_client_genesis_stake_from_stake_table(st) -} - -#[inline] -pub fn light_client_genesis_stake_from_stake_table( - st: StakeTable, -) -> anyhow::Result { - let (bls_comm, schnorr_comm, stake_comm) = st - .commitment(SnapshotVersion::LastEpochStart) - .expect("Commitment computation shouldn't fail."); - let honest_threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart)?); - - let stt = ParsedStakeState { - threshold: honest_threshold, - bls_key_comm: field_to_u256(bls_comm), - schnorr_key_comm: field_to_u256(schnorr_comm), - amount_comm: field_to_u256(stake_comm), - }; - - Ok(stt) -} +// pub async fn light_client_genesis_stake( +// sequencer_url: &Url, +// stake_table_capacity: usize, +// ) -> anyhow::Result { +// let st = init_stake_table_from_sequencer(sequencer_url, stake_table_capacity) +// .await +// .with_context(|| "Failed to initialize stake table")?; +// light_client_genesis_stake_from_stake_table(st) +// } pub fn load_proving_key(stake_table_capacity: usize) -> ProvingKey { let srs = { @@ -294,7 +273,7 @@ pub async fn read_contract_state( provider: Url, key: SigningKey, light_client_address: Address, -) -> Result { +) -> Result<(LightClientState, StakeTableState), ProverError> { let contract = prepare_contract(provider, key, light_client_address).await?; let state: ParsedLightClientState = match contract.finalized_state().call().await { Ok(s) => s.into(), @@ -303,9 +282,15 @@ pub async fn read_contract_state( return Err(ProverError::ContractError(e.into())); } }; - let state: LightClientState = state.into(); + let st_state: ParsedStakeTableState = match contract.genesis_stake_table_state().call().await { + Ok(s) => s.into(), + Err(e) => { + tracing::error!("unable to read genesis_stake_table_state from contract: {}", e); + return Err(ProverError::ContractError(e.into())); + } + }; - Ok(state) + Ok((state.into(), st_state.into())) } /// submit the latest finalized state along with a proof to the L1 LightClient contract @@ -355,7 +340,7 @@ pub async fn sync_state( let bundle = fetch_latest_state(relay_server_client).await?; tracing::info!("Bundle accumulated weight: {}", bundle.accumulated_weight); tracing::info!("Latest HotShot block height: {}", bundle.state.block_height); - let old_state = + let (old_state, st_state) = read_contract_state(provider.clone(), key.clone(), light_client_address).await?; tracing::info!( "Current HotShot block height on contract: {}", @@ -368,8 +353,6 @@ pub async fn sync_state( tracing::debug!("Old state: {old_state:?}"); tracing::debug!("New state: {:?}", bundle.state); - let threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart)?); - tracing::info!("Threshold before syncing state: {}", threshold); let entries = st .try_iter(SnapshotVersion::LastEpochStart) .unwrap() @@ -390,7 +373,7 @@ pub async fn sync_state( } }); - if accumulated_weight < threshold { + if accumulated_weight < field_to_u256(st_state.threshold) { return Err(ProverError::InvalidState( "The signers' total weight doesn't reach the threshold.".to_string(), )); @@ -408,7 +391,7 @@ pub async fn sync_state( signer_bit_vec, signatures, &bundle.state, - &threshold, + &st_state, stake_table_capacity, ) }) @@ -563,7 +546,7 @@ mod test { use anyhow::Result; use ark_ed_on_bn254::EdwardsConfig; use ethers::utils::{Anvil, AnvilInstance}; - use hotshot_contract_adapter::light_client::{LightClientConstructorArgs, ParsedStakeState}; + use hotshot_contract_adapter::light_client::{LightClientConstructorArgs, ParsedStakeTableState}; use hotshot_stake_table::vec_based::StakeTable; use hotshot_types::light_client::StateSignKey; use jf_signature::{schnorr::SchnorrSignatureScheme, SignatureScheme}; @@ -585,7 +568,7 @@ mod test { #[allow(clippy::type_complexity)] fn init_ledger_for_test() -> ( ParsedLightClientState, - ParsedStakeState, + ParsedStakeTableState, Vec, Vec<(StateSignKey, StateVerKey)>, StakeTable, @@ -610,7 +593,7 @@ mod test { // everybody signs, then generate a proof fn gen_state_proof( new_state: ParsedLightClientState, - genesis_stake_state: &ParsedStakeState, + genesis_stake_state: &ParsedStakeTableState, state_keypairs: &[(StateSignKey, StateVerKey)], st: &StakeTable, ) -> (PublicInput, Proof) { @@ -657,7 +640,7 @@ mod test { &bit_vec, &sigs, &new_state.into(), - &genesis_stake_state.threshold, + &genesis_stake_state.clone().into(), STAKE_TABLE_CAPACITY_FOR_TEST, ) .expect("Fail to generate state proof"); @@ -670,7 +653,7 @@ mod test { async fn deploy_contract_for_test( anvil: &AnvilInstance, genesis: ParsedLightClientState, - stake_genesis: ParsedStakeState, + stake_genesis: ParsedStakeTableState, ) -> Result<(Arc, LightClient)> { let provider = Provider::::try_from(anvil.endpoint())?; let signer = Wallet::from(anvil.keys()[0].clone()) @@ -679,7 +662,7 @@ mod test { let genesis_constructor_args: LightClientConstructorArgs = LightClientConstructorArgs { light_client_state: genesis, - stake_state: stake_genesis, + stake_table_state: stake_genesis, max_history_seconds: MAX_HISTORY_SECONDS, }; @@ -726,7 +709,7 @@ mod test { setup_test(); let anvil = Anvil::new().spawn(); let dummy_genesis = ParsedLightClientState::dummy_genesis(); - let dummy_stake_genesis = ParsedStakeState::dummy_genesis(); + let dummy_stake_genesis = ParsedStakeTableState::dummy_genesis(); let (_wallet, contract) = deploy_contract_for_test(&anvil, dummy_genesis.clone(), dummy_stake_genesis.clone()) .await?; @@ -735,18 +718,19 @@ mod test { let genesis: ParsedLightClientState = contract.genesis_state().await?.into(); assert_eq!(genesis, dummy_genesis); - let stake_genesis: ParsedStakeState = contract.genesis_stake_state().await?.into(); + let stake_genesis: ParsedStakeTableState = contract.genesis_stake_table_state().await?.into(); assert_eq!(stake_genesis, dummy_stake_genesis); let mut config = StateProverConfig::default(); config.update_l1_info(&anvil, contract.address()); - let state = super::read_contract_state( + let (state, st_state) = super::read_contract_state( config.provider, config.signing_key, config.light_client_address, ) .await?; assert_eq!(state, genesis.into()); + assert_eq!(st_state, stake_genesis.into()); Ok(()) } diff --git a/hotshot-state-prover/src/snark.rs b/hotshot-state-prover/src/snark.rs index 54f0c13a8..3bf7655b0 100644 --- a/hotshot-state-prover/src/snark.rs +++ b/hotshot-state-prover/src/snark.rs @@ -7,7 +7,9 @@ use ark_std::{ use ethers::types::U256; /// BLS verification key, base field and Schnorr verification key pub use hotshot_stake_table::vec_based::config::QCVerKey; -use hotshot_types::light_client::{CircuitField, LightClientState, PublicInput, StateVerKey}; +use hotshot_types::light_client::{ + CircuitField, LightClientState, PublicInput, StakeTableState, StateVerKey, +}; use jf_plonk::{ errors::PlonkError, proof_system::{PlonkKzgSnark, UniversalSNARK}, @@ -40,9 +42,9 @@ pub fn preprocess( /// Given a proving key and /// - a list of stake table entries (`Vec<(BLSVerKey, Amount, SchnorrVerKey)>`) /// - 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)`) +/// - updated light client state (`(view_number, block_height, block_comm_root)`) +/// - the static stake table state (containing 3 commitments to the 3 columns of the stake table and a threshold) /// - a bit vector indicates the signers -/// - a quorum threshold /// /// Returns error or a pair `(proof, public_inputs)` asserting that /// - the signer's accumulated weight exceeds the quorum threshold @@ -62,7 +64,7 @@ pub fn generate_state_update_proof( signer_bit_vec: BitIter, signatures: SigIter, lightclient_state: &LightClientState, - threshold: &U256, + stake_table_state: &StakeTableState, stake_table_capacity: usize, ) -> Result<(Proof, PublicInput), PlonkError> where @@ -90,7 +92,7 @@ where signer_bit_vec, signatures, lightclient_state, - threshold, + stake_table_state, stake_table_capacity, )?; let proof = PlonkKzgSnark::::prove::<_, _, SolidityTranscript>(rng, &circuit, pk, None)?; @@ -106,9 +108,8 @@ mod tests { rand::{CryptoRng, RngCore}, One, }; - use ethers::types::U256; use hotshot_types::{ - light_client::GenericLightClientState, + light_client::LightClientState, traits::stake_table::{SnapshotVersion, StakeTableScheme}, }; use jf_crhf::CRHF; @@ -127,7 +128,7 @@ mod tests { use super::{generate_state_update_proof, preprocess, CircuitField, UniversalSrs}; use crate::{ circuit::build_for_preprocessing, - test_utils::{key_pairs_for_testing, stake_table_for_testing}, + test_utils::{genesis_stake_table_state, key_pairs_for_testing, stake_table_for_testing}, }; const ST_CAPACITY: usize = 20; @@ -194,6 +195,7 @@ mod tests { let (bls_keys, schnorr_keys) = key_pairs_for_testing(num_validators, &mut prng); let st = stake_table_for_testing(ST_CAPACITY, &bls_keys, &schnorr_keys); + let st_state = genesis_stake_table_state(&st); let stake_table_entries = st .try_iter(SnapshotVersion::LastEpochStart) @@ -206,18 +208,11 @@ mod tests { CircuitField::from(2u32), ]) .unwrap()[0]; - let _fee_ledger_comm = VariableLengthRescueCRHF::::evaluate(vec![ - CircuitField::from(3u32), - CircuitField::from(5u32), - ]) - .unwrap()[0]; - let lightclient_state = GenericLightClientState { + let lightclient_state = LightClientState { view_number: 100, block_height: 73, block_comm_root, - // fee_ledger_comm, - // stake_table_comm: st.commitment(SnapshotVersion::LastEpochStart).unwrap(), }; let state_msg: [CircuitField; 3] = lightclient_state.clone().into(); @@ -263,7 +258,7 @@ mod tests { &bit_vec, &bit_masked_sigs, &lightclient_state, - &U256::from(26u32), + &st_state, ST_CAPACITY, ); assert!(result.is_ok()); @@ -278,6 +273,8 @@ mod tests { .is_ok()); // minimum bad path, other bad cases are checked inside `circuit.rs` + let mut bad_st_state = st_state.clone(); + bad_st_state.threshold = CircuitField::from(100u32); let result = generate_state_update_proof::<_, _, _, _>( &mut prng, &pk, @@ -285,7 +282,7 @@ mod tests { &bit_vec, &bit_masked_sigs, &lightclient_state, - &U256::from(100u32), + &bad_st_state, ST_CAPACITY, ); assert!(result.is_err()); diff --git a/hotshot-state-prover/src/test_utils.rs b/hotshot-state-prover/src/test_utils.rs index 6822ae7e9..bcb3004a7 100644 --- a/hotshot-state-prover/src/test_utils.rs +++ b/hotshot-state-prover/src/test_utils.rs @@ -2,13 +2,18 @@ use ark_ed_on_bn254::EdwardsConfig; use ark_std::rand::{CryptoRng, RngCore}; use ethers::types::U256; use hotshot_stake_table::vec_based::StakeTable; -use hotshot_types::traits::stake_table::StakeTableScheme; +use hotshot_types::{ + light_client::GenericStakeTableState, + traits::stake_table::{SnapshotVersion, StakeTableScheme}, +}; use jf_signature::{ bls_over_bn254::{BLSOverBN254CurveSignatureScheme, VerKey as BLSVerKey}, schnorr::SchnorrSignatureScheme, SignatureScheme, }; +use crate::{circuit::u256_to_field, service::one_honest_threshold}; + type F = ark_ed_on_bn254::Fq; type SchnorrVerKey = jf_signature::schnorr::VerKey; type SchnorrSignKey = jf_signature::schnorr::SignKey; @@ -53,3 +58,19 @@ pub(crate) fn stake_table_for_testing( st.advance(); st } + +pub(crate) fn genesis_stake_table_state( + st: &StakeTable, +) -> GenericStakeTableState { + let (bls_key_comm, schnorr_key_comm, amount_comm) = + st.commitment(SnapshotVersion::LastEpochStart).unwrap(); + let threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart).unwrap()); + + let st_state = GenericStakeTableState { + bls_key_comm, + schnorr_key_comm, + amount_comm, + threshold: u256_to_field(&threshold), + }; + st_state +} diff --git a/sequencer/src/api.rs b/sequencer/src/api.rs index cb9d0a131..b94a9288c 100644 --- a/sequencer/src/api.rs +++ b/sequencer/src/api.rs @@ -386,8 +386,7 @@ pub mod test_helpers { use hotshot::types::{Event, EventType}; use hotshot_contract_adapter::light_client::{ParsedLightClientState, ParsedStakeState}; use hotshot_types::{ - event::LeafInfo, - traits::{metrics::NoMetrics, node_implementation::ConsensusTime}, + event::LeafInfo, light_client::LightClientState, traits::{metrics::NoMetrics, node_implementation::ConsensusTime} }; use itertools::izip; use jf_merkle_tree::{MerkleCommitment, MerkleTreeScheme}; @@ -627,15 +626,16 @@ pub mod test_helpers { } } - pub fn light_client_genesis(&self) -> ParsedLightClientState { + // FIXME: update this logic + pub fn light_client_genesis(&self) -> LightClientState { let st = self.cfg.stake_table(); light_client_genesis_from_stake_table(st).unwrap() } - pub fn light_client_genesis_stake(&self) -> ParsedStakeState { - let st = self.cfg.stake_table(); - light_client_genesis_stake_from_stake_table(st).unwrap() - } + // pub fn light_client_genesis_stake(&self) -> ParsedStakeState { + // let st = self.cfg.stake_table(); + // light_client_genesis_stake_from_stake_table(st).unwrap() + // } pub async fn stop_consensus(&mut self) { self.server.shutdown_consensus().await; From c63635e04eb70c651e8bd2d3bf7295e1ee5f9b80 Mon Sep 17 00:00:00 2001 From: Alysia Huggins Date: Thu, 5 Sep 2024 17:15:00 -0400 Subject: [PATCH 13/27] removed unused variables and related function since the staketable is not upgraded --- Cargo.lock | 40 +- .../artifacts/LightClientMock_bytecode.json | 2 +- .../artifacts/LightClient_bytecode.json | 2 +- contract-bindings/src/erc1967_proxy.rs | 4 +- contract-bindings/src/fee_contract.rs | 4 +- contract-bindings/src/hot_shot.rs | 4 +- contract-bindings/src/light_client.rs | 361 ------------------ contract-bindings/src/light_client_mock.rs | 361 ------------------ .../src/light_client_state_update_vk.rs | 4 +- .../src/light_client_state_update_vk_mock.rs | 4 +- contract-bindings/src/plonk_verifier.rs | 4 +- contract-bindings/src/plonk_verifier_2.rs | 4 +- contracts/rust/adapter/src/light_client.rs | 4 +- contracts/rust/diff-test/src/main.rs | 6 +- contracts/src/LightClient.sol | 35 +- contracts/test/LightClient.t.sol | 60 +-- .../test/LightClientUpgradeSameContract.t.sol | 18 +- contracts/test/LightClientUpgradeToVx.t.sol | 8 +- contracts/test/mocks/LightClientMock.sol | 2 +- foundry.toml | 2 +- hotshot-state-prover/src/mock_ledger.rs | 10 +- hotshot-state-prover/src/service.rs | 20 +- sequencer/src/api.rs | 4 +- 23 files changed, 112 insertions(+), 851 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4f9bae2b0..1df4adc17 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -727,7 +727,7 @@ dependencies = [ "futures-lite 2.3.0", "parking", "polling 3.7.3", - "rustix 0.38.35", + "rustix 0.38.36", "slab", "tracing", "windows-sys 0.59.0", @@ -795,7 +795,7 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.35", + "rustix 0.38.36", "windows-sys 0.48.0", ] @@ -811,7 +811,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.35", + "rustix 0.38.36", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -1697,9 +1697,9 @@ checksum = "da987586004ae7c43b7df5e3f7693775068522e1086f8d9b2d74c778a0f43313" [[package]] name = "clap" -version = "4.5.16" +version = "4.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" +checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" dependencies = [ "clap_builder", "clap_derive", @@ -1707,9 +1707,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.15" +version = "4.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" +checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" dependencies = [ "anstream", "anstyle", @@ -2398,9 +2398,9 @@ dependencies = [ [[package]] name = "dashmap" -version = "6.0.1" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804c8821570c3f8b70230c2ba75ffa5c0f9a4189b9a432b6656c536712acae28" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ "cfg-if", "crossbeam-utils", @@ -7279,7 +7279,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite 0.2.14", - "rustix 0.38.35", + "rustix 0.38.36", "tracing", "windows-sys 0.59.0", ] @@ -7535,7 +7535,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools 0.12.1", "proc-macro2", "quote", "syn 2.0.77", @@ -8288,9 +8288,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.35" +version = "0.38.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" +checksum = "3f55e80d50763938498dd5ebb18647174e0c76dc38c5505294bb224624f30f36" dependencies = [ "bitflags 2.6.0", "errno", @@ -8734,9 +8734,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", "memchr", @@ -9774,7 +9774,7 @@ dependencies = [ "cfg-if", "fastrand 2.1.1", "once_cell", - "rustix 0.38.35", + "rustix 0.38.36", "windows-sys 0.59.0", ] @@ -10126,9 +10126,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite 0.2.14", @@ -10152,9 +10152,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes 1.7.1", "futures-core", diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json index 7ce526a08..5b107fd4c 100644 --- a/contract-bindings/artifacts/LightClientMock_bytecode.json +++ b/contract-bindings/artifacts/LightClientMock_bytecode.json @@ -1 +1 @@ -"0x60a0346200057857620030ae38819003601f8101601f191683016001600160401b03811184821017620004aa57839282916040528339810103610100811262000578576060811262000578576080604051916200005c836200057d565b620000678462000599565b8352620000776020850162000599565b602084015260408401516040840152605f19011262000578576040519160808301906001600160401b03821184831017620004aa5760e091604052606081015184526080810151602085015260a0810151604085015260c08101516060850152015163ffffffff811681036200057857306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8160401c1662000566576002600160401b03196001600160401b038216016200051a575b505081516001600160401b03161580159062000503575b8015620004f6575b8015620004e9575b8015620004dc575b8015620004d2575b620004c05760018060401b03825116908160085468010000000000000000600160801b03602086015160401b1691829160018060801b031916171760085560408401519182600955855160045560208601519283600555604087015192836006556060880151958660075560018060801b0319600a54161717600a55600b55600c549063ffffffff60a81b9060a81b169063ffffffff60a81b1916179283600c55604051916020830193845260408301526060820152606081526080810181811060018060401b03821117620004aa57604052519020600093818555519081600155600255600355600e5490811515918262000433575b5050620003a4575b602081015160409182015182519290916001600160401b039081169184019081118482101762000390576040528252602082015260405190620002ad826200057d565b6001600160401b03438116835242166020830190815260408301918252600e54909290680100000000000000008110156200039057806001620002f49201600e55620005ae565b9490946200037c575051835492516001600160801b03199093166001600160401b0391821617604093841b6fffffffffffffffff000000000000000016178455905180516001850180546001600160401b0319169190931617909155602001516002929092019190915551612ac99081620005e58239608051818181610b410152610c990152f35b634e487b7160e01b81526004819052602490fd5b634e487b7160e01b85526041600452602485fd5b600d54620003bb906001600160401b0316620005ae565b6200041f5782815560018101839055600201829055600d546001600160401b038082169081146200040b576001600160401b03199091166001919091016001600160401b031617600d556200026a565b634e487b7160e01b84526011600452602484fd5b634e487b7160e01b83526004839052602483fd5b90915060001981019081116200040b576200044e90620005ae565b5054600d546001600160401b0360409290921c821691620004709116620005ae565b505460401c6001600160401b03908116909103919082116200040b5760a81c63ffffffff166001600160401b039091161015388062000262565b634e487b7160e01b600052604160045260246000fd5b6040516350dd03f760e11b8152600490fd5b508251156200016b565b5060608301511562000163565b506040830151156200015b565b5060208301511562000153565b5060208201516001600160401b031615156200014b565b6001600160401b0319166001600160401b039081179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388062000134565b60405163f92ee8a960e01b8152600490fd5b600080fd5b606081019081106001600160401b03821117620004aa57604052565b51906001600160401b03821682036200057857565b600e54811015620005ce57600e6000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461021757806302b592f3146102125780630d8e6e2c1461020d5780632063d4f7146102085780632d52aad6146102035780632f5f4600146101fe5780632f79889d146101f9578063313df7b1146101f4578063382b215a146101ef578063426d3194146101ea5780634f1ef286146101e557806352d1902d146101e057806362827733146101db57806369cc6a04146101d65780636f96bdae146101d1578063715018a6146101cc57806376b6b7cb146101c75780638584d23f146101c25780638da5cb5b146101bd57806396c1ca61146101b85780639baa3cc9146101b35780639fdb54a7146101ae578063ad3cb1cc146101a9578063b5adea3c146101a4578063bd32519a1461019f578063c23b9e9e1461019a578063c8e5e49814610195578063ca6fe85514610190578063d24d933d1461018b578063e030330114610186578063f2fde38b146101815763f9e50d191461017c57600080fd5b611408565b6113df565b6112af565b611274565b611256565b611239565b611212565b6111ec565b611193565b611116565b6110d7565b610f8a565b610f03565b610eba565b610e7d565b610e5f565b610df4565b610da9565b610d0f565b610cf1565b610c86565b610ac7565b610a75565b610a57565b610a2e565b610a07565b61091b565b6108f5565b61079d565b6104ed565b610477565b61024e565b600435906001600160a01b038216820361023257565b600080fd5b61010435906001600160a01b038216820361023257565b346102325760203660031901126102325761026761021c565b61026f611a4c565b6001600160a01b039081169081156102ff57600c5490811682146102ed5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561036257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b610311565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761039857604052565b610367565b606081019081106001600160401b0382111761039857604052565b608081019081106001600160401b0382111761039857604052565b90601f801991011681019081106001600160401b0382111761039857604052565b604051906102e082018281106001600160401b0382111761039857604052565b604051906104218261037d565b565b604051906104218261039d565b604051906102c082018281106001600160401b0382111761039857604052565b9060405161045d8161037d565b6020600182946001600160401b0381541684520154910152565b3461023257602036600319011261023257600435600e54811015610232576104a0608091610327565b506104eb8154916104bb60016001600160401b039201610450565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610232576000366003190112610232576060604051600181526000602082015260006040820152f35b35906001600160401b038216820361023257565b606090600319011261023257604051906105448261039d565b816001600160401b03600435818116810361023257825260243590811681036102325760208201526040604435910152565b6040906063190112610232576040519061058f8261037d565b60643582526084356020830152565b60409060a319011261023257604051906105b78261037d565b60a435825260c4356020830152565b60409060e319011261023257604051906105df8261037d565b60e4358252610104356020830152565b60409061012319011261023257604051906106098261037d565b610124358252610144356020830152565b60409061016319011261023257604051906106348261037d565b610164358252610184356020830152565b6040906101a3190112610232576040519061065f8261037d565b6101a43582526101c4356020830152565b6040906101e3190112610232576040519061068a8261037d565b6101e4358252610204356020830152565b60409061022319011261023257604051906106b58261037d565b610224358252610244356020830152565b60409061026319011261023257604051906106e08261037d565b610264358252610284356020830152565b6040906102a3190112610232576040519061070b8261037d565b6102a43582526102c4356020830152565b6040906102e319011261023257604051906107368261037d565b6102e4358252610304356020830152565b60409061032319011261023257604051906107618261037d565b610324358252610344356020830152565b604090610363190112610232576040519061078c8261037d565b610364358252610384356020830152565b34610232576104e0366003190112610232576107b83661052b565b610480366063190112610232576108f3906107d16103f4565b906107db36610576565b82526107e63661059e565b60208301526107f4366105c6565b6040830152610802366105ef565b60608301526108103661061a565b608083015261081e36610645565b60a083015261082c36610670565b60c083015261083a3661069b565b60e0830152610848366106c6565b610100830152610857366106f1565b6101208301526108663661071c565b61014083015261087536610747565b61016083015261088436610772565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c0830152611479565b005b3461023257602036600319011261023257600f805460ff19166001179055600435601055005b3461023257602080600319360112610232576001600160401b0360043581811161023257366023820112156102325780600401359182116103985760409283519261096b828260051b01856103d3565b80845260248285019160071b8401019236841161023257602401905b838210610997576108f385611671565b8136036080811261023257868051916109af8361039d565b6109b885610517565b83526109c5868601610517565b83870152603f19011261023257608091849188516109e28161037d565b6109ed8a8701610517565b815260608601358482015289820152815201910190610987565b346102325760003660031901126102325760206001600160401b03600d5416604051908152f35b3461023257600036600319011261023257600c546040516001600160a01b039091168152602090f35b34610232576000366003190112610232576020600254604051908152f35b3461023257600036600319011261023257608060045460055460065460075491604051938452602084015260408301526060820152f35b6001600160401b03811161039857601f01601f191660200190565b60408060031936011261023257610adc61021c565b6024356001600160401b038111610232573660238201121561023257806004013590610b0782610aac565b91610b14855193846103d3565b80835260209136602483830101116102325781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610c6a575b50610c59579080600492610b7f611a4c565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610c2a575b5050610bef578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612a7d8339815191528193929303610c11576108f383836128e1565b8351632a87526960e21b81526004810191909152602490fd5b610c4a929350803d10610c52575b610c4281836103d3565b8101906121cd565b903880610bc9565b503d610c38565b845163703e46dd60e11b8152600490fd5b905081600080516020612a7d8339815191525416141538610b6d565b34610232576000366003190112610232577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610cdf576020604051600080516020612a7d8339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610232576000366003190112610232576020600154604051908152f35b3461023257600080600319360112610d6e57610d29611a4c565b600c5460ff8160a01c166000146102ed576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b60809060631901126102325760405190610d8a826103b8565b6064358252608435602083015260a435604083015260c4356060830152565b34610232576080366003190112610232576020610dec604051610dcb816103b8565b6004358152602435838201526044356040820152606435606082015261171b565b604051908152f35b3461023257600080600319360112610d6e57610e0e611a4c565b600080516020612a5d83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610232576000366003190112610232576020600054604051908152f35b34610232576020366003190112610232576040610e9b600435611788565b6104eb82518092602080916001600160401b0381511684520151910152565b3461023257600036600319011261023257600080516020612a5d833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff8216820361023257565b346102325760203660031901126102325760043563ffffffff80821680830361023257610f2e611a4c565b610e108110918215610f78575b5050610f6657600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610f3b565b346102325761012036600319011261023257610fa53661052b565b610fae36610d71565b90610fb7610ef0565b610fbf610237565b90600080516020612a9d83398151915254936001600160401b0360ff8660401c16159516801590816110cf575b60011490816110c5575b1590816110bc575b506110aa57600080516020612a9d833981519152805467ffffffffffffffff1916600117905561103293856110855761184e565b61103857005b600080516020612a9d833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102e8565b600080516020612a9d833981519152805460ff60401b1916600160401b17905561184e565b60405163f92ee8a960e01b8152600490fd5b90501538610ffe565b303b159150610ff6565b869150610fec565b3461023257600036600319011261023257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b0390f35b346102325760003660031901126102325760408051906111358261037d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106111805784604081866000838284010152601f80199101168101030190f35b858101830151858201830152820161115e565b346102325760603660031901126102325760406111af3661052b565b6001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55600080f35b3461023257600036600319011261023257602060ff600c5460a01c166040519015158152f35b3461023257600036600319011261023257602063ffffffff600c5460a81c16604051908152f35b3461023257600036600319011261023257600f805460ff19169055005b34610232576000366003190112610232576020600354604051908152f35b3461023257600036600319011261023257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b34610232576040366003190112610232576004356024359060ff600f54166000906000146112fd5750906112e9611112926010549061177b565b115b60405190151581529081906020820190565b91600e549143811180156113d5575b6113625761131a849361176c565b9261133c611330600d546001600160401b031690565b6001600160401b031690565b935b8115611374575b509091925015611362576111129261135c9161177b565b116112eb565b60405163b0b4387760e01b8152600490fd5b8261139261133061138484610327565b50546001600160401b031690565b11156113bb575b600281106113b6578481146113b6576113b1906121dc565b61133e565b611345565b94505060016113cf61133061138487610327565b94611399565b506003831061130c565b34610232576020366003190112610232576108f36113fb61021c565b611403611a4c565b6119d8565b34610232576000366003190112610232576020600e54604051908152f35b634e487b7160e01b600052600060045260246000fd5b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c169081611589575b50611577578151600a546001600160401b03918183169083161180159190611550575b5061153e577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906114ed60408501936114e78551611a85565b85611f6b565b6114f68461143c565b61150584824216834316612084565b61152a602061151b86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b9050818061156860208701516001600160401b031690565b9260401c1691161115386114ae565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861148b565b634e487b7160e01b600052601160045260246000fd5b906115ca5760028160008093558260018201550155565b611426565b80518210156103625760209160051b010190565b600e54600160401b811015610398578060016116029201600e55610327565b9190916115ca57805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b90600e546000600e55806116ae575b5060005b82518110156116a957806116a361169d600193866115cf565b516115e3565b01611684565b509050565b6003908060030290600382040361171657600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd908101905b8181106116f8575050611680565b80611710849260026000918281558260018201550155565b016116ea565b61159d565b602081015190606060408201519101516040519160208301938452604083015260608201526060815261174d816103b8565b51902090565b604051906117608261037d565b60006020838281520152565b60001981019190821161171657565b9190820391821161171657565b611790611753565b50600e54906117a66117a18361176c565b610327565b50906117c06113306001809401546001600160401b031690565b81101561183c576117dc611330600d546001600160401b031690565b8381106118015750505060016117f76117a16117fe9361176c565b5001610450565b90565b816118216113308561181285610327565b5001546001600160401b031690565b1161182d5782016117dc565b6117fe93506117f79150610327565b604051631856a49960e21b8152600490fd5b9190926118659061185d612988565b611403612988565b61186d612988565b6001600160401b03908161188884516001600160401b031690565b16158015906119b9575b80156119ad575b80156119a1575b8015611995575b801561198c575b61197a576104219361194961196f926118fe866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b82516004556020830151600555604083015160065560608301516007556119248661143c565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b61196a6119558261171b565b9182600055519161196583600155565b600255565b600355565b804216904316612084565b6040516350dd03f760e11b8152600490fd5b508351156118ae565b506060840151156118a7565b506040840151156118a0565b50602084015115611899565b506119d161133060208501516001600160401b031690565b1515611892565b6001600160a01b03908116908115611a3357600080516020612a5d83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612a5d833981519152546001600160a01b03163303611a6d57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611aae57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b604051906101008083018381106001600160401b0382111761039857604052368337565b90816020910312610232575180151581036102325790565b6000915b60088310611b4057505050565b600190825181526020809101920192019190611b33565b61046090611b7083825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611bce610100928386019060208091805184520151910152565b60a081015191611bee610140938487019060208091805184520151910152565b60c082015192611c0e610180948588019060208091805184520151910152565b60e083015191611c2e6101c0938489019060208091805184520151910152565b830151611c4b610200918289019060208091805184520151910152565b61012084015191611c6c61024093848a019060208091805184520151910152565b84015192611c8a61028094858a019060208091805184520151910152565b611cc561016086015196611cae6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b61060090611f5861042194969593966102a0610a808401988051855260208101516020860152611d6e6040820151604087019060208091805184520151910152565b6060810151805160808701526020015160a08601526080810151805160c08701526020015160e086015260a0810151611db7610100918288019060208091805184520151910152565b611f2486611ef560c0850151611ddd610140918285019060208091805184520151910152565b611ec660e087015195611e00610180978887019060208091805184520151910152565b870151611e1d6101c0918287019060208091805184520151910152565b611e5a61012089015193611e41610200958689019060208091805184520151910152565b8901516102408097019060208091805184520151910152565b611e978c6102c06101608b015199611e826102809b8c85019060208091805184520151910152565b8b015191019060208091805184520151910152565b6101a088015180516103008e0152602001516103208d015287015180516103408d0152602001516103608c0152565b6101e086015180516103808c0152602001516103a08b015285015180516103c08b0152602001516103e08a0152565b61022084015180516104008a015260200151610420890152830151805161044089015260200151610460880152565b6102608201518051610480880152602001516104a08701528101516104c086015201516104e0840152610500830190611b2f565b0190611b57565b6040513d6000823e3d90fd5b602090611f76612305565b6040611f80611af3565b926001548452611f9a61133082516001600160401b031690565b85850152611fb4611330868301516001600160401b031690565b8285015201516060830152611fdd60405194859384936350f8d1a760e11b855260048501611d2c565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af490811561204e5760009161201f575b501561200d57565b6040516309bde33960e01b8152600490fd5b612041915060203d602011612047575b61203981836103d3565b810190611b17565b38612005565b503d61202f565b611f5f565b6001600160401b03918216908216039190821161171657565b6001600160401b038091169081146117165760010190565b90916120f361042193600e548015159081612159575b506120fd575b60406120b660208501516001600160401b031690565b9301516120d36120c4610414565b6001600160401b039095168552565b60208401526120e36120c4610423565b6001600160401b03166020840152565b60408201526115e3565b61211b6121156117a1600d546001600160401b031690565b906115b3565b612154612138612133600d546001600160401b031690565b61206c565b6001600160401b03166001600160401b0319600d541617600d55565b6120a0565b61219c915061216d6117a161217e9261176c565b505460401c6001600160401b031690565b61219661216d6117a1600d546001600160401b031690565b90612053565b6001600160401b036121c36121ba600c5463ffffffff9060a81c1690565b63ffffffff1690565b911610153861209a565b90816020910312610232575190565b8015611716576000190190565b6121f1610430565b906000825260006020830152612205611753565b6040830152612212611753565b606083015261221f611753565b608083015261222c611753565b60a0830152612239611753565b60c0830152612246611753565b60e0830152612253611753565b610100830152612261611753565b61012083015261226f611753565b61014083015261227d611753565b61016083015261228b611753565b610180830152612299611753565b6101a08301526122a7611753565b6101c08301526122b5611753565b6101e08301526122c3611753565b6102008301526122d1611753565b6102208301526122df611753565b6102408301526122ed611753565b610260830152600061028083015260006102a0830152565b61230d6121e9565b906201000082527f103a97f91d3df0aa53d6b2d7f29c4ebf4f323896827a8b8eeba30b7b039ce4a360206004818501527f16026254c01764d8b4fd70dc4cc51a74e0b32ba5f59e2a9e5ef169feeb7ca1ba81604086017f0d76329b8733b0b734ff0f60a40cb4c474064a8c755c1f6cbece5f7ea09d78a88151525101527f037e3a3fa0fefa3c08d50c07d472cba4274fd25c444f369d0d77db93e284f89e81606086017f124a0457892caf44e89d24b4f6eea80a0b1d532a3e59f1178b19e4caca8fbac38151525101527f1eb78f5dcd1e962bc4e33ff6caa12c4161f09ed217cdb213cebbffb63e9e57b481608086017f0319b53e71a0078028b4f021e0d4448d3e849198f25f0fb47f36ae764c06e5938151525101527f06ad874b2a3707a73260072b13799115f94f048d9065f7730d710511dcd945ae8160a086017f0c83be8ca5514d2b5527eec4871feb09b1be54fcc00fec9477fd525c563be9168151525101527f23700dcfa17c63b4681f477ab548eeae1daba4aad95d02a8d8b4619fa6d637f08160c086017f1ea8aa071b4c9346a585bbdbeb45762f4e26c395a015ad67ad732ef431b3c5958151525101527f17d041ace4a15d7297ebdccc0e098c72542e30d9b3cf6fc37edc14025a9edeaa8160e086017f20fb1c68cbebab5356eb21d126b6f596bea1168a768b59e5fbf308d6382829258151525101527f2d6d41d0b5833fb077c78ee3705435ea113a71a6537b6980f58073701224342f8161010086017f168eeff859a5f7b2781aa3c72a2c0a7a58fa9408489e7b0c13ae2feb848f5aa28151525101527f17dc9e1677dad495da48a1d95f94351c2197990789f4168f1e5dd9a31dc3e4d18161012086017f2a3b9d424102b9787e4fbfc217805739be51dbe872181dc40138dc706ce421f98151525101527f0732f969323e1586a21a2f363cd625237adeb6c9e884b5f6afd0fb862fb05e958161014086017f1e002a101f63386609be9700527a3508421d17ce7b127a3b04887704cdbd2dc68151525101527f22b5b0a08cefb39624d5260eac0cb6c63fa3942325134470f05dfcc69660a7418161016086017f0a1f5be7e2dda4ee17525ca86d1e20a1656c8bb3ac88490903d71324abaf39268151525101527f1012a3feba794457614f15434858e921c06088ca254352b6668971005bb59d0c8161018086017f131f2fb07141ec50c2c72b3a2c5bc061ef04d8a451f6093303ece094fd0770178151525101527f0e85da2cabd81a33dd542840af2640c7087dd3aa2ec7267bfc1a6fe6b117b242816101a086017f2a304967c0db314ac3c0a6613e636fd620e3fc3a5e284d28fa2a33e770cf4bb48151525101527f0ca6acfed4a97c404df14351b34dd68181ecdc2a723e80ce4b4cf3a5ff2e2c4b816101c086017f25427d12f7080ca1c010c4a710f1718446ac78ddfbf8fc9024030914c5b7988b8151525101527f079bb1a022509123aeaa6861001db5f4e9b9729c98727adff2aba5d588ae512b816101e086017f2869eb8e7c2c4223b37279eb988b696041ca315cdb14c05f463e73f24a0de6608151525101527f16e014f5b76709d9268e9c375854edb6451a9d895d2d2b4f0f0369566df19dea8161020086017f0821eba1289e0cbcbb088a218b11556d799dfd9748eee76d18c656d2b1f2d0ef8151525101527f274a3b9ef788ddae87b2d74b7d4ee2cdd10eea605fdd631caf43ef705477ce088161022086017f21b4eb6afcdfa42cd369fd0c20fc38cb7e6d8b5e88fbcc488983ea79238ef05a8151525101527f09d97d7a627d8ec24a5fb1495fee2d5cec5cd9e5c5b42c4e4bea06d9e6726bd28161024086017f21af862a9f3c7ffb2f3ef7f0e22bf4678e94296b7fbe0b37516e9b6c5e581a5481515251015261026084017f29e5bd43838ac1cfc29f172286db4a41408faed0d08a9ce4998b2a2e22bd782e8151525101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808301527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a0830152565b90813b1561296757600080516020612a7d83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511561294c57612949916129b7565b50565b50503461295557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612a9d8339815191525460401c16156129a557565b604051631afcd79f60e31b8152600490fd5b6000806117fe93602081519101845af43d156129f5573d916129d883610aac565b926129e660405194856103d3565b83523d6000602085013e6129f9565b6060915b90612a205750805115612a0e57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612a53575b612a31575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612a2956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a0604052306080523480156200001557600080fd5b50604051620034943803806200349483398101604081905262000038916200053b565b6200004262000058565b6200004f8383836200010c565b50505062000697565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a95760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001095780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b82516001600160401b031615158062000131575060208301516001600160401b031615155b806200013f57506020820151155b806200014d57506040820151155b806200015b57506060820151155b806200016657508151155b1562000185576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b0390811668010000000000000000026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b199091161790556200022443428562000229565b505050565b600a5415801590620002f75750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b03169081106200026c576200026c620005f4565b6000918252602090912060039091020154600a8054680100000000000000009092046001600160401b031691620002a69060019062000620565b81548110620002b957620002b9620005f4565b6000918252602090912060039091020154620002eb91906801000000000000000090046001600160401b03166200063c565b6001600160401b031610155b156200039557600954600a805490916001600160401b0316908110620003215762000321620005f4565b60009182526020822060039091020180546001600160801b03191681556001810180546001600160401b0319169055600201819055600980546001600160401b0316916200036f8362000666565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516060810182526001600160401b03948516815292841660208085019182528251808401845284820151871681529383015184820152918401928352600a805460018101825560009190915293517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86003909502948501805492519187166001600160801b0319909316929092176801000000000000000091871691909102179055905180517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a9840180546001600160401b031916919095161790935591909101517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aa90910155565b604051606081016001600160401b0381118282101715620004d257634e487b7160e01b600052604160045260246000fd5b60405290565b604051608081016001600160401b0381118282101715620004d257634e487b7160e01b600052604160045260246000fd5b80516001600160401b03811681146200052157600080fd5b919050565b805163ffffffff811681146200052157600080fd5b60008060008385036101008112156200055357600080fd5b60608112156200056257600080fd5b6200056c620004a1565b620005778662000509565b8152620005876020870162000509565b60208201526040868101519082015293506080605f1982011215620005ab57600080fd5b50620005b6620004d8565b60608581015182526080860151602083015260a0860151604083015260c0860151908201529150620005eb60e0850162000526565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156200063657620006366200060a565b92915050565b6001600160401b038281168282160390808211156200065f576200065f6200060a565b5092915050565b60006001600160401b038281166002600160401b031981016200068d576200068d6200060a565b6001019392505050565b608051612dd3620006c1600039600081816111be015281816111e701526113660152612dd36000f3fe60806040526004361061019c5760003560e01c80638584d23f116100ec578063bd32519a1161008a578063d24d933d11610064578063d24d933d146105c4578063e0303301146105f4578063f2fde38b14610614578063f9e50d191461063457600080fd5b8063bd32519a1461053e578063c23b9e9e1461056f578063c8e5e498146105a857600080fd5b80639baa3cc9116100c65780639baa3cc9146104325780639fdb54a714610452578063ad3cb1cc146104a8578063b5adea3c146104e657600080fd5b80638584d23f146103a85780638da5cb5b146103d557806396c1ca611461041257600080fd5b80632f79889d116101595780634f1ef286116101335780634f1ef2861461034857806352d1902d1461035b57806369cc6a041461037e578063715018a61461039357600080fd5b80632f79889d14610295578063313df7b1146102cd578063426d31941461030557600080fd5b8063013fa5fc146101a157806302b592f3146101c35780630d8e6e2c146101fb5780632063d4f7146102285780632d52aad6146102485780632f5f460014610275575b600080fd5b3480156101ad57600080fd5b506101c16101bc3660046121c9565b610649565b005b3480156101cf57600080fd5b506101e36101de3660046121e4565b610706565b6040516101f2939291906121fd565b60405180910390f35b34801561020757600080fd5b506040805160018152600060208201819052918101919091526060016101f2565b34801561023457600080fd5b506101c161024336600461237f565b610763565b34801561025457600080fd5b506101c16102633660046121e4565b600b805460ff19166001179055600c55565b34801561028157600080fd5b506101c1610290366004612533565b6108b7565b3480156102a157600080fd5b506009546102b5906001600160401b031681565b6040516001600160401b0390911681526020016101f2565b3480156102d957600080fd5b506008546102ed906001600160a01b031681565b6040516001600160a01b0390911681526020016101f2565b34801561031157600080fd5b506000546001546002546003546103289392919084565b6040805194855260208501939093529183015260608201526080016101f2565b6101c1610356366004612648565b61096d565b34801561036757600080fd5b50610370610988565b6040519081526020016101f2565b34801561038a57600080fd5b506101c16109a5565b34801561039f57600080fd5b506101c1610a15565b3480156103b457600080fd5b506103c86103c33660046121e4565b610a27565b6040516101f291906126ed565b3480156103e157600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166102ed565b34801561041e57600080fd5b506101c161042d366004612721565b610b99565b34801561043e57600080fd5b506101c161044d36600461273c565b610c0e565b34801561045e57600080fd5b50600654600754610482916001600160401b0380821692600160401b909204169083565b604080516001600160401b039485168152939092166020840152908201526060016101f2565b3480156104b457600080fd5b506104d9604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101f2919061280d565b3480156104f257600080fd5b506101c1610501366004612840565b80516006805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905560400151600755565b34801561054a57600080fd5b5060085461055f90600160a01b900460ff1681565b60405190151581526020016101f2565b34801561057b57600080fd5b5060085461059390600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101f2565b3480156105b457600080fd5b506101c1600b805460ff19169055565b3480156105d057600080fd5b50600454600554610482916001600160401b0380821692600160401b909204169083565b34801561060057600080fd5b5061055f61060f36600461285c565b610d32565b34801561062057600080fd5b506101c161062f3660046121c9565b610d68565b34801561064057600080fd5b50600a54610370565b610651610dab565b6001600160a01b0381166106785760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036106a75760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a81b0319166001600160a01b0383811691909117600160a01b1791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600a818154811061071657600080fd5b600091825260209182902060039091020180546040805180820190915260018301546001600160401b039081168252600290930154938101939093528181169350600160401b9004169083565b600854600160a01b900460ff16801561078757506008546001600160a01b03163314155b156107a5576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806107de575060065460208301516001600160401b03600160401b9092048216911611155b156107fc5760405163051c46ef60e01b815260040160405180910390fd5b6108098260400151610e06565b6108138282610e76565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561085a434284610f59565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516108ab91815260200190565b60405180910390a35050565b6108c3600a6000611ea3565b60005b815181101561096957600a8282815181106108e3576108e361287e565b60209081029190910181015182546001818101855560009485529383902082516003909202018054838501516001600160401b03908116600160401b026001600160801b031990921693811693909317178155604090920151805183860180549190931667ffffffffffffffff19919091161790915590910151600290910155016108c6565b5050565b6109756111b3565b61097e82611258565b6109698282611299565b600061099261135b565b50600080516020612da783398151915290565b6109ad610dab565b600854600160a01b900460ff16156109fa57600880546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610a1d610dab565b610a1360006113a4565b6040805180820190915260008082526020820152600a805490610a4b6001836128aa565b81548110610a5b57610a5b61287e565b60009182526020909120600160039092020101546001600160401b03168310610a9757604051631856a49960e21b815260040160405180910390fd5b6009546001600160401b03165b81811015610b3d5783600a8281548110610ac057610ac061287e565b60009182526020909120600160039092020101546001600160401b03161115610b3557600a8181548110610af657610af661287e565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b031682526002015491810191909152949350505050565b600101610aa4565b50600a610b4b6001836128aa565b81548110610b5b57610b5b61287e565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b0316825260020154918101919091529392505050565b610ba1610dab565b610e108163ffffffff161080610bca575060085463ffffffff600160a81b909104811690821611155b15610be8576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a81b0263ffffffff60a81b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610c535750825b90506000826001600160401b03166001148015610c6f5750303b155b905081158015610c7d575080155b15610c9b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cc557845460ff60401b1916600160401b1785555b610cce86611415565b610cd6611426565b610ce189898961142e565b8315610d2757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600b5460009060ff16610d4e57610d498383611539565b610d5f565b81600c5484610d5d91906128aa565b115b90505b92915050565b610d70610dab565b6001600160a01b038116610d9f57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610da8816113a4565b50565b33610ddd7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a135760405163118cdaa760e01b8152336004820152602401610d96565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806109695760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610d96565b6000610e8061164a565b9050610e8a611ec4565b600054815283516001600160401b039081166020808401919091528501511681600260200201526040848101516060830152516350f8d1a760e11b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063a1f1a34e90610ef590859085908890600401612ac4565b602060405180830381865af4158015610f12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f369190612ceb565b610f53576040516309bde33960e01b815260040160405180910390fd5b50505050565b600a54158015906110125750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b0316908110610f9857610f9861287e565b6000918252602090912060039091020154600a8054600160401b9092046001600160401b031691610fcb906001906128aa565b81548110610fdb57610fdb61287e565b60009182526020909120600390910201546110069190600160401b90046001600160401b0316612d0d565b6001600160401b031610155b156110ab57600954600a805490916001600160401b03169081106110385761103861287e565b60009182526020822060039091020180546001600160801b031916815560018101805467ffffffffffffffff19169055600201819055600980546001600160401b03169161108583612d34565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516060810182526001600160401b03948516815292841660208085019182528251808401845284820151871681529383015184820152918401928352600a805460018101825560009190915293517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86003909502948501805492519187166001600160801b031990931692909217600160401b91871691909102179055905180517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a98401805467ffffffffffffffff1916919095161790935591909101517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aa90910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061123a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661122e600080516020612da7833981519152546001600160a01b031690565b6001600160a01b031614155b15610a135760405163703e46dd60e11b815260040160405180910390fd5b611260610dab565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d906020016106fb565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156112f3575060408051601f3d908101601f191682019092526112f091810190612d5a565b60015b61131b57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610d96565b600080516020612da7833981519152811461134c57604051632a87526960e21b815260048101829052602401610d96565b6113568383611c7a565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a135760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61141d611cd0565b610da881611d19565b610a13611cd0565b82516001600160401b0316151580611452575060208301516001600160401b031615155b8061145f57506020820151155b8061146c57506040820151155b8061147957506060820151155b8061148357508151155b156114a1576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b19909116179055611356434285610f59565b600a546000904384118061154d5750600381105b1561156b5760405163b0b4387760e01b815260040160405180910390fd5b6000808061157a6001856128aa565b90505b816116155786600a82815481106115965761159661287e565b60009182526020909120600390910201546001600160401b0316116115e95760019150600a81815481106115cc576115cc61287e565b60009182526020909120600390910201546001600160401b031692505b60028110611615576009546001600160401b03168114611615578061160d81612d73565b91505061157d565b816116335760405163b0b4387760e01b815260040160405180910390fd5b8561163e84896128aa565b11979650505050505050565b611652611ee3565b620100008152600460208201527f0d76329b8733b0b734ff0f60a40cb4c474064a8c755c1f6cbece5f7ea09d78a86040820151527f16026254c01764d8b4fd70dc4cc51a74e0b32ba5f59e2a9e5ef169feeb7ca1ba6020604083015101527f124a0457892caf44e89d24b4f6eea80a0b1d532a3e59f1178b19e4caca8fbac36060820151527f037e3a3fa0fefa3c08d50c07d472cba4274fd25c444f369d0d77db93e284f89e6020606083015101527f0319b53e71a0078028b4f021e0d4448d3e849198f25f0fb47f36ae764c06e5936080820151527f1eb78f5dcd1e962bc4e33ff6caa12c4161f09ed217cdb213cebbffb63e9e57b46020608083015101527f0c83be8ca5514d2b5527eec4871feb09b1be54fcc00fec9477fd525c563be91660a0820151527f06ad874b2a3707a73260072b13799115f94f048d9065f7730d710511dcd945ae602060a083015101527f1ea8aa071b4c9346a585bbdbeb45762f4e26c395a015ad67ad732ef431b3c59560c0820151527f23700dcfa17c63b4681f477ab548eeae1daba4aad95d02a8d8b4619fa6d637f0602060c083015101527f20fb1c68cbebab5356eb21d126b6f596bea1168a768b59e5fbf308d63828292560e0820151527f17d041ace4a15d7297ebdccc0e098c72542e30d9b3cf6fc37edc14025a9edeaa602060e083015101527f168eeff859a5f7b2781aa3c72a2c0a7a58fa9408489e7b0c13ae2feb848f5aa2610100820151527f2d6d41d0b5833fb077c78ee3705435ea113a71a6537b6980f58073701224342f602061010083015101527f2a3b9d424102b9787e4fbfc217805739be51dbe872181dc40138dc706ce421f9610120820151527f17dc9e1677dad495da48a1d95f94351c2197990789f4168f1e5dd9a31dc3e4d1602061012083015101527f1e002a101f63386609be9700527a3508421d17ce7b127a3b04887704cdbd2dc6610140820151527f0732f969323e1586a21a2f363cd625237adeb6c9e884b5f6afd0fb862fb05e95602061014083015101527f0a1f5be7e2dda4ee17525ca86d1e20a1656c8bb3ac88490903d71324abaf3926610160820151527f22b5b0a08cefb39624d5260eac0cb6c63fa3942325134470f05dfcc69660a741602061016083015101527f131f2fb07141ec50c2c72b3a2c5bc061ef04d8a451f6093303ece094fd077017610180820151527f1012a3feba794457614f15434858e921c06088ca254352b6668971005bb59d0c602061018083015101527f2a304967c0db314ac3c0a6613e636fd620e3fc3a5e284d28fa2a33e770cf4bb46101a0820151527f0e85da2cabd81a33dd542840af2640c7087dd3aa2ec7267bfc1a6fe6b117b24260206101a083015101527f25427d12f7080ca1c010c4a710f1718446ac78ddfbf8fc9024030914c5b7988b6101c0820151527f0ca6acfed4a97c404df14351b34dd68181ecdc2a723e80ce4b4cf3a5ff2e2c4b60206101c083015101527f2869eb8e7c2c4223b37279eb988b696041ca315cdb14c05f463e73f24a0de6606101e0820151527f079bb1a022509123aeaa6861001db5f4e9b9729c98727adff2aba5d588ae512b60206101e083015101527f0821eba1289e0cbcbb088a218b11556d799dfd9748eee76d18c656d2b1f2d0ef610200820151527f16e014f5b76709d9268e9c375854edb6451a9d895d2d2b4f0f0369566df19dea602061020083015101527f21b4eb6afcdfa42cd369fd0c20fc38cb7e6d8b5e88fbcc488983ea79238ef05a610220820151527f274a3b9ef788ddae87b2d74b7d4ee2cdd10eea605fdd631caf43ef705477ce08602061022083015101527f21af862a9f3c7ffb2f3ef7f0e22bf4678e94296b7fbe0b37516e9b6c5e581a54610240820151527f09d97d7a627d8ec24a5fb1495fee2d5cec5cd9e5c5b42c4e4bea06d9e6726bd2602061024083015101527f29e5bd43838ac1cfc29f172286db4a41408faed0d08a9ce4998b2a2e22bd782e610260820151527f103a97f91d3df0aa53d6b2d7f29c4ebf4f323896827a8b8eeba30b7b039ce4a3602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611c8382611d21565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611cc8576113568282611d86565b610969611dfc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a1357604051631afcd79f60e31b815260040160405180910390fd5b610d70611cd0565b806001600160a01b03163b600003611d5757604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610d96565b600080516020612da783398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611da39190612d8a565b600060405180830381855af49150503d8060008114611dde576040519150601f19603f3d011682016040523d82523d6000602084013e611de3565b606091505b5091509150611df3858383611e1b565b95945050505050565b3415610a135760405163b398979f60e01b815260040160405180910390fd5b606082611e3057611e2b82611e7a565b611e73565b8151158015611e4757506001600160a01b0384163b155b15611e7057604051639996b31560e01b81526001600160a01b0385166004820152602401610d96565b50805b9392505050565b805115611e8a5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825560030290600052602060002090810190610da89190612170565b6040518061010001604052806008906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611f1a604051806040016040528060008152602001600081525090565b8152602001611f3c604051806040016040528060008152602001600081525090565b8152602001611f5e604051806040016040528060008152602001600081525090565b8152602001611f80604051806040016040528060008152602001600081525090565b8152602001611fa2604051806040016040528060008152602001600081525090565b8152602001611fc4604051806040016040528060008152602001600081525090565b8152602001611fe6604051806040016040528060008152602001600081525090565b8152602001612008604051806040016040528060008152602001600081525090565b815260200161202a604051806040016040528060008152602001600081525090565b815260200161204c604051806040016040528060008152602001600081525090565b815260200161206e604051806040016040528060008152602001600081525090565b8152602001612090604051806040016040528060008152602001600081525090565b81526020016120b2604051806040016040528060008152602001600081525090565b81526020016120d4604051806040016040528060008152602001600081525090565b81526020016120f6604051806040016040528060008152602001600081525090565b8152602001612118604051806040016040528060008152602001600081525090565b815260200161213a604051806040016040528060008152602001600081525090565b815260200161215c604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b5b808211156121a95780546001600160801b031916815560018101805467ffffffffffffffff1916905560006002820155600301612171565b5090565b80356001600160a01b03811681146121c457600080fd5b919050565b6000602082840312156121db57600080fd5b610d5f826121ad565b6000602082840312156121f657600080fd5b5035919050565b6001600160401b0384811682528316602082015260808101612235604083018480516001600160401b03168252602090810151910152565b949350505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156122755761227561223d565b60405290565b604080519081016001600160401b03811182821017156122755761227561223d565b6040516102e081016001600160401b03811182821017156122755761227561223d565b604051601f8201601f191681016001600160401b03811182821017156122e8576122e861223d565b604052919050565b80356001600160401b03811681146121c457600080fd5b60006060828403121561231957600080fd5b612321612253565b905061232c826122f0565b815261233a602083016122f0565b60208201526040820135604082015292915050565b60006040828403121561236157600080fd5b61236961227b565b9050813581526020820135602082015292915050565b6000808284036104e081121561239457600080fd5b61239e8585612307565b925061048080605f19830112156123b457600080fd5b6123bc61229d565b91506123cb866060870161234f565b82526123da8660a0870161234f565b60208301526123ec8660e0870161234f565b60408301526101206124008782880161234f565b60608401526101606124148882890161234f565b60808501526101a061242889828a0161234f565b60a08601526101e061243c8a828b0161234f565b60c08701526102206124508b828c0161234f565b60e08801526102606124648c828d0161234f565b6101008901526102a06124798d828e0161234f565b878a015261248b8d6102e08e0161234f565b6101408a015261249f8d6103208e0161234f565b868a01526124b18d6103608e0161234f565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b6000602080838503121561254657600080fd5b82356001600160401b038082111561255d57600080fd5b818501915085601f83011261257157600080fd5b8135818111156125835761258361223d565b612591848260051b016122c0565b818152848101925060079190911b8301840190878211156125b157600080fd5b928401925b8184101561263d5783880360808112156125d05760008081fd5b6125d8612253565b6125e1866122f0565b81526125ee8787016122f0565b87820152604080603f19840112156126065760008081fd5b61260e61227b565b925061261b8188016122f0565b83526060870135888401528101919091528352608090930192918401916125b6565b979650505050505050565b6000806040838503121561265b57600080fd5b612664836121ad565b91506020808401356001600160401b038082111561268157600080fd5b818601915086601f83011261269557600080fd5b8135818111156126a7576126a761223d565b6126b9601f8201601f191685016122c0565b915080825287848285010111156126cf57600080fd5b80848401858401376000848284010152508093505050509250929050565b81516001600160401b031681526020808301519082015260408101610d62565b803563ffffffff811681146121c457600080fd5b60006020828403121561273357600080fd5b610d5f8261270d565b60008060008084860361012081121561275457600080fd5b61275e8787612307565b94506080605f198201121561277257600080fd5b50604051608081018181106001600160401b03821117156127955761279561223d565b8060405250606086013581526080860135602082015260a0860135604082015260c08601356060820152809350506127cf60e0860161270d565b91506127de61010086016121ad565b905092959194509250565b60005b838110156128045781810151838201526020016127ec565b50506000910152565b602081526000825180602084015261282c8160408501602087016127e9565b601f01601f19169190910160400192915050565b60006060828403121561285257600080fd5b610d5f8383612307565b6000806040838503121561286f57600080fd5b50508035926020909101359150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610d6257610d62612894565b8060005b6008811015610f535781518452602093840193909101906001016128c1565b6128f582825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006129588185018380518252602090810151910152565b60a083015191506101406129788186018480518252602090810151910152565b60c084015192506101806129988187018580518252602090810151910152565b60e085015193506101c06129b88188018680518252602090810151910152565b928501519350610200926129d88785018680518252602090810151910152565b61012086015194506102406129f98189018780518252602090810151910152565b92860151945061028092612a198885018780518252602090810151910152565b61016087015195506102c0612a3a818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a808201905084518252602085015160208301526040850151612af7604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612b448185018380518252602090810151910152565b60c08701519150610140612b648186018480518252602090810151910152565b60e08801519250610180612b848187018580518252602090810151910152565b9188015192506101c091612ba48684018580518252602090810151910152565b6101208901519350610200612bc58188018680518252602090810151910152565b91890151935061024091612be58784018680518252602090810151910152565b6101608a01519450610280612c068189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612cdd6105008301856128bd565b6122356106008301846128e0565b600060208284031215612cfd57600080fd5b81518015158114611e7357600080fd5b6001600160401b03828116828216039080821115612d2d57612d2d612894565b5092915050565b60006001600160401b03808316818103612d5057612d50612894565b6001019392505050565b600060208284031215612d6c57600080fd5b5051919050565b600081612d8257612d82612894565b506000190190565b60008251612d9c8184602087016127e9565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json index 9a972c70d..da7c6c553 100644 --- a/contract-bindings/artifacts/LightClient_bytecode.json +++ b/contract-bindings/artifacts/LightClient_bytecode.json @@ -1 +1 @@ -"0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b60405161288990816100d282396080518181816109db0152610b330152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc146101d757806302b592f3146101d25780630d8e6e2c146101cd5780632063d4f7146101c85780632f79889d146101c3578063313df7b1146101be578063382b215a146101b9578063426d3194146101b45780634f1ef286146101af57806352d1902d146101aa57806362827733146101a557806369cc6a04146101a05780636f96bdae1461019b578063715018a61461019657806376b6b7cb146101915780638584d23f1461018c5780638da5cb5b1461018757806396c1ca61146101825780639baa3cc91461017d5780639fdb54a714610178578063ad3cb1cc14610173578063bd32519a1461016e578063c23b9e9e14610169578063ca6fe85514610164578063d24d933d1461015f578063e03033011461015a578063f2fde38b146101555763f9e50d191461015057600080fd5b611201565b6111d8565b6110d3565b611098565b61107a565b611053565b61102d565b610fb0565b610f71565b610e24565b610d9d565b610d54565b610d17565b610cf9565b610c8e565b610c43565b610ba9565b610b8b565b610b20565b610961565b61090f565b6108f1565b6108c8565b6108a1565b610749565b6104ad565b610437565b61020e565b600435906001600160a01b03821682036101f257565b600080fd5b61010435906001600160a01b03821682036101f257565b346101f25760203660031901126101f2576102276101dc565b61022f6116d9565b6001600160a01b039081169081156102bf57600c5490811682146102ad5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561032257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b6102d1565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761035857604052565b610327565b606081019081106001600160401b0382111761035857604052565b608081019081106001600160401b0382111761035857604052565b90601f801991011681019081106001600160401b0382111761035857604052565b604051906102e082018281106001600160401b0382111761035857604052565b604051906103e18261033d565b565b604051906103e18261035d565b604051906102c082018281106001600160401b0382111761035857604052565b9060405161041d8161033d565b6020600182946001600160401b0381541684520154910152565b346101f25760203660031901126101f257600435600e548110156101f2576104606080916102e7565b506104ab81549161047b60016001600160401b039201610410565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b346101f25760003660031901126101f2576060604051600181526000602082015260006040820152f35b60609060031901126101f257604051906104f08261035d565b816001600160401b0360043581811681036101f257825260243590811681036101f25760208201526040604435910152565b60409060631901126101f2576040519061053b8261033d565b60643582526084356020830152565b60409060a31901126101f257604051906105638261033d565b60a435825260c4356020830152565b60409060e31901126101f2576040519061058b8261033d565b60e4358252610104356020830152565b6040906101231901126101f257604051906105b58261033d565b610124358252610144356020830152565b6040906101631901126101f257604051906105e08261033d565b610164358252610184356020830152565b6040906101a31901126101f2576040519061060b8261033d565b6101a43582526101c4356020830152565b6040906101e31901126101f257604051906106368261033d565b6101e4358252610204356020830152565b6040906102231901126101f257604051906106618261033d565b610224358252610244356020830152565b6040906102631901126101f2576040519061068c8261033d565b610264358252610284356020830152565b6040906102a31901126101f257604051906106b78261033d565b6102a43582526102c4356020830152565b6040906102e31901126101f257604051906106e28261033d565b6102e4358252610304356020830152565b6040906103231901126101f2576040519061070d8261033d565b610324358252610344356020830152565b6040906103631901126101f257604051906107388261033d565b610364358252610384356020830152565b346101f2576104e03660031901126101f257610764366104d7565b6104803660631901126101f25761089f9061077d6103b4565b9061078736610522565b82526107923661054a565b60208301526107a036610572565b60408301526107ae3661059b565b60608301526107bc366105c6565b60808301526107ca366105f1565b60a08301526107d83661061c565b60c08301526107e636610647565b60e08301526107f436610672565b6101008301526108033661069d565b610120830152610812366106c8565b610140830152610821366106f3565b6101608301526108303661071e565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c083015261125c565b005b346101f25760003660031901126101f25760206001600160401b03600d5416604051908152f35b346101f25760003660031901126101f257600c546040516001600160a01b039091168152602090f35b346101f25760003660031901126101f2576020600254604051908152f35b346101f25760003660031901126101f257608060045460055460065460075491604051938452602084015260408301526060820152f35b6001600160401b03811161035857601f01601f191660200190565b6040806003193601126101f2576109766101dc565b6024356001600160401b0381116101f257366023820112156101f2578060040135906109a182610946565b916109ae85519384610393565b80835260209136602483830101116101f25781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610b04575b50610af3579080600492610a196116d9565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610ac4575b5050610a89578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b60008051602061283d8339815191528193929303610aab5761089f83836126a1565b8351632a87526960e21b81526004810191909152602490fd5b610ae4929350803d10610aec575b610adc8183610393565b810190611f9a565b903880610a63565b503d610ad2565b845163703e46dd60e11b8152600490fd5b90508160008051602061283d8339815191525416141538610a07565b346101f25760003660031901126101f2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610b7957602060405160008051602061283d8339815191528152f35b60405163703e46dd60e11b8152600490fd5b346101f25760003660031901126101f2576020600154604051908152f35b346101f257600080600319360112610c0857610bc36116d9565b600c5460ff8160a01c166000146102ad576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b60809060631901126101f25760405190610c2482610378565b6064358252608435602083015260a435604083015260c4356060830152565b346101f25760803660031901126101f2576020610c86604051610c6581610378565b60043581526024358382015260443560408201526064356060820152611380565b604051908152f35b346101f257600080600319360112610c0857610ca86116d9565b60008051602061281d83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b346101f25760003660031901126101f2576020600054604051908152f35b346101f25760203660031901126101f2576040610d35600435611408565b6104ab82518092602080916001600160401b0381511684520151910152565b346101f25760003660031901126101f25760008051602061281d833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff821682036101f257565b346101f25760203660031901126101f25760043563ffffffff8082168083036101f257610dc86116d9565b610e108110918215610e12575b5050610e0057600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610dd5565b346101f2576101203660031901126101f257610e3f366104d7565b610e4836610c0b565b90610e51610d8a565b610e596101f7565b9060008051602061285d83398151915254936001600160401b0360ff8660401c1615951680159081610f69575b6001149081610f5f575b159081610f56575b50610f445760008051602061285d833981519152805467ffffffffffffffff19166001179055610ecc9385610f1f576114ce565b610ed257005b60008051602061285d833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102a8565b60008051602061285d833981519152805460ff60401b1916600160401b1790556114ce565b60405163f92ee8a960e01b8152600490fd5b90501538610e98565b303b159150610e90565b869150610e86565b346101f25760003660031901126101f257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b0390f35b346101f25760003660031901126101f2576040805190610fcf8261033d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b83811061101a5784604081866000838284010152601f80199101168101030190f35b8581018301518582018301528201610ff8565b346101f25760003660031901126101f257602060ff600c5460a01c166040519015158152f35b346101f25760003660031901126101f257602063ffffffff600c5460a81c16604051908152f35b346101f25760003660031901126101f2576020600354604051908152f35b346101f25760003660031901126101f257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b346101f25760403660031901126101f257600435600e5443821180156111ce575b61115b576000916111066000926113e7565b9161112861111c600d546001600160401b031690565b6001600160401b031690565b925b811561116d575b509091501561115b5761114a610fac92602435926113fb565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b8261118b61111c61117d846102e7565b50546001600160401b031690565b11156111b4575b600281106111af578381146111af576111aa90611658565b61112a565b611131565b93505060016111c861111c61117d866102e7565b93611192565b50600381106110f4565b346101f25760203660031901126101f25761089f6111f46101dc565b6111fc6116d9565b611665565b346101f25760003660031901126101f2576020600e54604051908152f35b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c16908161136c575b5061135a578151600a546001600160401b03918183169083161180159190611333575b50611321577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906112d060408501936112ca8551611712565b85611bf8565b6112d98461121f565b6112e884824216834316611e51565b61130d60206112fe86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b9050818061134b60208701516001600160401b031690565b9260401c169116111538611291565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861126e565b60208101519060606040820151910151604051916020830193845260408301526060820152606081526113b281610378565b51902090565b604051906113c58261033d565b60006020838281520152565b634e487b7160e01b600052601160045260246000fd5b6000198101919082116113f657565b6113d1565b919082039182116113f657565b6114106113b8565b50600e5490611426611421836113e7565b6102e7565b509061144061111c6001809401546001600160401b031690565b8110156114bc5761145c61111c600d546001600160401b031690565b83811061148157505050600161147761142161147e936113e7565b5001610410565b90565b816114a161111c85611492856102e7565b5001546001600160401b031690565b116114ad57820161145c565b61147e935061147791506102e7565b604051631856a49960e21b8152600490fd5b9190926114e5906114dd612748565b6111fc612748565b6114ed612748565b6001600160401b03908161150884516001600160401b031690565b1615801590611639575b801561162d575b8015611621575b8015611615575b801561160c575b6115fa576103e1936115c96115ef9261157e866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b82516004556020830151600555604083015160065560608301516007556115a48661121f565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b6115ea6115d582611380565b918260005551916115e583600155565b600255565b600355565b804216904316611e51565b6040516350dd03f760e11b8152600490fd5b5083511561152e565b50606084015115611527565b50604084015115611520565b50602084015115611519565b5061165161111c60208501516001600160401b031690565b1515611512565b80156113f6576000190190565b6001600160a01b039081169081156116c05760008051602061281d83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b60008051602061281d833981519152546001600160a01b031633036116fa57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561173b57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b604051906101008083018381106001600160401b0382111761035857604052368337565b908160209103126101f2575180151581036101f25790565b6000915b600883106117cd57505050565b6001908251815260208091019201920191906117c0565b610460906117fd83825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e084015260808101519061185b610100928386019060208091805184520151910152565b60a08101519161187b610140938487019060208091805184520151910152565b60c08201519261189b610180948588019060208091805184520151910152565b60e0830151916118bb6101c0938489019060208091805184520151910152565b8301516118d8610200918289019060208091805184520151910152565b610120840151916118f961024093848a019060208091805184520151910152565b8401519261191761028094858a019060208091805184520151910152565b6119526101608601519661193b6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b61060090611be56103e194969593966102a0610a8084019880518552602081015160208601526119fb6040820151604087019060208091805184520151910152565b6060810151805160808701526020015160a08601526080810151805160c08701526020015160e086015260a0810151611a44610100918288019060208091805184520151910152565b611bb186611b8260c0850151611a6a610140918285019060208091805184520151910152565b611b5360e087015195611a8d610180978887019060208091805184520151910152565b870151611aaa6101c0918287019060208091805184520151910152565b611ae761012089015193611ace610200958689019060208091805184520151910152565b8901516102408097019060208091805184520151910152565b611b248c6102c06101608b015199611b0f6102809b8c85019060208091805184520151910152565b8b015191019060208091805184520151910152565b6101a088015180516103008e0152602001516103208d015287015180516103408d0152602001516103608c0152565b6101e086015180516103808c0152602001516103a08b015285015180516103c08b0152602001516103e08a0152565b61022084015180516104008a015260200151610420890152830151805161044089015260200151610460880152565b6102608201518051610480880152602001516104a08701528101516104c086015201516104e08401526105008301906117bc565b01906117e4565b6040513d6000823e3d90fd5b602090611c036120c5565b6040611c0d611780565b926001548452611c2761111c82516001600160401b031690565b85850152611c4161111c868301516001600160401b031690565b8285015201516060830152611c6a60405194859384936350f8d1a760e11b8552600485016119b9565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af4908115611cdb57600091611cac575b5015611c9a57565b6040516309bde33960e01b8152600490fd5b611cce915060203d602011611cd4575b611cc68183610393565b8101906117a4565b38611c92565b503d611cbc565b611bec565b6001600160401b0391821690821603919082116113f657565b90611d105760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146113f65760010190565b600e54600160401b811015610358576001810180600e5581101561032257602060037fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff92600e6000520292611e4a6040857fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01926001600160401b0393611dde8583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe8601906001600160401b03166001600160401b0319825416179055565b0151910155565b9091611ec06103e193600e548015159081611f26575b50611eca575b6040611e8360208501516001600160401b031690565b930151611ea0611e916103d4565b6001600160401b039095168552565b6020840152611eb0611e916103e3565b6001600160401b03166020840152565b6040820152611d3e565b611ee8611ee2611421600d546001600160401b031690565b90611cf9565b611f21611f05611f00600d546001600160401b031690565b611d26565b6001600160401b03166001600160401b0319600d541617600d55565b611e6d565b611f699150611f3a611421611f4b926113e7565b505460401c6001600160401b031690565b611f63611f3a611421600d546001600160401b031690565b90611ce0565b6001600160401b03611f90611f87600c5463ffffffff9060a81c1690565b63ffffffff1690565b9116101538611e67565b908160209103126101f2575190565b611fb16103f0565b906000825260006020830152611fc56113b8565b6040830152611fd26113b8565b6060830152611fdf6113b8565b6080830152611fec6113b8565b60a0830152611ff96113b8565b60c08301526120066113b8565b60e08301526120136113b8565b6101008301526120216113b8565b61012083015261202f6113b8565b61014083015261203d6113b8565b61016083015261204b6113b8565b6101808301526120596113b8565b6101a08301526120676113b8565b6101c08301526120756113b8565b6101e08301526120836113b8565b6102008301526120916113b8565b61022083015261209f6113b8565b6102408301526120ad6113b8565b610260830152600061028083015260006102a0830152565b6120cd611fa9565b906210000082527f16183280aff7c1ca4982013d14907ffc00ad9aaf62e3060c60fd5650310294fe60206004818501527f20f8ed3de77af84f07ab14e0e3a6af9609d179bd825068fca7f5d10de9cec1d081604086017f2594eb9237b7cc992b0aff6541c0b4f6dbaa9235366de2e5e08eb7ed415d6f5e8151525101527f1fcf82acfe5e7b819ff344ac2a25dfbaa3fb12fb03696ab24f52210896a976f581606086017f23662f2d65f6af786069b0feb61ab3d9cc2dd3e67ccbf422a223c7fa55f44ee68151525101527f1181da971e46128143c9f733b3dfb9ccfed793481cec98e4576d550342a4d60c81608086017f1e4ba740bce3f5c1b696a6b838a9267e00de6cb86fb635db305eeb4874f0f9268151525101527f0de74676a34741220f476bae49ec09f859d46c7f8c63cc5f76d494a09e4484138160a086017f1d31ad0a55e8f8c6f922b0841d4ed606339ed063e86932328c202647a70ed7cd8151525101527f01d88d68cb48acf2ebd1d69e0fc38d5fb188c1c87792d9debfde6e48b52135628160c086017f1f0a8ad12bd711b801c05a04926676385733cd886b30414dc8a9455f5ee1ccf08151525101527f10b1aa078508c19c234d1c48764ecea93aeeb26627aa9169b3c3f8dd9722a6468160e086017f2d6bd0f4fd66b3f1183ef8e83be754d47b3f2108d5583c80d669f65fa8a6c6888151525101527f15a424f82f95e588a93ce0eb93369b35291fd603e490dece7bab07e181d9b9558161010086017f29e8cb6f4a4499852ba317b86e5fa40e53476c42e37c1a87d9a2ad21625d54868151525101527f1b1a9dce8744e1accfa8ee724b09cad428a70cbd569efe2b46e927565f6479468161012086017f210a0dcd7c615d5963ba67f22090dd66843d3757b9a17d0729971812c03345798151525101527f1ec91c705e7482be0f5768f598869716b93e1aba284ab207a01acaf5b90875778161014086017f1af7507105277eafd94dc06bd01521a9fa91f7743cfcd896c2289df0696e2e578151525101527f0d9eb0e9d5a0f218673c5b8883b1bc65064c7c57ddf370b534da88e737e6f9998161016086017f0a870d4d26887f446f5d0cbace89ea87592732161a7adf4fed3c1bcd72d56b048151525101527f266dd2c45a9d95cd00c622c047eacb1e29c90c0ea7ab708406fe754ce27656118161018086017f236a6ee8b0a5bfcbe26f5609cc2f6a8a13d23dfd88b7c47c590b44a0fbc39fab8151525101527f243ae2d376579c21c88e353b3891b6f670ab016dbcae7a8cad2d010b01d8813e816101a086017f2dee8bf87e82bcee84ceb104d6cb4c9bec614129c7f9c1f8ccd1408293cc64508151525101527f08b7e3925fa4cfb08693c23f91307f6332f8c2d00d10fe22007e8f557f12d789816101c086017f17596bdefddb079bb27dcae8142e341f1a248b03ea686331fad0851af951f67d8151525101527f0abaa16f6ca8f4eb2effd49b0d1faea26a038bc6e138383882e6dfc86c729450816101e086017f0acf5e529d7177887ba6dc79a167a88cd6b7c11d863088959e76d07bb91cf5488151525101527f2eb99c6343db7834e1fc40625ac8b70cd64e8036b1e3d20d72f00efef151ec958161020086017f0ccffd9ebf84a35352134e5d30ac279f3259373b8894d7e8abe5d2a45c1d1ea28151525101527f0638a68ba70ce87098fccf3bf2b8d0c3558af5a1a349fc5081fce5684b3bafed8161022086017f0e9af80a46903c8d29d9593683381c704192d777d9736c0648401b2ff6e6756d8151525101527f0f1c97e91c16e627c4329e2f5c0c03e9980c6c0748b238d3ad661237c7c129938161024086017f10ca7993f6831bdcf2471213babb2e37f21decaeb08ff2cb817a28d6095f2a1681515251015261026084017f28b88da6722afe7e95789cb5fd5a74c97977d73c88d4eebd7bb45368807605718151525101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808301527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a0830152565b90813b156127275760008051602061283d83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511561270c5761270991612777565b50565b50503461271557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff60008051602061285d8339815191525460401c161561276557565b604051631afcd79f60e31b8152600490fd5b60008061147e93602081519101845af43d156127b5573d9161279883610946565b926127a66040519485610393565b83523d6000602085013e6127b9565b6060915b906127e057508051156127ce57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612813575b6127f1575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156127e956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000da565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000775760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612a3a62000104600039600081816110cc015281816110f501526112740152612a3a6000f3fe6080604052600436106101405760003560e01c80638584d23f116100b6578063bd32519a1161006f578063bd32519a1461043d578063c23b9e9e1461046e578063d24d933d146104a7578063e0303301146104d7578063f2fde38b146104f7578063f9e50d191461051757600080fd5b80638584d23f146102ff5780638da5cb5b1461032c57806396c1ca61146103695780639baa3cc9146103895780639fdb54a7146103a9578063ad3cb1cc146103ff57600080fd5b8063313df7b111610108578063313df7b114610224578063426d31941461025c5780634f1ef2861461029f57806352d1902d146102b257806369cc6a04146102d5578063715018a6146102ea57600080fd5b8063013fa5fc1461014557806302b592f3146101675780630d8e6e2c1461019f5780632063d4f7146101cc5780632f79889d146101ec575b600080fd5b34801561015157600080fd5b50610165610160366004611f68565b61052c565b005b34801561017357600080fd5b50610187610182366004611f83565b6105e9565b60405161019693929190611f9c565b60405180910390f35b3480156101ab57600080fd5b50604080516001815260006020820181905291810191909152606001610196565b3480156101d857600080fd5b506101656101e7366004612117565b610646565b3480156101f857600080fd5b5060095461020c906001600160401b031681565b6040516001600160401b039091168152602001610196565b34801561023057600080fd5b50600854610244906001600160a01b031681565b6040516001600160a01b039091168152602001610196565b34801561026857600080fd5b5060005460015460025460035461027f9392919084565b604080519485526020850193909352918301526060820152608001610196565b6101656102ad3660046122cb565b61079a565b3480156102be57600080fd5b506102c76107b9565b604051908152602001610196565b3480156102e157600080fd5b506101656107d6565b3480156102f657600080fd5b50610165610846565b34801561030b57600080fd5b5061031f61031a366004611f83565b610858565b6040516101969190612370565b34801561033857600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610244565b34801561037557600080fd5b506101656103843660046123a4565b6109ca565b34801561039557600080fd5b506101656103a43660046123bf565b610a3f565b3480156103b557600080fd5b506006546007546103d9916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610196565b34801561040b57600080fd5b50610430604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101969190612490565b34801561044957600080fd5b5060085461045e90600160a01b900460ff1681565b6040519015158152602001610196565b34801561047a57600080fd5b5060085461049290600160a81b900463ffffffff1681565b60405163ffffffff9091168152602001610196565b3480156104b357600080fd5b506004546005546103d9916001600160401b0380821692600160401b909204169083565b3480156104e357600080fd5b5061045e6104f23660046124c3565b610b63565b34801561050357600080fd5b50610165610512366004611f68565b610c76565b34801561052357600080fd5b50600a546102c7565b610534610cb9565b6001600160a01b03811661055b5760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b039081169082160361058a5760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a81b0319166001600160a01b0383811691909117600160a01b1791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600a81815481106105f957600080fd5b600091825260209182902060039091020180546040805180820190915260018301546001600160401b039081168252600290930154938101939093528181169350600160401b9004169083565b600854600160a01b900460ff16801561066a57506008546001600160a01b03163314155b15610688576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806106c1575060065460208301516001600160401b03600160401b9092048216911611155b156106df5760405163051c46ef60e01b815260040160405180910390fd5b6106ec8260400151610d14565b6106f68282610d84565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561073d434284610e67565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6846040015160405161078e91815260200190565b60405180910390a35050565b6107a26110c1565b6107ab82611166565b6107b582826111a7565b5050565b60006107c3611269565b50600080516020612a0e83398151915290565b6107de610cb9565b600854600160a01b900460ff161561082b57600880546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b61084e610cb9565b61084460006112b2565b6040805180820190915260008082526020820152600a80549061087c6001836124fb565b8154811061088c5761088c61250e565b60009182526020909120600160039092020101546001600160401b031683106108c857604051631856a49960e21b815260040160405180910390fd5b6009546001600160401b03165b8181101561096e5783600a82815481106108f1576108f161250e565b60009182526020909120600160039092020101546001600160401b0316111561096657600a81815481106109275761092761250e565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b031682526002015491810191909152949350505050565b6001016108d5565b50600a61097c6001836124fb565b8154811061098c5761098c61250e565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b0316825260020154918101919091529392505050565b6109d2610cb9565b610e108163ffffffff1610806109fb575060085463ffffffff600160a81b909104811690821611155b15610a19576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a81b0263ffffffff60a81b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610a845750825b90506000826001600160401b03166001148015610aa05750303b155b905081158015610aae575080155b15610acc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610af657845460ff60401b1916600160401b1785555b610aff86611323565b610b07611334565b610b1289898961133c565b8315610b5857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600a5460009043841180610b775750600381105b15610b955760405163b0b4387760e01b815260040160405180910390fd5b60008080610ba46001856124fb565b90505b81610c3f5786600a8281548110610bc057610bc061250e565b60009182526020909120600390910201546001600160401b031611610c135760019150600a8181548110610bf657610bf661250e565b60009182526020909120600390910201546001600160401b031692505b60028110610c3f576009546001600160401b03168114610c3f5780610c3781612524565b915050610ba7565b81610c5d5760405163b0b4387760e01b815260040160405180910390fd5b85610c6884896124fb565b119450505050505b92915050565b610c7e610cb9565b6001600160a01b038116610cad57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610cb6816112b2565b50565b33610ceb7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108445760405163118cdaa760e01b8152336004820152602401610ca4565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806107b55760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610ca4565b6000610d8e611447565b9050610d98611ca0565b600054815283516001600160401b039081166020808401919091528501511681600260200201526040848101516060830152516350f8d1a760e11b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063a1f1a34e90610e0390859085908890600401612742565b602060405180830381865af4158015610e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e449190612969565b610e61576040516309bde33960e01b815260040160405180910390fd5b50505050565b600a5415801590610f205750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b0316908110610ea657610ea661250e565b6000918252602090912060039091020154600a8054600160401b9092046001600160401b031691610ed9906001906124fb565b81548110610ee957610ee961250e565b6000918252602090912060039091020154610f149190600160401b90046001600160401b031661298b565b6001600160401b031610155b15610fb957600954600a805490916001600160401b0316908110610f4657610f4661250e565b60009182526020822060039091020180546001600160801b031916815560018101805467ffffffffffffffff19169055600201819055600980546001600160401b031691610f93836129b2565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516060810182526001600160401b03948516815292841660208085019182528251808401845284820151871681529383015184820152918401928352600a805460018101825560009190915293517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86003909502948501805492519187166001600160801b031990931692909217600160401b91871691909102179055905180517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a98401805467ffffffffffffffff1916919095161790935591909101517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aa90910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061114857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661113c600080516020612a0e833981519152546001600160a01b031690565b6001600160a01b031614155b156108445760405163703e46dd60e11b815260040160405180910390fd5b61116e610cb9565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d906020016105de565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611201575060408051601f3d908101601f191682019092526111fe918101906129d8565b60015b61122957604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ca4565b600080516020612a0e833981519152811461125a57604051632a87526960e21b815260048101829052602401610ca4565b6112648383611a77565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108445760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61132b611acd565b610cb681611b16565b610844611acd565b82516001600160401b0316151580611360575060208301516001600160401b031615155b8061136d57506020820151155b8061137a57506040820151155b8061138757506060820151155b8061139157508151155b156113af576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b19909116179055611264434285610e67565b61144f611cbf565b621000008152600460208201527f2594eb9237b7cc992b0aff6541c0b4f6dbaa9235366de2e5e08eb7ed415d6f5e6040820151527f20f8ed3de77af84f07ab14e0e3a6af9609d179bd825068fca7f5d10de9cec1d06020604083015101527f23662f2d65f6af786069b0feb61ab3d9cc2dd3e67ccbf422a223c7fa55f44ee66060820151527f1fcf82acfe5e7b819ff344ac2a25dfbaa3fb12fb03696ab24f52210896a976f56020606083015101527f1e4ba740bce3f5c1b696a6b838a9267e00de6cb86fb635db305eeb4874f0f9266080820151527f1181da971e46128143c9f733b3dfb9ccfed793481cec98e4576d550342a4d60c6020608083015101527f1d31ad0a55e8f8c6f922b0841d4ed606339ed063e86932328c202647a70ed7cd60a0820151527f0de74676a34741220f476bae49ec09f859d46c7f8c63cc5f76d494a09e448413602060a083015101527f1f0a8ad12bd711b801c05a04926676385733cd886b30414dc8a9455f5ee1ccf060c0820151527f01d88d68cb48acf2ebd1d69e0fc38d5fb188c1c87792d9debfde6e48b5213562602060c083015101527f2d6bd0f4fd66b3f1183ef8e83be754d47b3f2108d5583c80d669f65fa8a6c68860e0820151527f10b1aa078508c19c234d1c48764ecea93aeeb26627aa9169b3c3f8dd9722a646602060e083015101527f29e8cb6f4a4499852ba317b86e5fa40e53476c42e37c1a87d9a2ad21625d5486610100820151527f15a424f82f95e588a93ce0eb93369b35291fd603e490dece7bab07e181d9b955602061010083015101527f210a0dcd7c615d5963ba67f22090dd66843d3757b9a17d0729971812c0334579610120820151527f1b1a9dce8744e1accfa8ee724b09cad428a70cbd569efe2b46e927565f647946602061012083015101527f1af7507105277eafd94dc06bd01521a9fa91f7743cfcd896c2289df0696e2e57610140820151527f1ec91c705e7482be0f5768f598869716b93e1aba284ab207a01acaf5b9087577602061014083015101527f0a870d4d26887f446f5d0cbace89ea87592732161a7adf4fed3c1bcd72d56b04610160820151527f0d9eb0e9d5a0f218673c5b8883b1bc65064c7c57ddf370b534da88e737e6f999602061016083015101527f236a6ee8b0a5bfcbe26f5609cc2f6a8a13d23dfd88b7c47c590b44a0fbc39fab610180820151527f266dd2c45a9d95cd00c622c047eacb1e29c90c0ea7ab708406fe754ce2765611602061018083015101527f2dee8bf87e82bcee84ceb104d6cb4c9bec614129c7f9c1f8ccd1408293cc64506101a0820151527f243ae2d376579c21c88e353b3891b6f670ab016dbcae7a8cad2d010b01d8813e60206101a083015101527f17596bdefddb079bb27dcae8142e341f1a248b03ea686331fad0851af951f67d6101c0820151527f08b7e3925fa4cfb08693c23f91307f6332f8c2d00d10fe22007e8f557f12d78960206101c083015101527f0acf5e529d7177887ba6dc79a167a88cd6b7c11d863088959e76d07bb91cf5486101e0820151527f0abaa16f6ca8f4eb2effd49b0d1faea26a038bc6e138383882e6dfc86c72945060206101e083015101527f0ccffd9ebf84a35352134e5d30ac279f3259373b8894d7e8abe5d2a45c1d1ea2610200820151527f2eb99c6343db7834e1fc40625ac8b70cd64e8036b1e3d20d72f00efef151ec95602061020083015101527f0e9af80a46903c8d29d9593683381c704192d777d9736c0648401b2ff6e6756d610220820151527f0638a68ba70ce87098fccf3bf2b8d0c3558af5a1a349fc5081fce5684b3bafed602061022083015101527f10ca7993f6831bdcf2471213babb2e37f21decaeb08ff2cb817a28d6095f2a16610240820151527f0f1c97e91c16e627c4329e2f5c0c03e9980c6c0748b238d3ad661237c7c12993602061024083015101527f28b88da6722afe7e95789cb5fd5a74c97977d73c88d4eebd7bb4536880760571610260820151527f16183280aff7c1ca4982013d14907ffc00ad9aaf62e3060c60fd5650310294fe602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611a8082611b1e565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611ac5576112648282611b83565b6107b5611bf9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661084457604051631afcd79f60e31b815260040160405180910390fd5b610c7e611acd565b806001600160a01b03163b600003611b5457604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ca4565b600080516020612a0e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611ba091906129f1565b600060405180830381855af49150503d8060008114611bdb576040519150601f19603f3d011682016040523d82523d6000602084013e611be0565b606091505b5091509150611bf0858383611c18565b95945050505050565b34156108445760405163b398979f60e01b815260040160405180910390fd5b606082611c2d57611c2882611c77565b611c70565b8151158015611c4457506001600160a01b0384163b155b15611c6d57604051639996b31560e01b81526001600160a01b0385166004820152602401610ca4565b50805b9392505050565b805115611c875780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518061010001604052806008906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611cf6604051806040016040528060008152602001600081525090565b8152602001611d18604051806040016040528060008152602001600081525090565b8152602001611d3a604051806040016040528060008152602001600081525090565b8152602001611d5c604051806040016040528060008152602001600081525090565b8152602001611d7e604051806040016040528060008152602001600081525090565b8152602001611da0604051806040016040528060008152602001600081525090565b8152602001611dc2604051806040016040528060008152602001600081525090565b8152602001611de4604051806040016040528060008152602001600081525090565b8152602001611e06604051806040016040528060008152602001600081525090565b8152602001611e28604051806040016040528060008152602001600081525090565b8152602001611e4a604051806040016040528060008152602001600081525090565b8152602001611e6c604051806040016040528060008152602001600081525090565b8152602001611e8e604051806040016040528060008152602001600081525090565b8152602001611eb0604051806040016040528060008152602001600081525090565b8152602001611ed2604051806040016040528060008152602001600081525090565b8152602001611ef4604051806040016040528060008152602001600081525090565b8152602001611f16604051806040016040528060008152602001600081525090565b8152602001611f38604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b80356001600160a01b0381168114611f6357600080fd5b919050565b600060208284031215611f7a57600080fd5b611c7082611f4c565b600060208284031215611f9557600080fd5b5035919050565b6001600160401b0384811682528316602082015260808101611fd4604083018480516001600160401b03168252602090810151910152565b949350505050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b038111828210171561201557612015611fdc565b60405290565b604051601f8201601f191681016001600160401b038111828210171561204357612043611fdc565b604052919050565b80356001600160401b0381168114611f6357600080fd5b60006060828403121561207457600080fd5b604051606081018181106001600160401b038211171561209657612096611fdc565b6040529050806120a58361204b565b81526120b36020840161204b565b6020820152604083013560408201525092915050565b6000604082840312156120db57600080fd5b604051604081018181106001600160401b03821117156120fd576120fd611fdc565b604052823581526020928301359281019290925250919050565b6000808284036104e081121561212c57600080fd5b6121368585612062565b925061048080605f198301121561214c57600080fd5b612154611ff2565b915061216386606087016120c9565b82526121728660a087016120c9565b60208301526121848660e087016120c9565b6040830152610120612198878288016120c9565b60608401526101606121ac888289016120c9565b60808501526101a06121c089828a016120c9565b60a08601526101e06121d48a828b016120c9565b60c08701526102206121e88b828c016120c9565b60e08801526102606121fc8c828d016120c9565b6101008901526102a06122118d828e016120c9565b878a01526122238d6102e08e016120c9565b6101408a01526122378d6103208e016120c9565b868a01526122498d6103608e016120c9565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b600080604083850312156122de57600080fd5b6122e783611f4c565b91506020808401356001600160401b038082111561230457600080fd5b818601915086601f83011261231857600080fd5b81358181111561232a5761232a611fdc565b61233c601f8201601f1916850161201b565b9150808252878482850101111561235257600080fd5b80848401858401376000848284010152508093505050509250929050565b81516001600160401b031681526020808301519082015260408101610c70565b803563ffffffff81168114611f6357600080fd5b6000602082840312156123b657600080fd5b611c7082612390565b6000806000808486036101208112156123d757600080fd5b6123e18787612062565b94506080605f19820112156123f557600080fd5b50604051608081018181106001600160401b038211171561241857612418611fdc565b8060405250606086013581526080860135602082015260a0860135604082015260c086013560608201528093505061245260e08601612390565b91506124616101008601611f4c565b905092959194509250565b60005b8381101561248757818101518382015260200161246f565b50506000910152565b60208152600082518060208401526124af81604085016020870161246c565b601f01601f19169190910160400192915050565b600080604083850312156124d657600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c7057610c706124e5565b634e487b7160e01b600052603260045260246000fd5b600081612533576125336124e5565b506000190190565b8060005b6008811015610e6157815184526020938401939091019060010161253f565b61257382825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006125d68185018380518252602090810151910152565b60a083015191506101406125f68186018480518252602090810151910152565b60c084015192506101806126168187018580518252602090810151910152565b60e085015193506101c06126368188018680518252602090810151910152565b928501519350610200926126568785018680518252602090810151910152565b61012086015194506102406126778189018780518252602090810151910152565b928601519450610280926126978885018780518252602090810151910152565b61016087015195506102c06126b8818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a808201905084518252602085015160208301526040850151612775604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a08501516101006127c28185018380518252602090810151910152565b60c087015191506101406127e28186018480518252602090810151910152565b60e088015192506101806128028187018580518252602090810151910152565b9188015192506101c0916128228684018580518252602090810151910152565b61012089015193506102006128438188018680518252602090810151910152565b918901519350610240916128638784018680518252602090810151910152565b6101608a015194506102806128848189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e083015261295b61050083018561253b565b611fd461060083018461255e565b60006020828403121561297b57600080fd5b81518015158114611c7057600080fd5b6001600160401b038281168282160390808211156129ab576129ab6124e5565b5092915050565b60006001600160401b038083168181036129ce576129ce6124e5565b6001019392505050565b6000602082840312156129ea57600080fd5b5051919050565b60008251612a0381846020870161246c565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" diff --git a/contract-bindings/src/erc1967_proxy.rs b/contract-bindings/src/erc1967_proxy.rs index fcd53df0b..c7d558113 100644 --- a/contract-bindings/src/erc1967_proxy.rs +++ b/contract-bindings/src/erc1967_proxy.rs @@ -94,12 +94,12 @@ pub mod erc1967_proxy { pub static ERC1967PROXY_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80`@Ra\x02\xAA\x808\x03\x80a\0\x14\x81a\x01\x94V[\x92\x839\x81\x01\x90`@\x81\x83\x03\x12a\x01\x8FW\x80Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x80\x82\x03a\x01\x8FW` \x83\x81\x01Q\x90\x93`\x01`\x01`@\x1B\x03\x82\x11a\x01\x8FW\x01\x84`\x1F\x82\x01\x12\x15a\x01\x8FW\x80Q\x90a\0ma\0h\x83a\x01\xCFV[a\x01\x94V[\x95\x82\x87R\x85\x83\x83\x01\x01\x11a\x01\x8FW\x84\x90`\0[\x83\x81\x10a\x01{WPP`\0\x91\x86\x01\x01R\x81;\x15a\x01cW\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x82\x17\x90U`@Q\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;`\0\x80\xA2\x83Q\x15a\x01EWP`\0\x80\x84\x84a\x01,\x96Q\x91\x01\x84Z\xF4\x90=\x15a\x01a\x01\xEAV[P[`@Q`\\\x90\x81a\x02N\x829\xF3[``\x92Pa\x01\xEAV[\x92PPP4a\x01TWPa\x01.V[c\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x90\xFD[`$\x90`@Q\x90cL\x9C\x8C\xE3`\xE0\x1B\x82R`\x04\x82\x01R\xFD[\x81\x81\x01\x83\x01Q\x88\x82\x01\x84\x01R\x86\x92\x01a\0\x80V[`\0\x80\xFD[`@Q\x91\x90`\x1F\x01`\x1F\x19\x16\x82\x01`\x01`\x01`@\x1B\x03\x81\x11\x83\x82\x10\x17a\x01\xB9W`@RV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\x01`\x01`@\x1B\x03\x81\x11a\x01\xB9W`\x1F\x01`\x1F\x19\x16` \x01\x90V[\x90a\x02\x11WP\x80Q\x15a\x01\xFFW\x80Q\x90` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x90\xFD[\x81Q\x15\x80a\x02DW[a\x02\"WP\x90V[`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16`\x04\x82\x01R`$\x90\xFD[P\x80;\x15a\x02\x1AV\xFE`\x80`@R\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\0\x90\x81\x90\x81\x90`\x01`\x01`\xA0\x1B\x03\x166\x82\x807\x816\x91Z\xF4=\x82\x80>\x15`KW=\x90\xF3[=\x90\xFD\xFE\xA1dsolcC\0\x08\x17\0\n"; + const __BYTECODE: &[u8] = b"`\x80`@R`@Qa\x03\xE18\x03\x80a\x03\xE1\x839\x81\x01`@\x81\x90Ra\0\"\x91a\x02hV[a\0,\x82\x82a\x003V[PPa\x03RV[a\0<\x82a\0\x92V[`@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\0\x86Wa\0\x81\x82\x82a\x01\x0EV[PPPV[a\0\x8Ea\x01\x85V[PPV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\0\xCDW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\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\x01+\x91\x90a\x036V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\x01fW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\x01kV[``\x91P[P\x90\x92P\x90Pa\x01|\x85\x83\x83a\x01\xA6V[\x95\x94PPPPPV[4\x15a\x01\xA4W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[``\x82a\x01\xBBWa\x01\xB6\x82a\x02\x05V[a\x01\xFEV[\x81Q\x15\x80\x15a\x01\xD2WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x01\xFBW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\0\xC4V[P\x80[\x93\x92PPPV[\x80Q\x15a\x02\x15W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0[\x83\x81\x10\x15a\x02_W\x81\x81\x01Q\x83\x82\x01R` \x01a\x02GV[PP`\0\x91\x01RV[`\0\x80`@\x83\x85\x03\x12\x15a\x02{W`\0\x80\xFD[\x82Q`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x02\x92W`\0\x80\xFD[` \x84\x01Q\x90\x92P`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\x02\xAFW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x02\xC3W`\0\x80\xFD[\x81Q\x81\x81\x11\x15a\x02\xD5Wa\x02\xD5a\x02.V[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x02\xFDWa\x02\xFDa\x02.V[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\x03\x16W`\0\x80\xFD[a\x03'\x83` \x83\x01` \x88\x01a\x02DV[\x80\x95PPPPPP\x92P\x92\x90PV[`\0\x82Qa\x03H\x81\x84` \x87\x01a\x02DV[\x91\x90\x91\x01\x92\x91PPV[`\x81\x80a\x03``\09`\0\xF3\xFE`\x80`@R`\n`\x0CV[\0[`\x18`\x14`\x1AV[`QV[V[`\0`L\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[\x90P\x90V[6`\0\x807`\0\x806`\0\x84Z\xF4=`\0\x80>\x80\x80\x15`oW=`\0\xF3[=`\0\xFD\xFE\xA1dsolcC\0\x08\x17\0\n"; /// The bytecode of the contract. pub static ERC1967PROXY_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\0\x90\x81\x90\x81\x90`\x01`\x01`\xA0\x1B\x03\x166\x82\x807\x816\x91Z\xF4=\x82\x80>\x15`KW=\x90\xF3[=\x90\xFD\xFE\xA1dsolcC\0\x08\x17\0\n"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\n`\x0CV[\0[`\x18`\x14`\x1AV[`QV[V[`\0`L\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT`\x01`\x01`\xA0\x1B\x03\x16\x90V[\x90P\x90V[6`\0\x807`\0\x806`\0\x84Z\xF4=`\0\x80>\x80\x80\x15`oW=`\0\xF3[=`\0\xFD\xFE\xA1dsolcC\0\x08\x17\0\n"; /// The deployed bytecode of the contract. pub static ERC1967PROXY_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/contract-bindings/src/fee_contract.rs b/contract-bindings/src/fee_contract.rs index 8243fbf18..47dcf3386 100644 --- a/contract-bindings/src/fee_contract.rs +++ b/contract-bindings/src/fee_contract.rs @@ -475,12 +475,12 @@ pub mod fee_contract { pub static FEECONTRACT_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\xA0\x80`@R4a\0\xCCW0`\x80R\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x90\x81T\x90`\xFF\x82`@\x1C\x16a\0\xBDWP`\x01`\x01`@\x1B\x03`\x02`\x01`@\x1B\x03\x19\x82\x82\x16\x01a\0xW[`@Qa\t\xD6\x90\x81a\0\xD2\x829`\x80Q\x81\x81\x81a\x04\x92\x01Ra\x05s\x01R\xF3[`\x01`\x01`@\x1B\x03\x19\x90\x91\x16\x81\x17\x90\x91U`@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` \x90\xA18\x80\x80a\0YV[c\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x90\xFD[`\0\x80\xFD\xFE`\x80`@\x81\x81R`\x04\x91\x826\x10\x15a\x003W[P6\x15a\0&WQc\x155\xAC_`\xE3\x1B\x81R\xFD[Qc\xBC\x8E\xCA\x1B`\xE0\x1B\x81R\xFD[`\0\x90\x815`\xE0\x1C\x90\x81c\r\x8En,\x14a\x07\xC3WP\x80c'\xE25\xE3\x14a\x07\x8BW\x80cO\x1E\xF2\x86\x14a\x04\xF6W\x80cR\xD1\x90-\x14a\x04~W\x80cdP\x06\xCA\x14a\x04_W\x80cqP\x18\xA6\x14a\x03\xF5W\x80c\x8D\xA5\xCB[\x14a\x03\xBFW\x80c\x8E\xD82q\x14a\x03\x9EW\x80c\xAD<\xB1\xCC\x14a\x02\xFFW\x80c\xC4\xD6m\xE8\x14a\x01\xAFW\x80c\xF2\xFD\xE3\x8B\x14a\x01\x7FWc\xF3@\xFA\x01\x03a\0\x12W\x91\x90` 6`\x03\x19\x01\x12a\x01{Wa\0\xD6a\x07\xE9V[`\x01T4\x10a\x01mW\x83T4\x11a\x01_W`\x01`\x01`\xA0\x1B\x03\x16\x91\x82\x15a\x01QW\x82\x84R`\x02` R\x81\x84 \x80T\x914\x83\x01\x80\x93\x11a\x01>WPUQ4\x81R\x7F\xE1\xFF\xFC\xC4\x92=\x04\xB5Y\xF4\xD2\x9A\x8B\xFCl\xDA\x04\xEB[\r#\xA9f.\xFC\x9C\"\x9Cj\0\x91\x82T`\xFF\x81\x86\x1C\x16\x15\x92g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x80\x15\x90\x81a\x02\xF7W[`\x01\x14\x90\x81a\x02\xEDW[\x15\x90\x81a\x02\xE4W[Pa\x02\xD6WPg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x81\x16`\x01\x17\x84Ua\x02P\x91\x90\x83a\x02\xB7W[Pa\x02Ha\t\x05V[a\x01\xA4a\t\x05V[a\x02Xa\t\x05V[g\r\xE0\xB6\xB3\xA7d\0\0\x84Uf\x03\x8D~\xA4\xC6\x80\0`\x01Ua\x02vW\x82\x80\xF3[\x80Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x90UQ`\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` \x90\xA18\x80\x82\x80\xF3[h\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16h\x01\0\0\0\0\0\0\0\x01\x17\x84U8a\x02?V[\x85Qc\xF9.\xE8\xA9`\xE0\x1B\x81R\xFD[\x90P\x158a\x02\x1DV[0;\x15\x91Pa\x02\x15V[\x85\x91Pa\x02\x0BV[P\x914a\x01{W\x82`\x03\x196\x01\x12a\x01{W\x81Q\x90\x82\x82\x01\x90\x82\x82\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x11\x17a\x03\x8BWP\x82R`\x05\x81R` \x90d\x03R\xE3\x02\xE3`\xDC\x1B` \x82\x01R\x82Q\x93\x84\x92` \x84R\x82Q\x92\x83` \x86\x01R\x82[\x84\x81\x10a\x03uWPPP\x82\x82\x01\x84\x01R`\x1F\x01`\x1F\x19\x16\x81\x01\x03\x01\x90\xF3[\x81\x81\x01\x83\x01Q\x88\x82\x01\x88\x01R\x87\x95P\x82\x01a\x03WV[cNH{q`\xE0\x1B\x85R`A\x90R`$\x84\xFD[P\x904a\x03\xBBW\x81`\x03\x196\x01\x12a\x03\xBBW` \x91T\x90Q\x90\x81R\xF3[P\x80\xFD[P\x904a\x03\xBBW\x81`\x03\x196\x01\x12a\x03\xBBW`\0\x80Q` a\t\xAA\x839\x81Q\x91RT\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x90\xF3[P4a\x01\xACW\x80`\x03\x196\x01\x12a\x01\xACWa\x04\x0Ea\x08\xCCV[`\0\x80Q` a\t\xAA\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16\x90\x91U\x81\x90`\x01`\x01`\xA0\x1B\x03\x16\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x82\x80\xA3\x80\xF3[P\x904a\x03\xBBW\x81`\x03\x196\x01\x12a\x03\xBBW` \x90`\x01T\x90Q\x90\x81R\xF3[P4a\x01\xACW\x80`\x03\x196\x01\x12a\x01\xACWP\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\x160\x03a\x04\xE9W` \x90Q\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81R\xF3[Qcp>F\xDD`\xE1\x1B\x81R\xFD[P\x91\x90\x80`\x03\x196\x01\x12a\x01{Wa\x05\x0Ca\x07\xE9V[\x90`$\x93\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11a\x03\xBBW6`#\x82\x01\x12\x15a\x03\xBBW\x80\x85\x015a\x059\x81a\x08\xED\xA8;y\xFA@\0}\x83\x87Q\x98\x84\x16\x98\x89\x81R\xA1\x85QcR\xD1\x90-`\xE0\x1B\x81R\x83\x81\x8A\x81\x8BZ\xFA\x86\x91\x81a\x07\x16W[Pa\x06\x0FWPPPPPPQ\x91cL\x9C\x8C\xE3`\xE0\x1B\x83R\x82\x01R\xFD[\x90\x88\x88\x88\x94\x93\x8C\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x91\x82\x81\x03a\x07\x01WP\x85;\x15a\x06\xEDWP\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x82\x17\x90U\x84Q\x88\x93\x92\x91\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x85\x80\xA2\x82Q\x15a\x06\xCFWPPa\x06\xC1\x95\x82\x91Q\x90\x84Z\xF4\x91=\x15a\x06\xC5W=a\x06\xB3a\x06\xAA\x82a\x08a\tFV[P\x80\xF3[P``\x92Pa\tFV[\x95P\x95PPPPP4a\x06\xE1WPP\x80\xF3[c\xB3\x98\x97\x9F`\xE0\x1B\x81R\xFD[\x86QcL\x9C\x8C\xE3`\xE0\x1B\x81R\x80\x85\x01\x84\x90R\xFD[\x87Qc*\x87Ri`\xE2\x1B\x81R\x80\x86\x01\x91\x90\x91R\xFD[\x90\x91P\x84\x81\x81=\x83\x11a\x07BW[a\x07.\x81\x83a\x08\x04V[\x81\x01\x03\x12a\x07>WQ\x908a\x05\xF3V[\x86\x80\xFD[P=a\x07$V[\x85Qcp>F\xDD`\xE1\x1B\x81R\x88\x90\xFD[\x90P\x87\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT\x16\x14\x158a\x05\x9FV[\x85\x80\xFD[P\x904a\x03\xBBW` 6`\x03\x19\x01\x12a\x03\xBBW` \x91\x81\x90`\x01`\x01`\xA0\x1B\x03a\x07\xB3a\x07\xE9V[\x16\x81R`\x02\x84R T\x90Q\x90\x81R\xF3[\x90P\x824a\x01{W\x82`\x03\x196\x01\x12a\x01{W\x91``\x92`\x01\x83R\x81` \x84\x01R\x82\x01R\xF3[`\x045\x90`\x01`\x01`\xA0\x1B\x03\x82\x16\x82\x03a\x07\xFFWV[`\0\x80\xFD[\x90`\x1F\x80\x19\x91\x01\x16\x81\x01\x90\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x08&W`@RV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11a\x08&W`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x81\x15a\x08\xB3W`\0\x80Q` a\t\xAA\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16\x84\x17\x90\x91U\x16\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0`\0\x80\xA3V[`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\0`\x04\x82\x01R`$\x90\xFD[`\0\x80Q` a\t\xAA\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x163\x03a\x08\xEDWV[`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x90\xFD[`\xFF\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`@\x1C\x16\x15a\t4WV[`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x90\xFD[\x90a\tmWP\x80Q\x15a\t[W\x80Q\x90` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x90\xFD[\x81Q\x15\x80a\t\xA0W[a\t~WP\x90V[`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16`\x04\x82\x01R`$\x90\xFD[P\x80;\x15a\tvV\xFE\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\xA1dsolcC\0\x08\x17\0\n"; + const __BYTECODE: &[u8] = b"`\xA0`@R0`\x80R4\x80\x15a\0\x14W`\0\x80\xFD[Pa\0\x1Da\0\"V[a\0\xD4V[\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\x15a\0rW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14a\0\xD1W\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[`\x80Qa\x0C\x1Fa\0\xFD`\09`\0\x81\x81a\x05:\x01R\x81\x81a\x05c\x01Ra\x06\xE8\x01Ra\x0C\x1F`\0\xF3\xFE`\x80`@R`\x046\x10a\0\xABW`\x005`\xE0\x1C\x80c\x8D\xA5\xCB[\x11a\0dW\x80c\x8D\xA5\xCB[\x14a\x01\xA4W\x80c\x8E\xD82q\x14a\x01\xEBW\x80c\xAD<\xB1\xCC\x14a\x02\x01W\x80c\xC4\xD6m\xE8\x14a\x02?W\x80c\xF2\xFD\xE3\x8B\x14a\x02_W\x80c\xF3@\xFA\x01\x14a\x02\x7FWa\0\xC9V[\x80c\r\x8En,\x14a\0\xE2W\x80c'\xE25\xE3\x14a\x01\x14W\x80cO\x1E\xF2\x86\x14a\x01OW\x80cR\xD1\x90-\x14a\x01dW\x80cdP\x06\xCA\x14a\x01yW\x80cqP\x18\xA6\x14a\x01\x8FWa\0\xC9V[6a\0\xC9W`@Qc\xBC\x8E\xCA\x1B`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\x155\xAC_`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[4\x80\x15a\0\xEEW`\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\x01 W`\0\x80\xFD[Pa\x01Aa\x01/6`\x04a\nRV[`\x02` R`\0\x90\x81R`@\x90 T\x81V[`@Q\x90\x81R` \x01a\x01\x0BV[a\x01ba\x01]6`\x04a\n\x83V[a\x02\x92V[\0[4\x80\x15a\x01pW`\0\x80\xFD[Pa\x01Aa\x02\xB1V[4\x80\x15a\x01\x85W`\0\x80\xFD[Pa\x01A`\x01T\x81V[4\x80\x15a\x01\x9BW`\0\x80\xFD[Pa\x01ba\x02\xCEV[4\x80\x15a\x01\xB0W`\0\x80\xFD[P\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`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\x0BV[4\x80\x15a\x01\xF7W`\0\x80\xFD[Pa\x01A`\0T\x81V[4\x80\x15a\x02\rW`\0\x80\xFD[Pa\x022`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x01\x0B\x91\x90a\x0BiV[4\x80\x15a\x02KW`\0\x80\xFD[Pa\x01ba\x02Z6`\x04a\nRV[a\x02\xE2V[4\x80\x15a\x02kW`\0\x80\xFD[Pa\x01ba\x02z6`\x04a\nRV[a\x04\x11V[a\x01ba\x02\x8D6`\x04a\nRV[a\x04TV[a\x02\x9Aa\x05/V[a\x02\xA3\x82a\x05\xD4V[a\x02\xAD\x82\x82a\x06\x1BV[PPV[`\0a\x02\xBBa\x06\xDDV[P`\0\x80Q` a\x0B\xF3\x839\x81Q\x91R\x90V[a\x02\xD6a\x07&V[a\x02\xE0`\0a\x07\x81V[V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x03(WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x03EWP0;\x15[\x90P\x81\x15\x80\x15a\x03SWP\x80\x15[\x15a\x03qW`@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\x03\x9BW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x03\xA4\x86a\x07\xF2V[a\x03\xACa\x08\x03V[g\r\xE0\xB6\xB3\xA7d\0\0`\0Uf\x03\x8D~\xA4\xC6\x80\0`\x01U\x83\x15a\x04\tW\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[PPPPPPV[a\x04\x19a\x07&V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x04HW`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\0`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x04Q\x81a\x07\x81V[PV[`\x01T4\x10\x15a\x04wW`@Qck\xA4\xA1\xC7`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0T4\x11\x15a\x04\x9AW`@Qc\xC5mF\xD3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x04\xC1W`@Qc\x07\x02\xB3\xD9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x02` R`@\x81 \x80T4\x92\x90a\x04\xE9\x90\x84\x90a\x0B\x9CV[\x90\x91UPP`@Q4\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16\x90\x7F\xE1\xFF\xFC\xC4\x92=\x04\xB5Y\xF4\xD2\x9A\x8B\xFCl\xDA\x04\xEB[\rF\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x05\xDCa\x07&V[`@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` \x01`@Q\x80\x91\x03\x90\xA1PV[\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\x06uWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x06r\x91\x81\x01\x90a\x0B\xBDV[`\x01[a\x06\x9DW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x04?V[`\0\x80Q` a\x0B\xF3\x839\x81Q\x91R\x81\x14a\x06\xCEW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x04?V[a\x06\xD8\x83\x83a\x08\x0BV[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\x02\xE0W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\x07X\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\x02\xE0W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x04?V[\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\x07\xFAa\x08aV[a\x04Q\x81a\x08\xAAV[a\x02\xE0a\x08aV[a\x08\x14\x82a\x08\xB2V[`@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\x08YWa\x06\xD8\x82\x82a\t\x17V[a\x02\xADa\t\x8FV[\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\x02\xE0W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\x19a\x08aV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x08\xE8W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x04?V[`\0\x80Q` a\x0B\xF3\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\t4\x91\x90a\x0B\xD6V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\toW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\ttV[``\x91P[P\x91P\x91Pa\t\x84\x85\x83\x83a\t\xAEV[\x92PPP[\x92\x91PPV[4\x15a\x02\xE0W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\t\xC3Wa\t\xBE\x82a\n\rV[a\n\x06V[\x81Q\x15\x80\x15a\t\xDAWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\n\x03W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x04?V[P\x80[\x93\x92PPPV[\x80Q\x15a\n\x1DW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\nMW`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\ndW`\0\x80\xFD[a\n\x06\x82a\n6V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\n\x96W`\0\x80\xFD[a\n\x9F\x83a\n6V[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\n\xBCW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\n\xD0W`\0\x80\xFD[\x815\x81\x81\x11\x15a\n\xE2Wa\n\xE2a\nmV[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x0B\nWa\x0B\na\nmV[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\x0B#W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x0B`W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0BHV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x0B\x88\x81`@\x85\x01` \x87\x01a\x0BEV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[\x80\x82\x01\x80\x82\x11\x15a\t\x89WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a\x0B\xCFW`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x0B\xE8\x81\x84` \x87\x01a\x0BEV[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n"; /// The bytecode of the contract. pub static FEECONTRACT_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@\x81\x81R`\x04\x91\x826\x10\x15a\x003W[P6\x15a\0&WQc\x155\xAC_`\xE3\x1B\x81R\xFD[Qc\xBC\x8E\xCA\x1B`\xE0\x1B\x81R\xFD[`\0\x90\x815`\xE0\x1C\x90\x81c\r\x8En,\x14a\x07\xC3WP\x80c'\xE25\xE3\x14a\x07\x8BW\x80cO\x1E\xF2\x86\x14a\x04\xF6W\x80cR\xD1\x90-\x14a\x04~W\x80cdP\x06\xCA\x14a\x04_W\x80cqP\x18\xA6\x14a\x03\xF5W\x80c\x8D\xA5\xCB[\x14a\x03\xBFW\x80c\x8E\xD82q\x14a\x03\x9EW\x80c\xAD<\xB1\xCC\x14a\x02\xFFW\x80c\xC4\xD6m\xE8\x14a\x01\xAFW\x80c\xF2\xFD\xE3\x8B\x14a\x01\x7FWc\xF3@\xFA\x01\x03a\0\x12W\x91\x90` 6`\x03\x19\x01\x12a\x01{Wa\0\xD6a\x07\xE9V[`\x01T4\x10a\x01mW\x83T4\x11a\x01_W`\x01`\x01`\xA0\x1B\x03\x16\x91\x82\x15a\x01QW\x82\x84R`\x02` R\x81\x84 \x80T\x914\x83\x01\x80\x93\x11a\x01>WPUQ4\x81R\x7F\xE1\xFF\xFC\xC4\x92=\x04\xB5Y\xF4\xD2\x9A\x8B\xFCl\xDA\x04\xEB[\r#\xA9f.\xFC\x9C\"\x9Cj\0\x91\x82T`\xFF\x81\x86\x1C\x16\x15\x92g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x16\x80\x15\x90\x81a\x02\xF7W[`\x01\x14\x90\x81a\x02\xEDW[\x15\x90\x81a\x02\xE4W[Pa\x02\xD6WPg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x81\x16`\x01\x17\x84Ua\x02P\x91\x90\x83a\x02\xB7W[Pa\x02Ha\t\x05V[a\x01\xA4a\t\x05V[a\x02Xa\t\x05V[g\r\xE0\xB6\xB3\xA7d\0\0\x84Uf\x03\x8D~\xA4\xC6\x80\0`\x01Ua\x02vW\x82\x80\xF3[\x80Th\xFF\0\0\0\0\0\0\0\0\x19\x16\x90UQ`\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` \x90\xA18\x80\x82\x80\xF3[h\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16h\x01\0\0\0\0\0\0\0\x01\x17\x84U8a\x02?V[\x85Qc\xF9.\xE8\xA9`\xE0\x1B\x81R\xFD[\x90P\x158a\x02\x1DV[0;\x15\x91Pa\x02\x15V[\x85\x91Pa\x02\x0BV[P\x914a\x01{W\x82`\x03\x196\x01\x12a\x01{W\x81Q\x90\x82\x82\x01\x90\x82\x82\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x83\x11\x17a\x03\x8BWP\x82R`\x05\x81R` \x90d\x03R\xE3\x02\xE3`\xDC\x1B` \x82\x01R\x82Q\x93\x84\x92` \x84R\x82Q\x92\x83` \x86\x01R\x82[\x84\x81\x10a\x03uWPPP\x82\x82\x01\x84\x01R`\x1F\x01`\x1F\x19\x16\x81\x01\x03\x01\x90\xF3[\x81\x81\x01\x83\x01Q\x88\x82\x01\x88\x01R\x87\x95P\x82\x01a\x03WV[cNH{q`\xE0\x1B\x85R`A\x90R`$\x84\xFD[P\x904a\x03\xBBW\x81`\x03\x196\x01\x12a\x03\xBBW` \x91T\x90Q\x90\x81R\xF3[P\x80\xFD[P\x904a\x03\xBBW\x81`\x03\x196\x01\x12a\x03\xBBW`\0\x80Q` a\t\xAA\x839\x81Q\x91RT\x90Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x90\xF3[P4a\x01\xACW\x80`\x03\x196\x01\x12a\x01\xACWa\x04\x0Ea\x08\xCCV[`\0\x80Q` a\t\xAA\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16\x90\x91U\x81\x90`\x01`\x01`\xA0\x1B\x03\x16\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x82\x80\xA3\x80\xF3[P\x904a\x03\xBBW\x81`\x03\x196\x01\x12a\x03\xBBW` \x90`\x01T\x90Q\x90\x81R\xF3[P4a\x01\xACW\x80`\x03\x196\x01\x12a\x01\xACWP\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\x160\x03a\x04\xE9W` \x90Q\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x81R\xF3[Qcp>F\xDD`\xE1\x1B\x81R\xFD[P\x91\x90\x80`\x03\x196\x01\x12a\x01{Wa\x05\x0Ca\x07\xE9V[\x90`$\x93\x845g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11a\x03\xBBW6`#\x82\x01\x12\x15a\x03\xBBW\x80\x85\x015a\x059\x81a\x08\xED\xA8;y\xFA@\0}\x83\x87Q\x98\x84\x16\x98\x89\x81R\xA1\x85QcR\xD1\x90-`\xE0\x1B\x81R\x83\x81\x8A\x81\x8BZ\xFA\x86\x91\x81a\x07\x16W[Pa\x06\x0FWPPPPPPQ\x91cL\x9C\x8C\xE3`\xE0\x1B\x83R\x82\x01R\xFD[\x90\x88\x88\x88\x94\x93\x8C\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\x91\x82\x81\x03a\x07\x01WP\x85;\x15a\x06\xEDWP\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x82\x17\x90U\x84Q\x88\x93\x92\x91\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x85\x80\xA2\x82Q\x15a\x06\xCFWPPa\x06\xC1\x95\x82\x91Q\x90\x84Z\xF4\x91=\x15a\x06\xC5W=a\x06\xB3a\x06\xAA\x82a\x08a\tFV[P\x80\xF3[P``\x92Pa\tFV[\x95P\x95PPPPP4a\x06\xE1WPP\x80\xF3[c\xB3\x98\x97\x9F`\xE0\x1B\x81R\xFD[\x86QcL\x9C\x8C\xE3`\xE0\x1B\x81R\x80\x85\x01\x84\x90R\xFD[\x87Qc*\x87Ri`\xE2\x1B\x81R\x80\x86\x01\x91\x90\x91R\xFD[\x90\x91P\x84\x81\x81=\x83\x11a\x07BW[a\x07.\x81\x83a\x08\x04V[\x81\x01\x03\x12a\x07>WQ\x908a\x05\xF3V[\x86\x80\xFD[P=a\x07$V[\x85Qcp>F\xDD`\xE1\x1B\x81R\x88\x90\xFD[\x90P\x87\x7F6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBCT\x16\x14\x158a\x05\x9FV[\x85\x80\xFD[P\x904a\x03\xBBW` 6`\x03\x19\x01\x12a\x03\xBBW` \x91\x81\x90`\x01`\x01`\xA0\x1B\x03a\x07\xB3a\x07\xE9V[\x16\x81R`\x02\x84R T\x90Q\x90\x81R\xF3[\x90P\x824a\x01{W\x82`\x03\x196\x01\x12a\x01{W\x91``\x92`\x01\x83R\x81` \x84\x01R\x82\x01R\xF3[`\x045\x90`\x01`\x01`\xA0\x1B\x03\x82\x16\x82\x03a\x07\xFFWV[`\0\x80\xFD[\x90`\x1F\x80\x19\x91\x01\x16\x81\x01\x90\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x08&W`@RV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11a\x08&W`\x1F\x01`\x1F\x19\x16` \x01\x90V[`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x81\x15a\x08\xB3W`\0\x80Q` a\t\xAA\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16\x84\x17\x90\x91U\x16\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0`\0\x80\xA3V[`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\0`\x04\x82\x01R`$\x90\xFD[`\0\x80Q` a\t\xAA\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x163\x03a\x08\xEDWV[`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x90\xFD[`\xFF\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`@\x1C\x16\x15a\t4WV[`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x90\xFD[\x90a\tmWP\x80Q\x15a\t[W\x80Q\x90` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x90\xFD[\x81Q\x15\x80a\t\xA0W[a\t~WP\x90V[`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x90\x91\x16`\x04\x82\x01R`$\x90\xFD[P\x80;\x15a\tvV\xFE\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\xA1dsolcC\0\x08\x17\0\n"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10a\0\xABW`\x005`\xE0\x1C\x80c\x8D\xA5\xCB[\x11a\0dW\x80c\x8D\xA5\xCB[\x14a\x01\xA4W\x80c\x8E\xD82q\x14a\x01\xEBW\x80c\xAD<\xB1\xCC\x14a\x02\x01W\x80c\xC4\xD6m\xE8\x14a\x02?W\x80c\xF2\xFD\xE3\x8B\x14a\x02_W\x80c\xF3@\xFA\x01\x14a\x02\x7FWa\0\xC9V[\x80c\r\x8En,\x14a\0\xE2W\x80c'\xE25\xE3\x14a\x01\x14W\x80cO\x1E\xF2\x86\x14a\x01OW\x80cR\xD1\x90-\x14a\x01dW\x80cdP\x06\xCA\x14a\x01yW\x80cqP\x18\xA6\x14a\x01\x8FWa\0\xC9V[6a\0\xC9W`@Qc\xBC\x8E\xCA\x1B`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Qc\x155\xAC_`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[4\x80\x15a\0\xEEW`\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\x01 W`\0\x80\xFD[Pa\x01Aa\x01/6`\x04a\nRV[`\x02` R`\0\x90\x81R`@\x90 T\x81V[`@Q\x90\x81R` \x01a\x01\x0BV[a\x01ba\x01]6`\x04a\n\x83V[a\x02\x92V[\0[4\x80\x15a\x01pW`\0\x80\xFD[Pa\x01Aa\x02\xB1V[4\x80\x15a\x01\x85W`\0\x80\xFD[Pa\x01A`\x01T\x81V[4\x80\x15a\x01\x9BW`\0\x80\xFD[Pa\x01ba\x02\xCEV[4\x80\x15a\x01\xB0W`\0\x80\xFD[P\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`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\x0BV[4\x80\x15a\x01\xF7W`\0\x80\xFD[Pa\x01A`\0T\x81V[4\x80\x15a\x02\rW`\0\x80\xFD[Pa\x022`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x01\x0B\x91\x90a\x0BiV[4\x80\x15a\x02KW`\0\x80\xFD[Pa\x01ba\x02Z6`\x04a\nRV[a\x02\xE2V[4\x80\x15a\x02kW`\0\x80\xFD[Pa\x01ba\x02z6`\x04a\nRV[a\x04\x11V[a\x01ba\x02\x8D6`\x04a\nRV[a\x04TV[a\x02\x9Aa\x05/V[a\x02\xA3\x82a\x05\xD4V[a\x02\xAD\x82\x82a\x06\x1BV[PPV[`\0a\x02\xBBa\x06\xDDV[P`\0\x80Q` a\x0B\xF3\x839\x81Q\x91R\x90V[a\x02\xD6a\x07&V[a\x02\xE0`\0a\x07\x81V[V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\0\x81\x15\x80\x15a\x03(WP\x82[\x90P`\0\x82g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x16`\x01\x14\x80\x15a\x03EWP0;\x15[\x90P\x81\x15\x80\x15a\x03SWP\x80\x15[\x15a\x03qW`@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\x03\x9BW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x03\xA4\x86a\x07\xF2V[a\x03\xACa\x08\x03V[g\r\xE0\xB6\xB3\xA7d\0\0`\0Uf\x03\x8D~\xA4\xC6\x80\0`\x01U\x83\x15a\x04\tW\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[PPPPPPV[a\x04\x19a\x07&V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x04HW`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R`\0`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x04Q\x81a\x07\x81V[PV[`\x01T4\x10\x15a\x04wW`@Qck\xA4\xA1\xC7`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0T4\x11\x15a\x04\x9AW`@Qc\xC5mF\xD3`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x04\xC1W`@Qc\x07\x02\xB3\xD9`\xE4\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x01`\x01`\xA0\x1B\x03\x81\x16`\0\x90\x81R`\x02` R`@\x81 \x80T4\x92\x90a\x04\xE9\x90\x84\x90a\x0B\x9CV[\x90\x91UPP`@Q4\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16\x90\x7F\xE1\xFF\xFC\xC4\x92=\x04\xB5Y\xF4\xD2\x9A\x8B\xFCl\xDA\x04\xEB[\rF\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x05\xDCa\x07&V[`@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` \x01`@Q\x80\x91\x03\x90\xA1PV[\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\x06uWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x06r\x91\x81\x01\x90a\x0B\xBDV[`\x01[a\x06\x9DW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x04?V[`\0\x80Q` a\x0B\xF3\x839\x81Q\x91R\x81\x14a\x06\xCEW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x04?V[a\x06\xD8\x83\x83a\x08\x0BV[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\x02\xE0W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[3a\x07X\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\x02\xE0W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x04?V[\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\x07\xFAa\x08aV[a\x04Q\x81a\x08\xAAV[a\x02\xE0a\x08aV[a\x08\x14\x82a\x08\xB2V[`@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\x08YWa\x06\xD8\x82\x82a\t\x17V[a\x02\xADa\t\x8FV[\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\x02\xE0W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x04\x19a\x08aV[\x80`\x01`\x01`\xA0\x1B\x03\x16;`\0\x03a\x08\xE8W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x04?V[`\0\x80Q` a\x0B\xF3\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\t4\x91\x90a\x0B\xD6V[`\0`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80`\0\x81\x14a\toW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=`\0` \x84\x01>a\ttV[``\x91P[P\x91P\x91Pa\t\x84\x85\x83\x83a\t\xAEV[\x92PPP[\x92\x91PPV[4\x15a\x02\xE0W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\t\xC3Wa\t\xBE\x82a\n\rV[a\n\x06V[\x81Q\x15\x80\x15a\t\xDAWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\n\x03W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x04?V[P\x80[\x93\x92PPPV[\x80Q\x15a\n\x1DW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\nMW`\0\x80\xFD[\x91\x90PV[`\0` \x82\x84\x03\x12\x15a\ndW`\0\x80\xFD[a\n\x06\x82a\n6V[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`\0\x80`@\x83\x85\x03\x12\x15a\n\x96W`\0\x80\xFD[a\n\x9F\x83a\n6V[\x91P` \x83\x015g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\n\xBCW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\n\xD0W`\0\x80\xFD[\x815\x81\x81\x11\x15a\n\xE2Wa\n\xE2a\nmV[`@Q`\x1F\x82\x01`\x1F\x19\x90\x81\x16`?\x01\x16\x81\x01\x90\x83\x82\x11\x81\x83\x10\x17\x15a\x0B\nWa\x0B\na\nmV[\x81`@R\x82\x81R\x88` \x84\x87\x01\x01\x11\x15a\x0B#W`\0\x80\xFD[\x82` \x86\x01` \x83\x017`\0` \x84\x83\x01\x01R\x80\x95PPPPPP\x92P\x92\x90PV[`\0[\x83\x81\x10\x15a\x0B`W\x81\x81\x01Q\x83\x82\x01R` \x01a\x0BHV[PP`\0\x91\x01RV[` \x81R`\0\x82Q\x80` \x84\x01Ra\x0B\x88\x81`@\x85\x01` \x87\x01a\x0BEV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[\x80\x82\x01\x80\x82\x11\x15a\t\x89WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[`\0` \x82\x84\x03\x12\x15a\x0B\xCFW`\0\x80\xFD[PQ\x91\x90PV[`\0\x82Qa\x0B\xE8\x81\x84` \x87\x01a\x0BEV[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n"; /// The deployed bytecode of the contract. pub static FEECONTRACT_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/contract-bindings/src/hot_shot.rs b/contract-bindings/src/hot_shot.rs index 7c075e1b9..3c65e7284 100644 --- a/contract-bindings/src/hot_shot.rs +++ b/contract-bindings/src/hot_shot.rs @@ -283,12 +283,12 @@ pub mod hot_shot { pub static HOTSHOT_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80\x80`@R4a\0\x16Wa\x04\x7F\x90\x81a\0\x1C\x829\xF3[`\0\x80\xFD\xFE`\x80`@\x81\x81R`\x04\x91\x826\x10\x15a\0\x16W`\0\x80\xFD[`\0\x92\x835`\xE0\x1C\x91\x82c\n2\x1C\xFF\x14a\x02\x93WP\x81c&\x83=\xCC\x14a\x02vW\x81cI\xCE\x89\x97\x14a\x02OW\x81cg\xA2\x1Ep\x14a\x01\xADW\x81c\xF1\xF4]\x99\x14a\0\x88WPc\xF4O\xF7\x12\x14a\0gW`\0\x80\xFD[4a\0\x84W\x81`\x03\x196\x01\x12a\0\x84W` \x90`\x01T\x90Q\x90\x81R\xF3[P\x80\xFD[\x83\x834a\0\x84W6`\x03\x19\x01`\xA0\x81\x12a\x01\xA9W`\x80\x13a\0\x84Wa\0\xABa\x03\xDCV[\x90\x835\x82R` \x82\x01`$5\x81R\x81\x83\x01\x91`D5\x83R``\x84\x01\x91`d5\x83R`\x845\x92`\x03T\x94\x85\x88R`\x02` R\x84\x84\x89 U`\x03Th\x01\0\0\0\0\0\0\0\0\x81\x10\x15a\x01\x96W\x80`\x01a\x01\x05\x92\x01`\x03Ua\x048V[\x93\x90\x93a\x01\x84W\x92`\x03a\x01v\x93`\xC0\x98\x96\x93\x8A\x98\x96\x7F\xD7/\xE1\xACW\xD3\xE6\xD5\x1C\x92*\xE4\xD8\x11\xCCP\xAA:\xD7\x02b\x83\xAE\xA67IJ\x072RVZ\x9BQ\x85UQ`\x01\x85\x01UQ`\x02\x84\x01UQ\x91\x01UQ\x80\x94``\x80\x91\x80Q\x84R` \x81\x01Q` \x85\x01R`@\x81\x01Q`@\x85\x01R\x01Q\x91\x01RV[`\x80\x83\x01R`\xA0\x82\x01R\xA1\x80\xF3[cNH{q`\xE0\x1B\x89R\x88\x8AR`$\x89\xFD[cNH{q`\xE0\x1B\x89R`A\x8AR`$\x89\xFD[\x82\x80\xFD[\x83\x834a\0\x84W` 6`\x03\x19\x01\x12a\0\x84Wa\x02H\x81`\xA0\x945\x93\x80``a\x01\xD4a\x03\xDCV[\x82\x81R\x82` \x82\x01R\x82\x85\x82\x01R\x01Ra\x01\xED\x85a\x048V[P\x94\x81R`\x02` R T\x91`\x03a\x02\x03a\x03\xDCV[\x94\x80T\x86R`\x01\x81\x01T` \x87\x01R`\x02\x81\x01T\x83\x87\x01R\x01T``\x85\x01RQ\x80\x93``\x80\x91\x80Q\x84R` \x81\x01Q` \x85\x01R`@\x81\x01Q`@\x85\x01R\x01Q\x91\x01RV[`\x80\x82\x01R\xF3[\x90P4a\x01\xA9W` 6`\x03\x19\x01\x12a\x01\xA9W` \x92\x82\x915\x81R\x80\x84R T\x90Q\x90\x81R\xF3[PP4a\0\x84W\x81`\x03\x196\x01\x12a\0\x84W` \x90Qa\x01\xF4\x81R\xF3[\x84\x84\x834a\x01\xA9W` \x90` `\x03\x196\x01\x12a\x03\xD8W\x805\x91g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x91\x82\x84\x11a\x03\xD4W6`#\x85\x01\x12\x15a\x03\xD4W\x83\x81\x015\x92\x83\x11a\x03\xD4W`$\x96`$\x85\x01\x94`$6\x91\x86`\x07\x1B\x01\x01\x11a\x03\xD0Wa\x01\xF4\x84\x11a\x03\xBDWP`\x01\x96\x87T\x94\x87[\x85\x81\x10a\x037W\x88\x7F\x82\x03\xA2\x1EO\x95\xF7.P\x81\xD5\xE0\x92\x9B\x1A\x8CR\x14\x1E\x12?\x9A\x14\xE1\xE7K\x02`\xFA_R\xF1\x89\x89\x89\x82Q\x91\x82R` \x82\x01R\xA1\x80\xF3[a\x03B\x81\x87\x84a\x04\x12V[5\x8AT\x80\x91\x03a\x03\x97Wa\x03W\x82\x88\x85a\x04\x12V[P\x85a\x03d\x83\x89\x86a\x04\x12V[\x015\x90\x8AR\x89\x86R\x88\x8A U\x89T\x8A\x81\x01\x80\x91\x11a\x03\x85W\x8AU\x89\x01a\x02\xFDV[cNH{q`\xE0\x1B\x8AR`\x11\x85R\x83\x8A\xFD[\x83\x89a\x03\xA7\x87\x94\x8A`D\x97a\x04\x12V[5\x90Q\x93c4\xE4#\xFF`\xE0\x1B\x85R\x84\x01R\x82\x01R\xFD[\x83`$\x92c\xE0\x82\x84\x0B`\xE0\x1B\x83R\x82\x01R\xFD[\x86\x80\xFD[\x85\x80\xFD[\x83\x80\xFD[`@Q\x90`\x80\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x03\xFCW`@RV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[\x91\x90\x81\x10\x15a\x04\"W`\x07\x1B\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\x03T\x81\x10\x15a\x04\"W`\x03`\0R`\x02\x1B\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8[\x01\x90`\0\x90V\xFE\xA1dsolcC\0\x08\x17\0\n"; + const __BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[Pa\x05\xAC\x80a\0 `\09`\0\xF3\xFE`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0bW`\x005`\xE0\x1C\x80c\n2\x1C\xFF\x14a\0gW\x80c&\x83=\xCC\x14a\0|W\x80cI\xCE\x89\x97\x14a\0\x98W\x80cg\xA2\x1Ep\x14a\0\xB8W\x80c\xF1\xF4]\x99\x14a\x01\x02W\x80c\xF4O\xF7\x12\x14a\x01\x15W[`\0\x80\xFD[a\0za\0u6`\x04a\x04NV[a\x01\x1EV[\0[a\0\x85a\x01\xF4\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x85a\0\xA66`\x04a\x04\xC3V[`\0` \x81\x90R\x90\x81R`@\x90 T\x81V[a\0\xCBa\0\xC66`\x04a\x04\xC3V[a\x02\x92V[`@\x80Q\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R\x83\x82\x01Q\x91\x81\x01\x91\x90\x91R``\x92\x83\x01Q\x92\x81\x01\x92\x90\x92R`\x80\x82\x01R`\xA0\x01a\0\x8FV[a\0za\x01\x106`\x04a\x04\xDCV[a\x03&V[a\0\x85`\x01T\x81V[a\x01\xF4\x81\x11\x15a\x01IW`@Qc\xE0\x82\x84\x0B`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\x01T`\0[\x82\x81\x10\x15a\x02RW`\x01T\x84\x84\x83\x81\x81\x10a\x01lWa\x01la\x05bV[\x90P`\x80\x02\x01`\0\x015\x14a\x01\xBEW\x83\x83\x82\x81\x81\x10a\x01\x8DWa\x01\x8Da\x05bV[\x90P`\x80\x02\x01`\0\x015`\x01T`@Qc4\xE4#\xFF`\xE0\x1B\x81R`\x04\x01a\x01@\x92\x91\x90\x91\x82R` \x82\x01R`@\x01\x90V[a\x01\xDC\x84\x84\x83\x81\x81\x10a\x01\xD3Wa\x01\xD3a\x05bV[\x90PPP`\x01\x90V[a\x01\xFFW`\x01T`@Qcx\x18g\x19`\xE0\x1B\x81R`\x04\x01a\x01@\x91\x81R` \x01\x90V[\x83\x83\x82\x81\x81\x10a\x02\x11Wa\x02\x11a\x05bV[\x90P`\x80\x02\x01` \x015`\0\x80`\x01T\x81R` \x01\x90\x81R` \x01`\0 \x81\x90UP`\x01\x80`\0\x82\x82Ta\x02E\x91\x90a\x05xV[\x90\x91UPP`\x01\x01a\x01OV[P`@\x80Q\x82\x81R` \x81\x01\x84\x90R\x7F\x82\x03\xA2\x1EO\x95\xF7.P\x81\xD5\xE0\x92\x9B\x1A\x8CR\x14\x1E\x12?\x9A\x14\xE1\xE7K\x02`\xFA_R\xF1\x91\x01[`@Q\x80\x91\x03\x90\xA1PPPV[a\x02\xBD`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`\0`\x03\x83\x81T\x81\x10a\x02\xD2Wa\x02\xD2a\x05bV[`\0\x91\x82R` \x80\x83 \x95\x83R`\x02\x80\x82R`@\x93\x84\x90 T\x84Q`\x80\x81\x01\x86R`\x04\x90\x94\x02\x90\x97\x01\x80T\x84R`\x01\x81\x01T\x92\x84\x01\x92\x90\x92R\x81\x01T\x92\x82\x01\x92\x90\x92R`\x03\x90\x91\x01T``\x82\x01R\x93\x91PPV[`\x03\x80T`\0\x81\x81R`\x02` \x90\x81R`@\x80\x83 \x86\x90U\x84T`\x01\x81\x01\x86U\x94\x90\x92R\x85Q`\x04\x90\x94\x02\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8[\x81\x01\x85\x90U\x86\x82\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8\\\x83\x01U\x87\x84\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8]\x84\x01U``\x80\x8A\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8^\x90\x95\x01\x94\x90\x94U\x85Q\x97\x88R\x91Q\x93\x87\x01\x93\x90\x93R\x91Q\x92\x85\x01\x92\x90\x92R\x90Q\x90\x83\x01R`\x80\x82\x01\x83\x90R`\xA0\x82\x01\x81\x90R\x90\x7F\xD7/\xE1\xACW\xD3\xE6\xD5\x1C\x92*\xE4\xD8\x11\xCCP\xAA:\xD7\x02b\x83\xAE\xA67IJ\x072RVZ\x90`\xC0\x01a\x02\x85V[`\0\x80` \x83\x85\x03\x12\x15a\x04aW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x04yW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x04\x8DW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x04\x9CW`\0\x80\xFD[\x86` \x82`\x07\x1B\x85\x01\x01\x11\x15a\x04\xB1W`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x04\xD5W`\0\x80\xFD[P5\x91\x90PV[`\0\x80\x82\x84\x03`\xA0\x81\x12\x15a\x04\xF0W`\0\x80\xFD[`\x80\x81\x12\x15a\x04\xFEW`\0\x80\xFD[P`@Q`\x80\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x050WcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x90\x81R\x845\x82R` \x80\x86\x015\x90\x83\x01R\x84\x81\x015\x90\x82\x01R``\x80\x85\x015\x90\x82\x01R\x94`\x80\x90\x93\x015\x93PPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x80\x82\x01\x80\x82\x11\x15a\x05\x99WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x92\x91PPV\xFE\xA1dsolcC\0\x08\x17\0\n"; /// The bytecode of the contract. pub static HOTSHOT_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@\x81\x81R`\x04\x91\x826\x10\x15a\0\x16W`\0\x80\xFD[`\0\x92\x835`\xE0\x1C\x91\x82c\n2\x1C\xFF\x14a\x02\x93WP\x81c&\x83=\xCC\x14a\x02vW\x81cI\xCE\x89\x97\x14a\x02OW\x81cg\xA2\x1Ep\x14a\x01\xADW\x81c\xF1\xF4]\x99\x14a\0\x88WPc\xF4O\xF7\x12\x14a\0gW`\0\x80\xFD[4a\0\x84W\x81`\x03\x196\x01\x12a\0\x84W` \x90`\x01T\x90Q\x90\x81R\xF3[P\x80\xFD[\x83\x834a\0\x84W6`\x03\x19\x01`\xA0\x81\x12a\x01\xA9W`\x80\x13a\0\x84Wa\0\xABa\x03\xDCV[\x90\x835\x82R` \x82\x01`$5\x81R\x81\x83\x01\x91`D5\x83R``\x84\x01\x91`d5\x83R`\x845\x92`\x03T\x94\x85\x88R`\x02` R\x84\x84\x89 U`\x03Th\x01\0\0\0\0\0\0\0\0\x81\x10\x15a\x01\x96W\x80`\x01a\x01\x05\x92\x01`\x03Ua\x048V[\x93\x90\x93a\x01\x84W\x92`\x03a\x01v\x93`\xC0\x98\x96\x93\x8A\x98\x96\x7F\xD7/\xE1\xACW\xD3\xE6\xD5\x1C\x92*\xE4\xD8\x11\xCCP\xAA:\xD7\x02b\x83\xAE\xA67IJ\x072RVZ\x9BQ\x85UQ`\x01\x85\x01UQ`\x02\x84\x01UQ\x91\x01UQ\x80\x94``\x80\x91\x80Q\x84R` \x81\x01Q` \x85\x01R`@\x81\x01Q`@\x85\x01R\x01Q\x91\x01RV[`\x80\x83\x01R`\xA0\x82\x01R\xA1\x80\xF3[cNH{q`\xE0\x1B\x89R\x88\x8AR`$\x89\xFD[cNH{q`\xE0\x1B\x89R`A\x8AR`$\x89\xFD[\x82\x80\xFD[\x83\x834a\0\x84W` 6`\x03\x19\x01\x12a\0\x84Wa\x02H\x81`\xA0\x945\x93\x80``a\x01\xD4a\x03\xDCV[\x82\x81R\x82` \x82\x01R\x82\x85\x82\x01R\x01Ra\x01\xED\x85a\x048V[P\x94\x81R`\x02` R T\x91`\x03a\x02\x03a\x03\xDCV[\x94\x80T\x86R`\x01\x81\x01T` \x87\x01R`\x02\x81\x01T\x83\x87\x01R\x01T``\x85\x01RQ\x80\x93``\x80\x91\x80Q\x84R` \x81\x01Q` \x85\x01R`@\x81\x01Q`@\x85\x01R\x01Q\x91\x01RV[`\x80\x82\x01R\xF3[\x90P4a\x01\xA9W` 6`\x03\x19\x01\x12a\x01\xA9W` \x92\x82\x915\x81R\x80\x84R T\x90Q\x90\x81R\xF3[PP4a\0\x84W\x81`\x03\x196\x01\x12a\0\x84W` \x90Qa\x01\xF4\x81R\xF3[\x84\x84\x834a\x01\xA9W` \x90` `\x03\x196\x01\x12a\x03\xD8W\x805\x91g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x91\x82\x84\x11a\x03\xD4W6`#\x85\x01\x12\x15a\x03\xD4W\x83\x81\x015\x92\x83\x11a\x03\xD4W`$\x96`$\x85\x01\x94`$6\x91\x86`\x07\x1B\x01\x01\x11a\x03\xD0Wa\x01\xF4\x84\x11a\x03\xBDWP`\x01\x96\x87T\x94\x87[\x85\x81\x10a\x037W\x88\x7F\x82\x03\xA2\x1EO\x95\xF7.P\x81\xD5\xE0\x92\x9B\x1A\x8CR\x14\x1E\x12?\x9A\x14\xE1\xE7K\x02`\xFA_R\xF1\x89\x89\x89\x82Q\x91\x82R` \x82\x01R\xA1\x80\xF3[a\x03B\x81\x87\x84a\x04\x12V[5\x8AT\x80\x91\x03a\x03\x97Wa\x03W\x82\x88\x85a\x04\x12V[P\x85a\x03d\x83\x89\x86a\x04\x12V[\x015\x90\x8AR\x89\x86R\x88\x8A U\x89T\x8A\x81\x01\x80\x91\x11a\x03\x85W\x8AU\x89\x01a\x02\xFDV[cNH{q`\xE0\x1B\x8AR`\x11\x85R\x83\x8A\xFD[\x83\x89a\x03\xA7\x87\x94\x8A`D\x97a\x04\x12V[5\x90Q\x93c4\xE4#\xFF`\xE0\x1B\x85R\x84\x01R\x82\x01R\xFD[\x83`$\x92c\xE0\x82\x84\x0B`\xE0\x1B\x83R\x82\x01R\xFD[\x86\x80\xFD[\x85\x80\xFD[\x83\x80\xFD[`@Q\x90`\x80\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x03\xFCW`@RV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[\x91\x90\x81\x10\x15a\x04\"W`\x07\x1B\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`\x03T\x81\x10\x15a\x04\"W`\x03`\0R`\x02\x1B\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8[\x01\x90`\0\x90V\xFE\xA1dsolcC\0\x08\x17\0\n"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R4\x80\x15a\0\x10W`\0\x80\xFD[P`\x046\x10a\0bW`\x005`\xE0\x1C\x80c\n2\x1C\xFF\x14a\0gW\x80c&\x83=\xCC\x14a\0|W\x80cI\xCE\x89\x97\x14a\0\x98W\x80cg\xA2\x1Ep\x14a\0\xB8W\x80c\xF1\xF4]\x99\x14a\x01\x02W\x80c\xF4O\xF7\x12\x14a\x01\x15W[`\0\x80\xFD[a\0za\0u6`\x04a\x04NV[a\x01\x1EV[\0[a\0\x85a\x01\xF4\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x85a\0\xA66`\x04a\x04\xC3V[`\0` \x81\x90R\x90\x81R`@\x90 T\x81V[a\0\xCBa\0\xC66`\x04a\x04\xC3V[a\x02\x92V[`@\x80Q\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R\x83\x82\x01Q\x91\x81\x01\x91\x90\x91R``\x92\x83\x01Q\x92\x81\x01\x92\x90\x92R`\x80\x82\x01R`\xA0\x01a\0\x8FV[a\0za\x01\x106`\x04a\x04\xDCV[a\x03&V[a\0\x85`\x01T\x81V[a\x01\xF4\x81\x11\x15a\x01IW`@Qc\xE0\x82\x84\x0B`\xE0\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01[`@Q\x80\x91\x03\x90\xFD[`\x01T`\0[\x82\x81\x10\x15a\x02RW`\x01T\x84\x84\x83\x81\x81\x10a\x01lWa\x01la\x05bV[\x90P`\x80\x02\x01`\0\x015\x14a\x01\xBEW\x83\x83\x82\x81\x81\x10a\x01\x8DWa\x01\x8Da\x05bV[\x90P`\x80\x02\x01`\0\x015`\x01T`@Qc4\xE4#\xFF`\xE0\x1B\x81R`\x04\x01a\x01@\x92\x91\x90\x91\x82R` \x82\x01R`@\x01\x90V[a\x01\xDC\x84\x84\x83\x81\x81\x10a\x01\xD3Wa\x01\xD3a\x05bV[\x90PPP`\x01\x90V[a\x01\xFFW`\x01T`@Qcx\x18g\x19`\xE0\x1B\x81R`\x04\x01a\x01@\x91\x81R` \x01\x90V[\x83\x83\x82\x81\x81\x10a\x02\x11Wa\x02\x11a\x05bV[\x90P`\x80\x02\x01` \x015`\0\x80`\x01T\x81R` \x01\x90\x81R` \x01`\0 \x81\x90UP`\x01\x80`\0\x82\x82Ta\x02E\x91\x90a\x05xV[\x90\x91UPP`\x01\x01a\x01OV[P`@\x80Q\x82\x81R` \x81\x01\x84\x90R\x7F\x82\x03\xA2\x1EO\x95\xF7.P\x81\xD5\xE0\x92\x9B\x1A\x8CR\x14\x1E\x12?\x9A\x14\xE1\xE7K\x02`\xFA_R\xF1\x91\x01[`@Q\x80\x91\x03\x90\xA1PPPV[a\x02\xBD`@Q\x80`\x80\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[`\0`\x03\x83\x81T\x81\x10a\x02\xD2Wa\x02\xD2a\x05bV[`\0\x91\x82R` \x80\x83 \x95\x83R`\x02\x80\x82R`@\x93\x84\x90 T\x84Q`\x80\x81\x01\x86R`\x04\x90\x94\x02\x90\x97\x01\x80T\x84R`\x01\x81\x01T\x92\x84\x01\x92\x90\x92R\x81\x01T\x92\x82\x01\x92\x90\x92R`\x03\x90\x91\x01T``\x82\x01R\x93\x91PPV[`\x03\x80T`\0\x81\x81R`\x02` \x90\x81R`@\x80\x83 \x86\x90U\x84T`\x01\x81\x01\x86U\x94\x90\x92R\x85Q`\x04\x90\x94\x02\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8[\x81\x01\x85\x90U\x86\x82\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8\\\x83\x01U\x87\x84\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8]\x84\x01U``\x80\x8A\x01\x80Q\x7F\xC2WZ\x0E\x9EY<\0\xF9Y\xF8\xC9/\x12\xDB(i\xC39Z;\x05\x02\xD0^%\x16Doq\xF8^\x90\x95\x01\x94\x90\x94U\x85Q\x97\x88R\x91Q\x93\x87\x01\x93\x90\x93R\x91Q\x92\x85\x01\x92\x90\x92R\x90Q\x90\x83\x01R`\x80\x82\x01\x83\x90R`\xA0\x82\x01\x81\x90R\x90\x7F\xD7/\xE1\xACW\xD3\xE6\xD5\x1C\x92*\xE4\xD8\x11\xCCP\xAA:\xD7\x02b\x83\xAE\xA67IJ\x072RVZ\x90`\xC0\x01a\x02\x85V[`\0\x80` \x83\x85\x03\x12\x15a\x04aW`\0\x80\xFD[\x825g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x80\x82\x11\x15a\x04yW`\0\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a\x04\x8DW`\0\x80\xFD[\x815\x81\x81\x11\x15a\x04\x9CW`\0\x80\xFD[\x86` \x82`\x07\x1B\x85\x01\x01\x11\x15a\x04\xB1W`\0\x80\xFD[` \x92\x90\x92\x01\x96\x91\x95P\x90\x93PPPPV[`\0` \x82\x84\x03\x12\x15a\x04\xD5W`\0\x80\xFD[P5\x91\x90PV[`\0\x80\x82\x84\x03`\xA0\x81\x12\x15a\x04\xF0W`\0\x80\xFD[`\x80\x81\x12\x15a\x04\xFEW`\0\x80\xFD[P`@Q`\x80\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\x050WcNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@\x90\x81R\x845\x82R` \x80\x86\x015\x90\x83\x01R\x84\x81\x015\x90\x82\x01R``\x80\x85\x015\x90\x82\x01R\x94`\x80\x90\x93\x015\x93PPPV[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x80\x82\x01\x80\x82\x11\x15a\x05\x99WcNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x92\x91PPV\xFE\xA1dsolcC\0\x08\x17\0\n"; /// The deployed bytecode of the contract. pub static HOTSHOT_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/contract-bindings/src/light_client.rs b/contract-bindings/src/light_client.rs index df474c11a..daf77c558 100644 --- a/contract-bindings/src/light_client.rs +++ b/contract-bindings/src/light_client.rs @@ -34,35 +34,6 @@ pub mod light_client { 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(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.StakeTableState", - ), - ), - },], - 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("disablePermissionedProverMode"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -105,38 +76,6 @@ pub mod light_client { 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("genesisStakeTableState"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -686,38 +625,6 @@ pub mod light_client { 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([ ( @@ -1046,15 +953,6 @@ pub mod light_client { .method_hash([173, 60, 177, 204], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `computeStakeTableComm` (0x6f96bdae) function - pub fn compute_stake_table_comm( - &self, - state: StakeTableState, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([111, 150, 189, 174], (state,)) - .expect("method not found (this should never happen)") - } ///Calls the contract's `disablePermissionedProverMode` (0x69cc6a04) function pub fn disable_permissioned_prover_mode( &self, @@ -1072,22 +970,6 @@ pub mod light_client { .method_hash([159, 219, 84, 167], ()) .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 `genesisStakeTableState` (0x426d3194) function pub fn genesis_stake_table_state( &self, @@ -1274,22 +1156,6 @@ pub mod light_client { .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 `Initialized` event pub fn initialized_filter( &self, @@ -2338,26 +2204,6 @@ pub mod light_client { abi = "UPGRADE_INTERFACE_VERSION()" )] pub struct UpgradeInterfaceVersionCall; - ///Container type for all input parameters for the `computeStakeTableComm` function with signature `computeStakeTableComm((uint256,uint256,uint256,uint256))` and selector `0x6f96bdae` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "computeStakeTableComm", - abi = "computeStakeTableComm((uint256,uint256,uint256,uint256))" - )] - pub struct ComputeStakeTableCommCall { - pub state: StakeTableState, - } ///Container type for all input parameters for the `disablePermissionedProverMode` function with signature `disablePermissionedProverMode()` and selector `0x69cc6a04` #[derive( Clone, @@ -2391,39 +2237,6 @@ pub mod light_client { )] #[ethcall(name = "finalizedState", abi = "finalizedState()")] pub struct FinalizedStateCall; - ///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 `genesisStakeTableState` function with signature `genesisStakeTableState()` and selector `0x426d3194` #[derive( Clone, @@ -2762,48 +2575,12 @@ pub mod light_client { 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 LightClientCalls { UpgradeInterfaceVersion(UpgradeInterfaceVersionCall), - ComputeStakeTableComm(ComputeStakeTableCommCall), DisablePermissionedProverMode(DisablePermissionedProverModeCall), FinalizedState(FinalizedStateCall), - FrozenStakeTableCommitment(FrozenStakeTableCommitmentCall), - FrozenThreshold(FrozenThresholdCall), GenesisStakeTableState(GenesisStakeTableStateCall), GenesisState(GenesisStateCall), GetHotShotCommitment(GetHotShotCommitmentCall), @@ -2824,8 +2601,6 @@ pub mod light_client { StateHistoryRetentionPeriod(StateHistoryRetentionPeriodCall), TransferOwnership(TransferOwnershipCall), UpgradeToAndCall(UpgradeToAndCallCall), - VotingStakeTableCommitment(VotingStakeTableCommitmentCall), - VotingThreshold(VotingThresholdCall), } impl ::ethers::core::abi::AbiDecode for LightClientCalls { fn decode( @@ -2837,11 +2612,6 @@ pub mod light_client { { return Ok(Self::UpgradeInterfaceVersion(decoded)); } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ComputeStakeTableComm(decoded)); - } if let Ok(decoded) = ::decode(data) { @@ -2852,16 +2622,6 @@ pub mod light_client { { return Ok(Self::FinalizedState(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) { @@ -2954,16 +2714,6 @@ pub mod light_client { { 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()) } } @@ -2973,17 +2723,10 @@ pub mod light_client { Self::UpgradeInterfaceVersion(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::ComputeStakeTableComm(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } Self::DisablePermissionedProverMode(element) => { ::ethers::core::abi::AbiEncode::encode(element) } Self::FinalizedState(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::GenesisStakeTableState(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -3026,10 +2769,6 @@ pub mod light_client { } 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), } } } @@ -3037,13 +2776,10 @@ pub mod light_client { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::UpgradeInterfaceVersion(element) => ::core::fmt::Display::fmt(element, f), - Self::ComputeStakeTableComm(element) => ::core::fmt::Display::fmt(element, f), Self::DisablePermissionedProverMode(element) => { ::core::fmt::Display::fmt(element, f) } Self::FinalizedState(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::GenesisStakeTableState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisState(element) => ::core::fmt::Display::fmt(element, f), Self::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f), @@ -3066,8 +2802,6 @@ pub mod light_client { Self::StateHistoryRetentionPeriod(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), } } } @@ -3076,11 +2810,6 @@ pub mod light_client { Self::UpgradeInterfaceVersion(value) } } - impl ::core::convert::From for LightClientCalls { - fn from(value: ComputeStakeTableCommCall) -> Self { - Self::ComputeStakeTableComm(value) - } - } impl ::core::convert::From for LightClientCalls { fn from(value: DisablePermissionedProverModeCall) -> Self { Self::DisablePermissionedProverMode(value) @@ -3091,16 +2820,6 @@ pub mod light_client { Self::FinalizedState(value) } } - impl ::core::convert::From for LightClientCalls { - fn from(value: FrozenStakeTableCommitmentCall) -> Self { - Self::FrozenStakeTableCommitment(value) - } - } - impl ::core::convert::From for LightClientCalls { - fn from(value: FrozenThresholdCall) -> Self { - Self::FrozenThreshold(value) - } - } impl ::core::convert::From for LightClientCalls { fn from(value: GenesisStakeTableStateCall) -> Self { Self::GenesisStakeTableState(value) @@ -3201,16 +2920,6 @@ pub mod light_client { Self::UpgradeToAndCall(value) } } - impl ::core::convert::From for LightClientCalls { - fn from(value: VotingStakeTableCommitmentCall) -> Self { - Self::VotingStakeTableCommitment(value) - } - } - impl ::core::convert::From for LightClientCalls { - 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, @@ -3225,20 +2934,6 @@ pub mod light_client { Hash, )] pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); - ///Container type for all return fields from the `computeStakeTableComm` function with signature `computeStakeTableComm((uint256,uint256,uint256,uint256))` and selector `0x6f96bdae` - #[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 `finalizedState` function with signature `finalizedState()` and selector `0x9fdb54a7` #[derive( Clone, @@ -3257,34 +2952,6 @@ pub mod light_client { pub block_height: u64, pub block_comm_root: ::ethers::core::types::U256, } - ///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 `genesisStakeTableState` function with signature `genesisStakeTableState()` and selector `0x426d3194` #[derive( Clone, @@ -3484,32 +3151,4 @@ pub mod light_client { Hash, )] pub struct StateHistoryRetentionPeriodReturn(pub u32); - ///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_mock.rs b/contract-bindings/src/light_client_mock.rs index f1d07f1a9..53bf3cb08 100644 --- a/contract-bindings/src/light_client_mock.rs +++ b/contract-bindings/src/light_client_mock.rs @@ -65,35 +65,6 @@ pub mod light_client_mock { 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(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.StakeTableState", - ), - ), - },], - 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("disablePermissionedProverMode"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -136,38 +107,6 @@ pub mod light_client_mock { 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("genesisStakeTableState"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -794,38 +733,6 @@ pub mod light_client_mock { 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([ ( @@ -1154,15 +1061,6 @@ pub mod light_client_mock { .method_hash([173, 60, 177, 204], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `computeStakeTableComm` (0x6f96bdae) function - pub fn compute_stake_table_comm( - &self, - state: StakeTableState, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([111, 150, 189, 174], (state,)) - .expect("method not found (this should never happen)") - } ///Calls the contract's `disablePermissionedProverMode` (0x69cc6a04) function pub fn disable_permissioned_prover_mode( &self, @@ -1180,22 +1078,6 @@ pub mod light_client_mock { .method_hash([159, 219, 84, 167], ()) .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 `genesisStakeTableState` (0x426d3194) function pub fn genesis_stake_table_state( &self, @@ -1415,22 +1297,6 @@ pub mod light_client_mock { .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 `Initialized` event pub fn initialized_filter( &self, @@ -2483,26 +2349,6 @@ pub mod light_client_mock { abi = "UPGRADE_INTERFACE_VERSION()" )] pub struct UpgradeInterfaceVersionCall; - ///Container type for all input parameters for the `computeStakeTableComm` function with signature `computeStakeTableComm((uint256,uint256,uint256,uint256))` and selector `0x6f96bdae` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "computeStakeTableComm", - abi = "computeStakeTableComm((uint256,uint256,uint256,uint256))" - )] - pub struct ComputeStakeTableCommCall { - pub state: StakeTableState, - } ///Container type for all input parameters for the `disablePermissionedProverMode` function with signature `disablePermissionedProverMode()` and selector `0x69cc6a04` #[derive( Clone, @@ -2536,39 +2382,6 @@ pub mod light_client_mock { )] #[ethcall(name = "finalizedState", abi = "finalizedState()")] pub struct FinalizedStateCall; - ///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 `genesisStakeTableState` function with signature `genesisStakeTableState()` and selector `0x426d3194` #[derive( Clone, @@ -2979,48 +2792,12 @@ pub mod light_client_mock { 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), - ComputeStakeTableComm(ComputeStakeTableCommCall), DisablePermissionedProverMode(DisablePermissionedProverModeCall), FinalizedState(FinalizedStateCall), - FrozenStakeTableCommitment(FrozenStakeTableCommitmentCall), - FrozenThreshold(FrozenThresholdCall), GenesisStakeTableState(GenesisStakeTableStateCall), GenesisState(GenesisStateCall), GetHotShotCommitment(GetHotShotCommitmentCall), @@ -3045,8 +2822,6 @@ pub mod light_client_mock { StateHistoryRetentionPeriod(StateHistoryRetentionPeriodCall), TransferOwnership(TransferOwnershipCall), UpgradeToAndCall(UpgradeToAndCallCall), - VotingStakeTableCommitment(VotingStakeTableCommitmentCall), - VotingThreshold(VotingThresholdCall), } impl ::ethers::core::abi::AbiDecode for LightClientMockCalls { fn decode( @@ -3058,11 +2833,6 @@ pub mod light_client_mock { { return Ok(Self::UpgradeInterfaceVersion(decoded)); } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::ComputeStakeTableComm(decoded)); - } if let Ok(decoded) = ::decode(data) { @@ -3073,16 +2843,6 @@ pub mod light_client_mock { { return Ok(Self::FinalizedState(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) { @@ -3194,16 +2954,6 @@ pub mod light_client_mock { { 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()) } } @@ -3213,17 +2963,10 @@ pub mod light_client_mock { Self::UpgradeInterfaceVersion(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::ComputeStakeTableComm(element) => { - ::ethers::core::abi::AbiEncode::encode(element) - } Self::DisablePermissionedProverMode(element) => { ::ethers::core::abi::AbiEncode::encode(element) } Self::FinalizedState(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::GenesisStakeTableState(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -3272,10 +3015,6 @@ pub mod light_client_mock { } 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), } } } @@ -3283,13 +3022,10 @@ pub mod light_client_mock { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::UpgradeInterfaceVersion(element) => ::core::fmt::Display::fmt(element, f), - Self::ComputeStakeTableComm(element) => ::core::fmt::Display::fmt(element, f), Self::DisablePermissionedProverMode(element) => { ::core::fmt::Display::fmt(element, f) } Self::FinalizedState(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::GenesisStakeTableState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisState(element) => ::core::fmt::Display::fmt(element, f), Self::GetHotShotCommitment(element) => ::core::fmt::Display::fmt(element, f), @@ -3316,8 +3052,6 @@ pub mod light_client_mock { Self::StateHistoryRetentionPeriod(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), } } } @@ -3326,11 +3060,6 @@ pub mod light_client_mock { Self::UpgradeInterfaceVersion(value) } } - impl ::core::convert::From for LightClientMockCalls { - fn from(value: ComputeStakeTableCommCall) -> Self { - Self::ComputeStakeTableComm(value) - } - } impl ::core::convert::From for LightClientMockCalls { fn from(value: DisablePermissionedProverModeCall) -> Self { Self::DisablePermissionedProverMode(value) @@ -3341,16 +3070,6 @@ pub mod light_client_mock { Self::FinalizedState(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: GenesisStakeTableStateCall) -> Self { Self::GenesisStakeTableState(value) @@ -3471,16 +3190,6 @@ pub mod light_client_mock { 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, @@ -3495,20 +3204,6 @@ pub mod light_client_mock { Hash, )] pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); - ///Container type for all return fields from the `computeStakeTableComm` function with signature `computeStakeTableComm((uint256,uint256,uint256,uint256))` and selector `0x6f96bdae` - #[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 `finalizedState` function with signature `finalizedState()` and selector `0x9fdb54a7` #[derive( Clone, @@ -3527,34 +3222,6 @@ pub mod light_client_mock { pub block_height: u64, pub block_comm_root: ::ethers::core::types::U256, } - ///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 `genesisStakeTableState` function with signature `genesisStakeTableState()` and selector `0x426d3194` #[derive( Clone, @@ -3754,34 +3421,6 @@ pub mod light_client_mock { Hash, )] pub struct StateHistoryRetentionPeriodReturn(pub u32); - ///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); ///`StateHistoryCommitment(uint64,uint64,(uint64,uint256))` #[derive( Clone, diff --git a/contract-bindings/src/light_client_state_update_vk.rs b/contract-bindings/src/light_client_state_update_vk.rs index 6dcdc5fa1..869a4e2b1 100644 --- a/contract-bindings/src/light_client_state_update_vk.rs +++ b/contract-bindings/src/light_client_state_update_vk.rs @@ -25,12 +25,12 @@ pub mod light_client_state_update_vk { pub static LIGHTCLIENTSTATEUPDATEVK_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80\x80`@R4`\x17W`\x11\x90\x81`\x1D\x8290\x81PP\xF3[`\0\x80\xFD\xFE`\0\x80\xFD\xFE\xA1dsolcC\0\x08\x17\0\n"; + 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 LIGHTCLIENTSTATEUPDATEVK_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\0\x80\xFD\xFE\xA1dsolcC\0\x08\x17\0\n"; + 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 LIGHTCLIENTSTATEUPDATEVK_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/contract-bindings/src/light_client_state_update_vk_mock.rs b/contract-bindings/src/light_client_state_update_vk_mock.rs index 29ad80bcf..bb9fc46d6 100644 --- a/contract-bindings/src/light_client_state_update_vk_mock.rs +++ b/contract-bindings/src/light_client_state_update_vk_mock.rs @@ -26,12 +26,12 @@ pub mod light_client_state_update_vk_mock { ::ethers::core::abi::Abi, > = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80\x80`@R4`\x17W`\x11\x90\x81`\x1D\x8290\x81PP\xF3[`\0\x80\xFD\xFE`\0\x80\xFD\xFE\xA1dsolcC\0\x08\x17\0\n"; + 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"`\0\x80\xFD\xFE\xA1dsolcC\0\x08\x17\0\n"; + 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); diff --git a/contract-bindings/src/plonk_verifier.rs b/contract-bindings/src/plonk_verifier.rs index c8fbe84f4..5fcf5889c 100644 --- a/contract-bindings/src/plonk_verifier.rs +++ b/contract-bindings/src/plonk_verifier.rs @@ -234,12 +234,12 @@ pub mod plonk_verifier { pub static PLONKVERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80\x80`@R4a\0\x1AWa)\xC2\x90\x81a\0 \x8290\x81PP\xF3[`\0\x80\xFD\xFE`\x80`@R`\x046\x10\x15a\0\x12W`\0\x80\xFD[`\x005`\xE0\x1Cc\xA1\xF1\xA3N\x14a\0'W`\0\x80\xFD[6`\x03\x19\x01a\n\x80\x81\x12a\x01\xA2Wa\x05\0\x13a\x01\xA2Wa\x01\x9Ea\x01\x8Ca\0Ka\x01\xBDV[`\x045\x81R`$5` \x82\x01Ra\0a6a\x02\x85V[`@\x82\x01Ra\0o6a\x02\xA9V[``\x82\x01Ra\0}6a\x02\xCDV[`\x80\x82\x01Ra\0\x8B6a\x02\xF1V[`\xA0\x82\x01Ra\0\x996a\x03\x18V[`\xC0\x82\x01Ra\0\xA76a\x03?V[`\xE0\x82\x01Ra\0\xB56a\x03fV[a\x01\0\x82\x01Ra\0\xC46a\x03\x8DV[a\x01 \x82\x01Ra\0\xD36a\x03\xB4V[a\x01@\x82\x01Ra\0\xE26a\x03\xDBV[a\x01`\x82\x01Ra\0\xF16a\x04\x02V[a\x01\x80\x82\x01Ra\x01\x006a\x04)V[a\x01\xA0\x82\x01Ra\x01\x0F6a\x04PV[a\x01\xC0\x82\x01Ra\x01\x1E6a\x04wV[a\x01\xE0\x82\x01Ra\x01-6a\x04\x9EV[a\x02\0\x82\x01Ra\x01<6a\x04\xC5V[a\x02 \x82\x01Ra\x01K6a\x04\xECV[a\x02@\x82\x01Ra\x01Z6a\x05\x13V[a\x02`\x82\x01Ra\x04\xC45a\x02\x80\x82\x01Ra\x04\xE45a\x02\xA0\x82\x01Ra\x01}6a\x075V[a\x01\x866a\x07uV[\x91a\x08\xD1V[`@Q\x90\x15\x15\x81R\x90\x81\x90` \x82\x01\x90V[\x03\x90\xF3[`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q\x90a\x02\xC0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[a\x01\xA7V[`@Q\x90`@\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90a\x02\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90`\x80\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90``\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90a\x01\0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@\x90`C\x19\x01\x12a\x01\xA2Wa\x02\x99a\x01\xE3V[\x90`D5\x82R`d5` \x83\x01RV[`@\x90`\x83\x19\x01\x12a\x01\xA2Wa\x02\xBDa\x01\xE3V[\x90`\x845\x82R`\xA45` \x83\x01RV[`@\x90`\xC3\x19\x01\x12a\x01\xA2Wa\x02\xE1a\x01\xE3V[\x90`\xC45\x82R`\xE45` \x83\x01RV[`@\x90a\x01\x03\x19\x01\x12a\x01\xA2Wa\x03\x06a\x01\xE3V[\x90a\x01\x045\x82Ra\x01$5` \x83\x01RV[`@\x90a\x01C\x19\x01\x12a\x01\xA2Wa\x03-a\x01\xE3V[\x90a\x01D5\x82Ra\x01d5` \x83\x01RV[`@\x90a\x01\x83\x19\x01\x12a\x01\xA2Wa\x03Ta\x01\xE3V[\x90a\x01\x845\x82Ra\x01\xA45` \x83\x01RV[`@\x90a\x01\xC3\x19\x01\x12a\x01\xA2Wa\x03{a\x01\xE3V[\x90a\x01\xC45\x82Ra\x01\xE45` \x83\x01RV[`@\x90a\x02\x03\x19\x01\x12a\x01\xA2Wa\x03\xA2a\x01\xE3V[\x90a\x02\x045\x82Ra\x02$5` \x83\x01RV[`@\x90a\x02C\x19\x01\x12a\x01\xA2Wa\x03\xC9a\x01\xE3V[\x90a\x02D5\x82Ra\x02d5` \x83\x01RV[`@\x90a\x02\x83\x19\x01\x12a\x01\xA2Wa\x03\xF0a\x01\xE3V[\x90a\x02\x845\x82Ra\x02\xA45` \x83\x01RV[`@\x90a\x02\xC3\x19\x01\x12a\x01\xA2Wa\x04\x17a\x01\xE3V[\x90a\x02\xC45\x82Ra\x02\xE45` \x83\x01RV[`@\x90a\x03\x03\x19\x01\x12a\x01\xA2Wa\x04>a\x01\xE3V[\x90a\x03\x045\x82Ra\x03$5` \x83\x01RV[`@\x90a\x03C\x19\x01\x12a\x01\xA2Wa\x04ea\x01\xE3V[\x90a\x03D5\x82Ra\x03d5` \x83\x01RV[`@\x90a\x03\x83\x19\x01\x12a\x01\xA2Wa\x04\x8Ca\x01\xE3V[\x90a\x03\x845\x82Ra\x03\xA45` \x83\x01RV[`@\x90a\x03\xC3\x19\x01\x12a\x01\xA2Wa\x04\xB3a\x01\xE3V[\x90a\x03\xC45\x82Ra\x03\xE45` \x83\x01RV[`@\x90a\x04\x03\x19\x01\x12a\x01\xA2Wa\x04\xDAa\x01\xE3V[\x90a\x04\x045\x82Ra\x04$5` \x83\x01RV[`@\x90a\x04C\x19\x01\x12a\x01\xA2Wa\x05\x01a\x01\xE3V[\x90a\x04D5\x82Ra\x04d5` \x83\x01RV[`@\x90a\x04\x83\x19\x01\x12a\x01\xA2Wa\x05(a\x01\xE3V[\x90a\x04\x845\x82Ra\x04\xA45` \x83\x01RV[`@\x90a\x06\x03\x19\x01\x12a\x01\xA2Wa\x05Oa\x01\xE3V[\x90a\x06\x045\x82Ra\x06$5` \x83\x01RV[`@\x90a\x06C\x19\x01\x12a\x01\xA2Wa\x05va\x01\xE3V[\x90a\x06D5\x82Ra\x06d5` \x83\x01RV[`@\x90a\x06\x83\x19\x01\x12a\x01\xA2Wa\x05\x9Da\x01\xE3V[\x90a\x06\x845\x82Ra\x06\xA45` \x83\x01RV[`@\x90a\x06\xC3\x19\x01\x12a\x01\xA2Wa\x05\xC4a\x01\xE3V[\x90a\x06\xC45\x82Ra\x06\xE45` \x83\x01RV[`@\x90a\x07\x03\x19\x01\x12a\x01\xA2Wa\x05\xEBa\x01\xE3V[\x90a\x07\x045\x82Ra\x07$5` \x83\x01RV[`@\x90a\x07C\x19\x01\x12a\x01\xA2Wa\x06\x12a\x01\xE3V[\x90a\x07D5\x82Ra\x07d5` \x83\x01RV[`@\x90a\x07\x83\x19\x01\x12a\x01\xA2Wa\x069a\x01\xE3V[\x90a\x07\x845\x82Ra\x07\xA45` \x83\x01RV[`@\x90a\x07\xC3\x19\x01\x12a\x01\xA2Wa\x06`a\x01\xE3V[\x90a\x07\xC45\x82Ra\x07\xE45` \x83\x01RV[`@\x90a\x08\x03\x19\x01\x12a\x01\xA2Wa\x06\x87a\x01\xE3V[\x90a\x08\x045\x82Ra\x08$5` \x83\x01RV[`@\x90a\x08C\x19\x01\x12a\x01\xA2Wa\x06\xAEa\x01\xE3V[\x90a\x08D5\x82Ra\x08d5` \x83\x01RV[`@\x90a\x08\x83\x19\x01\x12a\x01\xA2Wa\x06\xD5a\x01\xE3V[\x90a\x08\x845\x82Ra\x08\xA45` \x83\x01RV[`@\x90a\x08\xC3\x19\x01\x12a\x01\xA2Wa\x06\xFCa\x01\xE3V[\x90a\x08\xC45\x82Ra\x08\xE45` \x83\x01RV[`@\x90a\t\x03\x19\x01\x12a\x01\xA2Wa\x07#a\x01\xE3V[\x90a\t\x045\x82Ra\t$5` \x83\x01RV[\x80a\x05#\x12\x15a\x01\xA2Wa\x07Ga\x02dV[\x90\x81a\x06\x04\x91\x82\x11a\x01\xA2Wa\x05\x04\x90[\x82\x82\x10a\x07eWPPP\x90V[\x815\x81R` \x91\x82\x01\x91\x01a\x07XV[\x90a\x04\x80a\x06\x03\x19\x83\x01\x12a\x01\xA2Wa\x08>a\x07\x8Fa\x02\x03V[\x92a\x07\x99\x81a\x05:V[\x84Ra\x07\xA4\x81a\x05aV[` \x85\x01Ra\x07\xB2\x81a\x05\x88V[`@\x85\x01Ra\x07\xC0\x81a\x05\xAFV[``\x85\x01Ra\x07\xCE\x81a\x05\xD6V[`\x80\x85\x01Ra\x07\xDC\x81a\x05\xFDV[`\xA0\x85\x01Ra\x07\xEA\x81a\x06$V[`\xC0\x85\x01Ra\x07\xF8\x81a\x06KV[`\xE0\x85\x01Ra\x08\x06\x81a\x06rV[a\x01\0\x85\x01Ra\x08\x15\x81a\x06\x99V[a\x01 \x85\x01Ra\x08$\x81a\x06\xC0V[a\x01@\x85\x01Ra\x083\x81a\x06\xE7V[a\x01`\x85\x01Ra\x07\x0EV[a\x01\x80\x83\x01Ra\tD5a\x01\xA0\x83\x01Ra\td5a\x01\xC0\x83\x01Ra\t\x845a\x01\xE0\x83\x01Ra\t\xA45a\x02\0\x83\x01Ra\t\xC45a\x02 \x83\x01Ra\t\xE45a\x02@\x83\x01Ra\n\x045a\x02`\x83\x01Ra\n$5a\x02\x80\x83\x01Ra\nD5a\x02\xA0\x83\x01Ra\nd5a\x02\xC0\x83\x01RV[\x90`\x08\x81\x10\x15a\x08\xBBW`\x05\x1B\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x90a\nx\x92\x91a\x08\xE1\x83Qa\x0C\x97V[a\x08\xEE` \x84\x01Qa\x0C\x97V[a\x08\xFB`@\x84\x01Qa\x0C\x97V[a\t\x08``\x84\x01Qa\x0C\x97V[a\t\x15`\x80\x84\x01Qa\x0C\x97V[a\t\"`\xA0\x84\x01Qa\x0C\x97V[a\t/`\xC0\x84\x01Qa\x0C\x97V[a\t<`\xE0\x84\x01Qa\x0C\x97V[a\tJa\x01\0\x84\x01Qa\x0C\x97V[a\tXa\x01 \x84\x01Qa\x0C\x97V[a\tfa\x01@\x84\x01Qa\x0C\x97V[a\tta\x01`\x84\x01Qa\x0C\x97V[a\t\x82a\x01\x80\x84\x01Qa\x0C\x97V[a\t\x90a\x01\xA0\x84\x01Qa\n{V[a\t\x9Ea\x01\xC0\x84\x01Qa\n{V[a\t\xACa\x01\xE0\x84\x01Qa\n{V[a\t\xBAa\x02\0\x84\x01Qa\n{V[a\t\xC8a\x02 \x84\x01Qa\n{V[a\t\xD6a\x02@\x84\x01Qa\n{V[a\t\xE4a\x02`\x84\x01Qa\n{V[a\t\xF2a\x02\x80\x84\x01Qa\n{V[a\n\0a\x02\xA0\x84\x01Qa\n{V[a\n\x0Ea\x02\xC0\x84\x01Qa\n{V[a\n\x18\x82Qa\n{V[a\n%` \x83\x01Qa\n{V[a\n2`@\x83\x01Qa\n{V[a\n?``\x83\x01Qa\n{V[a\nL`\x80\x83\x01Qa\n{V[a\nY`\xA0\x83\x01Qa\n{V[a\nf`\xC0\x83\x01Qa\n{V[a\ns`\xE0\x83\x01Qa\n{V[a\n\xEDV[\x90V[`\0\x80Q` a)\x96\x839\x81Q\x91R\x11\x15a\n\x92WV[`@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\x90\xFD[a\n\xDFa\x01\xE3V[\x90`\0\x82R`\0` \x83\x01RV[`\x08` \x82\x01Q\x03a\x0C\x85Wa\x0B\x04\x83\x83\x83a\r\x85V[\x92\x81Qa\x0B\x10\x90a\x12rV[\x90`\xA0\x85\x01\x93\x84Q\x90a\x0B#\x91\x84a\x16\x9BV[\x92a\x0B,a\n\xD7V[Pa\x0B5a\n\xD7V[Pa\x01`\x82\x01\x90\x81Q\x92a\x01\x80\x81\x01\x95\x86Q\x94`\xE0\x8A\x01\x95\x86Qa\x0BX\x91a\x17NV[a\x0Ba\x91a\x17\x9BV[\x98a\x0Bk\x93a\x18#V[\x90a\x0Bu\x90a\x1B\xF7V[a\x0B~\x91a\x17\x9BV[\x90Q\x85Qa\x0B\x8B\x91a\x17NV[a\x0B\x94\x91a\x17\x9BV[\x93Q\x91`\0\x80Q` a)\x96\x839\x81Q\x91R\x92`@\x84\x92\x01Q` \x01Q\x90\t\x90Q\x90\t\x90Q\x90a\x0B\xC3\x91a\x17NV[a\x0B\xCC\x91a\x17\x9BV[a\x0B\xD4a\x02$V[\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\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1` \x82\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`@\x82\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4``\x82\x01R\x90a\x0Cs\x90a\x1B\xF7V[a\x0C{a\x1C_V[\x91a\nx\x93a\x1DhV[`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x90\xFD[\x80Q` \x82\x01Q\x15\x90\x15\x16a\r2W` \x81Q\x91\x01Q\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x80\x80`\x03\x81\x80\x86\x80\t\x86\t\x08\x81\x85\x80\t\x14\x93\x10\x91\x10\x16\x16\x15a\x0C\xEDWV[`@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\x90\xFD[PV[`@Q\x90a\x01\0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@R\x81`\xE0`\0\x91\x82\x81R\x82` \x82\x01R\x82`@\x82\x01R\x82``\x82\x01R\x82`\x80\x82\x01R\x82`\xA0\x82\x01R\x82`\xC0\x82\x01R\x01RV[`\xA0\x90` a\x01\x80`\0\x80Q` a)\x96\x839\x81Q\x91R\x94\x96\x95`\xE0a\r\xA9a\r5V[\x98\x84`\xC0`@Q\x97`\x7F`\xE1\x1B\x83\x8A\x01R\x80Q\x82\x1B`$\x8A\x01R\x82\x81\x01Q\x82\x1B`,\x8A\x01Ra\x02\x80\x81\x01Q`@\x8A\x01Ra\x02\xA0\x81\x01Q``\x8A\x01R`\x01`\x80\x8A\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85`\x80\x82\x01R\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D`\xA0\x82\x01R\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD`\xC0\x82\x01R\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD`\xE0\x82\x01Ra\x13\xA3a\x02DV[\x90`\x10\x82R\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` \x83\x01R`@\x82\x01R\x90V[b\x10\0\0\x81\x14a\x15IW` \x03a\x157Wa\x13\xEFa\x02dV[`\x01\x81R\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!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B`@\x82\x01R\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;``\x82\x01R\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80`\x80\x82\x01R\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE`\xA0\x82\x01R\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C`\xC0\x82\x01R~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90`\xE0\x82\x01Ra\x15\x04a\x02DV[\x90`\x05\x82R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01` \x83\x01R`@\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x90\xFD[Pa\x15Ra\x02dV[`\x01\x81R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW` \x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD`@\x82\x01R\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B``\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`\x80\x82\x01R\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18`\xA0\x82\x01R\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\`\xC0\x82\x01R\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC`\xE0\x82\x01Ra\x16ha\x02DV[\x90`\x14\x82R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01` \x83\x01R`@\x82\x01R\x90V[\x91\x92\x90\x92a\x16\xA7a\x02DV[\x92`\0\x84R` \x84\x01\x94`\0\x86R`@\x85\x01\x92`\0\x84R\x85\x83Q\x97\x83`\0\x14a\x17\x1DW\x83\x98`\0\x90[\x80\x82\x10a\x16\xFFWPPa\x16\xF2a\x16\xFB\x96\x97\x98\x99`\0\x19\x01[\x80\x84R\x85\x87a\x1D\xEFV[\x90RQ\x92a\x1EhV[\x90RV[\x90\x99`\0\x80Q` a)\x96\x839\x81Q\x91R\x81`\x01\x92\t\x9A\x01\x90a\x16\xD0V[a\x16\xFB\x95\x96\x97\x98Pa\x16\xF2\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a\x16\xE8V[``\x90\x92\x91\x92`\x80a\x17^a\x01\xE3V[\x91`\0\x83R`\0` \x84\x01R\x82\x95` a\x17va\x02DV[\x92\x866\x857\x80Q\x84R\x01Q` \x83\x01R`@\x82\x01R`\x07a\x07\xCF\x19Z\x01\xFA\x15a\x01\xA2WV[``\x90\x92\x91\x92`\xC0a\x17\xABa\x01\xE3V[\x91`\0\x83R`\0` \x84\x01R` \x83\x96\x81a\x17\xC4a\x02$V[\x93`\x806\x867\x80Q\x85R\x01Q\x82\x84\x01R\x80Q`@\x84\x01R\x01Q\x84\x82\x01R`\x06a\x07\xCF\x19Z\x01\xFA\x15a\x01\xA2WV[\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x82\x03\x91\x82\x11a\x18\rWV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x90\x91a\x18-a\n\xD7V[Pa\x186a\n\xD7V[Pa\x18C\x84\x82\x85\x85a\x1F\xD6V[\x90a\x18O\x90\x85\x85a'\xE2V[a\x18X\x90a\x17\xF1V[`\xC0\x84\x01Q\x80\x80\x80\x80\x95\x81\x95a\x01\xA0\x8B\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x84\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90\x82\x8BQ\x90a\x18\x9B\x91a\x17NV[a\x18\xA4\x91a\x17\x9BV[\x90a\x01\xC0\x8B\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x84\x80\t\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x83\x80\t` \x8C\x01Q\x90a\x19\x02\x91a\x17NV[a\x19\x0B\x91a\x17\x9BV[\x90\x82`\0\x80Q` a)\x96\x839\x81Q\x91R\x81\x80\t\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x01\xE0\x8C\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x91\x81`@\x8D\x01Q\x90a\x19l\x91a\x17NV[a\x19u\x91a\x17\x9BV[\x92`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x02\0\x8B\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x91\x81``\x8C\x01Q\x90a\x19\xC2\x91a\x17NV[a\x19\xCB\x91a\x17\x9BV[\x93`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x02 \x8A\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x92\x81`\x80\x8B\x01Q\x90a\x1A\x18\x91a\x17NV[a\x1A!\x91a\x17\x9BV[\x92a\x02@\x8A\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x84\x84\t\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x92`\0\x80Q` a)\x96\x839\x81Q\x91R\x83\x83\t`@\x89\x01Q\x90a\x1A\x7F\x91a\x17NV[a\x1A\x88\x91a\x17\x9BV[\x93`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x02`\x88\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x91\x81``\x87\x01Q\x90a\x1A\xE7\x91a\x17NV[a\x1A\xF0\x91a\x17\x9BV[\x92`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x02\x80\x87\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x91\x81`\x80\x86\x01Q\x90a\x1B=\x91a\x17NV[a\x1BF\x91a\x17\x9BV[\x92`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x02\xA0\x86\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x92`\xA0\x01Q\x90a\x1B\x91\x91a\x17NV[a\x1B\x9A\x91a\x17\x9BV[\x91`\xE0\x01Q\x90a\x02\xC0\x84\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x92`\xA0\x01Q\x90a\x1B\xD8\x91a\x17NV[a\x1B\xE1\x91a\x17\x9BV[\x90a\x1B\xEAa(\xA0V[\x90a\x1B\xF4\x91a\x17NV[\x91V[`\0` a\x1C\x03a\x01\xE3V[\x82\x81R\x01R\x80Q` \x82\x01Q\x15\x90\x15\x16a\nxW` \x81Q\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x82\x91\x01Q\x06\x81\x03\x90\x81\x11a\x18\rWa\x1CTa\x01\xE3V[\x91\x82R` \x82\x01R\x90V[`\0``a\x1Cka\x02$V[\x82\x81R\x82` \x82\x01R\x82`@\x82\x01R\x01Ra\x1C\x84a\x02$V[\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2` \x82\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA`@\x82\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[``\x82\x01R\x90V[\x15a\x1D#WV[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x90\xFD[\x91`@a\x01\x80\x92\x94`\0\x94\x82Q\x93\x81Q\x85R\x83` \x98\x89\x80\x94\x01Q\x84\x88\x01R\x83\x81\x01Q\x82\x88\x01R\x80Q``\x88\x01R``\x81\x01Q`\x80\x88\x01R\x01Q`\xA0\x86\x01R\x80Q`\xC0\x86\x01R\x01Q`\xE0\x84\x01R\x85\x81\x01Qa\x01\0\x84\x01R\x80Qa\x01 \x84\x01R``\x81\x01Qa\x01@\x84\x01R\x01Qa\x01`\x82\x01R`\x08Z\xFAa\x1D\xEA`\0Q\x91a\x1D\x1CV[\x15\x15\x90V[`\x01\x82\x14a\x1E`W\x82\x15a\x1EXW` \x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x92\x83\x91\x90\t\x90\x80\x15a\x1E.Wa\x1E)\x90`\0\x19\x01a(\xC7V[\x90\t\x90V[Pa\x1E)\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a(\xC7V[PPP`\0\x90V[PPP`\x01\x90V[\x93\x92\x91\x90\x91\x80\x15a\x1FrWa\x1E~\x92\x91\x92a\x128V[\x91`\xE0\x83\x01\x93`@\x87\x01\x94`\xE0\x86Q\x01\x90`\x01\x90`\x01\x81R`\x01\x90[`\x08\x82\x10a\x1F8WPPPP`\0\x94`\x01\x94\x92\x90Q\x90`\0\x90[`\x08\x82\x10a\x1E\xEDWPPPPP\x93a\x1E\xE3\x91` \x94\x95`\0\x80Q` a)\x96\x839\x81Q\x91R\x95\x86\x94\x85\x93a(\xC7V[\x93\x01Q\x90\t\t\t\x90V[\x90\x91\x92\x93\x95\x96`\x01\x90\x84Q\x98\x89\x87\x8A`\0\x80Q` a)\x96\x839\x81Q\x91R\x94\x85\x80\x94\x81\x80\x94\x81\x8CQ\x91Q\x8A\t\t\t\x90\x08\x9B\x82\x03\x08\x90\t\x96` \x80\x80\x92\x01\x93\x01\x94\x01\x92\x01\x90\x93\x92a\x1E\xB4V[`\x01\x90`\x1F\x99\x95\x96\x99\x19\x80\x91\x01\x93`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x81\x89\x88Q\x82\x03\x08\x90\t\x94\x85\x85R\x01\x91\x01\x90\x92\x91\x97\x94\x93\x97a\x1E\x9AV[P\x91\x92`\x01\x92\x91`\0\x91\x90\x84[`\x08\x84\x10a\x1F\x92WPPPPPP`\0\x90V[\x80\x85\x14a\x1F\xC3W`\0\x80Q` a)\x96\x839\x81Q\x91R\x86\x91a\x1F\xB8`@\x86\x01Q` \x01\x90V[Q\x90\t\x93\x01\x92a\x1F\x7FV[P\x91\x92PPa\x1F\xD2\x92Pa\x08\xAAV[Q\x90V[\x92\x91\x92a\x1F\xE1a\n\xD7V[P`\x80\x82\x01Q` \x85\x01Q` \x84\x01Q\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90\x83Q\x90`\xA0\x85\x01Q``\x86\x01Q\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x91\x81a\x01\xA0\x88\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x85\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x81a\x01\xC0\x88\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\x91a\x17NV[\x82Q``\x84\x01Q\x90\x81`\x80\x86\x01Q\x91a\x02\xC0\x88\x01Q\x91`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x81a\x02@\x88\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x85\ta\x01\xA0\x89\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x81a\x02`\x88\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x85\ta\x01\xC0\x89\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x81a\x02\x80\x88\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x85\ta\x01\xE0\x89\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x91a\x02\xA0\x87\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x02\0\x87\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\xC0\x83\x01Q\x90a#\xD1\x90a\x17\xF1V[a#\xDA\x91a\x17NV[a#\xE3\x91a\x17\x9BV[`\xE0\x82\x01Qa\x01\xA0\x85\x01Qa#\xF7\x91a\x17NV[a$\0\x91a\x17\x9BV[a\x01\0\x82\x01Qa\x01\xC0\x85\x01Qa$\x15\x91a\x17NV[a$\x1E\x91a\x17\x9BV[a\x01 \x82\x01Qa\x01\xE0\x85\x01Qa$3\x91a\x17NV[a$<\x91a\x17\x9BV[a\x01@\x82\x01Qa\x02\0\x85\x01Qa$Q\x91a\x17NV[a$Z\x91a\x17\x9BV[a\x01\xC0\x84\x01Qa\x01\xA0\x85\x01Q\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x01`\x83\x01Q\x90a$\x88\x91a\x17NV[a$\x91\x91a\x17\x9BV[a\x02\0\x84\x01Qa\x01\xE0\x85\x01Q\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x01\x80\x83\x01Q\x90a$\xBF\x91a\x17NV[a$\xC8\x91a\x17\x9BV[a\x01\xA0\x84\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x81\x80\t\x80`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x01\xE0\x83\x01Q\x90a%\x13\x91a\x17NV[a%\x1C\x91a\x17\x9BV[a\x01\xC0\x84\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x81\x80\t\x80`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x02\0\x83\x01Q\x90a%g\x91a\x17NV[a%p\x91a\x17\x9BV[a\x01\xE0\x84\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x81\x80\t\x80`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x02 \x83\x01Q\x90a%\xBB\x91a\x17NV[a%\xC4\x91a\x17\x9BV[a\x02\0\x84\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x81\x80\t\x80`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x02@\x83\x01Q\x90a&\x0F\x91a\x17NV[a&\x18\x91a\x17\x9BV[a\x01\xA0\x82\x01Qa\x02 \x85\x01Qa&-\x90a)wV[a&6\x91a\x17NV[a&?\x91a\x17\x9BV[a\x01\xC0\x82\x01Qa&N\x91a\x17\x9BV[\x90a\x01\xC0\x84\x01Qa\x01\xA0\x85\x01Q\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x01\xE0\x85\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x02\0\x85\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x02 \x85\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x02`\x01Q\x90a&\xC2\x91a\x17NV[a&\xCB\x91a\x17\x9BV[\x90\x83Qa&\xD7\x90a)wV[\x91\x82`\xC0\x85\x01Q\x90a&\xE8\x91a\x17NV[a&\xF1\x91a\x17\x9BV[\x93Q`\x01`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\xA0\x01Q\x80`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x80\x93`\0\x80Q` a)\x96\x839\x81Q\x91R\x82\x80\x94\t\x90\x81`\xE0\x86\x01Q\x90a'T\x91a\x17NV[a']\x91a\x17\x9BV[\x91`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90\x81a\x01\0\x85\x01Q\x90a'\x81\x91a\x17NV[a'\x8A\x91a\x17\x9BV[\x91`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90\x81a\x01 \x84\x01Q\x90a'\xAE\x91a\x17NV[a'\xB7\x91a\x17\x9BV[\x92`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x01@\x01Q\x90a'\xD9\x91a\x17NV[a\nx\x91a\x17\x9BV[\x90`@` \x84\x01Q\x93\x01Q\x92``\x83\x01Q`\x80\x84\x01Q\x94a\x01\xA0\x84\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x87\x81\x87\x81\x80\x80\x9C\x98\x81\x80\x80\x80\x9E\x81\x80\x9E\x9C\x81\x80\x9E\x81a\x02@\x81\x96\x01Q\x8A\t\x92\x08\x08`\x01\t\x81a\x01\xC0\x89\x01Q\x81\x8C\x81a\x02`\x8D\x01Q\x8A\t\x92\x08\x08\x90\t\x81a\x01\xE0\x88\x01Q\x81\x8B\x81a\x02\x80\x8C\x01Q\x89\t\x92\x08\x08\x90\t\x91\x81\x88\x81a\x02\0\x89\x01Q\x93a\x02\xA0\x8A\x01Q\x90\t\x92\x08\x08\x90\t\x93a\x02\xC0a\x02 \x84\x01Q\x93\x01Q\x92\x08\t\x90\t\x93` \x87Q\x97\x01Q\t\x82\x03\x90\x08\x92\t\x82\x03\x90\x08\x90V[`\0` a(\xACa\x01\xE3V[\x82\x81R\x01Ra(\xB9a\x01\xE3V[`\x01\x81R`\x02` \x82\x01R\x90V[\x90`@Q\x91`\0`\xC0` \x94\x85\x93\x84\x82R\x84\x80\x83\x01R\x84`@\x83\x01R``\x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xEF\xFF\xFF\xFF`\x80\x82\x01R`\0\x80Q` a)\x96\x839\x81Q\x91R`\xA0\x82\x01R`\x05Z\xFA\x91`\0Q\x92\x15a)3WPV[`d\x90`@Q\x90bF\x1B\xCD`\xE5\x1B\x82R`\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R\xFD[`\0\x80Q` a)\x96\x839\x81Q\x91R\x80\x91\x06\x81\x03\x90\x81\x11a\x18\rW\x90V\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n"; + const __BYTECODE: &[u8] = b"a#\xA2a\0:`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14a\0-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`\x046\x10a\x005W`\x005`\xE0\x1C\x80c\xA1\xF1\xA3N\x14a\0:W[`\0\x80\xFD[a\0Ma\0H6`\x04a!$V[a\0aV[`@Q\x90\x15\x15\x81R` \x01`@Q\x80\x91\x03\x90\xF3[`\0a\0l\x82a\0\xDFV[a\0}\x83`\0[` \x02\x01Qa\x02\x1AV[a\0\x88\x83`\x01a\0sV[a\0\x93\x83`\x02a\0sV[a\0\x9E\x83`\x03a\0sV[a\0\xA9\x83`\x04a\0sV[a\0\xB4\x83`\x05a\0sV[a\0\xBF\x83`\x06a\0sV[a\0\xCA\x83`\x07a\0sV[a\0\xD5\x84\x84\x84a\x02\x81V[\x90P[\x93\x92PPPV[\x80Qa\0\xEA\x90a\x04\x80V[a\0\xF7\x81` \x01Qa\x04\x80V[a\x01\x04\x81`@\x01Qa\x04\x80V[a\x01\x11\x81``\x01Qa\x04\x80V[a\x01\x1E\x81`\x80\x01Qa\x04\x80V[a\x01+\x81`\xA0\x01Qa\x04\x80V[a\x018\x81`\xC0\x01Qa\x04\x80V[a\x01E\x81`\xE0\x01Qa\x04\x80V[a\x01S\x81a\x01\0\x01Qa\x04\x80V[a\x01a\x81a\x01 \x01Qa\x04\x80V[a\x01o\x81a\x01@\x01Qa\x04\x80V[a\x01}\x81a\x01`\x01Qa\x04\x80V[a\x01\x8B\x81a\x01\x80\x01Qa\x04\x80V[a\x01\x99\x81a\x01\xA0\x01Qa\x02\x1AV[a\x01\xA7\x81a\x01\xC0\x01Qa\x02\x1AV[a\x01\xB5\x81a\x01\xE0\x01Qa\x02\x1AV[a\x01\xC3\x81a\x02\0\x01Qa\x02\x1AV[a\x01\xD1\x81a\x02 \x01Qa\x02\x1AV[a\x01\xDF\x81a\x02@\x01Qa\x02\x1AV[a\x01\xED\x81a\x02`\x01Qa\x02\x1AV[a\x01\xFB\x81a\x02\x80\x01Qa\x02\x1AV[a\x02\t\x81a\x02\xA0\x01Qa\x02\x1AV[a\x02\x17\x81a\x02\xC0\x01Qa\x02\x1AV[PV[`\0\x80Q` a#v\x839\x81Q\x91R\x81\x10\x80a\x02}W`@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\x01[`@Q\x80\x91\x03\x90\xFD[PPV[`\0\x83` \x01Q`\x08\x14a\x02\xA8W`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x02\xB5\x85\x85\x85a\x05/V[\x90P`\0a\x02\xC6\x86`\0\x01Qa\n\xA6V[\x90P`\0a\x02\xD9\x82\x84`\xA0\x01Q\x88a\x0E\xF8V[\x90Pa\x02\xF8`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x03-\x87a\x01`\x01Qa\x03(\x89a\x01\x80\x01Q\x88`\xE0\x01Qa\x0FXV[a\x0F\xFCV[\x91P`\0\x80a\x03>\x8B\x88\x87\x8Ca\x10\xA3V[\x91P\x91Pa\x03O\x81a\x03(\x84a\x12\xE3V[\x92Pa\x03h\x83a\x03(\x8Ba\x01`\x01Q\x8A`\xA0\x01Qa\x0FXV[`\xA0\x88\x01Q`@\x88\x01Q` \x01Q\x91\x94P`\0\x80Q` a#v\x839\x81Q\x91R\x91\x82\x90\x82\t\x90P\x81`\xE0\x8A\x01Q\x82\t\x90Pa\x03\xAC\x85a\x03(\x8Da\x01\x80\x01Q\x84a\x0FXV[\x94P`\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\x04n\x87\x82a\x04a\x89a\x12\xE3V[a\x04ia\x13\x82V[a\x14SV[\x9E\x9DPPPPPPPPPPPPPPV[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x04\xBAWPPPV[\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\x05*W`@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\x02tV[PPPV[a\x05w`@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[`\0`\0\x80Q` a#v\x839\x81Q\x91R\x90P`@Q` \x81\x01`\0\x81R`\xFE`\xE0\x1B\x81R\x86Q`\xC0\x1B`\x04\x82\x01R` \x87\x01Q`\xC0\x1B`\x0C\x82\x01Ra\x02\x80\x87\x01Q` \x82\x01Ra\x02\xA0\x87\x01Q`@\x82\x01R`\x01``\x82\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81R` \x01\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\r{W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\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\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81R` \x01\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x0E\xDFW`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81R` \x01~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\x1C`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a\x0F&\x84\x84a\x157V[\x80\x82Ra\x0F6\x90\x85\x90\x85\x90a\x15\x8BV[` \x82\x01R\x80Qa\x0FL\x90\x85\x90\x84\x90\x86\x90a\x15\xFFV[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x0Fta\x1E\x19V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0F\xA6W`\0\x80\xFD[P\x80a\x0F\xF4W`@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\x02tV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x10\x18a\x1E7V[\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\x10UW`\0\x80\xFD[P\x80a\x0F\xF4W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02tV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0a\x10\xD9\x87\x87\x87\x87a\x17UV[\x90P`\0\x80Q` a#v\x839\x81Q\x91R`\0a\x10\xF7\x88\x87\x89a\x1C%V[\x90Pa\x11\x03\x81\x83a#\x1CV[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x110\x85a\x03(\x8A`\0\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11X\x86a\x03(\x8A` \x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x80\x86a\x03(\x8A`@\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xA8\x86a\x03(\x8A``\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xD0\x86a\x03(\x8A`\x80\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xF8\x86a\x03(\x8D`@\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x12 \x86a\x03(\x8D``\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x12H\x86a\x03(\x8D`\x80\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x12p\x86a\x03(\x8D`\xA0\x01Q\x84a\x0FXV[\x95P`\0\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x12\x9B\x87a\x03(\x8B`\xA0\x01Q\x84a\x0FXV[\x96Pa\x12\xD2a\x12\xCC`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x0FXV[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x13\x0BWP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x13P\x91\x90a#SV[a\x13z\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa#\x1CV[\x90R\x92\x91PPV[a\x13\xAD`@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\x80a\x15)W`@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\x02tV[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q`\0\x90`\0\x80Q` a#v\x839\x81Q\x91R\x90\x83\x80\x15a\x15{W\x84\x93P`\0[\x82\x81\x10\x15a\x15oW\x83\x85\x86\t\x94P`\x01\x01a\x15YV[P`\x01\x84\x03\x93Pa\x15\x82V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a\x15\x9DWP`\x01a\0\xD8V[\x81`\0\x03a\x15\xADWP`\0a\0\xD8V[` \x84\x01Q`\0\x80Q` a#v\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x15\xDDW`\x01\x87\x03\x92Pa\x15\xE4V[`\x01\x84\x03\x92P[Pa\x15\xEE\x82a\x1D\x15V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[`\0`\0\x80Q` a#v\x839\x81Q\x91R\x82\x82\x03a\x16|W`\x01`\0[`\x08\x81\x10\x15a\x16pW\x81\x86\x03a\x16MW\x86\x81`\x08\x81\x10a\x16>Wa\x16>a#\x06V[` \x02\x01Q\x93PPPPa\x15/V[\x82\x80a\x16[Wa\x16[a#=V[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x16\x1CV[P`\0\x92PPPa\x15/V[a\x16\x84a\x1EUV[`@\x87\x01Q`\x01`\xE0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x08\x81\x10\x15a\x16\xC5W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x16\x98V[PPPP`\0\x80`\0\x90P`\x01\x83\x89`@\x8C\x01Q`\0[`\x08\x81\x10\x15a\x17\x1CW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x16\xDCV[PPPP\x80\x92PP`\0a\x17/\x83a\x1D\x15V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0\x80`\0\x80`\0`\0\x80Q` a#v\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7Xa\x01\xE3V[\x90a\x03\x045\x82Ra\x03$5` \x83\x01RV[`@\x90a\x03C\x19\x01\x12a\x01\xA2Wa\x04ea\x01\xE3V[\x90a\x03D5\x82Ra\x03d5` \x83\x01RV[`@\x90a\x03\x83\x19\x01\x12a\x01\xA2Wa\x04\x8Ca\x01\xE3V[\x90a\x03\x845\x82Ra\x03\xA45` \x83\x01RV[`@\x90a\x03\xC3\x19\x01\x12a\x01\xA2Wa\x04\xB3a\x01\xE3V[\x90a\x03\xC45\x82Ra\x03\xE45` \x83\x01RV[`@\x90a\x04\x03\x19\x01\x12a\x01\xA2Wa\x04\xDAa\x01\xE3V[\x90a\x04\x045\x82Ra\x04$5` \x83\x01RV[`@\x90a\x04C\x19\x01\x12a\x01\xA2Wa\x05\x01a\x01\xE3V[\x90a\x04D5\x82Ra\x04d5` \x83\x01RV[`@\x90a\x04\x83\x19\x01\x12a\x01\xA2Wa\x05(a\x01\xE3V[\x90a\x04\x845\x82Ra\x04\xA45` \x83\x01RV[`@\x90a\x06\x03\x19\x01\x12a\x01\xA2Wa\x05Oa\x01\xE3V[\x90a\x06\x045\x82Ra\x06$5` \x83\x01RV[`@\x90a\x06C\x19\x01\x12a\x01\xA2Wa\x05va\x01\xE3V[\x90a\x06D5\x82Ra\x06d5` \x83\x01RV[`@\x90a\x06\x83\x19\x01\x12a\x01\xA2Wa\x05\x9Da\x01\xE3V[\x90a\x06\x845\x82Ra\x06\xA45` \x83\x01RV[`@\x90a\x06\xC3\x19\x01\x12a\x01\xA2Wa\x05\xC4a\x01\xE3V[\x90a\x06\xC45\x82Ra\x06\xE45` \x83\x01RV[`@\x90a\x07\x03\x19\x01\x12a\x01\xA2Wa\x05\xEBa\x01\xE3V[\x90a\x07\x045\x82Ra\x07$5` \x83\x01RV[`@\x90a\x07C\x19\x01\x12a\x01\xA2Wa\x06\x12a\x01\xE3V[\x90a\x07D5\x82Ra\x07d5` \x83\x01RV[`@\x90a\x07\x83\x19\x01\x12a\x01\xA2Wa\x069a\x01\xE3V[\x90a\x07\x845\x82Ra\x07\xA45` \x83\x01RV[`@\x90a\x07\xC3\x19\x01\x12a\x01\xA2Wa\x06`a\x01\xE3V[\x90a\x07\xC45\x82Ra\x07\xE45` \x83\x01RV[`@\x90a\x08\x03\x19\x01\x12a\x01\xA2Wa\x06\x87a\x01\xE3V[\x90a\x08\x045\x82Ra\x08$5` \x83\x01RV[`@\x90a\x08C\x19\x01\x12a\x01\xA2Wa\x06\xAEa\x01\xE3V[\x90a\x08D5\x82Ra\x08d5` \x83\x01RV[`@\x90a\x08\x83\x19\x01\x12a\x01\xA2Wa\x06\xD5a\x01\xE3V[\x90a\x08\x845\x82Ra\x08\xA45` \x83\x01RV[`@\x90a\x08\xC3\x19\x01\x12a\x01\xA2Wa\x06\xFCa\x01\xE3V[\x90a\x08\xC45\x82Ra\x08\xE45` \x83\x01RV[`@\x90a\t\x03\x19\x01\x12a\x01\xA2Wa\x07#a\x01\xE3V[\x90a\t\x045\x82Ra\t$5` \x83\x01RV[\x80a\x05#\x12\x15a\x01\xA2Wa\x07Ga\x02dV[\x90\x81a\x06\x04\x91\x82\x11a\x01\xA2Wa\x05\x04\x90[\x82\x82\x10a\x07eWPPP\x90V[\x815\x81R` \x91\x82\x01\x91\x01a\x07XV[\x90a\x04\x80a\x06\x03\x19\x83\x01\x12a\x01\xA2Wa\x08>a\x07\x8Fa\x02\x03V[\x92a\x07\x99\x81a\x05:V[\x84Ra\x07\xA4\x81a\x05aV[` \x85\x01Ra\x07\xB2\x81a\x05\x88V[`@\x85\x01Ra\x07\xC0\x81a\x05\xAFV[``\x85\x01Ra\x07\xCE\x81a\x05\xD6V[`\x80\x85\x01Ra\x07\xDC\x81a\x05\xFDV[`\xA0\x85\x01Ra\x07\xEA\x81a\x06$V[`\xC0\x85\x01Ra\x07\xF8\x81a\x06KV[`\xE0\x85\x01Ra\x08\x06\x81a\x06rV[a\x01\0\x85\x01Ra\x08\x15\x81a\x06\x99V[a\x01 \x85\x01Ra\x08$\x81a\x06\xC0V[a\x01@\x85\x01Ra\x083\x81a\x06\xE7V[a\x01`\x85\x01Ra\x07\x0EV[a\x01\x80\x83\x01Ra\tD5a\x01\xA0\x83\x01Ra\td5a\x01\xC0\x83\x01Ra\t\x845a\x01\xE0\x83\x01Ra\t\xA45a\x02\0\x83\x01Ra\t\xC45a\x02 \x83\x01Ra\t\xE45a\x02@\x83\x01Ra\n\x045a\x02`\x83\x01Ra\n$5a\x02\x80\x83\x01Ra\nD5a\x02\xA0\x83\x01Ra\nd5a\x02\xC0\x83\x01RV[\x90`\x08\x81\x10\x15a\x08\xBBW`\x05\x1B\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x90a\nx\x92\x91a\x08\xE1\x83Qa\x0C\x97V[a\x08\xEE` \x84\x01Qa\x0C\x97V[a\x08\xFB`@\x84\x01Qa\x0C\x97V[a\t\x08``\x84\x01Qa\x0C\x97V[a\t\x15`\x80\x84\x01Qa\x0C\x97V[a\t\"`\xA0\x84\x01Qa\x0C\x97V[a\t/`\xC0\x84\x01Qa\x0C\x97V[a\t<`\xE0\x84\x01Qa\x0C\x97V[a\tJa\x01\0\x84\x01Qa\x0C\x97V[a\tXa\x01 \x84\x01Qa\x0C\x97V[a\tfa\x01@\x84\x01Qa\x0C\x97V[a\tta\x01`\x84\x01Qa\x0C\x97V[a\t\x82a\x01\x80\x84\x01Qa\x0C\x97V[a\t\x90a\x01\xA0\x84\x01Qa\n{V[a\t\x9Ea\x01\xC0\x84\x01Qa\n{V[a\t\xACa\x01\xE0\x84\x01Qa\n{V[a\t\xBAa\x02\0\x84\x01Qa\n{V[a\t\xC8a\x02 \x84\x01Qa\n{V[a\t\xD6a\x02@\x84\x01Qa\n{V[a\t\xE4a\x02`\x84\x01Qa\n{V[a\t\xF2a\x02\x80\x84\x01Qa\n{V[a\n\0a\x02\xA0\x84\x01Qa\n{V[a\n\x0Ea\x02\xC0\x84\x01Qa\n{V[a\n\x18\x82Qa\n{V[a\n%` \x83\x01Qa\n{V[a\n2`@\x83\x01Qa\n{V[a\n?``\x83\x01Qa\n{V[a\nL`\x80\x83\x01Qa\n{V[a\nY`\xA0\x83\x01Qa\n{V[a\nf`\xC0\x83\x01Qa\n{V[a\ns`\xE0\x83\x01Qa\n{V[a\n\xEDV[\x90V[`\0\x80Q` a)\x96\x839\x81Q\x91R\x11\x15a\n\x92WV[`@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\x90\xFD[a\n\xDFa\x01\xE3V[\x90`\0\x82R`\0` \x83\x01RV[`\x08` \x82\x01Q\x03a\x0C\x85Wa\x0B\x04\x83\x83\x83a\r\x85V[\x92\x81Qa\x0B\x10\x90a\x12rV[\x90`\xA0\x85\x01\x93\x84Q\x90a\x0B#\x91\x84a\x16\x9BV[\x92a\x0B,a\n\xD7V[Pa\x0B5a\n\xD7V[Pa\x01`\x82\x01\x90\x81Q\x92a\x01\x80\x81\x01\x95\x86Q\x94`\xE0\x8A\x01\x95\x86Qa\x0BX\x91a\x17NV[a\x0Ba\x91a\x17\x9BV[\x98a\x0Bk\x93a\x18#V[\x90a\x0Bu\x90a\x1B\xF7V[a\x0B~\x91a\x17\x9BV[\x90Q\x85Qa\x0B\x8B\x91a\x17NV[a\x0B\x94\x91a\x17\x9BV[\x93Q\x91`\0\x80Q` a)\x96\x839\x81Q\x91R\x92`@\x84\x92\x01Q` \x01Q\x90\t\x90Q\x90\t\x90Q\x90a\x0B\xC3\x91a\x17NV[a\x0B\xCC\x91a\x17\x9BV[a\x0B\xD4a\x02$V[\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\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1` \x82\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`@\x82\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4``\x82\x01R\x90a\x0Cs\x90a\x1B\xF7V[a\x0C{a\x1C_V[\x91a\nx\x93a\x1DhV[`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x90\xFD[\x80Q` \x82\x01Q\x15\x90\x15\x16a\r2W` \x81Q\x91\x01Q\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x80\x80`\x03\x81\x80\x86\x80\t\x86\t\x08\x81\x85\x80\t\x14\x93\x10\x91\x10\x16\x16\x15a\x0C\xEDWV[`@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\x90\xFD[PV[`@Q\x90a\x01\0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@R\x81`\xE0`\0\x91\x82\x81R\x82` \x82\x01R\x82`@\x82\x01R\x82``\x82\x01R\x82`\x80\x82\x01R\x82`\xA0\x82\x01R\x82`\xC0\x82\x01R\x01RV[`\xA0\x90` a\x01\x80`\0\x80Q` a)\x96\x839\x81Q\x91R\x94\x96\x95`\xE0a\r\xA9a\r5V[\x98\x84`\xC0`@Q\x97`\x7F`\xE1\x1B\x83\x8A\x01R\x80Q\x82\x1B`$\x8A\x01R\x82\x81\x01Q\x82\x1B`,\x8A\x01Ra\x02\x80\x81\x01Q`@\x8A\x01Ra\x02\xA0\x81\x01Q``\x8A\x01R`\x01`\x80\x8A\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85`\x80\x82\x01R\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D`\xA0\x82\x01R\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD`\xC0\x82\x01R\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD`\xE0\x82\x01Ra\x13\xA3a\x02DV[\x90`\x10\x82R\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` \x83\x01R`@\x82\x01R\x90V[b\x10\0\0\x81\x14a\x15IW` \x03a\x157Wa\x13\xEFa\x02dV[`\x01\x81R\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!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B`@\x82\x01R\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;``\x82\x01R\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80`\x80\x82\x01R\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE`\xA0\x82\x01R\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C`\xC0\x82\x01R~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90`\xE0\x82\x01Ra\x15\x04a\x02DV[\x90`\x05\x82R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01` \x83\x01R`@\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x90\xFD[Pa\x15Ra\x02dV[`\x01\x81R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW` \x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD`@\x82\x01R\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B``\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`\x80\x82\x01R\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18`\xA0\x82\x01R\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\`\xC0\x82\x01R\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC`\xE0\x82\x01Ra\x16ha\x02DV[\x90`\x14\x82R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01` \x83\x01R`@\x82\x01R\x90V[\x91\x92\x90\x92a\x16\xA7a\x02DV[\x92`\0\x84R` \x84\x01\x94`\0\x86R`@\x85\x01\x92`\0\x84R\x85\x83Q\x97\x83`\0\x14a\x17\x1DW\x83\x98`\0\x90[\x80\x82\x10a\x16\xFFWPPa\x16\xF2a\x16\xFB\x96\x97\x98\x99`\0\x19\x01[\x80\x84R\x85\x87a\x1D\xEFV[\x90RQ\x92a\x1EhV[\x90RV[\x90\x99`\0\x80Q` a)\x96\x839\x81Q\x91R\x81`\x01\x92\t\x9A\x01\x90a\x16\xD0V[a\x16\xFB\x95\x96\x97\x98Pa\x16\xF2\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a\x16\xE8V[``\x90\x92\x91\x92`\x80a\x17^a\x01\xE3V[\x91`\0\x83R`\0` \x84\x01R\x82\x95` a\x17va\x02DV[\x92\x866\x857\x80Q\x84R\x01Q` \x83\x01R`@\x82\x01R`\x07a\x07\xCF\x19Z\x01\xFA\x15a\x01\xA2WV[``\x90\x92\x91\x92`\xC0a\x17\xABa\x01\xE3V[\x91`\0\x83R`\0` \x84\x01R` \x83\x96\x81a\x17\xC4a\x02$V[\x93`\x806\x867\x80Q\x85R\x01Q\x82\x84\x01R\x80Q`@\x84\x01R\x01Q\x84\x82\x01R`\x06a\x07\xCF\x19Z\x01\xFA\x15a\x01\xA2WV[\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x82\x03\x91\x82\x11a\x18\rWV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x90\x91a\x18-a\n\xD7V[Pa\x186a\n\xD7V[Pa\x18C\x84\x82\x85\x85a\x1F\xD6V[\x90a\x18O\x90\x85\x85a'\xE2V[a\x18X\x90a\x17\xF1V[`\xC0\x84\x01Q\x80\x80\x80\x80\x95\x81\x95a\x01\xA0\x8B\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x84\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90\x82\x8BQ\x90a\x18\x9B\x91a\x17NV[a\x18\xA4\x91a\x17\x9BV[\x90a\x01\xC0\x8B\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x84\x80\t\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x83\x80\t` \x8C\x01Q\x90a\x19\x02\x91a\x17NV[a\x19\x0B\x91a\x17\x9BV[\x90\x82`\0\x80Q` a)\x96\x839\x81Q\x91R\x81\x80\t\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x01\xE0\x8C\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x91\x81`@\x8D\x01Q\x90a\x19l\x91a\x17NV[a\x19u\x91a\x17\x9BV[\x92`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x02\0\x8B\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x91\x81``\x8C\x01Q\x90a\x19\xC2\x91a\x17NV[a\x19\xCB\x91a\x17\x9BV[\x93`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x02 \x8A\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x92\x81`\x80\x8B\x01Q\x90a\x1A\x18\x91a\x17NV[a\x1A!\x91a\x17\x9BV[\x92a\x02@\x8A\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x84\x84\t\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x92`\0\x80Q` a)\x96\x839\x81Q\x91R\x83\x83\t`@\x89\x01Q\x90a\x1A\x7F\x91a\x17NV[a\x1A\x88\x91a\x17\x9BV[\x93`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x02`\x88\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x91\x81``\x87\x01Q\x90a\x1A\xE7\x91a\x17NV[a\x1A\xF0\x91a\x17\x9BV[\x92`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x02\x80\x87\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x91\x81`\x80\x86\x01Q\x90a\x1B=\x91a\x17NV[a\x1BF\x91a\x17\x9BV[\x92`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x02\xA0\x86\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x92`\xA0\x01Q\x90a\x1B\x91\x91a\x17NV[a\x1B\x9A\x91a\x17\x9BV[\x91`\xE0\x01Q\x90a\x02\xC0\x84\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x92`\xA0\x01Q\x90a\x1B\xD8\x91a\x17NV[a\x1B\xE1\x91a\x17\x9BV[\x90a\x1B\xEAa(\xA0V[\x90a\x1B\xF4\x91a\x17NV[\x91V[`\0` a\x1C\x03a\x01\xE3V[\x82\x81R\x01R\x80Q` \x82\x01Q\x15\x90\x15\x16a\nxW` \x81Q\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x82\x91\x01Q\x06\x81\x03\x90\x81\x11a\x18\rWa\x1CTa\x01\xE3V[\x91\x82R` \x82\x01R\x90V[`\0``a\x1Cka\x02$V[\x82\x81R\x82` \x82\x01R\x82`@\x82\x01R\x01Ra\x1C\x84a\x02$V[\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2` \x82\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA`@\x82\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[``\x82\x01R\x90V[\x15a\x1D#WV[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x90\xFD[\x91`@a\x01\x80\x92\x94`\0\x94\x82Q\x93\x81Q\x85R\x83` \x98\x89\x80\x94\x01Q\x84\x88\x01R\x83\x81\x01Q\x82\x88\x01R\x80Q``\x88\x01R``\x81\x01Q`\x80\x88\x01R\x01Q`\xA0\x86\x01R\x80Q`\xC0\x86\x01R\x01Q`\xE0\x84\x01R\x85\x81\x01Qa\x01\0\x84\x01R\x80Qa\x01 \x84\x01R``\x81\x01Qa\x01@\x84\x01R\x01Qa\x01`\x82\x01R`\x08Z\xFAa\x1D\xEA`\0Q\x91a\x1D\x1CV[\x15\x15\x90V[`\x01\x82\x14a\x1E`W\x82\x15a\x1EXW` \x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x92\x83\x91\x90\t\x90\x80\x15a\x1E.Wa\x1E)\x90`\0\x19\x01a(\xC7V[\x90\t\x90V[Pa\x1E)\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a(\xC7V[PPP`\0\x90V[PPP`\x01\x90V[\x93\x92\x91\x90\x91\x80\x15a\x1FrWa\x1E~\x92\x91\x92a\x128V[\x91`\xE0\x83\x01\x93`@\x87\x01\x94`\xE0\x86Q\x01\x90`\x01\x90`\x01\x81R`\x01\x90[`\x08\x82\x10a\x1F8WPPPP`\0\x94`\x01\x94\x92\x90Q\x90`\0\x90[`\x08\x82\x10a\x1E\xEDWPPPPP\x93a\x1E\xE3\x91` \x94\x95`\0\x80Q` a)\x96\x839\x81Q\x91R\x95\x86\x94\x85\x93a(\xC7V[\x93\x01Q\x90\t\t\t\x90V[\x90\x91\x92\x93\x95\x96`\x01\x90\x84Q\x98\x89\x87\x8A`\0\x80Q` a)\x96\x839\x81Q\x91R\x94\x85\x80\x94\x81\x80\x94\x81\x8CQ\x91Q\x8A\t\t\t\x90\x08\x9B\x82\x03\x08\x90\t\x96` \x80\x80\x92\x01\x93\x01\x94\x01\x92\x01\x90\x93\x92a\x1E\xB4V[`\x01\x90`\x1F\x99\x95\x96\x99\x19\x80\x91\x01\x93`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x81\x89\x88Q\x82\x03\x08\x90\t\x94\x85\x85R\x01\x91\x01\x90\x92\x91\x97\x94\x93\x97a\x1E\x9AV[P\x91\x92`\x01\x92\x91`\0\x91\x90\x84[`\x08\x84\x10a\x1F\x92WPPPPPP`\0\x90V[\x80\x85\x14a\x1F\xC3W`\0\x80Q` a)\x96\x839\x81Q\x91R\x86\x91a\x1F\xB8`@\x86\x01Q` \x01\x90V[Q\x90\t\x93\x01\x92a\x1F\x7FV[P\x91\x92PPa\x1F\xD2\x92Pa\x08\xAAV[Q\x90V[\x92\x91\x92a\x1F\xE1a\n\xD7V[P`\x80\x82\x01Q` \x85\x01Q` \x84\x01Q\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90\x83Q\x90`\xA0\x85\x01Q``\x86\x01Q\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x91\x81a\x01\xA0\x88\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x85\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x81a\x01\xC0\x88\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\x91a\x17NV[\x82Q``\x84\x01Q\x90\x81`\x80\x86\x01Q\x91a\x02\xC0\x88\x01Q\x91`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x81a\x02@\x88\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x85\ta\x01\xA0\x89\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x81a\x02`\x88\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x85\ta\x01\xC0\x89\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x81a\x02\x80\x88\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x90\x85\ta\x01\xE0\x89\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x91a\x02\xA0\x87\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x02\0\x87\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\xC0\x83\x01Q\x90a#\xD1\x90a\x17\xF1V[a#\xDA\x91a\x17NV[a#\xE3\x91a\x17\x9BV[`\xE0\x82\x01Qa\x01\xA0\x85\x01Qa#\xF7\x91a\x17NV[a$\0\x91a\x17\x9BV[a\x01\0\x82\x01Qa\x01\xC0\x85\x01Qa$\x15\x91a\x17NV[a$\x1E\x91a\x17\x9BV[a\x01 \x82\x01Qa\x01\xE0\x85\x01Qa$3\x91a\x17NV[a$<\x91a\x17\x9BV[a\x01@\x82\x01Qa\x02\0\x85\x01Qa$Q\x91a\x17NV[a$Z\x91a\x17\x9BV[a\x01\xC0\x84\x01Qa\x01\xA0\x85\x01Q\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x01`\x83\x01Q\x90a$\x88\x91a\x17NV[a$\x91\x91a\x17\x9BV[a\x02\0\x84\x01Qa\x01\xE0\x85\x01Q\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x01\x80\x83\x01Q\x90a$\xBF\x91a\x17NV[a$\xC8\x91a\x17\x9BV[a\x01\xA0\x84\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x81\x80\t\x80`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x01\xE0\x83\x01Q\x90a%\x13\x91a\x17NV[a%\x1C\x91a\x17\x9BV[a\x01\xC0\x84\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x81\x80\t\x80`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x02\0\x83\x01Q\x90a%g\x91a\x17NV[a%p\x91a\x17\x9BV[a\x01\xE0\x84\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x81\x80\t\x80`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x02 \x83\x01Q\x90a%\xBB\x91a\x17NV[a%\xC4\x91a\x17\x9BV[a\x02\0\x84\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x81\x80\t\x80`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x02@\x83\x01Q\x90a&\x0F\x91a\x17NV[a&\x18\x91a\x17\x9BV[a\x01\xA0\x82\x01Qa\x02 \x85\x01Qa&-\x90a)wV[a&6\x91a\x17NV[a&?\x91a\x17\x9BV[a\x01\xC0\x82\x01Qa&N\x91a\x17\x9BV[\x90a\x01\xC0\x84\x01Qa\x01\xA0\x85\x01Q\x90`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x01\xE0\x85\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x02\0\x85\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\ta\x02 \x85\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x02`\x01Q\x90a&\xC2\x91a\x17NV[a&\xCB\x91a\x17\x9BV[\x90\x83Qa&\xD7\x90a)wV[\x91\x82`\xC0\x85\x01Q\x90a&\xE8\x91a\x17NV[a&\xF1\x91a\x17\x9BV[\x93Q`\x01`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\x08\x90`\xA0\x01Q\x80`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x80\x93`\0\x80Q` a)\x96\x839\x81Q\x91R\x82\x80\x94\t\x90\x81`\xE0\x86\x01Q\x90a'T\x91a\x17NV[a']\x91a\x17\x9BV[\x91`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90\x81a\x01\0\x85\x01Q\x90a'\x81\x91a\x17NV[a'\x8A\x91a\x17\x9BV[\x91`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90\x81a\x01 \x84\x01Q\x90a'\xAE\x91a\x17NV[a'\xB7\x91a\x17\x9BV[\x92`\0\x80Q` a)\x96\x839\x81Q\x91R\x91\t\x90a\x01@\x01Q\x90a'\xD9\x91a\x17NV[a\nx\x91a\x17\x9BV[\x90`@` \x84\x01Q\x93\x01Q\x92``\x83\x01Q`\x80\x84\x01Q\x94a\x01\xA0\x84\x01Q`\0\x80Q` a)\x96\x839\x81Q\x91R\x87\x81\x87\x81\x80\x80\x9C\x98\x81\x80\x80\x80\x9E\x81\x80\x9E\x9C\x81\x80\x9E\x81a\x02@\x81\x96\x01Q\x8A\t\x92\x08\x08`\x01\t\x81a\x01\xC0\x89\x01Q\x81\x8C\x81a\x02`\x8D\x01Q\x8A\t\x92\x08\x08\x90\t\x81a\x01\xE0\x88\x01Q\x81\x8B\x81a\x02\x80\x8C\x01Q\x89\t\x92\x08\x08\x90\t\x91\x81\x88\x81a\x02\0\x89\x01Q\x93a\x02\xA0\x8A\x01Q\x90\t\x92\x08\x08\x90\t\x93a\x02\xC0a\x02 \x84\x01Q\x93\x01Q\x92\x08\t\x90\t\x93` \x87Q\x97\x01Q\t\x82\x03\x90\x08\x92\t\x82\x03\x90\x08\x90V[`\0` a(\xACa\x01\xE3V[\x82\x81R\x01Ra(\xB9a\x01\xE3V[`\x01\x81R`\x02` \x82\x01R\x90V[\x90`@Q\x91`\0`\xC0` \x94\x85\x93\x84\x82R\x84\x80\x83\x01R\x84`@\x83\x01R``\x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xEF\xFF\xFF\xFF`\x80\x82\x01R`\0\x80Q` a)\x96\x839\x81Q\x91R`\xA0\x82\x01R`\x05Z\xFA\x91`\0Q\x92\x15a)3WPV[`d\x90`@Q\x90bF\x1B\xCD`\xE5\x1B\x82R`\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R\xFD[`\0\x80Q` a)\x96\x839\x81Q\x91R\x80\x91\x06\x81\x03\x90\x81\x11a\x18\rW\x90V\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n"; + 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`\x046\x10a\x005W`\x005`\xE0\x1C\x80c\xA1\xF1\xA3N\x14a\0:W[`\0\x80\xFD[a\0Ma\0H6`\x04a!$V[a\0aV[`@Q\x90\x15\x15\x81R` \x01`@Q\x80\x91\x03\x90\xF3[`\0a\0l\x82a\0\xDFV[a\0}\x83`\0[` \x02\x01Qa\x02\x1AV[a\0\x88\x83`\x01a\0sV[a\0\x93\x83`\x02a\0sV[a\0\x9E\x83`\x03a\0sV[a\0\xA9\x83`\x04a\0sV[a\0\xB4\x83`\x05a\0sV[a\0\xBF\x83`\x06a\0sV[a\0\xCA\x83`\x07a\0sV[a\0\xD5\x84\x84\x84a\x02\x81V[\x90P[\x93\x92PPPV[\x80Qa\0\xEA\x90a\x04\x80V[a\0\xF7\x81` \x01Qa\x04\x80V[a\x01\x04\x81`@\x01Qa\x04\x80V[a\x01\x11\x81``\x01Qa\x04\x80V[a\x01\x1E\x81`\x80\x01Qa\x04\x80V[a\x01+\x81`\xA0\x01Qa\x04\x80V[a\x018\x81`\xC0\x01Qa\x04\x80V[a\x01E\x81`\xE0\x01Qa\x04\x80V[a\x01S\x81a\x01\0\x01Qa\x04\x80V[a\x01a\x81a\x01 \x01Qa\x04\x80V[a\x01o\x81a\x01@\x01Qa\x04\x80V[a\x01}\x81a\x01`\x01Qa\x04\x80V[a\x01\x8B\x81a\x01\x80\x01Qa\x04\x80V[a\x01\x99\x81a\x01\xA0\x01Qa\x02\x1AV[a\x01\xA7\x81a\x01\xC0\x01Qa\x02\x1AV[a\x01\xB5\x81a\x01\xE0\x01Qa\x02\x1AV[a\x01\xC3\x81a\x02\0\x01Qa\x02\x1AV[a\x01\xD1\x81a\x02 \x01Qa\x02\x1AV[a\x01\xDF\x81a\x02@\x01Qa\x02\x1AV[a\x01\xED\x81a\x02`\x01Qa\x02\x1AV[a\x01\xFB\x81a\x02\x80\x01Qa\x02\x1AV[a\x02\t\x81a\x02\xA0\x01Qa\x02\x1AV[a\x02\x17\x81a\x02\xC0\x01Qa\x02\x1AV[PV[`\0\x80Q` a#v\x839\x81Q\x91R\x81\x10\x80a\x02}W`@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\x01[`@Q\x80\x91\x03\x90\xFD[PPV[`\0\x83` \x01Q`\x08\x14a\x02\xA8W`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x02\xB5\x85\x85\x85a\x05/V[\x90P`\0a\x02\xC6\x86`\0\x01Qa\n\xA6V[\x90P`\0a\x02\xD9\x82\x84`\xA0\x01Q\x88a\x0E\xF8V[\x90Pa\x02\xF8`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x03-\x87a\x01`\x01Qa\x03(\x89a\x01\x80\x01Q\x88`\xE0\x01Qa\x0FXV[a\x0F\xFCV[\x91P`\0\x80a\x03>\x8B\x88\x87\x8Ca\x10\xA3V[\x91P\x91Pa\x03O\x81a\x03(\x84a\x12\xE3V[\x92Pa\x03h\x83a\x03(\x8Ba\x01`\x01Q\x8A`\xA0\x01Qa\x0FXV[`\xA0\x88\x01Q`@\x88\x01Q` \x01Q\x91\x94P`\0\x80Q` a#v\x839\x81Q\x91R\x91\x82\x90\x82\t\x90P\x81`\xE0\x8A\x01Q\x82\t\x90Pa\x03\xAC\x85a\x03(\x8Da\x01\x80\x01Q\x84a\x0FXV[\x94P`\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\x04n\x87\x82a\x04a\x89a\x12\xE3V[a\x04ia\x13\x82V[a\x14SV[\x9E\x9DPPPPPPPPPPPPPPV[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x04\xBAWPPPV[\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\x05*W`@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\x02tV[PPPV[a\x05w`@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[`\0`\0\x80Q` a#v\x839\x81Q\x91R\x90P`@Q` \x81\x01`\0\x81R`\xFE`\xE0\x1B\x81R\x86Q`\xC0\x1B`\x04\x82\x01R` \x87\x01Q`\xC0\x1B`\x0C\x82\x01Ra\x02\x80\x87\x01Q` \x82\x01Ra\x02\xA0\x87\x01Q`@\x82\x01R`\x01``\x82\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81R` \x01\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\r{W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\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\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81R` \x01\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x0E\xDFW`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81R` \x01~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\x1C`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a\x0F&\x84\x84a\x157V[\x80\x82Ra\x0F6\x90\x85\x90\x85\x90a\x15\x8BV[` \x82\x01R\x80Qa\x0FL\x90\x85\x90\x84\x90\x86\x90a\x15\xFFV[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x0Fta\x1E\x19V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0F\xA6W`\0\x80\xFD[P\x80a\x0F\xF4W`@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\x02tV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x10\x18a\x1E7V[\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\x10UW`\0\x80\xFD[P\x80a\x0F\xF4W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02tV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0a\x10\xD9\x87\x87\x87\x87a\x17UV[\x90P`\0\x80Q` a#v\x839\x81Q\x91R`\0a\x10\xF7\x88\x87\x89a\x1C%V[\x90Pa\x11\x03\x81\x83a#\x1CV[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x110\x85a\x03(\x8A`\0\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11X\x86a\x03(\x8A` \x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x80\x86a\x03(\x8A`@\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xA8\x86a\x03(\x8A``\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xD0\x86a\x03(\x8A`\x80\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xF8\x86a\x03(\x8D`@\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x12 \x86a\x03(\x8D``\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x12H\x86a\x03(\x8D`\x80\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x12p\x86a\x03(\x8D`\xA0\x01Q\x84a\x0FXV[\x95P`\0\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x12\x9B\x87a\x03(\x8B`\xA0\x01Q\x84a\x0FXV[\x96Pa\x12\xD2a\x12\xCC`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x0FXV[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x13\x0BWP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x13P\x91\x90a#SV[a\x13z\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa#\x1CV[\x90R\x92\x91PPV[a\x13\xAD`@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\x80a\x15)W`@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\x02tV[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q`\0\x90`\0\x80Q` a#v\x839\x81Q\x91R\x90\x83\x80\x15a\x15{W\x84\x93P`\0[\x82\x81\x10\x15a\x15oW\x83\x85\x86\t\x94P`\x01\x01a\x15YV[P`\x01\x84\x03\x93Pa\x15\x82V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a\x15\x9DWP`\x01a\0\xD8V[\x81`\0\x03a\x15\xADWP`\0a\0\xD8V[` \x84\x01Q`\0\x80Q` a#v\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x15\xDDW`\x01\x87\x03\x92Pa\x15\xE4V[`\x01\x84\x03\x92P[Pa\x15\xEE\x82a\x1D\x15V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[`\0`\0\x80Q` a#v\x839\x81Q\x91R\x82\x82\x03a\x16|W`\x01`\0[`\x08\x81\x10\x15a\x16pW\x81\x86\x03a\x16MW\x86\x81`\x08\x81\x10a\x16>Wa\x16>a#\x06V[` \x02\x01Q\x93PPPPa\x15/V[\x82\x80a\x16[Wa\x16[a#=V[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x16\x1CV[P`\0\x92PPPa\x15/V[a\x16\x84a\x1EUV[`@\x87\x01Q`\x01`\xE0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x08\x81\x10\x15a\x16\xC5W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x16\x98V[PPPP`\0\x80`\0\x90P`\x01\x83\x89`@\x8C\x01Q`\0[`\x08\x81\x10\x15a\x17\x1CW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x16\xDCV[PPPP\x80\x92PP`\0a\x17/\x83a\x1D\x15V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0\x80`\0\x80`\0`\0\x80Q` a#v\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7X = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80\x80`@R4a\0\x1AWa)\x03\x90\x81a\0 \x8290\x81PP\xF3[`\0\x80\xFD\xFE`\x80`@R`\x046\x10\x15a\0\x12W`\0\x80\xFD[`\0\x805`\xE0\x1C\x90\x81c\x1Dq.'\x14a\x01\xC7W\x81c\xA1\xF1\xA3N\x14a\0EWPc\xDFnl\xB4\x14a\0@W`\0\x80\xFD[a\x08\xE4V[6`\x03\x19\x01a\n\x80\x81\x12a\x01\xC3Wa\x05\0\x13a\x01\xC0Wa\x01\xBCa\x01\xAAa\0ia\x02\x12V[`\x045\x81R`$5` \x82\x01Ra\0\x7F6a\x02\xBAV[`@\x82\x01Ra\0\x8D6a\x02\xE3V[``\x82\x01Ra\0\x9B6a\x03\x07V[`\x80\x82\x01Ra\0\xA96a\x03+V[`\xA0\x82\x01Ra\0\xB76a\x03RV[`\xC0\x82\x01Ra\0\xC56a\x03yV[`\xE0\x82\x01Ra\0\xD36a\x03\xA0V[a\x01\0\x82\x01Ra\0\xE26a\x03\xC7V[a\x01 \x82\x01Ra\0\xF16a\x03\xEEV[a\x01@\x82\x01Ra\x01\x006a\x04\x15V[a\x01`\x82\x01Ra\x01\x0F6a\x04\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85`\x80\x82\x01R\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D`\xA0\x82\x01R\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD`\xC0\x82\x01R\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD`\xE0\x82\x01Ra!=a\x02yV[\x90`\x10\x82R\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` \x83\x01R`@\x82\x01R\x90V[b\x10\0\0\x81\x14a\"\xE3W` \x03a\"\xD1Wa!\x89a\x02\x99V[`\x01\x81R\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!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B`@\x82\x01R\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;``\x82\x01R\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80`\x80\x82\x01R\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE`\xA0\x82\x01R\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C`\xC0\x82\x01R~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90`\xE0\x82\x01Ra\"\x9Ea\x02yV[\x90`\x05\x82R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01` \x83\x01R`@\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x90\xFD[Pa\"\xECa\x02\x99V[`\x01\x81R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW` \x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD`@\x82\x01R\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B``\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`\x80\x82\x01R\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18`\xA0\x82\x01R\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\`\xC0\x82\x01R\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC`\xE0\x82\x01Ra$\x02a\x02yV[\x90`\x14\x82R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01` \x83\x01R`@\x82\x01R\x90V[\x91\x92\x90\x92a$Aa\x02yV[\x92`\0\x84R` \x84\x01\x94`\0\x86R`@\x85\x01\x92`\0\x84R\x85\x83Q\x97\x83`\0\x14a$\xB7W\x83\x98`\0\x90[\x80\x82\x10a$\x99WPPa$\x8Ca$\x95\x96\x97\x98\x99`\0\x19\x01[\x80\x84R\x85\x87a&?V[\x90RQ\x92a&\xB8V[\x90RV[\x90\x99`\0\x80Q` a(\xD7\x839\x81Q\x91R\x81`\x01\x92\t\x9A\x01\x90a$jV[a$\x95\x95\x96\x97\x98Pa$\x8C\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a$\x82V[\x90`@` \x84\x01Q\x93\x01Q\x92``\x83\x01Q`\x80\x84\x01Q\x94a\x01\xA0\x84\x01Q`\0\x80Q` a(\xD7\x839\x81Q\x91R\x87\x81\x87\x81\x80\x80\x9C\x98\x81\x80\x80\x80\x9E\x81\x80\x9E\x9C\x81\x80\x9E\x81a\x02@\x81\x96\x01Q\x8A\t\x92\x08\x08`\x01\t\x81a\x01\xC0\x89\x01Q\x81\x8C\x81a\x02`\x8D\x01Q\x8A\t\x92\x08\x08\x90\t\x81a\x01\xE0\x88\x01Q\x81\x8B\x81a\x02\x80\x8C\x01Q\x89\t\x92\x08\x08\x90\t\x91\x81\x88\x81a\x02\0\x89\x01Q\x93a\x02\xA0\x8A\x01Q\x90\t\x92\x08\x08\x90\t\x93a\x02\xC0a\x02 \x84\x01Q\x93\x01Q\x92\x08\t\x90\t\x93` \x87Q\x97\x01Q\t\x82\x03\x90\x08\x92\t\x82\x03\x90\x08\x90V[` \x81Q\x91\x01Q\x90\x81\x15\x81\x15\x16a&;W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x80\x80`\x03\x81\x80\x86\x80\t\x86\t\x08\x81\x85\x80\t\x14\x93\x10\x91\x10\x16\x16\x15a%\xF6WV[`@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\x90\xFD[PPV[`\x01\x82\x14a&\xB0W\x82\x15a&\xA8W` \x01Q`\0\x80Q` a(\xD7\x839\x81Q\x91R\x92\x83\x91\x90\t\x90\x80\x15a&~Wa&y\x90`\0\x19\x01a(&V[\x90\t\x90V[Pa&y\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a(&V[PPP`\0\x90V[PPP`\x01\x90V[\x93\x92\x91\x90\x91\x80\x15a'\xC2Wa&\xCE\x92\x91\x92a\x1F\xD2V[\x91`\xE0\x83\x01\x93`@\x87\x01\x94`\xE0\x86Q\x01\x90`\x01\x90`\x01\x81R`\x01\x90[`\x08\x82\x10a'\x88WPPPP`\0\x94`\x01\x94\x92\x90Q\x90`\0\x90[`\x08\x82\x10a'=WPPPPP\x93a'3\x91` \x94\x95`\0\x80Q` a(\xD7\x839\x81Q\x91R\x95\x86\x94\x85\x93a(&V[\x93\x01Q\x90\t\t\t\x90V[\x90\x91\x92\x93\x95\x96`\x01\x90\x84Q\x98\x89\x87\x8A`\0\x80Q` a(\xD7\x839\x81Q\x91R\x94\x85\x80\x94\x81\x80\x94\x81\x8CQ\x91Q\x8A\t\t\t\x90\x08\x9B\x82\x03\x08\x90\t\x96` \x80\x80\x92\x01\x93\x01\x94\x01\x92\x01\x90\x93\x92a'\x04V[`\x01\x90`\x1F\x99\x95\x96\x99\x19\x80\x91\x01\x93`\0\x80Q` a(\xD7\x839\x81Q\x91R\x90\x81\x89\x88Q\x82\x03\x08\x90\t\x94\x85\x85R\x01\x91\x01\x90\x92\x91\x97\x94\x93\x97a&\xEAV[P\x91\x92`\x01\x92\x91`\0\x91\x90\x84[`\x08\x84\x10a'\xE2WPPPPPP`\0\x90V[\x80\x85\x14a(\x13W`\0\x80Q` a(\xD7\x839\x81Q\x91R\x86\x91a(\x08`@\x86\x01Q` \x01\x90V[Q\x90\t\x93\x01\x92a'\xCFV[P\x91\x92PPa(\"\x92Pa\t\x08V[Q\x90V[\x90`@Q\x91`\0`\xC0` \x94\x85\x93\x84\x82R\x84\x80\x83\x01R\x84`@\x83\x01R``\x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xEF\xFF\xFF\xFF`\x80\x82\x01R`\0\x80Q` a(\xD7\x839\x81Q\x91R`\xA0\x82\x01R`\x05Z\xFA\x91`\0Q\x92\x15a(\x92WPV[`d\x90`@Q\x90bF\x1B\xCD`\xE5\x1B\x82R`\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R\xFD\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n"; + const __BYTECODE: &[u8] = b"a'\\a\0:`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14a\0-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`\x046\x10a\0KW`\x005`\xE0\x1C\x80c\x1Dq.'\x14a\0PW\x80c\xA1\xF1\xA3N\x14a\0\x8AW\x80c\xDFnl\xB4\x14a\0\xADW[`\0\x80\xFD[a\0w\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x9Da\0\x986`\x04a%!V[a\0\xC2V[`@Q\x90\x15\x15\x81R` \x01a\0\x81V[a\0w`\0\x80Q` a'0\x839\x81Q\x91R\x81V[`\0a\0\xCD\x82a\x10\x88V[a\0\xDE\x83`\0[` \x02\x01Qa\x11\xC3V[a\0\xE9\x83`\x01a\0\xD4V[a\0\xF4\x83`\x02a\0\xD4V[a\0\xFF\x83`\x03a\0\xD4V[a\x01\n\x83`\x04a\0\xD4V[a\x01\x15\x83`\x05a\0\xD4V[a\x01 \x83`\x06a\0\xD4V[a\x01+\x83`\x07a\0\xD4V[`\0a\x018\x85\x85\x85a\x12&V[\x90P`\0a\x01I\x86`\0\x01Qa\x18AV[\x90P`\0a\x01\\\x82\x84`\xA0\x01Q\x88a\x1C\x93V[\x90P`\0a\x01k\x84\x87\x84a\x1C\xF3V[\x90Pa\x02LV[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x81\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x81\xFD[`@Q\x81Q\x81R` \x82\x01Q` \x82\x01R\x82`@\x82\x01R`@`\0``\x83`\x07Z\xFA\x90P\x80a\x02\x0CWa\x02\x0Ca\x01rV[PPPV[`@\x80Q\x82Q\x81R` \x80\x84\x01Q\x81\x83\x01R`\0Q\x82\x84\x01RQ``\x82\x01R\x90\x82`\x80\x83`\x06Z\xFA\x90P\x80a\x02HWa\x02Ha\x01rV[PPV[`@Q`\xC0\x81\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`@\x83\x01R\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``\x83\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4`\x80\x83\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`\xA0\x83\x01R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2a\x01\0\x83\x01R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xEDa\x01 \x83\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[a\x01@\x83\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAAa\x01`\x83\x01Ra\x01\x80\x82\x01`@R`\0\x80`\0\x80`\x80\x8A\x01Q`\0\x80Q` a'0\x839\x81Q\x91R` \x8A\x01Q` \x8D\x01Q\t\x93P\x8AQ`\0\x80Q` a'0\x839\x81Q\x91R`\xA0\x8D\x01Q``\x8E\x01Q\t\x93P`\0\x80Q` a'0\x839\x81Q\x91Ra\x01\xA0\x8F\x01Q\x85\x08\x92P`\0\x80Q` a'0\x839\x81Q\x91R\x82\x84\x08\x92P`\0\x80Q` a'0\x839\x81Q\x91R\x81\x84\t\x90P`\0\x80Q` a'0\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81R` \x01\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x1B\x16W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\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\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81R` \x01\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x1CzW`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81R` \x01~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1C\xB7`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a\x1C\xC1\x84\x84a\x1FdV[\x80\x82Ra\x1C\xD1\x90\x85\x90\x85\x90a\x1F\xB8V[` \x82\x01R\x80Qa\x1C\xE7\x90\x85\x90\x84\x90\x86\x90a .V[`@\x82\x01R\x93\x92PPPV[` \x81\x01Q`@\x82\x01Q``\x85\x01Q`\x80\x86\x01Qa\x01\xA0\x86\x01Qa\x02@\x87\x01Q`\0\x95\x94\x93`\x01\x93\x90\x92\x90\x91`\0\x80Q` a'0\x839\x81Q\x91R\x80\x80\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x88\x01Qa\x02`\x89\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80`\0\x80Q` a'0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x88\x01Qa\x02\x80\x89\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80`\0\x80Q` a'0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x88\x01Qa\x02\xA0\x89\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80`\0\x80Q` a'0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x88\x01Q\x91Pa\x02\xC0\x88\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80\x82`\0\x80Q` a'0\x839\x81Q\x91R\x85\x87\x08\t\x85\t\x93PPPP\x86Q` \x88\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80\x86\x83\t`\0\x80Q` a'0\x839\x81Q\x91R\x03\x85\x08\x95PP`\0\x80Q` a'0\x839\x81Q\x91R\x80\x83\x83\t`\0\x80Q` a'0\x839\x81Q\x91R\x03\x86\x08\x98\x97PPPPPPPPV[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x1E\xF4WPPPV[\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\x02\x0CW`@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\x12\x1DV[\x81Q`\0\x90`\0\x80Q` a'0\x839\x81Q\x91R\x90\x83\x80\x15a\x1F\xA8W\x84\x93P`\0[\x82\x81\x10\x15a\x1F\x9CW\x83\x85\x86\t\x94P`\x01\x01a\x1F\x86V[P`\x01\x84\x03\x93Pa\x1F\xAFV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a\x1F\xCAWP`\x01a 'V[\x81`\0\x03a\x1F\xDAWP`\0a 'V[` \x84\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a \nW`\x01\x87\x03\x92Pa \x11V[`\x01\x84\x03\x92P[Pa \x1B\x82a!\x86V[\x91P\x82\x82\x82\t\x93PPPP[\x93\x92PPPV[`\0`\0\x80Q` a'0\x839\x81Q\x91R\x82\x82\x03a \xABW`\x01`\0[`\x08\x81\x10\x15a \x9FW\x81\x86\x03a |W\x86\x81`\x08\x81\x10a mWa ma'\x03V[` \x02\x01Q\x93PPPPa!~V[\x82\x80a \x8AWa \x8Aa'\x19V[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a KV[P`\0\x92PPPa!~V[a \xB3a\"RV[`@\x87\x01Q`\x01`\xE0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x08\x81\x10\x15a \xF4W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a \xC7V[PPPP`\0\x80`\0\x90P`\x01\x83\x89`@\x8C\x01Q`\0[`\x08\x81\x10\x15a!KW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a!\x0BV[PPPP\x80\x92PP`\0a!^\x83a!\x86V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x95PPPPPP[\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` a'0\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\x81a\"%W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x12\x1DV[PP\x91\x90PV[`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01a\"Ma\"RV[\x90R\x90V[`@Q\x80a\x01\0\x01`@R\x80`\x08\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x02\xE0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\"\xABWa\"\xABa\"qV[`@R\x90V[`@Qa\x02\xC0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\"\xABWa\"\xABa\"qV[`\0`@\x82\x84\x03\x12\x15a\"\xE7W`\0\x80\xFD[`@Q`@\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a#\nWa#\na\"qV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a#5W`\0\x80\xFD[`@Qa\x01\0\x80\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a#ZWa#Za\"qV[`@R\x83\x01\x81\x85\x82\x11\x15a#mW`\0\x80\xFD[\x84[\x82\x81\x10\x15a#\x87W\x805\x82R` \x91\x82\x01\x91\x01a#oV[P\x91\x95\x94PPPPPV[`\0a\x04\x80\x82\x84\x03\x12\x15a#\xA5W`\0\x80\xFD[a#\xADa\"\x87V[\x90Pa#\xB9\x83\x83a\"\xD5V[\x81Ra#\xC8\x83`@\x84\x01a\"\xD5V[` \x82\x01Ra#\xDA\x83`\x80\x84\x01a\"\xD5V[`@\x82\x01Ra#\xEC\x83`\xC0\x84\x01a\"\xD5V[``\x82\x01Ra\x01\0a$\0\x84\x82\x85\x01a\"\xD5V[`\x80\x83\x01Ra\x01@a$\x14\x85\x82\x86\x01a\"\xD5V[`\xA0\x84\x01Ra\x01\x80a$(\x86\x82\x87\x01a\"\xD5V[`\xC0\x85\x01Ra\x01\xC0a$<\x87\x82\x88\x01a\"\xD5V[`\xE0\x86\x01Ra\x02\0a$P\x88\x82\x89\x01a\"\xD5V[\x85\x87\x01Ra\x02@\x94Pa$e\x88\x86\x89\x01a\"\xD5V[a\x01 \x87\x01Ra\x02\x80a$z\x89\x82\x8A\x01a\"\xD5V[\x85\x88\x01Ra\x02\xC0\x94Pa$\x8F\x89\x86\x8A\x01a\"\xD5V[a\x01`\x88\x01Ra$\xA3\x89a\x03\0\x8A\x01a\"\xD5V[\x84\x88\x01Ra\x03@\x88\x015a\x01\xA0\x88\x01Ra\x03`\x88\x015\x83\x88\x01Ra\x03\x80\x88\x015a\x01\xE0\x88\x01Ra\x03\xA0\x88\x015\x82\x88\x01Ra\x03\xC0\x88\x015a\x02 \x88\x01Ra\x03\xE0\x88\x015\x86\x88\x01Ra\x04\0\x88\x015a\x02`\x88\x01Ra\x04 \x88\x015\x81\x88\x01RPPPPa\x04@\x84\x015a\x02\xA0\x84\x01Ra\x04`\x84\x015\x81\x84\x01RPP\x92\x91PPV[`\0\x80`\0\x83\x85\x03a\n\x80\x81\x12\x15a%8W`\0\x80\xFD[a\x05\0\x80\x82\x12\x15a%HW`\0\x80\xFD[a%Pa\"\xB1V[\x91P\x855\x82R` \x86\x015` \x83\x01Ra%m\x87`@\x88\x01a\"\xD5V[`@\x83\x01Ra%\x7F\x87`\x80\x88\x01a\"\xD5V[``\x83\x01Ra%\x91\x87`\xC0\x88\x01a\"\xD5V[`\x80\x83\x01Ra\x01\0a%\xA5\x88\x82\x89\x01a\"\xD5V[`\xA0\x84\x01Ra\x01@a%\xB9\x89\x82\x8A\x01a\"\xD5V[`\xC0\x85\x01Ra\x01\x80a%\xCD\x8A\x82\x8B\x01a\"\xD5V[`\xE0\x86\x01Ra\x01\xC0a%\xE1\x8B\x82\x8C\x01a\"\xD5V[\x84\x87\x01Ra\x02\0\x93Pa%\xF6\x8B\x85\x8C\x01a\"\xD5V[a\x01 \x87\x01Ra\x02@a&\x0B\x8C\x82\x8D\x01a\"\xD5V[\x84\x88\x01Ra\x02\x80\x93Pa& \x8C\x85\x8D\x01a\"\xD5V[a\x01`\x88\x01Ra&4\x8Ca\x02\xC0\x8D\x01a\"\xD5V[\x83\x88\x01Ra&F\x8Ca\x03\0\x8D\x01a\"\xD5V[a\x01\xA0\x88\x01Ra&Z\x8Ca\x03@\x8D\x01a\"\xD5V[\x82\x88\x01Ra&l\x8Ca\x03\x80\x8D\x01a\"\xD5V[a\x01\xE0\x88\x01Ra&\x80\x8Ca\x03\xC0\x8D\x01a\"\xD5V[\x85\x88\x01Ra&\x92\x8Ca\x04\0\x8D\x01a\"\xD5V[a\x02 \x88\x01Ra&\xA6\x8Ca\x04@\x8D\x01a\"\xD5V[\x81\x88\x01RPPPa&\xBB\x89a\x04\x80\x8A\x01a\"\xD5V[a\x02`\x85\x01Ra\x04\xC0\x88\x015\x81\x85\x01RPPa\x04\xE0\x86\x015a\x02\xA0\x83\x01R\x81\x94Pa&\xE8\x87\x82\x88\x01a#$V[\x93PPPa&\xFA\x85a\x06\0\x86\x01a#\x92V[\x90P\x92P\x92P\x92V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD\xFE0dNr\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 PLONKVERIFIER2_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10\x15a\0\x12W`\0\x80\xFD[`\0\x805`\xE0\x1C\x90\x81c\x1Dq.'\x14a\x01\xC7W\x81c\xA1\xF1\xA3N\x14a\0EWPc\xDFnl\xB4\x14a\0@W`\0\x80\xFD[a\x08\xE4V[6`\x03\x19\x01a\n\x80\x81\x12a\x01\xC3Wa\x05\0\x13a\x01\xC0Wa\x01\xBCa\x01\xAAa\0ia\x02\x12V[`\x045\x81R`$5` \x82\x01Ra\0\x7F6a\x02\xBAV[`@\x82\x01Ra\0\x8D6a\x02\xE3V[``\x82\x01Ra\0\x9B6a\x03\x07V[`\x80\x82\x01Ra\0\xA96a\x03+V[`\xA0\x82\x01Ra\0\xB76a\x03RV[`\xC0\x82\x01Ra\0\xC56a\x03yV[`\xE0\x82\x01Ra\0\xD36a\x03\xA0V[a\x01\0\x82\x01Ra\0\xE26a\x03\xC7V[a\x01 \x82\x01Ra\0\xF16a\x03\xEEV[a\x01@\x82\x01Ra\x01\x006a\x04\x15V[a\x01`\x82\x01Ra\x01\x0F6a\x04\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85`\x80\x82\x01R\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D`\xA0\x82\x01R\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD`\xC0\x82\x01R\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD`\xE0\x82\x01Ra!=a\x02yV[\x90`\x10\x82R\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` \x83\x01R`@\x82\x01R\x90V[b\x10\0\0\x81\x14a\"\xE3W` \x03a\"\xD1Wa!\x89a\x02\x99V[`\x01\x81R\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!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B`@\x82\x01R\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;``\x82\x01R\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80`\x80\x82\x01R\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE`\xA0\x82\x01R\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C`\xC0\x82\x01R~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90`\xE0\x82\x01Ra\"\x9Ea\x02yV[\x90`\x05\x82R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01` \x83\x01R`@\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x90\xFD[Pa\"\xECa\x02\x99V[`\x01\x81R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW` \x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD`@\x82\x01R\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B``\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`\x80\x82\x01R\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18`\xA0\x82\x01R\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\`\xC0\x82\x01R\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC`\xE0\x82\x01Ra$\x02a\x02yV[\x90`\x14\x82R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01` \x83\x01R`@\x82\x01R\x90V[\x91\x92\x90\x92a$Aa\x02yV[\x92`\0\x84R` \x84\x01\x94`\0\x86R`@\x85\x01\x92`\0\x84R\x85\x83Q\x97\x83`\0\x14a$\xB7W\x83\x98`\0\x90[\x80\x82\x10a$\x99WPPa$\x8Ca$\x95\x96\x97\x98\x99`\0\x19\x01[\x80\x84R\x85\x87a&?V[\x90RQ\x92a&\xB8V[\x90RV[\x90\x99`\0\x80Q` a(\xD7\x839\x81Q\x91R\x81`\x01\x92\t\x9A\x01\x90a$jV[a$\x95\x95\x96\x97\x98Pa$\x8C\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a$\x82V[\x90`@` \x84\x01Q\x93\x01Q\x92``\x83\x01Q`\x80\x84\x01Q\x94a\x01\xA0\x84\x01Q`\0\x80Q` a(\xD7\x839\x81Q\x91R\x87\x81\x87\x81\x80\x80\x9C\x98\x81\x80\x80\x80\x9E\x81\x80\x9E\x9C\x81\x80\x9E\x81a\x02@\x81\x96\x01Q\x8A\t\x92\x08\x08`\x01\t\x81a\x01\xC0\x89\x01Q\x81\x8C\x81a\x02`\x8D\x01Q\x8A\t\x92\x08\x08\x90\t\x81a\x01\xE0\x88\x01Q\x81\x8B\x81a\x02\x80\x8C\x01Q\x89\t\x92\x08\x08\x90\t\x91\x81\x88\x81a\x02\0\x89\x01Q\x93a\x02\xA0\x8A\x01Q\x90\t\x92\x08\x08\x90\t\x93a\x02\xC0a\x02 \x84\x01Q\x93\x01Q\x92\x08\t\x90\t\x93` \x87Q\x97\x01Q\t\x82\x03\x90\x08\x92\t\x82\x03\x90\x08\x90V[` \x81Q\x91\x01Q\x90\x81\x15\x81\x15\x16a&;W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x80\x80`\x03\x81\x80\x86\x80\t\x86\t\x08\x81\x85\x80\t\x14\x93\x10\x91\x10\x16\x16\x15a%\xF6WV[`@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\x90\xFD[PPV[`\x01\x82\x14a&\xB0W\x82\x15a&\xA8W` \x01Q`\0\x80Q` a(\xD7\x839\x81Q\x91R\x92\x83\x91\x90\t\x90\x80\x15a&~Wa&y\x90`\0\x19\x01a(&V[\x90\t\x90V[Pa&y\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a(&V[PPP`\0\x90V[PPP`\x01\x90V[\x93\x92\x91\x90\x91\x80\x15a'\xC2Wa&\xCE\x92\x91\x92a\x1F\xD2V[\x91`\xE0\x83\x01\x93`@\x87\x01\x94`\xE0\x86Q\x01\x90`\x01\x90`\x01\x81R`\x01\x90[`\x08\x82\x10a'\x88WPPPP`\0\x94`\x01\x94\x92\x90Q\x90`\0\x90[`\x08\x82\x10a'=WPPPPP\x93a'3\x91` \x94\x95`\0\x80Q` a(\xD7\x839\x81Q\x91R\x95\x86\x94\x85\x93a(&V[\x93\x01Q\x90\t\t\t\x90V[\x90\x91\x92\x93\x95\x96`\x01\x90\x84Q\x98\x89\x87\x8A`\0\x80Q` a(\xD7\x839\x81Q\x91R\x94\x85\x80\x94\x81\x80\x94\x81\x8CQ\x91Q\x8A\t\t\t\x90\x08\x9B\x82\x03\x08\x90\t\x96` \x80\x80\x92\x01\x93\x01\x94\x01\x92\x01\x90\x93\x92a'\x04V[`\x01\x90`\x1F\x99\x95\x96\x99\x19\x80\x91\x01\x93`\0\x80Q` a(\xD7\x839\x81Q\x91R\x90\x81\x89\x88Q\x82\x03\x08\x90\t\x94\x85\x85R\x01\x91\x01\x90\x92\x91\x97\x94\x93\x97a&\xEAV[P\x91\x92`\x01\x92\x91`\0\x91\x90\x84[`\x08\x84\x10a'\xE2WPPPPPP`\0\x90V[\x80\x85\x14a(\x13W`\0\x80Q` a(\xD7\x839\x81Q\x91R\x86\x91a(\x08`@\x86\x01Q` \x01\x90V[Q\x90\t\x93\x01\x92a'\xCFV[P\x91\x92PPa(\"\x92Pa\t\x08V[Q\x90V[\x90`@Q\x91`\0`\xC0` \x94\x85\x93\x84\x82R\x84\x80\x83\x01R\x84`@\x83\x01R``\x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xEF\xFF\xFF\xFF`\x80\x82\x01R`\0\x80Q` a(\xD7\x839\x81Q\x91R`\xA0\x82\x01R`\x05Z\xFA\x91`\0Q\x92\x15a(\x92WPV[`d\x90`@Q\x90bF\x1B\xCD`\xE5\x1B\x82R`\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R\xFD\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n"; + 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`\x046\x10a\0KW`\x005`\xE0\x1C\x80c\x1Dq.'\x14a\0PW\x80c\xA1\xF1\xA3N\x14a\0\x8AW\x80c\xDFnl\xB4\x14a\0\xADW[`\0\x80\xFD[a\0w\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x9Da\0\x986`\x04a%!V[a\0\xC2V[`@Q\x90\x15\x15\x81R` \x01a\0\x81V[a\0w`\0\x80Q` a'0\x839\x81Q\x91R\x81V[`\0a\0\xCD\x82a\x10\x88V[a\0\xDE\x83`\0[` \x02\x01Qa\x11\xC3V[a\0\xE9\x83`\x01a\0\xD4V[a\0\xF4\x83`\x02a\0\xD4V[a\0\xFF\x83`\x03a\0\xD4V[a\x01\n\x83`\x04a\0\xD4V[a\x01\x15\x83`\x05a\0\xD4V[a\x01 \x83`\x06a\0\xD4V[a\x01+\x83`\x07a\0\xD4V[`\0a\x018\x85\x85\x85a\x12&V[\x90P`\0a\x01I\x86`\0\x01Qa\x18AV[\x90P`\0a\x01\\\x82\x84`\xA0\x01Q\x88a\x1C\x93V[\x90P`\0a\x01k\x84\x87\x84a\x1C\xF3V[\x90Pa\x02LV[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x81\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x81\xFD[`@Q\x81Q\x81R` \x82\x01Q` \x82\x01R\x82`@\x82\x01R`@`\0``\x83`\x07Z\xFA\x90P\x80a\x02\x0CWa\x02\x0Ca\x01rV[PPPV[`@\x80Q\x82Q\x81R` \x80\x84\x01Q\x81\x83\x01R`\0Q\x82\x84\x01RQ``\x82\x01R\x90\x82`\x80\x83`\x06Z\xFA\x90P\x80a\x02HWa\x02Ha\x01rV[PPV[`@Q`\xC0\x81\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`@\x83\x01R\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``\x83\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4`\x80\x83\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`\xA0\x83\x01R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2a\x01\0\x83\x01R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xEDa\x01 \x83\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[a\x01@\x83\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAAa\x01`\x83\x01Ra\x01\x80\x82\x01`@R`\0\x80`\0\x80`\x80\x8A\x01Q`\0\x80Q` a'0\x839\x81Q\x91R` \x8A\x01Q` \x8D\x01Q\t\x93P\x8AQ`\0\x80Q` a'0\x839\x81Q\x91R`\xA0\x8D\x01Q``\x8E\x01Q\t\x93P`\0\x80Q` a'0\x839\x81Q\x91Ra\x01\xA0\x8F\x01Q\x85\x08\x92P`\0\x80Q` a'0\x839\x81Q\x91R\x82\x84\x08\x92P`\0\x80Q` a'0\x839\x81Q\x91R\x81\x84\t\x90P`\0\x80Q` a'0\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81R` \x01\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x1B\x16W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\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\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81R` \x01\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x1CzW`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81R` \x01~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1C\xB7`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a\x1C\xC1\x84\x84a\x1FdV[\x80\x82Ra\x1C\xD1\x90\x85\x90\x85\x90a\x1F\xB8V[` \x82\x01R\x80Qa\x1C\xE7\x90\x85\x90\x84\x90\x86\x90a .V[`@\x82\x01R\x93\x92PPPV[` \x81\x01Q`@\x82\x01Q``\x85\x01Q`\x80\x86\x01Qa\x01\xA0\x86\x01Qa\x02@\x87\x01Q`\0\x95\x94\x93`\x01\x93\x90\x92\x90\x91`\0\x80Q` a'0\x839\x81Q\x91R\x80\x80\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x88\x01Qa\x02`\x89\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80`\0\x80Q` a'0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x88\x01Qa\x02\x80\x89\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80`\0\x80Q` a'0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x88\x01Qa\x02\xA0\x89\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80`\0\x80Q` a'0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x88\x01Q\x91Pa\x02\xC0\x88\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80\x82`\0\x80Q` a'0\x839\x81Q\x91R\x85\x87\x08\t\x85\t\x93PPPP\x86Q` \x88\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80\x86\x83\t`\0\x80Q` a'0\x839\x81Q\x91R\x03\x85\x08\x95PP`\0\x80Q` a'0\x839\x81Q\x91R\x80\x83\x83\t`\0\x80Q` a'0\x839\x81Q\x91R\x03\x86\x08\x98\x97PPPPPPPPV[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x1E\xF4WPPPV[\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\x02\x0CW`@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\x12\x1DV[\x81Q`\0\x90`\0\x80Q` a'0\x839\x81Q\x91R\x90\x83\x80\x15a\x1F\xA8W\x84\x93P`\0[\x82\x81\x10\x15a\x1F\x9CW\x83\x85\x86\t\x94P`\x01\x01a\x1F\x86V[P`\x01\x84\x03\x93Pa\x1F\xAFV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a\x1F\xCAWP`\x01a 'V[\x81`\0\x03a\x1F\xDAWP`\0a 'V[` \x84\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a \nW`\x01\x87\x03\x92Pa \x11V[`\x01\x84\x03\x92P[Pa \x1B\x82a!\x86V[\x91P\x82\x82\x82\t\x93PPPP[\x93\x92PPPV[`\0`\0\x80Q` a'0\x839\x81Q\x91R\x82\x82\x03a \xABW`\x01`\0[`\x08\x81\x10\x15a \x9FW\x81\x86\x03a |W\x86\x81`\x08\x81\x10a mWa ma'\x03V[` \x02\x01Q\x93PPPPa!~V[\x82\x80a \x8AWa \x8Aa'\x19V[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a KV[P`\0\x92PPPa!~V[a \xB3a\"RV[`@\x87\x01Q`\x01`\xE0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x08\x81\x10\x15a \xF4W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a \xC7V[PPPP`\0\x80`\0\x90P`\x01\x83\x89`@\x8C\x01Q`\0[`\x08\x81\x10\x15a!KW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a!\x0BV[PPPP\x80\x92PP`\0a!^\x83a!\x86V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x95PPPPPP[\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` a'0\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\x81a\"%W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x12\x1DV[PP\x91\x90PV[`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01a\"Ma\"RV[\x90R\x90V[`@Q\x80a\x01\0\x01`@R\x80`\x08\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x02\xE0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\"\xABWa\"\xABa\"qV[`@R\x90V[`@Qa\x02\xC0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\"\xABWa\"\xABa\"qV[`\0`@\x82\x84\x03\x12\x15a\"\xE7W`\0\x80\xFD[`@Q`@\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a#\nWa#\na\"qV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a#5W`\0\x80\xFD[`@Qa\x01\0\x80\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a#ZWa#Za\"qV[`@R\x83\x01\x81\x85\x82\x11\x15a#mW`\0\x80\xFD[\x84[\x82\x81\x10\x15a#\x87W\x805\x82R` \x91\x82\x01\x91\x01a#oV[P\x91\x95\x94PPPPPV[`\0a\x04\x80\x82\x84\x03\x12\x15a#\xA5W`\0\x80\xFD[a#\xADa\"\x87V[\x90Pa#\xB9\x83\x83a\"\xD5V[\x81Ra#\xC8\x83`@\x84\x01a\"\xD5V[` \x82\x01Ra#\xDA\x83`\x80\x84\x01a\"\xD5V[`@\x82\x01Ra#\xEC\x83`\xC0\x84\x01a\"\xD5V[``\x82\x01Ra\x01\0a$\0\x84\x82\x85\x01a\"\xD5V[`\x80\x83\x01Ra\x01@a$\x14\x85\x82\x86\x01a\"\xD5V[`\xA0\x84\x01Ra\x01\x80a$(\x86\x82\x87\x01a\"\xD5V[`\xC0\x85\x01Ra\x01\xC0a$<\x87\x82\x88\x01a\"\xD5V[`\xE0\x86\x01Ra\x02\0a$P\x88\x82\x89\x01a\"\xD5V[\x85\x87\x01Ra\x02@\x94Pa$e\x88\x86\x89\x01a\"\xD5V[a\x01 \x87\x01Ra\x02\x80a$z\x89\x82\x8A\x01a\"\xD5V[\x85\x88\x01Ra\x02\xC0\x94Pa$\x8F\x89\x86\x8A\x01a\"\xD5V[a\x01`\x88\x01Ra$\xA3\x89a\x03\0\x8A\x01a\"\xD5V[\x84\x88\x01Ra\x03@\x88\x015a\x01\xA0\x88\x01Ra\x03`\x88\x015\x83\x88\x01Ra\x03\x80\x88\x015a\x01\xE0\x88\x01Ra\x03\xA0\x88\x015\x82\x88\x01Ra\x03\xC0\x88\x015a\x02 \x88\x01Ra\x03\xE0\x88\x015\x86\x88\x01Ra\x04\0\x88\x015a\x02`\x88\x01Ra\x04 \x88\x015\x81\x88\x01RPPPPa\x04@\x84\x015a\x02\xA0\x84\x01Ra\x04`\x84\x015\x81\x84\x01RPP\x92\x91PPV[`\0\x80`\0\x83\x85\x03a\n\x80\x81\x12\x15a%8W`\0\x80\xFD[a\x05\0\x80\x82\x12\x15a%HW`\0\x80\xFD[a%Pa\"\xB1V[\x91P\x855\x82R` \x86\x015` \x83\x01Ra%m\x87`@\x88\x01a\"\xD5V[`@\x83\x01Ra%\x7F\x87`\x80\x88\x01a\"\xD5V[``\x83\x01Ra%\x91\x87`\xC0\x88\x01a\"\xD5V[`\x80\x83\x01Ra\x01\0a%\xA5\x88\x82\x89\x01a\"\xD5V[`\xA0\x84\x01Ra\x01@a%\xB9\x89\x82\x8A\x01a\"\xD5V[`\xC0\x85\x01Ra\x01\x80a%\xCD\x8A\x82\x8B\x01a\"\xD5V[`\xE0\x86\x01Ra\x01\xC0a%\xE1\x8B\x82\x8C\x01a\"\xD5V[\x84\x87\x01Ra\x02\0\x93Pa%\xF6\x8B\x85\x8C\x01a\"\xD5V[a\x01 \x87\x01Ra\x02@a&\x0B\x8C\x82\x8D\x01a\"\xD5V[\x84\x88\x01Ra\x02\x80\x93Pa& \x8C\x85\x8D\x01a\"\xD5V[a\x01`\x88\x01Ra&4\x8Ca\x02\xC0\x8D\x01a\"\xD5V[\x83\x88\x01Ra&F\x8Ca\x03\0\x8D\x01a\"\xD5V[a\x01\xA0\x88\x01Ra&Z\x8Ca\x03@\x8D\x01a\"\xD5V[\x82\x88\x01Ra&l\x8Ca\x03\x80\x8D\x01a\"\xD5V[a\x01\xE0\x88\x01Ra&\x80\x8Ca\x03\xC0\x8D\x01a\"\xD5V[\x85\x88\x01Ra&\x92\x8Ca\x04\0\x8D\x01a\"\xD5V[a\x02 \x88\x01Ra&\xA6\x8Ca\x04@\x8D\x01a\"\xD5V[\x81\x88\x01RPPPa&\xBB\x89a\x04\x80\x8A\x01a\"\xD5V[a\x02`\x85\x01Ra\x04\xC0\x88\x015\x81\x85\x01RPPa\x04\xE0\x86\x015a\x02\xA0\x83\x01R\x81\x94Pa&\xE8\x87\x82\x88\x01a#$V[\x93PPPa&\xFA\x85a\x06\0\x86\x01a#\x92V[\x90P\x92P\x92P\x92V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD\xFE0dNr\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 PLONKVERIFIER2_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/contracts/rust/adapter/src/light_client.rs b/contracts/rust/adapter/src/light_client.rs index a5efb0e19..ed97ab435 100644 --- a/contracts/rust/adapter/src/light_client.rs +++ b/contracts/rust/adapter/src/light_client.rs @@ -1,7 +1,7 @@ //! Helpers and test mocks for Light Client logic use ark_std::str::FromStr; -use diff_test_bn254::{field_to_u256, u256_to_field}; +use diff_test_bn254::u256_to_field; use ethers::{ abi::AbiDecode, abi::Token, @@ -9,7 +9,7 @@ use ethers::{ prelude::{AbiError, EthAbiCodec, EthAbiType}, types::U256, }; -use hotshot_types::light_client::{CircuitField, LightClientState, PublicInput, StakeTableState}; +use hotshot_types::light_client::{LightClientState, StakeTableState}; /// Intermediate representations for `LightClientState` in Solidity #[derive(Clone, Debug, EthAbiType, EthAbiCodec, PartialEq)] diff --git a/contracts/rust/diff-test/src/main.rs b/contracts/rust/diff-test/src/main.rs index 854def41a..7db12b344 100644 --- a/contracts/rust/diff-test/src/main.rs +++ b/contracts/rust/diff-test/src/main.rs @@ -14,7 +14,7 @@ use ethers::{ }; use hotshot_contract_adapter::{ jellyfish::*, - light_client::{ParsedLightClientState, ParsedStakeState}, + light_client::{ParsedLightClientState, ParsedStakeTableState}, }; use hotshot_state_prover::mock_ledger::{ gen_plonk_proof_for_test, MockLedger, MockSystemParam, BLOCKS_PER_EPOCH, STAKE_TABLE_CAPACITY, @@ -410,7 +410,7 @@ fn main() { let mut new_states: Vec = vec![]; let mut proofs: Vec = vec![]; - let mut stake_stakes: Vec = vec![]; + let mut stake_stakes: Vec = vec![]; for i in 1..block_per_epoch + 2 { // only update stake table at the last block, as it would only take effect in next epoch anyway. @@ -432,7 +432,7 @@ fn main() { new_states.push(pi.into()); proofs.push(proof.into()); - let parsed_stake_state = ParsedStakeState { + let parsed_stake_state = ParsedStakeTableState { threshold: field_to_u256(stt.threshold), bls_key_comm: field_to_u256(stt.stake_table_bls_key_comm), schnorr_key_comm: field_to_u256(stt.stake_table_schnorr_key_comm), diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol index 2601daec4..34ee63a8d 100644 --- a/contracts/src/LightClient.sol +++ b/contracts/src/LightClient.sol @@ -43,18 +43,6 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { // // === Storage === // - /// @notice The commitment of the stake table used in current voting - bytes32 public votingStakeTableCommitment; - - /// @notice The quorum threshold for the stake table used in current voting - uint256 public votingThreshold; - - /// @notice The commitment of the stake table frozen for change - bytes32 public frozenStakeTableCommitment; - - /// @notice The quorum threshold for the frozen stake table - uint256 public frozenThreshold; - /// @notice genesis stake commitment StakeTableState public genesisStakeTableState; @@ -229,12 +217,6 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { stateHistoryRetentionPeriod = _stateHistoryRetentionPeriod; - bytes32 initStakeTableComm = computeStakeTableComm(_genesisStakeTableState); - votingStakeTableCommitment = initStakeTableComm; - votingThreshold = _genesisStakeTableState.threshold; - frozenStakeTableCommitment = initStakeTableComm; - frozenThreshold = _genesisStakeTableState.threshold; - updateStateHistory(uint64(block.number), uint64(block.timestamp), _genesis); } @@ -291,8 +273,12 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { IPlonkVerifier.VerifyingKey memory vk = VkLib.getVk(); // Prepare the public input + /** + * TODO + * change the array length once we confirm the items in publicInput + */ uint256[8] memory publicInput; - publicInput[0] = votingThreshold; + publicInput[0] = genesisStakeTableState.threshold; publicInput[1] = uint256(state.viewNum); publicInput[2] = uint256(state.blockHeight); publicInput[3] = BN254.ScalarField.unwrap(state.blockCommRoot); @@ -302,17 +288,6 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { } } - /// @notice Given the light client state, compute the short commitment of the stake table - function computeStakeTableComm(StakeTableState memory state) public pure virtual returns (bytes32) { - return keccak256( - abi.encodePacked( - state.blsKeyComm, - state.schnorrKeyComm, - state.amountComm - ) - ); - } - /// @notice set the permissionedProverMode to true and set the permissionedProver to the /// non-zero address provided /// @dev this function can also be used to update the permissioned prover once it's a different diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol index d12f1458a..147d4f423 100644 --- a/contracts/test/LightClient.t.sol +++ b/contracts/test/LightClient.t.sol @@ -61,18 +61,26 @@ contract LightClientCommonTest is Test { ( LC.LightClientState memory state, bytes32 votingSTComm, - bytes32 frozenSTComm, + , LC.StakeTableState memory stakeState ) = abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeTableState)); genesis = state; genesisStakeTableState = stakeState; - (lcTestProxy, admin) = deployAndInitProxy(genesis, genesisStakeTableState, MAX_HISTORY_SECONDS); + (lcTestProxy, admin) = + deployAndInitProxy(genesis, genesisStakeTableState, MAX_HISTORY_SECONDS); - bytes32 expectedStakeTableComm = lc.computeStakeTableComm(genesisStakeTableState); - assertEq(votingSTComm, expectedStakeTableComm); - assertEq(frozenSTComm, expectedStakeTableComm); - // assertEq(genesisStakeTableState, lc.genesisStakeTableState()); + ( + , + BN254.ScalarField stakeTableBlsKeyComm, + BN254.ScalarField stakeTableSchnorrKeyComm, + BN254.ScalarField stakeTableAmountComm + ) = lc.genesisStakeTableState(); + + assertEq( + abi.encodePacked(votingSTComm), + abi.encodePacked(stakeTableBlsKeyComm, stakeTableSchnorrKeyComm, stakeTableAmountComm) + ); } function assertEq(BN254.ScalarField a, BN254.ScalarField b) public pure { @@ -92,12 +100,6 @@ contract LightClient_constructor_Test is LightClientCommonTest { assertEq(viewNum, genesis.viewNum); assertEq(blockHeight, genesis.blockHeight); assertEq(abi.encode(blockCommRoot), abi.encode(genesis.blockCommRoot)); - - bytes32 stakeTableComm = lc.computeStakeTableComm(genesisStakeTableState); - assertEq(lc.votingStakeTableCommitment(), stakeTableComm); - assertEq(lc.frozenStakeTableCommitment(), stakeTableComm); - assertEq(lc.votingThreshold(), genesisStakeTableState.threshold); - assertEq(lc.frozenThreshold(), genesisStakeTableState.threshold); } // @dev helper function to be able to initialize the contract and capture the revert error @@ -134,8 +136,8 @@ contract LightClient_constructor_Test is LightClientCommonTest { badGenesisStakeTableState.schnorrKeyComm = BN254.ScalarField.wrap(0); initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); - badGenesisStakeTableState.schnorrKeyComm = - badGenesisStakeTableState.schnorrKeyComm; // revert to correct + badGenesisStakeTableState.schnorrKeyComm = badGenesisStakeTableState.schnorrKeyComm; // revert + // to correct badGenesisStakeTableState.amountComm = BN254.ScalarField.wrap(0); initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); @@ -145,7 +147,8 @@ contract LightClient_constructor_Test is LightClientCommonTest { // zero-valued threshold would revert badGenesisStakeTableState.threshold = 0; initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); - badGenesisStakeTableState.threshold = badGenesisStakeTableState.threshold; // revert to correct + badGenesisStakeTableState.threshold = badGenesisStakeTableState.threshold; // revert to + // correct } } @@ -350,7 +353,8 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { (LC.LightClientState memory state,,,) = abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeTableState)); genesis = state; - (lcTestProxy, admin) = deployAndInitProxy(genesis, genesisStakeTableState, MAX_HISTORY_SECONDS); + (lcTestProxy, admin) = + deployAndInitProxy(genesis, genesisStakeTableState, MAX_HISTORY_SECONDS); genesis = state; @@ -384,11 +388,19 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { assertEq(blockHeight, states[i].blockHeight); assertEq(abi.encode(blockCommRoot), abi.encode(states[i].blockCommRoot)); - bytes32 stakeTableComm = lc.computeStakeTableComm(stakeStates[i]); - assertEq(lc.votingStakeTableCommitment(), stakeTableComm); - assertEq(lc.frozenStakeTableCommitment(), stakeTableComm); - assertEq(lc.votingThreshold(), stakeStates[i].threshold); - assertEq(lc.frozenThreshold(), stakeStates[i].threshold); + ( + uint256 threshold, + BN254.ScalarField stakeTableBlsKeyComm, + BN254.ScalarField stakeTableSchnorrKeyComm, + BN254.ScalarField stakeTableAmountComm + ) = lc.genesisStakeTableState(); + + assertEq( + abi.encode(stakeStates[i]), + abi.encode( + threshold, stakeTableBlsKeyComm, stakeTableSchnorrKeyComm, stakeTableAmountComm + ) + ); } } @@ -415,12 +427,6 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { emit LC.NewState(state.viewNum, state.blockHeight, state.blockCommRoot); vm.prank(permissionedProver); lc.newFinalizedState(state, proof); - - bytes32 stakeTableComm = lc.computeStakeTableComm(genesisStakeTableState); - assertEq(lc.votingStakeTableCommitment(), stakeTableComm); - assertEq(lc.frozenStakeTableCommitment(), stakeTableComm); - assertEq(lc.votingThreshold(), genesisStakeTableState.threshold); - assertEq(lc.frozenThreshold(), genesisStakeTableState.threshold); } /// @dev Test unhappy path when a valid but oudated finalized state is submitted diff --git a/contracts/test/LightClientUpgradeSameContract.t.sol b/contracts/test/LightClientUpgradeSameContract.t.sol index 8e6fcdfa8..55c3a6204 100644 --- a/contracts/test/LightClientUpgradeSameContract.t.sol +++ b/contracts/test/LightClientUpgradeSameContract.t.sol @@ -42,11 +42,19 @@ contract LightClientUpgradeSameContractTest is Test { assertEq(blockHeight, stateV1.blockHeight); assertEq(abi.encode(blockCommRoot), abi.encode(stateV1.blockCommRoot)); - bytes32 stakeTableComm = lcV1Proxy.computeStakeTableComm(stakeStateV1); - assertEq(lcV1Proxy.votingStakeTableCommitment(), stakeTableComm); - assertEq(lcV1Proxy.frozenStakeTableCommitment(), stakeTableComm); - assertEq(lcV1Proxy.votingThreshold(), stakeStateV1.threshold); - assertEq(lcV1Proxy.frozenThreshold(), stakeStateV1.threshold); + ( + uint256 threshold, + BN254.ScalarField stakeTableBlsKeyComm, + BN254.ScalarField stakeTableSchnorrKeyComm, + BN254.ScalarField stakeTableAmountComm + ) = lcV1Proxy.genesisStakeTableState(); + + assertEq( + abi.encode(stakeStateV1), + abi.encode( + threshold, stakeTableBlsKeyComm, stakeTableSchnorrKeyComm, stakeTableAmountComm + ) + ); } // that the data remains the same after upgrading the implementation diff --git a/contracts/test/LightClientUpgradeToVx.t.sol b/contracts/test/LightClientUpgradeToVx.t.sol index dbf56a834..ec8d2a9c5 100644 --- a/contracts/test/LightClientUpgradeToVx.t.sol +++ b/contracts/test/LightClientUpgradeToVx.t.sol @@ -29,7 +29,7 @@ contract LightClientUpgradeToVxTest is Test { address public admin; address public proxy; - uint32 constant MAX_HISTORY_SECONDS = 864000; //10 days + uint32 public constant MAX_HISTORY_SECONDS = 864000; //10 days // deploy the first implementation with its proxy function setUp() public { @@ -48,12 +48,6 @@ contract LightClientUpgradeToVxTest is Test { assertEq(viewNum, stateV1.viewNum); assertEq(blockHeight, stateV1.blockHeight); assertEq(abi.encode(blockCommRoot), abi.encode(stateV1.blockCommRoot)); - - bytes32 stakeTableComm = lcV1Proxy.computeStakeTableComm(stakeStateV1); - assertEq(lcV1Proxy.votingStakeTableCommitment(), stakeTableComm); - assertEq(lcV1Proxy.frozenStakeTableCommitment(), stakeTableComm); - assertEq(lcV1Proxy.votingThreshold(), stakeStateV1.threshold); - assertEq(lcV1Proxy.frozenThreshold(), stakeStateV1.threshold); } // test that the data remains the same after upgrading the implementation diff --git a/contracts/test/mocks/LightClientMock.sol b/contracts/test/mocks/LightClientMock.sol index c0414ebae..bb609e335 100644 --- a/contracts/test/mocks/LightClientMock.sol +++ b/contracts/test/mocks/LightClientMock.sol @@ -36,7 +36,7 @@ contract LightClientMock is LC { // Prepare the public input uint256[8] memory publicInput; - publicInput[0] = votingThreshold; + publicInput[0] = genesisStakeTableState.threshold; publicInput[1] = uint256(state.viewNum); publicInput[2] = uint256(state.blockHeight); publicInput[3] = BN254.ScalarField.unwrap(state.blockCommRoot); diff --git a/foundry.toml b/foundry.toml index c9618d1a0..500fba25a 100644 --- a/foundry.toml +++ b/foundry.toml @@ -11,7 +11,7 @@ broadcast = "contracts/broadcast" cache_path = "contracts/cache" optimizer = true optimizer_runs = 200 # Increasing the number of runs saves gas but increases the size of the contract -viaIR = true +# viaIR = true # Version should match the solc installed via flake, otherwise the contract # artifacts may differ slightly. solc = "0.8.23" diff --git a/hotshot-state-prover/src/mock_ledger.rs b/hotshot-state-prover/src/mock_ledger.rs index 73b232b12..9b0f7ecd2 100644 --- a/hotshot-state-prover/src/mock_ledger.rs +++ b/hotshot-state-prover/src/mock_ledger.rs @@ -219,7 +219,7 @@ impl MockLedger { } /// Return the light client state and proof of consensus on this finalized state - pub fn gen_state_proof(&mut self) -> (GenericPublicInput, Proof, GenericStakeState) { + pub fn gen_state_proof(&mut self) -> (GenericPublicInput, Proof, GenericStakeTableState) { let state_msg: [F; 3] = self.state.clone().into(); let st: Vec<(BLSVerKey, U256, SchnorrVerKey)> = self @@ -299,7 +299,7 @@ impl MockLedger { .clone() .commitment(SnapshotVersion::LastEpochStart) .unwrap(); - let stt = StakeState { + let stt = StakeTableState { threshold: u256_to_field(self.threshold), stake_table_bls_key_comm: stake_table_comm.0, stake_table_schnorr_key_comm: stake_table_comm.1, @@ -313,7 +313,7 @@ impl MockLedger { /// in an attempt to hijack the correct stake table. pub fn gen_state_proof_with_fake_stakers( &mut self, - ) -> (GenericPublicInput, Proof, GenericStakeState) { + ) -> (GenericPublicInput, Proof, GenericStakeTableState) { let new_state = self.state.clone(); let (adv_qc_keys, adv_state_keys) = @@ -368,7 +368,7 @@ impl MockLedger { let (bls_key_comm, schnorr_key_comm, amount_comm) = adv_st.commitment(SnapshotVersion::LastEpochStart).unwrap(); - let stake_table = StakeState { + let stake_table = StakeTableState { threshold: u256_to_field(self.threshold), stake_table_bls_key_comm: bls_key_comm, stake_table_schnorr_key_comm: schnorr_key_comm, @@ -413,7 +413,7 @@ impl MockLedger { .unwrap(), ); - let stake_table: ParsedStakeState = ParsedStakeState { + let stake_table: ParsedStakeTableState = ParsedStakeTableState { threshold: self.threshold, bls_key_comm: field_to_u256(bls_key_comm), schnorr_key_comm: field_to_u256(schnorr_key_comm), diff --git a/hotshot-state-prover/src/service.rs b/hotshot-state-prover/src/service.rs index 1cb2954a4..f93db0639 100644 --- a/hotshot-state-prover/src/service.rs +++ b/hotshot-state-prover/src/service.rs @@ -203,7 +203,7 @@ pub fn light_client_genesis_from_stake_table( pub async fn light_client_genesis_stake( sequencer_url: &Url, stake_table_capacity: usize, -) -> anyhow::Result { +) -> anyhow::Result { let st = init_stake_table_from_sequencer(sequencer_url, stake_table_capacity) .await .with_context(|| "Failed to initialize stake table")?; @@ -213,13 +213,13 @@ pub async fn light_client_genesis_stake( #[inline] pub fn light_client_genesis_stake_from_stake_table( st: StakeTable, -) -> anyhow::Result { +) -> anyhow::Result { let (bls_comm, schnorr_comm, stake_comm) = st .commitment(SnapshotVersion::LastEpochStart) .expect("Commitment computation shouldn't fail."); let honest_threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart)?); - let stt = ParsedStakeState { + let stt = ParsedStakeTableState { threshold: honest_threshold, bls_key_comm: field_to_u256(bls_comm), schnorr_key_comm: field_to_u256(schnorr_comm), @@ -563,7 +563,7 @@ mod test { use anyhow::Result; use ark_ed_on_bn254::EdwardsConfig; use ethers::utils::{Anvil, AnvilInstance}; - use hotshot_contract_adapter::light_client::{LightClientConstructorArgs, ParsedStakeState}; + use hotshot_contract_adapter::light_client::{LightClientConstructorArgs, ParsedStakeTableState}; use hotshot_stake_table::vec_based::StakeTable; use hotshot_types::light_client::StateSignKey; use jf_signature::{schnorr::SchnorrSignatureScheme, SignatureScheme}; @@ -585,7 +585,7 @@ mod test { #[allow(clippy::type_complexity)] fn init_ledger_for_test() -> ( ParsedLightClientState, - ParsedStakeState, + ParsedStakeTableState, Vec, Vec<(StateSignKey, StateVerKey)>, StakeTable, @@ -610,7 +610,7 @@ mod test { // everybody signs, then generate a proof fn gen_state_proof( new_state: ParsedLightClientState, - genesis_stake_state: &ParsedStakeState, + genesis_stake_state: &ParsedStakeTableState, state_keypairs: &[(StateSignKey, StateVerKey)], st: &StakeTable, ) -> (PublicInput, Proof) { @@ -670,7 +670,7 @@ mod test { async fn deploy_contract_for_test( anvil: &AnvilInstance, genesis: ParsedLightClientState, - stake_genesis: ParsedStakeState, + stake_genesis: ParsedStakeTableState, ) -> Result<(Arc, LightClient)> { let provider = Provider::::try_from(anvil.endpoint())?; let signer = Wallet::from(anvil.keys()[0].clone()) @@ -679,7 +679,7 @@ mod test { let genesis_constructor_args: LightClientConstructorArgs = LightClientConstructorArgs { light_client_state: genesis, - stake_state: stake_genesis, + stake_table_state: stake_genesis, max_history_seconds: MAX_HISTORY_SECONDS, }; @@ -726,7 +726,7 @@ mod test { setup_test(); let anvil = Anvil::new().spawn(); let dummy_genesis = ParsedLightClientState::dummy_genesis(); - let dummy_stake_genesis = ParsedStakeState::dummy_genesis(); + let dummy_stake_genesis = ParsedStakeTableState::dummy_genesis(); let (_wallet, contract) = deploy_contract_for_test(&anvil, dummy_genesis.clone(), dummy_stake_genesis.clone()) .await?; @@ -735,7 +735,7 @@ mod test { let genesis: ParsedLightClientState = contract.genesis_state().await?.into(); assert_eq!(genesis, dummy_genesis); - let stake_genesis: ParsedStakeState = contract.genesis_stake_state().await?.into(); + let stake_genesis: ParsedStakeTableState = contract.genesis_stake_table_state().await?.into(); assert_eq!(stake_genesis, dummy_stake_genesis); let mut config = StateProverConfig::default(); diff --git a/sequencer/src/api.rs b/sequencer/src/api.rs index cb9d0a131..ca57edc29 100644 --- a/sequencer/src/api.rs +++ b/sequencer/src/api.rs @@ -384,7 +384,7 @@ pub mod test_helpers { stream::StreamExt, }; use hotshot::types::{Event, EventType}; - use hotshot_contract_adapter::light_client::{ParsedLightClientState, ParsedStakeState}; + use hotshot_contract_adapter::light_client::{ParsedLightClientState, ParsedStakeTableState}; use hotshot_types::{ event::LeafInfo, traits::{metrics::NoMetrics, node_implementation::ConsensusTime}, @@ -632,7 +632,7 @@ pub mod test_helpers { light_client_genesis_from_stake_table(st).unwrap() } - pub fn light_client_genesis_stake(&self) -> ParsedStakeState { + pub fn light_client_genesis_stake(&self) -> ParsedStakeTableState { let st = self.cfg.stake_table(); light_client_genesis_stake_from_stake_table(st).unwrap() } From af5126122179c8c58999c32b3a084b1bd8e4a2c0 Mon Sep 17 00:00:00 2001 From: Alex Xiong Date: Fri, 6 Sep 2024 11:17:10 +0800 Subject: [PATCH 14/27] state prover tests passing --- Cargo.lock | 24 ++++---- contracts/rust/diff-test/src/main.rs | 22 ++------ hotshot-state-prover/src/circuit.rs | 9 ++- hotshot-state-prover/src/service.rs | 76 ++++++++++---------------- hotshot-state-prover/src/test_utils.rs | 5 +- sequencer/src/api.rs | 15 ++--- sequencer/src/bin/deploy.rs | 5 +- sequencer/src/bin/espresso-dev-node.rs | 6 +- utils/src/deployer.rs | 8 +-- 9 files changed, 61 insertions(+), 109 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1df4adc17..8f2ae2cb1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4080,7 +4080,7 @@ dependencies = [ [[package]] name = "hotshot" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#688e0899cd85e9f5601b143f533acd429b2a7f1c" dependencies = [ "anyhow", "async-broadcast", @@ -4127,7 +4127,7 @@ dependencies = [ [[package]] name = "hotshot-builder-api" version = "0.1.7" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#688e0899cd85e9f5601b143f533acd429b2a7f1c" dependencies = [ "async-trait", "clap", @@ -4228,7 +4228,7 @@ dependencies = [ [[package]] name = "hotshot-example-types" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#688e0899cd85e9f5601b143f533acd429b2a7f1c" dependencies = [ "anyhow", "async-broadcast", @@ -4261,7 +4261,7 @@ dependencies = [ [[package]] name = "hotshot-fakeapi" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#688e0899cd85e9f5601b143f533acd429b2a7f1c" dependencies = [ "anyhow", "async-lock 2.8.0", @@ -4280,7 +4280,7 @@ dependencies = [ [[package]] name = "hotshot-macros" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#688e0899cd85e9f5601b143f533acd429b2a7f1c" dependencies = [ "derive_builder", "proc-macro2", @@ -4291,7 +4291,7 @@ dependencies = [ [[package]] name = "hotshot-orchestrator" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#688e0899cd85e9f5601b143f533acd429b2a7f1c" dependencies = [ "anyhow", "async-compatibility-layer", @@ -4377,7 +4377,7 @@ dependencies = [ [[package]] name = "hotshot-stake-table" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#688e0899cd85e9f5601b143f533acd429b2a7f1c" dependencies = [ "ark-bn254", "ark-ed-on-bn254", @@ -4439,7 +4439,7 @@ dependencies = [ [[package]] name = "hotshot-task" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#688e0899cd85e9f5601b143f533acd429b2a7f1c" dependencies = [ "anyhow", "async-broadcast", @@ -4454,7 +4454,7 @@ dependencies = [ [[package]] name = "hotshot-task-impls" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#688e0899cd85e9f5601b143f533acd429b2a7f1c" dependencies = [ "anyhow", "async-broadcast", @@ -4491,7 +4491,7 @@ dependencies = [ [[package]] name = "hotshot-testing" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#688e0899cd85e9f5601b143f533acd429b2a7f1c" dependencies = [ "anyhow", "async-broadcast", @@ -4537,7 +4537,7 @@ dependencies = [ [[package]] name = "hotshot-types" version = "0.1.11" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#688e0899cd85e9f5601b143f533acd429b2a7f1c" dependencies = [ "anyhow", "ark-bn254", @@ -5794,7 +5794,7 @@ dependencies = [ [[package]] name = "libp2p-networking" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#623ad43e071d7b2a9e5f59702c2f4a1aad3462cd" +source = "git+https://github.com/EspressoSystems/hotshot?branch=lc-contract-updates#688e0899cd85e9f5601b143f533acd429b2a7f1c" dependencies = [ "anyhow", "async-compatibility-layer", diff --git a/contracts/rust/diff-test/src/main.rs b/contracts/rust/diff-test/src/main.rs index 7db12b344..f554da6b0 100644 --- a/contracts/rust/diff-test/src/main.rs +++ b/contracts/rust/diff-test/src/main.rs @@ -12,10 +12,7 @@ use ethers::{ abi::{AbiDecode, AbiEncode, Address}, types::{Bytes, U256}, }; -use hotshot_contract_adapter::{ - jellyfish::*, - light_client::{ParsedLightClientState, ParsedStakeTableState}, -}; +use hotshot_contract_adapter::{jellyfish::*, light_client::ParsedLightClientState}; use hotshot_state_prover::mock_ledger::{ gen_plonk_proof_for_test, MockLedger, MockSystemParam, BLOCKS_PER_EPOCH, STAKE_TABLE_CAPACITY, }; @@ -410,7 +407,6 @@ fn main() { let mut new_states: Vec = vec![]; let mut proofs: Vec = vec![]; - let mut stake_stakes: Vec = vec![]; for i in 1..block_per_epoch + 2 { // only update stake table at the last block, as it would only take effect in next epoch anyway. @@ -428,20 +424,12 @@ fn main() { ledger.elapse_with_block(); - let (pi, proof, stt) = ledger.gen_state_proof(); + let (pi, proof) = ledger.gen_state_proof(); new_states.push(pi.into()); proofs.push(proof.into()); - - let parsed_stake_state = ParsedStakeTableState { - threshold: field_to_u256(stt.threshold), - bls_key_comm: field_to_u256(stt.stake_table_bls_key_comm), - schnorr_key_comm: field_to_u256(stt.stake_table_schnorr_key_comm), - amount_comm: field_to_u256(stt.stake_table_amount_comm), - }; - stake_stakes.push(parsed_stake_state); } - let res = (new_states, proofs, stake_stakes); + let res = (new_states, proofs); println!("{}", res.encode_hex()); } Action::MockSkipBlocks => { @@ -466,7 +454,7 @@ fn main() { } let res = if require_valid_proof { - let (pi, proof, _) = ledger.gen_state_proof(); + let (pi, proof) = ledger.gen_state_proof(); let pi_parsed: ParsedLightClientState = pi.into(); let proof_parsed: ParsedPlonkProof = proof.into(); (pi_parsed, proof_parsed) @@ -488,7 +476,7 @@ fn main() { ledger.elapse_with_block(); // first block in epoch 1 - let (pi, proof, _) = ledger.gen_state_proof(); + let (pi, proof) = ledger.gen_state_proof(); new_states.push(pi.into()); proofs.push(proof.into()); diff --git a/hotshot-state-prover/src/circuit.rs b/hotshot-state-prover/src/circuit.rs index 1edc13085..536d9ad3d 100644 --- a/hotshot-state-prover/src/circuit.rs +++ b/hotshot-state-prover/src/circuit.rs @@ -403,14 +403,12 @@ mod tests { .map(|b| if b { F::from(1u64) } else { F::from(0u64) }) .collect::>(); // good path - let mut good_st_state = st_state.clone(); - good_st_state.threshold = F::from(26u32); let (circuit, public_inputs) = build( &entries, &bit_vec, &bit_masked_sigs, &lightclient_state, - &good_st_state, + &st_state, ST_CAPACITY, ) .unwrap(); @@ -418,6 +416,8 @@ mod tests { .check_circuit_satisfiability(public_inputs.as_ref()) .is_ok()); + // lower threshold should also pass + let mut good_st_state = st_state.clone(); good_st_state.threshold = F::from(10u32); let (circuit, public_inputs) = build( &entries, @@ -448,9 +448,8 @@ mod tests { .is_err()); // bad path: total weight doesn't meet the threshold - // bit vector with total weight 23 let bad_bit_vec = [ - true, true, true, true, true, false, false, true, false, false, + false, false, true, false, true, false, false, true, false, false, ]; let bad_bit_masked_sigs = bad_bit_vec .iter() diff --git a/hotshot-state-prover/src/service.rs b/hotshot-state-prover/src/service.rs index 0dd5a3f54..26dec734f 100644 --- a/hotshot-state-prover/src/service.rs +++ b/hotshot-state-prover/src/service.rs @@ -22,13 +22,14 @@ use ethers::{ }; use futures::FutureExt; use hotshot_contract_adapter::{ - jellyfish::{field_to_u256, u256_to_field, ParsedPlonkProof}, + jellyfish::{field_to_u256, ParsedPlonkProof}, light_client::{ParsedLightClientState, ParsedStakeTableState}, }; use hotshot_stake_table::vec_based::{config::FieldType, StakeTable}; use hotshot_types::{ light_client::{ - CircuitField, GenericPublicInput, LightClientState, PublicInput, StakeTableState, StateSignaturesBundle, StateVerKey + CircuitField, LightClientState, PublicInput, StakeTableState, StateSignaturesBundle, + StateVerKey, }, signature_key::BLSPubKey, traits::{ @@ -50,8 +51,6 @@ use vbs::version::StaticVersionType; use crate::snark::{generate_state_update_proof, Proof, ProvingKey}; -type F = ark_ed_on_bn254::Fq; - /// A wallet with local signer and connected to network via http pub type SignerWallet = SignerMiddleware, LocalWallet>; @@ -167,10 +166,11 @@ async fn init_stake_table_from_sequencer( Ok(st) } +/// Returns both genesis light client state and stake table state pub async fn light_client_genesis( sequencer_url: &Url, stake_table_capacity: usize, -) -> anyhow::Result { +) -> anyhow::Result<(ParsedLightClientState, ParsedStakeTableState)> { let st = init_stake_table_from_sequencer(sequencer_url, stake_table_capacity) .await .with_context(|| "Failed to initialize stake table")?; @@ -180,51 +180,25 @@ pub async fn light_client_genesis( #[inline] pub fn light_client_genesis_from_stake_table( st: StakeTable, -) -> anyhow::Result { +) -> anyhow::Result<(ParsedLightClientState, ParsedStakeTableState)> { let (bls_comm, schnorr_comm, stake_comm) = st .commitment(SnapshotVersion::LastEpochStart) .expect("Commitment computation shouldn't fail."); let threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart)?); - let pi = vec![ - F::from(0_u64), // Arbitrary value for view number - F::from(0_u64), // Arbitrary value for block height - F::from(0_u64), // Arbitrary value for state commitment - bls_comm, - schnorr_comm, - stake_comm, - u256_to_field(threshold), - ]; - let pi: GenericPublicInput = pi.into(); - Ok(pi.into()) -} - -pub async fn light_client_genesis_stake( - sequencer_url: &Url, - stake_table_capacity: usize, -) -> anyhow::Result { - let st = init_stake_table_from_sequencer(sequencer_url, stake_table_capacity) - .await - .with_context(|| "Failed to initialize stake table")?; - light_client_genesis_stake_from_stake_table(st) -} -#[inline] -pub fn light_client_genesis_stake_from_stake_table( - st: StakeTable, -) -> anyhow::Result { - let (bls_comm, schnorr_comm, stake_comm) = st - .commitment(SnapshotVersion::LastEpochStart) - .expect("Commitment computation shouldn't fail."); - let honest_threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart)?); - - let stt = ParsedStakeTableState { - threshold: honest_threshold, - bls_key_comm: field_to_u256(bls_comm), - schnorr_key_comm: field_to_u256(schnorr_comm), - amount_comm: field_to_u256(stake_comm), - }; - - Ok(stt) + Ok(( + ParsedLightClientState { + view_num: 0, + block_height: 0, + block_comm_root: U256::from(0u32), + }, + ParsedStakeTableState { + bls_key_comm: field_to_u256(bls_comm), + schnorr_key_comm: field_to_u256(schnorr_comm), + amount_comm: field_to_u256(stake_comm), + threshold, + }, + )) } pub fn load_proving_key(stake_table_capacity: usize) -> ProvingKey { @@ -304,7 +278,10 @@ pub async fn read_contract_state( let st_state: ParsedStakeTableState = match contract.genesis_stake_table_state().call().await { Ok(s) => s.into(), Err(e) => { - tracing::error!("unable to read genesis_stake_table_state from contract: {}", e); + tracing::error!( + "unable to read genesis_stake_table_state from contract: {}", + e + ); return Err(ProverError::ContractError(e.into())); } }; @@ -565,7 +542,9 @@ mod test { use anyhow::Result; use ark_ed_on_bn254::EdwardsConfig; use ethers::utils::{Anvil, AnvilInstance}; - use hotshot_contract_adapter::light_client::{LightClientConstructorArgs, ParsedStakeTableState}; + use hotshot_contract_adapter::light_client::{ + LightClientConstructorArgs, ParsedStakeTableState, + }; use hotshot_stake_table::vec_based::StakeTable; use hotshot_types::light_client::StateSignKey; use jf_signature::{schnorr::SchnorrSignatureScheme, SignatureScheme}; @@ -737,7 +716,8 @@ mod test { let genesis: ParsedLightClientState = contract.genesis_state().await?.into(); assert_eq!(genesis, dummy_genesis); - let stake_genesis: ParsedStakeTableState = contract.genesis_stake_table_state().await?.into(); + let stake_genesis: ParsedStakeTableState = + contract.genesis_stake_table_state().await?.into(); assert_eq!(stake_genesis, dummy_stake_genesis); let mut config = StateProverConfig::default(); diff --git a/hotshot-state-prover/src/test_utils.rs b/hotshot-state-prover/src/test_utils.rs index bcb3004a7..916483da2 100644 --- a/hotshot-state-prover/src/test_utils.rs +++ b/hotshot-state-prover/src/test_utils.rs @@ -66,11 +66,10 @@ pub(crate) fn genesis_stake_table_state( st.commitment(SnapshotVersion::LastEpochStart).unwrap(); let threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart).unwrap()); - let st_state = GenericStakeTableState { + GenericStakeTableState { bls_key_comm, schnorr_key_comm, amount_comm, threshold: u256_to_field(&threshold), - }; - st_state + } } diff --git a/sequencer/src/api.rs b/sequencer/src/api.rs index cec655510..c24f8d1ac 100644 --- a/sequencer/src/api.rs +++ b/sequencer/src/api.rs @@ -22,9 +22,7 @@ use hotshot_events_service::events_source::{ }; use hotshot_orchestrator::config::NetworkConfig; use hotshot_query_service::data_source::ExtensibleDataSource; -use hotshot_state_prover::service::{ - light_client_genesis_from_stake_table, light_client_genesis_stake_from_stake_table, -}; +use hotshot_state_prover::service::light_client_genesis_from_stake_table; use hotshot_types::{ data::ViewNumber, light_client::StateSignatureRequestBody, @@ -386,7 +384,8 @@ pub mod test_helpers { use hotshot::types::{Event, EventType}; use hotshot_contract_adapter::light_client::{ParsedLightClientState, ParsedStakeTableState}; use hotshot_types::{ - event::LeafInfo, light_client::LightClientState, traits::{metrics::NoMetrics, node_implementation::ConsensusTime} + event::LeafInfo, + traits::{metrics::NoMetrics, node_implementation::ConsensusTime}, }; use itertools::izip; use jf_merkle_tree::{MerkleCommitment, MerkleTreeScheme}; @@ -626,17 +625,11 @@ pub mod test_helpers { } } - // FIXME: update this logic - pub fn light_client_genesis(&self) -> LightClientState { + pub fn light_client_genesis(&self) -> (ParsedLightClientState, ParsedStakeTableState) { let st = self.cfg.stake_table(); light_client_genesis_from_stake_table(st).unwrap() } - pub fn light_client_genesis_stake(&self) -> ParsedStakeTableState { - let st = self.cfg.stake_table(); - light_client_genesis_stake_from_stake_table(st).unwrap() - } - pub async fn stop_consensus(&mut self) { self.server.shutdown_consensus().await; diff --git a/sequencer/src/bin/deploy.rs b/sequencer/src/bin/deploy.rs index 8e98fb04b..5552ff5d8 100644 --- a/sequencer/src/bin/deploy.rs +++ b/sequencer/src/bin/deploy.rs @@ -3,7 +3,7 @@ use std::{fs::File, io::stdout, path::PathBuf}; use clap::Parser; use futures::FutureExt; use hotshot_stake_table::config::STAKE_TABLE_CAPACITY; -use hotshot_state_prover::service::{light_client_genesis, light_client_genesis_stake}; +use hotshot_state_prover::service::light_client_genesis; use sequencer_utils::{ deployer::{deploy, ContractGroup, Contracts, DeployedContracts}, logging, @@ -101,8 +101,6 @@ async fn main() -> anyhow::Result<()> { let sequencer_url = opt.sequencer_url.clone(); let genesis = light_client_genesis(&sequencer_url, opt.stake_table_capacity).boxed(); - let genesis_stake = - light_client_genesis_stake(&sequencer_url, opt.stake_table_capacity).boxed(); let contracts = deploy( opt.rpc_url, @@ -111,7 +109,6 @@ async fn main() -> anyhow::Result<()> { opt.use_mock_contract, opt.only, genesis, - genesis_stake, contracts, ) .await?; diff --git a/sequencer/src/bin/espresso-dev-node.rs b/sequencer/src/bin/espresso-dev-node.rs index 1329451f9..44931f6f2 100644 --- a/sequencer/src/bin/espresso-dev-node.rs +++ b/sequencer/src/bin/espresso-dev-node.rs @@ -195,8 +195,7 @@ async fn main() -> anyhow::Result<()> { tracing::info!("Hotshot config {config:?}"); - let light_client_genesis = network.light_client_genesis(); - let light_client_genesis_stake = network.light_client_genesis_stake(); + let lc_genesis = network.light_client_genesis(); let contracts = Contracts::new(); let mut light_client_addresses = vec![]; @@ -240,8 +239,7 @@ async fn main() -> anyhow::Result<()> { account_index, true, None, - async { Ok(light_client_genesis.clone()) }.boxed(), - async { Ok(light_client_genesis_stake.clone()) }.boxed(), + async { Ok(lc_genesis.clone()) }.boxed(), contracts.clone(), ) .await?; diff --git a/utils/src/deployer.rs b/utils/src/deployer.rs index b1e35ce7b..725e4a958 100644 --- a/utils/src/deployer.rs +++ b/utils/src/deployer.rs @@ -310,8 +310,7 @@ pub async fn deploy( account_index: u32, use_mock_contract: bool, only: Option>, - genesis: BoxFuture<'_, anyhow::Result>, - genesis_stake: BoxFuture<'_, anyhow::Result>, + genesis: BoxFuture<'_, anyhow::Result<(ParsedLightClientState, ParsedStakeTableState)>>, mut contracts: Contracts, ) -> anyhow::Result { let provider = Provider::::try_from(l1url.to_string())?; @@ -358,11 +357,10 @@ pub async fn deploy( }; let light_client = LightClient::new(lc_address, l1.clone()); - let genesis = genesis.await?.clone(); - let genesis_stake = genesis_stake.await?.clone(); + let (genesis_lc, genesis_stake) = genesis.await?.clone(); let data = light_client - .initialize(genesis.into(), genesis_stake.into(), 864000, owner) + .initialize(genesis_lc.into(), genesis_stake.into(), 864000, owner) .calldata() .context("calldata for initialize transaction not available")?; contracts From d25cc1643a89f91665fc2dcd045bf3406d1c3050 Mon Sep 17 00:00:00 2001 From: Alex Xiong Date: Fri, 6 Sep 2024 11:23:39 +0800 Subject: [PATCH 15/27] refactor!: PlonkVerifier public input reduced from 8 to 7 (#1984) * update PublicInput length from 8 to 4 * Revert "update PublicInput length from 8 to 4" This reverts commit 40e2c67547f8c7b50ad3adf7defce46a1aa4d4e1. * update PublicInput length from 8 to 7. --------- Co-authored-by: Philippe Camacho --- .../artifacts/LightClientMock_bytecode.json | 2 +- .../artifacts/LightClient_bytecode.json | 2 +- contract-bindings/src/plonk_verifier.rs | 22 ++++++------ contract-bindings/src/plonk_verifier_2.rs | 22 ++++++------ contracts/rust/diff-test/src/main.rs | 8 ++--- contracts/src/LightClient.sol | 8 ++--- contracts/src/libraries/PlonkVerifier.sol | 34 +++++++++---------- contracts/src/libraries/PlonkVerifier2.sol | 29 ++++++++-------- contracts/src/libraries/PolynomialEval.sol | 27 +++++++-------- contracts/test/PlonkVerifier.t.sol | 30 ++++++++-------- contracts/test/PlonkVerifier2.t.sol | 22 ++++++------ contracts/test/PolynomialEval.t.sol | 14 ++++---- contracts/test/mocks/LightClientMock.sol | 4 +-- hotshot-state-prover/src/mock_ledger.rs | 4 +-- 14 files changed, 109 insertions(+), 119 deletions(-) diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json index 5b107fd4c..de1dcfc00 100644 --- a/contract-bindings/artifacts/LightClientMock_bytecode.json +++ b/contract-bindings/artifacts/LightClientMock_bytecode.json @@ -1 +1 @@ -"0x60a0604052306080523480156200001557600080fd5b50604051620034943803806200349483398101604081905262000038916200053b565b6200004262000058565b6200004f8383836200010c565b50505062000697565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a95760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001095780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b82516001600160401b031615158062000131575060208301516001600160401b031615155b806200013f57506020820151155b806200014d57506040820151155b806200015b57506060820151155b806200016657508151155b1562000185576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b0390811668010000000000000000026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b199091161790556200022443428562000229565b505050565b600a5415801590620002f75750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b03169081106200026c576200026c620005f4565b6000918252602090912060039091020154600a8054680100000000000000009092046001600160401b031691620002a69060019062000620565b81548110620002b957620002b9620005f4565b6000918252602090912060039091020154620002eb91906801000000000000000090046001600160401b03166200063c565b6001600160401b031610155b156200039557600954600a805490916001600160401b0316908110620003215762000321620005f4565b60009182526020822060039091020180546001600160801b03191681556001810180546001600160401b0319169055600201819055600980546001600160401b0316916200036f8362000666565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516060810182526001600160401b03948516815292841660208085019182528251808401845284820151871681529383015184820152918401928352600a805460018101825560009190915293517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86003909502948501805492519187166001600160801b0319909316929092176801000000000000000091871691909102179055905180517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a9840180546001600160401b031916919095161790935591909101517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aa90910155565b604051606081016001600160401b0381118282101715620004d257634e487b7160e01b600052604160045260246000fd5b60405290565b604051608081016001600160401b0381118282101715620004d257634e487b7160e01b600052604160045260246000fd5b80516001600160401b03811681146200052157600080fd5b919050565b805163ffffffff811681146200052157600080fd5b60008060008385036101008112156200055357600080fd5b60608112156200056257600080fd5b6200056c620004a1565b620005778662000509565b8152620005876020870162000509565b60208201526040868101519082015293506080605f1982011215620005ab57600080fd5b50620005b6620004d8565b60608581015182526080860151602083015260a0860151604083015260c0860151908201529150620005eb60e0850162000526565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156200063657620006366200060a565b92915050565b6001600160401b038281168282160390808211156200065f576200065f6200060a565b5092915050565b60006001600160401b038281166002600160401b031981016200068d576200068d6200060a565b6001019392505050565b608051612dd3620006c1600039600081816111be015281816111e701526113660152612dd36000f3fe60806040526004361061019c5760003560e01c80638584d23f116100ec578063bd32519a1161008a578063d24d933d11610064578063d24d933d146105c4578063e0303301146105f4578063f2fde38b14610614578063f9e50d191461063457600080fd5b8063bd32519a1461053e578063c23b9e9e1461056f578063c8e5e498146105a857600080fd5b80639baa3cc9116100c65780639baa3cc9146104325780639fdb54a714610452578063ad3cb1cc146104a8578063b5adea3c146104e657600080fd5b80638584d23f146103a85780638da5cb5b146103d557806396c1ca611461041257600080fd5b80632f79889d116101595780634f1ef286116101335780634f1ef2861461034857806352d1902d1461035b57806369cc6a041461037e578063715018a61461039357600080fd5b80632f79889d14610295578063313df7b1146102cd578063426d31941461030557600080fd5b8063013fa5fc146101a157806302b592f3146101c35780630d8e6e2c146101fb5780632063d4f7146102285780632d52aad6146102485780632f5f460014610275575b600080fd5b3480156101ad57600080fd5b506101c16101bc3660046121c9565b610649565b005b3480156101cf57600080fd5b506101e36101de3660046121e4565b610706565b6040516101f2939291906121fd565b60405180910390f35b34801561020757600080fd5b506040805160018152600060208201819052918101919091526060016101f2565b34801561023457600080fd5b506101c161024336600461237f565b610763565b34801561025457600080fd5b506101c16102633660046121e4565b600b805460ff19166001179055600c55565b34801561028157600080fd5b506101c1610290366004612533565b6108b7565b3480156102a157600080fd5b506009546102b5906001600160401b031681565b6040516001600160401b0390911681526020016101f2565b3480156102d957600080fd5b506008546102ed906001600160a01b031681565b6040516001600160a01b0390911681526020016101f2565b34801561031157600080fd5b506000546001546002546003546103289392919084565b6040805194855260208501939093529183015260608201526080016101f2565b6101c1610356366004612648565b61096d565b34801561036757600080fd5b50610370610988565b6040519081526020016101f2565b34801561038a57600080fd5b506101c16109a5565b34801561039f57600080fd5b506101c1610a15565b3480156103b457600080fd5b506103c86103c33660046121e4565b610a27565b6040516101f291906126ed565b3480156103e157600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166102ed565b34801561041e57600080fd5b506101c161042d366004612721565b610b99565b34801561043e57600080fd5b506101c161044d36600461273c565b610c0e565b34801561045e57600080fd5b50600654600754610482916001600160401b0380821692600160401b909204169083565b604080516001600160401b039485168152939092166020840152908201526060016101f2565b3480156104b457600080fd5b506104d9604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101f2919061280d565b3480156104f257600080fd5b506101c1610501366004612840565b80516006805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905560400151600755565b34801561054a57600080fd5b5060085461055f90600160a01b900460ff1681565b60405190151581526020016101f2565b34801561057b57600080fd5b5060085461059390600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101f2565b3480156105b457600080fd5b506101c1600b805460ff19169055565b3480156105d057600080fd5b50600454600554610482916001600160401b0380821692600160401b909204169083565b34801561060057600080fd5b5061055f61060f36600461285c565b610d32565b34801561062057600080fd5b506101c161062f3660046121c9565b610d68565b34801561064057600080fd5b50600a54610370565b610651610dab565b6001600160a01b0381166106785760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036106a75760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a81b0319166001600160a01b0383811691909117600160a01b1791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600a818154811061071657600080fd5b600091825260209182902060039091020180546040805180820190915260018301546001600160401b039081168252600290930154938101939093528181169350600160401b9004169083565b600854600160a01b900460ff16801561078757506008546001600160a01b03163314155b156107a5576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806107de575060065460208301516001600160401b03600160401b9092048216911611155b156107fc5760405163051c46ef60e01b815260040160405180910390fd5b6108098260400151610e06565b6108138282610e76565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561085a434284610f59565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516108ab91815260200190565b60405180910390a35050565b6108c3600a6000611ea3565b60005b815181101561096957600a8282815181106108e3576108e361287e565b60209081029190910181015182546001818101855560009485529383902082516003909202018054838501516001600160401b03908116600160401b026001600160801b031990921693811693909317178155604090920151805183860180549190931667ffffffffffffffff19919091161790915590910151600290910155016108c6565b5050565b6109756111b3565b61097e82611258565b6109698282611299565b600061099261135b565b50600080516020612da783398151915290565b6109ad610dab565b600854600160a01b900460ff16156109fa57600880546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610a1d610dab565b610a1360006113a4565b6040805180820190915260008082526020820152600a805490610a4b6001836128aa565b81548110610a5b57610a5b61287e565b60009182526020909120600160039092020101546001600160401b03168310610a9757604051631856a49960e21b815260040160405180910390fd5b6009546001600160401b03165b81811015610b3d5783600a8281548110610ac057610ac061287e565b60009182526020909120600160039092020101546001600160401b03161115610b3557600a8181548110610af657610af661287e565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b031682526002015491810191909152949350505050565b600101610aa4565b50600a610b4b6001836128aa565b81548110610b5b57610b5b61287e565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b0316825260020154918101919091529392505050565b610ba1610dab565b610e108163ffffffff161080610bca575060085463ffffffff600160a81b909104811690821611155b15610be8576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a81b0263ffffffff60a81b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610c535750825b90506000826001600160401b03166001148015610c6f5750303b155b905081158015610c7d575080155b15610c9b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cc557845460ff60401b1916600160401b1785555b610cce86611415565b610cd6611426565b610ce189898961142e565b8315610d2757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600b5460009060ff16610d4e57610d498383611539565b610d5f565b81600c5484610d5d91906128aa565b115b90505b92915050565b610d70610dab565b6001600160a01b038116610d9f57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610da8816113a4565b50565b33610ddd7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a135760405163118cdaa760e01b8152336004820152602401610d96565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806109695760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610d96565b6000610e8061164a565b9050610e8a611ec4565b600054815283516001600160401b039081166020808401919091528501511681600260200201526040848101516060830152516350f8d1a760e11b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063a1f1a34e90610ef590859085908890600401612ac4565b602060405180830381865af4158015610f12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f369190612ceb565b610f53576040516309bde33960e01b815260040160405180910390fd5b50505050565b600a54158015906110125750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b0316908110610f9857610f9861287e565b6000918252602090912060039091020154600a8054600160401b9092046001600160401b031691610fcb906001906128aa565b81548110610fdb57610fdb61287e565b60009182526020909120600390910201546110069190600160401b90046001600160401b0316612d0d565b6001600160401b031610155b156110ab57600954600a805490916001600160401b03169081106110385761103861287e565b60009182526020822060039091020180546001600160801b031916815560018101805467ffffffffffffffff19169055600201819055600980546001600160401b03169161108583612d34565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516060810182526001600160401b03948516815292841660208085019182528251808401845284820151871681529383015184820152918401928352600a805460018101825560009190915293517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86003909502948501805492519187166001600160801b031990931692909217600160401b91871691909102179055905180517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a98401805467ffffffffffffffff1916919095161790935591909101517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aa90910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061123a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661122e600080516020612da7833981519152546001600160a01b031690565b6001600160a01b031614155b15610a135760405163703e46dd60e11b815260040160405180910390fd5b611260610dab565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d906020016106fb565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156112f3575060408051601f3d908101601f191682019092526112f091810190612d5a565b60015b61131b57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610d96565b600080516020612da7833981519152811461134c57604051632a87526960e21b815260048101829052602401610d96565b6113568383611c7a565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a135760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61141d611cd0565b610da881611d19565b610a13611cd0565b82516001600160401b0316151580611452575060208301516001600160401b031615155b8061145f57506020820151155b8061146c57506040820151155b8061147957506060820151155b8061148357508151155b156114a1576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b19909116179055611356434285610f59565b600a546000904384118061154d5750600381105b1561156b5760405163b0b4387760e01b815260040160405180910390fd5b6000808061157a6001856128aa565b90505b816116155786600a82815481106115965761159661287e565b60009182526020909120600390910201546001600160401b0316116115e95760019150600a81815481106115cc576115cc61287e565b60009182526020909120600390910201546001600160401b031692505b60028110611615576009546001600160401b03168114611615578061160d81612d73565b91505061157d565b816116335760405163b0b4387760e01b815260040160405180910390fd5b8561163e84896128aa565b11979650505050505050565b611652611ee3565b620100008152600460208201527f0d76329b8733b0b734ff0f60a40cb4c474064a8c755c1f6cbece5f7ea09d78a86040820151527f16026254c01764d8b4fd70dc4cc51a74e0b32ba5f59e2a9e5ef169feeb7ca1ba6020604083015101527f124a0457892caf44e89d24b4f6eea80a0b1d532a3e59f1178b19e4caca8fbac36060820151527f037e3a3fa0fefa3c08d50c07d472cba4274fd25c444f369d0d77db93e284f89e6020606083015101527f0319b53e71a0078028b4f021e0d4448d3e849198f25f0fb47f36ae764c06e5936080820151527f1eb78f5dcd1e962bc4e33ff6caa12c4161f09ed217cdb213cebbffb63e9e57b46020608083015101527f0c83be8ca5514d2b5527eec4871feb09b1be54fcc00fec9477fd525c563be91660a0820151527f06ad874b2a3707a73260072b13799115f94f048d9065f7730d710511dcd945ae602060a083015101527f1ea8aa071b4c9346a585bbdbeb45762f4e26c395a015ad67ad732ef431b3c59560c0820151527f23700dcfa17c63b4681f477ab548eeae1daba4aad95d02a8d8b4619fa6d637f0602060c083015101527f20fb1c68cbebab5356eb21d126b6f596bea1168a768b59e5fbf308d63828292560e0820151527f17d041ace4a15d7297ebdccc0e098c72542e30d9b3cf6fc37edc14025a9edeaa602060e083015101527f168eeff859a5f7b2781aa3c72a2c0a7a58fa9408489e7b0c13ae2feb848f5aa2610100820151527f2d6d41d0b5833fb077c78ee3705435ea113a71a6537b6980f58073701224342f602061010083015101527f2a3b9d424102b9787e4fbfc217805739be51dbe872181dc40138dc706ce421f9610120820151527f17dc9e1677dad495da48a1d95f94351c2197990789f4168f1e5dd9a31dc3e4d1602061012083015101527f1e002a101f63386609be9700527a3508421d17ce7b127a3b04887704cdbd2dc6610140820151527f0732f969323e1586a21a2f363cd625237adeb6c9e884b5f6afd0fb862fb05e95602061014083015101527f0a1f5be7e2dda4ee17525ca86d1e20a1656c8bb3ac88490903d71324abaf3926610160820151527f22b5b0a08cefb39624d5260eac0cb6c63fa3942325134470f05dfcc69660a741602061016083015101527f131f2fb07141ec50c2c72b3a2c5bc061ef04d8a451f6093303ece094fd077017610180820151527f1012a3feba794457614f15434858e921c06088ca254352b6668971005bb59d0c602061018083015101527f2a304967c0db314ac3c0a6613e636fd620e3fc3a5e284d28fa2a33e770cf4bb46101a0820151527f0e85da2cabd81a33dd542840af2640c7087dd3aa2ec7267bfc1a6fe6b117b24260206101a083015101527f25427d12f7080ca1c010c4a710f1718446ac78ddfbf8fc9024030914c5b7988b6101c0820151527f0ca6acfed4a97c404df14351b34dd68181ecdc2a723e80ce4b4cf3a5ff2e2c4b60206101c083015101527f2869eb8e7c2c4223b37279eb988b696041ca315cdb14c05f463e73f24a0de6606101e0820151527f079bb1a022509123aeaa6861001db5f4e9b9729c98727adff2aba5d588ae512b60206101e083015101527f0821eba1289e0cbcbb088a218b11556d799dfd9748eee76d18c656d2b1f2d0ef610200820151527f16e014f5b76709d9268e9c375854edb6451a9d895d2d2b4f0f0369566df19dea602061020083015101527f21b4eb6afcdfa42cd369fd0c20fc38cb7e6d8b5e88fbcc488983ea79238ef05a610220820151527f274a3b9ef788ddae87b2d74b7d4ee2cdd10eea605fdd631caf43ef705477ce08602061022083015101527f21af862a9f3c7ffb2f3ef7f0e22bf4678e94296b7fbe0b37516e9b6c5e581a54610240820151527f09d97d7a627d8ec24a5fb1495fee2d5cec5cd9e5c5b42c4e4bea06d9e6726bd2602061024083015101527f29e5bd43838ac1cfc29f172286db4a41408faed0d08a9ce4998b2a2e22bd782e610260820151527f103a97f91d3df0aa53d6b2d7f29c4ebf4f323896827a8b8eeba30b7b039ce4a3602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611c8382611d21565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611cc8576113568282611d86565b610969611dfc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a1357604051631afcd79f60e31b815260040160405180910390fd5b610d70611cd0565b806001600160a01b03163b600003611d5757604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610d96565b600080516020612da783398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611da39190612d8a565b600060405180830381855af49150503d8060008114611dde576040519150601f19603f3d011682016040523d82523d6000602084013e611de3565b606091505b5091509150611df3858383611e1b565b95945050505050565b3415610a135760405163b398979f60e01b815260040160405180910390fd5b606082611e3057611e2b82611e7a565b611e73565b8151158015611e4757506001600160a01b0384163b155b15611e7057604051639996b31560e01b81526001600160a01b0385166004820152602401610d96565b50805b9392505050565b805115611e8a5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825560030290600052602060002090810190610da89190612170565b6040518061010001604052806008906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611f1a604051806040016040528060008152602001600081525090565b8152602001611f3c604051806040016040528060008152602001600081525090565b8152602001611f5e604051806040016040528060008152602001600081525090565b8152602001611f80604051806040016040528060008152602001600081525090565b8152602001611fa2604051806040016040528060008152602001600081525090565b8152602001611fc4604051806040016040528060008152602001600081525090565b8152602001611fe6604051806040016040528060008152602001600081525090565b8152602001612008604051806040016040528060008152602001600081525090565b815260200161202a604051806040016040528060008152602001600081525090565b815260200161204c604051806040016040528060008152602001600081525090565b815260200161206e604051806040016040528060008152602001600081525090565b8152602001612090604051806040016040528060008152602001600081525090565b81526020016120b2604051806040016040528060008152602001600081525090565b81526020016120d4604051806040016040528060008152602001600081525090565b81526020016120f6604051806040016040528060008152602001600081525090565b8152602001612118604051806040016040528060008152602001600081525090565b815260200161213a604051806040016040528060008152602001600081525090565b815260200161215c604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b5b808211156121a95780546001600160801b031916815560018101805467ffffffffffffffff1916905560006002820155600301612171565b5090565b80356001600160a01b03811681146121c457600080fd5b919050565b6000602082840312156121db57600080fd5b610d5f826121ad565b6000602082840312156121f657600080fd5b5035919050565b6001600160401b0384811682528316602082015260808101612235604083018480516001600160401b03168252602090810151910152565b949350505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156122755761227561223d565b60405290565b604080519081016001600160401b03811182821017156122755761227561223d565b6040516102e081016001600160401b03811182821017156122755761227561223d565b604051601f8201601f191681016001600160401b03811182821017156122e8576122e861223d565b604052919050565b80356001600160401b03811681146121c457600080fd5b60006060828403121561231957600080fd5b612321612253565b905061232c826122f0565b815261233a602083016122f0565b60208201526040820135604082015292915050565b60006040828403121561236157600080fd5b61236961227b565b9050813581526020820135602082015292915050565b6000808284036104e081121561239457600080fd5b61239e8585612307565b925061048080605f19830112156123b457600080fd5b6123bc61229d565b91506123cb866060870161234f565b82526123da8660a0870161234f565b60208301526123ec8660e0870161234f565b60408301526101206124008782880161234f565b60608401526101606124148882890161234f565b60808501526101a061242889828a0161234f565b60a08601526101e061243c8a828b0161234f565b60c08701526102206124508b828c0161234f565b60e08801526102606124648c828d0161234f565b6101008901526102a06124798d828e0161234f565b878a015261248b8d6102e08e0161234f565b6101408a015261249f8d6103208e0161234f565b868a01526124b18d6103608e0161234f565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b6000602080838503121561254657600080fd5b82356001600160401b038082111561255d57600080fd5b818501915085601f83011261257157600080fd5b8135818111156125835761258361223d565b612591848260051b016122c0565b818152848101925060079190911b8301840190878211156125b157600080fd5b928401925b8184101561263d5783880360808112156125d05760008081fd5b6125d8612253565b6125e1866122f0565b81526125ee8787016122f0565b87820152604080603f19840112156126065760008081fd5b61260e61227b565b925061261b8188016122f0565b83526060870135888401528101919091528352608090930192918401916125b6565b979650505050505050565b6000806040838503121561265b57600080fd5b612664836121ad565b91506020808401356001600160401b038082111561268157600080fd5b818601915086601f83011261269557600080fd5b8135818111156126a7576126a761223d565b6126b9601f8201601f191685016122c0565b915080825287848285010111156126cf57600080fd5b80848401858401376000848284010152508093505050509250929050565b81516001600160401b031681526020808301519082015260408101610d62565b803563ffffffff811681146121c457600080fd5b60006020828403121561273357600080fd5b610d5f8261270d565b60008060008084860361012081121561275457600080fd5b61275e8787612307565b94506080605f198201121561277257600080fd5b50604051608081018181106001600160401b03821117156127955761279561223d565b8060405250606086013581526080860135602082015260a0860135604082015260c08601356060820152809350506127cf60e0860161270d565b91506127de61010086016121ad565b905092959194509250565b60005b838110156128045781810151838201526020016127ec565b50506000910152565b602081526000825180602084015261282c8160408501602087016127e9565b601f01601f19169190910160400192915050565b60006060828403121561285257600080fd5b610d5f8383612307565b6000806040838503121561286f57600080fd5b50508035926020909101359150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610d6257610d62612894565b8060005b6008811015610f535781518452602093840193909101906001016128c1565b6128f582825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006129588185018380518252602090810151910152565b60a083015191506101406129788186018480518252602090810151910152565b60c084015192506101806129988187018580518252602090810151910152565b60e085015193506101c06129b88188018680518252602090810151910152565b928501519350610200926129d88785018680518252602090810151910152565b61012086015194506102406129f98189018780518252602090810151910152565b92860151945061028092612a198885018780518252602090810151910152565b61016087015195506102c0612a3a818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a808201905084518252602085015160208301526040850151612af7604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612b448185018380518252602090810151910152565b60c08701519150610140612b648186018480518252602090810151910152565b60e08801519250610180612b848187018580518252602090810151910152565b9188015192506101c091612ba48684018580518252602090810151910152565b6101208901519350610200612bc58188018680518252602090810151910152565b91890151935061024091612be58784018680518252602090810151910152565b6101608a01519450610280612c068189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612cdd6105008301856128bd565b6122356106008301846128e0565b600060208284031215612cfd57600080fd5b81518015158114611e7357600080fd5b6001600160401b03828116828216039080821115612d2d57612d2d612894565b5092915050565b60006001600160401b03808316818103612d5057612d50612894565b6001019392505050565b600060208284031215612d6c57600080fd5b5051919050565b600081612d8257612d82612894565b506000190190565b60008251612d9c8184602087016127e9565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" +"0x60a0346200057857620030ae38819003601f8101601f191683016001600160401b03811184821017620004aa57839282916040528339810103610100811262000578576060811262000578576080604051916200005c836200057d565b620000678462000599565b8352620000776020850162000599565b602084015260408401516040840152605f19011262000578576040519160808301906001600160401b03821184831017620004aa5760e091604052606081015184526080810151602085015260a0810151604085015260c08101516060850152015163ffffffff811681036200057857306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8160401c1662000566576002600160401b03196001600160401b038216016200051a575b505081516001600160401b03161580159062000503575b8015620004f6575b8015620004e9575b8015620004dc575b8015620004d2575b620004c05760018060401b03825116908160085468010000000000000000600160801b03602086015160401b1691829160018060801b031916171760085560408401519182600955855160045560208601519283600555604087015192836006556060880151958660075560018060801b0319600a54161717600a55600b55600c549063ffffffff60a81b9060a81b169063ffffffff60a81b1916179283600c55604051916020830193845260408301526060820152606081526080810181811060018060401b03821117620004aa57604052519020600093818555519081600155600255600355600e5490811515918262000433575b5050620003a4575b602081015160409182015182519290916001600160401b039081169184019081118482101762000390576040528252602082015260405190620002ad826200057d565b6001600160401b03438116835242166020830190815260408301918252600e54909290680100000000000000008110156200039057806001620002f49201600e55620005ae565b9490946200037c575051835492516001600160801b03199093166001600160401b0391821617604093841b6fffffffffffffffff000000000000000016178455905180516001850180546001600160401b0319169190931617909155602001516002929092019190915551612ac99081620005e58239608051818181610b0a0152610c620152f35b634e487b7160e01b81526004819052602490fd5b634e487b7160e01b85526041600452602485fd5b600d54620003bb906001600160401b0316620005ae565b6200041f5782815560018101839055600201829055600d546001600160401b038082169081146200040b576001600160401b03199091166001919091016001600160401b031617600d556200026a565b634e487b7160e01b84526011600452602484fd5b634e487b7160e01b83526004839052602483fd5b90915060001981019081116200040b576200044e90620005ae565b5054600d546001600160401b0360409290921c821691620004709116620005ae565b505460401c6001600160401b03908116909103919082116200040b5760a81c63ffffffff166001600160401b039091161015388062000262565b634e487b7160e01b600052604160045260246000fd5b6040516350dd03f760e11b8152600490fd5b508251156200016b565b5060608301511562000163565b506040830151156200015b565b5060208301511562000153565b5060208201516001600160401b031615156200014b565b6001600160401b0319166001600160401b039081179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388062000134565b60405163f92ee8a960e01b8152600490fd5b600080fd5b606081019081106001600160401b03821117620004aa57604052565b51906001600160401b03821682036200057857565b600e54811015620005ce57600e6000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461021757806302b592f3146102125780630d8e6e2c1461020d5780632063d4f7146102085780632d52aad6146102035780632f5f4600146101fe5780632f79889d146101f9578063313df7b1146101f4578063382b215a146101ef5780634f1ef286146101ea57806352d1902d146101e557806362827733146101e057806369cc6a04146101db5780636f96bdae146101d6578063715018a6146101d157806376b6b7cb146101cc5780638584d23f146101c75780638da5cb5b146101c257806396c1ca61146101bd5780639baa3cc9146101b85780639fdb54a7146101b3578063a9a9c9f5146101ae578063ad3cb1cc146101a9578063b5adea3c146101a4578063bd32519a1461019f578063c23b9e9e1461019a578063c8e5e49814610195578063ca6fe85514610190578063d24d933d1461018b578063e030330114610186578063f2fde38b146101815763f9e50d191461017c57600080fd5b611408565b6113df565b6112af565b611274565b611256565b611239565b611212565b6111ec565b611193565b611116565b6110df565b6110a0565b610f53565b610ecc565b610e83565b610e46565b610e28565b610dbd565b610d72565b610cd8565b610cba565b610c4f565b610a90565b610a57565b610a2e565b610a07565b61091b565b6108f5565b61079d565b6104ed565b610477565b61024e565b600435906001600160a01b038216820361023257565b600080fd5b61010435906001600160a01b038216820361023257565b346102325760203660031901126102325761026761021c565b61026f611a4c565b6001600160a01b039081169081156102ff57600c5490811682146102ed5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561036257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b610311565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761039857604052565b610367565b606081019081106001600160401b0382111761039857604052565b608081019081106001600160401b0382111761039857604052565b90601f801991011681019081106001600160401b0382111761039857604052565b604051906102e082018281106001600160401b0382111761039857604052565b604051906104218261037d565b565b604051906104218261039d565b604051906102c082018281106001600160401b0382111761039857604052565b9060405161045d8161037d565b6020600182946001600160401b0381541684520154910152565b3461023257602036600319011261023257600435600e54811015610232576104a0608091610327565b506104eb8154916104bb60016001600160401b039201610450565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610232576000366003190112610232576060604051600181526000602082015260006040820152f35b35906001600160401b038216820361023257565b606090600319011261023257604051906105448261039d565b816001600160401b03600435818116810361023257825260243590811681036102325760208201526040604435910152565b6040906063190112610232576040519061058f8261037d565b60643582526084356020830152565b60409060a319011261023257604051906105b78261037d565b60a435825260c4356020830152565b60409060e319011261023257604051906105df8261037d565b60e4358252610104356020830152565b60409061012319011261023257604051906106098261037d565b610124358252610144356020830152565b60409061016319011261023257604051906106348261037d565b610164358252610184356020830152565b6040906101a3190112610232576040519061065f8261037d565b6101a43582526101c4356020830152565b6040906101e3190112610232576040519061068a8261037d565b6101e4358252610204356020830152565b60409061022319011261023257604051906106b58261037d565b610224358252610244356020830152565b60409061026319011261023257604051906106e08261037d565b610264358252610284356020830152565b6040906102a3190112610232576040519061070b8261037d565b6102a43582526102c4356020830152565b6040906102e319011261023257604051906107368261037d565b6102e4358252610304356020830152565b60409061032319011261023257604051906107618261037d565b610324358252610344356020830152565b604090610363190112610232576040519061078c8261037d565b610364358252610384356020830152565b34610232576104e0366003190112610232576107b83661052b565b610480366063190112610232576108f3906107d16103f4565b906107db36610576565b82526107e63661059e565b60208301526107f4366105c6565b6040830152610802366105ef565b60608301526108103661061a565b608083015261081e36610645565b60a083015261082c36610670565b60c083015261083a3661069b565b60e0830152610848366106c6565b610100830152610857366106f1565b6101208301526108663661071c565b61014083015261087536610747565b61016083015261088436610772565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c0830152611479565b005b3461023257602036600319011261023257600f805460ff19166001179055600435601055005b3461023257602080600319360112610232576001600160401b0360043581811161023257366023820112156102325780600401359182116103985760409283519261096b828260051b01856103d3565b80845260248285019160071b8401019236841161023257602401905b838210610997576108f385611671565b8136036080811261023257868051916109af8361039d565b6109b885610517565b83526109c5868601610517565b83870152603f19011261023257608091849188516109e28161037d565b6109ed8a8701610517565b815260608601358482015289820152815201910190610987565b346102325760003660031901126102325760206001600160401b03600d5416604051908152f35b3461023257600036600319011261023257600c546040516001600160a01b039091168152602090f35b34610232576000366003190112610232576020600254604051908152f35b6001600160401b03811161039857601f01601f191660200190565b60408060031936011261023257610aa561021c565b6024356001600160401b038111610232573660238201121561023257806004013590610ad082610a75565b91610add855193846103d3565b80835260209136602483830101116102325781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610c33575b50610c22579080600492610b48611a4c565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610bf3575b5050610bb8578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612a7d8339815191528193929303610bda576108f383836128e1565b8351632a87526960e21b81526004810191909152602490fd5b610c13929350803d10610c1b575b610c0b81836103d3565b8101906121cd565b903880610b92565b503d610c01565b845163703e46dd60e11b8152600490fd5b905081600080516020612a7d8339815191525416141538610b36565b34610232576000366003190112610232577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610ca8576020604051600080516020612a7d8339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610232576000366003190112610232576020600154604051908152f35b3461023257600080600319360112610d3757610cf2611a4c565b600c5460ff8160a01c166000146102ed576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b60809060631901126102325760405190610d53826103b8565b6064358252608435602083015260a435604083015260c4356060830152565b34610232576080366003190112610232576020610db5604051610d94816103b8565b6004358152602435838201526044356040820152606435606082015261171b565b604051908152f35b3461023257600080600319360112610d3757610dd7611a4c565b600080516020612a5d83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610232576000366003190112610232576020600054604051908152f35b34610232576020366003190112610232576040610e64600435611788565b6104eb82518092602080916001600160401b0381511684520151910152565b3461023257600036600319011261023257600080516020612a5d833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff8216820361023257565b346102325760203660031901126102325760043563ffffffff80821680830361023257610ef7611a4c565b610e108110918215610f41575b5050610f2f57600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610f04565b346102325761012036600319011261023257610f6e3661052b565b610f7736610d3a565b90610f80610eb9565b610f88610237565b90600080516020612a9d83398151915254936001600160401b0360ff8660401c1615951680159081611098575b600114908161108e575b159081611085575b5061107357600080516020612a9d833981519152805467ffffffffffffffff19166001179055610ffb938561104e5761184e565b61100157005b600080516020612a9d833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102e8565b600080516020612a9d833981519152805460ff60401b1916600160401b17905561184e565b60405163f92ee8a960e01b8152600490fd5b90501538610fc7565b303b159150610fbf565b869150610fb5565b3461023257600036600319011261023257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b0390f35b3461023257600036600319011261023257608060045460055460065460075491604051938452602084015260408301526060820152f35b346102325760003660031901126102325760408051906111358261037d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106111805784604081866000838284010152601f80199101168101030190f35b858101830151858201830152820161115e565b346102325760603660031901126102325760406111af3661052b565b6001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55600080f35b3461023257600036600319011261023257602060ff600c5460a01c166040519015158152f35b3461023257600036600319011261023257602063ffffffff600c5460a81c16604051908152f35b3461023257600036600319011261023257600f805460ff19169055005b34610232576000366003190112610232576020600354604051908152f35b3461023257600036600319011261023257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b34610232576040366003190112610232576004356024359060ff600f54166000906000146112fd5750906112e96110db926010549061177b565b115b60405190151581529081906020820190565b91600e549143811180156113d5575b6113625761131a849361176c565b9261133c611330600d546001600160401b031690565b6001600160401b031690565b935b8115611374575b509091925015611362576110db9261135c9161177b565b116112eb565b60405163b0b4387760e01b8152600490fd5b8261139261133061138484610327565b50546001600160401b031690565b11156113bb575b600281106113b6578481146113b6576113b1906121dc565b61133e565b611345565b94505060016113cf61133061138487610327565b94611399565b506003831061130c565b34610232576020366003190112610232576108f36113fb61021c565b611403611a4c565b6119d8565b34610232576000366003190112610232576020600e54604051908152f35b634e487b7160e01b600052600060045260246000fd5b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c169081611589575b50611577578151600a546001600160401b03918183169083161180159190611550575b5061153e577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906114ed60408501936114e78551611a85565b85611f6b565b6114f68461143c565b61150584824216834316612084565b61152a602061151b86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b9050818061156860208701516001600160401b031690565b9260401c1691161115386114ae565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861148b565b634e487b7160e01b600052601160045260246000fd5b906115ca5760028160008093558260018201550155565b611426565b80518210156103625760209160051b010190565b600e54600160401b811015610398578060016116029201600e55610327565b9190916115ca57805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b90600e546000600e55806116ae575b5060005b82518110156116a957806116a361169d600193866115cf565b516115e3565b01611684565b509050565b6003908060030290600382040361171657600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd908101905b8181106116f8575050611680565b80611710849260026000918281558260018201550155565b016116ea565b61159d565b602081015190606060408201519101516040519160208301938452604083015260608201526060815261174d816103b8565b51902090565b604051906117608261037d565b60006020838281520152565b60001981019190821161171657565b9190820391821161171657565b611790611753565b50600e54906117a66117a18361176c565b610327565b50906117c06113306001809401546001600160401b031690565b81101561183c576117dc611330600d546001600160401b031690565b8381106118015750505060016117f76117a16117fe9361176c565b5001610450565b90565b816118216113308561181285610327565b5001546001600160401b031690565b1161182d5782016117dc565b6117fe93506117f79150610327565b604051631856a49960e21b8152600490fd5b9190926118659061185d612988565b611403612988565b61186d612988565b6001600160401b03908161188884516001600160401b031690565b16158015906119b9575b80156119ad575b80156119a1575b8015611995575b801561198c575b61197a576104219361194961196f926118fe866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b82516004556020830151600555604083015160065560608301516007556119248661143c565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b61196a6119558261171b565b9182600055519161196583600155565b600255565b600355565b804216904316612084565b6040516350dd03f760e11b8152600490fd5b508351156118ae565b506060840151156118a7565b506040840151156118a0565b50602084015115611899565b506119d161133060208501516001600160401b031690565b1515611892565b6001600160a01b03908116908115611a3357600080516020612a5d83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612a5d833981519152546001600160a01b03163303611a6d57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611aae57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519060e082018281106001600160401b038211176103985760405260e0368337565b90816020910312610232575180151581036102325790565b6000915b60078310611b4057505050565b600190825181526020809101920192019190611b33565b61046090611b7083825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611bce610100928386019060208091805184520151910152565b60a081015191611bee610140938487019060208091805184520151910152565b60c082015192611c0e610180948588019060208091805184520151910152565b60e083015191611c2e6101c0938489019060208091805184520151910152565b830151611c4b610200918289019060208091805184520151910152565b61012084015191611c6c61024093848a019060208091805184520151910152565b84015192611c8a61028094858a019060208091805184520151910152565b611cc561016086015196611cae6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b6105e090611f5861042194969593966102a0610a608401988051855260208101516020860152611d6e6040820151604087019060208091805184520151910152565b6060810151805160808701526020015160a08601526080810151805160c08701526020015160e086015260a0810151611db7610100918288019060208091805184520151910152565b611f2486611ef560c0850151611ddd610140918285019060208091805184520151910152565b611ec660e087015195611e00610180978887019060208091805184520151910152565b870151611e1d6101c0918287019060208091805184520151910152565b611e5a61012089015193611e41610200958689019060208091805184520151910152565b8901516102408097019060208091805184520151910152565b611e978c6102c06101608b015199611e826102809b8c85019060208091805184520151910152565b8b015191019060208091805184520151910152565b6101a088015180516103008e0152602001516103208d015287015180516103408d0152602001516103608c0152565b6101e086015180516103808c0152602001516103a08b015285015180516103c08b0152602001516103e08a0152565b61022084015180516104008a015260200151610420890152830151805161044089015260200151610460880152565b6102608201518051610480880152602001516104a08701528101516104c086015201516104e0840152610500830190611b2f565b0190611b57565b6040513d6000823e3d90fd5b602090611f76612305565b6040611f80611af3565b926001548452611f9a61133082516001600160401b031690565b85850152611fb4611330868301516001600160401b031690565b8285015201516060830152611fdd604051948593849363ce537a7760e01b855260048501611d2c565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af490811561204e5760009161201f575b501561200d57565b6040516309bde33960e01b8152600490fd5b612041915060203d602011612047575b61203981836103d3565b810190611b17565b38612005565b503d61202f565b611f5f565b6001600160401b03918216908216039190821161171657565b6001600160401b038091169081146117165760010190565b90916120f361042193600e548015159081612159575b506120fd575b60406120b660208501516001600160401b031690565b9301516120d36120c4610414565b6001600160401b039095168552565b60208401526120e36120c4610423565b6001600160401b03166020840152565b60408201526115e3565b61211b6121156117a1600d546001600160401b031690565b906115b3565b612154612138612133600d546001600160401b031690565b61206c565b6001600160401b03166001600160401b0319600d541617600d55565b6120a0565b61219c915061216d6117a161217e9261176c565b505460401c6001600160401b031690565b61219661216d6117a1600d546001600160401b031690565b90612053565b6001600160401b036121c36121ba600c5463ffffffff9060a81c1690565b63ffffffff1690565b911610153861209a565b90816020910312610232575190565b8015611716576000190190565b6121f1610430565b906000825260006020830152612205611753565b6040830152612212611753565b606083015261221f611753565b608083015261222c611753565b60a0830152612239611753565b60c0830152612246611753565b60e0830152612253611753565b610100830152612261611753565b61012083015261226f611753565b61014083015261227d611753565b61016083015261228b611753565b610180830152612299611753565b6101a08301526122a7611753565b6101c08301526122b5611753565b6101e08301526122c3611753565b6102008301526122d1611753565b6102208301526122df611753565b6102408301526122ed611753565b610260830152600061028083015260006102a0830152565b61230d6121e9565b906201000082527f103a97f91d3df0aa53d6b2d7f29c4ebf4f323896827a8b8eeba30b7b039ce4a360206004818501527f16026254c01764d8b4fd70dc4cc51a74e0b32ba5f59e2a9e5ef169feeb7ca1ba81604086017f0d76329b8733b0b734ff0f60a40cb4c474064a8c755c1f6cbece5f7ea09d78a88151525101527f037e3a3fa0fefa3c08d50c07d472cba4274fd25c444f369d0d77db93e284f89e81606086017f124a0457892caf44e89d24b4f6eea80a0b1d532a3e59f1178b19e4caca8fbac38151525101527f1eb78f5dcd1e962bc4e33ff6caa12c4161f09ed217cdb213cebbffb63e9e57b481608086017f0319b53e71a0078028b4f021e0d4448d3e849198f25f0fb47f36ae764c06e5938151525101527f06ad874b2a3707a73260072b13799115f94f048d9065f7730d710511dcd945ae8160a086017f0c83be8ca5514d2b5527eec4871feb09b1be54fcc00fec9477fd525c563be9168151525101527f23700dcfa17c63b4681f477ab548eeae1daba4aad95d02a8d8b4619fa6d637f08160c086017f1ea8aa071b4c9346a585bbdbeb45762f4e26c395a015ad67ad732ef431b3c5958151525101527f17d041ace4a15d7297ebdccc0e098c72542e30d9b3cf6fc37edc14025a9edeaa8160e086017f20fb1c68cbebab5356eb21d126b6f596bea1168a768b59e5fbf308d6382829258151525101527f2d6d41d0b5833fb077c78ee3705435ea113a71a6537b6980f58073701224342f8161010086017f168eeff859a5f7b2781aa3c72a2c0a7a58fa9408489e7b0c13ae2feb848f5aa28151525101527f17dc9e1677dad495da48a1d95f94351c2197990789f4168f1e5dd9a31dc3e4d18161012086017f2a3b9d424102b9787e4fbfc217805739be51dbe872181dc40138dc706ce421f98151525101527f0732f969323e1586a21a2f363cd625237adeb6c9e884b5f6afd0fb862fb05e958161014086017f1e002a101f63386609be9700527a3508421d17ce7b127a3b04887704cdbd2dc68151525101527f22b5b0a08cefb39624d5260eac0cb6c63fa3942325134470f05dfcc69660a7418161016086017f0a1f5be7e2dda4ee17525ca86d1e20a1656c8bb3ac88490903d71324abaf39268151525101527f1012a3feba794457614f15434858e921c06088ca254352b6668971005bb59d0c8161018086017f131f2fb07141ec50c2c72b3a2c5bc061ef04d8a451f6093303ece094fd0770178151525101527f0e85da2cabd81a33dd542840af2640c7087dd3aa2ec7267bfc1a6fe6b117b242816101a086017f2a304967c0db314ac3c0a6613e636fd620e3fc3a5e284d28fa2a33e770cf4bb48151525101527f0ca6acfed4a97c404df14351b34dd68181ecdc2a723e80ce4b4cf3a5ff2e2c4b816101c086017f25427d12f7080ca1c010c4a710f1718446ac78ddfbf8fc9024030914c5b7988b8151525101527f079bb1a022509123aeaa6861001db5f4e9b9729c98727adff2aba5d588ae512b816101e086017f2869eb8e7c2c4223b37279eb988b696041ca315cdb14c05f463e73f24a0de6608151525101527f16e014f5b76709d9268e9c375854edb6451a9d895d2d2b4f0f0369566df19dea8161020086017f0821eba1289e0cbcbb088a218b11556d799dfd9748eee76d18c656d2b1f2d0ef8151525101527f274a3b9ef788ddae87b2d74b7d4ee2cdd10eea605fdd631caf43ef705477ce088161022086017f21b4eb6afcdfa42cd369fd0c20fc38cb7e6d8b5e88fbcc488983ea79238ef05a8151525101527f09d97d7a627d8ec24a5fb1495fee2d5cec5cd9e5c5b42c4e4bea06d9e6726bd28161024086017f21af862a9f3c7ffb2f3ef7f0e22bf4678e94296b7fbe0b37516e9b6c5e581a5481515251015261026084017f29e5bd43838ac1cfc29f172286db4a41408faed0d08a9ce4998b2a2e22bd782e8151525101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808301527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a0830152565b90813b1561296757600080516020612a7d83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511561294c57612949916129b7565b50565b50503461295557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612a9d8339815191525460401c16156129a557565b604051631afcd79f60e31b8152600490fd5b6000806117fe93602081519101845af43d156129f5573d916129d883610a75565b926129e660405194856103d3565b83523d6000602085013e6129f9565b6060915b90612a205750805115612a0e57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612a53575b612a31575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612a2956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json index da7c6c553..3378adb06 100644 --- a/contract-bindings/artifacts/LightClient_bytecode.json +++ b/contract-bindings/artifacts/LightClient_bytecode.json @@ -1 +1 @@ -"0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000da565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000775760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612a3a62000104600039600081816110cc015281816110f501526112740152612a3a6000f3fe6080604052600436106101405760003560e01c80638584d23f116100b6578063bd32519a1161006f578063bd32519a1461043d578063c23b9e9e1461046e578063d24d933d146104a7578063e0303301146104d7578063f2fde38b146104f7578063f9e50d191461051757600080fd5b80638584d23f146102ff5780638da5cb5b1461032c57806396c1ca61146103695780639baa3cc9146103895780639fdb54a7146103a9578063ad3cb1cc146103ff57600080fd5b8063313df7b111610108578063313df7b114610224578063426d31941461025c5780634f1ef2861461029f57806352d1902d146102b257806369cc6a04146102d5578063715018a6146102ea57600080fd5b8063013fa5fc1461014557806302b592f3146101675780630d8e6e2c1461019f5780632063d4f7146101cc5780632f79889d146101ec575b600080fd5b34801561015157600080fd5b50610165610160366004611f68565b61052c565b005b34801561017357600080fd5b50610187610182366004611f83565b6105e9565b60405161019693929190611f9c565b60405180910390f35b3480156101ab57600080fd5b50604080516001815260006020820181905291810191909152606001610196565b3480156101d857600080fd5b506101656101e7366004612117565b610646565b3480156101f857600080fd5b5060095461020c906001600160401b031681565b6040516001600160401b039091168152602001610196565b34801561023057600080fd5b50600854610244906001600160a01b031681565b6040516001600160a01b039091168152602001610196565b34801561026857600080fd5b5060005460015460025460035461027f9392919084565b604080519485526020850193909352918301526060820152608001610196565b6101656102ad3660046122cb565b61079a565b3480156102be57600080fd5b506102c76107b9565b604051908152602001610196565b3480156102e157600080fd5b506101656107d6565b3480156102f657600080fd5b50610165610846565b34801561030b57600080fd5b5061031f61031a366004611f83565b610858565b6040516101969190612370565b34801561033857600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610244565b34801561037557600080fd5b506101656103843660046123a4565b6109ca565b34801561039557600080fd5b506101656103a43660046123bf565b610a3f565b3480156103b557600080fd5b506006546007546103d9916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610196565b34801561040b57600080fd5b50610430604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101969190612490565b34801561044957600080fd5b5060085461045e90600160a01b900460ff1681565b6040519015158152602001610196565b34801561047a57600080fd5b5060085461049290600160a81b900463ffffffff1681565b60405163ffffffff9091168152602001610196565b3480156104b357600080fd5b506004546005546103d9916001600160401b0380821692600160401b909204169083565b3480156104e357600080fd5b5061045e6104f23660046124c3565b610b63565b34801561050357600080fd5b50610165610512366004611f68565b610c76565b34801561052357600080fd5b50600a546102c7565b610534610cb9565b6001600160a01b03811661055b5760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b039081169082160361058a5760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a81b0319166001600160a01b0383811691909117600160a01b1791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600a81815481106105f957600080fd5b600091825260209182902060039091020180546040805180820190915260018301546001600160401b039081168252600290930154938101939093528181169350600160401b9004169083565b600854600160a01b900460ff16801561066a57506008546001600160a01b03163314155b15610688576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806106c1575060065460208301516001600160401b03600160401b9092048216911611155b156106df5760405163051c46ef60e01b815260040160405180910390fd5b6106ec8260400151610d14565b6106f68282610d84565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561073d434284610e67565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6846040015160405161078e91815260200190565b60405180910390a35050565b6107a26110c1565b6107ab82611166565b6107b582826111a7565b5050565b60006107c3611269565b50600080516020612a0e83398151915290565b6107de610cb9565b600854600160a01b900460ff161561082b57600880546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b61084e610cb9565b61084460006112b2565b6040805180820190915260008082526020820152600a80549061087c6001836124fb565b8154811061088c5761088c61250e565b60009182526020909120600160039092020101546001600160401b031683106108c857604051631856a49960e21b815260040160405180910390fd5b6009546001600160401b03165b8181101561096e5783600a82815481106108f1576108f161250e565b60009182526020909120600160039092020101546001600160401b0316111561096657600a81815481106109275761092761250e565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b031682526002015491810191909152949350505050565b6001016108d5565b50600a61097c6001836124fb565b8154811061098c5761098c61250e565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b0316825260020154918101919091529392505050565b6109d2610cb9565b610e108163ffffffff1610806109fb575060085463ffffffff600160a81b909104811690821611155b15610a19576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a81b0263ffffffff60a81b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610a845750825b90506000826001600160401b03166001148015610aa05750303b155b905081158015610aae575080155b15610acc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610af657845460ff60401b1916600160401b1785555b610aff86611323565b610b07611334565b610b1289898961133c565b8315610b5857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600a5460009043841180610b775750600381105b15610b955760405163b0b4387760e01b815260040160405180910390fd5b60008080610ba46001856124fb565b90505b81610c3f5786600a8281548110610bc057610bc061250e565b60009182526020909120600390910201546001600160401b031611610c135760019150600a8181548110610bf657610bf661250e565b60009182526020909120600390910201546001600160401b031692505b60028110610c3f576009546001600160401b03168114610c3f5780610c3781612524565b915050610ba7565b81610c5d5760405163b0b4387760e01b815260040160405180910390fd5b85610c6884896124fb565b119450505050505b92915050565b610c7e610cb9565b6001600160a01b038116610cad57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610cb6816112b2565b50565b33610ceb7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108445760405163118cdaa760e01b8152336004820152602401610ca4565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806107b55760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610ca4565b6000610d8e611447565b9050610d98611ca0565b600054815283516001600160401b039081166020808401919091528501511681600260200201526040848101516060830152516350f8d1a760e11b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063a1f1a34e90610e0390859085908890600401612742565b602060405180830381865af4158015610e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e449190612969565b610e61576040516309bde33960e01b815260040160405180910390fd5b50505050565b600a5415801590610f205750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b0316908110610ea657610ea661250e565b6000918252602090912060039091020154600a8054600160401b9092046001600160401b031691610ed9906001906124fb565b81548110610ee957610ee961250e565b6000918252602090912060039091020154610f149190600160401b90046001600160401b031661298b565b6001600160401b031610155b15610fb957600954600a805490916001600160401b0316908110610f4657610f4661250e565b60009182526020822060039091020180546001600160801b031916815560018101805467ffffffffffffffff19169055600201819055600980546001600160401b031691610f93836129b2565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516060810182526001600160401b03948516815292841660208085019182528251808401845284820151871681529383015184820152918401928352600a805460018101825560009190915293517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86003909502948501805492519187166001600160801b031990931692909217600160401b91871691909102179055905180517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a98401805467ffffffffffffffff1916919095161790935591909101517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aa90910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061114857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661113c600080516020612a0e833981519152546001600160a01b031690565b6001600160a01b031614155b156108445760405163703e46dd60e11b815260040160405180910390fd5b61116e610cb9565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d906020016105de565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611201575060408051601f3d908101601f191682019092526111fe918101906129d8565b60015b61122957604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ca4565b600080516020612a0e833981519152811461125a57604051632a87526960e21b815260048101829052602401610ca4565b6112648383611a77565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108445760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b61132b611acd565b610cb681611b16565b610844611acd565b82516001600160401b0316151580611360575060208301516001600160401b031615155b8061136d57506020820151155b8061137a57506040820151155b8061138757506060820151155b8061139157508151155b156113af576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b19909116179055611264434285610e67565b61144f611cbf565b621000008152600460208201527f2594eb9237b7cc992b0aff6541c0b4f6dbaa9235366de2e5e08eb7ed415d6f5e6040820151527f20f8ed3de77af84f07ab14e0e3a6af9609d179bd825068fca7f5d10de9cec1d06020604083015101527f23662f2d65f6af786069b0feb61ab3d9cc2dd3e67ccbf422a223c7fa55f44ee66060820151527f1fcf82acfe5e7b819ff344ac2a25dfbaa3fb12fb03696ab24f52210896a976f56020606083015101527f1e4ba740bce3f5c1b696a6b838a9267e00de6cb86fb635db305eeb4874f0f9266080820151527f1181da971e46128143c9f733b3dfb9ccfed793481cec98e4576d550342a4d60c6020608083015101527f1d31ad0a55e8f8c6f922b0841d4ed606339ed063e86932328c202647a70ed7cd60a0820151527f0de74676a34741220f476bae49ec09f859d46c7f8c63cc5f76d494a09e448413602060a083015101527f1f0a8ad12bd711b801c05a04926676385733cd886b30414dc8a9455f5ee1ccf060c0820151527f01d88d68cb48acf2ebd1d69e0fc38d5fb188c1c87792d9debfde6e48b5213562602060c083015101527f2d6bd0f4fd66b3f1183ef8e83be754d47b3f2108d5583c80d669f65fa8a6c68860e0820151527f10b1aa078508c19c234d1c48764ecea93aeeb26627aa9169b3c3f8dd9722a646602060e083015101527f29e8cb6f4a4499852ba317b86e5fa40e53476c42e37c1a87d9a2ad21625d5486610100820151527f15a424f82f95e588a93ce0eb93369b35291fd603e490dece7bab07e181d9b955602061010083015101527f210a0dcd7c615d5963ba67f22090dd66843d3757b9a17d0729971812c0334579610120820151527f1b1a9dce8744e1accfa8ee724b09cad428a70cbd569efe2b46e927565f647946602061012083015101527f1af7507105277eafd94dc06bd01521a9fa91f7743cfcd896c2289df0696e2e57610140820151527f1ec91c705e7482be0f5768f598869716b93e1aba284ab207a01acaf5b9087577602061014083015101527f0a870d4d26887f446f5d0cbace89ea87592732161a7adf4fed3c1bcd72d56b04610160820151527f0d9eb0e9d5a0f218673c5b8883b1bc65064c7c57ddf370b534da88e737e6f999602061016083015101527f236a6ee8b0a5bfcbe26f5609cc2f6a8a13d23dfd88b7c47c590b44a0fbc39fab610180820151527f266dd2c45a9d95cd00c622c047eacb1e29c90c0ea7ab708406fe754ce2765611602061018083015101527f2dee8bf87e82bcee84ceb104d6cb4c9bec614129c7f9c1f8ccd1408293cc64506101a0820151527f243ae2d376579c21c88e353b3891b6f670ab016dbcae7a8cad2d010b01d8813e60206101a083015101527f17596bdefddb079bb27dcae8142e341f1a248b03ea686331fad0851af951f67d6101c0820151527f08b7e3925fa4cfb08693c23f91307f6332f8c2d00d10fe22007e8f557f12d78960206101c083015101527f0acf5e529d7177887ba6dc79a167a88cd6b7c11d863088959e76d07bb91cf5486101e0820151527f0abaa16f6ca8f4eb2effd49b0d1faea26a038bc6e138383882e6dfc86c72945060206101e083015101527f0ccffd9ebf84a35352134e5d30ac279f3259373b8894d7e8abe5d2a45c1d1ea2610200820151527f2eb99c6343db7834e1fc40625ac8b70cd64e8036b1e3d20d72f00efef151ec95602061020083015101527f0e9af80a46903c8d29d9593683381c704192d777d9736c0648401b2ff6e6756d610220820151527f0638a68ba70ce87098fccf3bf2b8d0c3558af5a1a349fc5081fce5684b3bafed602061022083015101527f10ca7993f6831bdcf2471213babb2e37f21decaeb08ff2cb817a28d6095f2a16610240820151527f0f1c97e91c16e627c4329e2f5c0c03e9980c6c0748b238d3ad661237c7c12993602061024083015101527f28b88da6722afe7e95789cb5fd5a74c97977d73c88d4eebd7bb4536880760571610260820151527f16183280aff7c1ca4982013d14907ffc00ad9aaf62e3060c60fd5650310294fe602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611a8082611b1e565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611ac5576112648282611b83565b6107b5611bf9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661084457604051631afcd79f60e31b815260040160405180910390fd5b610c7e611acd565b806001600160a01b03163b600003611b5457604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ca4565b600080516020612a0e83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611ba091906129f1565b600060405180830381855af49150503d8060008114611bdb576040519150601f19603f3d011682016040523d82523d6000602084013e611be0565b606091505b5091509150611bf0858383611c18565b95945050505050565b34156108445760405163b398979f60e01b815260040160405180910390fd5b606082611c2d57611c2882611c77565b611c70565b8151158015611c4457506001600160a01b0384163b155b15611c6d57604051639996b31560e01b81526001600160a01b0385166004820152602401610ca4565b50805b9392505050565b805115611c875780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518061010001604052806008906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611cf6604051806040016040528060008152602001600081525090565b8152602001611d18604051806040016040528060008152602001600081525090565b8152602001611d3a604051806040016040528060008152602001600081525090565b8152602001611d5c604051806040016040528060008152602001600081525090565b8152602001611d7e604051806040016040528060008152602001600081525090565b8152602001611da0604051806040016040528060008152602001600081525090565b8152602001611dc2604051806040016040528060008152602001600081525090565b8152602001611de4604051806040016040528060008152602001600081525090565b8152602001611e06604051806040016040528060008152602001600081525090565b8152602001611e28604051806040016040528060008152602001600081525090565b8152602001611e4a604051806040016040528060008152602001600081525090565b8152602001611e6c604051806040016040528060008152602001600081525090565b8152602001611e8e604051806040016040528060008152602001600081525090565b8152602001611eb0604051806040016040528060008152602001600081525090565b8152602001611ed2604051806040016040528060008152602001600081525090565b8152602001611ef4604051806040016040528060008152602001600081525090565b8152602001611f16604051806040016040528060008152602001600081525090565b8152602001611f38604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b80356001600160a01b0381168114611f6357600080fd5b919050565b600060208284031215611f7a57600080fd5b611c7082611f4c565b600060208284031215611f9557600080fd5b5035919050565b6001600160401b0384811682528316602082015260808101611fd4604083018480516001600160401b03168252602090810151910152565b949350505050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b038111828210171561201557612015611fdc565b60405290565b604051601f8201601f191681016001600160401b038111828210171561204357612043611fdc565b604052919050565b80356001600160401b0381168114611f6357600080fd5b60006060828403121561207457600080fd5b604051606081018181106001600160401b038211171561209657612096611fdc565b6040529050806120a58361204b565b81526120b36020840161204b565b6020820152604083013560408201525092915050565b6000604082840312156120db57600080fd5b604051604081018181106001600160401b03821117156120fd576120fd611fdc565b604052823581526020928301359281019290925250919050565b6000808284036104e081121561212c57600080fd5b6121368585612062565b925061048080605f198301121561214c57600080fd5b612154611ff2565b915061216386606087016120c9565b82526121728660a087016120c9565b60208301526121848660e087016120c9565b6040830152610120612198878288016120c9565b60608401526101606121ac888289016120c9565b60808501526101a06121c089828a016120c9565b60a08601526101e06121d48a828b016120c9565b60c08701526102206121e88b828c016120c9565b60e08801526102606121fc8c828d016120c9565b6101008901526102a06122118d828e016120c9565b878a01526122238d6102e08e016120c9565b6101408a01526122378d6103208e016120c9565b868a01526122498d6103608e016120c9565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b600080604083850312156122de57600080fd5b6122e783611f4c565b91506020808401356001600160401b038082111561230457600080fd5b818601915086601f83011261231857600080fd5b81358181111561232a5761232a611fdc565b61233c601f8201601f1916850161201b565b9150808252878482850101111561235257600080fd5b80848401858401376000848284010152508093505050509250929050565b81516001600160401b031681526020808301519082015260408101610c70565b803563ffffffff81168114611f6357600080fd5b6000602082840312156123b657600080fd5b611c7082612390565b6000806000808486036101208112156123d757600080fd5b6123e18787612062565b94506080605f19820112156123f557600080fd5b50604051608081018181106001600160401b038211171561241857612418611fdc565b8060405250606086013581526080860135602082015260a0860135604082015260c086013560608201528093505061245260e08601612390565b91506124616101008601611f4c565b905092959194509250565b60005b8381101561248757818101518382015260200161246f565b50506000910152565b60208152600082518060208401526124af81604085016020870161246c565b601f01601f19169190910160400192915050565b600080604083850312156124d657600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c7057610c706124e5565b634e487b7160e01b600052603260045260246000fd5b600081612533576125336124e5565b506000190190565b8060005b6008811015610e6157815184526020938401939091019060010161253f565b61257382825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006125d68185018380518252602090810151910152565b60a083015191506101406125f68186018480518252602090810151910152565b60c084015192506101806126168187018580518252602090810151910152565b60e085015193506101c06126368188018680518252602090810151910152565b928501519350610200926126568785018680518252602090810151910152565b61012086015194506102406126778189018780518252602090810151910152565b928601519450610280926126978885018780518252602090810151910152565b61016087015195506102c06126b8818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a808201905084518252602085015160208301526040850151612775604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a08501516101006127c28185018380518252602090810151910152565b60c087015191506101406127e28186018480518252602090810151910152565b60e088015192506101806128028187018580518252602090810151910152565b9188015192506101c0916128228684018580518252602090810151910152565b61012089015193506102006128438188018680518252602090810151910152565b918901519350610240916128638784018680518252602090810151910152565b6101608a015194506102806128848189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e083015261295b61050083018561253b565b611fd461060083018461255e565b60006020828403121561297b57600080fd5b81518015158114611c7057600080fd5b6001600160401b038281168282160390808211156129ab576129ab6124e5565b5092915050565b60006001600160401b038083168181036129ce576129ce6124e5565b6001019392505050565b6000602082840312156129ea57600080fd5b5051919050565b60008251612a0381846020870161246c565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" +"0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b60405161288990816100d282396080518181816109a40152610afc0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc146101d757806302b592f3146101d25780630d8e6e2c146101cd5780632063d4f7146101c85780632f79889d146101c3578063313df7b1146101be578063382b215a146101b95780634f1ef286146101b457806352d1902d146101af57806362827733146101aa57806369cc6a04146101a55780636f96bdae146101a0578063715018a61461019b57806376b6b7cb146101965780638584d23f146101915780638da5cb5b1461018c57806396c1ca61146101875780639baa3cc9146101825780639fdb54a71461017d578063a9a9c9f514610178578063ad3cb1cc14610173578063bd32519a1461016e578063c23b9e9e14610169578063ca6fe85514610164578063d24d933d1461015f578063e03033011461015a578063f2fde38b146101555763f9e50d191461015057600080fd5b611201565b6111d8565b6110d3565b611098565b61107a565b611053565b61102d565b610fb0565b610f79565b610f3a565b610ded565b610d66565b610d1d565b610ce0565b610cc2565b610c57565b610c0c565b610b72565b610b54565b610ae9565b61092a565b6108f1565b6108c8565b6108a1565b610749565b6104ad565b610437565b61020e565b600435906001600160a01b03821682036101f257565b600080fd5b61010435906001600160a01b03821682036101f257565b346101f25760203660031901126101f2576102276101dc565b61022f6116d9565b6001600160a01b039081169081156102bf57600c5490811682146102ad5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561032257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b6102d1565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761035857604052565b610327565b606081019081106001600160401b0382111761035857604052565b608081019081106001600160401b0382111761035857604052565b90601f801991011681019081106001600160401b0382111761035857604052565b604051906102e082018281106001600160401b0382111761035857604052565b604051906103e18261033d565b565b604051906103e18261035d565b604051906102c082018281106001600160401b0382111761035857604052565b9060405161041d8161033d565b6020600182946001600160401b0381541684520154910152565b346101f25760203660031901126101f257600435600e548110156101f2576104606080916102e7565b506104ab81549161047b60016001600160401b039201610410565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b346101f25760003660031901126101f2576060604051600181526000602082015260006040820152f35b60609060031901126101f257604051906104f08261035d565b816001600160401b0360043581811681036101f257825260243590811681036101f25760208201526040604435910152565b60409060631901126101f2576040519061053b8261033d565b60643582526084356020830152565b60409060a31901126101f257604051906105638261033d565b60a435825260c4356020830152565b60409060e31901126101f2576040519061058b8261033d565b60e4358252610104356020830152565b6040906101231901126101f257604051906105b58261033d565b610124358252610144356020830152565b6040906101631901126101f257604051906105e08261033d565b610164358252610184356020830152565b6040906101a31901126101f2576040519061060b8261033d565b6101a43582526101c4356020830152565b6040906101e31901126101f257604051906106368261033d565b6101e4358252610204356020830152565b6040906102231901126101f257604051906106618261033d565b610224358252610244356020830152565b6040906102631901126101f2576040519061068c8261033d565b610264358252610284356020830152565b6040906102a31901126101f257604051906106b78261033d565b6102a43582526102c4356020830152565b6040906102e31901126101f257604051906106e28261033d565b6102e4358252610304356020830152565b6040906103231901126101f2576040519061070d8261033d565b610324358252610344356020830152565b6040906103631901126101f257604051906107388261033d565b610364358252610384356020830152565b346101f2576104e03660031901126101f257610764366104d7565b6104803660631901126101f25761089f9061077d6103b4565b9061078736610522565b82526107923661054a565b60208301526107a036610572565b60408301526107ae3661059b565b60608301526107bc366105c6565b60808301526107ca366105f1565b60a08301526107d83661061c565b60c08301526107e636610647565b60e08301526107f436610672565b6101008301526108033661069d565b610120830152610812366106c8565b610140830152610821366106f3565b6101608301526108303661071e565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c083015261125c565b005b346101f25760003660031901126101f25760206001600160401b03600d5416604051908152f35b346101f25760003660031901126101f257600c546040516001600160a01b039091168152602090f35b346101f25760003660031901126101f2576020600254604051908152f35b6001600160401b03811161035857601f01601f191660200190565b6040806003193601126101f25761093f6101dc565b6024356001600160401b0381116101f257366023820112156101f25780600401359061096a8261090f565b9161097785519384610393565b80835260209136602483830101116101f25781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610acd575b50610abc5790806004926109e26116d9565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610a8d575b5050610a52578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b60008051602061283d8339815191528193929303610a745761089f83836126a1565b8351632a87526960e21b81526004810191909152602490fd5b610aad929350803d10610ab5575b610aa58183610393565b810190611f9a565b903880610a2c565b503d610a9b565b845163703e46dd60e11b8152600490fd5b90508160008051602061283d83398151915254161415386109d0565b346101f25760003660031901126101f2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610b4257602060405160008051602061283d8339815191528152f35b60405163703e46dd60e11b8152600490fd5b346101f25760003660031901126101f2576020600154604051908152f35b346101f257600080600319360112610bd157610b8c6116d9565b600c5460ff8160a01c166000146102ad576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b60809060631901126101f25760405190610bed82610378565b6064358252608435602083015260a435604083015260c4356060830152565b346101f25760803660031901126101f2576020610c4f604051610c2e81610378565b60043581526024358382015260443560408201526064356060820152611380565b604051908152f35b346101f257600080600319360112610bd157610c716116d9565b60008051602061281d83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b346101f25760003660031901126101f2576020600054604051908152f35b346101f25760203660031901126101f2576040610cfe600435611408565b6104ab82518092602080916001600160401b0381511684520151910152565b346101f25760003660031901126101f25760008051602061281d833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff821682036101f257565b346101f25760203660031901126101f25760043563ffffffff8082168083036101f257610d916116d9565b610e108110918215610ddb575b5050610dc957600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610d9e565b346101f2576101203660031901126101f257610e08366104d7565b610e1136610bd4565b90610e1a610d53565b610e226101f7565b9060008051602061285d83398151915254936001600160401b0360ff8660401c1615951680159081610f32575b6001149081610f28575b159081610f1f575b50610f0d5760008051602061285d833981519152805467ffffffffffffffff19166001179055610e959385610ee8576114ce565b610e9b57005b60008051602061285d833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102a8565b60008051602061285d833981519152805460ff60401b1916600160401b1790556114ce565b60405163f92ee8a960e01b8152600490fd5b90501538610e61565b303b159150610e59565b869150610e4f565b346101f25760003660031901126101f257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b0390f35b346101f25760003660031901126101f257608060045460055460065460075491604051938452602084015260408301526060820152f35b346101f25760003660031901126101f2576040805190610fcf8261033d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b83811061101a5784604081866000838284010152601f80199101168101030190f35b8581018301518582018301528201610ff8565b346101f25760003660031901126101f257602060ff600c5460a01c166040519015158152f35b346101f25760003660031901126101f257602063ffffffff600c5460a81c16604051908152f35b346101f25760003660031901126101f2576020600354604051908152f35b346101f25760003660031901126101f257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b346101f25760403660031901126101f257600435600e5443821180156111ce575b61115b576000916111066000926113e7565b9161112861111c600d546001600160401b031690565b6001600160401b031690565b925b811561116d575b509091501561115b5761114a610f7592602435926113fb565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b8261118b61111c61117d846102e7565b50546001600160401b031690565b11156111b4575b600281106111af578381146111af576111aa90611658565b61112a565b611131565b93505060016111c861111c61117d866102e7565b93611192565b50600381106110f4565b346101f25760203660031901126101f25761089f6111f46101dc565b6111fc6116d9565b611665565b346101f25760003660031901126101f2576020600e54604051908152f35b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c16908161136c575b5061135a578151600a546001600160401b03918183169083161180159190611333575b50611321577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906112d060408501936112ca8551611712565b85611bf8565b6112d98461121f565b6112e884824216834316611e51565b61130d60206112fe86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b9050818061134b60208701516001600160401b031690565b9260401c169116111538611291565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861126e565b60208101519060606040820151910151604051916020830193845260408301526060820152606081526113b281610378565b51902090565b604051906113c58261033d565b60006020838281520152565b634e487b7160e01b600052601160045260246000fd5b6000198101919082116113f657565b6113d1565b919082039182116113f657565b6114106113b8565b50600e5490611426611421836113e7565b6102e7565b509061144061111c6001809401546001600160401b031690565b8110156114bc5761145c61111c600d546001600160401b031690565b83811061148157505050600161147761142161147e936113e7565b5001610410565b90565b816114a161111c85611492856102e7565b5001546001600160401b031690565b116114ad57820161145c565b61147e935061147791506102e7565b604051631856a49960e21b8152600490fd5b9190926114e5906114dd612748565b6111fc612748565b6114ed612748565b6001600160401b03908161150884516001600160401b031690565b1615801590611639575b801561162d575b8015611621575b8015611615575b801561160c575b6115fa576103e1936115c96115ef9261157e866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b82516004556020830151600555604083015160065560608301516007556115a48661121f565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b6115ea6115d582611380565b918260005551916115e583600155565b600255565b600355565b804216904316611e51565b6040516350dd03f760e11b8152600490fd5b5083511561152e565b50606084015115611527565b50604084015115611520565b50602084015115611519565b5061165161111c60208501516001600160401b031690565b1515611512565b80156113f6576000190190565b6001600160a01b039081169081156116c05760008051602061281d83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b60008051602061281d833981519152546001600160a01b031633036116fa57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561173b57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519060e082018281106001600160401b038211176103585760405260e0368337565b908160209103126101f2575180151581036101f25790565b6000915b600783106117cd57505050565b6001908251815260208091019201920191906117c0565b610460906117fd83825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e084015260808101519061185b610100928386019060208091805184520151910152565b60a08101519161187b610140938487019060208091805184520151910152565b60c08201519261189b610180948588019060208091805184520151910152565b60e0830151916118bb6101c0938489019060208091805184520151910152565b8301516118d8610200918289019060208091805184520151910152565b610120840151916118f961024093848a019060208091805184520151910152565b8401519261191761028094858a019060208091805184520151910152565b6119526101608601519661193b6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b6105e090611be56103e194969593966102a0610a6084019880518552602081015160208601526119fb6040820151604087019060208091805184520151910152565b6060810151805160808701526020015160a08601526080810151805160c08701526020015160e086015260a0810151611a44610100918288019060208091805184520151910152565b611bb186611b8260c0850151611a6a610140918285019060208091805184520151910152565b611b5360e087015195611a8d610180978887019060208091805184520151910152565b870151611aaa6101c0918287019060208091805184520151910152565b611ae761012089015193611ace610200958689019060208091805184520151910152565b8901516102408097019060208091805184520151910152565b611b248c6102c06101608b015199611b0f6102809b8c85019060208091805184520151910152565b8b015191019060208091805184520151910152565b6101a088015180516103008e0152602001516103208d015287015180516103408d0152602001516103608c0152565b6101e086015180516103808c0152602001516103a08b015285015180516103c08b0152602001516103e08a0152565b61022084015180516104008a015260200151610420890152830151805161044089015260200151610460880152565b6102608201518051610480880152602001516104a08701528101516104c086015201516104e08401526105008301906117bc565b01906117e4565b6040513d6000823e3d90fd5b602090611c036120c5565b6040611c0d611780565b926001548452611c2761111c82516001600160401b031690565b85850152611c4161111c868301516001600160401b031690565b8285015201516060830152611c6a604051948593849363ce537a7760e01b8552600485016119b9565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af4908115611cdb57600091611cac575b5015611c9a57565b6040516309bde33960e01b8152600490fd5b611cce915060203d602011611cd4575b611cc68183610393565b8101906117a4565b38611c92565b503d611cbc565b611bec565b6001600160401b0391821690821603919082116113f657565b90611d105760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146113f65760010190565b600e54600160401b811015610358576001810180600e5581101561032257602060037fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff92600e6000520292611e4a6040857fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01926001600160401b0393611dde8583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe8601906001600160401b03166001600160401b0319825416179055565b0151910155565b9091611ec06103e193600e548015159081611f26575b50611eca575b6040611e8360208501516001600160401b031690565b930151611ea0611e916103d4565b6001600160401b039095168552565b6020840152611eb0611e916103e3565b6001600160401b03166020840152565b6040820152611d3e565b611ee8611ee2611421600d546001600160401b031690565b90611cf9565b611f21611f05611f00600d546001600160401b031690565b611d26565b6001600160401b03166001600160401b0319600d541617600d55565b611e6d565b611f699150611f3a611421611f4b926113e7565b505460401c6001600160401b031690565b611f63611f3a611421600d546001600160401b031690565b90611ce0565b6001600160401b03611f90611f87600c5463ffffffff9060a81c1690565b63ffffffff1690565b9116101538611e67565b908160209103126101f2575190565b611fb16103f0565b906000825260006020830152611fc56113b8565b6040830152611fd26113b8565b6060830152611fdf6113b8565b6080830152611fec6113b8565b60a0830152611ff96113b8565b60c08301526120066113b8565b60e08301526120136113b8565b6101008301526120216113b8565b61012083015261202f6113b8565b61014083015261203d6113b8565b61016083015261204b6113b8565b6101808301526120596113b8565b6101a08301526120676113b8565b6101c08301526120756113b8565b6101e08301526120836113b8565b6102008301526120916113b8565b61022083015261209f6113b8565b6102408301526120ad6113b8565b610260830152600061028083015260006102a0830152565b6120cd611fa9565b906210000082527f16183280aff7c1ca4982013d14907ffc00ad9aaf62e3060c60fd5650310294fe60206004818501527f20f8ed3de77af84f07ab14e0e3a6af9609d179bd825068fca7f5d10de9cec1d081604086017f2594eb9237b7cc992b0aff6541c0b4f6dbaa9235366de2e5e08eb7ed415d6f5e8151525101527f1fcf82acfe5e7b819ff344ac2a25dfbaa3fb12fb03696ab24f52210896a976f581606086017f23662f2d65f6af786069b0feb61ab3d9cc2dd3e67ccbf422a223c7fa55f44ee68151525101527f1181da971e46128143c9f733b3dfb9ccfed793481cec98e4576d550342a4d60c81608086017f1e4ba740bce3f5c1b696a6b838a9267e00de6cb86fb635db305eeb4874f0f9268151525101527f0de74676a34741220f476bae49ec09f859d46c7f8c63cc5f76d494a09e4484138160a086017f1d31ad0a55e8f8c6f922b0841d4ed606339ed063e86932328c202647a70ed7cd8151525101527f01d88d68cb48acf2ebd1d69e0fc38d5fb188c1c87792d9debfde6e48b52135628160c086017f1f0a8ad12bd711b801c05a04926676385733cd886b30414dc8a9455f5ee1ccf08151525101527f10b1aa078508c19c234d1c48764ecea93aeeb26627aa9169b3c3f8dd9722a6468160e086017f2d6bd0f4fd66b3f1183ef8e83be754d47b3f2108d5583c80d669f65fa8a6c6888151525101527f15a424f82f95e588a93ce0eb93369b35291fd603e490dece7bab07e181d9b9558161010086017f29e8cb6f4a4499852ba317b86e5fa40e53476c42e37c1a87d9a2ad21625d54868151525101527f1b1a9dce8744e1accfa8ee724b09cad428a70cbd569efe2b46e927565f6479468161012086017f210a0dcd7c615d5963ba67f22090dd66843d3757b9a17d0729971812c03345798151525101527f1ec91c705e7482be0f5768f598869716b93e1aba284ab207a01acaf5b90875778161014086017f1af7507105277eafd94dc06bd01521a9fa91f7743cfcd896c2289df0696e2e578151525101527f0d9eb0e9d5a0f218673c5b8883b1bc65064c7c57ddf370b534da88e737e6f9998161016086017f0a870d4d26887f446f5d0cbace89ea87592732161a7adf4fed3c1bcd72d56b048151525101527f266dd2c45a9d95cd00c622c047eacb1e29c90c0ea7ab708406fe754ce27656118161018086017f236a6ee8b0a5bfcbe26f5609cc2f6a8a13d23dfd88b7c47c590b44a0fbc39fab8151525101527f243ae2d376579c21c88e353b3891b6f670ab016dbcae7a8cad2d010b01d8813e816101a086017f2dee8bf87e82bcee84ceb104d6cb4c9bec614129c7f9c1f8ccd1408293cc64508151525101527f08b7e3925fa4cfb08693c23f91307f6332f8c2d00d10fe22007e8f557f12d789816101c086017f17596bdefddb079bb27dcae8142e341f1a248b03ea686331fad0851af951f67d8151525101527f0abaa16f6ca8f4eb2effd49b0d1faea26a038bc6e138383882e6dfc86c729450816101e086017f0acf5e529d7177887ba6dc79a167a88cd6b7c11d863088959e76d07bb91cf5488151525101527f2eb99c6343db7834e1fc40625ac8b70cd64e8036b1e3d20d72f00efef151ec958161020086017f0ccffd9ebf84a35352134e5d30ac279f3259373b8894d7e8abe5d2a45c1d1ea28151525101527f0638a68ba70ce87098fccf3bf2b8d0c3558af5a1a349fc5081fce5684b3bafed8161022086017f0e9af80a46903c8d29d9593683381c704192d777d9736c0648401b2ff6e6756d8151525101527f0f1c97e91c16e627c4329e2f5c0c03e9980c6c0748b238d3ad661237c7c129938161024086017f10ca7993f6831bdcf2471213babb2e37f21decaeb08ff2cb817a28d6095f2a1681515251015261026084017f28b88da6722afe7e95789cb5fd5a74c97977d73c88d4eebd7bb45368807605718151525101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808301527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a0830152565b90813b156127275760008051602061283d83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511561270c5761270991612777565b50565b50503461271557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff60008051602061285d8339815191525460401c161561276557565b604051631afcd79f60e31b8152600490fd5b60008061147e93602081519101845af43d156127b5573d916127988361090f565b926127a66040519485610393565b83523d6000602085013e6127b9565b6060915b906127e057508051156127ce57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612813575b6127f1575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156127e956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" diff --git a/contract-bindings/src/plonk_verifier.rs b/contract-bindings/src/plonk_verifier.rs index 5fcf5889c..906855a1d 100644 --- a/contract-bindings/src/plonk_verifier.rs +++ b/contract-bindings/src/plonk_verifier.rs @@ -112,10 +112,10 @@ pub mod plonk_verifier { ::std::boxed::Box::new( ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ), - 8usize, + 7usize, ), internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[8]"), + ::std::borrow::ToOwned::to_owned("uint256[7]"), ), }, ::ethers::core::abi::ethabi::Param { @@ -234,12 +234,12 @@ pub mod plonk_verifier { pub static PLONKVERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"a#\xA2a\0:`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14a\0-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`\x046\x10a\x005W`\x005`\xE0\x1C\x80c\xA1\xF1\xA3N\x14a\0:W[`\0\x80\xFD[a\0Ma\0H6`\x04a!$V[a\0aV[`@Q\x90\x15\x15\x81R` \x01`@Q\x80\x91\x03\x90\xF3[`\0a\0l\x82a\0\xDFV[a\0}\x83`\0[` \x02\x01Qa\x02\x1AV[a\0\x88\x83`\x01a\0sV[a\0\x93\x83`\x02a\0sV[a\0\x9E\x83`\x03a\0sV[a\0\xA9\x83`\x04a\0sV[a\0\xB4\x83`\x05a\0sV[a\0\xBF\x83`\x06a\0sV[a\0\xCA\x83`\x07a\0sV[a\0\xD5\x84\x84\x84a\x02\x81V[\x90P[\x93\x92PPPV[\x80Qa\0\xEA\x90a\x04\x80V[a\0\xF7\x81` \x01Qa\x04\x80V[a\x01\x04\x81`@\x01Qa\x04\x80V[a\x01\x11\x81``\x01Qa\x04\x80V[a\x01\x1E\x81`\x80\x01Qa\x04\x80V[a\x01+\x81`\xA0\x01Qa\x04\x80V[a\x018\x81`\xC0\x01Qa\x04\x80V[a\x01E\x81`\xE0\x01Qa\x04\x80V[a\x01S\x81a\x01\0\x01Qa\x04\x80V[a\x01a\x81a\x01 \x01Qa\x04\x80V[a\x01o\x81a\x01@\x01Qa\x04\x80V[a\x01}\x81a\x01`\x01Qa\x04\x80V[a\x01\x8B\x81a\x01\x80\x01Qa\x04\x80V[a\x01\x99\x81a\x01\xA0\x01Qa\x02\x1AV[a\x01\xA7\x81a\x01\xC0\x01Qa\x02\x1AV[a\x01\xB5\x81a\x01\xE0\x01Qa\x02\x1AV[a\x01\xC3\x81a\x02\0\x01Qa\x02\x1AV[a\x01\xD1\x81a\x02 \x01Qa\x02\x1AV[a\x01\xDF\x81a\x02@\x01Qa\x02\x1AV[a\x01\xED\x81a\x02`\x01Qa\x02\x1AV[a\x01\xFB\x81a\x02\x80\x01Qa\x02\x1AV[a\x02\t\x81a\x02\xA0\x01Qa\x02\x1AV[a\x02\x17\x81a\x02\xC0\x01Qa\x02\x1AV[PV[`\0\x80Q` a#v\x839\x81Q\x91R\x81\x10\x80a\x02}W`@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\x01[`@Q\x80\x91\x03\x90\xFD[PPV[`\0\x83` \x01Q`\x08\x14a\x02\xA8W`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\0a\x02\xB5\x85\x85\x85a\x05/V[\x90P`\0a\x02\xC6\x86`\0\x01Qa\n\xA6V[\x90P`\0a\x02\xD9\x82\x84`\xA0\x01Q\x88a\x0E\xF8V[\x90Pa\x02\xF8`@Q\x80`@\x01`@R\x80`\0\x81R` \x01`\0\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x03-\x87a\x01`\x01Qa\x03(\x89a\x01\x80\x01Q\x88`\xE0\x01Qa\x0FXV[a\x0F\xFCV[\x91P`\0\x80a\x03>\x8B\x88\x87\x8Ca\x10\xA3V[\x91P\x91Pa\x03O\x81a\x03(\x84a\x12\xE3V[\x92Pa\x03h\x83a\x03(\x8Ba\x01`\x01Q\x8A`\xA0\x01Qa\x0FXV[`\xA0\x88\x01Q`@\x88\x01Q` \x01Q\x91\x94P`\0\x80Q` a#v\x839\x81Q\x91R\x91\x82\x90\x82\t\x90P\x81`\xE0\x8A\x01Q\x82\t\x90Pa\x03\xAC\x85a\x03(\x8Da\x01\x80\x01Q\x84a\x0FXV[\x94P`\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\x04n\x87\x82a\x04a\x89a\x12\xE3V[a\x04ia\x13\x82V[a\x14SV[\x9E\x9DPPPPPPPPPPPPPPV[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x04\xBAWPPPV[\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\x05*W`@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\x02tV[PPPV[a\x05w`@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[`\0`\0\x80Q` a#v\x839\x81Q\x91R\x90P`@Q` \x81\x01`\0\x81R`\xFE`\xE0\x1B\x81R\x86Q`\xC0\x1B`\x04\x82\x01R` \x87\x01Q`\xC0\x1B`\x0C\x82\x01Ra\x02\x80\x87\x01Q` \x82\x01Ra\x02\xA0\x87\x01Q`@\x82\x01R`\x01``\x82\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81R` \x01\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\r{W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\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\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81R` \x01\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x0E\xDFW`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81R` \x01~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\x1C`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a\x0F&\x84\x84a\x157V[\x80\x82Ra\x0F6\x90\x85\x90\x85\x90a\x15\x8BV[` \x82\x01R\x80Qa\x0FL\x90\x85\x90\x84\x90\x86\x90a\x15\xFFV[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x0Fta\x1E\x19V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0F\xA6W`\0\x80\xFD[P\x80a\x0F\xF4W`@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\x02tV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x10\x18a\x1E7V[\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\x10UW`\0\x80\xFD[P\x80a\x0F\xF4W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02tV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0a\x10\xD9\x87\x87\x87\x87a\x17UV[\x90P`\0\x80Q` a#v\x839\x81Q\x91R`\0a\x10\xF7\x88\x87\x89a\x1C%V[\x90Pa\x11\x03\x81\x83a#\x1CV[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x110\x85a\x03(\x8A`\0\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11X\x86a\x03(\x8A` \x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x80\x86a\x03(\x8A`@\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xA8\x86a\x03(\x8A``\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xD0\x86a\x03(\x8A`\x80\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xF8\x86a\x03(\x8D`@\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x12 \x86a\x03(\x8D``\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x12H\x86a\x03(\x8D`\x80\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x12p\x86a\x03(\x8D`\xA0\x01Q\x84a\x0FXV[\x95P`\0\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x12\x9B\x87a\x03(\x8B`\xA0\x01Q\x84a\x0FXV[\x96Pa\x12\xD2a\x12\xCC`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x0FXV[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x13\x0BWP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x13P\x91\x90a#SV[a\x13z\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa#\x1CV[\x90R\x92\x91PPV[a\x13\xAD`@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\x80a\x15)W`@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\x02tV[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q`\0\x90`\0\x80Q` a#v\x839\x81Q\x91R\x90\x83\x80\x15a\x15{W\x84\x93P`\0[\x82\x81\x10\x15a\x15oW\x83\x85\x86\t\x94P`\x01\x01a\x15YV[P`\x01\x84\x03\x93Pa\x15\x82V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a\x15\x9DWP`\x01a\0\xD8V[\x81`\0\x03a\x15\xADWP`\0a\0\xD8V[` \x84\x01Q`\0\x80Q` a#v\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x15\xDDW`\x01\x87\x03\x92Pa\x15\xE4V[`\x01\x84\x03\x92P[Pa\x15\xEE\x82a\x1D\x15V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[`\0`\0\x80Q` a#v\x839\x81Q\x91R\x82\x82\x03a\x16|W`\x01`\0[`\x08\x81\x10\x15a\x16pW\x81\x86\x03a\x16MW\x86\x81`\x08\x81\x10a\x16>Wa\x16>a#\x06V[` \x02\x01Q\x93PPPPa\x15/V[\x82\x80a\x16[Wa\x16[a#=V[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x16\x1CV[P`\0\x92PPPa\x15/V[a\x16\x84a\x1EUV[`@\x87\x01Q`\x01`\xE0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x08\x81\x10\x15a\x16\xC5W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x16\x98V[PPPP`\0\x80`\0\x90P`\x01\x83\x89`@\x8C\x01Q`\0[`\x08\x81\x10\x15a\x17\x1CW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x16\xDCV[PPPP\x80\x92PP`\0a\x17/\x83a\x1D\x15V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0\x80`\0\x80`\0`\0\x80Q` a#v\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7XV[`\xE0\x82\x01Ra\0\xB56a\x03eV[a\x01\0\x82\x01Ra\0\xC46a\x03\x8CV[a\x01 \x82\x01Ra\0\xD36a\x03\xB3V[a\x01@\x82\x01Ra\0\xE26a\x03\xDAV[a\x01`\x82\x01Ra\0\xF16a\x04\x01V[a\x01\x80\x82\x01Ra\x01\x006a\x04(V[a\x01\xA0\x82\x01Ra\x01\x0F6a\x04OV[a\x01\xC0\x82\x01Ra\x01\x1E6a\x04vV[a\x01\xE0\x82\x01Ra\x01-6a\x04\x9DV[a\x02\0\x82\x01Ra\x01<6a\x04\xC4V[a\x02 \x82\x01Ra\x01K6a\x04\xEBV[a\x02@\x82\x01Ra\x01Z6a\x05\x12V[a\x02`\x82\x01Ra\x04\xC45a\x02\x80\x82\x01Ra\x04\xE45a\x02\xA0\x82\x01Ra\x01}6a\x074V[a\x01\x866a\x07tV[\x91a\x08\xD0V[`@Q\x90\x15\x15\x81R\x90\x81\x90` \x82\x01\x90V[\x03\x90\xF3[`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q\x90a\x02\xC0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[a\x01\xA7V[`@Q\x90`@\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90a\x02\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90`\x80\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90``\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90`\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@\x90`C\x19\x01\x12a\x01\xA2Wa\x02\x98a\x01\xE3V[\x90`D5\x82R`d5` \x83\x01RV[`@\x90`\x83\x19\x01\x12a\x01\xA2Wa\x02\xBCa\x01\xE3V[\x90`\x845\x82R`\xA45` \x83\x01RV[`@\x90`\xC3\x19\x01\x12a\x01\xA2Wa\x02\xE0a\x01\xE3V[\x90`\xC45\x82R`\xE45` \x83\x01RV[`@\x90a\x01\x03\x19\x01\x12a\x01\xA2Wa\x03\x05a\x01\xE3V[\x90a\x01\x045\x82Ra\x01$5` \x83\x01RV[`@\x90a\x01C\x19\x01\x12a\x01\xA2Wa\x03,a\x01\xE3V[\x90a\x01D5\x82Ra\x01d5` \x83\x01RV[`@\x90a\x01\x83\x19\x01\x12a\x01\xA2Wa\x03Sa\x01\xE3V[\x90a\x01\x845\x82Ra\x01\xA45` \x83\x01RV[`@\x90a\x01\xC3\x19\x01\x12a\x01\xA2Wa\x03za\x01\xE3V[\x90a\x01\xC45\x82Ra\x01\xE45` \x83\x01RV[`@\x90a\x02\x03\x19\x01\x12a\x01\xA2Wa\x03\xA1a\x01\xE3V[\x90a\x02\x045\x82Ra\x02$5` \x83\x01RV[`@\x90a\x02C\x19\x01\x12a\x01\xA2Wa\x03\xC8a\x01\xE3V[\x90a\x02D5\x82Ra\x02d5` \x83\x01RV[`@\x90a\x02\x83\x19\x01\x12a\x01\xA2Wa\x03\xEFa\x01\xE3V[\x90a\x02\x845\x82Ra\x02\xA45` \x83\x01RV[`@\x90a\x02\xC3\x19\x01\x12a\x01\xA2Wa\x04\x16a\x01\xE3V[\x90a\x02\xC45\x82Ra\x02\xE45` \x83\x01RV[`@\x90a\x03\x03\x19\x01\x12a\x01\xA2Wa\x04=a\x01\xE3V[\x90a\x03\x045\x82Ra\x03$5` \x83\x01RV[`@\x90a\x03C\x19\x01\x12a\x01\xA2Wa\x04da\x01\xE3V[\x90a\x03D5\x82Ra\x03d5` \x83\x01RV[`@\x90a\x03\x83\x19\x01\x12a\x01\xA2Wa\x04\x8Ba\x01\xE3V[\x90a\x03\x845\x82Ra\x03\xA45` \x83\x01RV[`@\x90a\x03\xC3\x19\x01\x12a\x01\xA2Wa\x04\xB2a\x01\xE3V[\x90a\x03\xC45\x82Ra\x03\xE45` \x83\x01RV[`@\x90a\x04\x03\x19\x01\x12a\x01\xA2Wa\x04\xD9a\x01\xE3V[\x90a\x04\x045\x82Ra\x04$5` \x83\x01RV[`@\x90a\x04C\x19\x01\x12a\x01\xA2Wa\x05\0a\x01\xE3V[\x90a\x04D5\x82Ra\x04d5` \x83\x01RV[`@\x90a\x04\x83\x19\x01\x12a\x01\xA2Wa\x05'a\x01\xE3V[\x90a\x04\x845\x82Ra\x04\xA45` \x83\x01RV[`@\x90a\x05\xE3\x19\x01\x12a\x01\xA2Wa\x05Na\x01\xE3V[\x90a\x05\xE45\x82Ra\x06\x045` \x83\x01RV[`@\x90a\x06#\x19\x01\x12a\x01\xA2Wa\x05ua\x01\xE3V[\x90a\x06$5\x82Ra\x06D5` \x83\x01RV[`@\x90a\x06c\x19\x01\x12a\x01\xA2Wa\x05\x9Ca\x01\xE3V[\x90a\x06d5\x82Ra\x06\x845` \x83\x01RV[`@\x90a\x06\xA3\x19\x01\x12a\x01\xA2Wa\x05\xC3a\x01\xE3V[\x90a\x06\xA45\x82Ra\x06\xC45` \x83\x01RV[`@\x90a\x06\xE3\x19\x01\x12a\x01\xA2Wa\x05\xEAa\x01\xE3V[\x90a\x06\xE45\x82Ra\x07\x045` \x83\x01RV[`@\x90a\x07#\x19\x01\x12a\x01\xA2Wa\x06\x11a\x01\xE3V[\x90a\x07$5\x82Ra\x07D5` \x83\x01RV[`@\x90a\x07c\x19\x01\x12a\x01\xA2Wa\x068a\x01\xE3V[\x90a\x07d5\x82Ra\x07\x845` \x83\x01RV[`@\x90a\x07\xA3\x19\x01\x12a\x01\xA2Wa\x06_a\x01\xE3V[\x90a\x07\xA45\x82Ra\x07\xC45` \x83\x01RV[`@\x90a\x07\xE3\x19\x01\x12a\x01\xA2Wa\x06\x86a\x01\xE3V[\x90a\x07\xE45\x82Ra\x08\x045` \x83\x01RV[`@\x90a\x08#\x19\x01\x12a\x01\xA2Wa\x06\xADa\x01\xE3V[\x90a\x08$5\x82Ra\x08D5` \x83\x01RV[`@\x90a\x08c\x19\x01\x12a\x01\xA2Wa\x06\xD4a\x01\xE3V[\x90a\x08d5\x82Ra\x08\x845` \x83\x01RV[`@\x90a\x08\xA3\x19\x01\x12a\x01\xA2Wa\x06\xFBa\x01\xE3V[\x90a\x08\xA45\x82Ra\x08\xC45` \x83\x01RV[`@\x90a\x08\xE3\x19\x01\x12a\x01\xA2Wa\x07\"a\x01\xE3V[\x90a\x08\xE45\x82Ra\t\x045` \x83\x01RV[\x80a\x05#\x12\x15a\x01\xA2Wa\x07Fa\x02dV[\x90\x81a\x05\xE4\x91\x82\x11a\x01\xA2Wa\x05\x04\x90[\x82\x82\x10a\x07dWPPP\x90V[\x815\x81R` \x91\x82\x01\x91\x01a\x07WV[\x90a\x04\x80a\x05\xE3\x19\x83\x01\x12a\x01\xA2Wa\x08=a\x07\x8Ea\x02\x03V[\x92a\x07\x98\x81a\x059V[\x84Ra\x07\xA3\x81a\x05`V[` \x85\x01Ra\x07\xB1\x81a\x05\x87V[`@\x85\x01Ra\x07\xBF\x81a\x05\xAEV[``\x85\x01Ra\x07\xCD\x81a\x05\xD5V[`\x80\x85\x01Ra\x07\xDB\x81a\x05\xFCV[`\xA0\x85\x01Ra\x07\xE9\x81a\x06#V[`\xC0\x85\x01Ra\x07\xF7\x81a\x06JV[`\xE0\x85\x01Ra\x08\x05\x81a\x06qV[a\x01\0\x85\x01Ra\x08\x14\x81a\x06\x98V[a\x01 \x85\x01Ra\x08#\x81a\x06\xBFV[a\x01@\x85\x01Ra\x082\x81a\x06\xE6V[a\x01`\x85\x01Ra\x07\rV[a\x01\x80\x83\x01Ra\t$5a\x01\xA0\x83\x01Ra\tD5a\x01\xC0\x83\x01Ra\td5a\x01\xE0\x83\x01Ra\t\x845a\x02\0\x83\x01Ra\t\xA45a\x02 \x83\x01Ra\t\xC45a\x02@\x83\x01Ra\t\xE45a\x02`\x83\x01Ra\n\x045a\x02\x80\x83\x01Ra\n$5a\x02\xA0\x83\x01Ra\nD5a\x02\xC0\x83\x01RV[\x90`\x07\x81\x10\x15a\x08\xBAW`\x05\x1B\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x90a\nj\x92\x91a\x08\xE0\x83Qa\x0C\x89V[a\x08\xED` \x84\x01Qa\x0C\x89V[a\x08\xFA`@\x84\x01Qa\x0C\x89V[a\t\x07``\x84\x01Qa\x0C\x89V[a\t\x14`\x80\x84\x01Qa\x0C\x89V[a\t!`\xA0\x84\x01Qa\x0C\x89V[a\t.`\xC0\x84\x01Qa\x0C\x89V[a\t;`\xE0\x84\x01Qa\x0C\x89V[a\tIa\x01\0\x84\x01Qa\x0C\x89V[a\tWa\x01 \x84\x01Qa\x0C\x89V[a\tea\x01@\x84\x01Qa\x0C\x89V[a\tsa\x01`\x84\x01Qa\x0C\x89V[a\t\x81a\x01\x80\x84\x01Qa\x0C\x89V[a\t\x8Fa\x01\xA0\x84\x01Qa\nmV[a\t\x9Da\x01\xC0\x84\x01Qa\nmV[a\t\xABa\x01\xE0\x84\x01Qa\nmV[a\t\xB9a\x02\0\x84\x01Qa\nmV[a\t\xC7a\x02 \x84\x01Qa\nmV[a\t\xD5a\x02@\x84\x01Qa\nmV[a\t\xE3a\x02`\x84\x01Qa\nmV[a\t\xF1a\x02\x80\x84\x01Qa\nmV[a\t\xFFa\x02\xA0\x84\x01Qa\nmV[a\n\ra\x02\xC0\x84\x01Qa\nmV[a\n\x17\x82Qa\nmV[a\n$` \x83\x01Qa\nmV[a\n1`@\x83\x01Qa\nmV[a\n>``\x83\x01Qa\nmV[a\nK`\x80\x83\x01Qa\nmV[a\nX`\xA0\x83\x01Qa\nmV[a\ne`\xC0\x83\x01Qa\nmV[a\n\xDFV[\x90V[`\0\x80Q` a)\x0B\x839\x81Q\x91R\x11\x15a\n\x84WV[`@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\x90\xFD[a\n\xD1a\x01\xE3V[\x90`\0\x82R`\0` \x83\x01RV[`\x07` \x82\x01Q\x03a\x0CwWa\n\xF6\x83\x83\x83a\rwV[\x92\x81Qa\x0B\x02\x90a\x12XV[\x90`\xA0\x85\x01\x93\x84Q\x90a\x0B\x15\x91\x84a\x16\x10V[\x92a\x0B\x1Ea\n\xC9V[Pa\x0B'a\n\xC9V[Pa\x01`\x82\x01\x90\x81Q\x92a\x01\x80\x81\x01\x95\x86Q\x94`\xE0\x8A\x01\x95\x86Qa\x0BJ\x91a\x16\xC3V[a\x0BS\x91a\x17\x10V[\x98a\x0B]\x93a\x17\x98V[\x90a\x0Bg\x90a\x1BlV[a\x0Bp\x91a\x17\x10V[\x90Q\x85Qa\x0B}\x91a\x16\xC3V[a\x0B\x86\x91a\x17\x10V[\x93Q\x91`\0\x80Q` a)\x0B\x839\x81Q\x91R\x92`@\x84\x92\x01Q` \x01Q\x90\t\x90Q\x90\t\x90Q\x90a\x0B\xB5\x91a\x16\xC3V[a\x0B\xBE\x91a\x17\x10V[a\x0B\xC6a\x02$V[\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\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1` \x82\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`@\x82\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4``\x82\x01R\x90a\x0Ce\x90a\x1BlV[a\x0Cma\x1B\xD4V[\x91a\nj\x93a\x1C\xDDV[`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x90\xFD[\x80Q` \x82\x01Q\x15\x90\x15\x16a\r$W` \x81Q\x91\x01Q\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x80\x80`\x03\x81\x80\x86\x80\t\x86\t\x08\x81\x85\x80\t\x14\x93\x10\x91\x10\x16\x16\x15a\x0C\xDFWV[`@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\x90\xFD[PV[`@Q\x90a\x01\0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@R\x81`\xE0`\0\x91\x82\x81R\x82` \x82\x01R\x82`@\x82\x01R\x82``\x82\x01R\x82`\x80\x82\x01R\x82`\xA0\x82\x01R\x82`\xC0\x82\x01R\x01RV[`\xA0\x90` a\x01\x80`\0\x80Q` a)\x0B\x839\x81Q\x91R\x94\x96\x95`\xC0a\r\x9Ba\r'V[\x98\x84\x82`@Q\x97`\x7F`\xE1\x1B\x83\x8A\x01R\x80Q\x82\x1B`$\x8A\x01R\x82\x81\x01Q\x82\x1B`,\x8A\x01Ra\x02\x80\x81\x01Q`@\x8A\x01Ra\x02\xA0\x81\x01Q``\x8A\x01R`\x01`\x80\x8A\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85`\x80\x82\x01R\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D`\xA0\x82\x01R\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD`\xC0\x82\x01Ra\x13ca\x02DV[\x90`\x10\x82R\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` \x83\x01R`@\x82\x01R\x90V[b\x10\0\0\x81\x14a\x14\xE4W` \x03a\x14\xD2Wa\x13\xAFa\x02dV[`\x01\x81R\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!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B`@\x82\x01R\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;``\x82\x01R\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80`\x80\x82\x01R\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE`\xA0\x82\x01R\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C`\xC0\x82\x01Ra\x14\x9Fa\x02DV[\x90`\x05\x82R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01` \x83\x01R`@\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x90\xFD[Pa\x14\xEDa\x02dV[`\x01\x81R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW` \x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD`@\x82\x01R\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B``\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`\x80\x82\x01R\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18`\xA0\x82\x01R\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\`\xC0\x82\x01Ra\x15\xDDa\x02DV[\x90`\x14\x82R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01` \x83\x01R`@\x82\x01R\x90V[\x91\x92\x90\x92a\x16\x1Ca\x02DV[\x92`\0\x84R` \x84\x01\x94`\0\x86R`@\x85\x01\x92`\0\x84R\x85\x83Q\x97\x83`\0\x14a\x16\x92W\x83\x98`\0\x90[\x80\x82\x10a\x16tWPPa\x16ga\x16p\x96\x97\x98\x99`\0\x19\x01[\x80\x84R\x85\x87a\x1DdV[\x90RQ\x92a\x1D\xDDV[\x90RV[\x90\x99`\0\x80Q` a)\x0B\x839\x81Q\x91R\x81`\x01\x92\t\x9A\x01\x90a\x16EV[a\x16p\x95\x96\x97\x98Pa\x16g\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a\x16]V[``\x90\x92\x91\x92`\x80a\x16\xD3a\x01\xE3V[\x91`\0\x83R`\0` \x84\x01R\x82\x95` a\x16\xEBa\x02DV[\x92\x866\x857\x80Q\x84R\x01Q` \x83\x01R`@\x82\x01R`\x07a\x07\xCF\x19Z\x01\xFA\x15a\x01\xA2WV[``\x90\x92\x91\x92`\xC0a\x17 a\x01\xE3V[\x91`\0\x83R`\0` \x84\x01R` \x83\x96\x81a\x179a\x02$V[\x93`\x806\x867\x80Q\x85R\x01Q\x82\x84\x01R\x80Q`@\x84\x01R\x01Q\x84\x82\x01R`\x06a\x07\xCF\x19Z\x01\xFA\x15a\x01\xA2WV[\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x82\x03\x91\x82\x11a\x17\x82WV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x90\x91a\x17\xA2a\n\xC9V[Pa\x17\xABa\n\xC9V[Pa\x17\xB8\x84\x82\x85\x85a\x1FKV[\x90a\x17\xC4\x90\x85\x85a'WV[a\x17\xCD\x90a\x17fV[`\xC0\x84\x01Q\x80\x80\x80\x80\x95\x81\x95a\x01\xA0\x8B\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x84\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x90\x82\x8BQ\x90a\x18\x10\x91a\x16\xC3V[a\x18\x19\x91a\x17\x10V[\x90a\x01\xC0\x8B\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x84\x80\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x83\x80\t` \x8C\x01Q\x90a\x18w\x91a\x16\xC3V[a\x18\x80\x91a\x17\x10V[\x90\x82`\0\x80Q` a)\x0B\x839\x81Q\x91R\x81\x80\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x01\xE0\x8C\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81`@\x8D\x01Q\x90a\x18\xE1\x91a\x16\xC3V[a\x18\xEA\x91a\x17\x10V[\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02\0\x8B\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81``\x8C\x01Q\x90a\x197\x91a\x16\xC3V[a\x19@\x91a\x17\x10V[\x93`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02 \x8A\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92\x81`\x80\x8B\x01Q\x90a\x19\x8D\x91a\x16\xC3V[a\x19\x96\x91a\x17\x10V[\x92a\x02@\x8A\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x84\x84\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x83\x83\t`@\x89\x01Q\x90a\x19\xF4\x91a\x16\xC3V[a\x19\xFD\x91a\x17\x10V[\x93`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02`\x88\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81``\x87\x01Q\x90a\x1A\\\x91a\x16\xC3V[a\x1Ae\x91a\x17\x10V[\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02\x80\x87\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81`\x80\x86\x01Q\x90a\x1A\xB2\x91a\x16\xC3V[a\x1A\xBB\x91a\x17\x10V[\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02\xA0\x86\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92`\xA0\x01Q\x90a\x1B\x06\x91a\x16\xC3V[a\x1B\x0F\x91a\x17\x10V[\x91`\xE0\x01Q\x90a\x02\xC0\x84\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92`\xA0\x01Q\x90a\x1BM\x91a\x16\xC3V[a\x1BV\x91a\x17\x10V[\x90a\x1B_a(\x15V[\x90a\x1Bi\x91a\x16\xC3V[\x91V[`\0` a\x1Bxa\x01\xE3V[\x82\x81R\x01R\x80Q` \x82\x01Q\x15\x90\x15\x16a\njW` \x81Q\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x82\x91\x01Q\x06\x81\x03\x90\x81\x11a\x17\x82Wa\x1B\xC9a\x01\xE3V[\x91\x82R` \x82\x01R\x90V[`\0``a\x1B\xE0a\x02$V[\x82\x81R\x82` \x82\x01R\x82`@\x82\x01R\x01Ra\x1B\xF9a\x02$V[\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2` \x82\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA`@\x82\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[``\x82\x01R\x90V[\x15a\x1C\x98WV[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x90\xFD[\x91`@a\x01\x80\x92\x94`\0\x94\x82Q\x93\x81Q\x85R\x83` \x98\x89\x80\x94\x01Q\x84\x88\x01R\x83\x81\x01Q\x82\x88\x01R\x80Q``\x88\x01R``\x81\x01Q`\x80\x88\x01R\x01Q`\xA0\x86\x01R\x80Q`\xC0\x86\x01R\x01Q`\xE0\x84\x01R\x85\x81\x01Qa\x01\0\x84\x01R\x80Qa\x01 \x84\x01R``\x81\x01Qa\x01@\x84\x01R\x01Qa\x01`\x82\x01R`\x08Z\xFAa\x1D_`\0Q\x91a\x1C\x91V[\x15\x15\x90V[`\x01\x82\x14a\x1D\xD5W\x82\x15a\x1D\xCDW` \x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x92\x83\x91\x90\t\x90\x80\x15a\x1D\xA3Wa\x1D\x9E\x90`\0\x19\x01a(\x8B\x88\x87\x8Ca\x10\xA3V[\x91P\x91Pa\x03O\x81a\x03(\x84a\x12\xE3V[\x92Pa\x03h\x83a\x03(\x8Ba\x01`\x01Q\x8A`\xA0\x01Qa\x0FXV[`\xA0\x88\x01Q`@\x88\x01Q` \x01Q\x91\x94P`\0\x80Q` a#v\x839\x81Q\x91R\x91\x82\x90\x82\t\x90P\x81`\xE0\x8A\x01Q\x82\t\x90Pa\x03\xAC\x85a\x03(\x8Da\x01\x80\x01Q\x84a\x0FXV[\x94P`\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\x04n\x87\x82a\x04a\x89a\x12\xE3V[a\x04ia\x13\x82V[a\x14SV[\x9E\x9DPPPPPPPPPPPPPPV[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x04\xBAWPPPV[\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\x05*W`@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\x02tV[PPPV[a\x05w`@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[`\0`\0\x80Q` a#v\x839\x81Q\x91R\x90P`@Q` \x81\x01`\0\x81R`\xFE`\xE0\x1B\x81R\x86Q`\xC0\x1B`\x04\x82\x01R` \x87\x01Q`\xC0\x1B`\x0C\x82\x01Ra\x02\x80\x87\x01Q` \x82\x01Ra\x02\xA0\x87\x01Q`@\x82\x01R`\x01``\x82\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81R` \x01\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\r{W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\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\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81R` \x01\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x0E\xDFW`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81R` \x01~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\x1C`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a\x0F&\x84\x84a\x157V[\x80\x82Ra\x0F6\x90\x85\x90\x85\x90a\x15\x8BV[` \x82\x01R\x80Qa\x0FL\x90\x85\x90\x84\x90\x86\x90a\x15\xFFV[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x0Fta\x1E\x19V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0F\xA6W`\0\x80\xFD[P\x80a\x0F\xF4W`@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\x02tV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x10\x18a\x1E7V[\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\x10UW`\0\x80\xFD[P\x80a\x0F\xF4W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02tV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0a\x10\xD9\x87\x87\x87\x87a\x17UV[\x90P`\0\x80Q` a#v\x839\x81Q\x91R`\0a\x10\xF7\x88\x87\x89a\x1C%V[\x90Pa\x11\x03\x81\x83a#\x1CV[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x110\x85a\x03(\x8A`\0\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11X\x86a\x03(\x8A` \x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x80\x86a\x03(\x8A`@\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xA8\x86a\x03(\x8A``\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xD0\x86a\x03(\x8A`\x80\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xF8\x86a\x03(\x8D`@\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x12 \x86a\x03(\x8D``\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x12H\x86a\x03(\x8D`\x80\x01Q\x84a\x0FXV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x12p\x86a\x03(\x8D`\xA0\x01Q\x84a\x0FXV[\x95P`\0\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x12\x9B\x87a\x03(\x8B`\xA0\x01Q\x84a\x0FXV[\x96Pa\x12\xD2a\x12\xCC`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x0FXV[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x13\x0BWP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x13P\x91\x90a#SV[a\x13z\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa#\x1CV[\x90R\x92\x91PPV[a\x13\xAD`@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\x80a\x15)W`@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\x02tV[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q`\0\x90`\0\x80Q` a#v\x839\x81Q\x91R\x90\x83\x80\x15a\x15{W\x84\x93P`\0[\x82\x81\x10\x15a\x15oW\x83\x85\x86\t\x94P`\x01\x01a\x15YV[P`\x01\x84\x03\x93Pa\x15\x82V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a\x15\x9DWP`\x01a\0\xD8V[\x81`\0\x03a\x15\xADWP`\0a\0\xD8V[` \x84\x01Q`\0\x80Q` a#v\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x15\xDDW`\x01\x87\x03\x92Pa\x15\xE4V[`\x01\x84\x03\x92P[Pa\x15\xEE\x82a\x1D\x15V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[`\0`\0\x80Q` a#v\x839\x81Q\x91R\x82\x82\x03a\x16|W`\x01`\0[`\x08\x81\x10\x15a\x16pW\x81\x86\x03a\x16MW\x86\x81`\x08\x81\x10a\x16>Wa\x16>a#\x06V[` \x02\x01Q\x93PPPPa\x15/V[\x82\x80a\x16[Wa\x16[a#=V[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x16\x1CV[P`\0\x92PPPa\x15/V[a\x16\x84a\x1EUV[`@\x87\x01Q`\x01`\xE0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x08\x81\x10\x15a\x16\xC5W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x16\x98V[PPPP`\0\x80`\0\x90P`\x01\x83\x89`@\x8C\x01Q`\0[`\x08\x81\x10\x15a\x17\x1CW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x16\xDCV[PPPP\x80\x92PP`\0a\x17/\x83a\x1D\x15V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0\x80`\0\x80`\0`\0\x80Q` a#v\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7XV[`\xE0\x82\x01Ra\0\xB56a\x03eV[a\x01\0\x82\x01Ra\0\xC46a\x03\x8CV[a\x01 \x82\x01Ra\0\xD36a\x03\xB3V[a\x01@\x82\x01Ra\0\xE26a\x03\xDAV[a\x01`\x82\x01Ra\0\xF16a\x04\x01V[a\x01\x80\x82\x01Ra\x01\x006a\x04(V[a\x01\xA0\x82\x01Ra\x01\x0F6a\x04OV[a\x01\xC0\x82\x01Ra\x01\x1E6a\x04vV[a\x01\xE0\x82\x01Ra\x01-6a\x04\x9DV[a\x02\0\x82\x01Ra\x01<6a\x04\xC4V[a\x02 \x82\x01Ra\x01K6a\x04\xEBV[a\x02@\x82\x01Ra\x01Z6a\x05\x12V[a\x02`\x82\x01Ra\x04\xC45a\x02\x80\x82\x01Ra\x04\xE45a\x02\xA0\x82\x01Ra\x01}6a\x074V[a\x01\x866a\x07tV[\x91a\x08\xD0V[`@Q\x90\x15\x15\x81R\x90\x81\x90` \x82\x01\x90V[\x03\x90\xF3[`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q\x90a\x02\xC0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[a\x01\xA7V[`@Q\x90`@\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90a\x02\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90`\x80\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90``\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90`\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@\x90`C\x19\x01\x12a\x01\xA2Wa\x02\x98a\x01\xE3V[\x90`D5\x82R`d5` \x83\x01RV[`@\x90`\x83\x19\x01\x12a\x01\xA2Wa\x02\xBCa\x01\xE3V[\x90`\x845\x82R`\xA45` \x83\x01RV[`@\x90`\xC3\x19\x01\x12a\x01\xA2Wa\x02\xE0a\x01\xE3V[\x90`\xC45\x82R`\xE45` \x83\x01RV[`@\x90a\x01\x03\x19\x01\x12a\x01\xA2Wa\x03\x05a\x01\xE3V[\x90a\x01\x045\x82Ra\x01$5` \x83\x01RV[`@\x90a\x01C\x19\x01\x12a\x01\xA2Wa\x03,a\x01\xE3V[\x90a\x01D5\x82Ra\x01d5` \x83\x01RV[`@\x90a\x01\x83\x19\x01\x12a\x01\xA2Wa\x03Sa\x01\xE3V[\x90a\x01\x845\x82Ra\x01\xA45` \x83\x01RV[`@\x90a\x01\xC3\x19\x01\x12a\x01\xA2Wa\x03za\x01\xE3V[\x90a\x01\xC45\x82Ra\x01\xE45` \x83\x01RV[`@\x90a\x02\x03\x19\x01\x12a\x01\xA2Wa\x03\xA1a\x01\xE3V[\x90a\x02\x045\x82Ra\x02$5` \x83\x01RV[`@\x90a\x02C\x19\x01\x12a\x01\xA2Wa\x03\xC8a\x01\xE3V[\x90a\x02D5\x82Ra\x02d5` \x83\x01RV[`@\x90a\x02\x83\x19\x01\x12a\x01\xA2Wa\x03\xEFa\x01\xE3V[\x90a\x02\x845\x82Ra\x02\xA45` \x83\x01RV[`@\x90a\x02\xC3\x19\x01\x12a\x01\xA2Wa\x04\x16a\x01\xE3V[\x90a\x02\xC45\x82Ra\x02\xE45` \x83\x01RV[`@\x90a\x03\x03\x19\x01\x12a\x01\xA2Wa\x04=a\x01\xE3V[\x90a\x03\x045\x82Ra\x03$5` \x83\x01RV[`@\x90a\x03C\x19\x01\x12a\x01\xA2Wa\x04da\x01\xE3V[\x90a\x03D5\x82Ra\x03d5` \x83\x01RV[`@\x90a\x03\x83\x19\x01\x12a\x01\xA2Wa\x04\x8Ba\x01\xE3V[\x90a\x03\x845\x82Ra\x03\xA45` \x83\x01RV[`@\x90a\x03\xC3\x19\x01\x12a\x01\xA2Wa\x04\xB2a\x01\xE3V[\x90a\x03\xC45\x82Ra\x03\xE45` \x83\x01RV[`@\x90a\x04\x03\x19\x01\x12a\x01\xA2Wa\x04\xD9a\x01\xE3V[\x90a\x04\x045\x82Ra\x04$5` \x83\x01RV[`@\x90a\x04C\x19\x01\x12a\x01\xA2Wa\x05\0a\x01\xE3V[\x90a\x04D5\x82Ra\x04d5` \x83\x01RV[`@\x90a\x04\x83\x19\x01\x12a\x01\xA2Wa\x05'a\x01\xE3V[\x90a\x04\x845\x82Ra\x04\xA45` \x83\x01RV[`@\x90a\x05\xE3\x19\x01\x12a\x01\xA2Wa\x05Na\x01\xE3V[\x90a\x05\xE45\x82Ra\x06\x045` \x83\x01RV[`@\x90a\x06#\x19\x01\x12a\x01\xA2Wa\x05ua\x01\xE3V[\x90a\x06$5\x82Ra\x06D5` \x83\x01RV[`@\x90a\x06c\x19\x01\x12a\x01\xA2Wa\x05\x9Ca\x01\xE3V[\x90a\x06d5\x82Ra\x06\x845` \x83\x01RV[`@\x90a\x06\xA3\x19\x01\x12a\x01\xA2Wa\x05\xC3a\x01\xE3V[\x90a\x06\xA45\x82Ra\x06\xC45` \x83\x01RV[`@\x90a\x06\xE3\x19\x01\x12a\x01\xA2Wa\x05\xEAa\x01\xE3V[\x90a\x06\xE45\x82Ra\x07\x045` \x83\x01RV[`@\x90a\x07#\x19\x01\x12a\x01\xA2Wa\x06\x11a\x01\xE3V[\x90a\x07$5\x82Ra\x07D5` \x83\x01RV[`@\x90a\x07c\x19\x01\x12a\x01\xA2Wa\x068a\x01\xE3V[\x90a\x07d5\x82Ra\x07\x845` \x83\x01RV[`@\x90a\x07\xA3\x19\x01\x12a\x01\xA2Wa\x06_a\x01\xE3V[\x90a\x07\xA45\x82Ra\x07\xC45` \x83\x01RV[`@\x90a\x07\xE3\x19\x01\x12a\x01\xA2Wa\x06\x86a\x01\xE3V[\x90a\x07\xE45\x82Ra\x08\x045` \x83\x01RV[`@\x90a\x08#\x19\x01\x12a\x01\xA2Wa\x06\xADa\x01\xE3V[\x90a\x08$5\x82Ra\x08D5` \x83\x01RV[`@\x90a\x08c\x19\x01\x12a\x01\xA2Wa\x06\xD4a\x01\xE3V[\x90a\x08d5\x82Ra\x08\x845` \x83\x01RV[`@\x90a\x08\xA3\x19\x01\x12a\x01\xA2Wa\x06\xFBa\x01\xE3V[\x90a\x08\xA45\x82Ra\x08\xC45` \x83\x01RV[`@\x90a\x08\xE3\x19\x01\x12a\x01\xA2Wa\x07\"a\x01\xE3V[\x90a\x08\xE45\x82Ra\t\x045` \x83\x01RV[\x80a\x05#\x12\x15a\x01\xA2Wa\x07Fa\x02dV[\x90\x81a\x05\xE4\x91\x82\x11a\x01\xA2Wa\x05\x04\x90[\x82\x82\x10a\x07dWPPP\x90V[\x815\x81R` \x91\x82\x01\x91\x01a\x07WV[\x90a\x04\x80a\x05\xE3\x19\x83\x01\x12a\x01\xA2Wa\x08=a\x07\x8Ea\x02\x03V[\x92a\x07\x98\x81a\x059V[\x84Ra\x07\xA3\x81a\x05`V[` \x85\x01Ra\x07\xB1\x81a\x05\x87V[`@\x85\x01Ra\x07\xBF\x81a\x05\xAEV[``\x85\x01Ra\x07\xCD\x81a\x05\xD5V[`\x80\x85\x01Ra\x07\xDB\x81a\x05\xFCV[`\xA0\x85\x01Ra\x07\xE9\x81a\x06#V[`\xC0\x85\x01Ra\x07\xF7\x81a\x06JV[`\xE0\x85\x01Ra\x08\x05\x81a\x06qV[a\x01\0\x85\x01Ra\x08\x14\x81a\x06\x98V[a\x01 \x85\x01Ra\x08#\x81a\x06\xBFV[a\x01@\x85\x01Ra\x082\x81a\x06\xE6V[a\x01`\x85\x01Ra\x07\rV[a\x01\x80\x83\x01Ra\t$5a\x01\xA0\x83\x01Ra\tD5a\x01\xC0\x83\x01Ra\td5a\x01\xE0\x83\x01Ra\t\x845a\x02\0\x83\x01Ra\t\xA45a\x02 \x83\x01Ra\t\xC45a\x02@\x83\x01Ra\t\xE45a\x02`\x83\x01Ra\n\x045a\x02\x80\x83\x01Ra\n$5a\x02\xA0\x83\x01Ra\nD5a\x02\xC0\x83\x01RV[\x90`\x07\x81\x10\x15a\x08\xBAW`\x05\x1B\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x90a\nj\x92\x91a\x08\xE0\x83Qa\x0C\x89V[a\x08\xED` \x84\x01Qa\x0C\x89V[a\x08\xFA`@\x84\x01Qa\x0C\x89V[a\t\x07``\x84\x01Qa\x0C\x89V[a\t\x14`\x80\x84\x01Qa\x0C\x89V[a\t!`\xA0\x84\x01Qa\x0C\x89V[a\t.`\xC0\x84\x01Qa\x0C\x89V[a\t;`\xE0\x84\x01Qa\x0C\x89V[a\tIa\x01\0\x84\x01Qa\x0C\x89V[a\tWa\x01 \x84\x01Qa\x0C\x89V[a\tea\x01@\x84\x01Qa\x0C\x89V[a\tsa\x01`\x84\x01Qa\x0C\x89V[a\t\x81a\x01\x80\x84\x01Qa\x0C\x89V[a\t\x8Fa\x01\xA0\x84\x01Qa\nmV[a\t\x9Da\x01\xC0\x84\x01Qa\nmV[a\t\xABa\x01\xE0\x84\x01Qa\nmV[a\t\xB9a\x02\0\x84\x01Qa\nmV[a\t\xC7a\x02 \x84\x01Qa\nmV[a\t\xD5a\x02@\x84\x01Qa\nmV[a\t\xE3a\x02`\x84\x01Qa\nmV[a\t\xF1a\x02\x80\x84\x01Qa\nmV[a\t\xFFa\x02\xA0\x84\x01Qa\nmV[a\n\ra\x02\xC0\x84\x01Qa\nmV[a\n\x17\x82Qa\nmV[a\n$` \x83\x01Qa\nmV[a\n1`@\x83\x01Qa\nmV[a\n>``\x83\x01Qa\nmV[a\nK`\x80\x83\x01Qa\nmV[a\nX`\xA0\x83\x01Qa\nmV[a\ne`\xC0\x83\x01Qa\nmV[a\n\xDFV[\x90V[`\0\x80Q` a)\x0B\x839\x81Q\x91R\x11\x15a\n\x84WV[`@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\x90\xFD[a\n\xD1a\x01\xE3V[\x90`\0\x82R`\0` \x83\x01RV[`\x07` \x82\x01Q\x03a\x0CwWa\n\xF6\x83\x83\x83a\rwV[\x92\x81Qa\x0B\x02\x90a\x12XV[\x90`\xA0\x85\x01\x93\x84Q\x90a\x0B\x15\x91\x84a\x16\x10V[\x92a\x0B\x1Ea\n\xC9V[Pa\x0B'a\n\xC9V[Pa\x01`\x82\x01\x90\x81Q\x92a\x01\x80\x81\x01\x95\x86Q\x94`\xE0\x8A\x01\x95\x86Qa\x0BJ\x91a\x16\xC3V[a\x0BS\x91a\x17\x10V[\x98a\x0B]\x93a\x17\x98V[\x90a\x0Bg\x90a\x1BlV[a\x0Bp\x91a\x17\x10V[\x90Q\x85Qa\x0B}\x91a\x16\xC3V[a\x0B\x86\x91a\x17\x10V[\x93Q\x91`\0\x80Q` a)\x0B\x839\x81Q\x91R\x92`@\x84\x92\x01Q` \x01Q\x90\t\x90Q\x90\t\x90Q\x90a\x0B\xB5\x91a\x16\xC3V[a\x0B\xBE\x91a\x17\x10V[a\x0B\xC6a\x02$V[\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\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1` \x82\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`@\x82\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4``\x82\x01R\x90a\x0Ce\x90a\x1BlV[a\x0Cma\x1B\xD4V[\x91a\nj\x93a\x1C\xDDV[`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x90\xFD[\x80Q` \x82\x01Q\x15\x90\x15\x16a\r$W` \x81Q\x91\x01Q\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x80\x80`\x03\x81\x80\x86\x80\t\x86\t\x08\x81\x85\x80\t\x14\x93\x10\x91\x10\x16\x16\x15a\x0C\xDFWV[`@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\x90\xFD[PV[`@Q\x90a\x01\0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@R\x81`\xE0`\0\x91\x82\x81R\x82` \x82\x01R\x82`@\x82\x01R\x82``\x82\x01R\x82`\x80\x82\x01R\x82`\xA0\x82\x01R\x82`\xC0\x82\x01R\x01RV[`\xA0\x90` a\x01\x80`\0\x80Q` a)\x0B\x839\x81Q\x91R\x94\x96\x95`\xC0a\r\x9Ba\r'V[\x98\x84\x82`@Q\x97`\x7F`\xE1\x1B\x83\x8A\x01R\x80Q\x82\x1B`$\x8A\x01R\x82\x81\x01Q\x82\x1B`,\x8A\x01Ra\x02\x80\x81\x01Q`@\x8A\x01Ra\x02\xA0\x81\x01Q``\x8A\x01R`\x01`\x80\x8A\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85`\x80\x82\x01R\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D`\xA0\x82\x01R\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD`\xC0\x82\x01Ra\x13ca\x02DV[\x90`\x10\x82R\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` \x83\x01R`@\x82\x01R\x90V[b\x10\0\0\x81\x14a\x14\xE4W` \x03a\x14\xD2Wa\x13\xAFa\x02dV[`\x01\x81R\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!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B`@\x82\x01R\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;``\x82\x01R\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80`\x80\x82\x01R\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE`\xA0\x82\x01R\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C`\xC0\x82\x01Ra\x14\x9Fa\x02DV[\x90`\x05\x82R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01` \x83\x01R`@\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x90\xFD[Pa\x14\xEDa\x02dV[`\x01\x81R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW` \x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD`@\x82\x01R\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B``\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`\x80\x82\x01R\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18`\xA0\x82\x01R\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\`\xC0\x82\x01Ra\x15\xDDa\x02DV[\x90`\x14\x82R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01` \x83\x01R`@\x82\x01R\x90V[\x91\x92\x90\x92a\x16\x1Ca\x02DV[\x92`\0\x84R` \x84\x01\x94`\0\x86R`@\x85\x01\x92`\0\x84R\x85\x83Q\x97\x83`\0\x14a\x16\x92W\x83\x98`\0\x90[\x80\x82\x10a\x16tWPPa\x16ga\x16p\x96\x97\x98\x99`\0\x19\x01[\x80\x84R\x85\x87a\x1DdV[\x90RQ\x92a\x1D\xDDV[\x90RV[\x90\x99`\0\x80Q` a)\x0B\x839\x81Q\x91R\x81`\x01\x92\t\x9A\x01\x90a\x16EV[a\x16p\x95\x96\x97\x98Pa\x16g\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a\x16]V[``\x90\x92\x91\x92`\x80a\x16\xD3a\x01\xE3V[\x91`\0\x83R`\0` \x84\x01R\x82\x95` a\x16\xEBa\x02DV[\x92\x866\x857\x80Q\x84R\x01Q` \x83\x01R`@\x82\x01R`\x07a\x07\xCF\x19Z\x01\xFA\x15a\x01\xA2WV[``\x90\x92\x91\x92`\xC0a\x17 a\x01\xE3V[\x91`\0\x83R`\0` \x84\x01R` \x83\x96\x81a\x179a\x02$V[\x93`\x806\x867\x80Q\x85R\x01Q\x82\x84\x01R\x80Q`@\x84\x01R\x01Q\x84\x82\x01R`\x06a\x07\xCF\x19Z\x01\xFA\x15a\x01\xA2WV[\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x82\x03\x91\x82\x11a\x17\x82WV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x90\x91a\x17\xA2a\n\xC9V[Pa\x17\xABa\n\xC9V[Pa\x17\xB8\x84\x82\x85\x85a\x1FKV[\x90a\x17\xC4\x90\x85\x85a'WV[a\x17\xCD\x90a\x17fV[`\xC0\x84\x01Q\x80\x80\x80\x80\x95\x81\x95a\x01\xA0\x8B\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x84\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x90\x82\x8BQ\x90a\x18\x10\x91a\x16\xC3V[a\x18\x19\x91a\x17\x10V[\x90a\x01\xC0\x8B\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x84\x80\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x83\x80\t` \x8C\x01Q\x90a\x18w\x91a\x16\xC3V[a\x18\x80\x91a\x17\x10V[\x90\x82`\0\x80Q` a)\x0B\x839\x81Q\x91R\x81\x80\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x01\xE0\x8C\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81`@\x8D\x01Q\x90a\x18\xE1\x91a\x16\xC3V[a\x18\xEA\x91a\x17\x10V[\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02\0\x8B\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81``\x8C\x01Q\x90a\x197\x91a\x16\xC3V[a\x19@\x91a\x17\x10V[\x93`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02 \x8A\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92\x81`\x80\x8B\x01Q\x90a\x19\x8D\x91a\x16\xC3V[a\x19\x96\x91a\x17\x10V[\x92a\x02@\x8A\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x84\x84\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x83\x83\t`@\x89\x01Q\x90a\x19\xF4\x91a\x16\xC3V[a\x19\xFD\x91a\x17\x10V[\x93`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02`\x88\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81``\x87\x01Q\x90a\x1A\\\x91a\x16\xC3V[a\x1Ae\x91a\x17\x10V[\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02\x80\x87\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81`\x80\x86\x01Q\x90a\x1A\xB2\x91a\x16\xC3V[a\x1A\xBB\x91a\x17\x10V[\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02\xA0\x86\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92`\xA0\x01Q\x90a\x1B\x06\x91a\x16\xC3V[a\x1B\x0F\x91a\x17\x10V[\x91`\xE0\x01Q\x90a\x02\xC0\x84\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92`\xA0\x01Q\x90a\x1BM\x91a\x16\xC3V[a\x1BV\x91a\x17\x10V[\x90a\x1B_a(\x15V[\x90a\x1Bi\x91a\x16\xC3V[\x91V[`\0` a\x1Bxa\x01\xE3V[\x82\x81R\x01R\x80Q` \x82\x01Q\x15\x90\x15\x16a\njW` \x81Q\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x82\x91\x01Q\x06\x81\x03\x90\x81\x11a\x17\x82Wa\x1B\xC9a\x01\xE3V[\x91\x82R` \x82\x01R\x90V[`\0``a\x1B\xE0a\x02$V[\x82\x81R\x82` \x82\x01R\x82`@\x82\x01R\x01Ra\x1B\xF9a\x02$V[\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2` \x82\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA`@\x82\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[``\x82\x01R\x90V[\x15a\x1C\x98WV[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x90\xFD[\x91`@a\x01\x80\x92\x94`\0\x94\x82Q\x93\x81Q\x85R\x83` \x98\x89\x80\x94\x01Q\x84\x88\x01R\x83\x81\x01Q\x82\x88\x01R\x80Q``\x88\x01R``\x81\x01Q`\x80\x88\x01R\x01Q`\xA0\x86\x01R\x80Q`\xC0\x86\x01R\x01Q`\xE0\x84\x01R\x85\x81\x01Qa\x01\0\x84\x01R\x80Qa\x01 \x84\x01R``\x81\x01Qa\x01@\x84\x01R\x01Qa\x01`\x82\x01R`\x08Z\xFAa\x1D_`\0Q\x91a\x1C\x91V[\x15\x15\x90V[`\x01\x82\x14a\x1D\xD5W\x82\x15a\x1D\xCDW` \x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x92\x83\x91\x90\t\x90\x80\x15a\x1D\xA3Wa\x1D\x9E\x90`\0\x19\x01a( ::ethers::contract::builders::ContractCall { self.0 - .method_hash([100, 228, 197, 158], (verifying_key, public_input, proof)) + .method_hash([119, 174, 63, 7], (verifying_key, public_input, proof)) .expect("method not found (this should never happen)") } } @@ -483,7 +483,7 @@ pub mod plonk_verifier { Self::WrongPlonkVK(value) } } - ///Container type for all input parameters for the `verify` function with signature `verify((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),bytes32,bytes32),uint256[8],((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 `0x64e4c59e` + ///Container type for all input parameters for the `verify` function with signature `verify((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),bytes32,bytes32),uint256[7],((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 `0x77ae3f07` #[derive( Clone, ::ethers::contract::EthCall, @@ -493,14 +493,14 @@ pub mod plonk_verifier { )] #[ethcall( name = "verify", - abi = "verify((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),bytes32,bytes32),uint256[8],((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))" + abi = "verify((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),bytes32,bytes32),uint256[7],((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 VerifyCall { pub verifying_key: VerifyingKey, - pub public_input: [::ethers::core::types::U256; 8], + pub public_input: [::ethers::core::types::U256; 7], pub proof: PlonkProof, } - ///Container type for all return fields from the `verify` function with signature `verify((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),bytes32,bytes32),uint256[8],((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 `0x64e4c59e` + ///Container type for all return fields from the `verify` function with signature `verify((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),bytes32,bytes32),uint256[7],((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 `0x77ae3f07` #[derive( Clone, ::ethers::contract::EthAbiType, diff --git a/contract-bindings/src/plonk_verifier_2.rs b/contract-bindings/src/plonk_verifier_2.rs index 06a5b1c7c..5f5422954 100644 --- a/contract-bindings/src/plonk_verifier_2.rs +++ b/contract-bindings/src/plonk_verifier_2.rs @@ -145,10 +145,10 @@ pub mod plonk_verifier_2 { ::std::boxed::Box::new( ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ), - 8usize, + 7usize, ), internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[8]"), + ::std::borrow::ToOwned::to_owned("uint256[7]"), ), }, ::ethers::core::abi::ethabi::Param { @@ -252,12 +252,12 @@ pub mod plonk_verifier_2 { pub static PLONKVERIFIER2_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"a'\\a\0:`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14a\0-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`\x046\x10a\0KW`\x005`\xE0\x1C\x80c\x1Dq.'\x14a\0PW\x80c\xA1\xF1\xA3N\x14a\0\x8AW\x80c\xDFnl\xB4\x14a\0\xADW[`\0\x80\xFD[a\0w\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x9Da\0\x986`\x04a%!V[a\0\xC2V[`@Q\x90\x15\x15\x81R` \x01a\0\x81V[a\0w`\0\x80Q` a'0\x839\x81Q\x91R\x81V[`\0a\0\xCD\x82a\x10\x88V[a\0\xDE\x83`\0[` \x02\x01Qa\x11\xC3V[a\0\xE9\x83`\x01a\0\xD4V[a\0\xF4\x83`\x02a\0\xD4V[a\0\xFF\x83`\x03a\0\xD4V[a\x01\n\x83`\x04a\0\xD4V[a\x01\x15\x83`\x05a\0\xD4V[a\x01 \x83`\x06a\0\xD4V[a\x01+\x83`\x07a\0\xD4V[`\0a\x018\x85\x85\x85a\x12&V[\x90P`\0a\x01I\x86`\0\x01Qa\x18AV[\x90P`\0a\x01\\\x82\x84`\xA0\x01Q\x88a\x1C\x93V[\x90P`\0a\x01k\x84\x87\x84a\x1C\xF3V[\x90Pa\x02LV[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x81\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x81\xFD[`@Q\x81Q\x81R` \x82\x01Q` \x82\x01R\x82`@\x82\x01R`@`\0``\x83`\x07Z\xFA\x90P\x80a\x02\x0CWa\x02\x0Ca\x01rV[PPPV[`@\x80Q\x82Q\x81R` \x80\x84\x01Q\x81\x83\x01R`\0Q\x82\x84\x01RQ``\x82\x01R\x90\x82`\x80\x83`\x06Z\xFA\x90P\x80a\x02HWa\x02Ha\x01rV[PPV[`@Q`\xC0\x81\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`@\x83\x01R\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``\x83\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4`\x80\x83\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`\xA0\x83\x01R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2a\x01\0\x83\x01R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xEDa\x01 \x83\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[a\x01@\x83\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAAa\x01`\x83\x01Ra\x01\x80\x82\x01`@R`\0\x80`\0\x80`\x80\x8A\x01Q`\0\x80Q` a'0\x839\x81Q\x91R` \x8A\x01Q` \x8D\x01Q\t\x93P\x8AQ`\0\x80Q` a'0\x839\x81Q\x91R`\xA0\x8D\x01Q``\x8E\x01Q\t\x93P`\0\x80Q` a'0\x839\x81Q\x91Ra\x01\xA0\x8F\x01Q\x85\x08\x92P`\0\x80Q` a'0\x839\x81Q\x91R\x82\x84\x08\x92P`\0\x80Q` a'0\x839\x81Q\x91R\x81\x84\t\x90P`\0\x80Q` a'0\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81R` \x01\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x1B\x16W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\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\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81R` \x01\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x1CzW`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81R` \x01~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1C\xB7`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a\x1C\xC1\x84\x84a\x1FdV[\x80\x82Ra\x1C\xD1\x90\x85\x90\x85\x90a\x1F\xB8V[` \x82\x01R\x80Qa\x1C\xE7\x90\x85\x90\x84\x90\x86\x90a .V[`@\x82\x01R\x93\x92PPPV[` \x81\x01Q`@\x82\x01Q``\x85\x01Q`\x80\x86\x01Qa\x01\xA0\x86\x01Qa\x02@\x87\x01Q`\0\x95\x94\x93`\x01\x93\x90\x92\x90\x91`\0\x80Q` a'0\x839\x81Q\x91R\x80\x80\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x88\x01Qa\x02`\x89\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80`\0\x80Q` a'0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x88\x01Qa\x02\x80\x89\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80`\0\x80Q` a'0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x88\x01Qa\x02\xA0\x89\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80`\0\x80Q` a'0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x88\x01Q\x91Pa\x02\xC0\x88\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80\x82`\0\x80Q` a'0\x839\x81Q\x91R\x85\x87\x08\t\x85\t\x93PPPP\x86Q` \x88\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80\x86\x83\t`\0\x80Q` a'0\x839\x81Q\x91R\x03\x85\x08\x95PP`\0\x80Q` a'0\x839\x81Q\x91R\x80\x83\x83\t`\0\x80Q` a'0\x839\x81Q\x91R\x03\x86\x08\x98\x97PPPPPPPPV[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x1E\xF4WPPPV[\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\x02\x0CW`@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\x12\x1DV[\x81Q`\0\x90`\0\x80Q` a'0\x839\x81Q\x91R\x90\x83\x80\x15a\x1F\xA8W\x84\x93P`\0[\x82\x81\x10\x15a\x1F\x9CW\x83\x85\x86\t\x94P`\x01\x01a\x1F\x86V[P`\x01\x84\x03\x93Pa\x1F\xAFV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a\x1F\xCAWP`\x01a 'V[\x81`\0\x03a\x1F\xDAWP`\0a 'V[` \x84\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a \nW`\x01\x87\x03\x92Pa \x11V[`\x01\x84\x03\x92P[Pa \x1B\x82a!\x86V[\x91P\x82\x82\x82\t\x93PPPP[\x93\x92PPPV[`\0`\0\x80Q` a'0\x839\x81Q\x91R\x82\x82\x03a \xABW`\x01`\0[`\x08\x81\x10\x15a \x9FW\x81\x86\x03a |W\x86\x81`\x08\x81\x10a mWa ma'\x03V[` \x02\x01Q\x93PPPPa!~V[\x82\x80a \x8AWa \x8Aa'\x19V[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a KV[P`\0\x92PPPa!~V[a \xB3a\"RV[`@\x87\x01Q`\x01`\xE0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x08\x81\x10\x15a \xF4W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a \xC7V[PPPP`\0\x80`\0\x90P`\x01\x83\x89`@\x8C\x01Q`\0[`\x08\x81\x10\x15a!KW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a!\x0BV[PPPP\x80\x92PP`\0a!^\x83a!\x86V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x95PPPPPP[\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` a'0\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\x81a\"%W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x12\x1DV[PP\x91\x90PV[`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01a\"Ma\"RV[\x90R\x90V[`@Q\x80a\x01\0\x01`@R\x80`\x08\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x02\xE0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\"\xABWa\"\xABa\"qV[`@R\x90V[`@Qa\x02\xC0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\"\xABWa\"\xABa\"qV[`\0`@\x82\x84\x03\x12\x15a\"\xE7W`\0\x80\xFD[`@Q`@\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a#\nWa#\na\"qV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a#5W`\0\x80\xFD[`@Qa\x01\0\x80\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a#ZWa#Za\"qV[`@R\x83\x01\x81\x85\x82\x11\x15a#mW`\0\x80\xFD[\x84[\x82\x81\x10\x15a#\x87W\x805\x82R` \x91\x82\x01\x91\x01a#oV[P\x91\x95\x94PPPPPV[`\0a\x04\x80\x82\x84\x03\x12\x15a#\xA5W`\0\x80\xFD[a#\xADa\"\x87V[\x90Pa#\xB9\x83\x83a\"\xD5V[\x81Ra#\xC8\x83`@\x84\x01a\"\xD5V[` \x82\x01Ra#\xDA\x83`\x80\x84\x01a\"\xD5V[`@\x82\x01Ra#\xEC\x83`\xC0\x84\x01a\"\xD5V[``\x82\x01Ra\x01\0a$\0\x84\x82\x85\x01a\"\xD5V[`\x80\x83\x01Ra\x01@a$\x14\x85\x82\x86\x01a\"\xD5V[`\xA0\x84\x01Ra\x01\x80a$(\x86\x82\x87\x01a\"\xD5V[`\xC0\x85\x01Ra\x01\xC0a$<\x87\x82\x88\x01a\"\xD5V[`\xE0\x86\x01Ra\x02\0a$P\x88\x82\x89\x01a\"\xD5V[\x85\x87\x01Ra\x02@\x94Pa$e\x88\x86\x89\x01a\"\xD5V[a\x01 \x87\x01Ra\x02\x80a$z\x89\x82\x8A\x01a\"\xD5V[\x85\x88\x01Ra\x02\xC0\x94Pa$\x8F\x89\x86\x8A\x01a\"\xD5V[a\x01`\x88\x01Ra$\xA3\x89a\x03\0\x8A\x01a\"\xD5V[\x84\x88\x01Ra\x03@\x88\x015a\x01\xA0\x88\x01Ra\x03`\x88\x015\x83\x88\x01Ra\x03\x80\x88\x015a\x01\xE0\x88\x01Ra\x03\xA0\x88\x015\x82\x88\x01Ra\x03\xC0\x88\x015a\x02 \x88\x01Ra\x03\xE0\x88\x015\x86\x88\x01Ra\x04\0\x88\x015a\x02`\x88\x01Ra\x04 \x88\x015\x81\x88\x01RPPPPa\x04@\x84\x015a\x02\xA0\x84\x01Ra\x04`\x84\x015\x81\x84\x01RPP\x92\x91PPV[`\0\x80`\0\x83\x85\x03a\n\x80\x81\x12\x15a%8W`\0\x80\xFD[a\x05\0\x80\x82\x12\x15a%HW`\0\x80\xFD[a%Pa\"\xB1V[\x91P\x855\x82R` \x86\x015` \x83\x01Ra%m\x87`@\x88\x01a\"\xD5V[`@\x83\x01Ra%\x7F\x87`\x80\x88\x01a\"\xD5V[``\x83\x01Ra%\x91\x87`\xC0\x88\x01a\"\xD5V[`\x80\x83\x01Ra\x01\0a%\xA5\x88\x82\x89\x01a\"\xD5V[`\xA0\x84\x01Ra\x01@a%\xB9\x89\x82\x8A\x01a\"\xD5V[`\xC0\x85\x01Ra\x01\x80a%\xCD\x8A\x82\x8B\x01a\"\xD5V[`\xE0\x86\x01Ra\x01\xC0a%\xE1\x8B\x82\x8C\x01a\"\xD5V[\x84\x87\x01Ra\x02\0\x93Pa%\xF6\x8B\x85\x8C\x01a\"\xD5V[a\x01 \x87\x01Ra\x02@a&\x0B\x8C\x82\x8D\x01a\"\xD5V[\x84\x88\x01Ra\x02\x80\x93Pa& \x8C\x85\x8D\x01a\"\xD5V[a\x01`\x88\x01Ra&4\x8Ca\x02\xC0\x8D\x01a\"\xD5V[\x83\x88\x01Ra&F\x8Ca\x03\0\x8D\x01a\"\xD5V[a\x01\xA0\x88\x01Ra&Z\x8Ca\x03@\x8D\x01a\"\xD5V[\x82\x88\x01Ra&l\x8Ca\x03\x80\x8D\x01a\"\xD5V[a\x01\xE0\x88\x01Ra&\x80\x8Ca\x03\xC0\x8D\x01a\"\xD5V[\x85\x88\x01Ra&\x92\x8Ca\x04\0\x8D\x01a\"\xD5V[a\x02 \x88\x01Ra&\xA6\x8Ca\x04@\x8D\x01a\"\xD5V[\x81\x88\x01RPPPa&\xBB\x89a\x04\x80\x8A\x01a\"\xD5V[a\x02`\x85\x01Ra\x04\xC0\x88\x015\x81\x85\x01RPPa\x04\xE0\x86\x015a\x02\xA0\x83\x01R\x81\x94Pa&\xE8\x87\x82\x88\x01a#$V[\x93PPPa&\xFA\x85a\x06\0\x86\x01a#\x92V[\x90P\x92P\x92P\x92V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n"; + const __BYTECODE: &[u8] = b"`\x80\x80`@R4a\0\x1AWa(~\x90\x81a\0 \x8290\x81PP\xF3[`\0\x80\xFD\xFE`\x80`@R`\x046\x10\x15a\0\x12W`\0\x80\xFD[`\0\x805`\xE0\x1C\x90\x81c\x1Dq.'\x14a\x01\xC7W\x81c\xCESzw\x14a\0EWPc\xDFnl\xB4\x14a\0@W`\0\x80\xFD[a\x08\xE3V[6`\x03\x19\x01a\n`\x81\x12a\x01\xC3Wa\x05\0\x13a\x01\xC0Wa\x01\xBCa\x01\xAAa\0ia\x02\x12V[`\x045\x81R`$5` \x82\x01Ra\0\x7F6a\x02\xB9V[`@\x82\x01Ra\0\x8D6a\x02\xE2V[``\x82\x01Ra\0\x9B6a\x03\x06V[`\x80\x82\x01Ra\0\xA96a\x03*V[`\xA0\x82\x01Ra\0\xB76a\x03QV[`\xC0\x82\x01Ra\0\xC56a\x03xV[`\xE0\x82\x01Ra\0\xD36a\x03\x9FV[a\x01\0\x82\x01Ra\0\xE26a\x03\xC6V[a\x01 \x82\x01Ra\0\xF16a\x03\xEDV[a\x01@\x82\x01Ra\x01\x006a\x04\x14V[a\x01`\x82\x01Ra\x01\x0F6a\x04;V[a\x01\x80\x82\x01Ra\x01\x1E6a\x04bV[a\x01\xA0\x82\x01Ra\x01-6a\x04\x89V[a\x01\xC0\x82\x01Ra\x01<6a\x04\xB0V[a\x01\xE0\x82\x01Ra\x01K6a\x04\xD7V[a\x02\0\x82\x01Ra\x01Z6a\x04\xFEV[a\x02 \x82\x01Ra\x01i6a\x05%V[a\x02@\x82\x01Ra\x01x6a\x05LV[a\x02`\x82\x01Ra\x04\xC45a\x02\x80\x82\x01Ra\x04\xE45a\x02\xA0\x82\x01Ra\x01\x9B6a\x07nV[a\x01\xA46a\x07\xAEV[\x91a\n\x1AV[`@Q\x90\x15\x15\x81R\x90\x81\x90` \x82\x01\x90V[\x03\x90\xF3[\x80\xFD[P\x80\xFD[\x80`\x03\x196\x01\x12a\x01\xC0W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG`\x80R` `\x80\xF3[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q\x90a\x02\xC0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[a\x01\xFCV[`@Q\x90`@\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@Q\x90a\x02\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@Q\x90``\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@Q\x90`\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@\x90`C\x19\x01\x12a\x02\xDDWa\x02\xCDa\x028V[\x90`D5\x82R`d5` \x83\x01RV[`\0\x80\xFD[`@\x90`\x83\x19\x01\x12a\x02\xDDWa\x02\xF6a\x028V[\x90`\x845\x82R`\xA45` \x83\x01RV[`@\x90`\xC3\x19\x01\x12a\x02\xDDWa\x03\x1Aa\x028V[\x90`\xC45\x82R`\xE45` \x83\x01RV[`@\x90a\x01\x03\x19\x01\x12a\x02\xDDWa\x03?a\x028V[\x90a\x01\x045\x82Ra\x01$5` \x83\x01RV[`@\x90a\x01C\x19\x01\x12a\x02\xDDWa\x03fa\x028V[\x90a\x01D5\x82Ra\x01d5` \x83\x01RV[`@\x90a\x01\x83\x19\x01\x12a\x02\xDDWa\x03\x8Da\x028V[\x90a\x01\x845\x82Ra\x01\xA45` \x83\x01RV[`@\x90a\x01\xC3\x19\x01\x12a\x02\xDDWa\x03\xB4a\x028V[\x90a\x01\xC45\x82Ra\x01\xE45` \x83\x01RV[`@\x90a\x02\x03\x19\x01\x12a\x02\xDDWa\x03\xDBa\x028V[\x90a\x02\x045\x82Ra\x02$5` \x83\x01RV[`@\x90a\x02C\x19\x01\x12a\x02\xDDWa\x04\x02a\x028V[\x90a\x02D5\x82Ra\x02d5` \x83\x01RV[`@\x90a\x02\x83\x19\x01\x12a\x02\xDDWa\x04)a\x028V[\x90a\x02\x845\x82Ra\x02\xA45` \x83\x01RV[`@\x90a\x02\xC3\x19\x01\x12a\x02\xDDWa\x04Pa\x028V[\x90a\x02\xC45\x82Ra\x02\xE45` \x83\x01RV[`@\x90a\x03\x03\x19\x01\x12a\x02\xDDWa\x04wa\x028V[\x90a\x03\x045\x82Ra\x03$5` \x83\x01RV[`@\x90a\x03C\x19\x01\x12a\x02\xDDWa\x04\x9Ea\x028V[\x90a\x03D5\x82Ra\x03d5` \x83\x01RV[`@\x90a\x03\x83\x19\x01\x12a\x02\xDDWa\x04\xC5a\x028V[\x90a\x03\x845\x82Ra\x03\xA45` \x83\x01RV[`@\x90a\x03\xC3\x19\x01\x12a\x02\xDDWa\x04\xECa\x028V[\x90a\x03\xC45\x82Ra\x03\xE45` \x83\x01RV[`@\x90a\x04\x03\x19\x01\x12a\x02\xDDWa\x05\x13a\x028V[\x90a\x04\x045\x82Ra\x04$5` \x83\x01RV[`@\x90a\x04C\x19\x01\x12a\x02\xDDWa\x05:a\x028V[\x90a\x04D5\x82Ra\x04d5` \x83\x01RV[`@\x90a\x04\x83\x19\x01\x12a\x02\xDDWa\x05aa\x028V[\x90a\x04\x845\x82Ra\x04\xA45` \x83\x01RV[`@\x90a\x05\xE3\x19\x01\x12a\x02\xDDWa\x05\x88a\x028V[\x90a\x05\xE45\x82Ra\x06\x045` \x83\x01RV[`@\x90a\x06#\x19\x01\x12a\x02\xDDWa\x05\xAFa\x028V[\x90a\x06$5\x82Ra\x06D5` \x83\x01RV[`@\x90a\x06c\x19\x01\x12a\x02\xDDWa\x05\xD6a\x028V[\x90a\x06d5\x82Ra\x06\x845` \x83\x01RV[`@\x90a\x06\xA3\x19\x01\x12a\x02\xDDWa\x05\xFDa\x028V[\x90a\x06\xA45\x82Ra\x06\xC45` \x83\x01RV[`@\x90a\x06\xE3\x19\x01\x12a\x02\xDDWa\x06$a\x028V[\x90a\x06\xE45\x82Ra\x07\x045` \x83\x01RV[`@\x90a\x07#\x19\x01\x12a\x02\xDDWa\x06Ka\x028V[\x90a\x07$5\x82Ra\x07D5` \x83\x01RV[`@\x90a\x07c\x19\x01\x12a\x02\xDDWa\x06ra\x028V[\x90a\x07d5\x82Ra\x07\x845` \x83\x01RV[`@\x90a\x07\xA3\x19\x01\x12a\x02\xDDWa\x06\x99a\x028V[\x90a\x07\xA45\x82Ra\x07\xC45` \x83\x01RV[`@\x90a\x07\xE3\x19\x01\x12a\x02\xDDWa\x06\xC0a\x028V[\x90a\x07\xE45\x82Ra\x08\x045` \x83\x01RV[`@\x90a\x08#\x19\x01\x12a\x02\xDDWa\x06\xE7a\x028V[\x90a\x08$5\x82Ra\x08D5` \x83\x01RV[`@\x90a\x08c\x19\x01\x12a\x02\xDDWa\x07\x0Ea\x028V[\x90a\x08d5\x82Ra\x08\x845` \x83\x01RV[`@\x90a\x08\xA3\x19\x01\x12a\x02\xDDWa\x075a\x028V[\x90a\x08\xA45\x82Ra\x08\xC45` \x83\x01RV[`@\x90a\x08\xE3\x19\x01\x12a\x02\xDDWa\x07\\a\x028V[\x90a\x08\xE45\x82Ra\t\x045` \x83\x01RV[\x80a\x05#\x12\x15a\x02\xDDWa\x07\x80a\x02\x99V[\x90\x81a\x05\xE4\x91\x82\x11a\x02\xDDWa\x05\x04\x90[\x82\x82\x10a\x07\x9EWPPP\x90V[\x815\x81R` \x91\x82\x01\x91\x01a\x07\x91V[\x90a\x04\x80a\x05\xE3\x19\x83\x01\x12a\x02\xDDWa\x08wa\x07\xC8a\x02XV[\x92a\x07\xD2\x81a\x05sV[\x84Ra\x07\xDD\x81a\x05\x9AV[` \x85\x01Ra\x07\xEB\x81a\x05\xC1V[`@\x85\x01Ra\x07\xF9\x81a\x05\xE8V[``\x85\x01Ra\x08\x07\x81a\x06\x0FV[`\x80\x85\x01Ra\x08\x15\x81a\x066V[`\xA0\x85\x01Ra\x08#\x81a\x06]V[`\xC0\x85\x01Ra\x081\x81a\x06\x84V[`\xE0\x85\x01Ra\x08?\x81a\x06\xABV[a\x01\0\x85\x01Ra\x08N\x81a\x06\xD2V[a\x01 \x85\x01Ra\x08]\x81a\x06\xF9V[a\x01@\x85\x01Ra\x08l\x81a\x07 V[a\x01`\x85\x01Ra\x07GV[a\x01\x80\x83\x01Ra\t$5a\x01\xA0\x83\x01Ra\tD5a\x01\xC0\x83\x01Ra\td5a\x01\xE0\x83\x01Ra\t\x845a\x02\0\x83\x01Ra\t\xA45a\x02 \x83\x01Ra\t\xC45a\x02@\x83\x01Ra\t\xE45a\x02`\x83\x01Ra\n\x045a\x02\x80\x83\x01Ra\n$5a\x02\xA0\x83\x01Ra\nD5a\x02\xC0\x83\x01RV[`\x006`\x03\x19\x01\x12a\x02\xDDW` `@Q`\0\x80Q` a(R\x839\x81Q\x91R\x81R\xF3[\x90`\x07\x81\x10\x15a\t\x18W`\x05\x1B\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x90\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x90\xFD[`\0```@\x92` \x84Q\x91\x80Q\x83R\x01Q` \x82\x01R`\x01\x84\x82\x01R`\x07Z\xFA\x15a\t\xBFWV[a\t.V[```\0\x91`@\x93` \x85Q\x92\x80Q\x84R\x01Q` \x83\x01R\x84\x82\x01R`\x07Z\xFA\x15a\t\xBFWV[`@\x90`\x80\x82Q\x82Q\x81R` \x83\x01Q` \x82\x01R`\0Q\x84\x82\x01R` Q``\x82\x01R`\x06Z\xFA\x15a\t\xBFWV[\x91\x90a\n%\x82a\x18\xD7V[\x80Qa\n0\x90a\x1A\x10V[` \x81\x01Qa\n>\x90a\x1A\x10V[`@\x81\x01Qa\nL\x90a\x1A\x10V[``\x81\x01Qa\nZ\x90a\x1A\x10V[`\x80\x81\x01Qa\nh\x90a\x1A\x10V[`\xA0\x81\x01Qa\nv\x90a\x1A\x10V[`\xC0\x81\x01Qa\n\x84\x90a\x1A\x10V[a\n\x8F\x82\x82\x85a\x1A\xBCV[\x90\x82\x84Qa\n\x9C\x90a\x1F\xF8V[\x91`\xA0\x84\x01Q\x90a\n\xAD\x91\x84a#\xB0V[\x94a\n\xB9\x86\x83\x86a$cV[`@Q\x96`@\x88\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\x90R``\x88\x01\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\x90R`\x80\x88\x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x90R`\xA0\x88\x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x90Ra\x01\0\x88\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\x90Ra\x01 \x88\x01\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x90Ra\x01@\x88\x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x90Ra\x01`\x88\x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x90Ra\x01\x80\x88\x01`@R`\x80\x86\x01Q` \x82\x01Q` \x88\x01Q\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\t\x87Q\x82`\xA0\x8A\x01Q``\x8B\x01Q\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\t\x91\x81a\x01\xA0\x8A\x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x90\x85\x08\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\t\x81a\x01\xC0\x8A\x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85`\x80\x82\x01R\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D`\xA0\x82\x01R\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD`\xC0\x82\x01Ra!\x03a\x02yV[\x90`\x10\x82R\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` \x83\x01R`@\x82\x01R\x90V[b\x10\0\0\x81\x14a\"\x84W` \x03a\"rWa!Oa\x02\x99V[`\x01\x81R\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!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B`@\x82\x01R\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;``\x82\x01R\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80`\x80\x82\x01R\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE`\xA0\x82\x01R\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C`\xC0\x82\x01Ra\"?a\x02yV[\x90`\x05\x82R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01` \x83\x01R`@\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x90\xFD[Pa\"\x8Da\x02\x99V[`\x01\x81R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW` \x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD`@\x82\x01R\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B``\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`\x80\x82\x01R\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18`\xA0\x82\x01R\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\`\xC0\x82\x01Ra#}a\x02yV[\x90`\x14\x82R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01` \x83\x01R`@\x82\x01R\x90V[\x91\x92\x90\x92a#\xBCa\x02yV[\x92`\0\x84R` \x84\x01\x94`\0\x86R`@\x85\x01\x92`\0\x84R\x85\x83Q\x97\x83`\0\x14a$2W\x83\x98`\0\x90[\x80\x82\x10a$\x14WPPa$\x07a$\x10\x96\x97\x98\x99`\0\x19\x01[\x80\x84R\x85\x87a%\xBAV[\x90RQ\x92a&3V[\x90RV[\x90\x99`\0\x80Q` a(R\x839\x81Q\x91R\x81`\x01\x92\t\x9A\x01\x90a#\xE5V[a$\x10\x95\x96\x97\x98Pa$\x07\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a#\xFDV[\x90`@` \x84\x01Q\x93\x01Q\x92``\x83\x01Q`\x80\x84\x01Q\x94a\x01\xA0\x84\x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x87\x81\x87\x81\x80\x80\x9C\x98\x81\x80\x80\x80\x9E\x81\x80\x9E\x9C\x81\x80\x9E\x81a\x02@\x81\x96\x01Q\x8A\t\x92\x08\x08`\x01\t\x81a\x01\xC0\x89\x01Q\x81\x8C\x81a\x02`\x8D\x01Q\x8A\t\x92\x08\x08\x90\t\x81a\x01\xE0\x88\x01Q\x81\x8B\x81a\x02\x80\x8C\x01Q\x89\t\x92\x08\x08\x90\t\x91\x81\x88\x81a\x02\0\x89\x01Q\x93a\x02\xA0\x8A\x01Q\x90\t\x92\x08\x08\x90\t\x93a\x02\xC0a\x02 \x84\x01Q\x93\x01Q\x92\x08\t\x90\t\x93` \x87Q\x97\x01Q\t\x82\x03\x90\x08\x92\t\x82\x03\x90\x08\x90V[` \x81Q\x91\x01Q\x90\x81\x15\x81\x15\x16a%\xB6W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x80\x80`\x03\x81\x80\x86\x80\t\x86\t\x08\x81\x85\x80\t\x14\x93\x10\x91\x10\x16\x16\x15a%qWV[`@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\x90\xFD[PPV[`\x01\x82\x14a&+W\x82\x15a&#W` \x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x92\x83\x91\x90\t\x90\x80\x15a%\xF9Wa%\xF4\x90`\0\x19\x01a'\xA1V[\x90\t\x90V[Pa%\xF4\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a'\xA1V[PPP`\0\x90V[PPP`\x01\x90V[\x93\x92\x91\x90\x91\x80\x15a'=Wa&I\x92\x91\x92a\x1F\xC0V[\x91`\xC0\x83\x01\x93`@\x87\x01\x94`\xC0\x86Q\x01\x90`\x01\x90`\x01\x81R`\x01\x90[`\x07\x82\x10a'\x03WPPPP`\0\x94`\x01\x94\x92\x90Q\x90`\0\x90[`\x07\x82\x10a&\xB8WPPPPP\x93a&\xAE\x91` \x94\x95`\0\x80Q` a(R\x839\x81Q\x91R\x95\x86\x94\x85\x93a'\xA1V[\x93\x01Q\x90\t\t\t\x90V[\x90\x91\x92\x93\x95\x96`\x01\x90\x84Q\x98\x89\x87\x8A`\0\x80Q` a(R\x839\x81Q\x91R\x94\x85\x80\x94\x81\x80\x94\x81\x8CQ\x91Q\x8A\t\t\t\x90\x08\x9B\x82\x03\x08\x90\t\x96` \x80\x80\x92\x01\x93\x01\x94\x01\x92\x01\x90\x93\x92a&\x7FV[`\x01\x90`\x1F\x99\x95\x96\x99\x19\x80\x91\x01\x93`\0\x80Q` a(R\x839\x81Q\x91R\x90\x81\x89\x88Q\x82\x03\x08\x90\t\x94\x85\x85R\x01\x91\x01\x90\x92\x91\x97\x94\x93\x97a&eV[P\x91\x92`\x01\x92\x91`\0\x91\x90\x84[`\x07\x84\x10a']WPPPPPP`\0\x90V[\x80\x85\x14a'\x8EW`\0\x80Q` a(R\x839\x81Q\x91R\x86\x91a'\x83`@\x86\x01Q` \x01\x90V[Q\x90\t\x93\x01\x92a'JV[P\x91\x92PPa'\x9D\x92Pa\t\x07V[Q\x90V[\x90`@Q\x91`\0`\xC0` \x94\x85\x93\x84\x82R\x84\x80\x83\x01R\x84`@\x83\x01R``\x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xEF\xFF\xFF\xFF`\x80\x82\x01R`\0\x80Q` a(R\x839\x81Q\x91R`\xA0\x82\x01R`\x05Z\xFA\x91`\0Q\x92\x15a(\rWPV[`d\x90`@Q\x90bF\x1B\xCD`\xE5\x1B\x82R`\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R\xFD\xFE0dNr\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 PLONKVERIFIER2_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`\x046\x10a\0KW`\x005`\xE0\x1C\x80c\x1Dq.'\x14a\0PW\x80c\xA1\xF1\xA3N\x14a\0\x8AW\x80c\xDFnl\xB4\x14a\0\xADW[`\0\x80\xFD[a\0w\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x9Da\0\x986`\x04a%!V[a\0\xC2V[`@Q\x90\x15\x15\x81R` \x01a\0\x81V[a\0w`\0\x80Q` a'0\x839\x81Q\x91R\x81V[`\0a\0\xCD\x82a\x10\x88V[a\0\xDE\x83`\0[` \x02\x01Qa\x11\xC3V[a\0\xE9\x83`\x01a\0\xD4V[a\0\xF4\x83`\x02a\0\xD4V[a\0\xFF\x83`\x03a\0\xD4V[a\x01\n\x83`\x04a\0\xD4V[a\x01\x15\x83`\x05a\0\xD4V[a\x01 \x83`\x06a\0\xD4V[a\x01+\x83`\x07a\0\xD4V[`\0a\x018\x85\x85\x85a\x12&V[\x90P`\0a\x01I\x86`\0\x01Qa\x18AV[\x90P`\0a\x01\\\x82\x84`\xA0\x01Q\x88a\x1C\x93V[\x90P`\0a\x01k\x84\x87\x84a\x1C\xF3V[\x90Pa\x02LV[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x81\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x81\xFD[`@Q\x81Q\x81R` \x82\x01Q` \x82\x01R\x82`@\x82\x01R`@`\0``\x83`\x07Z\xFA\x90P\x80a\x02\x0CWa\x02\x0Ca\x01rV[PPPV[`@\x80Q\x82Q\x81R` \x80\x84\x01Q\x81\x83\x01R`\0Q\x82\x84\x01RQ``\x82\x01R\x90\x82`\x80\x83`\x06Z\xFA\x90P\x80a\x02HWa\x02Ha\x01rV[PPV[`@Q`\xC0\x81\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`@\x83\x01R\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``\x83\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4`\x80\x83\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`\xA0\x83\x01R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2a\x01\0\x83\x01R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xEDa\x01 \x83\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[a\x01@\x83\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAAa\x01`\x83\x01Ra\x01\x80\x82\x01`@R`\0\x80`\0\x80`\x80\x8A\x01Q`\0\x80Q` a'0\x839\x81Q\x91R` \x8A\x01Q` \x8D\x01Q\t\x93P\x8AQ`\0\x80Q` a'0\x839\x81Q\x91R`\xA0\x8D\x01Q``\x8E\x01Q\t\x93P`\0\x80Q` a'0\x839\x81Q\x91Ra\x01\xA0\x8F\x01Q\x85\x08\x92P`\0\x80Q` a'0\x839\x81Q\x91R\x82\x84\x08\x92P`\0\x80Q` a'0\x839\x81Q\x91R\x81\x84\t\x90P`\0\x80Q` a'0\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81R` \x01\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x1B\x16W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\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\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81R` \x01\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x1CzW`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80a\x01\0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81R` \x01~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1C\xB7`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a\x1C\xC1\x84\x84a\x1FdV[\x80\x82Ra\x1C\xD1\x90\x85\x90\x85\x90a\x1F\xB8V[` \x82\x01R\x80Qa\x1C\xE7\x90\x85\x90\x84\x90\x86\x90a .V[`@\x82\x01R\x93\x92PPPV[` \x81\x01Q`@\x82\x01Q``\x85\x01Q`\x80\x86\x01Qa\x01\xA0\x86\x01Qa\x02@\x87\x01Q`\0\x95\x94\x93`\x01\x93\x90\x92\x90\x91`\0\x80Q` a'0\x839\x81Q\x91R\x80\x80\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x88\x01Qa\x02`\x89\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80`\0\x80Q` a'0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x88\x01Qa\x02\x80\x89\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80`\0\x80Q` a'0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x88\x01Qa\x02\xA0\x89\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80`\0\x80Q` a'0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a'0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x88\x01Q\x91Pa\x02\xC0\x88\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80\x82`\0\x80Q` a'0\x839\x81Q\x91R\x85\x87\x08\t\x85\t\x93PPPP\x86Q` \x88\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x80\x86\x83\t`\0\x80Q` a'0\x839\x81Q\x91R\x03\x85\x08\x95PP`\0\x80Q` a'0\x839\x81Q\x91R\x80\x83\x83\t`\0\x80Q` a'0\x839\x81Q\x91R\x03\x86\x08\x98\x97PPPPPPPPV[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x1E\xF4WPPPV[\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\x02\x0CW`@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\x12\x1DV[\x81Q`\0\x90`\0\x80Q` a'0\x839\x81Q\x91R\x90\x83\x80\x15a\x1F\xA8W\x84\x93P`\0[\x82\x81\x10\x15a\x1F\x9CW\x83\x85\x86\t\x94P`\x01\x01a\x1F\x86V[P`\x01\x84\x03\x93Pa\x1F\xAFV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a\x1F\xCAWP`\x01a 'V[\x81`\0\x03a\x1F\xDAWP`\0a 'V[` \x84\x01Q`\0\x80Q` a'0\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a \nW`\x01\x87\x03\x92Pa \x11V[`\x01\x84\x03\x92P[Pa \x1B\x82a!\x86V[\x91P\x82\x82\x82\t\x93PPPP[\x93\x92PPPV[`\0`\0\x80Q` a'0\x839\x81Q\x91R\x82\x82\x03a \xABW`\x01`\0[`\x08\x81\x10\x15a \x9FW\x81\x86\x03a |W\x86\x81`\x08\x81\x10a mWa ma'\x03V[` \x02\x01Q\x93PPPPa!~V[\x82\x80a \x8AWa \x8Aa'\x19V[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a KV[P`\0\x92PPPa!~V[a \xB3a\"RV[`@\x87\x01Q`\x01`\xE0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x08\x81\x10\x15a \xF4W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a \xC7V[PPPP`\0\x80`\0\x90P`\x01\x83\x89`@\x8C\x01Q`\0[`\x08\x81\x10\x15a!KW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a!\x0BV[PPPP\x80\x92PP`\0a!^\x83a!\x86V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x95PPPPPP[\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` a'0\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\x81a\"%W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x12\x1DV[PP\x91\x90PV[`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01a\"Ma\"RV[\x90R\x90V[`@Q\x80a\x01\0\x01`@R\x80`\x08\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x02\xE0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\"\xABWa\"\xABa\"qV[`@R\x90V[`@Qa\x02\xC0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\"\xABWa\"\xABa\"qV[`\0`@\x82\x84\x03\x12\x15a\"\xE7W`\0\x80\xFD[`@Q`@\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a#\nWa#\na\"qV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a#5W`\0\x80\xFD[`@Qa\x01\0\x80\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a#ZWa#Za\"qV[`@R\x83\x01\x81\x85\x82\x11\x15a#mW`\0\x80\xFD[\x84[\x82\x81\x10\x15a#\x87W\x805\x82R` \x91\x82\x01\x91\x01a#oV[P\x91\x95\x94PPPPPV[`\0a\x04\x80\x82\x84\x03\x12\x15a#\xA5W`\0\x80\xFD[a#\xADa\"\x87V[\x90Pa#\xB9\x83\x83a\"\xD5V[\x81Ra#\xC8\x83`@\x84\x01a\"\xD5V[` \x82\x01Ra#\xDA\x83`\x80\x84\x01a\"\xD5V[`@\x82\x01Ra#\xEC\x83`\xC0\x84\x01a\"\xD5V[``\x82\x01Ra\x01\0a$\0\x84\x82\x85\x01a\"\xD5V[`\x80\x83\x01Ra\x01@a$\x14\x85\x82\x86\x01a\"\xD5V[`\xA0\x84\x01Ra\x01\x80a$(\x86\x82\x87\x01a\"\xD5V[`\xC0\x85\x01Ra\x01\xC0a$<\x87\x82\x88\x01a\"\xD5V[`\xE0\x86\x01Ra\x02\0a$P\x88\x82\x89\x01a\"\xD5V[\x85\x87\x01Ra\x02@\x94Pa$e\x88\x86\x89\x01a\"\xD5V[a\x01 \x87\x01Ra\x02\x80a$z\x89\x82\x8A\x01a\"\xD5V[\x85\x88\x01Ra\x02\xC0\x94Pa$\x8F\x89\x86\x8A\x01a\"\xD5V[a\x01`\x88\x01Ra$\xA3\x89a\x03\0\x8A\x01a\"\xD5V[\x84\x88\x01Ra\x03@\x88\x015a\x01\xA0\x88\x01Ra\x03`\x88\x015\x83\x88\x01Ra\x03\x80\x88\x015a\x01\xE0\x88\x01Ra\x03\xA0\x88\x015\x82\x88\x01Ra\x03\xC0\x88\x015a\x02 \x88\x01Ra\x03\xE0\x88\x015\x86\x88\x01Ra\x04\0\x88\x015a\x02`\x88\x01Ra\x04 \x88\x015\x81\x88\x01RPPPPa\x04@\x84\x015a\x02\xA0\x84\x01Ra\x04`\x84\x015\x81\x84\x01RPP\x92\x91PPV[`\0\x80`\0\x83\x85\x03a\n\x80\x81\x12\x15a%8W`\0\x80\xFD[a\x05\0\x80\x82\x12\x15a%HW`\0\x80\xFD[a%Pa\"\xB1V[\x91P\x855\x82R` \x86\x015` \x83\x01Ra%m\x87`@\x88\x01a\"\xD5V[`@\x83\x01Ra%\x7F\x87`\x80\x88\x01a\"\xD5V[``\x83\x01Ra%\x91\x87`\xC0\x88\x01a\"\xD5V[`\x80\x83\x01Ra\x01\0a%\xA5\x88\x82\x89\x01a\"\xD5V[`\xA0\x84\x01Ra\x01@a%\xB9\x89\x82\x8A\x01a\"\xD5V[`\xC0\x85\x01Ra\x01\x80a%\xCD\x8A\x82\x8B\x01a\"\xD5V[`\xE0\x86\x01Ra\x01\xC0a%\xE1\x8B\x82\x8C\x01a\"\xD5V[\x84\x87\x01Ra\x02\0\x93Pa%\xF6\x8B\x85\x8C\x01a\"\xD5V[a\x01 \x87\x01Ra\x02@a&\x0B\x8C\x82\x8D\x01a\"\xD5V[\x84\x88\x01Ra\x02\x80\x93Pa& \x8C\x85\x8D\x01a\"\xD5V[a\x01`\x88\x01Ra&4\x8Ca\x02\xC0\x8D\x01a\"\xD5V[\x83\x88\x01Ra&F\x8Ca\x03\0\x8D\x01a\"\xD5V[a\x01\xA0\x88\x01Ra&Z\x8Ca\x03@\x8D\x01a\"\xD5V[\x82\x88\x01Ra&l\x8Ca\x03\x80\x8D\x01a\"\xD5V[a\x01\xE0\x88\x01Ra&\x80\x8Ca\x03\xC0\x8D\x01a\"\xD5V[\x85\x88\x01Ra&\x92\x8Ca\x04\0\x8D\x01a\"\xD5V[a\x02 \x88\x01Ra&\xA6\x8Ca\x04@\x8D\x01a\"\xD5V[\x81\x88\x01RPPPa&\xBB\x89a\x04\x80\x8A\x01a\"\xD5V[a\x02`\x85\x01Ra\x04\xC0\x88\x015\x81\x85\x01RPPa\x04\xE0\x86\x015a\x02\xA0\x83\x01R\x81\x94Pa&\xE8\x87\x82\x88\x01a#$V[\x93PPPa&\xFA\x85a\x06\0\x86\x01a#\x92V[\x90P\x92P\x92P\x92V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n"; + const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10\x15a\0\x12W`\0\x80\xFD[`\0\x805`\xE0\x1C\x90\x81c\x1Dq.'\x14a\x01\xC7W\x81c\xCESzw\x14a\0EWPc\xDFnl\xB4\x14a\0@W`\0\x80\xFD[a\x08\xE3V[6`\x03\x19\x01a\n`\x81\x12a\x01\xC3Wa\x05\0\x13a\x01\xC0Wa\x01\xBCa\x01\xAAa\0ia\x02\x12V[`\x045\x81R`$5` \x82\x01Ra\0\x7F6a\x02\xB9V[`@\x82\x01Ra\0\x8D6a\x02\xE2V[``\x82\x01Ra\0\x9B6a\x03\x06V[`\x80\x82\x01Ra\0\xA96a\x03*V[`\xA0\x82\x01Ra\0\xB76a\x03QV[`\xC0\x82\x01Ra\0\xC56a\x03xV[`\xE0\x82\x01Ra\0\xD36a\x03\x9FV[a\x01\0\x82\x01Ra\0\xE26a\x03\xC6V[a\x01 \x82\x01Ra\0\xF16a\x03\xEDV[a\x01@\x82\x01Ra\x01\x006a\x04\x14V[a\x01`\x82\x01Ra\x01\x0F6a\x04;V[a\x01\x80\x82\x01Ra\x01\x1E6a\x04bV[a\x01\xA0\x82\x01Ra\x01-6a\x04\x89V[a\x01\xC0\x82\x01Ra\x01<6a\x04\xB0V[a\x01\xE0\x82\x01Ra\x01K6a\x04\xD7V[a\x02\0\x82\x01Ra\x01Z6a\x04\xFEV[a\x02 \x82\x01Ra\x01i6a\x05%V[a\x02@\x82\x01Ra\x01x6a\x05LV[a\x02`\x82\x01Ra\x04\xC45a\x02\x80\x82\x01Ra\x04\xE45a\x02\xA0\x82\x01Ra\x01\x9B6a\x07nV[a\x01\xA46a\x07\xAEV[\x91a\n\x1AV[`@Q\x90\x15\x15\x81R\x90\x81\x90` \x82\x01\x90V[\x03\x90\xF3[\x80\xFD[P\x80\xFD[\x80`\x03\x196\x01\x12a\x01\xC0W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG`\x80R` `\x80\xF3[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q\x90a\x02\xC0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[a\x01\xFCV[`@Q\x90`@\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@Q\x90a\x02\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@Q\x90``\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@Q\x90`\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@\x90`C\x19\x01\x12a\x02\xDDWa\x02\xCDa\x028V[\x90`D5\x82R`d5` \x83\x01RV[`\0\x80\xFD[`@\x90`\x83\x19\x01\x12a\x02\xDDWa\x02\xF6a\x028V[\x90`\x845\x82R`\xA45` \x83\x01RV[`@\x90`\xC3\x19\x01\x12a\x02\xDDWa\x03\x1Aa\x028V[\x90`\xC45\x82R`\xE45` \x83\x01RV[`@\x90a\x01\x03\x19\x01\x12a\x02\xDDWa\x03?a\x028V[\x90a\x01\x045\x82Ra\x01$5` \x83\x01RV[`@\x90a\x01C\x19\x01\x12a\x02\xDDWa\x03fa\x028V[\x90a\x01D5\x82Ra\x01d5` \x83\x01RV[`@\x90a\x01\x83\x19\x01\x12a\x02\xDDWa\x03\x8Da\x028V[\x90a\x01\x845\x82Ra\x01\xA45` \x83\x01RV[`@\x90a\x01\xC3\x19\x01\x12a\x02\xDDWa\x03\xB4a\x028V[\x90a\x01\xC45\x82Ra\x01\xE45` \x83\x01RV[`@\x90a\x02\x03\x19\x01\x12a\x02\xDDWa\x03\xDBa\x028V[\x90a\x02\x045\x82Ra\x02$5` \x83\x01RV[`@\x90a\x02C\x19\x01\x12a\x02\xDDWa\x04\x02a\x028V[\x90a\x02D5\x82Ra\x02d5` \x83\x01RV[`@\x90a\x02\x83\x19\x01\x12a\x02\xDDWa\x04)a\x028V[\x90a\x02\x845\x82Ra\x02\xA45` \x83\x01RV[`@\x90a\x02\xC3\x19\x01\x12a\x02\xDDWa\x04Pa\x028V[\x90a\x02\xC45\x82Ra\x02\xE45` \x83\x01RV[`@\x90a\x03\x03\x19\x01\x12a\x02\xDDWa\x04wa\x028V[\x90a\x03\x045\x82Ra\x03$5` \x83\x01RV[`@\x90a\x03C\x19\x01\x12a\x02\xDDWa\x04\x9Ea\x028V[\x90a\x03D5\x82Ra\x03d5` \x83\x01RV[`@\x90a\x03\x83\x19\x01\x12a\x02\xDDWa\x04\xC5a\x028V[\x90a\x03\x845\x82Ra\x03\xA45` \x83\x01RV[`@\x90a\x03\xC3\x19\x01\x12a\x02\xDDWa\x04\xECa\x028V[\x90a\x03\xC45\x82Ra\x03\xE45` \x83\x01RV[`@\x90a\x04\x03\x19\x01\x12a\x02\xDDWa\x05\x13a\x028V[\x90a\x04\x045\x82Ra\x04$5` \x83\x01RV[`@\x90a\x04C\x19\x01\x12a\x02\xDDWa\x05:a\x028V[\x90a\x04D5\x82Ra\x04d5` \x83\x01RV[`@\x90a\x04\x83\x19\x01\x12a\x02\xDDWa\x05aa\x028V[\x90a\x04\x845\x82Ra\x04\xA45` \x83\x01RV[`@\x90a\x05\xE3\x19\x01\x12a\x02\xDDWa\x05\x88a\x028V[\x90a\x05\xE45\x82Ra\x06\x045` \x83\x01RV[`@\x90a\x06#\x19\x01\x12a\x02\xDDWa\x05\xAFa\x028V[\x90a\x06$5\x82Ra\x06D5` \x83\x01RV[`@\x90a\x06c\x19\x01\x12a\x02\xDDWa\x05\xD6a\x028V[\x90a\x06d5\x82Ra\x06\x845` \x83\x01RV[`@\x90a\x06\xA3\x19\x01\x12a\x02\xDDWa\x05\xFDa\x028V[\x90a\x06\xA45\x82Ra\x06\xC45` \x83\x01RV[`@\x90a\x06\xE3\x19\x01\x12a\x02\xDDWa\x06$a\x028V[\x90a\x06\xE45\x82Ra\x07\x045` \x83\x01RV[`@\x90a\x07#\x19\x01\x12a\x02\xDDWa\x06Ka\x028V[\x90a\x07$5\x82Ra\x07D5` \x83\x01RV[`@\x90a\x07c\x19\x01\x12a\x02\xDDWa\x06ra\x028V[\x90a\x07d5\x82Ra\x07\x845` \x83\x01RV[`@\x90a\x07\xA3\x19\x01\x12a\x02\xDDWa\x06\x99a\x028V[\x90a\x07\xA45\x82Ra\x07\xC45` \x83\x01RV[`@\x90a\x07\xE3\x19\x01\x12a\x02\xDDWa\x06\xC0a\x028V[\x90a\x07\xE45\x82Ra\x08\x045` \x83\x01RV[`@\x90a\x08#\x19\x01\x12a\x02\xDDWa\x06\xE7a\x028V[\x90a\x08$5\x82Ra\x08D5` \x83\x01RV[`@\x90a\x08c\x19\x01\x12a\x02\xDDWa\x07\x0Ea\x028V[\x90a\x08d5\x82Ra\x08\x845` \x83\x01RV[`@\x90a\x08\xA3\x19\x01\x12a\x02\xDDWa\x075a\x028V[\x90a\x08\xA45\x82Ra\x08\xC45` \x83\x01RV[`@\x90a\x08\xE3\x19\x01\x12a\x02\xDDWa\x07\\a\x028V[\x90a\x08\xE45\x82Ra\t\x045` \x83\x01RV[\x80a\x05#\x12\x15a\x02\xDDWa\x07\x80a\x02\x99V[\x90\x81a\x05\xE4\x91\x82\x11a\x02\xDDWa\x05\x04\x90[\x82\x82\x10a\x07\x9EWPPP\x90V[\x815\x81R` \x91\x82\x01\x91\x01a\x07\x91V[\x90a\x04\x80a\x05\xE3\x19\x83\x01\x12a\x02\xDDWa\x08wa\x07\xC8a\x02XV[\x92a\x07\xD2\x81a\x05sV[\x84Ra\x07\xDD\x81a\x05\x9AV[` \x85\x01Ra\x07\xEB\x81a\x05\xC1V[`@\x85\x01Ra\x07\xF9\x81a\x05\xE8V[``\x85\x01Ra\x08\x07\x81a\x06\x0FV[`\x80\x85\x01Ra\x08\x15\x81a\x066V[`\xA0\x85\x01Ra\x08#\x81a\x06]V[`\xC0\x85\x01Ra\x081\x81a\x06\x84V[`\xE0\x85\x01Ra\x08?\x81a\x06\xABV[a\x01\0\x85\x01Ra\x08N\x81a\x06\xD2V[a\x01 \x85\x01Ra\x08]\x81a\x06\xF9V[a\x01@\x85\x01Ra\x08l\x81a\x07 V[a\x01`\x85\x01Ra\x07GV[a\x01\x80\x83\x01Ra\t$5a\x01\xA0\x83\x01Ra\tD5a\x01\xC0\x83\x01Ra\td5a\x01\xE0\x83\x01Ra\t\x845a\x02\0\x83\x01Ra\t\xA45a\x02 \x83\x01Ra\t\xC45a\x02@\x83\x01Ra\t\xE45a\x02`\x83\x01Ra\n\x045a\x02\x80\x83\x01Ra\n$5a\x02\xA0\x83\x01Ra\nD5a\x02\xC0\x83\x01RV[`\x006`\x03\x19\x01\x12a\x02\xDDW` `@Q`\0\x80Q` a(R\x839\x81Q\x91R\x81R\xF3[\x90`\x07\x81\x10\x15a\t\x18W`\x05\x1B\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x90\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x90\xFD[`\0```@\x92` \x84Q\x91\x80Q\x83R\x01Q` \x82\x01R`\x01\x84\x82\x01R`\x07Z\xFA\x15a\t\xBFWV[a\t.V[```\0\x91`@\x93` \x85Q\x92\x80Q\x84R\x01Q` \x83\x01R\x84\x82\x01R`\x07Z\xFA\x15a\t\xBFWV[`@\x90`\x80\x82Q\x82Q\x81R` \x83\x01Q` \x82\x01R`\0Q\x84\x82\x01R` Q``\x82\x01R`\x06Z\xFA\x15a\t\xBFWV[\x91\x90a\n%\x82a\x18\xD7V[\x80Qa\n0\x90a\x1A\x10V[` \x81\x01Qa\n>\x90a\x1A\x10V[`@\x81\x01Qa\nL\x90a\x1A\x10V[``\x81\x01Qa\nZ\x90a\x1A\x10V[`\x80\x81\x01Qa\nh\x90a\x1A\x10V[`\xA0\x81\x01Qa\nv\x90a\x1A\x10V[`\xC0\x81\x01Qa\n\x84\x90a\x1A\x10V[a\n\x8F\x82\x82\x85a\x1A\xBCV[\x90\x82\x84Qa\n\x9C\x90a\x1F\xF8V[\x91`\xA0\x84\x01Q\x90a\n\xAD\x91\x84a#\xB0V[\x94a\n\xB9\x86\x83\x86a$cV[`@Q\x96`@\x88\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\x90R``\x88\x01\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\x90R`\x80\x88\x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x90R`\xA0\x88\x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x90Ra\x01\0\x88\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\x90Ra\x01 \x88\x01\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x90Ra\x01@\x88\x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x90Ra\x01`\x88\x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x90Ra\x01\x80\x88\x01`@R`\x80\x86\x01Q` \x82\x01Q` \x88\x01Q\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\t\x87Q\x82`\xA0\x8A\x01Q``\x8B\x01Q\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\t\x91\x81a\x01\xA0\x8A\x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x90\x85\x08\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\t\x81a\x01\xC0\x8A\x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85`\x80\x82\x01R\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D`\xA0\x82\x01R\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD`\xC0\x82\x01Ra!\x03a\x02yV[\x90`\x10\x82R\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` \x83\x01R`@\x82\x01R\x90V[b\x10\0\0\x81\x14a\"\x84W` \x03a\"rWa!Oa\x02\x99V[`\x01\x81R\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!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B`@\x82\x01R\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;``\x82\x01R\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80`\x80\x82\x01R\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE`\xA0\x82\x01R\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C`\xC0\x82\x01Ra\"?a\x02yV[\x90`\x05\x82R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01` \x83\x01R`@\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x90\xFD[Pa\"\x8Da\x02\x99V[`\x01\x81R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW` \x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD`@\x82\x01R\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B``\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`\x80\x82\x01R\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18`\xA0\x82\x01R\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\`\xC0\x82\x01Ra#}a\x02yV[\x90`\x14\x82R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01` \x83\x01R`@\x82\x01R\x90V[\x91\x92\x90\x92a#\xBCa\x02yV[\x92`\0\x84R` \x84\x01\x94`\0\x86R`@\x85\x01\x92`\0\x84R\x85\x83Q\x97\x83`\0\x14a$2W\x83\x98`\0\x90[\x80\x82\x10a$\x14WPPa$\x07a$\x10\x96\x97\x98\x99`\0\x19\x01[\x80\x84R\x85\x87a%\xBAV[\x90RQ\x92a&3V[\x90RV[\x90\x99`\0\x80Q` a(R\x839\x81Q\x91R\x81`\x01\x92\t\x9A\x01\x90a#\xE5V[a$\x10\x95\x96\x97\x98Pa$\x07\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a#\xFDV[\x90`@` \x84\x01Q\x93\x01Q\x92``\x83\x01Q`\x80\x84\x01Q\x94a\x01\xA0\x84\x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x87\x81\x87\x81\x80\x80\x9C\x98\x81\x80\x80\x80\x9E\x81\x80\x9E\x9C\x81\x80\x9E\x81a\x02@\x81\x96\x01Q\x8A\t\x92\x08\x08`\x01\t\x81a\x01\xC0\x89\x01Q\x81\x8C\x81a\x02`\x8D\x01Q\x8A\t\x92\x08\x08\x90\t\x81a\x01\xE0\x88\x01Q\x81\x8B\x81a\x02\x80\x8C\x01Q\x89\t\x92\x08\x08\x90\t\x91\x81\x88\x81a\x02\0\x89\x01Q\x93a\x02\xA0\x8A\x01Q\x90\t\x92\x08\x08\x90\t\x93a\x02\xC0a\x02 \x84\x01Q\x93\x01Q\x92\x08\t\x90\t\x93` \x87Q\x97\x01Q\t\x82\x03\x90\x08\x92\t\x82\x03\x90\x08\x90V[` \x81Q\x91\x01Q\x90\x81\x15\x81\x15\x16a%\xB6W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x80\x80`\x03\x81\x80\x86\x80\t\x86\t\x08\x81\x85\x80\t\x14\x93\x10\x91\x10\x16\x16\x15a%qWV[`@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\x90\xFD[PPV[`\x01\x82\x14a&+W\x82\x15a&#W` \x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x92\x83\x91\x90\t\x90\x80\x15a%\xF9Wa%\xF4\x90`\0\x19\x01a'\xA1V[\x90\t\x90V[Pa%\xF4\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a'\xA1V[PPP`\0\x90V[PPP`\x01\x90V[\x93\x92\x91\x90\x91\x80\x15a'=Wa&I\x92\x91\x92a\x1F\xC0V[\x91`\xC0\x83\x01\x93`@\x87\x01\x94`\xC0\x86Q\x01\x90`\x01\x90`\x01\x81R`\x01\x90[`\x07\x82\x10a'\x03WPPPP`\0\x94`\x01\x94\x92\x90Q\x90`\0\x90[`\x07\x82\x10a&\xB8WPPPPP\x93a&\xAE\x91` \x94\x95`\0\x80Q` a(R\x839\x81Q\x91R\x95\x86\x94\x85\x93a'\xA1V[\x93\x01Q\x90\t\t\t\x90V[\x90\x91\x92\x93\x95\x96`\x01\x90\x84Q\x98\x89\x87\x8A`\0\x80Q` a(R\x839\x81Q\x91R\x94\x85\x80\x94\x81\x80\x94\x81\x8CQ\x91Q\x8A\t\t\t\x90\x08\x9B\x82\x03\x08\x90\t\x96` \x80\x80\x92\x01\x93\x01\x94\x01\x92\x01\x90\x93\x92a&\x7FV[`\x01\x90`\x1F\x99\x95\x96\x99\x19\x80\x91\x01\x93`\0\x80Q` a(R\x839\x81Q\x91R\x90\x81\x89\x88Q\x82\x03\x08\x90\t\x94\x85\x85R\x01\x91\x01\x90\x92\x91\x97\x94\x93\x97a&eV[P\x91\x92`\x01\x92\x91`\0\x91\x90\x84[`\x07\x84\x10a']WPPPPPP`\0\x90V[\x80\x85\x14a'\x8EW`\0\x80Q` a(R\x839\x81Q\x91R\x86\x91a'\x83`@\x86\x01Q` \x01\x90V[Q\x90\t\x93\x01\x92a'JV[P\x91\x92PPa'\x9D\x92Pa\t\x07V[Q\x90V[\x90`@Q\x91`\0`\xC0` \x94\x85\x93\x84\x82R\x84\x80\x83\x01R\x84`@\x83\x01R``\x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xEF\xFF\xFF\xFF`\x80\x82\x01R`\0\x80Q` a(R\x839\x81Q\x91R`\xA0\x82\x01R`\x05Z\xFA\x91`\0Q\x92\x15a(\rWPV[`d\x90`@Q\x90bF\x1B\xCD`\xE5\x1B\x82R`\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R\xFD\xFE0dNr\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 PLONKVERIFIER2_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); @@ -353,15 +353,15 @@ pub mod plonk_verifier_2 { .method_hash([223, 110, 108, 180], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `verify` (0x64e4c59e) function + ///Calls the contract's `verify` (0x77ae3f07) function pub fn verify( &self, vk: VerifyingKey, - public_input: [::ethers::core::types::U256; 8], + public_input: [::ethers::core::types::U256; 7], proof: PlonkProof, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([100, 228, 197, 158], (vk, public_input, proof)) + .method_hash([119, 174, 63, 7], (vk, public_input, proof)) .expect("method not found (this should never happen)") } } @@ -417,7 +417,7 @@ pub mod plonk_verifier_2 { )] #[ethcall(name = "R_MOD", abi = "R_MOD()")] pub struct RModCall; - ///Container type for all input parameters for the `verify` function with signature `verify((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),bytes32,bytes32),uint256[8],((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 `0x64e4c59e` + ///Container type for all input parameters for the `verify` function with signature `verify((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),bytes32,bytes32),uint256[7],((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 `0x77ae3f07` #[derive( Clone, ::ethers::contract::EthCall, @@ -427,11 +427,11 @@ pub mod plonk_verifier_2 { )] #[ethcall( name = "verify", - abi = "verify((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),bytes32,bytes32),uint256[8],((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))" + abi = "verify((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),bytes32,bytes32),uint256[7],((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 VerifyCall { pub vk: VerifyingKey, - pub public_input: [::ethers::core::types::U256; 8], + pub public_input: [::ethers::core::types::U256; 7], pub proof: PlonkProof, } ///Container type for all of the contract's call @@ -519,7 +519,7 @@ pub mod plonk_verifier_2 { Hash, )] pub struct RModReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `verify` function with signature `verify((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),bytes32,bytes32),uint256[8],((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 `0x64e4c59e` + ///Container type for all return fields from the `verify` function with signature `verify((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),bytes32,bytes32),uint256[7],((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 `0x77ae3f07` #[derive( Clone, ::ethers::contract::EthAbiType, diff --git a/contracts/rust/diff-test/src/main.rs b/contracts/rust/diff-test/src/main.rs index f554da6b0..789814b2b 100644 --- a/contracts/rust/diff-test/src/main.rs +++ b/contracts/rust/diff-test/src/main.rs @@ -129,7 +129,7 @@ fn main() { let log_size = cli.args[0].parse::().unwrap(); let zeta = u256_to_field::(cli.args[1].parse::().unwrap()); - let pi_u256: [U256; 8] = AbiDecode::decode_hex(&cli.args[2]).unwrap(); + let pi_u256: [U256; 7] = AbiDecode::decode_hex(&cli.args[2]).unwrap(); let pi: Vec = pi_u256.into_iter().map(u256_to_field).collect(); let verifier = Verifier::::new(2u32.pow(log_size) as usize).unwrap(); @@ -261,7 +261,7 @@ fn main() { } let vk = cli.args[0].parse::().unwrap().into(); - let pi_u256: [U256; 8] = AbiDecode::decode_hex(&cli.args[1]).unwrap(); + let pi_u256: [U256; 7] = AbiDecode::decode_hex(&cli.args[1]).unwrap(); let pi: Vec = pi_u256.into_iter().map(u256_to_field).collect(); let proof: Proof = cli.args[2].parse::().unwrap().into(); let msg = { @@ -299,8 +299,8 @@ fn main() { .is_ok()); let vk_parsed: ParsedVerifyingKey = vk.into(); - let mut pi_parsed = [U256::default(); 8]; - assert_eq!(public_input.len(), 8); + let mut pi_parsed = [U256::default(); 7]; + assert_eq!(public_input.len(), 7); for (i, pi) in public_input.into_iter().enumerate() { pi_parsed[i] = field_to_u256(pi); } diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol index 34ee63a8d..2feaee5bb 100644 --- a/contracts/src/LightClient.sol +++ b/contracts/src/LightClient.sol @@ -273,12 +273,8 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { IPlonkVerifier.VerifyingKey memory vk = VkLib.getVk(); // Prepare the public input - /** - * TODO - * change the array length once we confirm the items in publicInput - */ - uint256[8] memory publicInput; - publicInput[0] = genesisStakeTableState.threshold; + uint256[7] memory publicInput; + publicInput[0] = votingThreshold; publicInput[1] = uint256(state.viewNum); publicInput[2] = uint256(state.blockHeight); publicInput[3] = BN254.ScalarField.unwrap(state.blockCommRoot); diff --git a/contracts/src/libraries/PlonkVerifier.sol b/contracts/src/libraries/PlonkVerifier.sol index f6b23a8f5..e5f0f85e9 100644 --- a/contracts/src/libraries/PlonkVerifier.sol +++ b/contracts/src/libraries/PlonkVerifier.sol @@ -67,7 +67,7 @@ library PlonkVerifier { /// @return _ A boolean indicating successful verification, false otherwise function verify( IPlonkVerifier.VerifyingKey memory verifyingKey, - uint256[8] memory publicInput, + uint256[7] memory publicInput, IPlonkVerifier.PlonkProof memory proof ) external view returns (bool) { _validateProof(proof); @@ -79,7 +79,6 @@ library PlonkVerifier { BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[4])); BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[5])); BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[6])); - BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[7])); return _verify(verifyingKey, publicInput, proof); } @@ -116,10 +115,10 @@ library PlonkVerifier { // core verifier logic, assuming all input arguments are validated function _verify( IPlonkVerifier.VerifyingKey memory verifyingKey, - uint256[8] memory publicInput, + uint256[7] memory publicInput, IPlonkVerifier.PlonkProof memory proof ) private view returns (bool) { - if (verifyingKey.numInputs != 8) revert WrongPlonkVK(); + if (verifyingKey.numInputs != 7) revert WrongPlonkVK(); Challenges memory chal = _computeChallenges(verifyingKey, publicInput, proof); @@ -168,7 +167,7 @@ library PlonkVerifier { function _computeChallenges( IPlonkVerifier.VerifyingKey memory vk, - uint256[8] memory pi, + uint256[7] memory pi, IPlonkVerifier.PlonkProof memory proof ) internal pure returns (Challenges memory res) { uint256 p = BN254.R_MOD; @@ -262,31 +261,30 @@ library PlonkVerifier { mstore(add(dataPtr, 0x600), mload(add(pi, 0x80))) // PI[4] mstore(add(dataPtr, 0x620), mload(add(pi, 0xa0))) // PI[5] mstore(add(dataPtr, 0x640), mload(add(pi, 0xc0))) // PI[6] - mstore(add(dataPtr, 0x660), mload(add(pi, 0xe0))) // PI[7] // proof let wire0Ptr := mload(proof) - mstore(add(dataPtr, 0x680), mload(wire0Ptr)) // wire0.x - mstore(add(dataPtr, 0x6a0), mload(add(wire0Ptr, 0x20))) // wire0.y + mstore(add(dataPtr, 0x660), mload(wire0Ptr)) // wire0.x + mstore(add(dataPtr, 0x680), mload(add(wire0Ptr, 0x20))) // wire0.y let wire1Ptr := mload(add(proof, 0x20)) - mstore(add(dataPtr, 0x6c0), mload(wire1Ptr)) // wire1.x - mstore(add(dataPtr, 0x6e0), mload(add(wire1Ptr, 0x20))) // wire1.y + mstore(add(dataPtr, 0x6a0), mload(wire1Ptr)) // wire1.x + mstore(add(dataPtr, 0x6c0), mload(add(wire1Ptr, 0x20))) // wire1.y let wire2Ptr := mload(add(proof, 0x40)) - mstore(add(dataPtr, 0x700), mload(wire2Ptr)) // wire2.x - mstore(add(dataPtr, 0x720), mload(add(wire2Ptr, 0x20))) // wire2.y + mstore(add(dataPtr, 0x6e0), mload(wire2Ptr)) // wire2.x + mstore(add(dataPtr, 0x700), mload(add(wire2Ptr, 0x20))) // wire2.y let wire3Ptr := mload(add(proof, 0x60)) - mstore(add(dataPtr, 0x740), mload(wire3Ptr)) // wire3.x - mstore(add(dataPtr, 0x760), mload(add(wire3Ptr, 0x20))) // wire3.y + mstore(add(dataPtr, 0x720), mload(wire3Ptr)) // wire3.x + mstore(add(dataPtr, 0x740), mload(add(wire3Ptr, 0x20))) // wire3.y let wire4Ptr := mload(add(proof, 0x80)) - mstore(add(dataPtr, 0x780), mload(wire4Ptr)) // wire4.x - mstore(add(dataPtr, 0x7a0), mload(add(wire4Ptr, 0x20))) // wire4.y + mstore(add(dataPtr, 0x760), mload(wire4Ptr)) // wire4.x + mstore(add(dataPtr, 0x780), mload(add(wire4Ptr, 0x20))) // wire4.y // challenge: beta { mstore(statePtr, 0x0) // init state - // preimage len: state(0x20) + transcript(0x7c0) + // preimage len: state(0x20) + transcript(0x7a0) // overwrite previous state at freePtr - mstore(statePtr, keccak256(statePtr, 0x7e0)) + mstore(statePtr, keccak256(statePtr, 0x7c0)) // (mod p) to get beta mstore(add(res, 0x60), mod(mload(statePtr), p)) } diff --git a/contracts/src/libraries/PlonkVerifier2.sol b/contracts/src/libraries/PlonkVerifier2.sol index 2ceed4fc0..9df354998 100644 --- a/contracts/src/libraries/PlonkVerifier2.sol +++ b/contracts/src/libraries/PlonkVerifier2.sol @@ -192,7 +192,7 @@ library PlonkVerifier2 { function _computeChallenges( IPlonkVerifier.VerifyingKey memory vk, - uint256[8] memory pi, + uint256[7] memory pi, IPlonkVerifier.PlonkProof memory proof ) internal pure returns (Challenges memory res) { assembly { @@ -300,26 +300,26 @@ library PlonkVerifier2 { // proof let wire0Ptr := mload(proof) - mstore(add(dataPtr, 0x680), mload(wire0Ptr)) // wire0.x - mstore(add(dataPtr, 0x6a0), mload(add(wire0Ptr, 0x20))) // wire0.y + mstore(add(dataPtr, 0x660), mload(wire0Ptr)) // wire0.x + mstore(add(dataPtr, 0x680), mload(add(wire0Ptr, 0x20))) // wire0.y let wire1Ptr := mload(add(proof, 0x20)) - mstore(add(dataPtr, 0x6c0), mload(wire1Ptr)) // wire1.x - mstore(add(dataPtr, 0x6e0), mload(add(wire1Ptr, 0x20))) // wire1.y + mstore(add(dataPtr, 0x6a0), mload(wire1Ptr)) // wire1.x + mstore(add(dataPtr, 0x6c0), mload(add(wire1Ptr, 0x20))) // wire1.y let wire2Ptr := mload(add(proof, 0x40)) - mstore(add(dataPtr, 0x700), mload(wire2Ptr)) // wire2.x - mstore(add(dataPtr, 0x720), mload(add(wire2Ptr, 0x20))) // wire2.y + mstore(add(dataPtr, 0x6e0), mload(wire2Ptr)) // wire2.x + mstore(add(dataPtr, 0x700), mload(add(wire2Ptr, 0x20))) // wire2.y let wire3Ptr := mload(add(proof, 0x60)) - mstore(add(dataPtr, 0x740), mload(wire3Ptr)) // wire3.x - mstore(add(dataPtr, 0x760), mload(add(wire3Ptr, 0x20))) // wire3.y + mstore(add(dataPtr, 0x720), mload(wire3Ptr)) // wire3.x + mstore(add(dataPtr, 0x740), mload(add(wire3Ptr, 0x20))) // wire3.y let wire4Ptr := mload(add(proof, 0x80)) - mstore(add(dataPtr, 0x780), mload(wire4Ptr)) // wire4.x - mstore(add(dataPtr, 0x7a0), mload(add(wire4Ptr, 0x20))) // wire4.y + mstore(add(dataPtr, 0x760), mload(wire4Ptr)) // wire4.x + mstore(add(dataPtr, 0x780), mload(add(wire4Ptr, 0x20))) // wire4.y // challenge: beta { mstore(statePtr, 0x0) // init state - // preimage len: state(0x20) + transcript(0x7c0) - mstore(add(dataPtr, 0x7c0), keccak256(statePtr, 0x7e0)) + // preimage len: state(0x20) + transcript(0x7a0) + mstore(add(dataPtr, 0x7c0), keccak256(statePtr, 0x7c0)) // update new state (by updating state pointer) statePtr := add(dataPtr, 0x7c0) // empty transcript @@ -432,7 +432,7 @@ library PlonkVerifier2 { function verify( IPlonkVerifier.VerifyingKey memory vk, - uint256[8] memory publicInput, + uint256[7] memory publicInput, IPlonkVerifier.PlonkProof memory proof ) external view returns (bool success) { _validateProof(proof); @@ -444,7 +444,6 @@ library PlonkVerifier2 { BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[4])); BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[5])); BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[6])); - BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[7])); Challenges memory chal = _computeChallenges(vk, publicInput, proof); Poly.EvalDomain memory domain = Poly.newEvalDomain(vk.domainSize); diff --git a/contracts/src/libraries/PolynomialEval.sol b/contracts/src/libraries/PolynomialEval.sol index e971f6751..7586a821d 100644 --- a/contracts/src/libraries/PolynomialEval.sol +++ b/contracts/src/libraries/PolynomialEval.sol @@ -14,7 +14,7 @@ library PolynomialEval { struct EvalDomain { uint256 logSize; // log_2(self.size) uint256 sizeInv; // Inverse of the size in the field - uint256[8] elements; // 1, g, g^2, ..., g^7 + uint256[7] elements; // 1, g, g^2, ..., g^6 } /// @dev stores vanishing poly, lagrange at 1, and Public input poly @@ -40,8 +40,7 @@ library PolynomialEval { 0x86812a00ac43ea801669c640171203c41a496671bfbc065ac8db24d52cf31e5, 0x2d965651cdd9e4811f4e51b80ddca8a8b4a93ee17420aae6adaa01c2617c6e85, 0x12597a56c2e438620b9041b98992ae0d4e705b780057bf7766a2767cece16e1d, - 0x2d94117cd17bcf1290fd67c01155dd40807857dff4a5a0b4dc67befa8aa34fd, - 0x15ee2475bee517c4ee05e51fa1ee7312a8373a0b13db8c51baf04cb2e99bd2bd + 0x2d94117cd17bcf1290fd67c01155dd40807857dff4a5a0b4dc67befa8aa34fd ] ); } else if (domainSize == 1048576) { @@ -55,8 +54,7 @@ library PolynomialEval { 0x2087ea2cd664278608fb0ebdb820907f598502c81b6690c185e2bf15cb935f42, 0x19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e0, 0x5a2c85cfc591789605cae818e37dd4161eef9aa666bec6fe4288d09e6d23418, - 0x11f70e5363258ff4f0d716a653e1dc41f1c64484d7f4b6e219d6377614a3905c, - 0x29e84143f5870d4776a92df8da8c6c9303d59088f37ba85f40cf6fd14265b4bc + 0x11f70e5363258ff4f0d716a653e1dc41f1c64484d7f4b6e219d6377614a3905c ] ); } @@ -72,8 +70,7 @@ library PolynomialEval { 0x1277ae6415f0ef18f2ba5fb162c39eb7311f386e2d26d64401f4a25da77c253b, 0x2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e80, 0x2fbd4dd2976be55d1a163aa9820fb88dfac5ddce77e1872e90632027327a5ebe, - 0x107aab49e65a67f9da9cd2abf78be38bd9dc1d5db39f81de36bcfa5b4b039043, - 0xe14b6364a47e9c4284a9f80a5fc41cd212b0d4dbf8a5703770a40a9a343990 + 0x107aab49e65a67f9da9cd2abf78be38bd9dc1d5db39f81de36bcfa5b4b039043 ] ); } else { @@ -144,7 +141,7 @@ library PolynomialEval { /// @dev Evaluate public input polynomial at point `zeta`. function evaluatePiPoly( EvalDomain memory self, - uint256[8] memory pi, + uint256[7] memory pi, uint256 zeta, uint256 vanishingPolyEval ) internal view returns (uint256 res) { @@ -152,7 +149,7 @@ library PolynomialEval { if (vanishingPolyEval == 0) { uint256 group = 1; - for (uint256 i = 0; i < 8; i++) { + for (uint256 i = 0; i < 7; i++) { if (zeta == group) { return pi[i]; } @@ -193,7 +190,7 @@ library PolynomialEval { // n(n - 1) to 3n // // credit: @shresthagrawal and @jakovmitrovski from CommonPrefix - uint256[8] memory suffix; + uint256[7] memory suffix; // Assume we have [a, b, c, d] where a = zeta - g^0, b = zeta - g^1, ... // @@ -201,15 +198,15 @@ library PolynomialEval { // suffix[length - 1] = 1 // suffix = [dcb, dc, d, 1] assembly { - let suffixPtr := add(suffix, mul(7, 0x20)) - let localDomainElementsPtr := add(mload(add(self, 0x40)), mul(7, 0x20)) + let suffixPtr := add(suffix, mul(6, 0x20)) + let localDomainElementsPtr := add(mload(add(self, 0x40)), mul(6, 0x20)) let currentElementSuffix := 1 // Last element of suffix is set to 1 mstore(suffixPtr, currentElementSuffix) // Calculate prefix and suffix products - for { let i := 1 } lt(i, 8) { i := add(i, 1) } { + for { let i := 1 } lt(i, 7) { i := add(i, 1) } { // move suffix pointer suffixPtr := sub(suffixPtr, 0x20) @@ -235,7 +232,7 @@ library PolynomialEval { // Compute the sum term \sum_{i=0}^{length} currentElementPrefix * suffix[i] * pi[i] * // g^i - for { let i := 0 } lt(i, 8) { i := add(i, 1) } { + for { let i := 0 } lt(i, 7) { i := add(i, 1) } { // sum += currentElementPrefix * suffix[i] * pi[i] * g^i let currentTerm := mulmod( @@ -275,7 +272,7 @@ library PolynomialEval { } /// @dev compute the EvalData for a given domain and a challenge zeta - function evalDataGen(EvalDomain memory self, uint256 zeta, uint256[8] memory publicInput) + function evalDataGen(EvalDomain memory self, uint256 zeta, uint256[7] memory publicInput) internal view returns (EvalData memory evalData) diff --git a/contracts/test/PlonkVerifier.t.sol b/contracts/test/PlonkVerifier.t.sol index 25e18080d..c541471c4 100644 --- a/contracts/test/PlonkVerifier.t.sol +++ b/contracts/test/PlonkVerifier.t.sol @@ -34,7 +34,7 @@ contract PlonkVerifierCommonTest is Test { /// @dev Sanitize all values in `a` to be valid scalar fields Bn254::Fr. /// This is helpful to sanitize fuzzer-generated random `uint[]` values. - function sanitizeScalarFields(uint256[8] memory a) public pure returns (uint256[8] memory) { + function sanitizeScalarFields(uint256[7] memory a) public pure returns (uint256[7] memory) { for (uint256 i = 0; i < a.length; i++) { a[i] = sanitizeScalarField(a[i]); } @@ -74,7 +74,7 @@ contract PlonkVerifierCommonTest is Test { /// @dev helper function to generate some dummy but format-valid arguments for /// `prepareOpeningProof` step. The verifyingKey should be fixed/loaded from library, /// proof should be generated via `dummyProof()`, other inputs are from fuzzers. - function dummyArgsForOpeningProof(uint64 seed, uint256[8] memory publicInput) + function dummyArgsForOpeningProof(uint64 seed, uint256[7] memory publicInput) public returns ( IPlonkVerifier.VerifyingKey memory, @@ -139,9 +139,9 @@ contract PlonkVerifier_verify_Test is PlonkVerifierCommonTest { bytes memory result = vm.ffi(cmds); ( IPlonkVerifier.VerifyingKey memory verifyingKey, - uint256[8] memory publicInput, + uint256[7] memory publicInput, IPlonkVerifier.PlonkProof memory proof - ) = abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[8], IPlonkVerifier.PlonkProof)); + ) = abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); vm.resumeGasMetering(); assert(V.verify(verifyingKey, publicInput, proof)); @@ -156,9 +156,9 @@ contract PlonkVerifier_verify_Test is PlonkVerifierCommonTest { bytes memory result = vm.ffi(cmds); ( IPlonkVerifier.VerifyingKey memory verifyingKey, - uint256[8] memory publicInput, + uint256[7] memory publicInput, IPlonkVerifier.PlonkProof memory proof - ) = abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[8], IPlonkVerifier.PlonkProof)); + ) = abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); // there are 18 points in verifying key // randomly choose one to mutate @@ -184,9 +184,9 @@ contract PlonkVerifier_verify_Test is PlonkVerifierCommonTest { // @dev Test when bad public input is supplied, the verification should fail // We know our `gen_circuit_for_test` in `diff_test.rs` has only 8 public inputs - function testFuzz_badPublicInput_fails(uint256[8] calldata randPublicInput) external { - uint256[8] memory badPublicInput; - for (uint256 i = 0; i < 8; i++) { + function testFuzz_badPublicInput_fails(uint256[7] calldata randPublicInput) external { + uint256[7] memory badPublicInput; + for (uint256 i = 0; i < 7; i++) { badPublicInput[i] = randPublicInput[i]; } badPublicInput = sanitizeScalarFields(badPublicInput); @@ -197,7 +197,7 @@ contract PlonkVerifier_verify_Test is PlonkVerifierCommonTest { bytes memory result = vm.ffi(cmds); (IPlonkVerifier.VerifyingKey memory verifyingKey,, IPlonkVerifier.PlonkProof memory proof) = - abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[8], IPlonkVerifier.PlonkProof)); + abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); assert(!V.verify(verifyingKey, badPublicInput, proof)); } @@ -211,8 +211,8 @@ contract PlonkVerifier_verify_Test is PlonkVerifierCommonTest { cmds[1] = "plonk-verify"; bytes memory result = vm.ffi(cmds); - (IPlonkVerifier.VerifyingKey memory verifyingKey, uint256[8] memory publicInput,) = - abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[8], IPlonkVerifier.PlonkProof)); + (IPlonkVerifier.VerifyingKey memory verifyingKey, uint256[7] memory publicInput,) = + abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); assert(!V.verify(verifyingKey, publicInput, badProof)); } @@ -278,11 +278,11 @@ contract PlonkVerifier_validateProof_Test is PlonkVerifierCommonTest { contract PlonkVerifier_computeChallenges_Test is PlonkVerifierCommonTest { /// @dev Test `computeChallenges` matches that of Jellyfish - function testFuzz_computeChallenges_matches(uint64 seed, uint256[8] memory _publicInput) + function testFuzz_computeChallenges_matches(uint64 seed, uint256[7] memory _publicInput) external { - uint256[8] memory publicInput; - for (uint256 i = 0; i < 8; i++) { + uint256[7] memory publicInput; + for (uint256 i = 0; i < 7; i++) { publicInput[i] = _publicInput[i]; } diff --git a/contracts/test/PlonkVerifier2.t.sol b/contracts/test/PlonkVerifier2.t.sol index 232257b5c..6da971bf3 100644 --- a/contracts/test/PlonkVerifier2.t.sol +++ b/contracts/test/PlonkVerifier2.t.sol @@ -33,7 +33,7 @@ contract PlonkVerifierCommonTest is Test { /// @dev Sanitize all values in `a` to be valid scalar fields Bn254::Fr. /// This is helpful to sanitize fuzzer-generated random `uint[]` values. - function sanitizeScalarFields(uint256[8] memory a) public pure returns (uint256[8] memory) { + function sanitizeScalarFields(uint256[7] memory a) public pure returns (uint256[7] memory) { for (uint256 i = 0; i < a.length; i++) { a[i] = sanitizeScalarField(a[i]); } @@ -64,9 +64,9 @@ contract PlonkVerifier2_verify_Test is PlonkVerifierCommonTest { bytes memory result = vm.ffi(cmds); ( IPlonkVerifier.VerifyingKey memory verifyingKey, - uint256[8] memory publicInput, + uint256[7] memory publicInput, IPlonkVerifier.PlonkProof memory proof - ) = abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[8], IPlonkVerifier.PlonkProof)); + ) = abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); vm.resumeGasMetering(); assert(V.verify(verifyingKey, publicInput, proof)); @@ -81,9 +81,9 @@ contract PlonkVerifier2_verify_Test is PlonkVerifierCommonTest { bytes memory result = vm.ffi(cmds); ( IPlonkVerifier.VerifyingKey memory verifyingKey, - uint256[8] memory publicInput, + uint256[7] memory publicInput, IPlonkVerifier.PlonkProof memory proof - ) = abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[8], IPlonkVerifier.PlonkProof)); + ) = abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); // there are 18 points in verifying key // randomly choose one to mutate @@ -109,9 +109,9 @@ contract PlonkVerifier2_verify_Test is PlonkVerifierCommonTest { // @dev Test when bad public input is supplied, the verification should fail // We know our `gen_circuit_for_test` in `diff_test.rs` has only 8 public inputs - function testFuzz_badPublicInput_fails(uint256[8] calldata randPublicInput) external { - uint256[8] memory badPublicInput; - for (uint256 i = 0; i < 8; i++) { + function testFuzz_badPublicInput_fails(uint256[7] calldata randPublicInput) external { + uint256[7] memory badPublicInput; + for (uint256 i = 0; i < 7; i++) { badPublicInput[i] = randPublicInput[i]; } badPublicInput = sanitizeScalarFields(badPublicInput); @@ -122,7 +122,7 @@ contract PlonkVerifier2_verify_Test is PlonkVerifierCommonTest { bytes memory result = vm.ffi(cmds); (IPlonkVerifier.VerifyingKey memory verifyingKey,, IPlonkVerifier.PlonkProof memory proof) = - abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[8], IPlonkVerifier.PlonkProof)); + abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); assert(!V.verify(verifyingKey, badPublicInput, proof)); } @@ -136,8 +136,8 @@ contract PlonkVerifier2_verify_Test is PlonkVerifierCommonTest { cmds[1] = "plonk-verify"; bytes memory result = vm.ffi(cmds); - (IPlonkVerifier.VerifyingKey memory verifyingKey, uint256[8] memory publicInput,) = - abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[8], IPlonkVerifier.PlonkProof)); + (IPlonkVerifier.VerifyingKey memory verifyingKey, uint256[7] memory publicInput,) = + abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); assert(!V.verify(verifyingKey, publicInput, badProof)); } diff --git a/contracts/test/PolynomialEval.t.sol b/contracts/test/PolynomialEval.t.sol index fd41013a4..e4ebba152 100644 --- a/contracts/test/PolynomialEval.t.sol +++ b/contracts/test/PolynomialEval.t.sol @@ -79,12 +79,12 @@ contract PolynomialEvalTest is Test { cmds[0] = "diff-test"; cmds[1] = "eval-domain-elements"; cmds[2] = vm.toString(logSize); - cmds[3] = vm.toString(uint256(8)); + cmds[3] = vm.toString(uint256(7)); bytes memory result = vm.ffi(cmds); (uint256[] memory elems) = abi.decode(result, (uint256[])); - for (uint256 i = 0; i < 8; i++) { + for (uint256 i = 0; i < 7; i++) { assertEq(elems[i], domain.elements[i]); } } @@ -93,13 +93,13 @@ contract PolynomialEvalTest is Test { contract PolynomialEval_evalDataGen_Test is PolynomialEvalTest { /// @dev Test if evaluations on the vanishing poly, the lagrange one poly, and the public input /// poly are correct. - function testFuzz_evalDataGen_matches(uint256 zeta, uint256[8] memory publicInput) external { + function testFuzz_evalDataGen_matches(uint256 zeta, uint256[7] memory publicInput) external { uint256 logSize = 20; zeta = bound(zeta, 0, BN254.R_MOD - 1); BN254.validateScalarField(BN254.ScalarField.wrap(zeta)); // Since these user-provided `publicInputs` were checked outside before passing in via // `BN254.validateScalarField()`, it suffices to assume they are proper for our test here. - for (uint256 i = 0; i < 8; i++) { + for (uint256 i = 0; i < 7; i++) { publicInput[i] = bound(publicInput[i], 0, BN254.R_MOD - 1); BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[i])); } @@ -165,16 +165,16 @@ contract PolynomialEval_evalDataGen_Test is PolynomialEvalTest { Poly.EvalDomain memory domain = Poly.newEvalDomain(size); uint256[] memory elements = domainElements(domain, size); - uint256[8] memory publicInputs; + uint256[7] memory publicInputs; // arbitrarily pick public input length = 10, and fill in arbitrary values - for (uint256 i = 0; i < 8; i++) { + for (uint256 i = 0; i < 7; i++) { publicInputs[i] = 2 ** i; } for (uint256 i = 0; i < size; i++) { uint256 zeta = elements[i]; uint256 vanishEval = Poly.evaluateVanishingPoly(domain, zeta); - if (i < 8) { + if (i < 7) { assertEq(vanishEval, 0); assertEq( Poly.evaluatePiPoly(domain, publicInputs, zeta, vanishEval), publicInputs[i] diff --git a/contracts/test/mocks/LightClientMock.sol b/contracts/test/mocks/LightClientMock.sol index bb609e335..c70c17492 100644 --- a/contracts/test/mocks/LightClientMock.sol +++ b/contracts/test/mocks/LightClientMock.sol @@ -35,8 +35,8 @@ contract LightClientMock is LC { IPlonkVerifier.VerifyingKey memory vk = VkLib.getVk(); // Prepare the public input - uint256[8] memory publicInput; - publicInput[0] = genesisStakeTableState.threshold; + uint256[7] memory publicInput; + publicInput[0] = votingThreshold; publicInput[1] = uint256(state.viewNum); publicInput[2] = uint256(state.blockHeight); publicInput[3] = BN254.ScalarField.unwrap(state.blockCommRoot); diff --git a/hotshot-state-prover/src/mock_ledger.rs b/hotshot-state-prover/src/mock_ledger.rs index c4e1631c4..973a36d23 100644 --- a/hotshot-state-prover/src/mock_ledger.rs +++ b/hotshot-state-prover/src/mock_ledger.rs @@ -547,8 +547,8 @@ pub fn gen_circuit_for_test(m: usize, a0: usize) -> Result Date: Fri, 6 Sep 2024 11:27:49 +0800 Subject: [PATCH 16/27] update vk contract --- .../libraries/LightClientStateUpdateVK.sol | 74 +++++++++---------- .../mocks/LightClientStateUpdateVKMock.sol | 74 +++++++++---------- 2 files changed, 74 insertions(+), 74 deletions(-) diff --git a/contracts/src/libraries/LightClientStateUpdateVK.sol b/contracts/src/libraries/LightClientStateUpdateVK.sol index 2edcce084..1c5b00101 100644 --- a/contracts/src/libraries/LightClientStateUpdateVK.sol +++ b/contracts/src/libraries/LightClientStateUpdateVK.sol @@ -25,172 +25,172 @@ library LightClientStateUpdateVK { // domain size mstore(vk, 1048576) // num of public inputs - mstore(add(vk, 0x20), 4) + mstore(add(vk, 0x20), 7) // sigma0 mstore( mload(add(vk, 0x40)), - 16998694615579553089155874235793867672199587172454671092177469580512964996958 + 16043392748105542250304322824810370020021025564942427718474950685092675841954 ) mstore( add(mload(add(vk, 0x40)), 0x20), - 14913826609548226082638726512972809701476246236323364924963463506303833260496 + 19135284366657833628354977949371490269920872528386804828338183734933915063463 ) // sigma1 mstore( mload(add(vk, 0x60)), - 16011493707035639931534162117491453383106763751836815206648905058016608669414 + 2778717324330498744994531263702315244149678900961828222283402152593904107675 ) mstore( add(mload(add(vk, 0x60)), 0x20), - 14388337539414483026957313358914935908135528975692221819766569817991107147509 + 16759366415806200391095504905464812555509135295738337106253912320243246018937 ) // sigma2 mstore( mload(add(vk, 0x80)), - 13703053324325359330807185043437520838180663451594181288098705061547972032806 + 6220330596615226723642438930205134518711246397122520386233799907528379013596 ) mstore( add(mload(add(vk, 0x80)), 0x20), - 7918750352115682079617962789983677878433816245702145361769062720089763403276 + 8344958809262021811929679424186961192688788615559223638884967520276027016395 ) // sigma3 mstore( mload(add(vk, 0xa0)), - 13204842395853711359779501868742648845147496821494941512193666818383658538957 + 7952811448742934474128215788861604894182577909950573256881248636552173771199 ) mstore( add(mload(add(vk, 0xa0)), 0x20), - 6288695024259467804863820352232692613451432067819650190625073863086458569747 + 20500159975945184586417129168820991334637018612773612287842415693151993758760 ) // sigma4 mstore( mload(add(vk, 0xc0)), - 14040324856970655299835654144202400654814421740434059377565899259781188799728 + 10296671863931908571056025645132677298697792048312748314247297091242497167101 ) mstore( add(mload(add(vk, 0xc0)), 0x20), - 834927786053040465657288239208351618292029645055491714782381530747781592418 + 14487321642141254557263069781234760963154849825884844778816524063348598567049 ) // q1 mstore( mload(add(vk, 0xe0)), - 20544572990331653135731505780346223934798623123944840034213073023563475633800 + 7758833542876569127261238805250663426100336271670929506591434105603119717827 ) mstore( add(mload(add(vk, 0xe0)), 0x20), - 7550911007406754226376516859815557397303730847970858309323990044427329644102 + 3847980651474203698351602471244791446829358454627973590875164935356920412957 ) // q2 mstore( mload(add(vk, 0x100)), - 18956139365826315484332454907058381265609921251964078522092401394457299997830 + 9277076569845583759629501106958656611791077602517098829558737012728982332382 ) mstore( add(mload(add(vk, 0x100)), 0x20), - 9788587892818848699376557857403480861962950394272020572265563326270836160853 + 442283620081484392522390233257214501417811361363792609544757268467188182859 ) // q3 mstore( mload(add(vk, 0x120)), - 14944087736485927361587552840560835650155434953441391165695836700062143169913 + 4678354727148314768583368011442986799904545609212135187355874282069755187556 ) mstore( add(mload(add(vk, 0x120)), 0x20), - 12259474077603385628738286132424764984742349966390776825596861993344622164294 + 11239540448038284734601875871911558572979722253259682483359467915957118547606 ) // q4 mstore( mload(add(vk, 0x140)), - 12197100474889712366030113889288384374271280568148734018082366471981780315735 + 19795855070701456519856289246107606667286081050354689801132498355098877250588 ) mstore( add(mload(add(vk, 0x140)), 0x20), - 13924717995877468902081617840526261717992163369146998334077705192817969100151 + 7486832458658187317275572122161344331029297565191850558196052941108256950480 ) // qM12 mstore( mload(add(vk, 0x160)), - 4761744642254166165214745077362540222932129018196121566475099635847171238660 + 15258708840140408534057880342484090317487134490781304521604654158159692661694 ) mstore( add(mload(add(vk, 0x160)), 0x20), - 6160449879339783698137050851589287422912864722866490311805770855855163898265 + 2684189309724513706861143955683980707183027467486121633924046346673706699241 ) // qM34 mstore( mload(add(vk, 0x180)), - 16019000954689754674593063440664003812452865678864153761623503615040839458731 + 20204605388553534621522300111279473013506461170995450431955470728233298617583 ) mstore( add(mload(add(vk, 0x180)), 0x20), - 17381929236650272454670090686309297525519442421631348854786802259803071993361 + 20667860155429666628752166675435907067937684456207285708587770630418366377348 ) // qO mstore( mload(add(vk, 0x1a0)), - 20775553829796351538875640647761226289796822451382188824751919155603475031120 + 20001416105877927202901579747864018649895183788011637572138305596074976602376 ) mstore( add(mload(add(vk, 0x1a0)), 0x20), - 16387305174440748744164810428371325931833493744277542543307443448742579568958 + 19528436190309610113547469449976708739079126597255604268425501554938355526882 ) // qC mstore( mload(add(vk, 0x1c0)), - 10561189404881783228238637998299055616027595156938649247416787347069381768829 + 20482873589297055931625799341900159582543895173558170170584514916029179712769 ) mstore( add(mload(add(vk, 0x1c0)), 0x20), - 3943406444165977440881486577514784600711380627384453436931443980733458339721 + 16386801470684282089941433984161903425938200748129533869396840661293226216717 ) // qH1 mstore( mload(add(vk, 0x1e0)), - 4889516819694721837358304784193252947490111520088045204520047536170849858888 + 1960884119254066702392602328821638986229496749601689484863310054626771192849 ) mstore( add(mload(add(vk, 0x1e0)), 0x20), - 4852876225040588964292323378399805668815216441959750201604927324046694192208 + 6966409033516919499274932822727395736487830106099489183848257044616164644964 ) // qH2 mstore( mload(add(vk, 0x200)), - 5795241947074845452142105074293485315890012937126510399092193478110678425250 + 19753440871621787440428381199327465770585928335388367352727113355846992655252 ) mstore( add(mload(add(vk, 0x200)), 0x20), - 21134337090425282422832414599718123763071137889703540520295427274384203705493 + 11026377003353031626858906742565594946968872706038673353464112313773276980972 ) // qH3 mstore( mload(add(vk, 0x220)), - 6606186238266267238550749463315925213609734249860657171964295777390082553197 + 5448915697208493401615649328992224252292638718144982802779361343669178673414 ) mstore( add(mload(add(vk, 0x220)), 0x20), - 2813969982045804558958174990765446958943095294464107506708510616571612999661 + 6085228836821381915568415426008615814705795649793227339139722249659752395983 ) // qH4 mstore( mload(add(vk, 0x240)), - 7594747784798376376858886229708671341141985648424878807573224827438208330262 + 819687199834621753152082039202327894832066894790282585745748408358274702853 ) mstore( add(mload(add(vk, 0x240)), 0x20), - 6835212894886893695211938895795741650252589108614387458070592221374863976851 + 19319663644033644630589680099329782677655847333441532334438696245011494104785 ) // qEcc mstore( mload(add(vk, 0x260)), - 18418591436859210472987001470790664263135421335281477510498260703209065940337 + 3247667238694701634583031584459011661543842409365209666160058601955613754293 ) mstore( add(mload(add(vk, 0x260)), 0x20), - 9993635555108627048825987579258725039654497454015072112166907062603793732862 + 16270745764918143312248739566720243316557176152434456136076490117238720935327 ) // g2LSB mstore( diff --git a/contracts/test/mocks/LightClientStateUpdateVKMock.sol b/contracts/test/mocks/LightClientStateUpdateVKMock.sol index 0e5eca3df..895359782 100644 --- a/contracts/test/mocks/LightClientStateUpdateVKMock.sol +++ b/contracts/test/mocks/LightClientStateUpdateVKMock.sol @@ -25,172 +25,172 @@ library LightClientStateUpdateVKMock { // domain size mstore(vk, 65536) // num of public inputs - mstore(add(vk, 0x20), 4) + mstore(add(vk, 0x20), 7) // sigma0 mstore( mload(add(vk, 0x40)), - 6088904265573808865748522029138006317194361279606554867165703727167729137832 + 8780639620157991547891148805919878543964392540464064685187426147622550545653 ) mstore( add(mload(add(vk, 0x40)), 0x20), - 9955095018968506534441048970159911343289070413047889845208695603072669098426 + 20329703559355367581046659947888846422105739175065087594596260710114283196743 ) // sigma1 mstore( mload(add(vk, 0x60)), - 8272407924239308790897016741071136690858972255217114029193400287719051999939 + 3907156025477632431542339436132810635869646020372000361558947676433399300657 ) mstore( add(mload(add(vk, 0x60)), 0x20), - 1579963292631487791550226848934606325179599024330423638350684055249850005662 + 15166891789069460999276105114477792814715896454647328408547057284442121910762 ) // sigma2 mstore( mload(add(vk, 0x80)), - 1402360621940842422618017724395753804093885927027017453763663806005588190611 + 16117338641398770111163510775377619339331602936228198086195746724908247912987 ) mstore( add(mload(add(vk, 0x80)), 0x20), - 13893707948956669470828390339446321405757890506813776755760611664341885671348 + 16740309672564743380534217813520152592316530015569211886810037896829102066193 ) // sigma3 mstore( mload(add(vk, 0xa0)), - 5660526272093562214694977270320090310970096465665660533464975039268380207382 + 12538505105272464906507307944934155800358883434325050138580706870389223251955 ) mstore( add(mload(add(vk, 0xa0)), 0x20), - 3020475395904829817487205855641583787360488822241734291131614958312073282990 + 17087689768744441683235009923517716656172653026276602270807480035069491545755 ) // sigma4 mstore( mload(add(vk, 0xc0)), - 13867389252854274409456433144766803560101522531117517660087709767128730289557 + 8454021317091853741146103272343912504762747954666706409528335183296787067868 ) mstore( add(mload(add(vk, 0xc0)), 0x20), - 16028931892087420834703776063652692412379808279229805369619643135968327120880 + 11016751689921538830297286304051364340305496719162309364532472841887958117447 ) // q1 mstore( mload(add(vk, 0xe0)), - 14917685842131406325120344741320385933092382950109928374974151865027936135461 + 15359607559713515060277507574080941419834828987039079827302572287698309504008 ) mstore( add(mload(add(vk, 0xe0)), 0x20), - 10771152981589983233112040901872897076224489900467648966602683982711269285546 + 15591847269596226482414296106962647755691103548771963256694477068178857435064 ) // q2 mstore( mload(add(vk, 0x100)), - 10203431164915116572574899008477590878502347642086936032264033913602824952482 + 3827124881709489188270137163975264995006696000603327038290589744450697834719 ) mstore( add(mload(add(vk, 0x100)), 0x20), - 20547118756604796933768226604664346089096301961445924480372692859669316908079 + 4318865171469939783910279249735693836790096703031897567022798858747771698987 ) // q3 mstore( mload(add(vk, 0x120)), - 19102468977698458888204306335581684238459394495297656552165798947351232258553 + 9913200330357548509998155437749548539621758310017341493550757808590136100654 ) mstore( add(mload(add(vk, 0x120)), 0x20), - 10792992953330175389925424964958973430588487704430242946943025378682430809297 + 6814632498217774714123393660227395994377471940775558778851220352696329643472 ) // q4 mstore( mload(add(vk, 0x140)), - 13569675765509201437841796168910359478590822579301808243803045555243814038982 + 3883191076505672454480590601847891400492344398783540423987354164376670931632 ) mstore( add(mload(add(vk, 0x140)), 0x20), - 3256253664247689331164320111009453976768026492072647059820555684988549357205 + 20839825466680406969762141617626050744698350991971572530895764099779245352021 ) // qM12 mstore( mload(add(vk, 0x160)), - 4578535055397788927300012345409975292088066403933071874143459428220011493670 + 21406269564986737709993597423928286134977055796815775729833412276225603000600 ) mstore( add(mload(add(vk, 0x160)), 0x20), - 15699655206346774966952817841201435512620492599231063424373468065154767824705 + 12772252332970283309865491720722288577802768585231460494194809914065609893146 ) // qM34 mstore( mload(add(vk, 0x180)), - 8649045521046512020246812954113611791420207930864802444045564814718983958551 + 8748719790723850706708743284282732016988453984542999687132033580365028484176 ) mstore( add(mload(add(vk, 0x180)), 0x20), - 7269940676617226033557017158774981242559551735020117596091006665347292306700 + 17544334478919255774333811720072760425376034355353547228796576661540616867477 ) // qO mstore( mload(add(vk, 0x1a0)), - 19082454924274503771317845865937521798237448911836152925551713293178151848884 + 5779426557055774294678280308002088559229695119399763216284786861647635461700 ) mstore( add(mload(add(vk, 0x1a0)), 0x20), - 6568876324819809477961856736880428893559203399248299353039639553670135657026 + 7548438953482540110543430573498065044386548194974128437338762456047175631187 ) // qC mstore( mload(add(vk, 0x1c0)), - 16853050533444065914578047615738518087842729700468544233178586306481688647819 + 11552344496521430760886457728705966546513418701688663336162205885875626038275 ) mstore( add(mload(add(vk, 0x1c0)), 0x20), - 5722244766346437957668750553129548150637123317523545680556873076958148045899 + 16226018892294013424782485757258297775919919344548162680620984645491361418522 ) // qH1 mstore( mload(add(vk, 0x1e0)), - 18279658636913239406461248779993875565095679624315793602808155467238704277088 + 15429474373549821133939594736546140618918804365845388482696898746435810291934 ) mstore( add(mload(add(vk, 0x1e0)), 0x20), - 3441277161432124201466559496830840292734718234571053223520348268617142260011 + 15886779329816613995086957445881288473375121142391270808048598119106627277422 ) // qH2 mstore( mload(add(vk, 0x200)), - 3678434997024236548300073262218716375615282659526172787360629244046211207407 + 20182835776034348669368110619035658941195975223063135746846432037544892224044 ) mstore( add(mload(add(vk, 0x200)), 0x20), - 10346801070770624840438166318201076689294579749619631696719225139256389377514 + 15361728677111385770832136356063861049884090898287914753487082190229852997688 ) // qH3 mstore( mload(add(vk, 0x220)), - 15245981269684440694865215979100312195723682495838381930420156798715946791002 + 14511917864647423306209946980814936857561106729956548326825273767665603910950 ) mstore( add(mload(add(vk, 0x220)), 0x20), - 17771359266315463065946701716949479499127948028026834266475460023649247415816 + 14658715671477677285308444061546079655758155254745238831866071967401023436805 ) // qH4 mstore( mload(add(vk, 0x240)), - 15236448222681780631374197064304662174394077083666475702144696580008299731540 + 14937219945828094206790376190430054771766629914027056408189669916922811947303 ) mstore( add(mload(add(vk, 0x240)), 0x20), - 4455087468085405113449530963538607004372733480992469653300468993540544949202 + 15151784422100780280828965688541219091568989137314100641534271437316997647143 ) // qEcc mstore( mload(add(vk, 0x260)), - 18950741019977133609412835372131153201910349848619035858126948587016554379310 + 12945427393138592243089853673971037111092830343359970781209689043897181434196 ) mstore( add(mload(add(vk, 0x260)), 0x20), - 7340531586894031137911171437535895150082108255870826703349877706931499230371 + 17314669060147862110721119367910762821785110567097188274415984256244098310506 ) // g2LSB mstore( From 9214886b7ce7e907da2360abec0f8d60339c7482 Mon Sep 17 00:00:00 2001 From: Alex Xiong Date: Fri, 6 Sep 2024 16:50:21 +0800 Subject: [PATCH 17/27] update public inputs of LC --- Cargo.lock | 2 +- .../artifacts/LightClientMock_bytecode.json | 2 +- contract-bindings/artifacts/LightClient_bytecode.json | 2 +- contract-bindings/src/plonk_verifier.rs | 4 ++-- contract-bindings/src/plonk_verifier_2.rs | 4 ++-- contracts/src/LightClient.sol | 11 +++++++---- contracts/test/mocks/LightClientMock.sol | 11 +++++++---- foundry.toml | 6 ++---- 8 files changed, 23 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8f2ae2cb1..b1523fe12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7535,7 +7535,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.12.1", + "itertools 0.11.0", "proc-macro2", "quote", "syn 2.0.77", diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json index de1dcfc00..d0f613b26 100644 --- a/contract-bindings/artifacts/LightClientMock_bytecode.json +++ b/contract-bindings/artifacts/LightClientMock_bytecode.json @@ -1 +1 @@ -"0x60a0346200057857620030ae38819003601f8101601f191683016001600160401b03811184821017620004aa57839282916040528339810103610100811262000578576060811262000578576080604051916200005c836200057d565b620000678462000599565b8352620000776020850162000599565b602084015260408401516040840152605f19011262000578576040519160808301906001600160401b03821184831017620004aa5760e091604052606081015184526080810151602085015260a0810151604085015260c08101516060850152015163ffffffff811681036200057857306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8160401c1662000566576002600160401b03196001600160401b038216016200051a575b505081516001600160401b03161580159062000503575b8015620004f6575b8015620004e9575b8015620004dc575b8015620004d2575b620004c05760018060401b03825116908160085468010000000000000000600160801b03602086015160401b1691829160018060801b031916171760085560408401519182600955855160045560208601519283600555604087015192836006556060880151958660075560018060801b0319600a54161717600a55600b55600c549063ffffffff60a81b9060a81b169063ffffffff60a81b1916179283600c55604051916020830193845260408301526060820152606081526080810181811060018060401b03821117620004aa57604052519020600093818555519081600155600255600355600e5490811515918262000433575b5050620003a4575b602081015160409182015182519290916001600160401b039081169184019081118482101762000390576040528252602082015260405190620002ad826200057d565b6001600160401b03438116835242166020830190815260408301918252600e54909290680100000000000000008110156200039057806001620002f49201600e55620005ae565b9490946200037c575051835492516001600160801b03199093166001600160401b0391821617604093841b6fffffffffffffffff000000000000000016178455905180516001850180546001600160401b0319169190931617909155602001516002929092019190915551612ac99081620005e58239608051818181610b0a0152610c620152f35b634e487b7160e01b81526004819052602490fd5b634e487b7160e01b85526041600452602485fd5b600d54620003bb906001600160401b0316620005ae565b6200041f5782815560018101839055600201829055600d546001600160401b038082169081146200040b576001600160401b03199091166001919091016001600160401b031617600d556200026a565b634e487b7160e01b84526011600452602484fd5b634e487b7160e01b83526004839052602483fd5b90915060001981019081116200040b576200044e90620005ae565b5054600d546001600160401b0360409290921c821691620004709116620005ae565b505460401c6001600160401b03908116909103919082116200040b5760a81c63ffffffff166001600160401b039091161015388062000262565b634e487b7160e01b600052604160045260246000fd5b6040516350dd03f760e11b8152600490fd5b508251156200016b565b5060608301511562000163565b506040830151156200015b565b5060208301511562000153565b5060208201516001600160401b031615156200014b565b6001600160401b0319166001600160401b039081179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388062000134565b60405163f92ee8a960e01b8152600490fd5b600080fd5b606081019081106001600160401b03821117620004aa57604052565b51906001600160401b03821682036200057857565b600e54811015620005ce57600e6000526003602060002091020190600090565b634e487b7160e01b600052603260045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc1461021757806302b592f3146102125780630d8e6e2c1461020d5780632063d4f7146102085780632d52aad6146102035780632f5f4600146101fe5780632f79889d146101f9578063313df7b1146101f4578063382b215a146101ef5780634f1ef286146101ea57806352d1902d146101e557806362827733146101e057806369cc6a04146101db5780636f96bdae146101d6578063715018a6146101d157806376b6b7cb146101cc5780638584d23f146101c75780638da5cb5b146101c257806396c1ca61146101bd5780639baa3cc9146101b85780639fdb54a7146101b3578063a9a9c9f5146101ae578063ad3cb1cc146101a9578063b5adea3c146101a4578063bd32519a1461019f578063c23b9e9e1461019a578063c8e5e49814610195578063ca6fe85514610190578063d24d933d1461018b578063e030330114610186578063f2fde38b146101815763f9e50d191461017c57600080fd5b611408565b6113df565b6112af565b611274565b611256565b611239565b611212565b6111ec565b611193565b611116565b6110df565b6110a0565b610f53565b610ecc565b610e83565b610e46565b610e28565b610dbd565b610d72565b610cd8565b610cba565b610c4f565b610a90565b610a57565b610a2e565b610a07565b61091b565b6108f5565b61079d565b6104ed565b610477565b61024e565b600435906001600160a01b038216820361023257565b600080fd5b61010435906001600160a01b038216820361023257565b346102325760203660031901126102325761026761021c565b61026f611a4c565b6001600160a01b039081169081156102ff57600c5490811682146102ed5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561036257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b610311565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761039857604052565b610367565b606081019081106001600160401b0382111761039857604052565b608081019081106001600160401b0382111761039857604052565b90601f801991011681019081106001600160401b0382111761039857604052565b604051906102e082018281106001600160401b0382111761039857604052565b604051906104218261037d565b565b604051906104218261039d565b604051906102c082018281106001600160401b0382111761039857604052565b9060405161045d8161037d565b6020600182946001600160401b0381541684520154910152565b3461023257602036600319011261023257600435600e54811015610232576104a0608091610327565b506104eb8154916104bb60016001600160401b039201610450565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b34610232576000366003190112610232576060604051600181526000602082015260006040820152f35b35906001600160401b038216820361023257565b606090600319011261023257604051906105448261039d565b816001600160401b03600435818116810361023257825260243590811681036102325760208201526040604435910152565b6040906063190112610232576040519061058f8261037d565b60643582526084356020830152565b60409060a319011261023257604051906105b78261037d565b60a435825260c4356020830152565b60409060e319011261023257604051906105df8261037d565b60e4358252610104356020830152565b60409061012319011261023257604051906106098261037d565b610124358252610144356020830152565b60409061016319011261023257604051906106348261037d565b610164358252610184356020830152565b6040906101a3190112610232576040519061065f8261037d565b6101a43582526101c4356020830152565b6040906101e3190112610232576040519061068a8261037d565b6101e4358252610204356020830152565b60409061022319011261023257604051906106b58261037d565b610224358252610244356020830152565b60409061026319011261023257604051906106e08261037d565b610264358252610284356020830152565b6040906102a3190112610232576040519061070b8261037d565b6102a43582526102c4356020830152565b6040906102e319011261023257604051906107368261037d565b6102e4358252610304356020830152565b60409061032319011261023257604051906107618261037d565b610324358252610344356020830152565b604090610363190112610232576040519061078c8261037d565b610364358252610384356020830152565b34610232576104e0366003190112610232576107b83661052b565b610480366063190112610232576108f3906107d16103f4565b906107db36610576565b82526107e63661059e565b60208301526107f4366105c6565b6040830152610802366105ef565b60608301526108103661061a565b608083015261081e36610645565b60a083015261082c36610670565b60c083015261083a3661069b565b60e0830152610848366106c6565b610100830152610857366106f1565b6101208301526108663661071c565b61014083015261087536610747565b61016083015261088436610772565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c0830152611479565b005b3461023257602036600319011261023257600f805460ff19166001179055600435601055005b3461023257602080600319360112610232576001600160401b0360043581811161023257366023820112156102325780600401359182116103985760409283519261096b828260051b01856103d3565b80845260248285019160071b8401019236841161023257602401905b838210610997576108f385611671565b8136036080811261023257868051916109af8361039d565b6109b885610517565b83526109c5868601610517565b83870152603f19011261023257608091849188516109e28161037d565b6109ed8a8701610517565b815260608601358482015289820152815201910190610987565b346102325760003660031901126102325760206001600160401b03600d5416604051908152f35b3461023257600036600319011261023257600c546040516001600160a01b039091168152602090f35b34610232576000366003190112610232576020600254604051908152f35b6001600160401b03811161039857601f01601f191660200190565b60408060031936011261023257610aa561021c565b6024356001600160401b038111610232573660238201121561023257806004013590610ad082610a75565b91610add855193846103d3565b80835260209136602483830101116102325781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610c33575b50610c22579080600492610b48611a4c565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610bf3575b5050610bb8578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b600080516020612a7d8339815191528193929303610bda576108f383836128e1565b8351632a87526960e21b81526004810191909152602490fd5b610c13929350803d10610c1b575b610c0b81836103d3565b8101906121cd565b903880610b92565b503d610c01565b845163703e46dd60e11b8152600490fd5b905081600080516020612a7d8339815191525416141538610b36565b34610232576000366003190112610232577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610ca8576020604051600080516020612a7d8339815191528152f35b60405163703e46dd60e11b8152600490fd5b34610232576000366003190112610232576020600154604051908152f35b3461023257600080600319360112610d3757610cf2611a4c565b600c5460ff8160a01c166000146102ed576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b60809060631901126102325760405190610d53826103b8565b6064358252608435602083015260a435604083015260c4356060830152565b34610232576080366003190112610232576020610db5604051610d94816103b8565b6004358152602435838201526044356040820152606435606082015261171b565b604051908152f35b3461023257600080600319360112610d3757610dd7611a4c565b600080516020612a5d83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b34610232576000366003190112610232576020600054604051908152f35b34610232576020366003190112610232576040610e64600435611788565b6104eb82518092602080916001600160401b0381511684520151910152565b3461023257600036600319011261023257600080516020612a5d833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff8216820361023257565b346102325760203660031901126102325760043563ffffffff80821680830361023257610ef7611a4c565b610e108110918215610f41575b5050610f2f57600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610f04565b346102325761012036600319011261023257610f6e3661052b565b610f7736610d3a565b90610f80610eb9565b610f88610237565b90600080516020612a9d83398151915254936001600160401b0360ff8660401c1615951680159081611098575b600114908161108e575b159081611085575b5061107357600080516020612a9d833981519152805467ffffffffffffffff19166001179055610ffb938561104e5761184e565b61100157005b600080516020612a9d833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102e8565b600080516020612a9d833981519152805460ff60401b1916600160401b17905561184e565b60405163f92ee8a960e01b8152600490fd5b90501538610fc7565b303b159150610fbf565b869150610fb5565b3461023257600036600319011261023257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b0390f35b3461023257600036600319011261023257608060045460055460065460075491604051938452602084015260408301526060820152f35b346102325760003660031901126102325760408051906111358261037d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b8381106111805784604081866000838284010152601f80199101168101030190f35b858101830151858201830152820161115e565b346102325760603660031901126102325760406111af3661052b565b6001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55600080f35b3461023257600036600319011261023257602060ff600c5460a01c166040519015158152f35b3461023257600036600319011261023257602063ffffffff600c5460a81c16604051908152f35b3461023257600036600319011261023257600f805460ff19169055005b34610232576000366003190112610232576020600354604051908152f35b3461023257600036600319011261023257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b34610232576040366003190112610232576004356024359060ff600f54166000906000146112fd5750906112e96110db926010549061177b565b115b60405190151581529081906020820190565b91600e549143811180156113d5575b6113625761131a849361176c565b9261133c611330600d546001600160401b031690565b6001600160401b031690565b935b8115611374575b509091925015611362576110db9261135c9161177b565b116112eb565b60405163b0b4387760e01b8152600490fd5b8261139261133061138484610327565b50546001600160401b031690565b11156113bb575b600281106113b6578481146113b6576113b1906121dc565b61133e565b611345565b94505060016113cf61133061138487610327565b94611399565b506003831061130c565b34610232576020366003190112610232576108f36113fb61021c565b611403611a4c565b6119d8565b34610232576000366003190112610232576020600e54604051908152f35b634e487b7160e01b600052600060045260246000fd5b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c169081611589575b50611577578151600a546001600160401b03918183169083161180159190611550575b5061153e577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906114ed60408501936114e78551611a85565b85611f6b565b6114f68461143c565b61150584824216834316612084565b61152a602061151b86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b9050818061156860208701516001600160401b031690565b9260401c1691161115386114ae565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861148b565b634e487b7160e01b600052601160045260246000fd5b906115ca5760028160008093558260018201550155565b611426565b80518210156103625760209160051b010190565b600e54600160401b811015610398578060016116029201600e55610327565b9190916115ca57805182546020808401516fffffffffffffffffffffffffffffffff199092166001600160401b0393841617604092831b67ffffffffffffffff60401b16178555920151805160018501805467ffffffffffffffff191691909316179091556002910151910155565b90600e546000600e55806116ae575b5060005b82518110156116a957806116a361169d600193866115cf565b516115e3565b01611684565b509050565b6003908060030290600382040361171657600e6000527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd908101905b8181106116f8575050611680565b80611710849260026000918281558260018201550155565b016116ea565b61159d565b602081015190606060408201519101516040519160208301938452604083015260608201526060815261174d816103b8565b51902090565b604051906117608261037d565b60006020838281520152565b60001981019190821161171657565b9190820391821161171657565b611790611753565b50600e54906117a66117a18361176c565b610327565b50906117c06113306001809401546001600160401b031690565b81101561183c576117dc611330600d546001600160401b031690565b8381106118015750505060016117f76117a16117fe9361176c565b5001610450565b90565b816118216113308561181285610327565b5001546001600160401b031690565b1161182d5782016117dc565b6117fe93506117f79150610327565b604051631856a49960e21b8152600490fd5b9190926118659061185d612988565b611403612988565b61186d612988565b6001600160401b03908161188884516001600160401b031690565b16158015906119b9575b80156119ad575b80156119a1575b8015611995575b801561198c575b61197a576104219361194961196f926118fe866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b82516004556020830151600555604083015160065560608301516007556119248661143c565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b61196a6119558261171b565b9182600055519161196583600155565b600255565b600355565b804216904316612084565b6040516350dd03f760e11b8152600490fd5b508351156118ae565b506060840151156118a7565b506040840151156118a0565b50602084015115611899565b506119d161133060208501516001600160401b031690565b1515611892565b6001600160a01b03908116908115611a3357600080516020612a5d83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b600080516020612a5d833981519152546001600160a01b03163303611a6d57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000011115611aae57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519060e082018281106001600160401b038211176103985760405260e0368337565b90816020910312610232575180151581036102325790565b6000915b60078310611b4057505050565b600190825181526020809101920192019190611b33565b61046090611b7083825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e0840152608081015190611bce610100928386019060208091805184520151910152565b60a081015191611bee610140938487019060208091805184520151910152565b60c082015192611c0e610180948588019060208091805184520151910152565b60e083015191611c2e6101c0938489019060208091805184520151910152565b830151611c4b610200918289019060208091805184520151910152565b61012084015191611c6c61024093848a019060208091805184520151910152565b84015192611c8a61028094858a019060208091805184520151910152565b611cc561016086015196611cae6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b6105e090611f5861042194969593966102a0610a608401988051855260208101516020860152611d6e6040820151604087019060208091805184520151910152565b6060810151805160808701526020015160a08601526080810151805160c08701526020015160e086015260a0810151611db7610100918288019060208091805184520151910152565b611f2486611ef560c0850151611ddd610140918285019060208091805184520151910152565b611ec660e087015195611e00610180978887019060208091805184520151910152565b870151611e1d6101c0918287019060208091805184520151910152565b611e5a61012089015193611e41610200958689019060208091805184520151910152565b8901516102408097019060208091805184520151910152565b611e978c6102c06101608b015199611e826102809b8c85019060208091805184520151910152565b8b015191019060208091805184520151910152565b6101a088015180516103008e0152602001516103208d015287015180516103408d0152602001516103608c0152565b6101e086015180516103808c0152602001516103a08b015285015180516103c08b0152602001516103e08a0152565b61022084015180516104008a015260200151610420890152830151805161044089015260200151610460880152565b6102608201518051610480880152602001516104a08701528101516104c086015201516104e0840152610500830190611b2f565b0190611b57565b6040513d6000823e3d90fd5b602090611f76612305565b6040611f80611af3565b926001548452611f9a61133082516001600160401b031690565b85850152611fb4611330868301516001600160401b031690565b8285015201516060830152611fdd604051948593849363ce537a7760e01b855260048501611d2c565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af490811561204e5760009161201f575b501561200d57565b6040516309bde33960e01b8152600490fd5b612041915060203d602011612047575b61203981836103d3565b810190611b17565b38612005565b503d61202f565b611f5f565b6001600160401b03918216908216039190821161171657565b6001600160401b038091169081146117165760010190565b90916120f361042193600e548015159081612159575b506120fd575b60406120b660208501516001600160401b031690565b9301516120d36120c4610414565b6001600160401b039095168552565b60208401526120e36120c4610423565b6001600160401b03166020840152565b60408201526115e3565b61211b6121156117a1600d546001600160401b031690565b906115b3565b612154612138612133600d546001600160401b031690565b61206c565b6001600160401b03166001600160401b0319600d541617600d55565b6120a0565b61219c915061216d6117a161217e9261176c565b505460401c6001600160401b031690565b61219661216d6117a1600d546001600160401b031690565b90612053565b6001600160401b036121c36121ba600c5463ffffffff9060a81c1690565b63ffffffff1690565b911610153861209a565b90816020910312610232575190565b8015611716576000190190565b6121f1610430565b906000825260006020830152612205611753565b6040830152612212611753565b606083015261221f611753565b608083015261222c611753565b60a0830152612239611753565b60c0830152612246611753565b60e0830152612253611753565b610100830152612261611753565b61012083015261226f611753565b61014083015261227d611753565b61016083015261228b611753565b610180830152612299611753565b6101a08301526122a7611753565b6101c08301526122b5611753565b6101e08301526122c3611753565b6102008301526122d1611753565b6102208301526122df611753565b6102408301526122ed611753565b610260830152600061028083015260006102a0830152565b61230d6121e9565b906201000082527f103a97f91d3df0aa53d6b2d7f29c4ebf4f323896827a8b8eeba30b7b039ce4a360206004818501527f16026254c01764d8b4fd70dc4cc51a74e0b32ba5f59e2a9e5ef169feeb7ca1ba81604086017f0d76329b8733b0b734ff0f60a40cb4c474064a8c755c1f6cbece5f7ea09d78a88151525101527f037e3a3fa0fefa3c08d50c07d472cba4274fd25c444f369d0d77db93e284f89e81606086017f124a0457892caf44e89d24b4f6eea80a0b1d532a3e59f1178b19e4caca8fbac38151525101527f1eb78f5dcd1e962bc4e33ff6caa12c4161f09ed217cdb213cebbffb63e9e57b481608086017f0319b53e71a0078028b4f021e0d4448d3e849198f25f0fb47f36ae764c06e5938151525101527f06ad874b2a3707a73260072b13799115f94f048d9065f7730d710511dcd945ae8160a086017f0c83be8ca5514d2b5527eec4871feb09b1be54fcc00fec9477fd525c563be9168151525101527f23700dcfa17c63b4681f477ab548eeae1daba4aad95d02a8d8b4619fa6d637f08160c086017f1ea8aa071b4c9346a585bbdbeb45762f4e26c395a015ad67ad732ef431b3c5958151525101527f17d041ace4a15d7297ebdccc0e098c72542e30d9b3cf6fc37edc14025a9edeaa8160e086017f20fb1c68cbebab5356eb21d126b6f596bea1168a768b59e5fbf308d6382829258151525101527f2d6d41d0b5833fb077c78ee3705435ea113a71a6537b6980f58073701224342f8161010086017f168eeff859a5f7b2781aa3c72a2c0a7a58fa9408489e7b0c13ae2feb848f5aa28151525101527f17dc9e1677dad495da48a1d95f94351c2197990789f4168f1e5dd9a31dc3e4d18161012086017f2a3b9d424102b9787e4fbfc217805739be51dbe872181dc40138dc706ce421f98151525101527f0732f969323e1586a21a2f363cd625237adeb6c9e884b5f6afd0fb862fb05e958161014086017f1e002a101f63386609be9700527a3508421d17ce7b127a3b04887704cdbd2dc68151525101527f22b5b0a08cefb39624d5260eac0cb6c63fa3942325134470f05dfcc69660a7418161016086017f0a1f5be7e2dda4ee17525ca86d1e20a1656c8bb3ac88490903d71324abaf39268151525101527f1012a3feba794457614f15434858e921c06088ca254352b6668971005bb59d0c8161018086017f131f2fb07141ec50c2c72b3a2c5bc061ef04d8a451f6093303ece094fd0770178151525101527f0e85da2cabd81a33dd542840af2640c7087dd3aa2ec7267bfc1a6fe6b117b242816101a086017f2a304967c0db314ac3c0a6613e636fd620e3fc3a5e284d28fa2a33e770cf4bb48151525101527f0ca6acfed4a97c404df14351b34dd68181ecdc2a723e80ce4b4cf3a5ff2e2c4b816101c086017f25427d12f7080ca1c010c4a710f1718446ac78ddfbf8fc9024030914c5b7988b8151525101527f079bb1a022509123aeaa6861001db5f4e9b9729c98727adff2aba5d588ae512b816101e086017f2869eb8e7c2c4223b37279eb988b696041ca315cdb14c05f463e73f24a0de6608151525101527f16e014f5b76709d9268e9c375854edb6451a9d895d2d2b4f0f0369566df19dea8161020086017f0821eba1289e0cbcbb088a218b11556d799dfd9748eee76d18c656d2b1f2d0ef8151525101527f274a3b9ef788ddae87b2d74b7d4ee2cdd10eea605fdd631caf43ef705477ce088161022086017f21b4eb6afcdfa42cd369fd0c20fc38cb7e6d8b5e88fbcc488983ea79238ef05a8151525101527f09d97d7a627d8ec24a5fb1495fee2d5cec5cd9e5c5b42c4e4bea06d9e6726bd28161024086017f21af862a9f3c7ffb2f3ef7f0e22bf4678e94296b7fbe0b37516e9b6c5e581a5481515251015261026084017f29e5bd43838ac1cfc29f172286db4a41408faed0d08a9ce4998b2a2e22bd782e8151525101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808301527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a0830152565b90813b1561296757600080516020612a7d83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511561294c57612949916129b7565b50565b50503461295557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff600080516020612a9d8339815191525460401c16156129a557565b604051631afcd79f60e31b8152600490fd5b6000806117fe93602081519101845af43d156129f5573d916129d883610a75565b926129e660405194856103d3565b83523d6000602085013e6129f9565b6060915b90612a205750805115612a0e57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612a53575b612a31575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15612a2956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a0604052306080523480156200001557600080fd5b50604051620034a8380380620034a883398101604081905262000038916200053b565b6200004262000058565b6200004f8383836200010c565b50505062000697565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a95760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001095780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b82516001600160401b031615158062000131575060208301516001600160401b031615155b806200013f57506020820151155b806200014d57506040820151155b806200015b57506060820151155b806200016657508151155b1562000185576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b0390811668010000000000000000026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b199091161790556200022443428562000229565b505050565b600a5415801590620002f75750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b03169081106200026c576200026c620005f4565b6000918252602090912060039091020154600a8054680100000000000000009092046001600160401b031691620002a69060019062000620565b81548110620002b957620002b9620005f4565b6000918252602090912060039091020154620002eb91906801000000000000000090046001600160401b03166200063c565b6001600160401b031610155b156200039557600954600a805490916001600160401b0316908110620003215762000321620005f4565b60009182526020822060039091020180546001600160801b03191681556001810180546001600160401b0319169055600201819055600980546001600160401b0316916200036f8362000666565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516060810182526001600160401b03948516815292841660208085019182528251808401845284820151871681529383015184820152918401928352600a805460018101825560009190915293517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86003909502948501805492519187166001600160801b0319909316929092176801000000000000000091871691909102179055905180517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a9840180546001600160401b031916919095161790935591909101517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aa90910155565b604051606081016001600160401b0381118282101715620004d257634e487b7160e01b600052604160045260246000fd5b60405290565b604051608081016001600160401b0381118282101715620004d257634e487b7160e01b600052604160045260246000fd5b80516001600160401b03811681146200052157600080fd5b919050565b805163ffffffff811681146200052157600080fd5b60008060008385036101008112156200055357600080fd5b60608112156200056257600080fd5b6200056c620004a1565b620005778662000509565b8152620005876020870162000509565b60208201526040868101519082015293506080605f1982011215620005ab57600080fd5b50620005b6620004d8565b60608581015182526080860151602083015260a0860151604083015260c0860151908201529150620005eb60e0850162000526565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156200063657620006366200060a565b92915050565b6001600160401b038281168282160390808211156200065f576200065f6200060a565b5092915050565b60006001600160401b038281166002600160401b031981016200068d576200068d6200060a565b6001019392505050565b608051612de7620006c1600039600081816111d3015281816111fc015261137b0152612de76000f3fe60806040526004361061019c5760003560e01c80638584d23f116100ec578063bd32519a1161008a578063d24d933d11610064578063d24d933d146105c4578063e0303301146105f4578063f2fde38b14610614578063f9e50d191461063457600080fd5b8063bd32519a1461053e578063c23b9e9e1461056f578063c8e5e498146105a857600080fd5b80639baa3cc9116100c65780639baa3cc9146104325780639fdb54a714610452578063ad3cb1cc146104a8578063b5adea3c146104e657600080fd5b80638584d23f146103a85780638da5cb5b146103d557806396c1ca611461041257600080fd5b80632f79889d116101595780634f1ef286116101335780634f1ef2861461034857806352d1902d1461035b57806369cc6a041461037e578063715018a61461039357600080fd5b80632f79889d14610295578063313df7b1146102cd578063426d31941461030557600080fd5b8063013fa5fc146101a157806302b592f3146101c35780630d8e6e2c146101fb5780632063d4f7146102285780632d52aad6146102485780632f5f460014610275575b600080fd5b3480156101ad57600080fd5b506101c16101bc3660046121dd565b610649565b005b3480156101cf57600080fd5b506101e36101de3660046121f8565b610706565b6040516101f293929190612211565b60405180910390f35b34801561020757600080fd5b506040805160018152600060208201819052918101919091526060016101f2565b34801561023457600080fd5b506101c1610243366004612393565b610763565b34801561025457600080fd5b506101c16102633660046121f8565b600b805460ff19166001179055600c55565b34801561028157600080fd5b506101c1610290366004612547565b6108b7565b3480156102a157600080fd5b506009546102b5906001600160401b031681565b6040516001600160401b0390911681526020016101f2565b3480156102d957600080fd5b506008546102ed906001600160a01b031681565b6040516001600160a01b0390911681526020016101f2565b34801561031157600080fd5b506000546001546002546003546103289392919084565b6040805194855260208501939093529183015260608201526080016101f2565b6101c161035636600461265c565b61096d565b34801561036757600080fd5b50610370610988565b6040519081526020016101f2565b34801561038a57600080fd5b506101c16109a5565b34801561039f57600080fd5b506101c1610a15565b3480156103b457600080fd5b506103c86103c33660046121f8565b610a27565b6040516101f29190612701565b3480156103e157600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166102ed565b34801561041e57600080fd5b506101c161042d366004612735565b610b99565b34801561043e57600080fd5b506101c161044d366004612750565b610c0e565b34801561045e57600080fd5b50600654600754610482916001600160401b0380821692600160401b909204169083565b604080516001600160401b039485168152939092166020840152908201526060016101f2565b3480156104b457600080fd5b506104d9604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101f29190612821565b3480156104f257600080fd5b506101c1610501366004612854565b80516006805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905560400151600755565b34801561054a57600080fd5b5060085461055f90600160a01b900460ff1681565b60405190151581526020016101f2565b34801561057b57600080fd5b5060085461059390600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101f2565b3480156105b457600080fd5b506101c1600b805460ff19169055565b3480156105d057600080fd5b50600454600554610482916001600160401b0380821692600160401b909204169083565b34801561060057600080fd5b5061055f61060f366004612870565b610d32565b34801561062057600080fd5b506101c161062f3660046121dd565b610d68565b34801561064057600080fd5b50600a54610370565b610651610dab565b6001600160a01b0381166106785760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036106a75760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a81b0319166001600160a01b0383811691909117600160a01b1791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600a818154811061071657600080fd5b600091825260209182902060039091020180546040805180820190915260018301546001600160401b039081168252600290930154938101939093528181169350600160401b9004169083565b600854600160a01b900460ff16801561078757506008546001600160a01b03163314155b156107a5576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806107de575060065460208301516001600160401b03600160401b9092048216911611155b156107fc5760405163051c46ef60e01b815260040160405180910390fd5b6108098260400151610e06565b6108138282610e76565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561085a434284610f6e565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516108ab91815260200190565b60405180910390a35050565b6108c3600a6000611eb8565b60005b815181101561096957600a8282815181106108e3576108e3612892565b60209081029190910181015182546001818101855560009485529383902082516003909202018054838501516001600160401b03908116600160401b026001600160801b031990921693811693909317178155604090920151805183860180549190931667ffffffffffffffff19919091161790915590910151600290910155016108c6565b5050565b6109756111c8565b61097e8261126d565b61096982826112ae565b6000610992611370565b50600080516020612dbb83398151915290565b6109ad610dab565b600854600160a01b900460ff16156109fa57600880546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610a1d610dab565b610a1360006113b9565b6040805180820190915260008082526020820152600a805490610a4b6001836128be565b81548110610a5b57610a5b612892565b60009182526020909120600160039092020101546001600160401b03168310610a9757604051631856a49960e21b815260040160405180910390fd5b6009546001600160401b03165b81811015610b3d5783600a8281548110610ac057610ac0612892565b60009182526020909120600160039092020101546001600160401b03161115610b3557600a8181548110610af657610af6612892565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b031682526002015491810191909152949350505050565b600101610aa4565b50600a610b4b6001836128be565b81548110610b5b57610b5b612892565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b0316825260020154918101919091529392505050565b610ba1610dab565b610e108163ffffffff161080610bca575060085463ffffffff600160a81b909104811690821611155b15610be8576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a81b0263ffffffff60a81b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610c535750825b90506000826001600160401b03166001148015610c6f5750303b155b905081158015610c7d575080155b15610c9b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cc557845460ff60401b1916600160401b1785555b610cce8661142a565b610cd661143b565b610ce1898989611443565b8315610d2757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600b5460009060ff16610d4e57610d49838361154e565b610d5f565b81600c5484610d5d91906128be565b115b90505b92915050565b610d70610dab565b6001600160a01b038116610d9f57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610da8816113b9565b50565b33610ddd7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a135760405163118cdaa760e01b8152336004820152602401610d96565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806109695760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610d96565b6000610e8061165f565b9050610e8a611ed9565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a083015260005460c08301525163ce537a7760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063ce537a7790610f0a90859085908890600401612ad8565b602060405180830381865af4158015610f27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4b9190612cff565b610f68576040516309bde33960e01b815260040160405180910390fd5b50505050565b600a54158015906110275750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b0316908110610fad57610fad612892565b6000918252602090912060039091020154600a8054600160401b9092046001600160401b031691610fe0906001906128be565b81548110610ff057610ff0612892565b600091825260209091206003909102015461101b9190600160401b90046001600160401b0316612d21565b6001600160401b031610155b156110c057600954600a805490916001600160401b031690811061104d5761104d612892565b60009182526020822060039091020180546001600160801b031916815560018101805467ffffffffffffffff19169055600201819055600980546001600160401b03169161109a83612d48565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516060810182526001600160401b03948516815292841660208085019182528251808401845284820151871681529383015184820152918401928352600a805460018101825560009190915293517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86003909502948501805492519187166001600160801b031990931692909217600160401b91871691909102179055905180517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a98401805467ffffffffffffffff1916919095161790935591909101517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aa90910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061124f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611243600080516020612dbb833981519152546001600160a01b031690565b6001600160a01b031614155b15610a135760405163703e46dd60e11b815260040160405180910390fd5b611275610dab565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d906020016106fb565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611308575060408051601f3d908101601f1916820190925261130591810190612d6e565b60015b61133057604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610d96565b600080516020612dbb833981519152811461136157604051632a87526960e21b815260048101829052602401610d96565b61136b8383611c8f565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a135760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b611432611ce5565b610da881611d2e565b610a13611ce5565b82516001600160401b0316151580611467575060208301516001600160401b031615155b8061147457506020820151155b8061148157506040820151155b8061148e57506060820151155b8061149857508151155b156114b6576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b1990911617905561136b434285610f6e565b600a54600090438411806115625750600381105b156115805760405163b0b4387760e01b815260040160405180910390fd5b6000808061158f6001856128be565b90505b8161162a5786600a82815481106115ab576115ab612892565b60009182526020909120600390910201546001600160401b0316116115fe5760019150600a81815481106115e1576115e1612892565b60009182526020909120600390910201546001600160401b031692505b6002811061162a576009546001600160401b0316811461162a578061162281612d87565b915050611592565b816116485760405163b0b4387760e01b815260040160405180910390fd5b8561165384896128be565b11979650505050505050565b611667611ef7565b620100008152600760208201527f1369aa78dc50135ad756d62c97a64a0edcd30066584168200d9d1facf82ca4f56040820151527f2cf23456d712b06f8e3aa5bf0acc3e46a3d094602a3a2b99d873bba05a4391476020604083015101527f08a35f379d2d2c490a51006697275e4db79b67b4a175c1477e262d29e25e42316060820151527f218828131bb7940ccc88c561b299755af4bf0b71ed930b129e8be0a1218139ea6020606083015101527f23a2172436c1145b36d5bc6d3b31fa1610c73a543ea443918aaa3ee175f9921b6080820151527f2502adf404d62877c310214ae9942e93c40b154d34c024bab48a3ca057e60a116020608083015101527f1bb88ada91ab7734882f7826b81275320081ac485f9cf8bfbc3ba54b6eb4dff360a0820151527f25c74a27e9a3b20114a3a91f31c20f01777e7ed913e0ef949f0285e2e7c2069b602060a083015101527f12b0ce76ac8b0dbd405ebc5dd0bae0f91aed50033c7ea36fc62aaba2b98333dc60c0820151527f185b42af49dd1cbe337a84f74b704172428e754a0bea024ab3eb2f996afb2c47602060c083015101527f21f53ad4538b45438bbf0521446070223920e3df6f9022a64cc16d7f94e85c0860e0820151527f2278ac3dedfdac7feb9725a022497175518eada52c8932fc40e6e75bea889fb8602060e083015101527f0876136f81c16298487bfb1be74d4a3487ec45645ab1d09dc2e5b865d62230df610100820151527f098c641c947ecd798dfd5e1b2fe428024cdf03061a53ff774ea8a9e3de9d3f2b602061010083015101527f15eaac2c6232d2268bf79dc47ed9666f992fb3d96ad23fb21690c21586c5472e610120820151527f0f10f1ffc54881287fda6f200bc85d8245b508d844a974098a41119867b325d0602061012083015101527f0895ceea40b085534e9739ca5442ba48b3a3592affde2b509df74521b47d8ab0610140820151527f2e12ec5800ac92fe2a8e7040bc5b435b9eb71e31380173fa7688bf81fcbba455602061014083015101527f2f5384eb5653e47576efe248e7903f463243414bfed5237dda750df3996bd918610160820151527f1c3cd6b11da8704cdc871ab4fa323d7ee57bd40ce165b49a56d5ef6489cd251a602061016083015101527f13579994957ce1554cc1e5b194fb63c9513707f627414f8442681ae736e36450610180820151527f26c9bdcd96d8e420b12974ade93ad9c312c4185213d2f6831a7c625a18890e95602061018083015101527f0cc70a1d542a9a1535ae5d9201696adc5c99c1bcebd9951dfa8afec79fa0b6446101a0820151527f10b043d9f1869181b96579d6616efc17a5df7b84c4d431d966c9094bf1e8815360206101a083015101527f198a65309d131a43b0ab1c47659d0336cfbf62b27f4727106b4fd971c73dd4036101c0820151527f23df99eac3c1947903b211b800efeb76f47d5e87b7414866543492e8c7798d1a60206101c083015101527f221cc5e47b81ce8dcfa72ef981916a8eddef12fcde59c56c62830c126ebef0de6101e0820151527f231f99340c35c9e09652a6df73c9cec5d88738cb71ff45716fdc9e9e45a4926e60206101e083015101527f2c9f1489fce0f263e03f3e97bf0a72273aafcca9325ff47786adb04a52a6d22c610200820151527f21f66e28f17e01e9fd593e16d022c4eca25bd5db96daec606d97b604cc414838602061020083015101527f2015745604a9571e226bd99043cfaf1f96267cc5de67f497563ff81100531d26610220820151527f206889ff4c58dd08ee1107191a2a5bc5dbae55c49d7d8397801799868d10f805602061022083015101527f21062ab8f8ecd8932b429a1eb8614b1e03db61bff6a5cd2d5d7ea193e90e9927610240820151527f217f9b27b934b88ffe555d682dfe6e8b6d503f86b14bbd96342bc48487a60b27602061024083015101527f1c9eda2d195cb731f903235ead6a4f7c66db49da713ecb27afee076f0eea7154610260820151527f2647c161c00b90258e1cefebb17481f8a5d91b5f9dca626e3e89a9215bcca16a602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611c9882611d36565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611cdd5761136b8282611d9b565b610969611e11565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a1357604051631afcd79f60e31b815260040160405180910390fd5b610d70611ce5565b806001600160a01b03163b600003611d6c57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610d96565b600080516020612dbb83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611db89190612d9e565b600060405180830381855af49150503d8060008114611df3576040519150601f19603f3d011682016040523d82523d6000602084013e611df8565b606091505b5091509150611e08858383611e30565b95945050505050565b3415610a135760405163b398979f60e01b815260040160405180910390fd5b606082611e4557611e4082611e8f565b611e88565b8151158015611e5c57506001600160a01b0384163b155b15611e8557604051639996b31560e01b81526001600160a01b0385166004820152602401610d96565b50805b9392505050565b805115611e9f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825560030290600052602060002090810190610da89190612184565b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611f2e604051806040016040528060008152602001600081525090565b8152602001611f50604051806040016040528060008152602001600081525090565b8152602001611f72604051806040016040528060008152602001600081525090565b8152602001611f94604051806040016040528060008152602001600081525090565b8152602001611fb6604051806040016040528060008152602001600081525090565b8152602001611fd8604051806040016040528060008152602001600081525090565b8152602001611ffa604051806040016040528060008152602001600081525090565b815260200161201c604051806040016040528060008152602001600081525090565b815260200161203e604051806040016040528060008152602001600081525090565b8152602001612060604051806040016040528060008152602001600081525090565b8152602001612082604051806040016040528060008152602001600081525090565b81526020016120a4604051806040016040528060008152602001600081525090565b81526020016120c6604051806040016040528060008152602001600081525090565b81526020016120e8604051806040016040528060008152602001600081525090565b815260200161210a604051806040016040528060008152602001600081525090565b815260200161212c604051806040016040528060008152602001600081525090565b815260200161214e604051806040016040528060008152602001600081525090565b8152602001612170604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b5b808211156121bd5780546001600160801b031916815560018101805467ffffffffffffffff1916905560006002820155600301612185565b5090565b80356001600160a01b03811681146121d857600080fd5b919050565b6000602082840312156121ef57600080fd5b610d5f826121c1565b60006020828403121561220a57600080fd5b5035919050565b6001600160401b0384811682528316602082015260808101612249604083018480516001600160401b03168252602090810151910152565b949350505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561228957612289612251565b60405290565b604080519081016001600160401b038111828210171561228957612289612251565b6040516102e081016001600160401b038111828210171561228957612289612251565b604051601f8201601f191681016001600160401b03811182821017156122fc576122fc612251565b604052919050565b80356001600160401b03811681146121d857600080fd5b60006060828403121561232d57600080fd5b612335612267565b905061234082612304565b815261234e60208301612304565b60208201526040820135604082015292915050565b60006040828403121561237557600080fd5b61237d61228f565b9050813581526020820135602082015292915050565b6000808284036104e08112156123a857600080fd5b6123b2858561231b565b925061048080605f19830112156123c857600080fd5b6123d06122b1565b91506123df8660608701612363565b82526123ee8660a08701612363565b60208301526124008660e08701612363565b604083015261012061241487828801612363565b606084015261016061242888828901612363565b60808501526101a061243c89828a01612363565b60a08601526101e06124508a828b01612363565b60c08701526102206124648b828c01612363565b60e08801526102606124788c828d01612363565b6101008901526102a061248d8d828e01612363565b878a015261249f8d6102e08e01612363565b6101408a01526124b38d6103208e01612363565b868a01526124c58d6103608e01612363565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b6000602080838503121561255a57600080fd5b82356001600160401b038082111561257157600080fd5b818501915085601f83011261258557600080fd5b81358181111561259757612597612251565b6125a5848260051b016122d4565b818152848101925060079190911b8301840190878211156125c557600080fd5b928401925b818410156126515783880360808112156125e45760008081fd5b6125ec612267565b6125f586612304565b8152612602878701612304565b87820152604080603f198401121561261a5760008081fd5b61262261228f565b925061262f818801612304565b83526060870135888401528101919091528352608090930192918401916125ca565b979650505050505050565b6000806040838503121561266f57600080fd5b612678836121c1565b91506020808401356001600160401b038082111561269557600080fd5b818601915086601f8301126126a957600080fd5b8135818111156126bb576126bb612251565b6126cd601f8201601f191685016122d4565b915080825287848285010111156126e357600080fd5b80848401858401376000848284010152508093505050509250929050565b81516001600160401b031681526020808301519082015260408101610d62565b803563ffffffff811681146121d857600080fd5b60006020828403121561274757600080fd5b610d5f82612721565b60008060008084860361012081121561276857600080fd5b612772878761231b565b94506080605f198201121561278657600080fd5b50604051608081018181106001600160401b03821117156127a9576127a9612251565b8060405250606086013581526080860135602082015260a0860135604082015260c08601356060820152809350506127e360e08601612721565b91506127f261010086016121c1565b905092959194509250565b60005b83811015612818578181015183820152602001612800565b50506000910152565b60208152600082518060208401526128408160408501602087016127fd565b601f01601f19169190910160400192915050565b60006060828403121561286657600080fd5b610d5f838361231b565b6000806040838503121561288357600080fd5b50508035926020909101359150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610d6257610d626128a8565b8060005b6007811015610f685781518452602093840193909101906001016128d5565b61290982825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e084015250608081015161010061296c8185018380518252602090810151910152565b60a0830151915061014061298c8186018480518252602090810151910152565b60c084015192506101806129ac8187018580518252602090810151910152565b60e085015193506101c06129cc8188018680518252602090810151910152565b928501519350610200926129ec8785018680518252602090810151910152565b6101208601519450610240612a0d8189018780518252602090810151910152565b92860151945061028092612a2d8885018780518252602090810151910152565b61016087015195506102c0612a4e818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a608201905084518252602085015160208301526040850151612b0b604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612b588185018380518252602090810151910152565b60c08701519150610140612b788186018480518252602090810151910152565b60e08801519250610180612b988187018580518252602090810151910152565b9188015192506101c091612bb88684018580518252602090810151910152565b6101208901519350610200612bd98188018680518252602090810151910152565b91890151935061024091612bf98784018680518252602090810151910152565b6101608a01519450610280612c1a8189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612cf16105008301856128d1565b6122496105e08301846128f4565b600060208284031215612d1157600080fd5b81518015158114611e8857600080fd5b6001600160401b03828116828216039080821115612d4157612d416128a8565b5092915050565b60006001600160401b03808316818103612d6457612d646128a8565b6001019392505050565b600060208284031215612d8057600080fd5b5051919050565b600081612d9657612d966128a8565b506000190190565b60008251612db08184602087016127fd565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json index 3378adb06..829bca4f9 100644 --- a/contract-bindings/artifacts/LightClient_bytecode.json +++ b/contract-bindings/artifacts/LightClient_bytecode.json @@ -1 +1 @@ -"0x60a080604052346100cc57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c166100bd57506001600160401b036002600160401b031982821601610078575b60405161288990816100d282396080518181816109a40152610afc0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1388080610059565b63f92ee8a960e01b8152600490fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063013fa5fc146101d757806302b592f3146101d25780630d8e6e2c146101cd5780632063d4f7146101c85780632f79889d146101c3578063313df7b1146101be578063382b215a146101b95780634f1ef286146101b457806352d1902d146101af57806362827733146101aa57806369cc6a04146101a55780636f96bdae146101a0578063715018a61461019b57806376b6b7cb146101965780638584d23f146101915780638da5cb5b1461018c57806396c1ca61146101875780639baa3cc9146101825780639fdb54a71461017d578063a9a9c9f514610178578063ad3cb1cc14610173578063bd32519a1461016e578063c23b9e9e14610169578063ca6fe85514610164578063d24d933d1461015f578063e03033011461015a578063f2fde38b146101555763f9e50d191461015057600080fd5b611201565b6111d8565b6110d3565b611098565b61107a565b611053565b61102d565b610fb0565b610f79565b610f3a565b610ded565b610d66565b610d1d565b610ce0565b610cc2565b610c57565b610c0c565b610b72565b610b54565b610ae9565b61092a565b6108f1565b6108c8565b6108a1565b610749565b6104ad565b610437565b61020e565b600435906001600160a01b03821682036101f257565b600080fd5b61010435906001600160a01b03821682036101f257565b346101f25760203660031901126101f2576102276101dc565b61022f6116d9565b6001600160a01b039081169081156102bf57600c5490811682146102ad5760ff60a01b19919091166001600160a81b03199190911617600160a01b17600c8190556040516001600160a01b0390911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa460729080602081015b0390a1005b60405163a863aec960e01b8152600490fd5b60405163e6c4247b60e01b8152600490fd5b634e487b7160e01b600052603260045260246000fd5b600e5481101561032257600390600e600052027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0190600090565b6102d1565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761035857604052565b610327565b606081019081106001600160401b0382111761035857604052565b608081019081106001600160401b0382111761035857604052565b90601f801991011681019081106001600160401b0382111761035857604052565b604051906102e082018281106001600160401b0382111761035857604052565b604051906103e18261033d565b565b604051906103e18261035d565b604051906102c082018281106001600160401b0382111761035857604052565b9060405161041d8161033d565b6020600182946001600160401b0381541684520154910152565b346101f25760203660031901126101f257600435600e548110156101f2576104606080916102e7565b506104ab81549161047b60016001600160401b039201610410565b9060405193818116855260401c1660208401526040830190602080916001600160401b0381511684520151910152565bf35b346101f25760003660031901126101f2576060604051600181526000602082015260006040820152f35b60609060031901126101f257604051906104f08261035d565b816001600160401b0360043581811681036101f257825260243590811681036101f25760208201526040604435910152565b60409060631901126101f2576040519061053b8261033d565b60643582526084356020830152565b60409060a31901126101f257604051906105638261033d565b60a435825260c4356020830152565b60409060e31901126101f2576040519061058b8261033d565b60e4358252610104356020830152565b6040906101231901126101f257604051906105b58261033d565b610124358252610144356020830152565b6040906101631901126101f257604051906105e08261033d565b610164358252610184356020830152565b6040906101a31901126101f2576040519061060b8261033d565b6101a43582526101c4356020830152565b6040906101e31901126101f257604051906106368261033d565b6101e4358252610204356020830152565b6040906102231901126101f257604051906106618261033d565b610224358252610244356020830152565b6040906102631901126101f2576040519061068c8261033d565b610264358252610284356020830152565b6040906102a31901126101f257604051906106b78261033d565b6102a43582526102c4356020830152565b6040906102e31901126101f257604051906106e28261033d565b6102e4358252610304356020830152565b6040906103231901126101f2576040519061070d8261033d565b610324358252610344356020830152565b6040906103631901126101f257604051906107388261033d565b610364358252610384356020830152565b346101f2576104e03660031901126101f257610764366104d7565b6104803660631901126101f25761089f9061077d6103b4565b9061078736610522565b82526107923661054a565b60208301526107a036610572565b60408301526107ae3661059b565b60608301526107bc366105c6565b60808301526107ca366105f1565b60a08301526107d83661061c565b60c08301526107e636610647565b60e08301526107f436610672565b6101008301526108033661069d565b610120830152610812366106c8565b610140830152610821366106f3565b6101608301526108303661071e565b6101808301526103a4356101a08301526103c4356101c08301526103e4356101e083015261040435610200830152610424356102208301526104443561024083015261046435610260830152610484356102808301526104a4356102a08301526104c4356102c083015261125c565b005b346101f25760003660031901126101f25760206001600160401b03600d5416604051908152f35b346101f25760003660031901126101f257600c546040516001600160a01b039091168152602090f35b346101f25760003660031901126101f2576020600254604051908152f35b6001600160401b03811161035857601f01601f191660200190565b6040806003193601126101f25761093f6101dc565b6024356001600160401b0381116101f257366023820112156101f25780600401359061096a8261090f565b9161097785519384610393565b80835260209136602483830101116101f25781600092602485930183870137840101526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114908115610acd575b50610abc5790806004926109e26116d9565b7ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d82885192881692838152a186516352d1902d60e01b815293849182905afa918291600093610a8d575b5050610a52578351634c9c8ce360e01b81526001600160a01b0384166004820152602490fd5b60008051602061283d8339815191528193929303610a745761089f83836126a1565b8351632a87526960e21b81526004810191909152602490fd5b610aad929350803d10610ab5575b610aa58183610393565b810190611f9a565b903880610a2c565b503d610a9b565b845163703e46dd60e11b8152600490fd5b90508160008051602061283d83398151915254161415386109d0565b346101f25760003660031901126101f2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003610b4257602060405160008051602061283d8339815191528152f35b60405163703e46dd60e11b8152600490fd5b346101f25760003660031901126101f2576020600154604051908152f35b346101f257600080600319360112610bd157610b8c6116d9565b600c5460ff8160a01c166000146102ad576001600160a81b031916600c557f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c024508180a180f35b80fd5b60809060631901126101f25760405190610bed82610378565b6064358252608435602083015260a435604083015260c4356060830152565b346101f25760803660031901126101f2576020610c4f604051610c2e81610378565b60043581526024358382015260443560408201526064356060820152611380565b604051908152f35b346101f257600080600319360112610bd157610c716116d9565b60008051602061281d83398151915280546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b346101f25760003660031901126101f2576020600054604051908152f35b346101f25760203660031901126101f2576040610cfe600435611408565b6104ab82518092602080916001600160401b0381511684520151910152565b346101f25760003660031901126101f25760008051602061281d833981519152546040516001600160a01b039091168152602090f35b60e4359063ffffffff821682036101f257565b346101f25760203660031901126101f25760043563ffffffff8082168083036101f257610d916116d9565b610e108110918215610ddb575b5050610dc957600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055005b6040516307a5077760e51b8152600490fd5b600c5460a81c16101590503880610d9e565b346101f2576101203660031901126101f257610e08366104d7565b610e1136610bd4565b90610e1a610d53565b610e226101f7565b9060008051602061285d83398151915254936001600160401b0360ff8660401c1615951680159081610f32575b6001149081610f28575b159081610f1f575b50610f0d5760008051602061285d833981519152805467ffffffffffffffff19166001179055610e959385610ee8576114ce565b610e9b57005b60008051602061285d833981519152805460ff60401b19169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081016102a8565b60008051602061285d833981519152805460ff60401b1916600160401b1790556114ce565b60405163f92ee8a960e01b8152600490fd5b90501538610e61565b303b159150610e59565b869150610e4f565b346101f25760003660031901126101f257600a54600b54604080516001600160401b03808516825293821c9093166020840152820152606090f35b0390f35b346101f25760003660031901126101f257608060045460055460065460075491604051938452602084015260408301526060820152f35b346101f25760003660031901126101f2576040805190610fcf8261033d565b60058252602090640352e302e360dc1b6020840152604051916020835283519182602085015260005b83811061101a5784604081866000838284010152601f80199101168101030190f35b8581018301518582018301528201610ff8565b346101f25760003660031901126101f257602060ff600c5460a01c166040519015158152f35b346101f25760003660031901126101f257602063ffffffff600c5460a81c16604051908152f35b346101f25760003660031901126101f2576020600354604051908152f35b346101f25760003660031901126101f257600854600954604080516001600160401b03808516825293821c9093166020840152820152606090f35b346101f25760403660031901126101f257600435600e5443821180156111ce575b61115b576000916111066000926113e7565b9161112861111c600d546001600160401b031690565b6001600160401b031690565b925b811561116d575b509091501561115b5761114a610f7592602435926113fb565b604051911081529081906020820190565b60405163b0b4387760e01b8152600490fd5b8261118b61111c61117d846102e7565b50546001600160401b031690565b11156111b4575b600281106111af578381146111af576111aa90611658565b61112a565b611131565b93505060016111c861111c61117d866102e7565b93611192565b50600381106110f4565b346101f25760203660031901126101f25761089f6111f46101dc565b6111fc6116d9565b611665565b346101f25760003660031901126101f2576020600e54604051908152f35b6040906001600160401b03815116600a549067ffffffffffffffff60401b6020840151851b16916001600160801b0319161717600a550151600b55565b90600c5460ff8160a01c16908161136c575b5061135a578151600a546001600160401b03918183169083161180159190611333575b50611321577fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6906112d060408501936112ca8551611712565b85611bf8565b6112d98461121f565b6112e884824216834316611e51565b61130d60206112fe86516001600160401b031690565b9501516001600160401b031690565b9251604051908152928116931691602090a3565b60405163051c46ef60e01b8152600490fd5b9050818061134b60208701516001600160401b031690565b9260401c169116111538611291565b6040516301474c8f60e71b8152600490fd5b6001600160a01b031633141590503861126e565b60208101519060606040820151910151604051916020830193845260408301526060820152606081526113b281610378565b51902090565b604051906113c58261033d565b60006020838281520152565b634e487b7160e01b600052601160045260246000fd5b6000198101919082116113f657565b6113d1565b919082039182116113f657565b6114106113b8565b50600e5490611426611421836113e7565b6102e7565b509061144061111c6001809401546001600160401b031690565b8110156114bc5761145c61111c600d546001600160401b031690565b83811061148157505050600161147761142161147e936113e7565b5001610410565b90565b816114a161111c85611492856102e7565b5001546001600160401b031690565b116114ad57820161145c565b61147e935061147791506102e7565b604051631856a49960e21b8152600490fd5b9190926114e5906114dd612748565b6111fc612748565b6114ed612748565b6001600160401b03908161150884516001600160401b031690565b1615801590611639575b801561162d575b8015611621575b8015611615575b801561160c575b6115fa576103e1936115c96115ef9261157e866040906001600160401b038151166008549067ffffffffffffffff60401b6020840151851b16916001600160801b03191617176008550151600955565b82516004556020830151600555604083015160065560608301516007556115a48661121f565b600c805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b6115ea6115d582611380565b918260005551916115e583600155565b600255565b600355565b804216904316611e51565b6040516350dd03f760e11b8152600490fd5b5083511561152e565b50606084015115611527565b50604084015115611520565b50602084015115611519565b5061165161111c60208501516001600160401b031690565b1515611512565b80156113f6576000190190565b6001600160a01b039081169081156116c05760008051602061281d83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b604051631e4fbdf760e01b815260006004820152602490fd5b60008051602061281d833981519152546001600160a01b031633036116fa57565b60405163118cdaa760e01b8152336004820152602490fd5b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561173b57565b60405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606490fd5b6040519060e082018281106001600160401b038211176103585760405260e0368337565b908160209103126101f2575180151581036101f25790565b6000915b600783106117cd57505050565b6001908251815260208091019201920191906117c0565b610460906117fd83825160208091805184520151910152565b60208181015180516040860152015160608401526040810151805160808501526020015160a08401526060810151805160c08501526020015160e084015260808101519061185b610100928386019060208091805184520151910152565b60a08101519161187b610140938487019060208091805184520151910152565b60c08201519261189b610180948588019060208091805184520151910152565b60e0830151916118bb6101c0938489019060208091805184520151910152565b8301516118d8610200918289019060208091805184520151910152565b610120840151916118f961024093848a019060208091805184520151910152565b8401519261191761028094858a019060208091805184520151910152565b6119526101608601519661193b6102c098898c019060208091805184520151910152565b86015180516103008b0152602001516103208a0152565b6101a08501516103408901528401516103608801526101e08401516103808801528301516103a08701526102208301516103c08701528201516103e08601526102608201516104008601528101516104208501526102a08101516104408501520151910152565b6105e090611be56103e194969593966102a0610a6084019880518552602081015160208601526119fb6040820151604087019060208091805184520151910152565b6060810151805160808701526020015160a08601526080810151805160c08701526020015160e086015260a0810151611a44610100918288019060208091805184520151910152565b611bb186611b8260c0850151611a6a610140918285019060208091805184520151910152565b611b5360e087015195611a8d610180978887019060208091805184520151910152565b870151611aaa6101c0918287019060208091805184520151910152565b611ae761012089015193611ace610200958689019060208091805184520151910152565b8901516102408097019060208091805184520151910152565b611b248c6102c06101608b015199611b0f6102809b8c85019060208091805184520151910152565b8b015191019060208091805184520151910152565b6101a088015180516103008e0152602001516103208d015287015180516103408d0152602001516103608c0152565b6101e086015180516103808c0152602001516103a08b015285015180516103c08b0152602001516103e08a0152565b61022084015180516104008a015260200151610420890152830151805161044089015260200151610460880152565b6102608201518051610480880152602001516104a08701528101516104c086015201516104e08401526105008301906117bc565b01906117e4565b6040513d6000823e3d90fd5b602090611c036120c5565b6040611c0d611780565b926001548452611c2761111c82516001600160401b031690565b85850152611c4161111c868301516001600160401b031690565b8285015201516060830152611c6a604051948593849363ce537a7760e01b8552600485016119b9565b038173__$5c5c07cf4f55be9472c2b47d897172e765$__5af4908115611cdb57600091611cac575b5015611c9a57565b6040516309bde33960e01b8152600490fd5b611cce915060203d602011611cd4575b611cc68183610393565b8101906117a4565b38611c92565b503d611cbc565b611bec565b6001600160401b0391821690821603919082116113f657565b90611d105760028160008093558260018201550155565b634e487b7160e01b600052600060045260246000fd5b6001600160401b038091169081146113f65760010190565b600e54600160401b811015610358576001810180600e5581101561032257602060037fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff92600e6000520292611e4a6040857fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01926001600160401b0393611dde8583511682906001600160401b03166001600160401b0319825416179055565b8582015167ffffffffffffffff60401b825491851b169067ffffffffffffffff60401b19161790550151918251167fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe8601906001600160401b03166001600160401b0319825416179055565b0151910155565b9091611ec06103e193600e548015159081611f26575b50611eca575b6040611e8360208501516001600160401b031690565b930151611ea0611e916103d4565b6001600160401b039095168552565b6020840152611eb0611e916103e3565b6001600160401b03166020840152565b6040820152611d3e565b611ee8611ee2611421600d546001600160401b031690565b90611cf9565b611f21611f05611f00600d546001600160401b031690565b611d26565b6001600160401b03166001600160401b0319600d541617600d55565b611e6d565b611f699150611f3a611421611f4b926113e7565b505460401c6001600160401b031690565b611f63611f3a611421600d546001600160401b031690565b90611ce0565b6001600160401b03611f90611f87600c5463ffffffff9060a81c1690565b63ffffffff1690565b9116101538611e67565b908160209103126101f2575190565b611fb16103f0565b906000825260006020830152611fc56113b8565b6040830152611fd26113b8565b6060830152611fdf6113b8565b6080830152611fec6113b8565b60a0830152611ff96113b8565b60c08301526120066113b8565b60e08301526120136113b8565b6101008301526120216113b8565b61012083015261202f6113b8565b61014083015261203d6113b8565b61016083015261204b6113b8565b6101808301526120596113b8565b6101a08301526120676113b8565b6101c08301526120756113b8565b6101e08301526120836113b8565b6102008301526120916113b8565b61022083015261209f6113b8565b6102408301526120ad6113b8565b610260830152600061028083015260006102a0830152565b6120cd611fa9565b906210000082527f16183280aff7c1ca4982013d14907ffc00ad9aaf62e3060c60fd5650310294fe60206004818501527f20f8ed3de77af84f07ab14e0e3a6af9609d179bd825068fca7f5d10de9cec1d081604086017f2594eb9237b7cc992b0aff6541c0b4f6dbaa9235366de2e5e08eb7ed415d6f5e8151525101527f1fcf82acfe5e7b819ff344ac2a25dfbaa3fb12fb03696ab24f52210896a976f581606086017f23662f2d65f6af786069b0feb61ab3d9cc2dd3e67ccbf422a223c7fa55f44ee68151525101527f1181da971e46128143c9f733b3dfb9ccfed793481cec98e4576d550342a4d60c81608086017f1e4ba740bce3f5c1b696a6b838a9267e00de6cb86fb635db305eeb4874f0f9268151525101527f0de74676a34741220f476bae49ec09f859d46c7f8c63cc5f76d494a09e4484138160a086017f1d31ad0a55e8f8c6f922b0841d4ed606339ed063e86932328c202647a70ed7cd8151525101527f01d88d68cb48acf2ebd1d69e0fc38d5fb188c1c87792d9debfde6e48b52135628160c086017f1f0a8ad12bd711b801c05a04926676385733cd886b30414dc8a9455f5ee1ccf08151525101527f10b1aa078508c19c234d1c48764ecea93aeeb26627aa9169b3c3f8dd9722a6468160e086017f2d6bd0f4fd66b3f1183ef8e83be754d47b3f2108d5583c80d669f65fa8a6c6888151525101527f15a424f82f95e588a93ce0eb93369b35291fd603e490dece7bab07e181d9b9558161010086017f29e8cb6f4a4499852ba317b86e5fa40e53476c42e37c1a87d9a2ad21625d54868151525101527f1b1a9dce8744e1accfa8ee724b09cad428a70cbd569efe2b46e927565f6479468161012086017f210a0dcd7c615d5963ba67f22090dd66843d3757b9a17d0729971812c03345798151525101527f1ec91c705e7482be0f5768f598869716b93e1aba284ab207a01acaf5b90875778161014086017f1af7507105277eafd94dc06bd01521a9fa91f7743cfcd896c2289df0696e2e578151525101527f0d9eb0e9d5a0f218673c5b8883b1bc65064c7c57ddf370b534da88e737e6f9998161016086017f0a870d4d26887f446f5d0cbace89ea87592732161a7adf4fed3c1bcd72d56b048151525101527f266dd2c45a9d95cd00c622c047eacb1e29c90c0ea7ab708406fe754ce27656118161018086017f236a6ee8b0a5bfcbe26f5609cc2f6a8a13d23dfd88b7c47c590b44a0fbc39fab8151525101527f243ae2d376579c21c88e353b3891b6f670ab016dbcae7a8cad2d010b01d8813e816101a086017f2dee8bf87e82bcee84ceb104d6cb4c9bec614129c7f9c1f8ccd1408293cc64508151525101527f08b7e3925fa4cfb08693c23f91307f6332f8c2d00d10fe22007e8f557f12d789816101c086017f17596bdefddb079bb27dcae8142e341f1a248b03ea686331fad0851af951f67d8151525101527f0abaa16f6ca8f4eb2effd49b0d1faea26a038bc6e138383882e6dfc86c729450816101e086017f0acf5e529d7177887ba6dc79a167a88cd6b7c11d863088959e76d07bb91cf5488151525101527f2eb99c6343db7834e1fc40625ac8b70cd64e8036b1e3d20d72f00efef151ec958161020086017f0ccffd9ebf84a35352134e5d30ac279f3259373b8894d7e8abe5d2a45c1d1ea28151525101527f0638a68ba70ce87098fccf3bf2b8d0c3558af5a1a349fc5081fce5684b3bafed8161022086017f0e9af80a46903c8d29d9593683381c704192d777d9736c0648401b2ff6e6756d8151525101527f0f1c97e91c16e627c4329e2f5c0c03e9980c6c0748b238d3ad661237c7c129938161024086017f10ca7993f6831bdcf2471213babb2e37f21decaeb08ff2cb817a28d6095f2a1681515251015261026084017f28b88da6722afe7e95789cb5fd5a74c97977d73c88d4eebd7bb45368807605718151525101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808301527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a0830152565b90813b156127275760008051602061283d83398151915280546001600160a01b0319166001600160a01b0384169081179091557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511561270c5761270991612777565b50565b50503461271557565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b60ff60008051602061285d8339815191525460401c161561276557565b604051631afcd79f60e31b8152600490fd5b60008061147e93602081519101845af43d156127b5573d916127988361090f565b926127a66040519485610393565b83523d6000602085013e6127b9565b6060915b906127e057508051156127ce57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580612813575b6127f1575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b156127e956fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a164736f6c6343000817000a" +"0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000da565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000775760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612a4d62000104600039600081816110e10152818161110a01526112890152612a4d6000f3fe6080604052600436106101405760003560e01c80638584d23f116100b6578063bd32519a1161006f578063bd32519a1461043d578063c23b9e9e1461046e578063d24d933d146104a7578063e0303301146104d7578063f2fde38b146104f7578063f9e50d191461051757600080fd5b80638584d23f146102ff5780638da5cb5b1461032c57806396c1ca61146103695780639baa3cc9146103895780639fdb54a7146103a9578063ad3cb1cc146103ff57600080fd5b8063313df7b111610108578063313df7b114610224578063426d31941461025c5780634f1ef2861461029f57806352d1902d146102b257806369cc6a04146102d5578063715018a6146102ea57600080fd5b8063013fa5fc1461014557806302b592f3146101675780630d8e6e2c1461019f5780632063d4f7146101cc5780632f79889d146101ec575b600080fd5b34801561015157600080fd5b50610165610160366004611f7b565b61052c565b005b34801561017357600080fd5b50610187610182366004611f96565b6105e9565b60405161019693929190611faf565b60405180910390f35b3480156101ab57600080fd5b50604080516001815260006020820181905291810191909152606001610196565b3480156101d857600080fd5b506101656101e736600461212a565b610646565b3480156101f857600080fd5b5060095461020c906001600160401b031681565b6040516001600160401b039091168152602001610196565b34801561023057600080fd5b50600854610244906001600160a01b031681565b6040516001600160a01b039091168152602001610196565b34801561026857600080fd5b5060005460015460025460035461027f9392919084565b604080519485526020850193909352918301526060820152608001610196565b6101656102ad3660046122de565b61079a565b3480156102be57600080fd5b506102c76107b9565b604051908152602001610196565b3480156102e157600080fd5b506101656107d6565b3480156102f657600080fd5b50610165610846565b34801561030b57600080fd5b5061031f61031a366004611f96565b610858565b6040516101969190612383565b34801561033857600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610244565b34801561037557600080fd5b506101656103843660046123b7565b6109ca565b34801561039557600080fd5b506101656103a43660046123d2565b610a3f565b3480156103b557600080fd5b506006546007546103d9916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610196565b34801561040b57600080fd5b50610430604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161019691906124a3565b34801561044957600080fd5b5060085461045e90600160a01b900460ff1681565b6040519015158152602001610196565b34801561047a57600080fd5b5060085461049290600160a81b900463ffffffff1681565b60405163ffffffff9091168152602001610196565b3480156104b357600080fd5b506004546005546103d9916001600160401b0380821692600160401b909204169083565b3480156104e357600080fd5b5061045e6104f23660046124d6565b610b63565b34801561050357600080fd5b50610165610512366004611f7b565b610c76565b34801561052357600080fd5b50600a546102c7565b610534610cb9565b6001600160a01b03811661055b5760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b039081169082160361058a5760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a81b0319166001600160a01b0383811691909117600160a01b1791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600a81815481106105f957600080fd5b600091825260209182902060039091020180546040805180820190915260018301546001600160401b039081168252600290930154938101939093528181169350600160401b9004169083565b600854600160a01b900460ff16801561066a57506008546001600160a01b03163314155b15610688576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806106c1575060065460208301516001600160401b03600160401b9092048216911611155b156106df5760405163051c46ef60e01b815260040160405180910390fd5b6106ec8260400151610d14565b6106f68282610d84565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561073d434284610e7c565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6846040015160405161078e91815260200190565b60405180910390a35050565b6107a26110d6565b6107ab8261117b565b6107b582826111bc565b5050565b60006107c361127e565b50600080516020612a2183398151915290565b6107de610cb9565b600854600160a01b900460ff161561082b57600880546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b61084e610cb9565b61084460006112c7565b6040805180820190915260008082526020820152600a80549061087c60018361250e565b8154811061088c5761088c612521565b60009182526020909120600160039092020101546001600160401b031683106108c857604051631856a49960e21b815260040160405180910390fd5b6009546001600160401b03165b8181101561096e5783600a82815481106108f1576108f1612521565b60009182526020909120600160039092020101546001600160401b0316111561096657600a818154811061092757610927612521565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b031682526002015491810191909152949350505050565b6001016108d5565b50600a61097c60018361250e565b8154811061098c5761098c612521565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b0316825260020154918101919091529392505050565b6109d2610cb9565b610e108163ffffffff1610806109fb575060085463ffffffff600160a81b909104811690821611155b15610a19576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a81b0263ffffffff60a81b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610a845750825b90506000826001600160401b03166001148015610aa05750303b155b905081158015610aae575080155b15610acc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610af657845460ff60401b1916600160401b1785555b610aff86611338565b610b07611349565b610b12898989611351565b8315610b5857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600a5460009043841180610b775750600381105b15610b955760405163b0b4387760e01b815260040160405180910390fd5b60008080610ba460018561250e565b90505b81610c3f5786600a8281548110610bc057610bc0612521565b60009182526020909120600390910201546001600160401b031611610c135760019150600a8181548110610bf657610bf6612521565b60009182526020909120600390910201546001600160401b031692505b60028110610c3f576009546001600160401b03168114610c3f5780610c3781612537565b915050610ba7565b81610c5d5760405163b0b4387760e01b815260040160405180910390fd5b85610c68848961250e565b119450505050505b92915050565b610c7e610cb9565b6001600160a01b038116610cad57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610cb6816112c7565b50565b33610ceb7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108445760405163118cdaa760e01b8152336004820152602401610ca4565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806107b55760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610ca4565b6000610d8e61145c565b9050610d98611cb4565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a083015260005460c08301525163ce537a7760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063ce537a7790610e1890859085908890600401612755565b602060405180830381865af4158015610e35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e59919061297c565b610e76576040516309bde33960e01b815260040160405180910390fd5b50505050565b600a5415801590610f355750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b0316908110610ebb57610ebb612521565b6000918252602090912060039091020154600a8054600160401b9092046001600160401b031691610eee9060019061250e565b81548110610efe57610efe612521565b6000918252602090912060039091020154610f299190600160401b90046001600160401b031661299e565b6001600160401b031610155b15610fce57600954600a805490916001600160401b0316908110610f5b57610f5b612521565b60009182526020822060039091020180546001600160801b031916815560018101805467ffffffffffffffff19169055600201819055600980546001600160401b031691610fa8836129c5565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516060810182526001600160401b03948516815292841660208085019182528251808401845284820151871681529383015184820152918401928352600a805460018101825560009190915293517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86003909502948501805492519187166001600160801b031990931692909217600160401b91871691909102179055905180517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a98401805467ffffffffffffffff1916919095161790935591909101517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aa90910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061115d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611151600080516020612a21833981519152546001600160a01b031690565b6001600160a01b031614155b156108445760405163703e46dd60e11b815260040160405180910390fd5b611183610cb9565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d906020016105de565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611216575060408051601f3d908101601f19168201909252611213918101906129eb565b60015b61123e57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ca4565b600080516020612a21833981519152811461126f57604051632a87526960e21b815260048101829052602401610ca4565b6112798383611a8b565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108445760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b611340611ae1565b610cb681611b2a565b610844611ae1565b82516001600160401b0316151580611375575060208301516001600160401b031615155b8061138257506020820151155b8061138f57506040820151155b8061139c57506060820151155b806113a657508151155b156113c4576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b19909116179055611279434285610e7c565b611464611cd2565b621000008152600760208201527f23783d0e9777b7af65fbf849da7edb75e74b1eaf503e025d7f2f7f80991befa26040820151527f2a4e2fe8adfa53f468525582d5184c4c70bbdb946c21f216418a9879705e54a76020604083015101527f0624b2c1e77f24afceaf39451743b9fa80d5853fca7ba00389c675650774009b6060820151527f250d7719e94ca2df00dfe327938f5a8d4d837779b99837ca777a53d39127b1796020606083015101527f0dc09515152eaea66d0db2f571cc995e369d26fe647394f10db5398c917519dc6080820151527f1273144d6cec2c4a68b24a149379c0f5592bb7fbddbe32fa171919950ca404cb6020608083015101527f119521bb68caec216e2f05eeb466fb3abfe1f39baf7fe7cb392ea057b6a2d9bf60a0820151527f2d52adeaba8045e53ab526fe9982d0ea452def6b3ea0253d27a19ef3b46e8428602060a083015101527f16c3b5b217d302975a920d13374524d7a52e4a50fd7fb930842271ebf4a84efd60c0820151527f200788916b907b196972bde304318e885a2521514b2db5e4a11899c51204f089602060c083015101527f1127581afe753defca9aef12e7332db9978a200b1699ce3888c0f3aea6111dc360e0820151527f0881e13f00723be1a04872ed02b2d078c31e80feaf27724e262ce97c2cb0bb1d602060e083015101527f1482a3a6bb91d6483d153683e2404f2f5546e0e895530fdf132091498406e3de610100820151527efa52db3d52d905ead1248102f3a80a43a90d8400c68f60a62c543c417b2f4b602061010083015101527f0a57dadd4a55199525ac6ac6fabc87a4cccfdc98142bcef9dbf47de00ecc5164610120820151527f18d95abd9b8e12c36936aa218cfff582548a6bbff25c338c2006eaeb1fe5b696602061012083015101527f2bc40e91dd169b8bc143a02952a1b6c6e627bfeb7a2bbe5078e14123f3c54c1c610140820151527f108d65a20c579b6d9883275eb6889fc3f5fc79735ca9f611a13b67daa2fbc8d0602061014083015101527f21bc1f86d0608e5f0626b467ee6f8282b619223f60a7acb0fc63ba7bdaf783be610160820151527f05ef3282f8eef01515fb9a8a7d6ca06b8b007d1d512403efb268fb03ce5f09e9602061016083015101527f2cab66c1cb5a83869e73ac34fbe467486999babd541d9010ee9a804806eee4ef610180820151527f2db1982419c5a4a17593acff9535fa967683d75c8aec01319b64b84aada2ad84602061018083015101527f2c38667c6c7eb868bdd30c34dd3f4b84d9b9b1a27d7867b364c8b7831423e9086101a0820151527f2b2cb4044dd51165c48138219d51cf8d1689f91ed3eeefead6e055eb488a2ce260206101a083015101527f2d48e54703011df2c74a14dafde3af4fd83ec71875d8ddc3554658640cc955016101c0820151527f243a99d80d32eb5408b59d5b08302bede070d3fb0a8efe2f2262f865bffb4d0d60206101c083015101527f0455d2325bf6269a66f07d838f55f36947a3cd9b87edd8480bced95cbb45cc116101e0820151527f0f66d9085a6ed60b838179987e240992bff4c0516ccf6ccde4a1ca94ce8b986460206101e083015101527f2bac0d23c8585d1487ec611b5effc97e5852fea43a7cba36ccdd2c207931f394610200820151527f1860b54e01a06aea5adb4b13bf5baebab92b736807a3a89ff2040992b06ee6ec602061020083015101527f0c0bfa1c2fc6f8ed01233d5168db1e1dfe725504f032f669f50a92ae77c72906610220820151527f0d741e124c7d1069b8a400cbcdcfd90128a533901ad4de1e037fe72984dc34cf602061022083015101527f01cfed30085c9efce04668205794aa39b1a8ee591234b4c77a22f8c26d899e05610240820151527f2ab68ac82d36cedb647d14a5b0035e8c9a0be84780b7bae1133a27a880966ed1602061024083015101527f072e1d50f8b5cf8d574b3847276477d95bbd5116351000841f728da44f4043b5610260820151527f23f8ea6eacd0876d57220f57eabacbe76a2323411663731a251d5dca36f1b59f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611a9482611b32565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611ad9576112798282611b97565b6107b5611c0d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661084457604051631afcd79f60e31b815260040160405180910390fd5b610c7e611ae1565b806001600160a01b03163b600003611b6857604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ca4565b600080516020612a2183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611bb49190612a04565b600060405180830381855af49150503d8060008114611bef576040519150601f19603f3d011682016040523d82523d6000602084013e611bf4565b606091505b5091509150611c04858383611c2c565b95945050505050565b34156108445760405163b398979f60e01b815260040160405180910390fd5b606082611c4157611c3c82611c8b565b611c84565b8151158015611c5857506001600160a01b0384163b155b15611c8157604051639996b31560e01b81526001600160a01b0385166004820152602401610ca4565b50805b9392505050565b805115611c9b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611d09604051806040016040528060008152602001600081525090565b8152602001611d2b604051806040016040528060008152602001600081525090565b8152602001611d4d604051806040016040528060008152602001600081525090565b8152602001611d6f604051806040016040528060008152602001600081525090565b8152602001611d91604051806040016040528060008152602001600081525090565b8152602001611db3604051806040016040528060008152602001600081525090565b8152602001611dd5604051806040016040528060008152602001600081525090565b8152602001611df7604051806040016040528060008152602001600081525090565b8152602001611e19604051806040016040528060008152602001600081525090565b8152602001611e3b604051806040016040528060008152602001600081525090565b8152602001611e5d604051806040016040528060008152602001600081525090565b8152602001611e7f604051806040016040528060008152602001600081525090565b8152602001611ea1604051806040016040528060008152602001600081525090565b8152602001611ec3604051806040016040528060008152602001600081525090565b8152602001611ee5604051806040016040528060008152602001600081525090565b8152602001611f07604051806040016040528060008152602001600081525090565b8152602001611f29604051806040016040528060008152602001600081525090565b8152602001611f4b604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b80356001600160a01b0381168114611f7657600080fd5b919050565b600060208284031215611f8d57600080fd5b611c8482611f5f565b600060208284031215611fa857600080fd5b5035919050565b6001600160401b0384811682528316602082015260808101611fe7604083018480516001600160401b03168252602090810151910152565b949350505050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b038111828210171561202857612028611fef565b60405290565b604051601f8201601f191681016001600160401b038111828210171561205657612056611fef565b604052919050565b80356001600160401b0381168114611f7657600080fd5b60006060828403121561208757600080fd5b604051606081018181106001600160401b03821117156120a9576120a9611fef565b6040529050806120b88361205e565b81526120c66020840161205e565b6020820152604083013560408201525092915050565b6000604082840312156120ee57600080fd5b604051604081018181106001600160401b038211171561211057612110611fef565b604052823581526020928301359281019290925250919050565b6000808284036104e081121561213f57600080fd5b6121498585612075565b925061048080605f198301121561215f57600080fd5b612167612005565b915061217686606087016120dc565b82526121858660a087016120dc565b60208301526121978660e087016120dc565b60408301526101206121ab878288016120dc565b60608401526101606121bf888289016120dc565b60808501526101a06121d389828a016120dc565b60a08601526101e06121e78a828b016120dc565b60c08701526102206121fb8b828c016120dc565b60e088015261026061220f8c828d016120dc565b6101008901526102a06122248d828e016120dc565b878a01526122368d6102e08e016120dc565b6101408a015261224a8d6103208e016120dc565b868a015261225c8d6103608e016120dc565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b600080604083850312156122f157600080fd5b6122fa83611f5f565b91506020808401356001600160401b038082111561231757600080fd5b818601915086601f83011261232b57600080fd5b81358181111561233d5761233d611fef565b61234f601f8201601f1916850161202e565b9150808252878482850101111561236557600080fd5b80848401858401376000848284010152508093505050509250929050565b81516001600160401b031681526020808301519082015260408101610c70565b803563ffffffff81168114611f7657600080fd5b6000602082840312156123c957600080fd5b611c84826123a3565b6000806000808486036101208112156123ea57600080fd5b6123f48787612075565b94506080605f198201121561240857600080fd5b50604051608081018181106001600160401b038211171561242b5761242b611fef565b8060405250606086013581526080860135602082015260a0860135604082015260c086013560608201528093505061246560e086016123a3565b91506124746101008601611f5f565b905092959194509250565b60005b8381101561249a578181015183820152602001612482565b50506000910152565b60208152600082518060208401526124c281604085016020870161247f565b601f01601f19169190910160400192915050565b600080604083850312156124e957600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c7057610c706124f8565b634e487b7160e01b600052603260045260246000fd5b600081612546576125466124f8565b506000190190565b8060005b6007811015610e76578151845260209384019390910190600101612552565b61258682825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006125e98185018380518252602090810151910152565b60a083015191506101406126098186018480518252602090810151910152565b60c084015192506101806126298187018580518252602090810151910152565b60e085015193506101c06126498188018680518252602090810151910152565b928501519350610200926126698785018680518252602090810151910152565b610120860151945061024061268a8189018780518252602090810151910152565b928601519450610280926126aa8885018780518252602090810151910152565b61016087015195506102c06126cb818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a608201905084518252602085015160208301526040850151612788604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a08501516101006127d58185018380518252602090810151910152565b60c087015191506101406127f58186018480518252602090810151910152565b60e088015192506101806128158187018580518252602090810151910152565b9188015192506101c0916128358684018580518252602090810151910152565b61012089015193506102006128568188018680518252602090810151910152565b918901519350610240916128768784018680518252602090810151910152565b6101608a015194506102806128978189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e083015261296e61050083018561254e565b611fe76105e0830184612571565b60006020828403121561298e57600080fd5b81518015158114611c8457600080fd5b6001600160401b038281168282160390808211156129be576129be6124f8565b5092915050565b60006001600160401b038083168181036129e1576129e16124f8565b6001019392505050565b6000602082840312156129fd57600080fd5b5051919050565b60008251612a1681846020870161247f565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" diff --git a/contract-bindings/src/plonk_verifier.rs b/contract-bindings/src/plonk_verifier.rs index 906855a1d..3e558331c 100644 --- a/contract-bindings/src/plonk_verifier.rs +++ b/contract-bindings/src/plonk_verifier.rs @@ -234,12 +234,12 @@ pub mod plonk_verifier { pub static PLONKVERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80\x80`@R4a\0\x1AWa)7\x90\x81a\0 \x8290\x81PP\xF3[`\0\x80\xFD\xFE`\x80`@R`\x046\x10\x15a\0\x12W`\0\x80\xFD[`\x005`\xE0\x1Cc\xCESzw\x14a\0'W`\0\x80\xFD[6`\x03\x19\x01a\n`\x81\x12a\x01\xA2Wa\x05\0\x13a\x01\xA2Wa\x01\x9Ea\x01\x8Ca\0Ka\x01\xBDV[`\x045\x81R`$5` \x82\x01Ra\0a6a\x02\x84V[`@\x82\x01Ra\0o6a\x02\xA8V[``\x82\x01Ra\0}6a\x02\xCCV[`\x80\x82\x01Ra\0\x8B6a\x02\xF0V[`\xA0\x82\x01Ra\0\x996a\x03\x17V[`\xC0\x82\x01Ra\0\xA76a\x03>V[`\xE0\x82\x01Ra\0\xB56a\x03eV[a\x01\0\x82\x01Ra\0\xC46a\x03\x8CV[a\x01 \x82\x01Ra\0\xD36a\x03\xB3V[a\x01@\x82\x01Ra\0\xE26a\x03\xDAV[a\x01`\x82\x01Ra\0\xF16a\x04\x01V[a\x01\x80\x82\x01Ra\x01\x006a\x04(V[a\x01\xA0\x82\x01Ra\x01\x0F6a\x04OV[a\x01\xC0\x82\x01Ra\x01\x1E6a\x04vV[a\x01\xE0\x82\x01Ra\x01-6a\x04\x9DV[a\x02\0\x82\x01Ra\x01<6a\x04\xC4V[a\x02 \x82\x01Ra\x01K6a\x04\xEBV[a\x02@\x82\x01Ra\x01Z6a\x05\x12V[a\x02`\x82\x01Ra\x04\xC45a\x02\x80\x82\x01Ra\x04\xE45a\x02\xA0\x82\x01Ra\x01}6a\x074V[a\x01\x866a\x07tV[\x91a\x08\xD0V[`@Q\x90\x15\x15\x81R\x90\x81\x90` \x82\x01\x90V[\x03\x90\xF3[`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q\x90a\x02\xC0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[a\x01\xA7V[`@Q\x90`@\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90a\x02\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90`\x80\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90``\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90`\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@\x90`C\x19\x01\x12a\x01\xA2Wa\x02\x98a\x01\xE3V[\x90`D5\x82R`d5` \x83\x01RV[`@\x90`\x83\x19\x01\x12a\x01\xA2Wa\x02\xBCa\x01\xE3V[\x90`\x845\x82R`\xA45` \x83\x01RV[`@\x90`\xC3\x19\x01\x12a\x01\xA2Wa\x02\xE0a\x01\xE3V[\x90`\xC45\x82R`\xE45` \x83\x01RV[`@\x90a\x01\x03\x19\x01\x12a\x01\xA2Wa\x03\x05a\x01\xE3V[\x90a\x01\x045\x82Ra\x01$5` \x83\x01RV[`@\x90a\x01C\x19\x01\x12a\x01\xA2Wa\x03,a\x01\xE3V[\x90a\x01D5\x82Ra\x01d5` \x83\x01RV[`@\x90a\x01\x83\x19\x01\x12a\x01\xA2Wa\x03Sa\x01\xE3V[\x90a\x01\x845\x82Ra\x01\xA45` \x83\x01RV[`@\x90a\x01\xC3\x19\x01\x12a\x01\xA2Wa\x03za\x01\xE3V[\x90a\x01\xC45\x82Ra\x01\xE45` \x83\x01RV[`@\x90a\x02\x03\x19\x01\x12a\x01\xA2Wa\x03\xA1a\x01\xE3V[\x90a\x02\x045\x82Ra\x02$5` \x83\x01RV[`@\x90a\x02C\x19\x01\x12a\x01\xA2Wa\x03\xC8a\x01\xE3V[\x90a\x02D5\x82Ra\x02d5` \x83\x01RV[`@\x90a\x02\x83\x19\x01\x12a\x01\xA2Wa\x03\xEFa\x01\xE3V[\x90a\x02\x845\x82Ra\x02\xA45` \x83\x01RV[`@\x90a\x02\xC3\x19\x01\x12a\x01\xA2Wa\x04\x16a\x01\xE3V[\x90a\x02\xC45\x82Ra\x02\xE45` \x83\x01RV[`@\x90a\x03\x03\x19\x01\x12a\x01\xA2Wa\x04=a\x01\xE3V[\x90a\x03\x045\x82Ra\x03$5` \x83\x01RV[`@\x90a\x03C\x19\x01\x12a\x01\xA2Wa\x04da\x01\xE3V[\x90a\x03D5\x82Ra\x03d5` \x83\x01RV[`@\x90a\x03\x83\x19\x01\x12a\x01\xA2Wa\x04\x8Ba\x01\xE3V[\x90a\x03\x845\x82Ra\x03\xA45` \x83\x01RV[`@\x90a\x03\xC3\x19\x01\x12a\x01\xA2Wa\x04\xB2a\x01\xE3V[\x90a\x03\xC45\x82Ra\x03\xE45` \x83\x01RV[`@\x90a\x04\x03\x19\x01\x12a\x01\xA2Wa\x04\xD9a\x01\xE3V[\x90a\x04\x045\x82Ra\x04$5` \x83\x01RV[`@\x90a\x04C\x19\x01\x12a\x01\xA2Wa\x05\0a\x01\xE3V[\x90a\x04D5\x82Ra\x04d5` \x83\x01RV[`@\x90a\x04\x83\x19\x01\x12a\x01\xA2Wa\x05'a\x01\xE3V[\x90a\x04\x845\x82Ra\x04\xA45` \x83\x01RV[`@\x90a\x05\xE3\x19\x01\x12a\x01\xA2Wa\x05Na\x01\xE3V[\x90a\x05\xE45\x82Ra\x06\x045` \x83\x01RV[`@\x90a\x06#\x19\x01\x12a\x01\xA2Wa\x05ua\x01\xE3V[\x90a\x06$5\x82Ra\x06D5` \x83\x01RV[`@\x90a\x06c\x19\x01\x12a\x01\xA2Wa\x05\x9Ca\x01\xE3V[\x90a\x06d5\x82Ra\x06\x845` \x83\x01RV[`@\x90a\x06\xA3\x19\x01\x12a\x01\xA2Wa\x05\xC3a\x01\xE3V[\x90a\x06\xA45\x82Ra\x06\xC45` \x83\x01RV[`@\x90a\x06\xE3\x19\x01\x12a\x01\xA2Wa\x05\xEAa\x01\xE3V[\x90a\x06\xE45\x82Ra\x07\x045` \x83\x01RV[`@\x90a\x07#\x19\x01\x12a\x01\xA2Wa\x06\x11a\x01\xE3V[\x90a\x07$5\x82Ra\x07D5` \x83\x01RV[`@\x90a\x07c\x19\x01\x12a\x01\xA2Wa\x068a\x01\xE3V[\x90a\x07d5\x82Ra\x07\x845` \x83\x01RV[`@\x90a\x07\xA3\x19\x01\x12a\x01\xA2Wa\x06_a\x01\xE3V[\x90a\x07\xA45\x82Ra\x07\xC45` \x83\x01RV[`@\x90a\x07\xE3\x19\x01\x12a\x01\xA2Wa\x06\x86a\x01\xE3V[\x90a\x07\xE45\x82Ra\x08\x045` \x83\x01RV[`@\x90a\x08#\x19\x01\x12a\x01\xA2Wa\x06\xADa\x01\xE3V[\x90a\x08$5\x82Ra\x08D5` \x83\x01RV[`@\x90a\x08c\x19\x01\x12a\x01\xA2Wa\x06\xD4a\x01\xE3V[\x90a\x08d5\x82Ra\x08\x845` \x83\x01RV[`@\x90a\x08\xA3\x19\x01\x12a\x01\xA2Wa\x06\xFBa\x01\xE3V[\x90a\x08\xA45\x82Ra\x08\xC45` \x83\x01RV[`@\x90a\x08\xE3\x19\x01\x12a\x01\xA2Wa\x07\"a\x01\xE3V[\x90a\x08\xE45\x82Ra\t\x045` \x83\x01RV[\x80a\x05#\x12\x15a\x01\xA2Wa\x07Fa\x02dV[\x90\x81a\x05\xE4\x91\x82\x11a\x01\xA2Wa\x05\x04\x90[\x82\x82\x10a\x07dWPPP\x90V[\x815\x81R` \x91\x82\x01\x91\x01a\x07WV[\x90a\x04\x80a\x05\xE3\x19\x83\x01\x12a\x01\xA2Wa\x08=a\x07\x8Ea\x02\x03V[\x92a\x07\x98\x81a\x059V[\x84Ra\x07\xA3\x81a\x05`V[` \x85\x01Ra\x07\xB1\x81a\x05\x87V[`@\x85\x01Ra\x07\xBF\x81a\x05\xAEV[``\x85\x01Ra\x07\xCD\x81a\x05\xD5V[`\x80\x85\x01Ra\x07\xDB\x81a\x05\xFCV[`\xA0\x85\x01Ra\x07\xE9\x81a\x06#V[`\xC0\x85\x01Ra\x07\xF7\x81a\x06JV[`\xE0\x85\x01Ra\x08\x05\x81a\x06qV[a\x01\0\x85\x01Ra\x08\x14\x81a\x06\x98V[a\x01 \x85\x01Ra\x08#\x81a\x06\xBFV[a\x01@\x85\x01Ra\x082\x81a\x06\xE6V[a\x01`\x85\x01Ra\x07\rV[a\x01\x80\x83\x01Ra\t$5a\x01\xA0\x83\x01Ra\tD5a\x01\xC0\x83\x01Ra\td5a\x01\xE0\x83\x01Ra\t\x845a\x02\0\x83\x01Ra\t\xA45a\x02 \x83\x01Ra\t\xC45a\x02@\x83\x01Ra\t\xE45a\x02`\x83\x01Ra\n\x045a\x02\x80\x83\x01Ra\n$5a\x02\xA0\x83\x01Ra\nD5a\x02\xC0\x83\x01RV[\x90`\x07\x81\x10\x15a\x08\xBAW`\x05\x1B\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x90a\nj\x92\x91a\x08\xE0\x83Qa\x0C\x89V[a\x08\xED` \x84\x01Qa\x0C\x89V[a\x08\xFA`@\x84\x01Qa\x0C\x89V[a\t\x07``\x84\x01Qa\x0C\x89V[a\t\x14`\x80\x84\x01Qa\x0C\x89V[a\t!`\xA0\x84\x01Qa\x0C\x89V[a\t.`\xC0\x84\x01Qa\x0C\x89V[a\t;`\xE0\x84\x01Qa\x0C\x89V[a\tIa\x01\0\x84\x01Qa\x0C\x89V[a\tWa\x01 \x84\x01Qa\x0C\x89V[a\tea\x01@\x84\x01Qa\x0C\x89V[a\tsa\x01`\x84\x01Qa\x0C\x89V[a\t\x81a\x01\x80\x84\x01Qa\x0C\x89V[a\t\x8Fa\x01\xA0\x84\x01Qa\nmV[a\t\x9Da\x01\xC0\x84\x01Qa\nmV[a\t\xABa\x01\xE0\x84\x01Qa\nmV[a\t\xB9a\x02\0\x84\x01Qa\nmV[a\t\xC7a\x02 \x84\x01Qa\nmV[a\t\xD5a\x02@\x84\x01Qa\nmV[a\t\xE3a\x02`\x84\x01Qa\nmV[a\t\xF1a\x02\x80\x84\x01Qa\nmV[a\t\xFFa\x02\xA0\x84\x01Qa\nmV[a\n\ra\x02\xC0\x84\x01Qa\nmV[a\n\x17\x82Qa\nmV[a\n$` \x83\x01Qa\nmV[a\n1`@\x83\x01Qa\nmV[a\n>``\x83\x01Qa\nmV[a\nK`\x80\x83\x01Qa\nmV[a\nX`\xA0\x83\x01Qa\nmV[a\ne`\xC0\x83\x01Qa\nmV[a\n\xDFV[\x90V[`\0\x80Q` a)\x0B\x839\x81Q\x91R\x11\x15a\n\x84WV[`@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\x90\xFD[a\n\xD1a\x01\xE3V[\x90`\0\x82R`\0` \x83\x01RV[`\x07` \x82\x01Q\x03a\x0CwWa\n\xF6\x83\x83\x83a\rwV[\x92\x81Qa\x0B\x02\x90a\x12XV[\x90`\xA0\x85\x01\x93\x84Q\x90a\x0B\x15\x91\x84a\x16\x10V[\x92a\x0B\x1Ea\n\xC9V[Pa\x0B'a\n\xC9V[Pa\x01`\x82\x01\x90\x81Q\x92a\x01\x80\x81\x01\x95\x86Q\x94`\xE0\x8A\x01\x95\x86Qa\x0BJ\x91a\x16\xC3V[a\x0BS\x91a\x17\x10V[\x98a\x0B]\x93a\x17\x98V[\x90a\x0Bg\x90a\x1BlV[a\x0Bp\x91a\x17\x10V[\x90Q\x85Qa\x0B}\x91a\x16\xC3V[a\x0B\x86\x91a\x17\x10V[\x93Q\x91`\0\x80Q` a)\x0B\x839\x81Q\x91R\x92`@\x84\x92\x01Q` \x01Q\x90\t\x90Q\x90\t\x90Q\x90a\x0B\xB5\x91a\x16\xC3V[a\x0B\xBE\x91a\x17\x10V[a\x0B\xC6a\x02$V[\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\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1` \x82\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`@\x82\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4``\x82\x01R\x90a\x0Ce\x90a\x1BlV[a\x0Cma\x1B\xD4V[\x91a\nj\x93a\x1C\xDDV[`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x90\xFD[\x80Q` \x82\x01Q\x15\x90\x15\x16a\r$W` \x81Q\x91\x01Q\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x80\x80`\x03\x81\x80\x86\x80\t\x86\t\x08\x81\x85\x80\t\x14\x93\x10\x91\x10\x16\x16\x15a\x0C\xDFWV[`@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\x90\xFD[PV[`@Q\x90a\x01\0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@R\x81`\xE0`\0\x91\x82\x81R\x82` \x82\x01R\x82`@\x82\x01R\x82``\x82\x01R\x82`\x80\x82\x01R\x82`\xA0\x82\x01R\x82`\xC0\x82\x01R\x01RV[`\xA0\x90` a\x01\x80`\0\x80Q` a)\x0B\x839\x81Q\x91R\x94\x96\x95`\xC0a\r\x9Ba\r'V[\x98\x84\x82`@Q\x97`\x7F`\xE1\x1B\x83\x8A\x01R\x80Q\x82\x1B`$\x8A\x01R\x82\x81\x01Q\x82\x1B`,\x8A\x01Ra\x02\x80\x81\x01Q`@\x8A\x01Ra\x02\xA0\x81\x01Q``\x8A\x01R`\x01`\x80\x8A\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85`\x80\x82\x01R\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D`\xA0\x82\x01R\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD`\xC0\x82\x01Ra\x13ca\x02DV[\x90`\x10\x82R\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` \x83\x01R`@\x82\x01R\x90V[b\x10\0\0\x81\x14a\x14\xE4W` \x03a\x14\xD2Wa\x13\xAFa\x02dV[`\x01\x81R\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!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B`@\x82\x01R\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;``\x82\x01R\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80`\x80\x82\x01R\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE`\xA0\x82\x01R\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C`\xC0\x82\x01Ra\x14\x9Fa\x02DV[\x90`\x05\x82R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01` \x83\x01R`@\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x90\xFD[Pa\x14\xEDa\x02dV[`\x01\x81R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW` \x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD`@\x82\x01R\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B``\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`\x80\x82\x01R\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18`\xA0\x82\x01R\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\`\xC0\x82\x01Ra\x15\xDDa\x02DV[\x90`\x14\x82R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01` \x83\x01R`@\x82\x01R\x90V[\x91\x92\x90\x92a\x16\x1Ca\x02DV[\x92`\0\x84R` \x84\x01\x94`\0\x86R`@\x85\x01\x92`\0\x84R\x85\x83Q\x97\x83`\0\x14a\x16\x92W\x83\x98`\0\x90[\x80\x82\x10a\x16tWPPa\x16ga\x16p\x96\x97\x98\x99`\0\x19\x01[\x80\x84R\x85\x87a\x1DdV[\x90RQ\x92a\x1D\xDDV[\x90RV[\x90\x99`\0\x80Q` a)\x0B\x839\x81Q\x91R\x81`\x01\x92\t\x9A\x01\x90a\x16EV[a\x16p\x95\x96\x97\x98Pa\x16g\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a\x16]V[``\x90\x92\x91\x92`\x80a\x16\xD3a\x01\xE3V[\x91`\0\x83R`\0` \x84\x01R\x82\x95` a\x16\xEBa\x02DV[\x92\x866\x857\x80Q\x84R\x01Q` \x83\x01R`@\x82\x01R`\x07a\x07\xCF\x19Z\x01\xFA\x15a\x01\xA2WV[``\x90\x92\x91\x92`\xC0a\x17 a\x01\xE3V[\x91`\0\x83R`\0` \x84\x01R` \x83\x96\x81a\x179a\x02$V[\x93`\x806\x867\x80Q\x85R\x01Q\x82\x84\x01R\x80Q`@\x84\x01R\x01Q\x84\x82\x01R`\x06a\x07\xCF\x19Z\x01\xFA\x15a\x01\xA2WV[\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x82\x03\x91\x82\x11a\x17\x82WV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x90\x91a\x17\xA2a\n\xC9V[Pa\x17\xABa\n\xC9V[Pa\x17\xB8\x84\x82\x85\x85a\x1FKV[\x90a\x17\xC4\x90\x85\x85a'WV[a\x17\xCD\x90a\x17fV[`\xC0\x84\x01Q\x80\x80\x80\x80\x95\x81\x95a\x01\xA0\x8B\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x84\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x90\x82\x8BQ\x90a\x18\x10\x91a\x16\xC3V[a\x18\x19\x91a\x17\x10V[\x90a\x01\xC0\x8B\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x84\x80\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x83\x80\t` \x8C\x01Q\x90a\x18w\x91a\x16\xC3V[a\x18\x80\x91a\x17\x10V[\x90\x82`\0\x80Q` a)\x0B\x839\x81Q\x91R\x81\x80\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x01\xE0\x8C\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81`@\x8D\x01Q\x90a\x18\xE1\x91a\x16\xC3V[a\x18\xEA\x91a\x17\x10V[\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02\0\x8B\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81``\x8C\x01Q\x90a\x197\x91a\x16\xC3V[a\x19@\x91a\x17\x10V[\x93`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02 \x8A\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92\x81`\x80\x8B\x01Q\x90a\x19\x8D\x91a\x16\xC3V[a\x19\x96\x91a\x17\x10V[\x92a\x02@\x8A\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x84\x84\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x83\x83\t`@\x89\x01Q\x90a\x19\xF4\x91a\x16\xC3V[a\x19\xFD\x91a\x17\x10V[\x93`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02`\x88\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81``\x87\x01Q\x90a\x1A\\\x91a\x16\xC3V[a\x1Ae\x91a\x17\x10V[\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02\x80\x87\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81`\x80\x86\x01Q\x90a\x1A\xB2\x91a\x16\xC3V[a\x1A\xBB\x91a\x17\x10V[\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02\xA0\x86\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92`\xA0\x01Q\x90a\x1B\x06\x91a\x16\xC3V[a\x1B\x0F\x91a\x17\x10V[\x91`\xE0\x01Q\x90a\x02\xC0\x84\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92`\xA0\x01Q\x90a\x1BM\x91a\x16\xC3V[a\x1BV\x91a\x17\x10V[\x90a\x1B_a(\x15V[\x90a\x1Bi\x91a\x16\xC3V[\x91V[`\0` a\x1Bxa\x01\xE3V[\x82\x81R\x01R\x80Q` \x82\x01Q\x15\x90\x15\x16a\njW` \x81Q\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x82\x91\x01Q\x06\x81\x03\x90\x81\x11a\x17\x82Wa\x1B\xC9a\x01\xE3V[\x91\x82R` \x82\x01R\x90V[`\0``a\x1B\xE0a\x02$V[\x82\x81R\x82` \x82\x01R\x82`@\x82\x01R\x01Ra\x1B\xF9a\x02$V[\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2` \x82\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA`@\x82\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[``\x82\x01R\x90V[\x15a\x1C\x98WV[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x90\xFD[\x91`@a\x01\x80\x92\x94`\0\x94\x82Q\x93\x81Q\x85R\x83` \x98\x89\x80\x94\x01Q\x84\x88\x01R\x83\x81\x01Q\x82\x88\x01R\x80Q``\x88\x01R``\x81\x01Q`\x80\x88\x01R\x01Q`\xA0\x86\x01R\x80Q`\xC0\x86\x01R\x01Q`\xE0\x84\x01R\x85\x81\x01Qa\x01\0\x84\x01R\x80Qa\x01 \x84\x01R``\x81\x01Qa\x01@\x84\x01R\x01Qa\x01`\x82\x01R`\x08Z\xFAa\x1D_`\0Q\x91a\x1C\x91V[\x15\x15\x90V[`\x01\x82\x14a\x1D\xD5W\x82\x15a\x1D\xCDW` \x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x92\x83\x91\x90\t\x90\x80\x15a\x1D\xA3Wa\x1D\x9E\x90`\0\x19\x01a(\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\r\x17W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\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\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x0EUW`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0E\x92`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a\x0E\x9C\x84\x84a\x14\xADV[\x80\x82Ra\x0E\xAC\x90\x85\x90\x85\x90a\x15\x01V[` \x82\x01R\x80Qa\x0E\xC2\x90\x85\x90\x84\x90\x86\x90a\x15uV[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x0E\xEAa\x1D\x8FV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0F\x1CW`\0\x80\xFD[P\x80a\x0FjW`@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\x02iV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x0F\x8Ea\x1D\xADV[\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\x0F\xCBW`\0\x80\xFD[P\x80a\x0FjW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02iV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0a\x10O\x87\x87\x87\x87a\x16\xCBV[\x90P`\0\x80Q` a\"\xEB\x839\x81Q\x91R`\0a\x10m\x88\x87\x89a\x1B\x9BV[\x90Pa\x10y\x81\x83a\"\x91V[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x10\xA6\x85a\x03\x1D\x8A`\0\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xCE\x86a\x03\x1D\x8A` \x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xF6\x86a\x03\x1D\x8A`@\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x1E\x86a\x03\x1D\x8A``\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x11F\x86a\x03\x1D\x8A`\x80\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x11n\x86a\x03\x1D\x8D`@\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x96\x86a\x03\x1D\x8D``\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xBE\x86a\x03\x1D\x8D`\x80\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xE6\x86a\x03\x1D\x8D`\xA0\x01Q\x84a\x0E\xCEV[\x95P`\0\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x12\x11\x87a\x03\x1D\x8B`\xA0\x01Q\x84a\x0E\xCEV[\x96Pa\x12Ha\x12B`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x0E\xCEV[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x12\x81WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x12\xC6\x91\x90a\"\xC8V[a\x12\xF0\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa\"\x91V[\x90R\x92\x91PPV[a\x13#`@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\x80a\x14\x9FW`@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\x02iV[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q`\0\x90`\0\x80Q` a\"\xEB\x839\x81Q\x91R\x90\x83\x80\x15a\x14\xF1W\x84\x93P`\0[\x82\x81\x10\x15a\x14\xE5W\x83\x85\x86\t\x94P`\x01\x01a\x14\xCFV[P`\x01\x84\x03\x93Pa\x14\xF8V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a\x15\x13WP`\x01a\0\xCDV[\x81`\0\x03a\x15#WP`\0a\0\xCDV[` \x84\x01Q`\0\x80Q` a\"\xEB\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x15SW`\x01\x87\x03\x92Pa\x15ZV[`\x01\x84\x03\x92P[Pa\x15d\x82a\x1C\x8BV[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[`\0`\0\x80Q` a\"\xEB\x839\x81Q\x91R\x82\x82\x03a\x15\xF2W`\x01`\0[`\x07\x81\x10\x15a\x15\xE6W\x81\x86\x03a\x15\xC3W\x86\x81`\x07\x81\x10a\x15\xB4Wa\x15\xB4a\"{V[` \x02\x01Q\x93PPPPa\x14\xA5V[\x82\x80a\x15\xD1Wa\x15\xD1a\"\xB2V[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x15\x92V[P`\0\x92PPPa\x14\xA5V[a\x15\xFAa\x1D\xCBV[`@\x87\x01Q`\x01`\xC0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x07\x81\x10\x15a\x16;W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x16\x0EV[PPPP`\0\x80`\0\x90P`\x01\x83\x89`@\x8C\x01Q`\0[`\x07\x81\x10\x15a\x16\x92W\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x16RV[PPPP\x80\x92PP`\0a\x16\xA5\x83a\x1C\x8BV[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0\x80`\0\x80`\0`\0\x80Q` a\"\xEB\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7XV[`\xE0\x82\x01Ra\0\xB56a\x03eV[a\x01\0\x82\x01Ra\0\xC46a\x03\x8CV[a\x01 \x82\x01Ra\0\xD36a\x03\xB3V[a\x01@\x82\x01Ra\0\xE26a\x03\xDAV[a\x01`\x82\x01Ra\0\xF16a\x04\x01V[a\x01\x80\x82\x01Ra\x01\x006a\x04(V[a\x01\xA0\x82\x01Ra\x01\x0F6a\x04OV[a\x01\xC0\x82\x01Ra\x01\x1E6a\x04vV[a\x01\xE0\x82\x01Ra\x01-6a\x04\x9DV[a\x02\0\x82\x01Ra\x01<6a\x04\xC4V[a\x02 \x82\x01Ra\x01K6a\x04\xEBV[a\x02@\x82\x01Ra\x01Z6a\x05\x12V[a\x02`\x82\x01Ra\x04\xC45a\x02\x80\x82\x01Ra\x04\xE45a\x02\xA0\x82\x01Ra\x01}6a\x074V[a\x01\x866a\x07tV[\x91a\x08\xD0V[`@Q\x90\x15\x15\x81R\x90\x81\x90` \x82\x01\x90V[\x03\x90\xF3[`\0\x80\xFD[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q\x90a\x02\xC0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[a\x01\xA7V[`@Q\x90`@\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90a\x02\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90`\x80\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90``\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@Q\x90`\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@RV[`@\x90`C\x19\x01\x12a\x01\xA2Wa\x02\x98a\x01\xE3V[\x90`D5\x82R`d5` \x83\x01RV[`@\x90`\x83\x19\x01\x12a\x01\xA2Wa\x02\xBCa\x01\xE3V[\x90`\x845\x82R`\xA45` \x83\x01RV[`@\x90`\xC3\x19\x01\x12a\x01\xA2Wa\x02\xE0a\x01\xE3V[\x90`\xC45\x82R`\xE45` \x83\x01RV[`@\x90a\x01\x03\x19\x01\x12a\x01\xA2Wa\x03\x05a\x01\xE3V[\x90a\x01\x045\x82Ra\x01$5` \x83\x01RV[`@\x90a\x01C\x19\x01\x12a\x01\xA2Wa\x03,a\x01\xE3V[\x90a\x01D5\x82Ra\x01d5` \x83\x01RV[`@\x90a\x01\x83\x19\x01\x12a\x01\xA2Wa\x03Sa\x01\xE3V[\x90a\x01\x845\x82Ra\x01\xA45` \x83\x01RV[`@\x90a\x01\xC3\x19\x01\x12a\x01\xA2Wa\x03za\x01\xE3V[\x90a\x01\xC45\x82Ra\x01\xE45` \x83\x01RV[`@\x90a\x02\x03\x19\x01\x12a\x01\xA2Wa\x03\xA1a\x01\xE3V[\x90a\x02\x045\x82Ra\x02$5` \x83\x01RV[`@\x90a\x02C\x19\x01\x12a\x01\xA2Wa\x03\xC8a\x01\xE3V[\x90a\x02D5\x82Ra\x02d5` \x83\x01RV[`@\x90a\x02\x83\x19\x01\x12a\x01\xA2Wa\x03\xEFa\x01\xE3V[\x90a\x02\x845\x82Ra\x02\xA45` \x83\x01RV[`@\x90a\x02\xC3\x19\x01\x12a\x01\xA2Wa\x04\x16a\x01\xE3V[\x90a\x02\xC45\x82Ra\x02\xE45` \x83\x01RV[`@\x90a\x03\x03\x19\x01\x12a\x01\xA2Wa\x04=a\x01\xE3V[\x90a\x03\x045\x82Ra\x03$5` \x83\x01RV[`@\x90a\x03C\x19\x01\x12a\x01\xA2Wa\x04da\x01\xE3V[\x90a\x03D5\x82Ra\x03d5` \x83\x01RV[`@\x90a\x03\x83\x19\x01\x12a\x01\xA2Wa\x04\x8Ba\x01\xE3V[\x90a\x03\x845\x82Ra\x03\xA45` \x83\x01RV[`@\x90a\x03\xC3\x19\x01\x12a\x01\xA2Wa\x04\xB2a\x01\xE3V[\x90a\x03\xC45\x82Ra\x03\xE45` \x83\x01RV[`@\x90a\x04\x03\x19\x01\x12a\x01\xA2Wa\x04\xD9a\x01\xE3V[\x90a\x04\x045\x82Ra\x04$5` \x83\x01RV[`@\x90a\x04C\x19\x01\x12a\x01\xA2Wa\x05\0a\x01\xE3V[\x90a\x04D5\x82Ra\x04d5` \x83\x01RV[`@\x90a\x04\x83\x19\x01\x12a\x01\xA2Wa\x05'a\x01\xE3V[\x90a\x04\x845\x82Ra\x04\xA45` \x83\x01RV[`@\x90a\x05\xE3\x19\x01\x12a\x01\xA2Wa\x05Na\x01\xE3V[\x90a\x05\xE45\x82Ra\x06\x045` \x83\x01RV[`@\x90a\x06#\x19\x01\x12a\x01\xA2Wa\x05ua\x01\xE3V[\x90a\x06$5\x82Ra\x06D5` \x83\x01RV[`@\x90a\x06c\x19\x01\x12a\x01\xA2Wa\x05\x9Ca\x01\xE3V[\x90a\x06d5\x82Ra\x06\x845` \x83\x01RV[`@\x90a\x06\xA3\x19\x01\x12a\x01\xA2Wa\x05\xC3a\x01\xE3V[\x90a\x06\xA45\x82Ra\x06\xC45` \x83\x01RV[`@\x90a\x06\xE3\x19\x01\x12a\x01\xA2Wa\x05\xEAa\x01\xE3V[\x90a\x06\xE45\x82Ra\x07\x045` \x83\x01RV[`@\x90a\x07#\x19\x01\x12a\x01\xA2Wa\x06\x11a\x01\xE3V[\x90a\x07$5\x82Ra\x07D5` \x83\x01RV[`@\x90a\x07c\x19\x01\x12a\x01\xA2Wa\x068a\x01\xE3V[\x90a\x07d5\x82Ra\x07\x845` \x83\x01RV[`@\x90a\x07\xA3\x19\x01\x12a\x01\xA2Wa\x06_a\x01\xE3V[\x90a\x07\xA45\x82Ra\x07\xC45` \x83\x01RV[`@\x90a\x07\xE3\x19\x01\x12a\x01\xA2Wa\x06\x86a\x01\xE3V[\x90a\x07\xE45\x82Ra\x08\x045` \x83\x01RV[`@\x90a\x08#\x19\x01\x12a\x01\xA2Wa\x06\xADa\x01\xE3V[\x90a\x08$5\x82Ra\x08D5` \x83\x01RV[`@\x90a\x08c\x19\x01\x12a\x01\xA2Wa\x06\xD4a\x01\xE3V[\x90a\x08d5\x82Ra\x08\x845` \x83\x01RV[`@\x90a\x08\xA3\x19\x01\x12a\x01\xA2Wa\x06\xFBa\x01\xE3V[\x90a\x08\xA45\x82Ra\x08\xC45` \x83\x01RV[`@\x90a\x08\xE3\x19\x01\x12a\x01\xA2Wa\x07\"a\x01\xE3V[\x90a\x08\xE45\x82Ra\t\x045` \x83\x01RV[\x80a\x05#\x12\x15a\x01\xA2Wa\x07Fa\x02dV[\x90\x81a\x05\xE4\x91\x82\x11a\x01\xA2Wa\x05\x04\x90[\x82\x82\x10a\x07dWPPP\x90V[\x815\x81R` \x91\x82\x01\x91\x01a\x07WV[\x90a\x04\x80a\x05\xE3\x19\x83\x01\x12a\x01\xA2Wa\x08=a\x07\x8Ea\x02\x03V[\x92a\x07\x98\x81a\x059V[\x84Ra\x07\xA3\x81a\x05`V[` \x85\x01Ra\x07\xB1\x81a\x05\x87V[`@\x85\x01Ra\x07\xBF\x81a\x05\xAEV[``\x85\x01Ra\x07\xCD\x81a\x05\xD5V[`\x80\x85\x01Ra\x07\xDB\x81a\x05\xFCV[`\xA0\x85\x01Ra\x07\xE9\x81a\x06#V[`\xC0\x85\x01Ra\x07\xF7\x81a\x06JV[`\xE0\x85\x01Ra\x08\x05\x81a\x06qV[a\x01\0\x85\x01Ra\x08\x14\x81a\x06\x98V[a\x01 \x85\x01Ra\x08#\x81a\x06\xBFV[a\x01@\x85\x01Ra\x082\x81a\x06\xE6V[a\x01`\x85\x01Ra\x07\rV[a\x01\x80\x83\x01Ra\t$5a\x01\xA0\x83\x01Ra\tD5a\x01\xC0\x83\x01Ra\td5a\x01\xE0\x83\x01Ra\t\x845a\x02\0\x83\x01Ra\t\xA45a\x02 \x83\x01Ra\t\xC45a\x02@\x83\x01Ra\t\xE45a\x02`\x83\x01Ra\n\x045a\x02\x80\x83\x01Ra\n$5a\x02\xA0\x83\x01Ra\nD5a\x02\xC0\x83\x01RV[\x90`\x07\x81\x10\x15a\x08\xBAW`\x05\x1B\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[\x90a\nj\x92\x91a\x08\xE0\x83Qa\x0C\x89V[a\x08\xED` \x84\x01Qa\x0C\x89V[a\x08\xFA`@\x84\x01Qa\x0C\x89V[a\t\x07``\x84\x01Qa\x0C\x89V[a\t\x14`\x80\x84\x01Qa\x0C\x89V[a\t!`\xA0\x84\x01Qa\x0C\x89V[a\t.`\xC0\x84\x01Qa\x0C\x89V[a\t;`\xE0\x84\x01Qa\x0C\x89V[a\tIa\x01\0\x84\x01Qa\x0C\x89V[a\tWa\x01 \x84\x01Qa\x0C\x89V[a\tea\x01@\x84\x01Qa\x0C\x89V[a\tsa\x01`\x84\x01Qa\x0C\x89V[a\t\x81a\x01\x80\x84\x01Qa\x0C\x89V[a\t\x8Fa\x01\xA0\x84\x01Qa\nmV[a\t\x9Da\x01\xC0\x84\x01Qa\nmV[a\t\xABa\x01\xE0\x84\x01Qa\nmV[a\t\xB9a\x02\0\x84\x01Qa\nmV[a\t\xC7a\x02 \x84\x01Qa\nmV[a\t\xD5a\x02@\x84\x01Qa\nmV[a\t\xE3a\x02`\x84\x01Qa\nmV[a\t\xF1a\x02\x80\x84\x01Qa\nmV[a\t\xFFa\x02\xA0\x84\x01Qa\nmV[a\n\ra\x02\xC0\x84\x01Qa\nmV[a\n\x17\x82Qa\nmV[a\n$` \x83\x01Qa\nmV[a\n1`@\x83\x01Qa\nmV[a\n>``\x83\x01Qa\nmV[a\nK`\x80\x83\x01Qa\nmV[a\nX`\xA0\x83\x01Qa\nmV[a\ne`\xC0\x83\x01Qa\nmV[a\n\xDFV[\x90V[`\0\x80Q` a)\x0B\x839\x81Q\x91R\x11\x15a\n\x84WV[`@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\x90\xFD[a\n\xD1a\x01\xE3V[\x90`\0\x82R`\0` \x83\x01RV[`\x07` \x82\x01Q\x03a\x0CwWa\n\xF6\x83\x83\x83a\rwV[\x92\x81Qa\x0B\x02\x90a\x12XV[\x90`\xA0\x85\x01\x93\x84Q\x90a\x0B\x15\x91\x84a\x16\x10V[\x92a\x0B\x1Ea\n\xC9V[Pa\x0B'a\n\xC9V[Pa\x01`\x82\x01\x90\x81Q\x92a\x01\x80\x81\x01\x95\x86Q\x94`\xE0\x8A\x01\x95\x86Qa\x0BJ\x91a\x16\xC3V[a\x0BS\x91a\x17\x10V[\x98a\x0B]\x93a\x17\x98V[\x90a\x0Bg\x90a\x1BlV[a\x0Bp\x91a\x17\x10V[\x90Q\x85Qa\x0B}\x91a\x16\xC3V[a\x0B\x86\x91a\x17\x10V[\x93Q\x91`\0\x80Q` a)\x0B\x839\x81Q\x91R\x92`@\x84\x92\x01Q` \x01Q\x90\t\x90Q\x90\t\x90Q\x90a\x0B\xB5\x91a\x16\xC3V[a\x0B\xBE\x91a\x17\x10V[a\x0B\xC6a\x02$V[\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\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1` \x82\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`@\x82\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4``\x82\x01R\x90a\x0Ce\x90a\x1BlV[a\x0Cma\x1B\xD4V[\x91a\nj\x93a\x1C\xDDV[`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x90\xFD[\x80Q` \x82\x01Q\x15\x90\x15\x16a\r$W` \x81Q\x91\x01Q\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x80\x80`\x03\x81\x80\x86\x80\t\x86\t\x08\x81\x85\x80\t\x14\x93\x10\x91\x10\x16\x16\x15a\x0C\xDFWV[`@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\x90\xFD[PV[`@Q\x90a\x01\0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x01\xDEW`@R\x81`\xE0`\0\x91\x82\x81R\x82` \x82\x01R\x82`@\x82\x01R\x82``\x82\x01R\x82`\x80\x82\x01R\x82`\xA0\x82\x01R\x82`\xC0\x82\x01R\x01RV[`\xA0\x90` a\x01\x80`\0\x80Q` a)\x0B\x839\x81Q\x91R\x94\x96\x95`\xC0a\r\x9Ba\r'V[\x98\x84\x82`@Q\x97`\x7F`\xE1\x1B\x83\x8A\x01R\x80Q\x82\x1B`$\x8A\x01R\x82\x81\x01Q\x82\x1B`,\x8A\x01Ra\x02\x80\x81\x01Q`@\x8A\x01Ra\x02\xA0\x81\x01Q``\x8A\x01R`\x01`\x80\x8A\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85`\x80\x82\x01R\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D`\xA0\x82\x01R\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD`\xC0\x82\x01Ra\x13ca\x02DV[\x90`\x10\x82R\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` \x83\x01R`@\x82\x01R\x90V[b\x10\0\0\x81\x14a\x14\xE4W` \x03a\x14\xD2Wa\x13\xAFa\x02dV[`\x01\x81R\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!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B`@\x82\x01R\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;``\x82\x01R\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80`\x80\x82\x01R\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE`\xA0\x82\x01R\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C`\xC0\x82\x01Ra\x14\x9Fa\x02DV[\x90`\x05\x82R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01` \x83\x01R`@\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x90\xFD[Pa\x14\xEDa\x02dV[`\x01\x81R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW` \x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD`@\x82\x01R\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B``\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`\x80\x82\x01R\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18`\xA0\x82\x01R\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\`\xC0\x82\x01Ra\x15\xDDa\x02DV[\x90`\x14\x82R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01` \x83\x01R`@\x82\x01R\x90V[\x91\x92\x90\x92a\x16\x1Ca\x02DV[\x92`\0\x84R` \x84\x01\x94`\0\x86R`@\x85\x01\x92`\0\x84R\x85\x83Q\x97\x83`\0\x14a\x16\x92W\x83\x98`\0\x90[\x80\x82\x10a\x16tWPPa\x16ga\x16p\x96\x97\x98\x99`\0\x19\x01[\x80\x84R\x85\x87a\x1DdV[\x90RQ\x92a\x1D\xDDV[\x90RV[\x90\x99`\0\x80Q` a)\x0B\x839\x81Q\x91R\x81`\x01\x92\t\x9A\x01\x90a\x16EV[a\x16p\x95\x96\x97\x98Pa\x16g\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a\x16]V[``\x90\x92\x91\x92`\x80a\x16\xD3a\x01\xE3V[\x91`\0\x83R`\0` \x84\x01R\x82\x95` a\x16\xEBa\x02DV[\x92\x866\x857\x80Q\x84R\x01Q` \x83\x01R`@\x82\x01R`\x07a\x07\xCF\x19Z\x01\xFA\x15a\x01\xA2WV[``\x90\x92\x91\x92`\xC0a\x17 a\x01\xE3V[\x91`\0\x83R`\0` \x84\x01R` \x83\x96\x81a\x179a\x02$V[\x93`\x806\x867\x80Q\x85R\x01Q\x82\x84\x01R\x80Q`@\x84\x01R\x01Q\x84\x82\x01R`\x06a\x07\xCF\x19Z\x01\xFA\x15a\x01\xA2WV[\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x82\x03\x91\x82\x11a\x17\x82WV[cNH{q`\xE0\x1B`\0R`\x11`\x04R`$`\0\xFD[\x90\x91a\x17\xA2a\n\xC9V[Pa\x17\xABa\n\xC9V[Pa\x17\xB8\x84\x82\x85\x85a\x1FKV[\x90a\x17\xC4\x90\x85\x85a'WV[a\x17\xCD\x90a\x17fV[`\xC0\x84\x01Q\x80\x80\x80\x80\x95\x81\x95a\x01\xA0\x8B\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x84\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x90\x82\x8BQ\x90a\x18\x10\x91a\x16\xC3V[a\x18\x19\x91a\x17\x10V[\x90a\x01\xC0\x8B\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x84\x80\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x83\x80\t` \x8C\x01Q\x90a\x18w\x91a\x16\xC3V[a\x18\x80\x91a\x17\x10V[\x90\x82`\0\x80Q` a)\x0B\x839\x81Q\x91R\x81\x80\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x01\xE0\x8C\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81`@\x8D\x01Q\x90a\x18\xE1\x91a\x16\xC3V[a\x18\xEA\x91a\x17\x10V[\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02\0\x8B\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81``\x8C\x01Q\x90a\x197\x91a\x16\xC3V[a\x19@\x91a\x17\x10V[\x93`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02 \x8A\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92\x81`\x80\x8B\x01Q\x90a\x19\x8D\x91a\x16\xC3V[a\x19\x96\x91a\x17\x10V[\x92a\x02@\x8A\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x84\x84\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x83\x83\t`@\x89\x01Q\x90a\x19\xF4\x91a\x16\xC3V[a\x19\xFD\x91a\x17\x10V[\x93`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02`\x88\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81``\x87\x01Q\x90a\x1A\\\x91a\x16\xC3V[a\x1Ae\x91a\x17\x10V[\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02\x80\x87\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x91\x81`\x80\x86\x01Q\x90a\x1A\xB2\x91a\x16\xC3V[a\x1A\xBB\x91a\x17\x10V[\x92`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\t\x90a\x02\xA0\x86\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92`\xA0\x01Q\x90a\x1B\x06\x91a\x16\xC3V[a\x1B\x0F\x91a\x17\x10V[\x91`\xE0\x01Q\x90a\x02\xC0\x84\x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x90\x83\t`\0\x80Q` a)\x0B\x839\x81Q\x91R\x91\x08\x92`\xA0\x01Q\x90a\x1BM\x91a\x16\xC3V[a\x1BV\x91a\x17\x10V[\x90a\x1B_a(\x15V[\x90a\x1Bi\x91a\x16\xC3V[\x91V[`\0` a\x1Bxa\x01\xE3V[\x82\x81R\x01R\x80Q` \x82\x01Q\x15\x90\x15\x16a\njW` \x81Q\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x82\x91\x01Q\x06\x81\x03\x90\x81\x11a\x17\x82Wa\x1B\xC9a\x01\xE3V[\x91\x82R` \x82\x01R\x90V[`\0``a\x1B\xE0a\x02$V[\x82\x81R\x82` \x82\x01R\x82`@\x82\x01R\x01Ra\x1B\xF9a\x02$V[\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2` \x82\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA`@\x82\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[``\x82\x01R\x90V[\x15a\x1C\x98WV[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x90\xFD[\x91`@a\x01\x80\x92\x94`\0\x94\x82Q\x93\x81Q\x85R\x83` \x98\x89\x80\x94\x01Q\x84\x88\x01R\x83\x81\x01Q\x82\x88\x01R\x80Q``\x88\x01R``\x81\x01Q`\x80\x88\x01R\x01Q`\xA0\x86\x01R\x80Q`\xC0\x86\x01R\x01Q`\xE0\x84\x01R\x85\x81\x01Qa\x01\0\x84\x01R\x80Qa\x01 \x84\x01R``\x81\x01Qa\x01@\x84\x01R\x01Qa\x01`\x82\x01R`\x08Z\xFAa\x1D_`\0Q\x91a\x1C\x91V[\x15\x15\x90V[`\x01\x82\x14a\x1D\xD5W\x82\x15a\x1D\xCDW` \x01Q`\0\x80Q` a)\x0B\x839\x81Q\x91R\x92\x83\x91\x90\t\x90\x80\x15a\x1D\xA3Wa\x1D\x9E\x90`\0\x19\x01a(\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\r\x17W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\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\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x0EUW`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0E\x92`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a\x0E\x9C\x84\x84a\x14\xADV[\x80\x82Ra\x0E\xAC\x90\x85\x90\x85\x90a\x15\x01V[` \x82\x01R\x80Qa\x0E\xC2\x90\x85\x90\x84\x90\x86\x90a\x15uV[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x0E\xEAa\x1D\x8FV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R`\0``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0F\x1CW`\0\x80\xFD[P\x80a\x0FjW`@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\x02iV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01Ra\x0F\x8Ea\x1D\xADV[\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\x0F\xCBW`\0\x80\xFD[P\x80a\x0FjW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02iV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0a\x10O\x87\x87\x87\x87a\x16\xCBV[\x90P`\0\x80Q` a\"\xEB\x839\x81Q\x91R`\0a\x10m\x88\x87\x89a\x1B\x9BV[\x90Pa\x10y\x81\x83a\"\x91V[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x10\xA6\x85a\x03\x1D\x8A`\0\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xCE\x86a\x03\x1D\x8A` \x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xF6\x86a\x03\x1D\x8A`@\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x1E\x86a\x03\x1D\x8A``\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x11F\x86a\x03\x1D\x8A`\x80\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x11n\x86a\x03\x1D\x8D`@\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x96\x86a\x03\x1D\x8D``\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xBE\x86a\x03\x1D\x8D`\x80\x01Q\x84a\x0E\xCEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xE6\x86a\x03\x1D\x8D`\xA0\x01Q\x84a\x0E\xCEV[\x95P`\0\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x12\x11\x87a\x03\x1D\x8B`\xA0\x01Q\x84a\x0E\xCEV[\x96Pa\x12Ha\x12B`@\x80Q\x80\x82\x01\x82R`\0\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x0E\xCEV[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x12\x81WP\x90V[`@Q\x80`@\x01`@R\x80\x83`\0\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x12\xC6\x91\x90a\"\xC8V[a\x12\xF0\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa\"\x91V[\x90R\x92\x91PPV[a\x13#`@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\x80a\x14\x9FW`@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\x02iV[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q`\0\x90`\0\x80Q` a\"\xEB\x839\x81Q\x91R\x90\x83\x80\x15a\x14\xF1W\x84\x93P`\0[\x82\x81\x10\x15a\x14\xE5W\x83\x85\x86\t\x94P`\x01\x01a\x14\xCFV[P`\x01\x84\x03\x93Pa\x14\xF8V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a\x15\x13WP`\x01a\0\xCDV[\x81`\0\x03a\x15#WP`\0a\0\xCDV[` \x84\x01Q`\0\x80Q` a\"\xEB\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x15SW`\x01\x87\x03\x92Pa\x15ZV[`\x01\x84\x03\x92P[Pa\x15d\x82a\x1C\x8BV[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[`\0`\0\x80Q` a\"\xEB\x839\x81Q\x91R\x82\x82\x03a\x15\xF2W`\x01`\0[`\x07\x81\x10\x15a\x15\xE6W\x81\x86\x03a\x15\xC3W\x86\x81`\x07\x81\x10a\x15\xB4Wa\x15\xB4a\"{V[` \x02\x01Q\x93PPPPa\x14\xA5V[\x82\x80a\x15\xD1Wa\x15\xD1a\"\xB2V[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x15\x92V[P`\0\x92PPPa\x14\xA5V[a\x15\xFAa\x1D\xCBV[`@\x87\x01Q`\x01`\xC0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x07\x81\x10\x15a\x16;W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x16\x0EV[PPPP`\0\x80`\0\x90P`\x01\x83\x89`@\x8C\x01Q`\0[`\x07\x81\x10\x15a\x16\x92W\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x16RV[PPPP\x80\x92PP`\0a\x16\xA5\x83a\x1C\x8BV[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R`\0\x80\x82R` \x82\x01R`\0\x80`\0\x80`\0`\0\x80Q` a\"\xEB\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7X = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"`\x80\x80`@R4a\0\x1AWa(~\x90\x81a\0 \x8290\x81PP\xF3[`\0\x80\xFD\xFE`\x80`@R`\x046\x10\x15a\0\x12W`\0\x80\xFD[`\0\x805`\xE0\x1C\x90\x81c\x1Dq.'\x14a\x01\xC7W\x81c\xCESzw\x14a\0EWPc\xDFnl\xB4\x14a\0@W`\0\x80\xFD[a\x08\xE3V[6`\x03\x19\x01a\n`\x81\x12a\x01\xC3Wa\x05\0\x13a\x01\xC0Wa\x01\xBCa\x01\xAAa\0ia\x02\x12V[`\x045\x81R`$5` \x82\x01Ra\0\x7F6a\x02\xB9V[`@\x82\x01Ra\0\x8D6a\x02\xE2V[``\x82\x01Ra\0\x9B6a\x03\x06V[`\x80\x82\x01Ra\0\xA96a\x03*V[`\xA0\x82\x01Ra\0\xB76a\x03QV[`\xC0\x82\x01Ra\0\xC56a\x03xV[`\xE0\x82\x01Ra\0\xD36a\x03\x9FV[a\x01\0\x82\x01Ra\0\xE26a\x03\xC6V[a\x01 \x82\x01Ra\0\xF16a\x03\xEDV[a\x01@\x82\x01Ra\x01\x006a\x04\x14V[a\x01`\x82\x01Ra\x01\x0F6a\x04;V[a\x01\x80\x82\x01Ra\x01\x1E6a\x04bV[a\x01\xA0\x82\x01Ra\x01-6a\x04\x89V[a\x01\xC0\x82\x01Ra\x01<6a\x04\xB0V[a\x01\xE0\x82\x01Ra\x01K6a\x04\xD7V[a\x02\0\x82\x01Ra\x01Z6a\x04\xFEV[a\x02 \x82\x01Ra\x01i6a\x05%V[a\x02@\x82\x01Ra\x01x6a\x05LV[a\x02`\x82\x01Ra\x04\xC45a\x02\x80\x82\x01Ra\x04\xE45a\x02\xA0\x82\x01Ra\x01\x9B6a\x07nV[a\x01\xA46a\x07\xAEV[\x91a\n\x1AV[`@Q\x90\x15\x15\x81R\x90\x81\x90` \x82\x01\x90V[\x03\x90\xF3[\x80\xFD[P\x80\xFD[\x80`\x03\x196\x01\x12a\x01\xC0W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG`\x80R` `\x80\xF3[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q\x90a\x02\xC0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[a\x01\xFCV[`@Q\x90`@\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@Q\x90a\x02\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@Q\x90``\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@Q\x90`\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@\x90`C\x19\x01\x12a\x02\xDDWa\x02\xCDa\x028V[\x90`D5\x82R`d5` \x83\x01RV[`\0\x80\xFD[`@\x90`\x83\x19\x01\x12a\x02\xDDWa\x02\xF6a\x028V[\x90`\x845\x82R`\xA45` \x83\x01RV[`@\x90`\xC3\x19\x01\x12a\x02\xDDWa\x03\x1Aa\x028V[\x90`\xC45\x82R`\xE45` \x83\x01RV[`@\x90a\x01\x03\x19\x01\x12a\x02\xDDWa\x03?a\x028V[\x90a\x01\x045\x82Ra\x01$5` \x83\x01RV[`@\x90a\x01C\x19\x01\x12a\x02\xDDWa\x03fa\x028V[\x90a\x01D5\x82Ra\x01d5` \x83\x01RV[`@\x90a\x01\x83\x19\x01\x12a\x02\xDDWa\x03\x8Da\x028V[\x90a\x01\x845\x82Ra\x01\xA45` \x83\x01RV[`@\x90a\x01\xC3\x19\x01\x12a\x02\xDDWa\x03\xB4a\x028V[\x90a\x01\xC45\x82Ra\x01\xE45` \x83\x01RV[`@\x90a\x02\x03\x19\x01\x12a\x02\xDDWa\x03\xDBa\x028V[\x90a\x02\x045\x82Ra\x02$5` \x83\x01RV[`@\x90a\x02C\x19\x01\x12a\x02\xDDWa\x04\x02a\x028V[\x90a\x02D5\x82Ra\x02d5` \x83\x01RV[`@\x90a\x02\x83\x19\x01\x12a\x02\xDDWa\x04)a\x028V[\x90a\x02\x845\x82Ra\x02\xA45` \x83\x01RV[`@\x90a\x02\xC3\x19\x01\x12a\x02\xDDWa\x04Pa\x028V[\x90a\x02\xC45\x82Ra\x02\xE45` \x83\x01RV[`@\x90a\x03\x03\x19\x01\x12a\x02\xDDWa\x04wa\x028V[\x90a\x03\x045\x82Ra\x03$5` \x83\x01RV[`@\x90a\x03C\x19\x01\x12a\x02\xDDWa\x04\x9Ea\x028V[\x90a\x03D5\x82Ra\x03d5` \x83\x01RV[`@\x90a\x03\x83\x19\x01\x12a\x02\xDDWa\x04\xC5a\x028V[\x90a\x03\x845\x82Ra\x03\xA45` \x83\x01RV[`@\x90a\x03\xC3\x19\x01\x12a\x02\xDDWa\x04\xECa\x028V[\x90a\x03\xC45\x82Ra\x03\xE45` \x83\x01RV[`@\x90a\x04\x03\x19\x01\x12a\x02\xDDWa\x05\x13a\x028V[\x90a\x04\x045\x82Ra\x04$5` \x83\x01RV[`@\x90a\x04C\x19\x01\x12a\x02\xDDWa\x05:a\x028V[\x90a\x04D5\x82Ra\x04d5` \x83\x01RV[`@\x90a\x04\x83\x19\x01\x12a\x02\xDDWa\x05aa\x028V[\x90a\x04\x845\x82Ra\x04\xA45` \x83\x01RV[`@\x90a\x05\xE3\x19\x01\x12a\x02\xDDWa\x05\x88a\x028V[\x90a\x05\xE45\x82Ra\x06\x045` \x83\x01RV[`@\x90a\x06#\x19\x01\x12a\x02\xDDWa\x05\xAFa\x028V[\x90a\x06$5\x82Ra\x06D5` \x83\x01RV[`@\x90a\x06c\x19\x01\x12a\x02\xDDWa\x05\xD6a\x028V[\x90a\x06d5\x82Ra\x06\x845` \x83\x01RV[`@\x90a\x06\xA3\x19\x01\x12a\x02\xDDWa\x05\xFDa\x028V[\x90a\x06\xA45\x82Ra\x06\xC45` \x83\x01RV[`@\x90a\x06\xE3\x19\x01\x12a\x02\xDDWa\x06$a\x028V[\x90a\x06\xE45\x82Ra\x07\x045` \x83\x01RV[`@\x90a\x07#\x19\x01\x12a\x02\xDDWa\x06Ka\x028V[\x90a\x07$5\x82Ra\x07D5` \x83\x01RV[`@\x90a\x07c\x19\x01\x12a\x02\xDDWa\x06ra\x028V[\x90a\x07d5\x82Ra\x07\x845` \x83\x01RV[`@\x90a\x07\xA3\x19\x01\x12a\x02\xDDWa\x06\x99a\x028V[\x90a\x07\xA45\x82Ra\x07\xC45` \x83\x01RV[`@\x90a\x07\xE3\x19\x01\x12a\x02\xDDWa\x06\xC0a\x028V[\x90a\x07\xE45\x82Ra\x08\x045` \x83\x01RV[`@\x90a\x08#\x19\x01\x12a\x02\xDDWa\x06\xE7a\x028V[\x90a\x08$5\x82Ra\x08D5` \x83\x01RV[`@\x90a\x08c\x19\x01\x12a\x02\xDDWa\x07\x0Ea\x028V[\x90a\x08d5\x82Ra\x08\x845` \x83\x01RV[`@\x90a\x08\xA3\x19\x01\x12a\x02\xDDWa\x075a\x028V[\x90a\x08\xA45\x82Ra\x08\xC45` \x83\x01RV[`@\x90a\x08\xE3\x19\x01\x12a\x02\xDDWa\x07\\a\x028V[\x90a\x08\xE45\x82Ra\t\x045` \x83\x01RV[\x80a\x05#\x12\x15a\x02\xDDWa\x07\x80a\x02\x99V[\x90\x81a\x05\xE4\x91\x82\x11a\x02\xDDWa\x05\x04\x90[\x82\x82\x10a\x07\x9EWPPP\x90V[\x815\x81R` \x91\x82\x01\x91\x01a\x07\x91V[\x90a\x04\x80a\x05\xE3\x19\x83\x01\x12a\x02\xDDWa\x08wa\x07\xC8a\x02XV[\x92a\x07\xD2\x81a\x05sV[\x84Ra\x07\xDD\x81a\x05\x9AV[` \x85\x01Ra\x07\xEB\x81a\x05\xC1V[`@\x85\x01Ra\x07\xF9\x81a\x05\xE8V[``\x85\x01Ra\x08\x07\x81a\x06\x0FV[`\x80\x85\x01Ra\x08\x15\x81a\x066V[`\xA0\x85\x01Ra\x08#\x81a\x06]V[`\xC0\x85\x01Ra\x081\x81a\x06\x84V[`\xE0\x85\x01Ra\x08?\x81a\x06\xABV[a\x01\0\x85\x01Ra\x08N\x81a\x06\xD2V[a\x01 \x85\x01Ra\x08]\x81a\x06\xF9V[a\x01@\x85\x01Ra\x08l\x81a\x07 V[a\x01`\x85\x01Ra\x07GV[a\x01\x80\x83\x01Ra\t$5a\x01\xA0\x83\x01Ra\tD5a\x01\xC0\x83\x01Ra\td5a\x01\xE0\x83\x01Ra\t\x845a\x02\0\x83\x01Ra\t\xA45a\x02 \x83\x01Ra\t\xC45a\x02@\x83\x01Ra\t\xE45a\x02`\x83\x01Ra\n\x045a\x02\x80\x83\x01Ra\n$5a\x02\xA0\x83\x01Ra\nD5a\x02\xC0\x83\x01RV[`\x006`\x03\x19\x01\x12a\x02\xDDW` `@Q`\0\x80Q` a(R\x839\x81Q\x91R\x81R\xF3[\x90`\x07\x81\x10\x15a\t\x18W`\x05\x1B\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x90\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x90\xFD[`\0```@\x92` \x84Q\x91\x80Q\x83R\x01Q` \x82\x01R`\x01\x84\x82\x01R`\x07Z\xFA\x15a\t\xBFWV[a\t.V[```\0\x91`@\x93` \x85Q\x92\x80Q\x84R\x01Q` \x83\x01R\x84\x82\x01R`\x07Z\xFA\x15a\t\xBFWV[`@\x90`\x80\x82Q\x82Q\x81R` \x83\x01Q` \x82\x01R`\0Q\x84\x82\x01R` Q``\x82\x01R`\x06Z\xFA\x15a\t\xBFWV[\x91\x90a\n%\x82a\x18\xD7V[\x80Qa\n0\x90a\x1A\x10V[` \x81\x01Qa\n>\x90a\x1A\x10V[`@\x81\x01Qa\nL\x90a\x1A\x10V[``\x81\x01Qa\nZ\x90a\x1A\x10V[`\x80\x81\x01Qa\nh\x90a\x1A\x10V[`\xA0\x81\x01Qa\nv\x90a\x1A\x10V[`\xC0\x81\x01Qa\n\x84\x90a\x1A\x10V[a\n\x8F\x82\x82\x85a\x1A\xBCV[\x90\x82\x84Qa\n\x9C\x90a\x1F\xF8V[\x91`\xA0\x84\x01Q\x90a\n\xAD\x91\x84a#\xB0V[\x94a\n\xB9\x86\x83\x86a$cV[`@Q\x96`@\x88\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\x90R``\x88\x01\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\x90R`\x80\x88\x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x90R`\xA0\x88\x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x90Ra\x01\0\x88\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\x90Ra\x01 \x88\x01\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x90Ra\x01@\x88\x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x90Ra\x01`\x88\x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x90Ra\x01\x80\x88\x01`@R`\x80\x86\x01Q` \x82\x01Q` \x88\x01Q\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\t\x87Q\x82`\xA0\x8A\x01Q``\x8B\x01Q\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\t\x91\x81a\x01\xA0\x8A\x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x90\x85\x08\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\t\x81a\x01\xC0\x8A\x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85`\x80\x82\x01R\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D`\xA0\x82\x01R\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD`\xC0\x82\x01Ra!\x03a\x02yV[\x90`\x10\x82R\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` \x83\x01R`@\x82\x01R\x90V[b\x10\0\0\x81\x14a\"\x84W` \x03a\"rWa!Oa\x02\x99V[`\x01\x81R\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!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B`@\x82\x01R\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;``\x82\x01R\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80`\x80\x82\x01R\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE`\xA0\x82\x01R\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C`\xC0\x82\x01Ra\"?a\x02yV[\x90`\x05\x82R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01` \x83\x01R`@\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x90\xFD[Pa\"\x8Da\x02\x99V[`\x01\x81R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW` \x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD`@\x82\x01R\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B``\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`\x80\x82\x01R\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18`\xA0\x82\x01R\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\`\xC0\x82\x01Ra#}a\x02yV[\x90`\x14\x82R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01` \x83\x01R`@\x82\x01R\x90V[\x91\x92\x90\x92a#\xBCa\x02yV[\x92`\0\x84R` \x84\x01\x94`\0\x86R`@\x85\x01\x92`\0\x84R\x85\x83Q\x97\x83`\0\x14a$2W\x83\x98`\0\x90[\x80\x82\x10a$\x14WPPa$\x07a$\x10\x96\x97\x98\x99`\0\x19\x01[\x80\x84R\x85\x87a%\xBAV[\x90RQ\x92a&3V[\x90RV[\x90\x99`\0\x80Q` a(R\x839\x81Q\x91R\x81`\x01\x92\t\x9A\x01\x90a#\xE5V[a$\x10\x95\x96\x97\x98Pa$\x07\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a#\xFDV[\x90`@` \x84\x01Q\x93\x01Q\x92``\x83\x01Q`\x80\x84\x01Q\x94a\x01\xA0\x84\x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x87\x81\x87\x81\x80\x80\x9C\x98\x81\x80\x80\x80\x9E\x81\x80\x9E\x9C\x81\x80\x9E\x81a\x02@\x81\x96\x01Q\x8A\t\x92\x08\x08`\x01\t\x81a\x01\xC0\x89\x01Q\x81\x8C\x81a\x02`\x8D\x01Q\x8A\t\x92\x08\x08\x90\t\x81a\x01\xE0\x88\x01Q\x81\x8B\x81a\x02\x80\x8C\x01Q\x89\t\x92\x08\x08\x90\t\x91\x81\x88\x81a\x02\0\x89\x01Q\x93a\x02\xA0\x8A\x01Q\x90\t\x92\x08\x08\x90\t\x93a\x02\xC0a\x02 \x84\x01Q\x93\x01Q\x92\x08\t\x90\t\x93` \x87Q\x97\x01Q\t\x82\x03\x90\x08\x92\t\x82\x03\x90\x08\x90V[` \x81Q\x91\x01Q\x90\x81\x15\x81\x15\x16a%\xB6W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x80\x80`\x03\x81\x80\x86\x80\t\x86\t\x08\x81\x85\x80\t\x14\x93\x10\x91\x10\x16\x16\x15a%qWV[`@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\x90\xFD[PPV[`\x01\x82\x14a&+W\x82\x15a&#W` \x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x92\x83\x91\x90\t\x90\x80\x15a%\xF9Wa%\xF4\x90`\0\x19\x01a'\xA1V[\x90\t\x90V[Pa%\xF4\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a'\xA1V[PPP`\0\x90V[PPP`\x01\x90V[\x93\x92\x91\x90\x91\x80\x15a'=Wa&I\x92\x91\x92a\x1F\xC0V[\x91`\xC0\x83\x01\x93`@\x87\x01\x94`\xC0\x86Q\x01\x90`\x01\x90`\x01\x81R`\x01\x90[`\x07\x82\x10a'\x03WPPPP`\0\x94`\x01\x94\x92\x90Q\x90`\0\x90[`\x07\x82\x10a&\xB8WPPPPP\x93a&\xAE\x91` \x94\x95`\0\x80Q` a(R\x839\x81Q\x91R\x95\x86\x94\x85\x93a'\xA1V[\x93\x01Q\x90\t\t\t\x90V[\x90\x91\x92\x93\x95\x96`\x01\x90\x84Q\x98\x89\x87\x8A`\0\x80Q` a(R\x839\x81Q\x91R\x94\x85\x80\x94\x81\x80\x94\x81\x8CQ\x91Q\x8A\t\t\t\x90\x08\x9B\x82\x03\x08\x90\t\x96` \x80\x80\x92\x01\x93\x01\x94\x01\x92\x01\x90\x93\x92a&\x7FV[`\x01\x90`\x1F\x99\x95\x96\x99\x19\x80\x91\x01\x93`\0\x80Q` a(R\x839\x81Q\x91R\x90\x81\x89\x88Q\x82\x03\x08\x90\t\x94\x85\x85R\x01\x91\x01\x90\x92\x91\x97\x94\x93\x97a&eV[P\x91\x92`\x01\x92\x91`\0\x91\x90\x84[`\x07\x84\x10a']WPPPPPP`\0\x90V[\x80\x85\x14a'\x8EW`\0\x80Q` a(R\x839\x81Q\x91R\x86\x91a'\x83`@\x86\x01Q` \x01\x90V[Q\x90\t\x93\x01\x92a'JV[P\x91\x92PPa'\x9D\x92Pa\t\x07V[Q\x90V[\x90`@Q\x91`\0`\xC0` \x94\x85\x93\x84\x82R\x84\x80\x83\x01R\x84`@\x83\x01R``\x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xEF\xFF\xFF\xFF`\x80\x82\x01R`\0\x80Q` a(R\x839\x81Q\x91R`\xA0\x82\x01R`\x05Z\xFA\x91`\0Q\x92\x15a(\rWPV[`d\x90`@Q\x90bF\x1B\xCD`\xE5\x1B\x82R`\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R\xFD\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n"; + const __BYTECODE: &[u8] = b"a&\xDCa\0:`\x0B\x82\x82\x829\x80Q`\0\x1A`s\x14a\0-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`\x046\x10a\0KW`\x005`\xE0\x1C\x80c\x1Dq.'\x14a\0PW\x80c\xCESzw\x14a\0\x8AW\x80c\xDFnl\xB4\x14a\0\xADW[`\0\x80\xFD[a\0w\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x9Da\0\x986`\x04a$\xA1V[a\0\xC2V[`@Q\x90\x15\x15\x81R` \x01a\0\x81V[a\0w`\0\x80Q` a&\xB0\x839\x81Q\x91R\x81V[`\0a\0\xCD\x82a\x10}V[a\0\xDE\x83`\0[` \x02\x01Qa\x11\xB8V[a\0\xE9\x83`\x01a\0\xD4V[a\0\xF4\x83`\x02a\0\xD4V[a\0\xFF\x83`\x03a\0\xD4V[a\x01\n\x83`\x04a\0\xD4V[a\x01\x15\x83`\x05a\0\xD4V[a\x01 \x83`\x06a\0\xD4V[`\0a\x01-\x85\x85\x85a\x12\x1BV[\x90P`\0a\x01>\x86`\0\x01Qa\x186V[\x90P`\0a\x01Q\x82\x84`\xA0\x01Q\x88a\x1C\x14V[\x90P`\0a\x01`\x84\x87\x84a\x1CtV[\x90Pa\x02AV[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x81\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x81\xFD[`@Q\x81Q\x81R` \x82\x01Q` \x82\x01R\x82`@\x82\x01R`@`\0``\x83`\x07Z\xFA\x90P\x80a\x02\x01Wa\x02\x01a\x01gV[PPPV[`@\x80Q\x82Q\x81R` \x80\x84\x01Q\x81\x83\x01R`\0Q\x82\x84\x01RQ``\x82\x01R\x90\x82`\x80\x83`\x06Z\xFA\x90P\x80a\x02=Wa\x02=a\x01gV[PPV[`@Q`\xC0\x81\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`@\x83\x01R\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``\x83\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4`\x80\x83\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`\xA0\x83\x01R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2a\x01\0\x83\x01R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xEDa\x01 \x83\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[a\x01@\x83\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAAa\x01`\x83\x01Ra\x01\x80\x82\x01`@R`\0\x80`\0\x80`\x80\x8A\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R` \x8A\x01Q` \x8D\x01Q\t\x93P\x8AQ`\0\x80Q` a&\xB0\x839\x81Q\x91R`\xA0\x8D\x01Q``\x8E\x01Q\t\x93P`\0\x80Q` a&\xB0\x839\x81Q\x91Ra\x01\xA0\x8F\x01Q\x85\x08\x92P`\0\x80Q` a&\xB0\x839\x81Q\x91R\x82\x84\x08\x92P`\0\x80Q` a&\xB0\x839\x81Q\x91R\x81\x84\t\x90P`\0\x80Q` a&\xB0\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7Xa!\xADV[\x81b\x01\0\0\x03a\x19}W`@Q\x80``\x01`@R\x80`\x10\x81R` \x01\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\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7\x81R` \x01\x7F-\x1B\xA6oYA\xDC\x91\x01qq\xFAi\xEC+\xD0\x02**-A\x15\xA0\t\xA94X\xFDN&\xEC\xFB\x81R` \x01\x7F\x08h\x12\xA0\n\xC4>\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x1A\xBDW`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\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\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x1B\xFBW`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1C8`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a\x1CB\x84\x84a\x1E\xE5V[\x80\x82Ra\x1CR\x90\x85\x90\x85\x90a\x1F9V[` \x82\x01R\x80Qa\x1Ch\x90\x85\x90\x84\x90\x86\x90a\x1F\xAFV[`@\x82\x01R\x93\x92PPPV[` \x81\x01Q`@\x82\x01Q``\x85\x01Q`\x80\x86\x01Qa\x01\xA0\x86\x01Qa\x02@\x87\x01Q`\0\x95\x94\x93`\x01\x93\x90\x92\x90\x91`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80\x80\x83\x87\t`\0\x80Q` a&\xB0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x88\x01Qa\x02`\x89\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80`\0\x80Q` a&\xB0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a&\xB0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x88\x01Qa\x02\x80\x89\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80`\0\x80Q` a&\xB0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a&\xB0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x88\x01Qa\x02\xA0\x89\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80`\0\x80Q` a&\xB0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a&\xB0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x88\x01Q\x91Pa\x02\xC0\x88\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80\x82`\0\x80Q` a&\xB0\x839\x81Q\x91R\x85\x87\x08\t\x85\t\x93PPPP\x86Q` \x88\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80\x86\x83\t`\0\x80Q` a&\xB0\x839\x81Q\x91R\x03\x85\x08\x95PP`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80\x83\x83\t`\0\x80Q` a&\xB0\x839\x81Q\x91R\x03\x86\x08\x98\x97PPPPPPPPV[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x1EuWPPPV[\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\x02\x01W`@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\x12\x12V[\x81Q`\0\x90`\0\x80Q` a&\xB0\x839\x81Q\x91R\x90\x83\x80\x15a\x1F)W\x84\x93P`\0[\x82\x81\x10\x15a\x1F\x1DW\x83\x85\x86\t\x94P`\x01\x01a\x1F\x07V[P`\x01\x84\x03\x93Pa\x1F0V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a\x1FKWP`\x01a\x1F\xA8V[\x81`\0\x03a\x1F[WP`\0a\x1F\xA8V[` \x84\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x1F\x8BW`\x01\x87\x03\x92Pa\x1F\x92V[`\x01\x84\x03\x92P[Pa\x1F\x9C\x82a!\x07V[\x91P\x82\x82\x82\t\x93PPPP[\x93\x92PPPV[`\0`\0\x80Q` a&\xB0\x839\x81Q\x91R\x82\x82\x03a ,W`\x01`\0[`\x07\x81\x10\x15a W\x81\x86\x03a\x1F\xFDW\x86\x81`\x07\x81\x10a\x1F\xEEWa\x1F\xEEa&\x83V[` \x02\x01Q\x93PPPPa \xFFV[\x82\x80a \x0BWa \x0Ba&\x99V[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x1F\xCCV[P`\0\x92PPPa \xFFV[a 4a!\xD3V[`@\x87\x01Q`\x01`\xC0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x07\x81\x10\x15a uW` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a HV[PPPP`\0\x80`\0\x90P`\x01\x83\x89`@\x8C\x01Q`\0[`\x07\x81\x10\x15a \xCCW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a \x8CV[PPPP\x80\x92PP`\0a \xDF\x83a!\x07V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x95PPPPPP[\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` a&\xB0\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\x81a!\xA6W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x12\x12V[PP\x91\x90PV[`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01a!\xCEa!\xD3V[\x90R\x90V[`@Q\x80`\xE0\x01`@R\x80`\x07\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x02\xE0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\"+Wa\"+a!\xF1V[`@R\x90V[`@Qa\x02\xC0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\"+Wa\"+a!\xF1V[`\0`@\x82\x84\x03\x12\x15a\"gW`\0\x80\xFD[`@Q`@\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\"\x8AWa\"\x8Aa!\xF1V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a\"\xB5W`\0\x80\xFD[`@Q`\xE0\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\"\xD8Wa\"\xD8a!\xF1V[`@R\x80`\xE0\x84\x01\x85\x81\x11\x15a\"\xEDW`\0\x80\xFD[\x84[\x81\x81\x10\x15a#\x07W\x805\x83R` \x92\x83\x01\x92\x01a\"\xEFV[P\x91\x95\x94PPPPPV[`\0a\x04\x80\x82\x84\x03\x12\x15a#%W`\0\x80\xFD[a#-a\"\x07V[\x90Pa#9\x83\x83a\"UV[\x81Ra#H\x83`@\x84\x01a\"UV[` \x82\x01Ra#Z\x83`\x80\x84\x01a\"UV[`@\x82\x01Ra#l\x83`\xC0\x84\x01a\"UV[``\x82\x01Ra\x01\0a#\x80\x84\x82\x85\x01a\"UV[`\x80\x83\x01Ra\x01@a#\x94\x85\x82\x86\x01a\"UV[`\xA0\x84\x01Ra\x01\x80a#\xA8\x86\x82\x87\x01a\"UV[`\xC0\x85\x01Ra\x01\xC0a#\xBC\x87\x82\x88\x01a\"UV[`\xE0\x86\x01Ra\x02\0a#\xD0\x88\x82\x89\x01a\"UV[\x85\x87\x01Ra\x02@\x94Pa#\xE5\x88\x86\x89\x01a\"UV[a\x01 \x87\x01Ra\x02\x80a#\xFA\x89\x82\x8A\x01a\"UV[\x85\x88\x01Ra\x02\xC0\x94Pa$\x0F\x89\x86\x8A\x01a\"UV[a\x01`\x88\x01Ra$#\x89a\x03\0\x8A\x01a\"UV[\x84\x88\x01Ra\x03@\x88\x015a\x01\xA0\x88\x01Ra\x03`\x88\x015\x83\x88\x01Ra\x03\x80\x88\x015a\x01\xE0\x88\x01Ra\x03\xA0\x88\x015\x82\x88\x01Ra\x03\xC0\x88\x015a\x02 \x88\x01Ra\x03\xE0\x88\x015\x86\x88\x01Ra\x04\0\x88\x015a\x02`\x88\x01Ra\x04 \x88\x015\x81\x88\x01RPPPPa\x04@\x84\x015a\x02\xA0\x84\x01Ra\x04`\x84\x015\x81\x84\x01RPP\x92\x91PPV[`\0\x80`\0\x83\x85\x03a\n`\x81\x12\x15a$\xB8W`\0\x80\xFD[a\x05\0\x80\x82\x12\x15a$\xC8W`\0\x80\xFD[a$\xD0a\"1V[\x91P\x855\x82R` \x86\x015` \x83\x01Ra$\xED\x87`@\x88\x01a\"UV[`@\x83\x01Ra$\xFF\x87`\x80\x88\x01a\"UV[``\x83\x01Ra%\x11\x87`\xC0\x88\x01a\"UV[`\x80\x83\x01Ra\x01\0a%%\x88\x82\x89\x01a\"UV[`\xA0\x84\x01Ra\x01@a%9\x89\x82\x8A\x01a\"UV[`\xC0\x85\x01Ra\x01\x80a%M\x8A\x82\x8B\x01a\"UV[`\xE0\x86\x01Ra\x01\xC0a%a\x8B\x82\x8C\x01a\"UV[\x84\x87\x01Ra\x02\0\x93Pa%v\x8B\x85\x8C\x01a\"UV[a\x01 \x87\x01Ra\x02@a%\x8B\x8C\x82\x8D\x01a\"UV[\x84\x88\x01Ra\x02\x80\x93Pa%\xA0\x8C\x85\x8D\x01a\"UV[a\x01`\x88\x01Ra%\xB4\x8Ca\x02\xC0\x8D\x01a\"UV[\x83\x88\x01Ra%\xC6\x8Ca\x03\0\x8D\x01a\"UV[a\x01\xA0\x88\x01Ra%\xDA\x8Ca\x03@\x8D\x01a\"UV[\x82\x88\x01Ra%\xEC\x8Ca\x03\x80\x8D\x01a\"UV[a\x01\xE0\x88\x01Ra&\0\x8Ca\x03\xC0\x8D\x01a\"UV[\x85\x88\x01Ra&\x12\x8Ca\x04\0\x8D\x01a\"UV[a\x02 \x88\x01Ra&&\x8Ca\x04@\x8D\x01a\"UV[\x81\x88\x01RPPPa&;\x89a\x04\x80\x8A\x01a\"UV[a\x02`\x85\x01Ra\x04\xC0\x88\x015\x81\x85\x01RPPa\x04\xE0\x86\x015a\x02\xA0\x83\x01R\x81\x94Pa&h\x87\x82\x88\x01a\"\xA4V[\x93PPPa&z\x85a\x05\xE0\x86\x01a#\x12V[\x90P\x92P\x92P\x92V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD\xFE0dNr\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 PLONKVERIFIER2_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__BYTECODE); #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"`\x80`@R`\x046\x10\x15a\0\x12W`\0\x80\xFD[`\0\x805`\xE0\x1C\x90\x81c\x1Dq.'\x14a\x01\xC7W\x81c\xCESzw\x14a\0EWPc\xDFnl\xB4\x14a\0@W`\0\x80\xFD[a\x08\xE3V[6`\x03\x19\x01a\n`\x81\x12a\x01\xC3Wa\x05\0\x13a\x01\xC0Wa\x01\xBCa\x01\xAAa\0ia\x02\x12V[`\x045\x81R`$5` \x82\x01Ra\0\x7F6a\x02\xB9V[`@\x82\x01Ra\0\x8D6a\x02\xE2V[``\x82\x01Ra\0\x9B6a\x03\x06V[`\x80\x82\x01Ra\0\xA96a\x03*V[`\xA0\x82\x01Ra\0\xB76a\x03QV[`\xC0\x82\x01Ra\0\xC56a\x03xV[`\xE0\x82\x01Ra\0\xD36a\x03\x9FV[a\x01\0\x82\x01Ra\0\xE26a\x03\xC6V[a\x01 \x82\x01Ra\0\xF16a\x03\xEDV[a\x01@\x82\x01Ra\x01\x006a\x04\x14V[a\x01`\x82\x01Ra\x01\x0F6a\x04;V[a\x01\x80\x82\x01Ra\x01\x1E6a\x04bV[a\x01\xA0\x82\x01Ra\x01-6a\x04\x89V[a\x01\xC0\x82\x01Ra\x01<6a\x04\xB0V[a\x01\xE0\x82\x01Ra\x01K6a\x04\xD7V[a\x02\0\x82\x01Ra\x01Z6a\x04\xFEV[a\x02 \x82\x01Ra\x01i6a\x05%V[a\x02@\x82\x01Ra\x01x6a\x05LV[a\x02`\x82\x01Ra\x04\xC45a\x02\x80\x82\x01Ra\x04\xE45a\x02\xA0\x82\x01Ra\x01\x9B6a\x07nV[a\x01\xA46a\x07\xAEV[\x91a\n\x1AV[`@Q\x90\x15\x15\x81R\x90\x81\x90` \x82\x01\x90V[\x03\x90\xF3[\x80\xFD[P\x80\xFD[\x80`\x03\x196\x01\x12a\x01\xC0W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG`\x80R` `\x80\xF3[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Q\x90a\x02\xC0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[a\x01\xFCV[`@Q\x90`@\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@Q\x90a\x02\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@Q\x90``\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@Q\x90`\xE0\x82\x01\x82\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17a\x023W`@RV[`@\x90`C\x19\x01\x12a\x02\xDDWa\x02\xCDa\x028V[\x90`D5\x82R`d5` \x83\x01RV[`\0\x80\xFD[`@\x90`\x83\x19\x01\x12a\x02\xDDWa\x02\xF6a\x028V[\x90`\x845\x82R`\xA45` \x83\x01RV[`@\x90`\xC3\x19\x01\x12a\x02\xDDWa\x03\x1Aa\x028V[\x90`\xC45\x82R`\xE45` \x83\x01RV[`@\x90a\x01\x03\x19\x01\x12a\x02\xDDWa\x03?a\x028V[\x90a\x01\x045\x82Ra\x01$5` \x83\x01RV[`@\x90a\x01C\x19\x01\x12a\x02\xDDWa\x03fa\x028V[\x90a\x01D5\x82Ra\x01d5` \x83\x01RV[`@\x90a\x01\x83\x19\x01\x12a\x02\xDDWa\x03\x8Da\x028V[\x90a\x01\x845\x82Ra\x01\xA45` \x83\x01RV[`@\x90a\x01\xC3\x19\x01\x12a\x02\xDDWa\x03\xB4a\x028V[\x90a\x01\xC45\x82Ra\x01\xE45` \x83\x01RV[`@\x90a\x02\x03\x19\x01\x12a\x02\xDDWa\x03\xDBa\x028V[\x90a\x02\x045\x82Ra\x02$5` \x83\x01RV[`@\x90a\x02C\x19\x01\x12a\x02\xDDWa\x04\x02a\x028V[\x90a\x02D5\x82Ra\x02d5` \x83\x01RV[`@\x90a\x02\x83\x19\x01\x12a\x02\xDDWa\x04)a\x028V[\x90a\x02\x845\x82Ra\x02\xA45` \x83\x01RV[`@\x90a\x02\xC3\x19\x01\x12a\x02\xDDWa\x04Pa\x028V[\x90a\x02\xC45\x82Ra\x02\xE45` \x83\x01RV[`@\x90a\x03\x03\x19\x01\x12a\x02\xDDWa\x04wa\x028V[\x90a\x03\x045\x82Ra\x03$5` \x83\x01RV[`@\x90a\x03C\x19\x01\x12a\x02\xDDWa\x04\x9Ea\x028V[\x90a\x03D5\x82Ra\x03d5` \x83\x01RV[`@\x90a\x03\x83\x19\x01\x12a\x02\xDDWa\x04\xC5a\x028V[\x90a\x03\x845\x82Ra\x03\xA45` \x83\x01RV[`@\x90a\x03\xC3\x19\x01\x12a\x02\xDDWa\x04\xECa\x028V[\x90a\x03\xC45\x82Ra\x03\xE45` \x83\x01RV[`@\x90a\x04\x03\x19\x01\x12a\x02\xDDWa\x05\x13a\x028V[\x90a\x04\x045\x82Ra\x04$5` \x83\x01RV[`@\x90a\x04C\x19\x01\x12a\x02\xDDWa\x05:a\x028V[\x90a\x04D5\x82Ra\x04d5` \x83\x01RV[`@\x90a\x04\x83\x19\x01\x12a\x02\xDDWa\x05aa\x028V[\x90a\x04\x845\x82Ra\x04\xA45` \x83\x01RV[`@\x90a\x05\xE3\x19\x01\x12a\x02\xDDWa\x05\x88a\x028V[\x90a\x05\xE45\x82Ra\x06\x045` \x83\x01RV[`@\x90a\x06#\x19\x01\x12a\x02\xDDWa\x05\xAFa\x028V[\x90a\x06$5\x82Ra\x06D5` \x83\x01RV[`@\x90a\x06c\x19\x01\x12a\x02\xDDWa\x05\xD6a\x028V[\x90a\x06d5\x82Ra\x06\x845` \x83\x01RV[`@\x90a\x06\xA3\x19\x01\x12a\x02\xDDWa\x05\xFDa\x028V[\x90a\x06\xA45\x82Ra\x06\xC45` \x83\x01RV[`@\x90a\x06\xE3\x19\x01\x12a\x02\xDDWa\x06$a\x028V[\x90a\x06\xE45\x82Ra\x07\x045` \x83\x01RV[`@\x90a\x07#\x19\x01\x12a\x02\xDDWa\x06Ka\x028V[\x90a\x07$5\x82Ra\x07D5` \x83\x01RV[`@\x90a\x07c\x19\x01\x12a\x02\xDDWa\x06ra\x028V[\x90a\x07d5\x82Ra\x07\x845` \x83\x01RV[`@\x90a\x07\xA3\x19\x01\x12a\x02\xDDWa\x06\x99a\x028V[\x90a\x07\xA45\x82Ra\x07\xC45` \x83\x01RV[`@\x90a\x07\xE3\x19\x01\x12a\x02\xDDWa\x06\xC0a\x028V[\x90a\x07\xE45\x82Ra\x08\x045` \x83\x01RV[`@\x90a\x08#\x19\x01\x12a\x02\xDDWa\x06\xE7a\x028V[\x90a\x08$5\x82Ra\x08D5` \x83\x01RV[`@\x90a\x08c\x19\x01\x12a\x02\xDDWa\x07\x0Ea\x028V[\x90a\x08d5\x82Ra\x08\x845` \x83\x01RV[`@\x90a\x08\xA3\x19\x01\x12a\x02\xDDWa\x075a\x028V[\x90a\x08\xA45\x82Ra\x08\xC45` \x83\x01RV[`@\x90a\x08\xE3\x19\x01\x12a\x02\xDDWa\x07\\a\x028V[\x90a\x08\xE45\x82Ra\t\x045` \x83\x01RV[\x80a\x05#\x12\x15a\x02\xDDWa\x07\x80a\x02\x99V[\x90\x81a\x05\xE4\x91\x82\x11a\x02\xDDWa\x05\x04\x90[\x82\x82\x10a\x07\x9EWPPP\x90V[\x815\x81R` \x91\x82\x01\x91\x01a\x07\x91V[\x90a\x04\x80a\x05\xE3\x19\x83\x01\x12a\x02\xDDWa\x08wa\x07\xC8a\x02XV[\x92a\x07\xD2\x81a\x05sV[\x84Ra\x07\xDD\x81a\x05\x9AV[` \x85\x01Ra\x07\xEB\x81a\x05\xC1V[`@\x85\x01Ra\x07\xF9\x81a\x05\xE8V[``\x85\x01Ra\x08\x07\x81a\x06\x0FV[`\x80\x85\x01Ra\x08\x15\x81a\x066V[`\xA0\x85\x01Ra\x08#\x81a\x06]V[`\xC0\x85\x01Ra\x081\x81a\x06\x84V[`\xE0\x85\x01Ra\x08?\x81a\x06\xABV[a\x01\0\x85\x01Ra\x08N\x81a\x06\xD2V[a\x01 \x85\x01Ra\x08]\x81a\x06\xF9V[a\x01@\x85\x01Ra\x08l\x81a\x07 V[a\x01`\x85\x01Ra\x07GV[a\x01\x80\x83\x01Ra\t$5a\x01\xA0\x83\x01Ra\tD5a\x01\xC0\x83\x01Ra\td5a\x01\xE0\x83\x01Ra\t\x845a\x02\0\x83\x01Ra\t\xA45a\x02 \x83\x01Ra\t\xC45a\x02@\x83\x01Ra\t\xE45a\x02`\x83\x01Ra\n\x045a\x02\x80\x83\x01Ra\n$5a\x02\xA0\x83\x01Ra\nD5a\x02\xC0\x83\x01RV[`\x006`\x03\x19\x01\x12a\x02\xDDW` `@Q`\0\x80Q` a(R\x839\x81Q\x91R\x81R\xF3[\x90`\x07\x81\x10\x15a\t\x18W`\x05\x1B\x01\x90V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x90\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x90\xFD[`\0```@\x92` \x84Q\x91\x80Q\x83R\x01Q` \x82\x01R`\x01\x84\x82\x01R`\x07Z\xFA\x15a\t\xBFWV[a\t.V[```\0\x91`@\x93` \x85Q\x92\x80Q\x84R\x01Q` \x83\x01R\x84\x82\x01R`\x07Z\xFA\x15a\t\xBFWV[`@\x90`\x80\x82Q\x82Q\x81R` \x83\x01Q` \x82\x01R`\0Q\x84\x82\x01R` Q``\x82\x01R`\x06Z\xFA\x15a\t\xBFWV[\x91\x90a\n%\x82a\x18\xD7V[\x80Qa\n0\x90a\x1A\x10V[` \x81\x01Qa\n>\x90a\x1A\x10V[`@\x81\x01Qa\nL\x90a\x1A\x10V[``\x81\x01Qa\nZ\x90a\x1A\x10V[`\x80\x81\x01Qa\nh\x90a\x1A\x10V[`\xA0\x81\x01Qa\nv\x90a\x1A\x10V[`\xC0\x81\x01Qa\n\x84\x90a\x1A\x10V[a\n\x8F\x82\x82\x85a\x1A\xBCV[\x90\x82\x84Qa\n\x9C\x90a\x1F\xF8V[\x91`\xA0\x84\x01Q\x90a\n\xAD\x91\x84a#\xB0V[\x94a\n\xB9\x86\x83\x86a$cV[`@Q\x96`@\x88\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\x90R``\x88\x01\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\x90R`\x80\x88\x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x90R`\xA0\x88\x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x90Ra\x01\0\x88\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\x90Ra\x01 \x88\x01\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x90Ra\x01@\x88\x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x90Ra\x01`\x88\x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x90Ra\x01\x80\x88\x01`@R`\x80\x86\x01Q` \x82\x01Q` \x88\x01Q\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\t\x87Q\x82`\xA0\x8A\x01Q``\x8B\x01Q\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\t\x91\x81a\x01\xA0\x8A\x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x90\x85\x08\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\x08\x90`\0\x80Q` a(R\x839\x81Q\x91R\x91\t\x81a\x01\xC0\x8A\x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85`\x80\x82\x01R\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D`\xA0\x82\x01R\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD`\xC0\x82\x01Ra!\x03a\x02yV[\x90`\x10\x82R\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` \x83\x01R`@\x82\x01R\x90V[b\x10\0\0\x81\x14a\"\x84W` \x03a\"rWa!Oa\x02\x99V[`\x01\x81R\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!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B`@\x82\x01R\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;``\x82\x01R\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80`\x80\x82\x01R\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE`\xA0\x82\x01R\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C`\xC0\x82\x01Ra\"?a\x02yV[\x90`\x05\x82R\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01` \x83\x01R`@\x82\x01R\x90V[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x90\xFD[Pa\"\x8Da\x02\x99V[`\x01\x81R\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW` \x82\x01R\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD`@\x82\x01R\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B``\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`\x80\x82\x01R\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18`\xA0\x82\x01R\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\`\xC0\x82\x01Ra#}a\x02yV[\x90`\x14\x82R\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01` \x83\x01R`@\x82\x01R\x90V[\x91\x92\x90\x92a#\xBCa\x02yV[\x92`\0\x84R` \x84\x01\x94`\0\x86R`@\x85\x01\x92`\0\x84R\x85\x83Q\x97\x83`\0\x14a$2W\x83\x98`\0\x90[\x80\x82\x10a$\x14WPPa$\x07a$\x10\x96\x97\x98\x99`\0\x19\x01[\x80\x84R\x85\x87a%\xBAV[\x90RQ\x92a&3V[\x90RV[\x90\x99`\0\x80Q` a(R\x839\x81Q\x91R\x81`\x01\x92\t\x9A\x01\x90a#\xE5V[a$\x10\x95\x96\x97\x98Pa$\x07\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a#\xFDV[\x90`@` \x84\x01Q\x93\x01Q\x92``\x83\x01Q`\x80\x84\x01Q\x94a\x01\xA0\x84\x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x87\x81\x87\x81\x80\x80\x9C\x98\x81\x80\x80\x80\x9E\x81\x80\x9E\x9C\x81\x80\x9E\x81a\x02@\x81\x96\x01Q\x8A\t\x92\x08\x08`\x01\t\x81a\x01\xC0\x89\x01Q\x81\x8C\x81a\x02`\x8D\x01Q\x8A\t\x92\x08\x08\x90\t\x81a\x01\xE0\x88\x01Q\x81\x8B\x81a\x02\x80\x8C\x01Q\x89\t\x92\x08\x08\x90\t\x91\x81\x88\x81a\x02\0\x89\x01Q\x93a\x02\xA0\x8A\x01Q\x90\t\x92\x08\x08\x90\t\x93a\x02\xC0a\x02 \x84\x01Q\x93\x01Q\x92\x08\t\x90\t\x93` \x87Q\x97\x01Q\t\x82\x03\x90\x08\x92\t\x82\x03\x90\x08\x90V[` \x81Q\x91\x01Q\x90\x81\x15\x81\x15\x16a%\xB6W\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x80\x80`\x03\x81\x80\x86\x80\t\x86\t\x08\x81\x85\x80\t\x14\x93\x10\x91\x10\x16\x16\x15a%qWV[`@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\x90\xFD[PPV[`\x01\x82\x14a&+W\x82\x15a&#W` \x01Q`\0\x80Q` a(R\x839\x81Q\x91R\x92\x83\x91\x90\t\x90\x80\x15a%\xF9Wa%\xF4\x90`\0\x19\x01a'\xA1V[\x90\t\x90V[Pa%\xF4\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\0a'\xA1V[PPP`\0\x90V[PPP`\x01\x90V[\x93\x92\x91\x90\x91\x80\x15a'=Wa&I\x92\x91\x92a\x1F\xC0V[\x91`\xC0\x83\x01\x93`@\x87\x01\x94`\xC0\x86Q\x01\x90`\x01\x90`\x01\x81R`\x01\x90[`\x07\x82\x10a'\x03WPPPP`\0\x94`\x01\x94\x92\x90Q\x90`\0\x90[`\x07\x82\x10a&\xB8WPPPPP\x93a&\xAE\x91` \x94\x95`\0\x80Q` a(R\x839\x81Q\x91R\x95\x86\x94\x85\x93a'\xA1V[\x93\x01Q\x90\t\t\t\x90V[\x90\x91\x92\x93\x95\x96`\x01\x90\x84Q\x98\x89\x87\x8A`\0\x80Q` a(R\x839\x81Q\x91R\x94\x85\x80\x94\x81\x80\x94\x81\x8CQ\x91Q\x8A\t\t\t\x90\x08\x9B\x82\x03\x08\x90\t\x96` \x80\x80\x92\x01\x93\x01\x94\x01\x92\x01\x90\x93\x92a&\x7FV[`\x01\x90`\x1F\x99\x95\x96\x99\x19\x80\x91\x01\x93`\0\x80Q` a(R\x839\x81Q\x91R\x90\x81\x89\x88Q\x82\x03\x08\x90\t\x94\x85\x85R\x01\x91\x01\x90\x92\x91\x97\x94\x93\x97a&eV[P\x91\x92`\x01\x92\x91`\0\x91\x90\x84[`\x07\x84\x10a']WPPPPPP`\0\x90V[\x80\x85\x14a'\x8EW`\0\x80Q` a(R\x839\x81Q\x91R\x86\x91a'\x83`@\x86\x01Q` \x01\x90V[Q\x90\t\x93\x01\x92a'JV[P\x91\x92PPa'\x9D\x92Pa\t\x07V[Q\x90V[\x90`@Q\x91`\0`\xC0` \x94\x85\x93\x84\x82R\x84\x80\x83\x01R\x84`@\x83\x01R``\x82\x01R\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xEF\xFF\xFF\xFF`\x80\x82\x01R`\0\x80Q` a(R\x839\x81Q\x91R`\xA0\x82\x01R`\x05Z\xFA\x91`\0Q\x92\x15a(\rWPV[`d\x90`@Q\x90bF\x1B\xCD`\xE5\x1B\x82R`\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R\xFD\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n"; + 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`\x046\x10a\0KW`\x005`\xE0\x1C\x80c\x1Dq.'\x14a\0PW\x80c\xCESzw\x14a\0\x8AW\x80c\xDFnl\xB4\x14a\0\xADW[`\0\x80\xFD[a\0w\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x9Da\0\x986`\x04a$\xA1V[a\0\xC2V[`@Q\x90\x15\x15\x81R` \x01a\0\x81V[a\0w`\0\x80Q` a&\xB0\x839\x81Q\x91R\x81V[`\0a\0\xCD\x82a\x10}V[a\0\xDE\x83`\0[` \x02\x01Qa\x11\xB8V[a\0\xE9\x83`\x01a\0\xD4V[a\0\xF4\x83`\x02a\0\xD4V[a\0\xFF\x83`\x03a\0\xD4V[a\x01\n\x83`\x04a\0\xD4V[a\x01\x15\x83`\x05a\0\xD4V[a\x01 \x83`\x06a\0\xD4V[`\0a\x01-\x85\x85\x85a\x12\x1BV[\x90P`\0a\x01>\x86`\0\x01Qa\x186V[\x90P`\0a\x01Q\x82\x84`\xA0\x01Q\x88a\x1C\x14V[\x90P`\0a\x01`\x84\x87\x84a\x1CtV[\x90Pa\x02AV[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x81\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x81\xFD[`@Q\x81Q\x81R` \x82\x01Q` \x82\x01R\x82`@\x82\x01R`@`\0``\x83`\x07Z\xFA\x90P\x80a\x02\x01Wa\x02\x01a\x01gV[PPPV[`@\x80Q\x82Q\x81R` \x80\x84\x01Q\x81\x83\x01R`\0Q\x82\x84\x01RQ``\x82\x01R\x90\x82`\x80\x83`\x06Z\xFA\x90P\x80a\x02=Wa\x02=a\x01gV[PPV[`@Q`\xC0\x81\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`@\x83\x01R\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``\x83\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4`\x80\x83\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`\xA0\x83\x01R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2a\x01\0\x83\x01R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xEDa\x01 \x83\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[a\x01@\x83\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAAa\x01`\x83\x01Ra\x01\x80\x82\x01`@R`\0\x80`\0\x80`\x80\x8A\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R` \x8A\x01Q` \x8D\x01Q\t\x93P\x8AQ`\0\x80Q` a&\xB0\x839\x81Q\x91R`\xA0\x8D\x01Q``\x8E\x01Q\t\x93P`\0\x80Q` a&\xB0\x839\x81Q\x91Ra\x01\xA0\x8F\x01Q\x85\x08\x92P`\0\x80Q` a&\xB0\x839\x81Q\x91R\x82\x84\x08\x92P`\0\x80Q` a&\xB0\x839\x81Q\x91R\x81\x84\t\x90P`\0\x80Q` a&\xB0\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7Xa!\xADV[\x81b\x01\0\0\x03a\x19}W`@Q\x80``\x01`@R\x80`\x10\x81R` \x01\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\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01~\xEE\xB2\xCBY\x81\xEDEd\x9A\xBE\xBD\xE0\x81\xDC\xFF\x16\xC8`\x1D\xE44~}\xD1b\x8B\xA2\xDA\xACC\xB7\x81R` \x01\x7F-\x1B\xA6oYA\xDC\x91\x01qq\xFAi\xEC+\xD0\x02**-A\x15\xA0\t\xA94X\xFDN&\xEC\xFB\x81R` \x01\x7F\x08h\x12\xA0\n\xC4>\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x1A\xBDW`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\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\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x1B\xFBW`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1C8`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01`\0\x81RP\x90V[a\x1CB\x84\x84a\x1E\xE5V[\x80\x82Ra\x1CR\x90\x85\x90\x85\x90a\x1F9V[` \x82\x01R\x80Qa\x1Ch\x90\x85\x90\x84\x90\x86\x90a\x1F\xAFV[`@\x82\x01R\x93\x92PPPV[` \x81\x01Q`@\x82\x01Q``\x85\x01Q`\x80\x86\x01Qa\x01\xA0\x86\x01Qa\x02@\x87\x01Q`\0\x95\x94\x93`\x01\x93\x90\x92\x90\x91`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80\x80\x83\x87\t`\0\x80Q` a&\xB0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x88\x01Qa\x02`\x89\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80`\0\x80Q` a&\xB0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a&\xB0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x88\x01Qa\x02\x80\x89\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80`\0\x80Q` a&\xB0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a&\xB0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x88\x01Qa\x02\xA0\x89\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80`\0\x80Q` a&\xB0\x839\x81Q\x91R\x83\x87\t`\0\x80Q` a&\xB0\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x88\x01Q\x91Pa\x02\xC0\x88\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80\x82`\0\x80Q` a&\xB0\x839\x81Q\x91R\x85\x87\x08\t\x85\t\x93PPPP\x86Q` \x88\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80\x86\x83\t`\0\x80Q` a&\xB0\x839\x81Q\x91R\x03\x85\x08\x95PP`\0\x80Q` a&\xB0\x839\x81Q\x91R\x80\x83\x83\t`\0\x80Q` a&\xB0\x839\x81Q\x91R\x03\x86\x08\x98\x97PPPPPPPPV[\x80Q` \x82\x01Q`\0\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x1EuWPPPV[\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\x02\x01W`@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\x12\x12V[\x81Q`\0\x90`\0\x80Q` a&\xB0\x839\x81Q\x91R\x90\x83\x80\x15a\x1F)W\x84\x93P`\0[\x82\x81\x10\x15a\x1F\x1DW\x83\x85\x86\t\x94P`\x01\x01a\x1F\x07V[P`\x01\x84\x03\x93Pa\x1F0V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[`\0\x82`\x01\x03a\x1FKWP`\x01a\x1F\xA8V[\x81`\0\x03a\x1F[WP`\0a\x1F\xA8V[` \x84\x01Q`\0\x80Q` a&\xB0\x839\x81Q\x91R\x90`\0\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x1F\x8BW`\x01\x87\x03\x92Pa\x1F\x92V[`\x01\x84\x03\x92P[Pa\x1F\x9C\x82a!\x07V[\x91P\x82\x82\x82\t\x93PPPP[\x93\x92PPPV[`\0`\0\x80Q` a&\xB0\x839\x81Q\x91R\x82\x82\x03a ,W`\x01`\0[`\x07\x81\x10\x15a W\x81\x86\x03a\x1F\xFDW\x86\x81`\x07\x81\x10a\x1F\xEEWa\x1F\xEEa&\x83V[` \x02\x01Q\x93PPPPa \xFFV[\x82\x80a \x0BWa \x0Ba&\x99V[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x1F\xCCV[P`\0\x92PPPa \xFFV[a 4a!\xD3V[`@\x87\x01Q`\x01`\xC0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x07\x81\x10\x15a uW` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a HV[PPPP`\0\x80`\0\x90P`\x01\x83\x89`@\x8C\x01Q`\0[`\x07\x81\x10\x15a \xCCW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a \x8CV[PPPP\x80\x92PP`\0a \xDF\x83a!\x07V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x95PPPPPP[\x94\x93PPPPV[`\0\x80`\0`\0\x80Q` a&\xB0\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\x81a!\xA6W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x12\x12V[PP\x91\x90PV[`@Q\x80``\x01`@R\x80`\0\x81R` \x01`\0\x81R` \x01a!\xCEa!\xD3V[\x90R\x90V[`@Q\x80`\xE0\x01`@R\x80`\x07\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B`\0R`A`\x04R`$`\0\xFD[`@Qa\x02\xE0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\"+Wa\"+a!\xF1V[`@R\x90V[`@Qa\x02\xC0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a\"+Wa\"+a!\xF1V[`\0`@\x82\x84\x03\x12\x15a\"gW`\0\x80\xFD[`@Q`@\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\"\x8AWa\"\x8Aa!\xF1V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[`\0\x82`\x1F\x83\x01\x12a\"\xB5W`\0\x80\xFD[`@Q`\xE0\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\"\xD8Wa\"\xD8a!\xF1V[`@R\x80`\xE0\x84\x01\x85\x81\x11\x15a\"\xEDW`\0\x80\xFD[\x84[\x81\x81\x10\x15a#\x07W\x805\x83R` \x92\x83\x01\x92\x01a\"\xEFV[P\x91\x95\x94PPPPPV[`\0a\x04\x80\x82\x84\x03\x12\x15a#%W`\0\x80\xFD[a#-a\"\x07V[\x90Pa#9\x83\x83a\"UV[\x81Ra#H\x83`@\x84\x01a\"UV[` \x82\x01Ra#Z\x83`\x80\x84\x01a\"UV[`@\x82\x01Ra#l\x83`\xC0\x84\x01a\"UV[``\x82\x01Ra\x01\0a#\x80\x84\x82\x85\x01a\"UV[`\x80\x83\x01Ra\x01@a#\x94\x85\x82\x86\x01a\"UV[`\xA0\x84\x01Ra\x01\x80a#\xA8\x86\x82\x87\x01a\"UV[`\xC0\x85\x01Ra\x01\xC0a#\xBC\x87\x82\x88\x01a\"UV[`\xE0\x86\x01Ra\x02\0a#\xD0\x88\x82\x89\x01a\"UV[\x85\x87\x01Ra\x02@\x94Pa#\xE5\x88\x86\x89\x01a\"UV[a\x01 \x87\x01Ra\x02\x80a#\xFA\x89\x82\x8A\x01a\"UV[\x85\x88\x01Ra\x02\xC0\x94Pa$\x0F\x89\x86\x8A\x01a\"UV[a\x01`\x88\x01Ra$#\x89a\x03\0\x8A\x01a\"UV[\x84\x88\x01Ra\x03@\x88\x015a\x01\xA0\x88\x01Ra\x03`\x88\x015\x83\x88\x01Ra\x03\x80\x88\x015a\x01\xE0\x88\x01Ra\x03\xA0\x88\x015\x82\x88\x01Ra\x03\xC0\x88\x015a\x02 \x88\x01Ra\x03\xE0\x88\x015\x86\x88\x01Ra\x04\0\x88\x015a\x02`\x88\x01Ra\x04 \x88\x015\x81\x88\x01RPPPPa\x04@\x84\x015a\x02\xA0\x84\x01Ra\x04`\x84\x015\x81\x84\x01RPP\x92\x91PPV[`\0\x80`\0\x83\x85\x03a\n`\x81\x12\x15a$\xB8W`\0\x80\xFD[a\x05\0\x80\x82\x12\x15a$\xC8W`\0\x80\xFD[a$\xD0a\"1V[\x91P\x855\x82R` \x86\x015` \x83\x01Ra$\xED\x87`@\x88\x01a\"UV[`@\x83\x01Ra$\xFF\x87`\x80\x88\x01a\"UV[``\x83\x01Ra%\x11\x87`\xC0\x88\x01a\"UV[`\x80\x83\x01Ra\x01\0a%%\x88\x82\x89\x01a\"UV[`\xA0\x84\x01Ra\x01@a%9\x89\x82\x8A\x01a\"UV[`\xC0\x85\x01Ra\x01\x80a%M\x8A\x82\x8B\x01a\"UV[`\xE0\x86\x01Ra\x01\xC0a%a\x8B\x82\x8C\x01a\"UV[\x84\x87\x01Ra\x02\0\x93Pa%v\x8B\x85\x8C\x01a\"UV[a\x01 \x87\x01Ra\x02@a%\x8B\x8C\x82\x8D\x01a\"UV[\x84\x88\x01Ra\x02\x80\x93Pa%\xA0\x8C\x85\x8D\x01a\"UV[a\x01`\x88\x01Ra%\xB4\x8Ca\x02\xC0\x8D\x01a\"UV[\x83\x88\x01Ra%\xC6\x8Ca\x03\0\x8D\x01a\"UV[a\x01\xA0\x88\x01Ra%\xDA\x8Ca\x03@\x8D\x01a\"UV[\x82\x88\x01Ra%\xEC\x8Ca\x03\x80\x8D\x01a\"UV[a\x01\xE0\x88\x01Ra&\0\x8Ca\x03\xC0\x8D\x01a\"UV[\x85\x88\x01Ra&\x12\x8Ca\x04\0\x8D\x01a\"UV[a\x02 \x88\x01Ra&&\x8Ca\x04@\x8D\x01a\"UV[\x81\x88\x01RPPPa&;\x89a\x04\x80\x8A\x01a\"UV[a\x02`\x85\x01Ra\x04\xC0\x88\x015\x81\x85\x01RPPa\x04\xE0\x86\x015a\x02\xA0\x83\x01R\x81\x94Pa&h\x87\x82\x88\x01a\"\xA4V[\x93PPPa&z\x85a\x05\xE0\x86\x01a#\x12V[\x90P\x92P\x92P\x92V[cNH{q`\xE0\x1B`\0R`2`\x04R`$`\0\xFD[cNH{q`\xE0\x1B`\0R`\x12`\x04R`$`\0\xFD\xFE0dNr\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 PLONKVERIFIER2_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol index 2feaee5bb..b3474397b 100644 --- a/contracts/src/LightClient.sol +++ b/contracts/src/LightClient.sol @@ -274,10 +274,13 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { // Prepare the public input uint256[7] memory publicInput; - publicInput[0] = votingThreshold; - publicInput[1] = uint256(state.viewNum); - publicInput[2] = uint256(state.blockHeight); - publicInput[3] = BN254.ScalarField.unwrap(state.blockCommRoot); + publicInput[0] = uint256(state.viewNum); + publicInput[1] = uint256(state.blockHeight); + publicInput[2] = BN254.ScalarField.unwrap(state.blockCommRoot); + publicInput[3] = BN254.ScalarField.unwrap(genesisStakeTableState.blsKeyComm); + publicInput[4] = BN254.ScalarField.unwrap(genesisStakeTableState.schnorrKeyComm); + publicInput[5] = BN254.ScalarField.unwrap(genesisStakeTableState.amountComm); + publicInput[6] = genesisStakeTableState.threshold; if (!PlonkVerifier.verify(vk, publicInput, proof)) { revert InvalidProof(); diff --git a/contracts/test/mocks/LightClientMock.sol b/contracts/test/mocks/LightClientMock.sol index c70c17492..c8934ac29 100644 --- a/contracts/test/mocks/LightClientMock.sol +++ b/contracts/test/mocks/LightClientMock.sol @@ -36,10 +36,13 @@ contract LightClientMock is LC { // Prepare the public input uint256[7] memory publicInput; - publicInput[0] = votingThreshold; - publicInput[1] = uint256(state.viewNum); - publicInput[2] = uint256(state.blockHeight); - publicInput[3] = BN254.ScalarField.unwrap(state.blockCommRoot); + publicInput[0] = uint256(state.viewNum); + publicInput[1] = uint256(state.blockHeight); + publicInput[2] = BN254.ScalarField.unwrap(state.blockCommRoot); + publicInput[3] = BN254.ScalarField.unwrap(genesisStakeTableState.blsKeyComm); + publicInput[4] = BN254.ScalarField.unwrap(genesisStakeTableState.schnorrKeyComm); + publicInput[5] = BN254.ScalarField.unwrap(genesisStakeTableState.amountComm); + publicInput[6] = genesisStakeTableState.threshold; if (!PlonkVerifier.verify(vk, publicInput, proof)) { revert InvalidProof(); diff --git a/foundry.toml b/foundry.toml index 500fba25a..4d034f298 100644 --- a/foundry.toml +++ b/foundry.toml @@ -9,9 +9,7 @@ libs = ['contracts/lib'] script = "contracts/script" broadcast = "contracts/broadcast" cache_path = "contracts/cache" -optimizer = true -optimizer_runs = 200 # Increasing the number of runs saves gas but increases the size of the contract -# viaIR = true + # Version should match the solc installed via flake, otherwise the contract # artifacts may differ slightly. solc = "0.8.23" @@ -53,4 +51,4 @@ verbosity = 1 [profile.quick] fuzz = { runs = 10 } invariant = { runs = 10 } -verbosity = 1 \ No newline at end of file +verbosity = 1 From 8e0bf35be26f97573a1ae74e4ed907d68c608b15 Mon Sep 17 00:00:00 2001 From: Alex Xiong Date: Fri, 6 Sep 2024 18:09:27 +0800 Subject: [PATCH 18/27] LC contract test passing --- contracts/rust/adapter/src/light_client.rs | 21 +++ contracts/rust/diff-test/src/main.rs | 85 ++--------- .../LightClientCallNewFinalizedState.s.sol | 8 +- contracts/test/LightClient.t.sol | 141 +++++------------- contracts/test/LightClientBenchmark.t.sol | 8 +- hotshot-state-prover/src/mock_ledger.rs | 92 +++--------- hotshot-state-prover/src/service.rs | 5 +- 7 files changed, 97 insertions(+), 263 deletions(-) diff --git a/contracts/rust/adapter/src/light_client.rs b/contracts/rust/adapter/src/light_client.rs index b6d71a712..5537c235d 100644 --- a/contracts/rust/adapter/src/light_client.rs +++ b/contracts/rust/adapter/src/light_client.rs @@ -63,6 +63,16 @@ impl From for GenericLightClientState } } +impl From> for ParsedLightClientState { + fn from(v: GenericLightClientState) -> Self { + Self { + view_num: v.view_number as u64, + block_height: v.block_height as u64, + block_comm_root: field_to_u256(v.block_comm_root), + } + } +} + impl From for ParsedLightClientState { fn from(pi: PublicInput) -> Self { Self { @@ -163,6 +173,17 @@ impl From for contract_bindings::light_client::StakeTable } } +impl From> for ParsedStakeTableState { + fn from(v: GenericStakeTableState) -> Self { + Self { + bls_key_comm: field_to_u256(v.bls_key_comm), + schnorr_key_comm: field_to_u256(v.schnorr_key_comm), + amount_comm: field_to_u256(v.amount_comm), + threshold: field_to_u256(v.threshold), + } + } +} + /// `LightClientConstructorArgs` holds the arguments required to initialize a light client contract. pub struct LightClientConstructorArgs { pub light_client_state: ParsedLightClientState, diff --git a/contracts/rust/diff-test/src/main.rs b/contracts/rust/diff-test/src/main.rs index 789814b2b..21571eaa1 100644 --- a/contracts/rust/diff-test/src/main.rs +++ b/contracts/rust/diff-test/src/main.rs @@ -14,7 +14,7 @@ use ethers::{ }; use hotshot_contract_adapter::{jellyfish::*, light_client::ParsedLightClientState}; use hotshot_state_prover::mock_ledger::{ - gen_plonk_proof_for_test, MockLedger, MockSystemParam, BLOCKS_PER_EPOCH, STAKE_TABLE_CAPACITY, + gen_plonk_proof_for_test, MockLedger, MockSystemParam, STAKE_TABLE_CAPACITY, }; use jf_pcs::prelude::Commitment; use jf_plonk::proof_system::structs::{Proof, VerifyingKey}; @@ -83,10 +83,6 @@ enum Action { MockConsecutiveFinalizedStates, /// Get a light client state that skipped a few blocks MockSkipBlocks, - /// Get light client states when missing ending block of an epoch - MockMissEndingBlock, - /// Get a malicious state update with a wrong stake table - MockWrongStakeTable, } #[allow(clippy::type_complexity)] @@ -381,39 +377,25 @@ fn main() { } let num_init_validators = cli.args[0].parse::().unwrap(); - let pp = MockSystemParam::init(BLOCKS_PER_EPOCH); + let pp = MockSystemParam::init(); let ledger = MockLedger::init(pp, num_init_validators as usize); - let (voting_st_comm, frozen_st_comm, stake_table) = ledger.get_stake_table_comms(); - let res = ( - ledger.get_state(), - voting_st_comm, - frozen_st_comm, - stake_table, - ); + let res = (ledger.get_state(), ledger.get_stake_table_state()); println!("{}", res.encode_hex()); } Action::MockConsecutiveFinalizedStates => { - if cli.args.len() != 3 { - panic!("Should provide arg1=numInitValidators,arg2=numRegs,arg3=numExit"); + if cli.args.len() != 1 { + panic!("Should provide arg1=numInitValidators"); } - let block_per_epoch = BLOCKS_PER_EPOCH; let num_init_validators = cli.args[0].parse::().unwrap(); - let num_reg = cli.args[1].parse::().unwrap(); - let num_exit = cli.args[2].parse::().unwrap(); - let pp = MockSystemParam::init(BLOCKS_PER_EPOCH); + let pp = MockSystemParam::init(); let mut ledger = MockLedger::init(pp, num_init_validators as usize); let mut new_states: Vec = vec![]; let mut proofs: Vec = vec![]; - for i in 1..block_per_epoch + 2 { - // only update stake table at the last block, as it would only take effect in next epoch anyway. - if i == block_per_epoch { - ledger.sync_stake_table(num_reg as usize, num_exit as usize); - } - + for _ in 1..4 { // random number of notorized but not finalized block if ledger.rng.gen_bool(0.5) { let num_non_blk = ledger.rng.gen_range(0..5); @@ -444,66 +426,25 @@ fn main() { true }; - let pp = MockSystemParam::init(BLOCKS_PER_EPOCH); + let pp = MockSystemParam::init(); let mut ledger = MockLedger::init(pp, STAKE_TABLE_CAPACITY / 2); - // random stake table update - ledger.sync_stake_table(4, 3); for _ in 0..num_block_skipped { ledger.elapse_with_block(); } let res = if require_valid_proof { - let (pi, proof) = ledger.gen_state_proof(); - let pi_parsed: ParsedLightClientState = pi.into(); + let (state, proof) = ledger.gen_state_proof(); + let state_parsed: ParsedLightClientState = state.into(); let proof_parsed: ParsedPlonkProof = proof.into(); - (pi_parsed, proof_parsed) + (state_parsed, proof_parsed) } else { - let pi_parsed = ledger.get_state(); + let state_parsed = ledger.get_state(); let proof_parsed = ParsedPlonkProof::dummy(&mut ledger.rng); - (pi_parsed, proof_parsed) + (state_parsed, proof_parsed) }; println!("{}", res.encode_hex()); } - Action::MockMissEndingBlock => { - let block_per_epoch = BLOCKS_PER_EPOCH; - - let pp = MockSystemParam::init(BLOCKS_PER_EPOCH); - let mut ledger = MockLedger::init(pp, STAKE_TABLE_CAPACITY / 2); - - let mut new_states: Vec = vec![]; - let mut proofs: Vec = vec![]; - - ledger.elapse_with_block(); - // first block in epoch 1 - let (pi, proof) = ledger.gen_state_proof(); - new_states.push(pi.into()); - proofs.push(proof.into()); - - // skipping all remaining blocks in epoch 1, including the last/ending block - for _ in 2..block_per_epoch + 1 { - ledger.elapse_with_block(); - } - // first block in epoch 2 - ledger.elapse_with_block(); - new_states.push(ledger.get_state()); - proofs.push(ParsedPlonkProof::dummy(&mut ledger.rng)); // we don't need correct proof here - - let res = (new_states, proofs); - println!("{}", res.encode_hex()); - } - Action::MockWrongStakeTable => { - let pp = MockSystemParam::init(BLOCKS_PER_EPOCH); - let mut ledger = MockLedger::init(pp, STAKE_TABLE_CAPACITY / 2); - - ledger.elapse_with_block(); - let (pi, proof, _) = ledger.gen_state_proof_with_fake_stakers(); - - let new_state: ParsedLightClientState = pi.into(); - let proof: ParsedPlonkProof = proof.into(); - - println!("{}", (new_state, proof).encode_hex()); - } Action::GenBLSHashes => { if cli.args.len() != 1 { panic!("Should provide arg1=message"); diff --git a/contracts/script/LightClientCallNewFinalizedState.s.sol b/contracts/script/LightClientCallNewFinalizedState.s.sol index 9e176d54c..c1705b2a5 100644 --- a/contracts/script/LightClientCallNewFinalizedState.s.sol +++ b/contracts/script/LightClientCallNewFinalizedState.s.sol @@ -11,17 +11,11 @@ contract CallNewFinalizedState is Script { LC.LightClientState public genesis; function run(uint32 numInitValidators, address lcContractAddress) external { - uint64 numRegistrations = uint64(3); - uint64 numExits = uint64(3); - // Generating a few consecutive states and proofs - string[] memory cmds = new string[](5); - cmds = new string[](6); + string[] memory cmds = new string[](3); cmds[0] = "diff-test"; cmds[1] = "mock-consecutive-finalized-states"; cmds[2] = vm.toString(numInitValidators); - cmds[3] = vm.toString(numRegistrations); - cmds[4] = vm.toString(numExits); bytes memory result = vm.ffi(cmds); (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol index 147d4f423..de7dfd7c2 100644 --- a/contracts/test/LightClient.t.sol +++ b/contracts/test/LightClient.t.sol @@ -60,10 +60,8 @@ contract LightClientCommonTest is Test { bytes memory result = vm.ffi(cmds); ( LC.LightClientState memory state, - bytes32 votingSTComm, - , LC.StakeTableState memory stakeState - ) = abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeTableState)); + ) = abi.decode(result, (LC.LightClientState, LC.StakeTableState)); genesis = state; genesisStakeTableState = stakeState; @@ -71,16 +69,16 @@ contract LightClientCommonTest is Test { deployAndInitProxy(genesis, genesisStakeTableState, MAX_HISTORY_SECONDS); ( - , + uint256 threshold, BN254.ScalarField stakeTableBlsKeyComm, BN254.ScalarField stakeTableSchnorrKeyComm, BN254.ScalarField stakeTableAmountComm ) = lc.genesisStakeTableState(); - assertEq( - abi.encodePacked(votingSTComm), - abi.encodePacked(stakeTableBlsKeyComm, stakeTableSchnorrKeyComm, stakeTableAmountComm) - ); + assertEq(stakeState.blsKeyComm, stakeTableBlsKeyComm); + assertEq(stakeState.schnorrKeyComm, stakeTableSchnorrKeyComm); + assertEq(stakeState.amountComm, stakeTableAmountComm); + assertEq(stakeState.threshold, threshold); } function assertEq(BN254.ScalarField a, BN254.ScalarField b) public pure { @@ -155,28 +153,23 @@ contract LightClient_constructor_Test is LightClientCommonTest { contract LightClient_permissionedProver_Test is LightClientCommonTest { LC.LightClientState internal newState; V.PlonkProof internal newProof; - LC.StakeTableState internal newStakeTableState; function setUp() public { init(); - string[] memory cmds = new string[](5); + string[] memory cmds = new string[](3); cmds[0] = "diff-test"; cmds[1] = "mock-consecutive-finalized-states"; cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); - cmds[3] = vm.toString(uint64(1)); - cmds[4] = vm.toString(uint64(1)); bytes memory result = vm.ffi(cmds); ( LC.LightClientState[] memory states, - V.PlonkProof[] memory proofs, - LC.StakeTableState[] memory stakeStates - ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); + V.PlonkProof[] memory proofs + ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); newState = states[0]; newProof = proofs[0]; - newStakeTableState = stakeStates[0]; } function test_NoProverPermissionsRequired() external { @@ -311,16 +304,14 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { /// @dev for benchmarking purposes only function testCorrectUpdate() external { // Generating a few consecutive states and proofs - string[] memory cmds = new string[](5); + string[] memory cmds = new string[](3); cmds[0] = "diff-test"; cmds[1] = "mock-consecutive-finalized-states"; cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); - cmds[3] = vm.toString(uint64(3)); - cmds[4] = vm.toString(uint64(3)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); vm.expectEmit(true, true, true, true); emit LC.NewState(states[0].viewNum, states[0].blockHeight, states[0].blockCommRoot); @@ -332,16 +323,10 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { /// forge-config: default.fuzz.runs = 1 /// forge-config: quick.fuzz.runs = 1 /// forge-config: ci.fuzz.runs = 10 - function testFuzz_ConsecutiveUpdate( - uint64 numInitValidators, - uint64 numRegistrations, - uint64 numExits - ) external { + function testFuzz_ConsecutiveUpdate(uint64 numInitValidators) external { numInitValidators = uint64(bound(numInitValidators, 1, STAKE_TABLE_CAPACITY)); - numRegistrations = - uint64(bound(numRegistrations, 0, STAKE_TABLE_CAPACITY - numInitValidators)); - numExits = uint64(bound(numExits, 0, numInitValidators)); + // TODO: (Alex) simplify mock-genesis // since we have have a fuzzer-provided `numInitValidators`, we should instantiate light // client contract separately in each test run string[] memory cmds = new string[](3); @@ -350,28 +335,22 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[2] = vm.toString(numInitValidators); bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory state,,,) = - abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeTableState)); + (LC.LightClientState memory state, LC.StakeTableState memory stakeState) = + abi.decode(result, (LC.LightClientState, LC.StakeTableState)); genesis = state; + genesisStakeTableState = stakeState; (lcTestProxy, admin) = deployAndInitProxy(genesis, genesisStakeTableState, MAX_HISTORY_SECONDS); - genesis = state; - // Generating a few consecutive states and proofs - cmds = new string[](5); + cmds = new string[](3); cmds[0] = "diff-test"; cmds[1] = "mock-consecutive-finalized-states"; cmds[2] = vm.toString(numInitValidators); - cmds[3] = vm.toString(numRegistrations); - cmds[4] = vm.toString(numExits); result = vm.ffi(cmds); - ( - LC.LightClientState[] memory states, - V.PlonkProof[] memory proofs, - LC.StakeTableState[] memory stakeStates - ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); uint256 statesLen = states.length; uint64 viewNum; @@ -387,20 +366,6 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { assertEq(viewNum, states[i].viewNum); assertEq(blockHeight, states[i].blockHeight); assertEq(abi.encode(blockCommRoot), abi.encode(states[i].blockCommRoot)); - - ( - uint256 threshold, - BN254.ScalarField stakeTableBlsKeyComm, - BN254.ScalarField stakeTableSchnorrKeyComm, - BN254.ScalarField stakeTableAmountComm - ) = lc.genesisStakeTableState(); - - assertEq( - abi.encode(stakeStates[i]), - abi.encode( - threshold, stakeTableBlsKeyComm, stakeTableSchnorrKeyComm, stakeTableAmountComm - ) - ); } } @@ -533,33 +498,11 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { vm.stopPrank(); } - - /// @dev Test that update on finalized state will fail if a different stake table is used - function test_revertWhenWrongStakeTableUsed() external { - string[] memory cmds = new string[](2); - cmds[0] = "diff-test"; - cmds[1] = "mock-wrong-stake-table"; - - bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory newState, V.PlonkProof memory proof) = - abi.decode(result, (LC.LightClientState, V.PlonkProof)); - - LC.LightClientState memory newLCState = LC.LightClientState({ - viewNum: newState.viewNum, - blockHeight: newState.blockHeight, - blockCommRoot: newState.blockCommRoot - }); - - vm.expectRevert(LC.InvalidProof.selector); - vm.prank(permissionedProver); - lc.newFinalizedState(newLCState, proof); - } } contract LightClient_StateUpdatesTest is LightClientCommonTest { LC.LightClientState internal newState; V.PlonkProof internal newProof; - LC.StakeTableState internal newStakeTableState; function assertInitialStateHistoryConditions() internal view { // assert that stateHistoryFirstIndex starts at 0. @@ -587,27 +530,21 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { // Assert owner is correctly set, add this to check owner state assertEq(lc.owner(), admin, "Admin should be the owner."); - string[] memory cmds = new string[](5); + string[] memory cmds = new string[](3); cmds[0] = "diff-test"; cmds[1] = "mock-consecutive-finalized-states"; cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); - cmds[3] = vm.toString(uint64(1)); - cmds[4] = vm.toString(uint64(1)); //assert initial conditions assertEq(lc.stateHistoryFirstIndex(), 0); assertGe(lc.stateHistoryRetentionPeriod(), 1 days); bytes memory result = vm.ffi(cmds); - ( - LC.LightClientState[] memory states, - V.PlonkProof[] memory proofs, - LC.StakeTableState[] memory stakeStates - ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); newState = states[1]; newProof = proofs[1]; - newStakeTableState = stakeStates[1]; } function test_1lBlockUpdatesIsUpdated() public { @@ -648,20 +585,18 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { } function test_stateHistoryHandlingWithOneDayMaxHistory() public { - string[] memory cmds = new string[](5); + string[] memory cmds = new string[](3); cmds[0] = "diff-test"; cmds[1] = "mock-consecutive-finalized-states"; cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); - cmds[3] = vm.toString(uint64(5)); - cmds[4] = vm.toString(uint64(5)); uint32 numDays = 1; assertInitialStateHistoryConditions(); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); // Add one numDays worth of a new state uint256 i; @@ -721,17 +656,15 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { } function test_stateHistoryHandlingWithTwoDaysMaxHistory() public { - string[] memory cmds = new string[](5); + string[] memory cmds = new string[](3); cmds[0] = "diff-test"; cmds[1] = "mock-consecutive-finalized-states"; cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); - cmds[3] = vm.toString(uint64(5)); - cmds[4] = vm.toString(uint64(5)); uint32 numDays = 2; bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); assertInitialStateHistoryConditions(); @@ -1173,16 +1106,14 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { // Assert owner is correctly set, add this to check owner state assertEq(lc.owner(), admin, "Admin should be the owner."); - string[] memory cmds = new string[](5); + string[] memory cmds = new string[](3); cmds[0] = "diff-test"; cmds[1] = "mock-consecutive-finalized-states"; cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); - cmds[3] = vm.toString(uint64(1)); - cmds[4] = vm.toString(uint64(1)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); + (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); newState = _states[1]; newProof = _proofs[1]; @@ -1211,16 +1142,14 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { function test_hotShotBlockCommIsUpdatedXTimes() public { uint256 blockCommCount = lc.getStateHistoryCount(); - string[] memory cmds = new string[](5); + string[] memory cmds = new string[](3); cmds[0] = "diff-test"; cmds[1] = "mock-consecutive-finalized-states"; cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); - cmds[3] = vm.toString(uint64(1)); - cmds[4] = vm.toString(uint64(1)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); + (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); uint256 statesCount = _states.length - 1; // Update the state and thus the l1BlockUpdates array would be updated diff --git a/contracts/test/LightClientBenchmark.t.sol b/contracts/test/LightClientBenchmark.t.sol index d8bf5a096..4fb4a9aed 100644 --- a/contracts/test/LightClientBenchmark.t.sol +++ b/contracts/test/LightClientBenchmark.t.sol @@ -19,16 +19,14 @@ contract LightClientBench is LightClientCommonTest { function setUp() public { init(); // Generating a few consecutive states and proofs - string[] memory cmds = new string[](5); + string[] memory cmds = new string[](3); cmds[0] = "diff-test"; cmds[1] = "mock-consecutive-finalized-states"; cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); - cmds[3] = vm.toString(uint64(3)); - cmds[4] = vm.toString(uint64(3)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); state = states[0]; proof = proofs[0]; diff --git a/hotshot-state-prover/src/mock_ledger.rs b/hotshot-state-prover/src/mock_ledger.rs index 973a36d23..38965a21a 100644 --- a/hotshot-state-prover/src/mock_ledger.rs +++ b/hotshot-state-prover/src/mock_ledger.rs @@ -8,14 +8,9 @@ use ark_std::{ rand::{rngs::StdRng, CryptoRng, Rng, RngCore}, UniformRand, }; -use ethers::{ - abi, - abi::Token, - types::{H256, U256}, - utils, -}; +use ethers::types::U256; use hotshot_contract_adapter::{ - jellyfish::{field_to_u256, open_key, u256_to_field /* , u256_to_field*/}, + jellyfish::{open_key, u256_to_field}, light_client::{ParsedLightClientState, ParsedStakeTableState}, }; use hotshot_stake_table::vec_based::StakeTable; @@ -51,23 +46,17 @@ type SchnorrSignKey = jf_signature::schnorr::SignKey; /// Stake table capacity used for testing pub const STAKE_TABLE_CAPACITY: usize = 10; -/// Number of blocks per epoch for testing -pub const BLOCKS_PER_EPOCH: u32 = 3; - /// Mock for system parameter of `MockLedger` pub struct MockSystemParam { /// max capacity of stake table st_cap: usize, - /// number of blocks per epoch - blk_per_epoch: u32, } impl MockSystemParam { /// Init the system parameters (some fixed, some adjustable) - pub fn init(blk_per_epoch: u32) -> Self { + pub fn init() -> Self { Self { st_cap: STAKE_TABLE_CAPACITY, - blk_per_epoch, } } } @@ -136,9 +125,7 @@ impl MockLedger { /// Elapse a view with a new finalized block pub fn elapse_with_block(&mut self) { // if the new block is the first block of an epoch, update epoch - if self.state.block_height != 0 - && self.state.block_height % self.pp.blk_per_epoch as usize == 0 - { + if self.state.block_height != 0 { self.epoch += 1; self.st.advance(); self.threshold = one_honest_threshold( @@ -201,22 +188,23 @@ impl MockLedger { assert!(self.qc_keys.len() == before_st_size + num_reg - num_exit); } - /// Elapse an epoch with `num_reg` of new registration, `num_exit` of key deregistration - pub fn elapse_epoch(&mut self, num_reg: usize, num_exit: usize) { - assert!(self.qc_keys.len() + num_reg - num_exit <= self.pp.st_cap); + // NOTE: uncomment when we add back epoch logic + // /// Elapse an epoch with `num_reg` of new registration, `num_exit` of key deregistration + // pub fn elapse_epoch(&mut self, num_reg: usize, num_exit: usize) { + // assert!(self.qc_keys.len() + num_reg - num_exit <= self.pp.st_cap); - // random number of notorized but not finalized block - let num_non_blk = self.rng.gen_range(0..10); - for _ in 0..num_non_blk { - self.elapse_without_block(); - } + // // random number of notorized but not finalized block + // let num_non_blk = self.rng.gen_range(0..10); + // for _ in 0..num_non_blk { + // self.elapse_without_block(); + // } - for _ in 0..self.pp.blk_per_epoch { - self.elapse_with_block(); - } + // for _ in 0..self.pp.blk_per_epoch { + // self.elapse_with_block(); + // } - self.sync_stake_table(num_reg, num_exit); - } + // self.sync_stake_table(num_reg, num_exit); + // } /// Return the light client state and proof of consensus on this finalized state pub fn gen_state_proof(&mut self) -> (GenericPublicInput, Proof) { @@ -368,48 +356,12 @@ impl MockLedger { } /// Returns the `LightClientState` for solidity pub fn get_state(&self) -> ParsedLightClientState { - // The ugly conversion due to slight difference of `LightClientState` in solidity containing `threshold` - let pi = vec![ - F::from(self.state.view_number as u64), - F::from(self.state.block_height as u64), - self.state.block_comm_root, - ]; - let pi: GenericPublicInput = pi.into(); - pi.into() + self.state.clone().into() } - /// Returns the (bytes32 votingStakeTableComm, bytes32 frozenStakeTableComm) used in contract - pub fn get_stake_table_comms(&self) -> (H256, H256, ParsedStakeTableState) { - let (bls_key_comm, schnorr_key_comm, amount_comm) = - self.st.commitment(SnapshotVersion::EpochStart).unwrap(); - let frozen_st_comm = utils::keccak256( - abi::encode_packed(&[ - Token::Uint(field_to_u256(bls_key_comm)), - Token::Uint(field_to_u256(schnorr_key_comm)), - Token::Uint(field_to_u256(amount_comm)), - ]) - .unwrap(), - ); - - let (bls_key_comm, schnorr_key_comm, amount_comm) = - self.st.commitment(SnapshotVersion::LastEpochStart).unwrap(); - let voting_st_comm = utils::keccak256( - abi::encode_packed(&[ - Token::Uint(field_to_u256(bls_key_comm)), - Token::Uint(field_to_u256(schnorr_key_comm)), - Token::Uint(field_to_u256(amount_comm)), - ]) - .unwrap(), - ); - - let stake_table = ParsedStakeTableState { - threshold: self.threshold, - bls_key_comm: field_to_u256(bls_key_comm), - schnorr_key_comm: field_to_u256(schnorr_key_comm), - amount_comm: field_to_u256(amount_comm), - }; - - (voting_st_comm.into(), frozen_st_comm.into(), stake_table) + /// Returns the `StakeTableState` in solidity + pub fn get_stake_table_state(&self) -> ParsedStakeTableState { + self.stake_table_state.clone().into() } // return a dummy commitment value diff --git a/hotshot-state-prover/src/service.rs b/hotshot-state-prover/src/service.rs index 26dec734f..52183a39d 100644 --- a/hotshot-state-prover/src/service.rs +++ b/hotshot-state-prover/src/service.rs @@ -555,7 +555,6 @@ mod test { use crate::mock_ledger::{MockLedger, MockSystemParam}; const STAKE_TABLE_CAPACITY_FOR_TEST: usize = 10; - const BLOCKS_PER_EPOCH: u32 = 10; const MAX_HISTORY_SECONDS: u32 = 864000; const NUM_INIT_VALIDATORS: u32 = (STAKE_TABLE_CAPACITY_FOR_TEST / 2) as u32; @@ -571,11 +570,11 @@ mod test { Vec<(StateSignKey, StateVerKey)>, StakeTable, ) { - let pp = MockSystemParam::init(BLOCKS_PER_EPOCH); + let pp = MockSystemParam::init(); let ledger = MockLedger::init(pp, NUM_INIT_VALIDATORS as usize); let genesis = ledger.get_state(); - let (_, _, stake_genesis) = ledger.get_stake_table_comms(); + let stake_genesis = ledger.get_stake_table_state(); let qc_keys = ledger.qc_keys; let state_keys = ledger.state_keys; From 7f0ffe4889fc34f8933bef52101cb680fc740c3f Mon Sep 17 00:00:00 2001 From: Alex Xiong Date: Fri, 6 Sep 2024 18:24:35 +0800 Subject: [PATCH 19/27] fix some mock-genesis usage --- contracts/script/LightClientWithDefender.s.sol | 3 +-- contracts/test/DeployLightClientTestScript.s.sol | 4 ++-- contracts/test/LightClient.t.sol | 13 ++++--------- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/contracts/script/LightClientWithDefender.s.sol b/contracts/script/LightClientWithDefender.s.sol index 9738002f3..16ef64043 100644 --- a/contracts/script/LightClientWithDefender.s.sol +++ b/contracts/script/LightClientWithDefender.s.sol @@ -31,8 +31,7 @@ contract LightClientDefenderDeployScript is Script { bytes memory result = vm.ffi(cmds); LC.StakeTableState memory stakeState; - (state,,, stakeState) = - abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeTableState)); + (state, stakeState) = abi.decode(result, (LC.LightClientState, LC.StakeTableState)); ApprovalProcessResponse memory upgradeApprovalProcess = Defender.getUpgradeApprovalProcess(); multisig = upgradeApprovalProcess.via; diff --git a/contracts/test/DeployLightClientTestScript.s.sol b/contracts/test/DeployLightClientTestScript.s.sol index 7eaaa754a..29790ba08 100644 --- a/contracts/test/DeployLightClientTestScript.s.sol +++ b/contracts/test/DeployLightClientTestScript.s.sol @@ -20,8 +20,8 @@ contract DeployLightClientTestScript is Script { cmds[2] = vm.toString(uint256(numInitValidators)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory state,,, LC.StakeTableState memory stakeState) = - abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeTableState)); + (LC.LightClientState memory state, LC.StakeTableState memory stakeState) = + abi.decode(result, (LC.LightClientState, LC.StakeTableState)); return deployContract(state, stakeState, stateHistoryRetentionPeriod, owner); } diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol index de7dfd7c2..90bd42440 100644 --- a/contracts/test/LightClient.t.sol +++ b/contracts/test/LightClient.t.sol @@ -58,10 +58,8 @@ contract LightClientCommonTest is Test { cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); bytes memory result = vm.ffi(cmds); - ( - LC.LightClientState memory state, - LC.StakeTableState memory stakeState - ) = abi.decode(result, (LC.LightClientState, LC.StakeTableState)); + (LC.LightClientState memory state, LC.StakeTableState memory stakeState) = + abi.decode(result, (LC.LightClientState, LC.StakeTableState)); genesis = state; genesisStakeTableState = stakeState; @@ -163,10 +161,8 @@ contract LightClient_permissionedProver_Test is LightClientCommonTest { cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); bytes memory result = vm.ffi(cmds); - ( - LC.LightClientState[] memory states, - V.PlonkProof[] memory proofs - ) = abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = + abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); newState = states[0]; newProof = proofs[0]; @@ -326,7 +322,6 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { function testFuzz_ConsecutiveUpdate(uint64 numInitValidators) external { numInitValidators = uint64(bound(numInitValidators, 1, STAKE_TABLE_CAPACITY)); - // TODO: (Alex) simplify mock-genesis // since we have have a fuzzer-provided `numInitValidators`, we should instantiate light // client contract separately in each test run string[] memory cmds = new string[](3); From b38ab2d88f52f7a99693fe6c26aef9d8fa941727 Mon Sep 17 00:00:00 2001 From: Alex Xiong Date: Fri, 6 Sep 2024 19:07:51 +0800 Subject: [PATCH 20/27] fix script for upgrade test failure --- contracts/script/LightClient.s.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/script/LightClient.s.sol b/contracts/script/LightClient.s.sol index ca1b70342..55df255a3 100644 --- a/contracts/script/LightClient.s.sol +++ b/contracts/script/LightClient.s.sol @@ -24,8 +24,8 @@ contract DeployLightClientContractScript is Script { cmds[2] = vm.toString(uint256(numInitValidators)); bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory state,,, LC.StakeTableState memory stakeState) = - abi.decode(result, (LC.LightClientState, bytes32, bytes32, LC.StakeTableState)); + (LC.LightClientState memory state, LC.StakeTableState memory stakeState) = + abi.decode(result, (LC.LightClientState, LC.StakeTableState)); return deployContract(state, stakeState, stateHistoryRetentionPeriod); } From f1a92a617c47ed6cb6da9206daef60167c34e0a2 Mon Sep 17 00:00:00 2001 From: Alex Xiong Date: Fri, 6 Sep 2024 19:10:10 +0800 Subject: [PATCH 21/27] update gas report --- .gas-snapshot | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index 21a01322a..4bfac792f 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,3 +1,3 @@ -LightClientBench:testCorrectUpdateBench() (gas: 540305) -PlonkVerifier2_verify_Test:test_verify_succeeds() (gas: 384568) -PlonkVerifier_verify_Test:test_verify_succeeds() (gas: 377668) \ No newline at end of file +LightClientBench:testCorrectUpdateBench() (gas: 524301) +PlonkVerifier2_verify_Test:test_verify_succeeds() (gas: 381889) +PlonkVerifier_verify_Test:test_verify_succeeds() (gas: 388519) \ No newline at end of file From 8ee74da905adfbf79998a4c7f3889d3757fa5743 Mon Sep 17 00:00:00 2001 From: Alysia Huggins Date: Fri, 6 Sep 2024 17:05:15 -0400 Subject: [PATCH 22/27] updated to latest version of hotshot --- Cargo.lock | 127 +++++++++++++++++++++++++++++++++-------------------- Cargo.toml | 26 +++++------ 2 files changed, 93 insertions(+), 60 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e38248394..937d7de8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -202,9 +202,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "10f00e1f6e58a40e807377c75c6a7f97bf9044fab57816f2414e6f5f4499d7b8" [[package]] name = "arbitrary" @@ -727,7 +727,7 @@ dependencies = [ "futures-lite 2.3.0", "parking", "polling 3.7.3", - "rustix 0.38.35", + "rustix 0.38.36", "slab", "tracing", "windows-sys 0.59.0", @@ -795,10 +795,30 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.35", + "rustix 0.38.36", "windows-sys 0.48.0", ] +[[package]] +name = "async-process" +version = "2.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a07789659a4d385b79b18b9127fc27e1a59e1e89117c78c5ea3b806f016374" +dependencies = [ + "async-channel 2.3.1", + "async-io 2.3.4", + "async-lock 3.4.0", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.3.1", + "futures-lite 2.3.0", + "rustix 0.38.36", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "async-signal" version = "0.2.10" @@ -811,7 +831,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.35", + "rustix 0.38.36", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -833,22 +853,22 @@ dependencies = [ [[package]] name = "async-std" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" dependencies = [ "async-attributes", "async-channel 1.9.0", "async-global-executor", - "async-io 1.13.0", - "async-lock 2.8.0", - "async-process", + "async-io 2.3.4", + "async-lock 3.4.0", + "async-process 2.2.4", "crossbeam-utils", "futures-channel", "futures-core", "futures-io", - "futures-lite 1.13.0", - "gloo-timers", + "futures-lite 2.3.0", + "gloo-timers 0.3.0", "kv-log-macro", "log", "memchr", @@ -1697,9 +1717,9 @@ checksum = "da987586004ae7c43b7df5e3f7693775068522e1086f8d9b2d74c778a0f43313" [[package]] name = "clap" -version = "4.5.16" +version = "4.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" +checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" dependencies = [ "clap_builder", "clap_derive", @@ -1707,9 +1727,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.15" +version = "4.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" +checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" dependencies = [ "anstream", "anstyle", @@ -2086,9 +2106,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -2398,9 +2418,9 @@ dependencies = [ [[package]] name = "dashmap" -version = "6.0.1" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804c8821570c3f8b70230c2ba75ffa5c0f9a4189b9a432b6656c536712acae28" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ "cfg-if", "crossbeam-utils", @@ -3664,7 +3684,7 @@ version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" dependencies = [ - "gloo-timers", + "gloo-timers 0.2.6", "send_wrapper 0.4.0", ] @@ -3700,6 +3720,7 @@ name = "gen-vk-contract" version = "0.1.0" dependencies = [ "ark-srs", + "clap", "ethers", "hotshot-contract-adapter", "hotshot-stake-table", @@ -3777,6 +3798,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "group" version = "0.13.0" @@ -7056,9 +7089,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.11" +version = "2.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" +checksum = "9c73c26c01b8c87956cea613c907c9d6ecffd8d18a2a5908e5de0adfaa185cea" dependencies = [ "memchr", "thiserror", @@ -7067,9 +7100,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.11" +version = "2.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" +checksum = "664d22978e2815783adbdd2c588b455b1bd625299ce36b2a99881ac9627e6d8d" dependencies = [ "pest", "pest_generator", @@ -7077,9 +7110,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.11" +version = "2.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" +checksum = "a2d5487022d5d33f4c30d91c22afa240ce2a644e87fe08caad974d4eab6badbe" dependencies = [ "pest", "pest_meta", @@ -7090,9 +7123,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.7.11" +version = "2.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" +checksum = "0091754bbd0ea592c4deb3a122ce8ecbb0753b738aa82bc055fcc2eccc8d8174" dependencies = [ "once_cell", "pest", @@ -7278,7 +7311,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite 0.2.14", - "rustix 0.38.35", + "rustix 0.38.36", "tracing", "windows-sys 0.59.0", ] @@ -7534,7 +7567,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" dependencies = [ "anyhow", - "itertools 0.11.0", + "itertools 0.12.1", "proc-macro2", "quote", "syn 2.0.77", @@ -8287,9 +8320,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.35" +version = "0.38.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" +checksum = "3f55e80d50763938498dd5ebb18647174e0c76dc38c5505294bb224624f30f36" dependencies = [ "bitflags 2.6.0", "errno", @@ -8684,9 +8717,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] @@ -8713,9 +8746,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", @@ -8733,9 +8766,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", "memchr", @@ -9034,7 +9067,7 @@ dependencies = [ "async-io 1.13.0", "async-lock 2.8.0", "async-net", - "async-process", + "async-process 1.8.1", "blocking", "futures-lite 1.13.0", ] @@ -9162,9 +9195,9 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" dependencies = [ "nom", "unicode_categories", @@ -9773,7 +9806,7 @@ dependencies = [ "cfg-if", "fastrand 2.1.1", "once_cell", - "rustix 0.38.35", + "rustix 0.38.36", "windows-sys 0.59.0", ] @@ -10125,9 +10158,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite 0.2.14", @@ -10151,9 +10184,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes 1.7.1", "futures-core", diff --git a/Cargo.toml b/Cargo.toml index 3a6ade3c0..536cb2bee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,23 +54,23 @@ dotenvy = "0.15" ethers = { version = "2.0", features = ["solc"] } futures = "0.3" -hotshot = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } +hotshot = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } # Hotshot imports -hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", branch = "lc-contract-updates" } -hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", branch = "lc-contract-updates" } -marketplace-builder-core = { git = "https://github.com/EspressoSystems/marketplace-builder-core", branch = "lc-contract-updates" } -hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", branch = "lc-contract-updates" } -hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } -hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", branch = "lc-contract-updates" } -hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } +hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", tag = "0.5.73" } +hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", tag = "0.1.46" } +marketplace-builder-core = { git = "https://github.com/EspressoSystems/marketplace-builder-core", tag = "0.0.9" } +hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", tag = "0.1.45" } +hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } +hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", tag = "0.1.55" } +hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } hotshot-state-prover = { version = "0.1.0", path = "hotshot-state-prover" } -hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } -hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } -hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } -libp2p-networking = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } +hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } +hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } +hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } +libp2p-networking = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } hotshot-contract-adapter = { version = "0.1.0", path = "contracts/rust/adapter" } # Temporary, used to pull in the mock auction results provider -hotshot-example-types = { git = "https://github.com/EspressoSystems/hotshot", branch = "lc-contract-updates" } +hotshot-example-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } # Push CDN imports cdn-broker = { git = "https://github.com/EspressoSystems/Push-CDN", features = [ From ee6c04866e6e473915b2c167ba721b2c20d4f64d Mon Sep 17 00:00:00 2001 From: Alex Xiong Date: Sat, 7 Sep 2024 11:44:59 +0800 Subject: [PATCH 23/27] point to new hotshot release --- Cargo.lock | 82 ++++++++----------------- Cargo.toml | 62 +++++++++---------- hotshot-state-prover/src/circuit.rs | 4 +- hotshot-state-prover/src/mock_ledger.rs | 2 +- hotshot-state-prover/src/snark.rs | 2 +- sequencer/src/state_signature.rs | 8 +-- types/src/v0/traits.rs | 1 + 7 files changed, 64 insertions(+), 97 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 937d7de8b..36013217d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -799,26 +799,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "async-process" -version = "2.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a07789659a4d385b79b18b9127fc27e1a59e1e89117c78c5ea3b806f016374" -dependencies = [ - "async-channel 2.3.1", - "async-io 2.3.4", - "async-lock 3.4.0", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener 5.3.1", - "futures-lite 2.3.0", - "rustix 0.38.36", - "tracing", - "windows-sys 0.59.0", -] - [[package]] name = "async-signal" version = "0.2.10" @@ -853,22 +833,22 @@ dependencies = [ [[package]] name = "async-std" -version = "1.13.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" dependencies = [ "async-attributes", "async-channel 1.9.0", "async-global-executor", - "async-io 2.3.4", - "async-lock 3.4.0", - "async-process 2.2.4", + "async-io 1.13.0", + "async-lock 2.8.0", + "async-process", "crossbeam-utils", "futures-channel", "futures-core", "futures-io", - "futures-lite 2.3.0", - "gloo-timers 0.3.0", + "futures-lite 1.13.0", + "gloo-timers", "kv-log-macro", "log", "memchr", @@ -3684,7 +3664,7 @@ version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" dependencies = [ - "gloo-timers 0.2.6", + "gloo-timers", "send_wrapper 0.4.0", ] @@ -3798,18 +3778,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - [[package]] name = "group" version = "0.13.0" @@ -4112,7 +4080,7 @@ dependencies = [ [[package]] name = "hotshot" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.73#92dfe8406567bba5d1e553df95807f680790fce0" +source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" dependencies = [ "anyhow", "async-broadcast", @@ -4159,7 +4127,7 @@ dependencies = [ [[package]] name = "hotshot-builder-api" version = "0.1.7" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.73#92dfe8406567bba5d1e553df95807f680790fce0" +source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" dependencies = [ "async-trait", "clap", @@ -4178,7 +4146,7 @@ dependencies = [ [[package]] name = "hotshot-builder-core" version = "0.1.45" -source = "git+https://github.com/EspressoSystems/hotshot-builder-core?tag=0.1.46#0acfd21524d40fa369010823a3a5c4ad6392c13c" +source = "git+https://github.com/EspressoSystems/hotshot-builder-core?branch=hotshot/rc-0.5.74#e13c1a8c6352232a235ec7347aeb6e6dab31fc39" dependencies = [ "anyhow", "async-broadcast", @@ -4234,7 +4202,7 @@ dependencies = [ [[package]] name = "hotshot-events-service" version = "0.1.40" -source = "git+https://github.com/EspressoSystems/hotshot-events-service.git?tag=0.1.45#4eda3b6c505c10bfea11dd558ce61740c8ac8f39" +source = "git+https://github.com/EspressoSystems/hotshot-events-service.git?branch=hotshot/rc-0.5.74#e9e11a15c4b931e62689142348afe38777c98854" dependencies = [ "async-broadcast", "async-compatibility-layer", @@ -4260,7 +4228,7 @@ dependencies = [ [[package]] name = "hotshot-example-types" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.73#92dfe8406567bba5d1e553df95807f680790fce0" +source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" dependencies = [ "anyhow", "async-broadcast", @@ -4293,7 +4261,7 @@ dependencies = [ [[package]] name = "hotshot-fakeapi" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.73#92dfe8406567bba5d1e553df95807f680790fce0" +source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" dependencies = [ "anyhow", "async-lock 2.8.0", @@ -4312,7 +4280,7 @@ dependencies = [ [[package]] name = "hotshot-macros" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.73#92dfe8406567bba5d1e553df95807f680790fce0" +source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" dependencies = [ "derive_builder", "proc-macro2", @@ -4323,7 +4291,7 @@ dependencies = [ [[package]] name = "hotshot-orchestrator" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.73#92dfe8406567bba5d1e553df95807f680790fce0" +source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" dependencies = [ "anyhow", "async-compatibility-layer", @@ -4353,7 +4321,7 @@ dependencies = [ [[package]] name = "hotshot-query-service" version = "0.1.53" -source = "git+https://github.com/EspressoSystems/hotshot-query-service?tag=0.1.55#cb73be6ce0dd5a2409c18cab1f40137bf9a83f7f" +source = "git+https://github.com/EspressoSystems/hotshot-query-service?branch=hotshot/rc-0.5.74#34837ac6f47c69ac38434b256244008e39c9361c" dependencies = [ "anyhow", "ark-serialize", @@ -4409,7 +4377,7 @@ dependencies = [ [[package]] name = "hotshot-stake-table" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.73#92dfe8406567bba5d1e553df95807f680790fce0" +source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" dependencies = [ "ark-bn254", "ark-ed-on-bn254", @@ -4471,7 +4439,7 @@ dependencies = [ [[package]] name = "hotshot-task" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.73#92dfe8406567bba5d1e553df95807f680790fce0" +source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" dependencies = [ "anyhow", "async-broadcast", @@ -4486,7 +4454,7 @@ dependencies = [ [[package]] name = "hotshot-task-impls" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.73#92dfe8406567bba5d1e553df95807f680790fce0" +source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" dependencies = [ "anyhow", "async-broadcast", @@ -4523,7 +4491,7 @@ dependencies = [ [[package]] name = "hotshot-testing" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.73#92dfe8406567bba5d1e553df95807f680790fce0" +source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" dependencies = [ "anyhow", "async-broadcast", @@ -4569,7 +4537,7 @@ dependencies = [ [[package]] name = "hotshot-types" version = "0.1.11" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.73#92dfe8406567bba5d1e553df95807f680790fce0" +source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" dependencies = [ "anyhow", "ark-bn254", @@ -5826,7 +5794,7 @@ dependencies = [ [[package]] name = "libp2p-networking" version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.73#92dfe8406567bba5d1e553df95807f680790fce0" +source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" dependencies = [ "anyhow", "async-compatibility-layer", @@ -6214,7 +6182,7 @@ dependencies = [ [[package]] name = "marketplace-builder-core" version = "0.1.46" -source = "git+https://github.com/EspressoSystems/marketplace-builder-core?tag=0.0.9#8704dd126b5345d065518664ec3ecaeb02e8f5bf" +source = "git+https://github.com/EspressoSystems/marketplace-builder-core?branch=hotshot/rc-0.5.74#8bbf04909f5ee43ff0b798eeaa032707e5ce9b29" dependencies = [ "anyhow", "async-broadcast", @@ -9067,7 +9035,7 @@ dependencies = [ "async-io 1.13.0", "async-lock 2.8.0", "async-net", - "async-process 1.8.1", + "async-process", "blocking", "futures-lite 1.13.0", ] diff --git a/Cargo.toml b/Cargo.toml index 536cb2bee..95e0f135b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,18 +8,18 @@ edition = "2021" resolver = "2" members = [ - "builder", - "contract-bindings", - "contracts/rust/adapter", - "contracts/rust/diff-test", - "contracts/rust/gen-vk-contract", - "hotshot-state-prover", - "marketplace-builder", - "marketplace-solver", - "node-metrics", - "sequencer", - "types", - "utils", + "builder", + "contract-bindings", + "contracts/rust/adapter", + "contracts/rust/diff-test", + "contracts/rust/gen-vk-contract", + "hotshot-state-prover", + "marketplace-builder", + "marketplace-solver", + "node-metrics", + "sequencer", + "types", + "utils", ] [workspace.dependencies] @@ -35,7 +35,7 @@ ark-serialize = "0.4" ark-srs = "0.3.1" async-broadcast = "0.7.0" async-compatibility-layer = { version = "1.2.1", default-features = false, features = [ - "logging-utils", + "logging-utils", ] } async-once-cell = "0.5" async-std = { version = "1.12.0", features = ["attributes", "tokio1"] } @@ -54,32 +54,32 @@ dotenvy = "0.15" ethers = { version = "2.0", features = ["solc"] } futures = "0.3" -hotshot = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } +hotshot = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74", features = ["dependency-tasks"] } # Hotshot imports -hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", tag = "0.5.73" } -hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", tag = "0.1.46" } -marketplace-builder-core = { git = "https://github.com/EspressoSystems/marketplace-builder-core", tag = "0.0.9" } -hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", tag = "0.1.45" } -hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } -hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", tag = "0.1.55" } -hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } +hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", tag = "rc-0.5.74" } +hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", branch = "hotshot/rc-0.5.74" } +marketplace-builder-core = { git = "https://github.com/EspressoSystems/marketplace-builder-core", branch = "hotshot/rc-0.5.74" } +hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", branch = "hotshot/rc-0.5.74" } +hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74" } +hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", branch = "hotshot/rc-0.5.74" } +hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74" } hotshot-state-prover = { version = "0.1.0", path = "hotshot-state-prover" } -hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } -hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } -hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } -libp2p-networking = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } +hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74" } +hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74", features = ["dependency-tasks"] } +hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74" } +libp2p-networking = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74" } hotshot-contract-adapter = { version = "0.1.0", path = "contracts/rust/adapter" } # Temporary, used to pull in the mock auction results provider -hotshot-example-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.73" } +hotshot-example-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74" } # Push CDN imports cdn-broker = { git = "https://github.com/EspressoSystems/Push-CDN", features = [ - "runtime-async-std", - "global-permits", + "runtime-async-std", + "global-permits", ], tag = "0.4.5", package = "cdn-broker" } cdn-marshal = { git = "https://github.com/EspressoSystems/Push-CDN", features = [ - "runtime-async-std", - "global-permits", + "runtime-async-std", + "global-permits", ], tag = "0.4.5", package = "cdn-marshal" } jf-plonk = { git = "https://github.com/EspressoSystems/jellyfish", tag = "jf-plonk-v0.5.1", features = [ @@ -112,7 +112,7 @@ libp2p = { version = "0.53", default-features = false } log-panics = { version = "2.0", features = ["with-backtrace"] } strum = { version = "0.26", features = ["derive"] } surf-disco = "0.9" -sqlx = { version = "^0.8", features = [ "postgres", "macros" ] } +sqlx = { version = "^0.8", features = ["postgres", "macros"] } tagged-base64 = "0.4" tide-disco = "0.9" thiserror = "1.0.61" diff --git a/hotshot-state-prover/src/circuit.rs b/hotshot-state-prover/src/circuit.rs index 536d9ad3d..b3d74401a 100644 --- a/hotshot-state-prover/src/circuit.rs +++ b/hotshot-state-prover/src/circuit.rs @@ -303,7 +303,7 @@ where circuit.finalize_for_arithmetization()?; Ok(( circuit, - GenericPublicInput::new(lightclient_state.clone(), stake_table_state.clone()), + GenericPublicInput::new(lightclient_state.clone(), *stake_table_state), )) } @@ -417,7 +417,7 @@ mod tests { .is_ok()); // lower threshold should also pass - let mut good_st_state = st_state.clone(); + let mut good_st_state = st_state; good_st_state.threshold = F::from(10u32); let (circuit, public_inputs) = build( &entries, diff --git a/hotshot-state-prover/src/mock_ledger.rs b/hotshot-state-prover/src/mock_ledger.rs index 38965a21a..f598fe5e6 100644 --- a/hotshot-state-prover/src/mock_ledger.rs +++ b/hotshot-state-prover/src/mock_ledger.rs @@ -361,7 +361,7 @@ impl MockLedger { /// Returns the `StakeTableState` in solidity pub fn get_stake_table_state(&self) -> ParsedStakeTableState { - self.stake_table_state.clone().into() + self.stake_table_state.into() } // return a dummy commitment value diff --git a/hotshot-state-prover/src/snark.rs b/hotshot-state-prover/src/snark.rs index 3bf7655b0..0f16e5bba 100644 --- a/hotshot-state-prover/src/snark.rs +++ b/hotshot-state-prover/src/snark.rs @@ -273,7 +273,7 @@ mod tests { .is_ok()); // minimum bad path, other bad cases are checked inside `circuit.rs` - let mut bad_st_state = st_state.clone(); + let mut bad_st_state = st_state; bad_st_state.threshold = CircuitField::from(100u32); let result = generate_state_update_proof::<_, _, _, _>( &mut prng, diff --git a/sequencer/src/state_signature.rs b/sequencer/src/state_signature.rs index ed81f61da..51b0b6292 100644 --- a/sequencer/src/state_signature.rs +++ b/sequencer/src/state_signature.rs @@ -46,6 +46,7 @@ pub struct StateSigner { signatures: RwLock, /// Commitment for current fixed stake table + #[allow(dead_code)] // although not used today, might need it for dynamic stake table later stake_table_comm: StakeTableCommitmentType, /// The state relay server url @@ -75,7 +76,7 @@ impl StateSigner { let Some(LeafInfo { leaf, .. }) = leaf_chain.first() else { return; }; - match form_light_client_state(leaf, &self.stake_table_comm) { + match form_light_client_state(leaf) { Ok(state) => { let signature = self.sign_new_state(&state).await; tracing::debug!("New leaves decided. Latest block height: {}", leaf.height(),); @@ -146,10 +147,7 @@ fn hash_bytes_to_field(bytes: &[u8]) -> Result { Ok(VariableLengthRescueCRHF::<_, 1>::evaluate(elem)?[0]) } -fn form_light_client_state( - leaf: &Leaf, - _stake_table_comm: &StakeTableCommitmentType, -) -> anyhow::Result { +fn form_light_client_state(leaf: &Leaf) -> anyhow::Result { let header = leaf.block_header(); let mut block_comm_root_bytes = vec![]; header diff --git a/types/src/v0/traits.rs b/types/src/v0/traits.rs index 61924f8f1..8c18cdc19 100644 --- a/types/src/v0/traits.rs +++ b/types/src/v0/traits.rs @@ -467,6 +467,7 @@ pub trait SequencerPersistence: Sized + Send + Sync + 'static { state, validated_state, view, + highest_voted_view, saved_proposals, high_qc, undecided_leaves.into_values().collect(), From d6df936bc5bddaa92fa1e9f0e802e62933122f51 Mon Sep 17 00:00:00 2001 From: Alysia Huggins Date: Sat, 7 Sep 2024 14:55:17 -0400 Subject: [PATCH 24/27] reove HotShotCommitments struct --- .../artifacts/LightClientMock_bytecode.json | 2 +- .../artifacts/LightClient_bytecode.json | 2 +- contract-bindings/src/light_client.rs | 43 ++++++----- contract-bindings/src/light_client_mock.rs | 62 +++++++-------- contract-bindings/src/shared_types.rs | 17 ---- contracts/src/LightClient.sol | 35 ++++----- contracts/test/LightClient.t.sol | 77 +++++++------------ 7 files changed, 99 insertions(+), 139 deletions(-) diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json index d0f613b26..99d58edc5 100644 --- a/contract-bindings/artifacts/LightClientMock_bytecode.json +++ b/contract-bindings/artifacts/LightClientMock_bytecode.json @@ -1 +1 @@ -"0x60a0604052306080523480156200001557600080fd5b50604051620034a8380380620034a883398101604081905262000038916200053b565b6200004262000058565b6200004f8383836200010c565b50505062000697565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a95760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001095780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b82516001600160401b031615158062000131575060208301516001600160401b031615155b806200013f57506020820151155b806200014d57506040820151155b806200015b57506060820151155b806200016657508151155b1562000185576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b0390811668010000000000000000026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b199091161790556200022443428562000229565b505050565b600a5415801590620002f75750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b03169081106200026c576200026c620005f4565b6000918252602090912060039091020154600a8054680100000000000000009092046001600160401b031691620002a69060019062000620565b81548110620002b957620002b9620005f4565b6000918252602090912060039091020154620002eb91906801000000000000000090046001600160401b03166200063c565b6001600160401b031610155b156200039557600954600a805490916001600160401b0316908110620003215762000321620005f4565b60009182526020822060039091020180546001600160801b03191681556001810180546001600160401b0319169055600201819055600980546001600160401b0316916200036f8362000666565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516060810182526001600160401b03948516815292841660208085019182528251808401845284820151871681529383015184820152918401928352600a805460018101825560009190915293517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86003909502948501805492519187166001600160801b0319909316929092176801000000000000000091871691909102179055905180517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a9840180546001600160401b031916919095161790935591909101517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aa90910155565b604051606081016001600160401b0381118282101715620004d257634e487b7160e01b600052604160045260246000fd5b60405290565b604051608081016001600160401b0381118282101715620004d257634e487b7160e01b600052604160045260246000fd5b80516001600160401b03811681146200052157600080fd5b919050565b805163ffffffff811681146200052157600080fd5b60008060008385036101008112156200055357600080fd5b60608112156200056257600080fd5b6200056c620004a1565b620005778662000509565b8152620005876020870162000509565b60208201526040868101519082015293506080605f1982011215620005ab57600080fd5b50620005b6620004d8565b60608581015182526080860151602083015260a0860151604083015260c0860151908201529150620005eb60e0850162000526565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156200063657620006366200060a565b92915050565b6001600160401b038281168282160390808211156200065f576200065f6200060a565b5092915050565b60006001600160401b038281166002600160401b031981016200068d576200068d6200060a565b6001019392505050565b608051612de7620006c1600039600081816111d3015281816111fc015261137b0152612de76000f3fe60806040526004361061019c5760003560e01c80638584d23f116100ec578063bd32519a1161008a578063d24d933d11610064578063d24d933d146105c4578063e0303301146105f4578063f2fde38b14610614578063f9e50d191461063457600080fd5b8063bd32519a1461053e578063c23b9e9e1461056f578063c8e5e498146105a857600080fd5b80639baa3cc9116100c65780639baa3cc9146104325780639fdb54a714610452578063ad3cb1cc146104a8578063b5adea3c146104e657600080fd5b80638584d23f146103a85780638da5cb5b146103d557806396c1ca611461041257600080fd5b80632f79889d116101595780634f1ef286116101335780634f1ef2861461034857806352d1902d1461035b57806369cc6a041461037e578063715018a61461039357600080fd5b80632f79889d14610295578063313df7b1146102cd578063426d31941461030557600080fd5b8063013fa5fc146101a157806302b592f3146101c35780630d8e6e2c146101fb5780632063d4f7146102285780632d52aad6146102485780632f5f460014610275575b600080fd5b3480156101ad57600080fd5b506101c16101bc3660046121dd565b610649565b005b3480156101cf57600080fd5b506101e36101de3660046121f8565b610706565b6040516101f293929190612211565b60405180910390f35b34801561020757600080fd5b506040805160018152600060208201819052918101919091526060016101f2565b34801561023457600080fd5b506101c1610243366004612393565b610763565b34801561025457600080fd5b506101c16102633660046121f8565b600b805460ff19166001179055600c55565b34801561028157600080fd5b506101c1610290366004612547565b6108b7565b3480156102a157600080fd5b506009546102b5906001600160401b031681565b6040516001600160401b0390911681526020016101f2565b3480156102d957600080fd5b506008546102ed906001600160a01b031681565b6040516001600160a01b0390911681526020016101f2565b34801561031157600080fd5b506000546001546002546003546103289392919084565b6040805194855260208501939093529183015260608201526080016101f2565b6101c161035636600461265c565b61096d565b34801561036757600080fd5b50610370610988565b6040519081526020016101f2565b34801561038a57600080fd5b506101c16109a5565b34801561039f57600080fd5b506101c1610a15565b3480156103b457600080fd5b506103c86103c33660046121f8565b610a27565b6040516101f29190612701565b3480156103e157600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166102ed565b34801561041e57600080fd5b506101c161042d366004612735565b610b99565b34801561043e57600080fd5b506101c161044d366004612750565b610c0e565b34801561045e57600080fd5b50600654600754610482916001600160401b0380821692600160401b909204169083565b604080516001600160401b039485168152939092166020840152908201526060016101f2565b3480156104b457600080fd5b506104d9604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101f29190612821565b3480156104f257600080fd5b506101c1610501366004612854565b80516006805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905560400151600755565b34801561054a57600080fd5b5060085461055f90600160a01b900460ff1681565b60405190151581526020016101f2565b34801561057b57600080fd5b5060085461059390600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101f2565b3480156105b457600080fd5b506101c1600b805460ff19169055565b3480156105d057600080fd5b50600454600554610482916001600160401b0380821692600160401b909204169083565b34801561060057600080fd5b5061055f61060f366004612870565b610d32565b34801561062057600080fd5b506101c161062f3660046121dd565b610d68565b34801561064057600080fd5b50600a54610370565b610651610dab565b6001600160a01b0381166106785760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036106a75760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a81b0319166001600160a01b0383811691909117600160a01b1791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600a818154811061071657600080fd5b600091825260209182902060039091020180546040805180820190915260018301546001600160401b039081168252600290930154938101939093528181169350600160401b9004169083565b600854600160a01b900460ff16801561078757506008546001600160a01b03163314155b156107a5576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806107de575060065460208301516001600160401b03600160401b9092048216911611155b156107fc5760405163051c46ef60e01b815260040160405180910390fd5b6108098260400151610e06565b6108138282610e76565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561085a434284610f6e565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516108ab91815260200190565b60405180910390a35050565b6108c3600a6000611eb8565b60005b815181101561096957600a8282815181106108e3576108e3612892565b60209081029190910181015182546001818101855560009485529383902082516003909202018054838501516001600160401b03908116600160401b026001600160801b031990921693811693909317178155604090920151805183860180549190931667ffffffffffffffff19919091161790915590910151600290910155016108c6565b5050565b6109756111c8565b61097e8261126d565b61096982826112ae565b6000610992611370565b50600080516020612dbb83398151915290565b6109ad610dab565b600854600160a01b900460ff16156109fa57600880546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610a1d610dab565b610a1360006113b9565b6040805180820190915260008082526020820152600a805490610a4b6001836128be565b81548110610a5b57610a5b612892565b60009182526020909120600160039092020101546001600160401b03168310610a9757604051631856a49960e21b815260040160405180910390fd5b6009546001600160401b03165b81811015610b3d5783600a8281548110610ac057610ac0612892565b60009182526020909120600160039092020101546001600160401b03161115610b3557600a8181548110610af657610af6612892565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b031682526002015491810191909152949350505050565b600101610aa4565b50600a610b4b6001836128be565b81548110610b5b57610b5b612892565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b0316825260020154918101919091529392505050565b610ba1610dab565b610e108163ffffffff161080610bca575060085463ffffffff600160a81b909104811690821611155b15610be8576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a81b0263ffffffff60a81b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610c535750825b90506000826001600160401b03166001148015610c6f5750303b155b905081158015610c7d575080155b15610c9b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cc557845460ff60401b1916600160401b1785555b610cce8661142a565b610cd661143b565b610ce1898989611443565b8315610d2757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600b5460009060ff16610d4e57610d49838361154e565b610d5f565b81600c5484610d5d91906128be565b115b90505b92915050565b610d70610dab565b6001600160a01b038116610d9f57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610da8816113b9565b50565b33610ddd7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a135760405163118cdaa760e01b8152336004820152602401610d96565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806109695760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610d96565b6000610e8061165f565b9050610e8a611ed9565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a083015260005460c08301525163ce537a7760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063ce537a7790610f0a90859085908890600401612ad8565b602060405180830381865af4158015610f27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4b9190612cff565b610f68576040516309bde33960e01b815260040160405180910390fd5b50505050565b600a54158015906110275750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b0316908110610fad57610fad612892565b6000918252602090912060039091020154600a8054600160401b9092046001600160401b031691610fe0906001906128be565b81548110610ff057610ff0612892565b600091825260209091206003909102015461101b9190600160401b90046001600160401b0316612d21565b6001600160401b031610155b156110c057600954600a805490916001600160401b031690811061104d5761104d612892565b60009182526020822060039091020180546001600160801b031916815560018101805467ffffffffffffffff19169055600201819055600980546001600160401b03169161109a83612d48565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516060810182526001600160401b03948516815292841660208085019182528251808401845284820151871681529383015184820152918401928352600a805460018101825560009190915293517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86003909502948501805492519187166001600160801b031990931692909217600160401b91871691909102179055905180517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a98401805467ffffffffffffffff1916919095161790935591909101517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aa90910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061124f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611243600080516020612dbb833981519152546001600160a01b031690565b6001600160a01b031614155b15610a135760405163703e46dd60e11b815260040160405180910390fd5b611275610dab565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d906020016106fb565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611308575060408051601f3d908101601f1916820190925261130591810190612d6e565b60015b61133057604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610d96565b600080516020612dbb833981519152811461136157604051632a87526960e21b815260048101829052602401610d96565b61136b8383611c8f565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a135760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b611432611ce5565b610da881611d2e565b610a13611ce5565b82516001600160401b0316151580611467575060208301516001600160401b031615155b8061147457506020820151155b8061148157506040820151155b8061148e57506060820151155b8061149857508151155b156114b6576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b1990911617905561136b434285610f6e565b600a54600090438411806115625750600381105b156115805760405163b0b4387760e01b815260040160405180910390fd5b6000808061158f6001856128be565b90505b8161162a5786600a82815481106115ab576115ab612892565b60009182526020909120600390910201546001600160401b0316116115fe5760019150600a81815481106115e1576115e1612892565b60009182526020909120600390910201546001600160401b031692505b6002811061162a576009546001600160401b0316811461162a578061162281612d87565b915050611592565b816116485760405163b0b4387760e01b815260040160405180910390fd5b8561165384896128be565b11979650505050505050565b611667611ef7565b620100008152600760208201527f1369aa78dc50135ad756d62c97a64a0edcd30066584168200d9d1facf82ca4f56040820151527f2cf23456d712b06f8e3aa5bf0acc3e46a3d094602a3a2b99d873bba05a4391476020604083015101527f08a35f379d2d2c490a51006697275e4db79b67b4a175c1477e262d29e25e42316060820151527f218828131bb7940ccc88c561b299755af4bf0b71ed930b129e8be0a1218139ea6020606083015101527f23a2172436c1145b36d5bc6d3b31fa1610c73a543ea443918aaa3ee175f9921b6080820151527f2502adf404d62877c310214ae9942e93c40b154d34c024bab48a3ca057e60a116020608083015101527f1bb88ada91ab7734882f7826b81275320081ac485f9cf8bfbc3ba54b6eb4dff360a0820151527f25c74a27e9a3b20114a3a91f31c20f01777e7ed913e0ef949f0285e2e7c2069b602060a083015101527f12b0ce76ac8b0dbd405ebc5dd0bae0f91aed50033c7ea36fc62aaba2b98333dc60c0820151527f185b42af49dd1cbe337a84f74b704172428e754a0bea024ab3eb2f996afb2c47602060c083015101527f21f53ad4538b45438bbf0521446070223920e3df6f9022a64cc16d7f94e85c0860e0820151527f2278ac3dedfdac7feb9725a022497175518eada52c8932fc40e6e75bea889fb8602060e083015101527f0876136f81c16298487bfb1be74d4a3487ec45645ab1d09dc2e5b865d62230df610100820151527f098c641c947ecd798dfd5e1b2fe428024cdf03061a53ff774ea8a9e3de9d3f2b602061010083015101527f15eaac2c6232d2268bf79dc47ed9666f992fb3d96ad23fb21690c21586c5472e610120820151527f0f10f1ffc54881287fda6f200bc85d8245b508d844a974098a41119867b325d0602061012083015101527f0895ceea40b085534e9739ca5442ba48b3a3592affde2b509df74521b47d8ab0610140820151527f2e12ec5800ac92fe2a8e7040bc5b435b9eb71e31380173fa7688bf81fcbba455602061014083015101527f2f5384eb5653e47576efe248e7903f463243414bfed5237dda750df3996bd918610160820151527f1c3cd6b11da8704cdc871ab4fa323d7ee57bd40ce165b49a56d5ef6489cd251a602061016083015101527f13579994957ce1554cc1e5b194fb63c9513707f627414f8442681ae736e36450610180820151527f26c9bdcd96d8e420b12974ade93ad9c312c4185213d2f6831a7c625a18890e95602061018083015101527f0cc70a1d542a9a1535ae5d9201696adc5c99c1bcebd9951dfa8afec79fa0b6446101a0820151527f10b043d9f1869181b96579d6616efc17a5df7b84c4d431d966c9094bf1e8815360206101a083015101527f198a65309d131a43b0ab1c47659d0336cfbf62b27f4727106b4fd971c73dd4036101c0820151527f23df99eac3c1947903b211b800efeb76f47d5e87b7414866543492e8c7798d1a60206101c083015101527f221cc5e47b81ce8dcfa72ef981916a8eddef12fcde59c56c62830c126ebef0de6101e0820151527f231f99340c35c9e09652a6df73c9cec5d88738cb71ff45716fdc9e9e45a4926e60206101e083015101527f2c9f1489fce0f263e03f3e97bf0a72273aafcca9325ff47786adb04a52a6d22c610200820151527f21f66e28f17e01e9fd593e16d022c4eca25bd5db96daec606d97b604cc414838602061020083015101527f2015745604a9571e226bd99043cfaf1f96267cc5de67f497563ff81100531d26610220820151527f206889ff4c58dd08ee1107191a2a5bc5dbae55c49d7d8397801799868d10f805602061022083015101527f21062ab8f8ecd8932b429a1eb8614b1e03db61bff6a5cd2d5d7ea193e90e9927610240820151527f217f9b27b934b88ffe555d682dfe6e8b6d503f86b14bbd96342bc48487a60b27602061024083015101527f1c9eda2d195cb731f903235ead6a4f7c66db49da713ecb27afee076f0eea7154610260820151527f2647c161c00b90258e1cefebb17481f8a5d91b5f9dca626e3e89a9215bcca16a602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611c9882611d36565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611cdd5761136b8282611d9b565b610969611e11565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a1357604051631afcd79f60e31b815260040160405180910390fd5b610d70611ce5565b806001600160a01b03163b600003611d6c57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610d96565b600080516020612dbb83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611db89190612d9e565b600060405180830381855af49150503d8060008114611df3576040519150601f19603f3d011682016040523d82523d6000602084013e611df8565b606091505b5091509150611e08858383611e30565b95945050505050565b3415610a135760405163b398979f60e01b815260040160405180910390fd5b606082611e4557611e4082611e8f565b611e88565b8151158015611e5c57506001600160a01b0384163b155b15611e8557604051639996b31560e01b81526001600160a01b0385166004820152602401610d96565b50805b9392505050565b805115611e9f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825560030290600052602060002090810190610da89190612184565b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611f2e604051806040016040528060008152602001600081525090565b8152602001611f50604051806040016040528060008152602001600081525090565b8152602001611f72604051806040016040528060008152602001600081525090565b8152602001611f94604051806040016040528060008152602001600081525090565b8152602001611fb6604051806040016040528060008152602001600081525090565b8152602001611fd8604051806040016040528060008152602001600081525090565b8152602001611ffa604051806040016040528060008152602001600081525090565b815260200161201c604051806040016040528060008152602001600081525090565b815260200161203e604051806040016040528060008152602001600081525090565b8152602001612060604051806040016040528060008152602001600081525090565b8152602001612082604051806040016040528060008152602001600081525090565b81526020016120a4604051806040016040528060008152602001600081525090565b81526020016120c6604051806040016040528060008152602001600081525090565b81526020016120e8604051806040016040528060008152602001600081525090565b815260200161210a604051806040016040528060008152602001600081525090565b815260200161212c604051806040016040528060008152602001600081525090565b815260200161214e604051806040016040528060008152602001600081525090565b8152602001612170604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b5b808211156121bd5780546001600160801b031916815560018101805467ffffffffffffffff1916905560006002820155600301612185565b5090565b80356001600160a01b03811681146121d857600080fd5b919050565b6000602082840312156121ef57600080fd5b610d5f826121c1565b60006020828403121561220a57600080fd5b5035919050565b6001600160401b0384811682528316602082015260808101612249604083018480516001600160401b03168252602090810151910152565b949350505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561228957612289612251565b60405290565b604080519081016001600160401b038111828210171561228957612289612251565b6040516102e081016001600160401b038111828210171561228957612289612251565b604051601f8201601f191681016001600160401b03811182821017156122fc576122fc612251565b604052919050565b80356001600160401b03811681146121d857600080fd5b60006060828403121561232d57600080fd5b612335612267565b905061234082612304565b815261234e60208301612304565b60208201526040820135604082015292915050565b60006040828403121561237557600080fd5b61237d61228f565b9050813581526020820135602082015292915050565b6000808284036104e08112156123a857600080fd5b6123b2858561231b565b925061048080605f19830112156123c857600080fd5b6123d06122b1565b91506123df8660608701612363565b82526123ee8660a08701612363565b60208301526124008660e08701612363565b604083015261012061241487828801612363565b606084015261016061242888828901612363565b60808501526101a061243c89828a01612363565b60a08601526101e06124508a828b01612363565b60c08701526102206124648b828c01612363565b60e08801526102606124788c828d01612363565b6101008901526102a061248d8d828e01612363565b878a015261249f8d6102e08e01612363565b6101408a01526124b38d6103208e01612363565b868a01526124c58d6103608e01612363565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b6000602080838503121561255a57600080fd5b82356001600160401b038082111561257157600080fd5b818501915085601f83011261258557600080fd5b81358181111561259757612597612251565b6125a5848260051b016122d4565b818152848101925060079190911b8301840190878211156125c557600080fd5b928401925b818410156126515783880360808112156125e45760008081fd5b6125ec612267565b6125f586612304565b8152612602878701612304565b87820152604080603f198401121561261a5760008081fd5b61262261228f565b925061262f818801612304565b83526060870135888401528101919091528352608090930192918401916125ca565b979650505050505050565b6000806040838503121561266f57600080fd5b612678836121c1565b91506020808401356001600160401b038082111561269557600080fd5b818601915086601f8301126126a957600080fd5b8135818111156126bb576126bb612251565b6126cd601f8201601f191685016122d4565b915080825287848285010111156126e357600080fd5b80848401858401376000848284010152508093505050509250929050565b81516001600160401b031681526020808301519082015260408101610d62565b803563ffffffff811681146121d857600080fd5b60006020828403121561274757600080fd5b610d5f82612721565b60008060008084860361012081121561276857600080fd5b612772878761231b565b94506080605f198201121561278657600080fd5b50604051608081018181106001600160401b03821117156127a9576127a9612251565b8060405250606086013581526080860135602082015260a0860135604082015260c08601356060820152809350506127e360e08601612721565b91506127f261010086016121c1565b905092959194509250565b60005b83811015612818578181015183820152602001612800565b50506000910152565b60208152600082518060208401526128408160408501602087016127fd565b601f01601f19169190910160400192915050565b60006060828403121561286657600080fd5b610d5f838361231b565b6000806040838503121561288357600080fd5b50508035926020909101359150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610d6257610d626128a8565b8060005b6007811015610f685781518452602093840193909101906001016128d5565b61290982825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e084015250608081015161010061296c8185018380518252602090810151910152565b60a0830151915061014061298c8186018480518252602090810151910152565b60c084015192506101806129ac8187018580518252602090810151910152565b60e085015193506101c06129cc8188018680518252602090810151910152565b928501519350610200926129ec8785018680518252602090810151910152565b6101208601519450610240612a0d8189018780518252602090810151910152565b92860151945061028092612a2d8885018780518252602090810151910152565b61016087015195506102c0612a4e818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a608201905084518252602085015160208301526040850151612b0b604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612b588185018380518252602090810151910152565b60c08701519150610140612b788186018480518252602090810151910152565b60e08801519250610180612b988187018580518252602090810151910152565b9188015192506101c091612bb88684018580518252602090810151910152565b6101208901519350610200612bd98188018680518252602090810151910152565b91890151935061024091612bf98784018680518252602090810151910152565b6101608a01519450610280612c1a8189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612cf16105008301856128d1565b6122496105e08301846128f4565b600060208284031215612d1157600080fd5b81518015158114611e8857600080fd5b6001600160401b03828116828216039080821115612d4157612d416128a8565b5092915050565b60006001600160401b03808316818103612d6457612d646128a8565b6001019392505050565b600060208284031215612d8057600080fd5b5051919050565b600081612d9657612d966128a8565b506000190190565b60008251612db08184602087016127fd565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" +"0x60a0604052306080523480156200001557600080fd5b506040516200335738038062003357833981016040819052620000389162000503565b6200004262000058565b6200004f8383836200010c565b5050506200065f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a95760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001095780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b82516001600160401b031615158062000131575060208301516001600160401b031615155b806200013f57506020820151155b806200014d57506040820151155b806200015b57506060820151155b806200016657508151155b1562000185576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b0390811668010000000000000000026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b199091161790556200022443428562000229565b505050565b600a5415801590620002f75750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b03169081106200026c576200026c620005bc565b6000918252602090912060029091020154600a8054680100000000000000009092046001600160401b031691620002a690600190620005e8565b81548110620002b957620002b9620005bc565b6000918252602090912060029091020154620002eb91906801000000000000000090046001600160401b031662000604565b6001600160401b031610155b156200038357600954600a805490916001600160401b0316908110620003215762000321620005bc565b60009182526020822060029091020180546001600160c01b0319168155600101819055600980546001600160401b0316916200035d836200062e565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600a8054600181018255600091909152935160029094027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881018054935194518716600160801b02600160801b600160c01b031995881668010000000000000000026001600160801b03199095169690971695909517929092179290921693909317909155517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a990910155565b604051606081016001600160401b03811182821017156200049a57634e487b7160e01b600052604160045260246000fd5b60405290565b604051608081016001600160401b03811182821017156200049a57634e487b7160e01b600052604160045260246000fd5b80516001600160401b0381168114620004e957600080fd5b919050565b805163ffffffff81168114620004e957600080fd5b60008060008385036101008112156200051b57600080fd5b60608112156200052a57600080fd5b6200053462000469565b6200053f86620004d1565b81526200054f60208701620004d1565b60208201526040868101519082015293506080605f19820112156200057357600080fd5b506200057e620004a0565b60608581015182526080860151602083015260a0860151604083015260c0860151908201529150620005b360e08501620004ee565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115620005fe57620005fe620005d2565b92915050565b6001600160401b03828116828216039080821115620006275762000627620005d2565b5092915050565b60006001600160401b038281166002600160401b03198101620006555762000655620005d2565b6001019392505050565b608051612cce620006896000396000818161114b0152818161117401526112f30152612cce6000f3fe60806040526004361061019c5760003560e01c80638da5cb5b116100ec578063c23b9e9e1161008a578063e030330111610064578063e0303301146105ed578063f2fde38b1461060d578063f56761601461062d578063f9e50d191461064d57600080fd5b8063c23b9e9e14610568578063c8e5e498146105a1578063d24d933d146105bd57600080fd5b80639fdb54a7116100c65780639fdb54a71461044b578063ad3cb1cc146104a1578063b5adea3c146104df578063bd32519a1461053757600080fd5b80638da5cb5b146103ce57806396c1ca611461040b5780639baa3cc91461042b57600080fd5b8063313df7b11161015957806352d1902d1161013357806352d1902d1461036157806369cc6a0414610384578063715018a6146103995780638584d23f146103ae57600080fd5b8063313df7b1146102d3578063426d31941461030b5780634f1ef2861461034e57600080fd5b8063013fa5fc146101a157806302b592f3146101c35780630d8e6e2c146102215780632063d4f71461024e5780632d52aad61461026e5780632f79889d1461029b575b600080fd5b3480156101ad57600080fd5b506101c16101bc366004612142565b610662565b005b3480156101cf57600080fd5b506101e36101de36600461215d565b61071f565b60405161021894939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b34801561022d57600080fd5b50604080516001815260006020820181905291810191909152606001610218565b34801561025a57600080fd5b506101c16102693660046122d3565b61076a565b34801561027a57600080fd5b506101c161028936600461215d565b600b805460ff19166001179055600c55565b3480156102a757600080fd5b506009546102bb906001600160401b031681565b6040516001600160401b039091168152602001610218565b3480156102df57600080fd5b506008546102f3906001600160a01b031681565b6040516001600160a01b039091168152602001610218565b34801561031757600080fd5b5060005460015460025460035461032e9392919084565b604080519485526020850193909352918301526060820152608001610218565b6101c161035c366004612487565b6108be565b34801561036d57600080fd5b506103766108dd565b604051908152602001610218565b34801561039057600080fd5b506101c16108fa565b3480156103a557600080fd5b506101c161096a565b3480156103ba57600080fd5b506103766103c936600461215d565b61097c565b3480156103da57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166102f3565b34801561041757600080fd5b506101c1610426366004612540565b610a9c565b34801561043757600080fd5b506101c161044636600461255b565b610b11565b34801561045757600080fd5b5060065460075461047b916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610218565b3480156104ad57600080fd5b506104d2604051806040016040528060058152602001640352e302e360dc1b81525081565b604051610218919061260b565b3480156104eb57600080fd5b506101c16104fa36600461263e565b80516006805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905560400151600755565b34801561054357600080fd5b5060085461055890600160a01b900460ff1681565b6040519015158152602001610218565b34801561057457600080fd5b5060085461058c90600160a81b900463ffffffff1681565b60405163ffffffff9091168152602001610218565b3480156105ad57600080fd5b506101c1600b805460ff19169055565b3480156105c957600080fd5b5060045460055461047b916001600160401b0380821692600160401b909204169083565b3480156105f957600080fd5b5061055861060836600461265a565b610c35565b34801561061957600080fd5b506101c1610628366004612142565b610c6b565b34801561063957600080fd5b506101c161064836600461267c565b610cae565b34801561065957600080fd5b50600a54610376565b61066a610d5c565b6001600160a01b0381166106915760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036106c05760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a81b0319166001600160a01b0383811691909117600160a01b1791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600a818154811061072f57600080fd5b6000918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b600854600160a01b900460ff16801561078e57506008546001600160a01b03163314155b156107ac576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806107e5575060065460208301516001600160401b03600160401b9092048216911611155b156108035760405163051c46ef60e01b815260040160405180910390fd5b6108108260400151610db7565b61081a8282610e27565b81516006805460208501516001600160401b03908116600160401b026001600160801b03199092169316929092179190911790556040820151600755610861434284610f1f565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516108b291815260200190565b60405180910390a35050565b6108c6611140565b6108cf826111e5565b6108d98282611226565b5050565b60006108e76112e8565b50600080516020612ca283398151915290565b610902610d5c565b600854600160a01b900460ff161561094f57600880546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610972610d5c565b6109686000611331565b600a805460009161098e600183612787565b8154811061099e5761099e61279a565b6000918252602090912060029091020154600160801b90046001600160401b031683106109de57604051631856a49960e21b815260040160405180910390fd5b6009546001600160401b03165b81811015610a645783600a8281548110610a0757610a0761279a565b6000918252602090912060029091020154600160801b90046001600160401b03161115610a5c57600a8181548110610a4157610a4161279a565b90600052602060002090600202016001015492505050919050565b6001016109eb565b50600a610a72600183612787565b81548110610a8257610a8261279a565b906000526020600020906002020160010154915050919050565b610aa4610d5c565b610e108163ffffffff161080610acd575060085463ffffffff600160a81b909104811690821611155b15610aeb576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a81b0263ffffffff60a81b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610b565750825b90506000826001600160401b03166001148015610b725750303b155b905081158015610b80575080155b15610b9e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610bc857845460ff60401b1916600160401b1785555b610bd1866113a2565b610bd96113b3565b610be48989896113bb565b8315610c2a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600b5460009060ff16610c5157610c4c83836114c6565b610c62565b81600c5484610c609190612787565b115b90505b92915050565b610c73610d5c565b6001600160a01b038116610ca257604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610cab81611331565b50565b610cba600a6000611e30565b60005b81518110156108d957600a828281518110610cda57610cda61279a565b602090810291909101810151825460018181018555600094855293839020825160029092020180549383015160408401516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026001600160801b031990971691909416179490941793909316178255606001519082015501610cbd565b33610d8e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109685760405163118cdaa760e01b8152336004820152602401610c99565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806108d95760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610c99565b6000610e316115d7565b9050610e3b611e51565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a083015260005460c08301525163ce537a7760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063ce537a7790610ebb908590859088906004016129b7565b602060405180830381865af4158015610ed8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efc9190612be6565b610f19576040516309bde33960e01b815260040160405180910390fd5b50505050565b600a5415801590610fd85750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b0316908110610f5e57610f5e61279a565b6000918252602090912060029091020154600a8054600160401b9092046001600160401b031691610f9190600190612787565b81548110610fa157610fa161279a565b6000918252602090912060029091020154610fcc9190600160401b90046001600160401b0316612c08565b6001600160401b031610155b1561105e57600954600a805490916001600160401b0316908110610ffe57610ffe61279a565b60009182526020822060029091020180546001600160c01b0319168155600101819055600980546001600160401b03169161103883612c2f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600a8054600181018255600091909152935160029094027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a990910155565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806111c757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111bb600080516020612ca2833981519152546001600160a01b031690565b6001600160a01b031614155b156109685760405163703e46dd60e11b815260040160405180910390fd5b6111ed610d5c565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d90602001610714565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611280575060408051601f3d908101601f1916820190925261127d91810190612c55565b60015b6112a857604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610c99565b600080516020612ca283398151915281146112d957604051632a87526960e21b815260048101829052602401610c99565b6112e38383611c07565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109685760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6113aa611c5d565b610cab81611ca6565b610968611c5d565b82516001600160401b03161515806113df575060208301516001600160401b031615155b806113ec57506020820151155b806113f957506040820151155b8061140657506060820151155b8061141057508151155b1561142e576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b199091161790556112e3434285610f1f565b600a54600090438411806114da5750600381105b156114f85760405163b0b4387760e01b815260040160405180910390fd5b60008080611507600185612787565b90505b816115a25786600a82815481106115235761152361279a565b60009182526020909120600290910201546001600160401b0316116115765760019150600a81815481106115595761155961279a565b60009182526020909120600290910201546001600160401b031692505b600281106115a2576009546001600160401b031681146115a2578061159a81612c6e565b91505061150a565b816115c05760405163b0b4387760e01b815260040160405180910390fd5b856115cb8489612787565b11979650505050505050565b6115df611e6f565b620100008152600760208201527f1369aa78dc50135ad756d62c97a64a0edcd30066584168200d9d1facf82ca4f56040820151527f2cf23456d712b06f8e3aa5bf0acc3e46a3d094602a3a2b99d873bba05a4391476020604083015101527f08a35f379d2d2c490a51006697275e4db79b67b4a175c1477e262d29e25e42316060820151527f218828131bb7940ccc88c561b299755af4bf0b71ed930b129e8be0a1218139ea6020606083015101527f23a2172436c1145b36d5bc6d3b31fa1610c73a543ea443918aaa3ee175f9921b6080820151527f2502adf404d62877c310214ae9942e93c40b154d34c024bab48a3ca057e60a116020608083015101527f1bb88ada91ab7734882f7826b81275320081ac485f9cf8bfbc3ba54b6eb4dff360a0820151527f25c74a27e9a3b20114a3a91f31c20f01777e7ed913e0ef949f0285e2e7c2069b602060a083015101527f12b0ce76ac8b0dbd405ebc5dd0bae0f91aed50033c7ea36fc62aaba2b98333dc60c0820151527f185b42af49dd1cbe337a84f74b704172428e754a0bea024ab3eb2f996afb2c47602060c083015101527f21f53ad4538b45438bbf0521446070223920e3df6f9022a64cc16d7f94e85c0860e0820151527f2278ac3dedfdac7feb9725a022497175518eada52c8932fc40e6e75bea889fb8602060e083015101527f0876136f81c16298487bfb1be74d4a3487ec45645ab1d09dc2e5b865d62230df610100820151527f098c641c947ecd798dfd5e1b2fe428024cdf03061a53ff774ea8a9e3de9d3f2b602061010083015101527f15eaac2c6232d2268bf79dc47ed9666f992fb3d96ad23fb21690c21586c5472e610120820151527f0f10f1ffc54881287fda6f200bc85d8245b508d844a974098a41119867b325d0602061012083015101527f0895ceea40b085534e9739ca5442ba48b3a3592affde2b509df74521b47d8ab0610140820151527f2e12ec5800ac92fe2a8e7040bc5b435b9eb71e31380173fa7688bf81fcbba455602061014083015101527f2f5384eb5653e47576efe248e7903f463243414bfed5237dda750df3996bd918610160820151527f1c3cd6b11da8704cdc871ab4fa323d7ee57bd40ce165b49a56d5ef6489cd251a602061016083015101527f13579994957ce1554cc1e5b194fb63c9513707f627414f8442681ae736e36450610180820151527f26c9bdcd96d8e420b12974ade93ad9c312c4185213d2f6831a7c625a18890e95602061018083015101527f0cc70a1d542a9a1535ae5d9201696adc5c99c1bcebd9951dfa8afec79fa0b6446101a0820151527f10b043d9f1869181b96579d6616efc17a5df7b84c4d431d966c9094bf1e8815360206101a083015101527f198a65309d131a43b0ab1c47659d0336cfbf62b27f4727106b4fd971c73dd4036101c0820151527f23df99eac3c1947903b211b800efeb76f47d5e87b7414866543492e8c7798d1a60206101c083015101527f221cc5e47b81ce8dcfa72ef981916a8eddef12fcde59c56c62830c126ebef0de6101e0820151527f231f99340c35c9e09652a6df73c9cec5d88738cb71ff45716fdc9e9e45a4926e60206101e083015101527f2c9f1489fce0f263e03f3e97bf0a72273aafcca9325ff47786adb04a52a6d22c610200820151527f21f66e28f17e01e9fd593e16d022c4eca25bd5db96daec606d97b604cc414838602061020083015101527f2015745604a9571e226bd99043cfaf1f96267cc5de67f497563ff81100531d26610220820151527f206889ff4c58dd08ee1107191a2a5bc5dbae55c49d7d8397801799868d10f805602061022083015101527f21062ab8f8ecd8932b429a1eb8614b1e03db61bff6a5cd2d5d7ea193e90e9927610240820151527f217f9b27b934b88ffe555d682dfe6e8b6d503f86b14bbd96342bc48487a60b27602061024083015101527f1c9eda2d195cb731f903235ead6a4f7c66db49da713ecb27afee076f0eea7154610260820151527f2647c161c00b90258e1cefebb17481f8a5d91b5f9dca626e3e89a9215bcca16a602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611c1082611cae565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611c55576112e38282611d13565b6108d9611d89565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661096857604051631afcd79f60e31b815260040160405180910390fd5b610c73611c5d565b806001600160a01b03163b600003611ce457604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610c99565b600080516020612ca283398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611d309190612c85565b600060405180830381855af49150503d8060008114611d6b576040519150601f19603f3d011682016040523d82523d6000602084013e611d70565b606091505b5091509150611d80858383611da8565b95945050505050565b34156109685760405163b398979f60e01b815260040160405180910390fd5b606082611dbd57611db882611e07565b611e00565b8151158015611dd457506001600160a01b0384163b155b15611dfd57604051639996b31560e01b81526001600160a01b0385166004820152602401610c99565b50805b9392505050565b805115611e175780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825560020290600052602060002090810190610cab91906120fc565b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611ea6604051806040016040528060008152602001600081525090565b8152602001611ec8604051806040016040528060008152602001600081525090565b8152602001611eea604051806040016040528060008152602001600081525090565b8152602001611f0c604051806040016040528060008152602001600081525090565b8152602001611f2e604051806040016040528060008152602001600081525090565b8152602001611f50604051806040016040528060008152602001600081525090565b8152602001611f72604051806040016040528060008152602001600081525090565b8152602001611f94604051806040016040528060008152602001600081525090565b8152602001611fb6604051806040016040528060008152602001600081525090565b8152602001611fd8604051806040016040528060008152602001600081525090565b8152602001611ffa604051806040016040528060008152602001600081525090565b815260200161201c604051806040016040528060008152602001600081525090565b815260200161203e604051806040016040528060008152602001600081525090565b8152602001612060604051806040016040528060008152602001600081525090565b8152602001612082604051806040016040528060008152602001600081525090565b81526020016120a4604051806040016040528060008152602001600081525090565b81526020016120c6604051806040016040528060008152602001600081525090565b81526020016120e8604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b5b808211156121225780546001600160c01b0319168155600060018201556002016120fd565b5090565b80356001600160a01b038116811461213d57600080fd5b919050565b60006020828403121561215457600080fd5b610c6282612126565b60006020828403121561216f57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b03811182821017156121af576121af612176565b60405290565b604051608081016001600160401b03811182821017156121af576121af612176565b604051601f8201601f191681016001600160401b03811182821017156121ff576121ff612176565b604052919050565b80356001600160401b038116811461213d57600080fd5b60006060828403121561223057600080fd5b604051606081018181106001600160401b038211171561225257612252612176565b60405290508061226183612207565b815261226f60208401612207565b6020820152604083013560408201525092915050565b60006040828403121561229757600080fd5b604051604081018181106001600160401b03821117156122b9576122b9612176565b604052823581526020928301359281019290925250919050565b6000808284036104e08112156122e857600080fd5b6122f2858561221e565b925061048080605f198301121561230857600080fd5b61231061218c565b915061231f8660608701612285565b825261232e8660a08701612285565b60208301526123408660e08701612285565b604083015261012061235487828801612285565b606084015261016061236888828901612285565b60808501526101a061237c89828a01612285565b60a08601526101e06123908a828b01612285565b60c08701526102206123a48b828c01612285565b60e08801526102606123b88c828d01612285565b6101008901526102a06123cd8d828e01612285565b878a01526123df8d6102e08e01612285565b6101408a01526123f38d6103208e01612285565b868a01526124058d6103608e01612285565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b6000806040838503121561249a57600080fd5b6124a383612126565b91506020808401356001600160401b03808211156124c057600080fd5b818601915086601f8301126124d457600080fd5b8135818111156124e6576124e6612176565b6124f8601f8201601f191685016121d7565b9150808252878482850101111561250e57600080fd5b80848401858401376000848284010152508093505050509250929050565b803563ffffffff8116811461213d57600080fd5b60006020828403121561255257600080fd5b610c628261252c565b60008060008084860361012081121561257357600080fd5b61257d878761221e565b94506080605f198201121561259157600080fd5b5061259a6121b5565b60608681013582526080870135602083015260a0870135604083015260c08701359082015292506125cd60e0860161252c565b91506125dc6101008601612126565b905092959194509250565b60005b838110156126025781810151838201526020016125ea565b50506000910152565b602081526000825180602084015261262a8160408501602087016125e7565b601f01601f19169190910160400192915050565b60006060828403121561265057600080fd5b610c62838361221e565b6000806040838503121561266d57600080fd5b50508035926020909101359150565b6000602080838503121561268f57600080fd5b82356001600160401b03808211156126a657600080fd5b818501915085601f8301126126ba57600080fd5b8135818111156126cc576126cc612176565b6126da848260051b016121d7565b818152848101925060079190911b8301840190878211156126fa57600080fd5b928401925b8184101561276657608084890312156127185760008081fd5b6127206121b5565b61272985612207565b8152612736868601612207565b868201526040612747818701612207565b90820152606085810135908201528352608090930192918401916126ff565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c6557610c65612771565b634e487b7160e01b600052603260045260246000fd5b8060005b6007811015610f195781518452602093840193909101906001016127b4565b6127e882825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e084015250608081015161010061284b8185018380518252602090810151910152565b60a0830151915061014061286b8186018480518252602090810151910152565b60c0840151925061018061288b8187018580518252602090810151910152565b60e085015193506101c06128ab8188018680518252602090810151910152565b928501519350610200926128cb8785018680518252602090810151910152565b61012086015194506102406128ec8189018780518252602090810151910152565b9286015194506102809261290c8885018780518252602090810151910152565b61016087015195506102c061292d818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a6082019050845182526020850151602083015260408501516129ea604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612a378185018380518252602090810151910152565b60c08701519150610140612a578186018480518252602090810151910152565b60e08801519250610180612a778187018580518252602090810151910152565b9188015192506101c091612a978684018580518252602090810151910152565b6101208901519350610200612ab88188018680518252602090810151910152565b91890151935061024091612ad88784018680518252602090810151910152565b6101608a01519450610280612af98189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612bd06105008301856127b0565b612bde6105e08301846127d3565b949350505050565b600060208284031215612bf857600080fd5b81518015158114611e0057600080fd5b6001600160401b03828116828216039080821115612c2857612c28612771565b5092915050565b60006001600160401b03808316818103612c4b57612c4b612771565b6001019392505050565b600060208284031215612c6757600080fd5b5051919050565b600081612c7d57612c7d612771565b506000190190565b60008251612c978184602087016125e7565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json index 829bca4f9..dc52c561d 100644 --- a/contract-bindings/artifacts/LightClient_bytecode.json +++ b/contract-bindings/artifacts/LightClient_bytecode.json @@ -1 +1 @@ -"0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000da565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000775760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612a4d62000104600039600081816110e10152818161110a01526112890152612a4d6000f3fe6080604052600436106101405760003560e01c80638584d23f116100b6578063bd32519a1161006f578063bd32519a1461043d578063c23b9e9e1461046e578063d24d933d146104a7578063e0303301146104d7578063f2fde38b146104f7578063f9e50d191461051757600080fd5b80638584d23f146102ff5780638da5cb5b1461032c57806396c1ca61146103695780639baa3cc9146103895780639fdb54a7146103a9578063ad3cb1cc146103ff57600080fd5b8063313df7b111610108578063313df7b114610224578063426d31941461025c5780634f1ef2861461029f57806352d1902d146102b257806369cc6a04146102d5578063715018a6146102ea57600080fd5b8063013fa5fc1461014557806302b592f3146101675780630d8e6e2c1461019f5780632063d4f7146101cc5780632f79889d146101ec575b600080fd5b34801561015157600080fd5b50610165610160366004611f7b565b61052c565b005b34801561017357600080fd5b50610187610182366004611f96565b6105e9565b60405161019693929190611faf565b60405180910390f35b3480156101ab57600080fd5b50604080516001815260006020820181905291810191909152606001610196565b3480156101d857600080fd5b506101656101e736600461212a565b610646565b3480156101f857600080fd5b5060095461020c906001600160401b031681565b6040516001600160401b039091168152602001610196565b34801561023057600080fd5b50600854610244906001600160a01b031681565b6040516001600160a01b039091168152602001610196565b34801561026857600080fd5b5060005460015460025460035461027f9392919084565b604080519485526020850193909352918301526060820152608001610196565b6101656102ad3660046122de565b61079a565b3480156102be57600080fd5b506102c76107b9565b604051908152602001610196565b3480156102e157600080fd5b506101656107d6565b3480156102f657600080fd5b50610165610846565b34801561030b57600080fd5b5061031f61031a366004611f96565b610858565b6040516101969190612383565b34801561033857600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610244565b34801561037557600080fd5b506101656103843660046123b7565b6109ca565b34801561039557600080fd5b506101656103a43660046123d2565b610a3f565b3480156103b557600080fd5b506006546007546103d9916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610196565b34801561040b57600080fd5b50610430604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161019691906124a3565b34801561044957600080fd5b5060085461045e90600160a01b900460ff1681565b6040519015158152602001610196565b34801561047a57600080fd5b5060085461049290600160a81b900463ffffffff1681565b60405163ffffffff9091168152602001610196565b3480156104b357600080fd5b506004546005546103d9916001600160401b0380821692600160401b909204169083565b3480156104e357600080fd5b5061045e6104f23660046124d6565b610b63565b34801561050357600080fd5b50610165610512366004611f7b565b610c76565b34801561052357600080fd5b50600a546102c7565b610534610cb9565b6001600160a01b03811661055b5760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b039081169082160361058a5760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a81b0319166001600160a01b0383811691909117600160a01b1791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600a81815481106105f957600080fd5b600091825260209182902060039091020180546040805180820190915260018301546001600160401b039081168252600290930154938101939093528181169350600160401b9004169083565b600854600160a01b900460ff16801561066a57506008546001600160a01b03163314155b15610688576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806106c1575060065460208301516001600160401b03600160401b9092048216911611155b156106df5760405163051c46ef60e01b815260040160405180910390fd5b6106ec8260400151610d14565b6106f68282610d84565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561073d434284610e7c565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6846040015160405161078e91815260200190565b60405180910390a35050565b6107a26110d6565b6107ab8261117b565b6107b582826111bc565b5050565b60006107c361127e565b50600080516020612a2183398151915290565b6107de610cb9565b600854600160a01b900460ff161561082b57600880546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b61084e610cb9565b61084460006112c7565b6040805180820190915260008082526020820152600a80549061087c60018361250e565b8154811061088c5761088c612521565b60009182526020909120600160039092020101546001600160401b031683106108c857604051631856a49960e21b815260040160405180910390fd5b6009546001600160401b03165b8181101561096e5783600a82815481106108f1576108f1612521565b60009182526020909120600160039092020101546001600160401b0316111561096657600a818154811061092757610927612521565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b031682526002015491810191909152949350505050565b6001016108d5565b50600a61097c60018361250e565b8154811061098c5761098c612521565b6000918252602091829020604080518082019091526003929092020160018101546001600160401b0316825260020154918101919091529392505050565b6109d2610cb9565b610e108163ffffffff1610806109fb575060085463ffffffff600160a81b909104811690821611155b15610a19576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a81b0263ffffffff60a81b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610a845750825b90506000826001600160401b03166001148015610aa05750303b155b905081158015610aae575080155b15610acc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610af657845460ff60401b1916600160401b1785555b610aff86611338565b610b07611349565b610b12898989611351565b8315610b5857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600a5460009043841180610b775750600381105b15610b955760405163b0b4387760e01b815260040160405180910390fd5b60008080610ba460018561250e565b90505b81610c3f5786600a8281548110610bc057610bc0612521565b60009182526020909120600390910201546001600160401b031611610c135760019150600a8181548110610bf657610bf6612521565b60009182526020909120600390910201546001600160401b031692505b60028110610c3f576009546001600160401b03168114610c3f5780610c3781612537565b915050610ba7565b81610c5d5760405163b0b4387760e01b815260040160405180910390fd5b85610c68848961250e565b119450505050505b92915050565b610c7e610cb9565b6001600160a01b038116610cad57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610cb6816112c7565b50565b33610ceb7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108445760405163118cdaa760e01b8152336004820152602401610ca4565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806107b55760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610ca4565b6000610d8e61145c565b9050610d98611cb4565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a083015260005460c08301525163ce537a7760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063ce537a7790610e1890859085908890600401612755565b602060405180830381865af4158015610e35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e59919061297c565b610e76576040516309bde33960e01b815260040160405180910390fd5b50505050565b600a5415801590610f355750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b0316908110610ebb57610ebb612521565b6000918252602090912060039091020154600a8054600160401b9092046001600160401b031691610eee9060019061250e565b81548110610efe57610efe612521565b6000918252602090912060039091020154610f299190600160401b90046001600160401b031661299e565b6001600160401b031610155b15610fce57600954600a805490916001600160401b0316908110610f5b57610f5b612521565b60009182526020822060039091020180546001600160801b031916815560018101805467ffffffffffffffff19169055600201819055600980546001600160401b031691610fa8836129c5565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516060810182526001600160401b03948516815292841660208085019182528251808401845284820151871681529383015184820152918401928352600a805460018101825560009190915293517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a86003909502948501805492519187166001600160801b031990931692909217600160401b91871691909102179055905180517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a98401805467ffffffffffffffff1916919095161790935591909101517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2aa90910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061115d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611151600080516020612a21833981519152546001600160a01b031690565b6001600160a01b031614155b156108445760405163703e46dd60e11b815260040160405180910390fd5b611183610cb9565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d906020016105de565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611216575060408051601f3d908101601f19168201909252611213918101906129eb565b60015b61123e57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ca4565b600080516020612a21833981519152811461126f57604051632a87526960e21b815260048101829052602401610ca4565b6112798383611a8b565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108445760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b611340611ae1565b610cb681611b2a565b610844611ae1565b82516001600160401b0316151580611375575060208301516001600160401b031615155b8061138257506020820151155b8061138f57506040820151155b8061139c57506060820151155b806113a657508151155b156113c4576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b19909116179055611279434285610e7c565b611464611cd2565b621000008152600760208201527f23783d0e9777b7af65fbf849da7edb75e74b1eaf503e025d7f2f7f80991befa26040820151527f2a4e2fe8adfa53f468525582d5184c4c70bbdb946c21f216418a9879705e54a76020604083015101527f0624b2c1e77f24afceaf39451743b9fa80d5853fca7ba00389c675650774009b6060820151527f250d7719e94ca2df00dfe327938f5a8d4d837779b99837ca777a53d39127b1796020606083015101527f0dc09515152eaea66d0db2f571cc995e369d26fe647394f10db5398c917519dc6080820151527f1273144d6cec2c4a68b24a149379c0f5592bb7fbddbe32fa171919950ca404cb6020608083015101527f119521bb68caec216e2f05eeb466fb3abfe1f39baf7fe7cb392ea057b6a2d9bf60a0820151527f2d52adeaba8045e53ab526fe9982d0ea452def6b3ea0253d27a19ef3b46e8428602060a083015101527f16c3b5b217d302975a920d13374524d7a52e4a50fd7fb930842271ebf4a84efd60c0820151527f200788916b907b196972bde304318e885a2521514b2db5e4a11899c51204f089602060c083015101527f1127581afe753defca9aef12e7332db9978a200b1699ce3888c0f3aea6111dc360e0820151527f0881e13f00723be1a04872ed02b2d078c31e80feaf27724e262ce97c2cb0bb1d602060e083015101527f1482a3a6bb91d6483d153683e2404f2f5546e0e895530fdf132091498406e3de610100820151527efa52db3d52d905ead1248102f3a80a43a90d8400c68f60a62c543c417b2f4b602061010083015101527f0a57dadd4a55199525ac6ac6fabc87a4cccfdc98142bcef9dbf47de00ecc5164610120820151527f18d95abd9b8e12c36936aa218cfff582548a6bbff25c338c2006eaeb1fe5b696602061012083015101527f2bc40e91dd169b8bc143a02952a1b6c6e627bfeb7a2bbe5078e14123f3c54c1c610140820151527f108d65a20c579b6d9883275eb6889fc3f5fc79735ca9f611a13b67daa2fbc8d0602061014083015101527f21bc1f86d0608e5f0626b467ee6f8282b619223f60a7acb0fc63ba7bdaf783be610160820151527f05ef3282f8eef01515fb9a8a7d6ca06b8b007d1d512403efb268fb03ce5f09e9602061016083015101527f2cab66c1cb5a83869e73ac34fbe467486999babd541d9010ee9a804806eee4ef610180820151527f2db1982419c5a4a17593acff9535fa967683d75c8aec01319b64b84aada2ad84602061018083015101527f2c38667c6c7eb868bdd30c34dd3f4b84d9b9b1a27d7867b364c8b7831423e9086101a0820151527f2b2cb4044dd51165c48138219d51cf8d1689f91ed3eeefead6e055eb488a2ce260206101a083015101527f2d48e54703011df2c74a14dafde3af4fd83ec71875d8ddc3554658640cc955016101c0820151527f243a99d80d32eb5408b59d5b08302bede070d3fb0a8efe2f2262f865bffb4d0d60206101c083015101527f0455d2325bf6269a66f07d838f55f36947a3cd9b87edd8480bced95cbb45cc116101e0820151527f0f66d9085a6ed60b838179987e240992bff4c0516ccf6ccde4a1ca94ce8b986460206101e083015101527f2bac0d23c8585d1487ec611b5effc97e5852fea43a7cba36ccdd2c207931f394610200820151527f1860b54e01a06aea5adb4b13bf5baebab92b736807a3a89ff2040992b06ee6ec602061020083015101527f0c0bfa1c2fc6f8ed01233d5168db1e1dfe725504f032f669f50a92ae77c72906610220820151527f0d741e124c7d1069b8a400cbcdcfd90128a533901ad4de1e037fe72984dc34cf602061022083015101527f01cfed30085c9efce04668205794aa39b1a8ee591234b4c77a22f8c26d899e05610240820151527f2ab68ac82d36cedb647d14a5b0035e8c9a0be84780b7bae1133a27a880966ed1602061024083015101527f072e1d50f8b5cf8d574b3847276477d95bbd5116351000841f728da44f4043b5610260820151527f23f8ea6eacd0876d57220f57eabacbe76a2323411663731a251d5dca36f1b59f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611a9482611b32565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611ad9576112798282611b97565b6107b5611c0d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661084457604051631afcd79f60e31b815260040160405180910390fd5b610c7e611ae1565b806001600160a01b03163b600003611b6857604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ca4565b600080516020612a2183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611bb49190612a04565b600060405180830381855af49150503d8060008114611bef576040519150601f19603f3d011682016040523d82523d6000602084013e611bf4565b606091505b5091509150611c04858383611c2c565b95945050505050565b34156108445760405163b398979f60e01b815260040160405180910390fd5b606082611c4157611c3c82611c8b565b611c84565b8151158015611c5857506001600160a01b0384163b155b15611c8157604051639996b31560e01b81526001600160a01b0385166004820152602401610ca4565b50805b9392505050565b805115611c9b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611d09604051806040016040528060008152602001600081525090565b8152602001611d2b604051806040016040528060008152602001600081525090565b8152602001611d4d604051806040016040528060008152602001600081525090565b8152602001611d6f604051806040016040528060008152602001600081525090565b8152602001611d91604051806040016040528060008152602001600081525090565b8152602001611db3604051806040016040528060008152602001600081525090565b8152602001611dd5604051806040016040528060008152602001600081525090565b8152602001611df7604051806040016040528060008152602001600081525090565b8152602001611e19604051806040016040528060008152602001600081525090565b8152602001611e3b604051806040016040528060008152602001600081525090565b8152602001611e5d604051806040016040528060008152602001600081525090565b8152602001611e7f604051806040016040528060008152602001600081525090565b8152602001611ea1604051806040016040528060008152602001600081525090565b8152602001611ec3604051806040016040528060008152602001600081525090565b8152602001611ee5604051806040016040528060008152602001600081525090565b8152602001611f07604051806040016040528060008152602001600081525090565b8152602001611f29604051806040016040528060008152602001600081525090565b8152602001611f4b604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b80356001600160a01b0381168114611f7657600080fd5b919050565b600060208284031215611f8d57600080fd5b611c8482611f5f565b600060208284031215611fa857600080fd5b5035919050565b6001600160401b0384811682528316602082015260808101611fe7604083018480516001600160401b03168252602090810151910152565b949350505050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b038111828210171561202857612028611fef565b60405290565b604051601f8201601f191681016001600160401b038111828210171561205657612056611fef565b604052919050565b80356001600160401b0381168114611f7657600080fd5b60006060828403121561208757600080fd5b604051606081018181106001600160401b03821117156120a9576120a9611fef565b6040529050806120b88361205e565b81526120c66020840161205e565b6020820152604083013560408201525092915050565b6000604082840312156120ee57600080fd5b604051604081018181106001600160401b038211171561211057612110611fef565b604052823581526020928301359281019290925250919050565b6000808284036104e081121561213f57600080fd5b6121498585612075565b925061048080605f198301121561215f57600080fd5b612167612005565b915061217686606087016120dc565b82526121858660a087016120dc565b60208301526121978660e087016120dc565b60408301526101206121ab878288016120dc565b60608401526101606121bf888289016120dc565b60808501526101a06121d389828a016120dc565b60a08601526101e06121e78a828b016120dc565b60c08701526102206121fb8b828c016120dc565b60e088015261026061220f8c828d016120dc565b6101008901526102a06122248d828e016120dc565b878a01526122368d6102e08e016120dc565b6101408a015261224a8d6103208e016120dc565b868a015261225c8d6103608e016120dc565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b600080604083850312156122f157600080fd5b6122fa83611f5f565b91506020808401356001600160401b038082111561231757600080fd5b818601915086601f83011261232b57600080fd5b81358181111561233d5761233d611fef565b61234f601f8201601f1916850161202e565b9150808252878482850101111561236557600080fd5b80848401858401376000848284010152508093505050509250929050565b81516001600160401b031681526020808301519082015260408101610c70565b803563ffffffff81168114611f7657600080fd5b6000602082840312156123c957600080fd5b611c84826123a3565b6000806000808486036101208112156123ea57600080fd5b6123f48787612075565b94506080605f198201121561240857600080fd5b50604051608081018181106001600160401b038211171561242b5761242b611fef565b8060405250606086013581526080860135602082015260a0860135604082015260c086013560608201528093505061246560e086016123a3565b91506124746101008601611f5f565b905092959194509250565b60005b8381101561249a578181015183820152602001612482565b50506000910152565b60208152600082518060208401526124c281604085016020870161247f565b601f01601f19169190910160400192915050565b600080604083850312156124e957600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c7057610c706124f8565b634e487b7160e01b600052603260045260246000fd5b600081612546576125466124f8565b506000190190565b8060005b6007811015610e76578151845260209384019390910190600101612552565b61258682825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006125e98185018380518252602090810151910152565b60a083015191506101406126098186018480518252602090810151910152565b60c084015192506101806126298187018580518252602090810151910152565b60e085015193506101c06126498188018680518252602090810151910152565b928501519350610200926126698785018680518252602090810151910152565b610120860151945061024061268a8189018780518252602090810151910152565b928601519450610280926126aa8885018780518252602090810151910152565b61016087015195506102c06126cb818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a608201905084518252602085015160208301526040850151612788604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a08501516101006127d58185018380518252602090810151910152565b60c087015191506101406127f58186018480518252602090810151910152565b60e088015192506101806128158187018580518252602090810151910152565b9188015192506101c0916128358684018580518252602090810151910152565b61012089015193506102006128568188018680518252602090810151910152565b918901519350610240916128768784018680518252602090810151910152565b6101608a015194506102806128978189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e083015261296e61050083018561254e565b611fe76105e0830184612571565b60006020828403121561298e57600080fd5b81518015158114611c8457600080fd5b6001600160401b038281168282160390808211156129be576129be6124f8565b5092915050565b60006001600160401b038083168181036129e1576129e16124f8565b6001019392505050565b6000602082840312156129fd57600080fd5b5051919050565b60008251612a1681846020870161247f565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" +"0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000da565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000775760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612971620001046000396000818161105d01528181611086015261120501526129716000f3fe6080604052600436106101405760003560e01c80638584d23f116100b6578063bd32519a1161006f578063bd32519a14610456578063c23b9e9e14610487578063d24d933d146104c0578063e0303301146104f0578063f2fde38b14610510578063f9e50d191461053057600080fd5b80638584d23f146103255780638da5cb5b1461034557806396c1ca61146103825780639baa3cc9146103a25780639fdb54a7146103c2578063ad3cb1cc1461041857600080fd5b8063313df7b111610108578063313df7b11461024a578063426d3194146102825780634f1ef286146102c557806352d1902d146102d857806369cc6a04146102fb578063715018a61461031057600080fd5b8063013fa5fc1461014557806302b592f3146101675780630d8e6e2c146101c55780632063d4f7146101f25780632f79889d14610212575b600080fd5b34801561015157600080fd5b50610165610160366004611ef7565b610545565b005b34801561017357600080fd5b50610187610182366004611f12565b610602565b6040516101bc94939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b3480156101d157600080fd5b506040805160018152600060208201819052918101919091526060016101bc565b3480156101fe57600080fd5b5061016561020d366004612066565b61064d565b34801561021e57600080fd5b50600954610232906001600160401b031681565b6040516001600160401b0390911681526020016101bc565b34801561025657600080fd5b5060085461026a906001600160a01b031681565b6040516001600160a01b0390911681526020016101bc565b34801561028e57600080fd5b506000546001546002546003546102a59392919084565b6040805194855260208501939093529183015260608201526080016101bc565b6101656102d336600461221a565b6107a1565b3480156102e457600080fd5b506102ed6107c0565b6040519081526020016101bc565b34801561030757600080fd5b506101656107dd565b34801561031c57600080fd5b5061016561084d565b34801561033157600080fd5b506102ed610340366004611f12565b61085f565b34801561035157600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031661026a565b34801561038e57600080fd5b5061016561039d3660046122d3565b61097f565b3480156103ae57600080fd5b506101656103bd3660046122ee565b6109f4565b3480156103ce57600080fd5b506006546007546103f2916001600160401b0380821692600160401b909204169083565b604080516001600160401b039485168152939092166020840152908201526060016101bc565b34801561042457600080fd5b50610449604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101bc91906123bf565b34801561046257600080fd5b5060085461047790600160a01b900460ff1681565b60405190151581526020016101bc565b34801561049357600080fd5b506008546104ab90600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101bc565b3480156104cc57600080fd5b506004546005546103f2916001600160401b0380821692600160401b909204169083565b3480156104fc57600080fd5b5061047761050b3660046123f2565b610b18565b34801561051c57600080fd5b5061016561052b366004611ef7565b610c2b565b34801561053c57600080fd5b50600a546102ed565b61054d610c6e565b6001600160a01b0381166105745760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036105a35760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a81b0319166001600160a01b0383811691909117600160a01b1791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600a818154811061061257600080fd5b6000918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b600854600160a01b900460ff16801561067157506008546001600160a01b03163314155b1561068f576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806106c8575060065460208301516001600160401b03600160401b9092048216911611155b156106e65760405163051c46ef60e01b815260040160405180910390fd5b6106f38260400151610cc9565b6106fd8282610d39565b81516006805460208501516001600160401b03908116600160401b026001600160801b03199092169316929092179190911790556040820151600755610744434284610e31565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6846040015160405161079591815260200190565b60405180910390a35050565b6107a9611052565b6107b2826110f7565b6107bc8282611138565b5050565b60006107ca6111fa565b5060008051602061294583398151915290565b6107e5610c6e565b600854600160a01b900460ff161561083257600880546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610855610c6e565b61084b6000611243565b600a805460009161087160018361242a565b815481106108815761088161243d565b6000918252602090912060029091020154600160801b90046001600160401b031683106108c157604051631856a49960e21b815260040160405180910390fd5b6009546001600160401b03165b818110156109475783600a82815481106108ea576108ea61243d565b6000918252602090912060029091020154600160801b90046001600160401b0316111561093f57600a81815481106109245761092461243d565b90600052602060002090600202016001015492505050919050565b6001016108ce565b50600a61095560018361242a565b815481106109655761096561243d565b906000526020600020906002020160010154915050919050565b610987610c6e565b610e108163ffffffff1610806109b0575060085463ffffffff600160a81b909104811690821611155b156109ce576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a81b0263ffffffff60a81b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610a395750825b90506000826001600160401b03166001148015610a555750303b155b905081158015610a63575080155b15610a815760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610aab57845460ff60401b1916600160401b1785555b610ab4866112b4565b610abc6112c5565b610ac78989896112cd565b8315610b0d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600a5460009043841180610b2c5750600381105b15610b4a5760405163b0b4387760e01b815260040160405180910390fd5b60008080610b5960018561242a565b90505b81610bf45786600a8281548110610b7557610b7561243d565b60009182526020909120600290910201546001600160401b031611610bc85760019150600a8181548110610bab57610bab61243d565b60009182526020909120600290910201546001600160401b031692505b60028110610bf4576009546001600160401b03168114610bf45780610bec81612453565b915050610b5c565b81610c125760405163b0b4387760e01b815260040160405180910390fd5b85610c1d848961242a565b119450505050505b92915050565b610c33610c6e565b6001600160a01b038116610c6257604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610c6b81611243565b50565b33610ca07f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461084b5760405163118cdaa760e01b8152336004820152602401610c59565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806107bc5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610c59565b6000610d436113d8565b9050610d4d611c30565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a083015260005460c08301525163ce537a7760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063ce537a7790610dcd90859085908890600401612671565b602060405180830381865af4158015610dea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0e91906128a0565b610e2b576040516309bde33960e01b815260040160405180910390fd5b50505050565b600a5415801590610eea5750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b0316908110610e7057610e7061243d565b6000918252602090912060029091020154600a8054600160401b9092046001600160401b031691610ea39060019061242a565b81548110610eb357610eb361243d565b6000918252602090912060029091020154610ede9190600160401b90046001600160401b03166128c2565b6001600160401b031610155b15610f7057600954600a805490916001600160401b0316908110610f1057610f1061243d565b60009182526020822060029091020180546001600160c01b0319168155600101819055600980546001600160401b031691610f4a836128e9565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600a8054600181018255600091909152935160029094027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a990910155565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110cd600080516020612945833981519152546001600160a01b031690565b6001600160a01b031614155b1561084b5760405163703e46dd60e11b815260040160405180910390fd5b6110ff610c6e565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d906020016105f7565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611192575060408051601f3d908101601f1916820190925261118f9181019061290f565b60015b6111ba57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610c59565b60008051602061294583398151915281146111eb57604051632a87526960e21b815260048101829052602401610c59565b6111f58383611a07565b505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461084b5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6112bc611a5d565b610c6b81611aa6565b61084b611a5d565b82516001600160401b03161515806112f1575060208301516001600160401b031615155b806112fe57506020820151155b8061130b57506040820151155b8061131857506060820151155b8061132257508151155b15611340576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b199091161790556111f5434285610e31565b6113e0611c4e565b621000008152600760208201527f23783d0e9777b7af65fbf849da7edb75e74b1eaf503e025d7f2f7f80991befa26040820151527f2a4e2fe8adfa53f468525582d5184c4c70bbdb946c21f216418a9879705e54a76020604083015101527f0624b2c1e77f24afceaf39451743b9fa80d5853fca7ba00389c675650774009b6060820151527f250d7719e94ca2df00dfe327938f5a8d4d837779b99837ca777a53d39127b1796020606083015101527f0dc09515152eaea66d0db2f571cc995e369d26fe647394f10db5398c917519dc6080820151527f1273144d6cec2c4a68b24a149379c0f5592bb7fbddbe32fa171919950ca404cb6020608083015101527f119521bb68caec216e2f05eeb466fb3abfe1f39baf7fe7cb392ea057b6a2d9bf60a0820151527f2d52adeaba8045e53ab526fe9982d0ea452def6b3ea0253d27a19ef3b46e8428602060a083015101527f16c3b5b217d302975a920d13374524d7a52e4a50fd7fb930842271ebf4a84efd60c0820151527f200788916b907b196972bde304318e885a2521514b2db5e4a11899c51204f089602060c083015101527f1127581afe753defca9aef12e7332db9978a200b1699ce3888c0f3aea6111dc360e0820151527f0881e13f00723be1a04872ed02b2d078c31e80feaf27724e262ce97c2cb0bb1d602060e083015101527f1482a3a6bb91d6483d153683e2404f2f5546e0e895530fdf132091498406e3de610100820151527efa52db3d52d905ead1248102f3a80a43a90d8400c68f60a62c543c417b2f4b602061010083015101527f0a57dadd4a55199525ac6ac6fabc87a4cccfdc98142bcef9dbf47de00ecc5164610120820151527f18d95abd9b8e12c36936aa218cfff582548a6bbff25c338c2006eaeb1fe5b696602061012083015101527f2bc40e91dd169b8bc143a02952a1b6c6e627bfeb7a2bbe5078e14123f3c54c1c610140820151527f108d65a20c579b6d9883275eb6889fc3f5fc79735ca9f611a13b67daa2fbc8d0602061014083015101527f21bc1f86d0608e5f0626b467ee6f8282b619223f60a7acb0fc63ba7bdaf783be610160820151527f05ef3282f8eef01515fb9a8a7d6ca06b8b007d1d512403efb268fb03ce5f09e9602061016083015101527f2cab66c1cb5a83869e73ac34fbe467486999babd541d9010ee9a804806eee4ef610180820151527f2db1982419c5a4a17593acff9535fa967683d75c8aec01319b64b84aada2ad84602061018083015101527f2c38667c6c7eb868bdd30c34dd3f4b84d9b9b1a27d7867b364c8b7831423e9086101a0820151527f2b2cb4044dd51165c48138219d51cf8d1689f91ed3eeefead6e055eb488a2ce260206101a083015101527f2d48e54703011df2c74a14dafde3af4fd83ec71875d8ddc3554658640cc955016101c0820151527f243a99d80d32eb5408b59d5b08302bede070d3fb0a8efe2f2262f865bffb4d0d60206101c083015101527f0455d2325bf6269a66f07d838f55f36947a3cd9b87edd8480bced95cbb45cc116101e0820151527f0f66d9085a6ed60b838179987e240992bff4c0516ccf6ccde4a1ca94ce8b986460206101e083015101527f2bac0d23c8585d1487ec611b5effc97e5852fea43a7cba36ccdd2c207931f394610200820151527f1860b54e01a06aea5adb4b13bf5baebab92b736807a3a89ff2040992b06ee6ec602061020083015101527f0c0bfa1c2fc6f8ed01233d5168db1e1dfe725504f032f669f50a92ae77c72906610220820151527f0d741e124c7d1069b8a400cbcdcfd90128a533901ad4de1e037fe72984dc34cf602061022083015101527f01cfed30085c9efce04668205794aa39b1a8ee591234b4c77a22f8c26d899e05610240820151527f2ab68ac82d36cedb647d14a5b0035e8c9a0be84780b7bae1133a27a880966ed1602061024083015101527f072e1d50f8b5cf8d574b3847276477d95bbd5116351000841f728da44f4043b5610260820151527f23f8ea6eacd0876d57220f57eabacbe76a2323411663731a251d5dca36f1b59f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611a1082611aae565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611a55576111f58282611b13565b6107bc611b89565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661084b57604051631afcd79f60e31b815260040160405180910390fd5b610c33611a5d565b806001600160a01b03163b600003611ae457604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610c59565b60008051602061294583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611b309190612928565b600060405180830381855af49150503d8060008114611b6b576040519150601f19603f3d011682016040523d82523d6000602084013e611b70565b606091505b5091509150611b80858383611ba8565b95945050505050565b341561084b5760405163b398979f60e01b815260040160405180910390fd5b606082611bbd57611bb882611c07565b611c00565b8151158015611bd457506001600160a01b0384163b155b15611bfd57604051639996b31560e01b81526001600160a01b0385166004820152602401610c59565b50805b9392505050565b805115611c175780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611c85604051806040016040528060008152602001600081525090565b8152602001611ca7604051806040016040528060008152602001600081525090565b8152602001611cc9604051806040016040528060008152602001600081525090565b8152602001611ceb604051806040016040528060008152602001600081525090565b8152602001611d0d604051806040016040528060008152602001600081525090565b8152602001611d2f604051806040016040528060008152602001600081525090565b8152602001611d51604051806040016040528060008152602001600081525090565b8152602001611d73604051806040016040528060008152602001600081525090565b8152602001611d95604051806040016040528060008152602001600081525090565b8152602001611db7604051806040016040528060008152602001600081525090565b8152602001611dd9604051806040016040528060008152602001600081525090565b8152602001611dfb604051806040016040528060008152602001600081525090565b8152602001611e1d604051806040016040528060008152602001600081525090565b8152602001611e3f604051806040016040528060008152602001600081525090565b8152602001611e61604051806040016040528060008152602001600081525090565b8152602001611e83604051806040016040528060008152602001600081525090565b8152602001611ea5604051806040016040528060008152602001600081525090565b8152602001611ec7604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b80356001600160a01b0381168114611ef257600080fd5b919050565b600060208284031215611f0957600080fd5b611c0082611edb565b600060208284031215611f2457600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b0381118282101715611f6457611f64611f2b565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611f9257611f92611f2b565b604052919050565b80356001600160401b0381168114611ef257600080fd5b600060608284031215611fc357600080fd5b604051606081018181106001600160401b0382111715611fe557611fe5611f2b565b604052905080611ff483611f9a565b815261200260208401611f9a565b6020820152604083013560408201525092915050565b60006040828403121561202a57600080fd5b604051604081018181106001600160401b038211171561204c5761204c611f2b565b604052823581526020928301359281019290925250919050565b6000808284036104e081121561207b57600080fd5b6120858585611fb1565b925061048080605f198301121561209b57600080fd5b6120a3611f41565b91506120b28660608701612018565b82526120c18660a08701612018565b60208301526120d38660e08701612018565b60408301526101206120e787828801612018565b60608401526101606120fb88828901612018565b60808501526101a061210f89828a01612018565b60a08601526101e06121238a828b01612018565b60c08701526102206121378b828c01612018565b60e088015261026061214b8c828d01612018565b6101008901526102a06121608d828e01612018565b878a01526121728d6102e08e01612018565b6101408a01526121868d6103208e01612018565b868a01526121988d6103608e01612018565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b6000806040838503121561222d57600080fd5b61223683611edb565b91506020808401356001600160401b038082111561225357600080fd5b818601915086601f83011261226757600080fd5b81358181111561227957612279611f2b565b61228b601f8201601f19168501611f6a565b915080825287848285010111156122a157600080fd5b80848401858401376000848284010152508093505050509250929050565b803563ffffffff81168114611ef257600080fd5b6000602082840312156122e557600080fd5b611c00826122bf565b60008060008084860361012081121561230657600080fd5b6123108787611fb1565b94506080605f198201121561232457600080fd5b50604051608081018181106001600160401b038211171561234757612347611f2b565b8060405250606086013581526080860135602082015260a0860135604082015260c086013560608201528093505061238160e086016122bf565b91506123906101008601611edb565b905092959194509250565b60005b838110156123b657818101518382015260200161239e565b50506000910152565b60208152600082518060208401526123de81604085016020870161239b565b601f01601f19169190910160400192915050565b6000806040838503121561240557600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c2557610c25612414565b634e487b7160e01b600052603260045260246000fd5b60008161246257612462612414565b506000190190565b8060005b6007811015610e2b57815184526020938401939091019060010161246e565b6124a282825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006125058185018380518252602090810151910152565b60a083015191506101406125258186018480518252602090810151910152565b60c084015192506101806125458187018580518252602090810151910152565b60e085015193506101c06125658188018680518252602090810151910152565b928501519350610200926125858785018680518252602090810151910152565b61012086015194506102406125a68189018780518252602090810151910152565b928601519450610280926125c68885018780518252602090810151910152565b61016087015195506102c06125e7818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a6082019050845182526020850151602083015260408501516126a4604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a08501516101006126f18185018380518252602090810151910152565b60c087015191506101406127118186018480518252602090810151910152565b60e088015192506101806127318187018580518252602090810151910152565b9188015192506101c0916127518684018580518252602090810151910152565b61012089015193506102006127728188018680518252602090810151910152565b918901519350610240916127928784018680518252602090810151910152565b6101608a015194506102806127b38189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e083015261288a61050083018561246a565b6128986105e083018461248d565b949350505050565b6000602082840312156128b257600080fd5b81518015158114611c0057600080fd5b6001600160401b038281168282160390808211156128e2576128e2612414565b5092915050565b60006001600160401b0380831681810361290557612905612414565b6001019392505050565b60006020828403121561292157600080fd5b5051919050565b6000825161293a81846020870161239b565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" diff --git a/contract-bindings/src/light_client.rs b/contract-bindings/src/light_client.rs index daf77c558..6275ac6dd 100644 --- a/contract-bindings/src/light_client.rs +++ b/contract-bindings/src/light_client.rs @@ -159,15 +159,10 @@ pub mod light_client { ), },], 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(256usize), - ],), + name: ::std::borrow::ToOwned::to_owned("hotShotBlockCommRoot",), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "struct LightClient.HotShotCommitment", - ), + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), ), },], constant: ::core::option::Option::None, @@ -536,15 +531,17 @@ pub mod light_client { ), }, ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("hotShotCommitment"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(64usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), + name: ::std::borrow::ToOwned::to_owned("hotShotBlockHeight",), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "struct LightClient.HotShotCommitment", - ), + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("hotShotBlockCommRoot",), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), ), }, ], @@ -999,7 +996,7 @@ pub mod light_client { pub fn get_hot_shot_commitment( &self, hot_shot_block_height: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash([133, 132, 210, 63], hot_shot_block_height) .expect("method not found (this should never happen)") @@ -1116,7 +1113,10 @@ pub mod light_client { pub fn state_history_commitments( &self, p0: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + (u64, u64, u64, ::ethers::core::types::U256), + > { self.0 .method_hash([2, 181, 146, 243], p0) .expect("method not found (this should never happen)") @@ -3002,7 +3002,9 @@ pub mod light_client { Eq, Hash, )] - pub struct GetHotShotCommitmentReturn(pub HotShotCommitment); + pub struct GetHotShotCommitmentReturn { + pub hot_shot_block_comm_root: ::ethers::core::types::U256, + } ///Container type for all return fields from the `getStateHistoryCount` function with signature `getStateHistoryCount()` and selector `0xf9e50d19` #[derive( Clone, @@ -3121,7 +3123,8 @@ pub mod light_client { pub struct StateHistoryCommitmentsReturn { pub l_1_block_height: u64, pub l_1_block_timestamp: u64, - pub hot_shot_commitment: HotShotCommitment, + pub hot_shot_block_height: u64, + pub hot_shot_block_comm_root: ::ethers::core::types::U256, } ///Container type for all return fields from the `stateHistoryFirstIndex` function with signature `stateHistoryFirstIndex()` and selector `0x2f79889d` #[derive( diff --git a/contract-bindings/src/light_client_mock.rs b/contract-bindings/src/light_client_mock.rs index 53bf3cb08..d0bf7accd 100644 --- a/contract-bindings/src/light_client_mock.rs +++ b/contract-bindings/src/light_client_mock.rs @@ -190,15 +190,10 @@ pub mod light_client_mock { ), },], 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(256usize), - ],), + name: ::std::borrow::ToOwned::to_owned("hotShotBlockCommRoot",), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "struct LightClient.HotShotCommitment", - ), + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), ), },], constant: ::core::option::Option::None, @@ -583,10 +578,8 @@ pub mod light_client_mock { ::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::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(64usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), + ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ],), ), ), @@ -644,15 +637,17 @@ pub mod light_client_mock { ), }, ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("hotShotCommitment"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(64usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), + name: ::std::borrow::ToOwned::to_owned("hotShotBlockHeight",), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "struct LightClient.HotShotCommitment", - ), + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("hotShotBlockCommRoot",), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), ), }, ], @@ -1107,7 +1102,7 @@ pub mod light_client_mock { pub fn get_hot_shot_commitment( &self, hot_shot_block_height: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash([133, 132, 210, 63], hot_shot_block_height) .expect("method not found (this should never happen)") @@ -1235,13 +1230,13 @@ pub mod light_client_mock { .method_hash([1, 63, 165, 252], prover) .expect("method not found (this should never happen)") } - ///Calls the contract's `setStateHistory` (0x2f5f4600) function + ///Calls the contract's `setStateHistory` (0xf5676160) function pub fn set_state_history( &self, state_history_commitments: ::std::vec::Vec, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([47, 95, 70, 0], state_history_commitments) + .method_hash([245, 103, 97, 96], state_history_commitments) .expect("method not found (this should never happen)") } ///Calls the contract's `setstateHistoryRetentionPeriod` (0x96c1ca61) function @@ -1257,7 +1252,10 @@ pub mod light_client_mock { pub fn state_history_commitments( &self, p0: ::ethers::core::types::U256, - ) -> ::ethers::contract::builders::ContractCall { + ) -> ::ethers::contract::builders::ContractCall< + M, + (u64, u64, u64, ::ethers::core::types::U256), + > { self.0 .method_hash([2, 181, 146, 243], p0) .expect("method not found (this should never happen)") @@ -2666,7 +2664,7 @@ pub mod light_client_mock { pub struct SetPermissionedProverCall { pub prover: ::ethers::core::types::Address, } - ///Container type for all input parameters for the `setStateHistory` function with signature `setStateHistory((uint64,uint64,(uint64,uint256))[])` and selector `0x2f5f4600` + ///Container type for all input parameters for the `setStateHistory` function with signature `setStateHistory((uint64,uint64,uint64,uint256)[])` and selector `0xf5676160` #[derive( Clone, ::ethers::contract::EthCall, @@ -2681,7 +2679,7 @@ pub mod light_client_mock { )] #[ethcall( name = "setStateHistory", - abi = "setStateHistory((uint64,uint64,(uint64,uint256))[])" + abi = "setStateHistory((uint64,uint64,uint64,uint256)[])" )] pub struct SetStateHistoryCall { pub state_history_commitments: ::std::vec::Vec, @@ -3272,7 +3270,9 @@ pub mod light_client_mock { Eq, Hash, )] - pub struct GetHotShotCommitmentReturn(pub HotShotCommitment); + pub struct GetHotShotCommitmentReturn { + pub hot_shot_block_comm_root: ::ethers::core::types::U256, + } ///Container type for all return fields from the `getStateHistoryCount` function with signature `getStateHistoryCount()` and selector `0xf9e50d19` #[derive( Clone, @@ -3391,7 +3391,8 @@ pub mod light_client_mock { pub struct StateHistoryCommitmentsReturn { pub l_1_block_height: u64, pub l_1_block_timestamp: u64, - pub hot_shot_commitment: HotShotCommitment, + pub hot_shot_block_height: u64, + pub hot_shot_block_comm_root: ::ethers::core::types::U256, } ///Container type for all return fields from the `stateHistoryFirstIndex` function with signature `stateHistoryFirstIndex()` and selector `0x2f79889d` #[derive( @@ -3421,7 +3422,7 @@ pub mod light_client_mock { Hash, )] pub struct StateHistoryRetentionPeriodReturn(pub u32); - ///`StateHistoryCommitment(uint64,uint64,(uint64,uint256))` + ///`StateHistoryCommitment(uint64,uint64,uint64,uint256)` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3437,6 +3438,7 @@ pub mod light_client_mock { pub struct StateHistoryCommitment { pub l_1_block_height: u64, pub l_1_block_timestamp: u64, - pub hot_shot_commitment: HotShotCommitment, + pub hot_shot_block_height: u64, + pub hot_shot_block_comm_root: ::ethers::core::types::U256, } } diff --git a/contract-bindings/src/shared_types.rs b/contract-bindings/src/shared_types.rs index fb663b4c4..ac296bc50 100644 --- a/contract-bindings/src/shared_types.rs +++ b/contract-bindings/src/shared_types.rs @@ -90,23 +90,6 @@ pub struct VerifyingKey { pub g_2lsb: [u8; 32], pub g_2msb: [u8; 32], } -///`HotShotCommitment(uint64,uint256)` -#[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, -)] -pub struct HotShotCommitment { - pub block_height: u64, - pub block_comm_root: ::ethers::core::types::U256, -} ///`LightClientState(uint64,uint64,uint256)` #[derive( Clone, diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol index b3474397b..d2c1dba95 100644 --- a/contracts/src/LightClient.sol +++ b/contracts/src/LightClient.sol @@ -99,22 +99,17 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { BN254.ScalarField amountComm; } - /// @notice Simplified HotShot commitment struct - /// @param blockHeight The block height of the latest finalized HotShot block - /// @param blockCommRoot The merkle root of historical block commitments (BN254::ScalarField) - struct HotShotCommitment { - uint64 blockHeight; - BN254.ScalarField blockCommRoot; - } - /// @notice Simplified HotShot commitment struct /// @param l1BlockHeight the block height of l1 when this state update was stored /// @param l1BlockTimestamp the block timestamp of l1 when this state update was stored - /// @param hotShotCommitment The HotShot commitment info of the latest finalized HotShot block + /// @param hotShotBlockHeight The block height of the latest finalized HotShot block + /// @param hotShotBlockCommRoot The merkle root of historical block commitments + /// (BN254::ScalarField) struct StateHistoryCommitment { uint64 l1BlockHeight; uint64 l1BlockTimestamp; - HotShotCommitment hotShotCommitment; + uint64 hotShotBlockHeight; + BN254.ScalarField hotShotBlockCommRoot; } /// @notice Event that a new finalized state has been successfully verified and updated @@ -352,9 +347,7 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { // add the L1 Block & HotShot commitment to the genesis state stateHistoryCommitments.push( StateHistoryCommitment( - blockNumber, - blockTimestamp, - HotShotCommitment(state.blockHeight, state.blockCommRoot) + blockNumber, blockTimestamp, state.blockHeight, state.blockCommRoot ) ); } @@ -413,29 +406,27 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @notice get the HotShot commitment that represents the Merkle root containing the leaf at /// the provided HotShot height /// @param hotShotBlockHeight the HotShot block height - /// @return HotShotCommitment the HotShot commitment + /// @return hotShotBlockCommRoot the HotShot commitment root function getHotShotCommitment(uint256 hotShotBlockHeight) public view virtual - returns (HotShotCommitment memory) + returns (BN254.ScalarField hotShotBlockCommRoot) { uint256 commitmentsHeight = stateHistoryCommitments.length; - if ( - hotShotBlockHeight - >= stateHistoryCommitments[commitmentsHeight - 1].hotShotCommitment.blockHeight - ) { + if (hotShotBlockHeight >= stateHistoryCommitments[commitmentsHeight - 1].hotShotBlockHeight) + { revert InvalidHotShotBlockForCommitmentCheck(); } for (uint256 i = stateHistoryFirstIndex; i < commitmentsHeight; i++) { // The first commitment greater than the provided height is the root of the tree // that leaf at that HotShot height - if (stateHistoryCommitments[i].hotShotCommitment.blockHeight > hotShotBlockHeight) { - return stateHistoryCommitments[i].hotShotCommitment; + if (stateHistoryCommitments[i].hotShotBlockHeight > hotShotBlockHeight) { + return stateHistoryCommitments[i].hotShotBlockCommRoot; } } - return stateHistoryCommitments[commitmentsHeight - 1].hotShotCommitment; + return stateHistoryCommitments[commitmentsHeight - 1].hotShotBlockCommRoot; } /// @notice get the number of state history commitments diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol index 90bd42440..bd50050ae 100644 --- a/contracts/test/LightClient.t.sol +++ b/contracts/test/LightClient.t.sol @@ -609,9 +609,9 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { assertEq(lc.stateHistoryFirstIndex(), 0); // get oldest and newest state commitment info - (, uint256 latestBlockTimestamp,) = + (, uint256 latestBlockTimestamp,,) = lc.stateHistoryCommitments(lc.getStateHistoryCount() - 1); - (, uint256 oldestBlockTimestamp,) = lc.stateHistoryCommitments(lc.stateHistoryFirstIndex()); + (, uint256 oldestBlockTimestamp,,) = lc.stateHistoryCommitments(lc.stateHistoryFirstIndex()); // assert that the latest Commitment timestamp - oldest Commitment timestamp is == the max // history allowed assertEq(latestBlockTimestamp - oldestBlockTimestamp, lc.stateHistoryRetentionPeriod()); @@ -639,13 +639,13 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { // get stale commitments and assert that it has been reset to zero for (i = 0; i < lc.stateHistoryFirstIndex(); i++) { - (, uint256 staleBlockTimestamp,) = lc.stateHistoryCommitments(i); + (, uint256 staleBlockTimestamp,,) = lc.stateHistoryCommitments(i); assertEq(staleBlockTimestamp, 0); } // get the recent commitments and assert that the values are non-zero for (i = lc.stateHistoryFirstIndex(); i < lc.getStateHistoryCount(); i++) { - (, uint256 activeBlockTimestamp,) = lc.stateHistoryCommitments(i); + (, uint256 activeBlockTimestamp,,) = lc.stateHistoryCommitments(i); assertNotEq(activeBlockTimestamp, 0); } } @@ -682,9 +682,9 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { assertEq(lc.stateHistoryFirstIndex(), 0); // get oldest and newest state commitment info - (, uint256 latestBlockTimestamp,) = + (, uint256 latestBlockTimestamp,,) = lc.stateHistoryCommitments(lc.getStateHistoryCount() - 1); - (, uint256 oldestBlockTimestamp,) = lc.stateHistoryCommitments(lc.stateHistoryFirstIndex()); + (, uint256 oldestBlockTimestamp,,) = lc.stateHistoryCommitments(lc.stateHistoryFirstIndex()); // assert that the latest Commitment timestamp - oldest Commitment timestamp is == the max // history allowed @@ -713,13 +713,13 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { // get stale commitments and assert that it has been reset to zero for (i = 0; i < lc.stateHistoryFirstIndex(); i++) { - (, uint256 staleBlockTimestamp,) = lc.stateHistoryCommitments(i); + (, uint256 staleBlockTimestamp,,) = lc.stateHistoryCommitments(i); assertEq(staleBlockTimestamp, 0); } // get the recent commitments and assert that the values are non-zero for (i = lc.stateHistoryFirstIndex(); i < lc.getStateHistoryCount(); i++) { - (, uint256 activeBlockTimestamp,) = lc.stateHistoryCommitments(i); + (, uint256 activeBlockTimestamp,,) = lc.stateHistoryCommitments(i); assertNotEq(activeBlockTimestamp, 0); } } @@ -740,9 +740,6 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { blockTimestampUpdates[i] = initialBlockTimestamp + ((i + 1) * 1 days); } - LC.HotShotCommitment memory hotShotCommitment = - LC.HotShotCommitment(newState.blockHeight, newState.blockCommRoot); - LC.StateHistoryCommitment[] memory stateHistoryCommitments = new LC.StateHistoryCommitment[](numUpdates); @@ -750,7 +747,8 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { stateHistoryCommitments[i] = LC.StateHistoryCommitment({ l1BlockHeight: blockNumberUpdates[i], l1BlockTimestamp: blockTimestampUpdates[i], - hotShotCommitment: hotShotCommitment + hotShotBlockHeight: newState.blockHeight, + hotShotBlockCommRoot: newState.blockCommRoot }); } @@ -780,9 +778,6 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { blockNumberUpdates[3] = blockNumberUpdates[2] + DELAY_THRESHOLD + 5; // 18 blockNumberUpdates[4] = blockNumberUpdates[3] + DELAY_THRESHOLD / 2; // 21 - LC.HotShotCommitment memory hotShotCommitment = - LC.HotShotCommitment(newState.blockHeight, newState.blockCommRoot); - LC.StateHistoryCommitment[] memory stateHistoryCommitments = new LC.StateHistoryCommitment[](numUpdates); @@ -795,7 +790,8 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { stateHistoryCommitments[i] = LC.StateHistoryCommitment({ l1BlockHeight: blockNumberUpdates[i], l1BlockTimestamp: blockTimestampUpdates[i], - hotShotCommitment: hotShotCommitment + hotShotBlockHeight: newState.blockHeight, + hotShotBlockCommRoot: newState.blockCommRoot }); } @@ -820,9 +816,6 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { updates[0] = 1; updates[1] = updates[0] + DELAY_THRESHOLD + 5; //12 - LC.HotShotCommitment memory hotShotCommitment = - LC.HotShotCommitment(newState.blockHeight, newState.blockCommRoot); - LC.StateHistoryCommitment[] memory stateHistoryCommitments = new LC.StateHistoryCommitment[](numUpdates); @@ -835,7 +828,8 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { stateHistoryCommitments[i] = LC.StateHistoryCommitment({ l1BlockHeight: updates[i], l1BlockTimestamp: blockTimestampUpdates[i], - hotShotCommitment: hotShotCommitment + hotShotBlockHeight: newState.blockHeight, + hotShotBlockCommRoot: newState.blockCommRoot }); } @@ -855,9 +849,6 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { uint64[] memory updates = new uint64[](numUpdates); updates[0] = 1; - LC.HotShotCommitment memory hotShotCommitment = - LC.HotShotCommitment(newState.blockHeight, newState.blockCommRoot); - LC.StateHistoryCommitment[] memory stateHistoryCommitments = new LC.StateHistoryCommitment[](numUpdates); @@ -870,7 +861,8 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { stateHistoryCommitments[i] = LC.StateHistoryCommitment({ l1BlockHeight: updates[i], l1BlockTimestamp: blockTimestampUpdates[i], - hotShotCommitment: hotShotCommitment + hotShotBlockHeight: newState.blockHeight, + hotShotBlockCommRoot: newState.blockCommRoot }); } @@ -893,9 +885,6 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4 updates[2] = updates[1] + DELAY_THRESHOLD / 2; // 7 - LC.HotShotCommitment memory hotShotCommitment = - LC.HotShotCommitment(newState.blockHeight, newState.blockCommRoot); - LC.StateHistoryCommitment[] memory stateHistoryCommitments = new LC.StateHistoryCommitment[](numUpdates); @@ -908,7 +897,8 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { stateHistoryCommitments[i] = LC.StateHistoryCommitment({ l1BlockHeight: updates[i], l1BlockTimestamp: blockTimestampUpdates[i], - hotShotCommitment: hotShotCommitment + hotShotBlockHeight: newState.blockHeight, + hotShotBlockCommRoot: newState.blockCommRoot }); } @@ -939,9 +929,6 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4 updates[2] = updates[1] + DELAY_THRESHOLD / 2; // 7 - LC.HotShotCommitment memory hotShotCommitment = - LC.HotShotCommitment(newState.blockHeight, newState.blockCommRoot); - LC.StateHistoryCommitment[] memory stateHistoryCommitments = new LC.StateHistoryCommitment[](numUpdates); @@ -954,7 +941,8 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { stateHistoryCommitments[i] = LC.StateHistoryCommitment({ l1BlockHeight: updates[i], l1BlockTimestamp: blockTimestampUpdates[i], - hotShotCommitment: hotShotCommitment + hotShotBlockHeight: newState.blockHeight, + hotShotBlockCommRoot: newState.blockCommRoot }); } @@ -980,9 +968,6 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4 updates[2] = updates[1] + DELAY_THRESHOLD / 2; // 7 - LC.HotShotCommitment memory hotShotCommitment = - LC.HotShotCommitment(newState.blockHeight, newState.blockCommRoot); - LC.StateHistoryCommitment[] memory stateHistoryCommitments = new LC.StateHistoryCommitment[](numUpdates); @@ -995,7 +980,8 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { stateHistoryCommitments[i] = LC.StateHistoryCommitment({ l1BlockHeight: updates[i], l1BlockTimestamp: blockTimestampUpdates[i], - hotShotCommitment: hotShotCommitment + hotShotBlockHeight: newState.blockHeight, + hotShotBlockCommRoot: newState.blockCommRoot }); } @@ -1016,9 +1002,6 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { updates[0] = 1; updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4 - LC.HotShotCommitment memory hotShotCommitment = - LC.HotShotCommitment(newState.blockHeight, newState.blockCommRoot); - LC.StateHistoryCommitment[] memory stateHistoryCommitments = new LC.StateHistoryCommitment[](numUpdates); @@ -1031,7 +1014,8 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { stateHistoryCommitments[i] = LC.StateHistoryCommitment({ l1BlockHeight: updates[i], l1BlockTimestamp: blockTimestampUpdates[i], - hotShotCommitment: hotShotCommitment + hotShotBlockHeight: newState.blockHeight, + hotShotBlockCommRoot: newState.blockCommRoot }); } @@ -1054,9 +1038,6 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { updates[0] = 1; updates[1] = updates[0] + DELAY_THRESHOLD / 2; // 4 - LC.HotShotCommitment memory hotShotCommitment = - LC.HotShotCommitment(newState.blockHeight, newState.blockCommRoot); - LC.StateHistoryCommitment[] memory stateHistoryCommitments = new LC.StateHistoryCommitment[](numUpdates); @@ -1069,7 +1050,8 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { stateHistoryCommitments[i] = LC.StateHistoryCommitment({ l1BlockHeight: updates[i], l1BlockTimestamp: blockTimestampUpdates[i], - hotShotCommitment: hotShotCommitment + hotShotBlockHeight: newState.blockHeight, + hotShotBlockCommRoot: newState.blockCommRoot }); } @@ -1167,16 +1149,15 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { lc.newFinalizedState(newState, newProof); // Test for a smaller hotShotBlockHeight - BN254.ScalarField blockComm = - lc.getHotShotCommitment(newState.blockHeight - 1).blockCommRoot; + BN254.ScalarField blockComm = lc.getHotShotCommitment(newState.blockHeight - 1); assertEqBN254(blockComm, newState.blockCommRoot); } function test_revertWhenGetHotShotCommitmentInvalidHigh() public { // Get the highest HotShot blockheight recorded uint256 numCommitments = lc.getStateHistoryCount(); - (,, LC.HotShotCommitment memory comm) = lc.stateHistoryCommitments(numCommitments - 1); - uint64 blockHeight = comm.blockHeight; + (,, uint64 blockHeight, BN254.ScalarField comm) = + lc.stateHistoryCommitments(numCommitments - 1); // Expect revert when attempting to retrieve a block height higher than the highest one // recorded vm.expectRevert(LC.InvalidHotShotBlockForCommitmentCheck.selector); From b524bd58bfc557cedecee345630f0761a3e7b5e6 Mon Sep 17 00:00:00 2001 From: Alysia Huggins Date: Sun, 8 Sep 2024 22:48:21 -0400 Subject: [PATCH 25/27] expaned on extended state struct in test --- contracts/test/LightClientUpgradeToVx.t.sol | 137 +++++++++++--------- contracts/test/LightClientV2.sol | 49 +++++-- contracts/test/UpgradeLightClientToV2.s.sol | 27 ++-- 3 files changed, 129 insertions(+), 84 deletions(-) diff --git a/contracts/test/LightClientUpgradeToVx.t.sol b/contracts/test/LightClientUpgradeToVx.t.sol index ec8d2a9c5..88f9a5e82 100644 --- a/contracts/test/LightClientUpgradeToVx.t.sol +++ b/contracts/test/LightClientUpgradeToVx.t.sol @@ -13,6 +13,7 @@ import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import { BN254 } from "bn254/BN254.sol"; +import { IPlonkVerifier as V } from "../src/interfaces/IPlonkVerifier.sol"; contract LightClientUpgradeToVxTest is Test { LCV1 public lcV1Proxy; @@ -56,26 +57,39 @@ contract LightClientUpgradeToVxTest is Test { // field // of the upgraded contract is set to 0 uint256 myNewField = 123; - lcV2Proxy = LCV2(upgraderV2.run(proxy, myNewField, admin)); + uint256 extraField = 2; + lcV2Proxy = LCV2(upgraderV2.run(proxy, myNewField, extraField, admin)); assertEq(lcV2Proxy.newField(), myNewField); LCV1.LightClientState memory expectedLightClientState = LCV1.LightClientState(stateV1.viewNum, stateV1.blockHeight, stateV1.blockCommRoot); - LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = - LCV2.ExtendedLightClientState(0); + LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = LCV2 + .ExtendedLightClientState( + stateV1.viewNum, stateV1.blockHeight, stateV1.blockCommRoot, extraField + ); + // compare with the current version of the light client state (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot) = lcV2Proxy.finalizedState(); assertEq(viewNum, expectedLightClientState.viewNum); assertEq(blockHeight, expectedLightClientState.blockHeight); assertEq(abi.encode(blockCommRoot), abi.encode(expectedLightClientState.blockCommRoot)); + // compare with the extended light client state + ( + uint64 viewNumV2, + uint64 blockHeightV2, + BN254.ScalarField blockCommRootV2, + uint256 extraFieldV2 + ) = lcV2Proxy.extendedFinalizedState(); + assertEq(viewNumV2, expectedExtendedLightClientState.viewNum); + assertEq(blockHeightV2, expectedExtendedLightClientState.blockHeight); assertEq( - abi.encode(lcV2Proxy.getExtendedFinalizedState()), - abi.encode(expectedExtendedLightClientState) + abi.encode(blockCommRootV2), abi.encode(expectedExtendedLightClientState.blockCommRoot) ); + assertEq(extraFieldV2, expectedExtendedLightClientState.extraField); } // test that the data remains the same after upgrading the implementation @@ -84,30 +98,37 @@ contract LightClientUpgradeToVxTest is Test { // field // of the upgraded contract is set to 0 uint256 myNewField = 123; - lcV2Proxy = LCV2(upgraderV2.run(proxy, myNewField, admin)); + uint256 extraField = 2; + lcV2Proxy = LCV2(upgraderV2.run(proxy, myNewField, extraField, admin)); assertEq(lcV2Proxy.newField(), myNewField); LCV1.LightClientState memory expectedLightClientState = LCV1.LightClientState(stateV1.viewNum, stateV1.blockHeight, stateV1.blockCommRoot); - LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = - LCV2.ExtendedLightClientState(0); - - (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot) = - lcV2Proxy.finalizedState(); - assertEq(viewNum, expectedLightClientState.viewNum); - assertEq(blockHeight, expectedLightClientState.blockHeight); - assertEq(abi.encode(blockCommRoot), abi.encode(expectedLightClientState.blockCommRoot)); - + LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = LCV2 + .ExtendedLightClientState(stateV1.viewNum, stateV1.blockHeight, stateV1.blockCommRoot, 2); + + ( + uint64 viewNumV2, + uint64 blockHeightV2, + BN254.ScalarField blockCommRootV2, + uint256 extraFieldV2 + ) = lcV2Proxy.extendedFinalizedState(); + assertEq(viewNumV2, expectedLightClientState.viewNum); + assertEq(blockHeightV2, expectedLightClientState.blockHeight); + assertEq(abi.encode(blockCommRootV2), abi.encode(expectedLightClientState.blockCommRoot)); + + assertEq(viewNumV2, expectedExtendedLightClientState.viewNum); + assertEq(blockHeightV2, expectedExtendedLightClientState.blockHeight); assertEq( - abi.encode(lcV2Proxy.getExtendedFinalizedState()), - abi.encode(expectedExtendedLightClientState) + abi.encode(blockCommRootV2), abi.encode(expectedExtendedLightClientState.blockCommRoot) ); + assertEq(extraFieldV2, expectedExtendedLightClientState.extraField); // expect a revert when we try to reinitialize vm.expectRevert(Initializable.InvalidInitialization.selector); - lcV2Proxy.initializeV2(5); + lcV2Proxy.initializeV2(5, 3); } // test that the data remains the same after upgrading the implementation @@ -117,26 +138,40 @@ contract LightClientUpgradeToVxTest is Test { // of the upgraded contract is set to 0 uint256 myNewField = 123; uint256 myNewFieldV3 = 456; - lcV2Proxy = LCV2(upgraderV2.run(proxy, myNewField, admin)); + uint256 extraField = 2; + + lcV2Proxy = LCV2(upgraderV2.run(proxy, myNewField, extraField, admin)); assertEq(lcV2Proxy.newField(), myNewField); LCV1.LightClientState memory expectedLightClientState = LCV1.LightClientState(stateV1.viewNum, stateV1.blockHeight, stateV1.blockCommRoot); - LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = - LCV2.ExtendedLightClientState(0); + LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = LCV2 + .ExtendedLightClientState( + stateV1.viewNum, stateV1.blockHeight, stateV1.blockCommRoot, extraField + ); + // compare with the current version of the light client state (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot) = lcV2Proxy.finalizedState(); assertEq(viewNum, expectedLightClientState.viewNum); assertEq(blockHeight, expectedLightClientState.blockHeight); assertEq(abi.encode(blockCommRoot), abi.encode(expectedLightClientState.blockCommRoot)); + // compare with the extended light client state + ( + uint64 viewNumV2, + uint64 blockHeightV2, + BN254.ScalarField blockCommRootV2, + uint256 extraFieldV2 + ) = lcV2Proxy.extendedFinalizedState(); + assertEq(viewNumV2, expectedExtendedLightClientState.viewNum); + assertEq(blockHeightV2, expectedExtendedLightClientState.blockHeight); assertEq( - abi.encode(lcV2Proxy.getExtendedFinalizedState()), - abi.encode(expectedExtendedLightClientState) + abi.encode(blockCommRootV2), abi.encode(expectedExtendedLightClientState.blockCommRoot) ); + assertEq(extraFieldV2, expectedExtendedLightClientState.extraField); // upgrade to v3 lcV3Proxy = LCV3(upgraderV3.run(proxy, myNewFieldV3, admin)); @@ -149,10 +184,19 @@ contract LightClientUpgradeToVxTest is Test { assertEq(blockHeight, expectedLightClientState.blockHeight); assertEq(abi.encode(blockCommRoot), abi.encode(expectedLightClientState.blockCommRoot)); + // compare with the extended light client state + ( + uint64 viewNumV3, + uint64 blockHeightV3, + BN254.ScalarField blockCommRootV3, + uint256 extraFieldV3 + ) = lcV2Proxy.extendedFinalizedState(); + assertEq(viewNumV3, expectedExtendedLightClientState.viewNum); + assertEq(blockHeightV3, expectedExtendedLightClientState.blockHeight); assertEq( - abi.encode(lcV3Proxy.getExtendedFinalizedState()), - abi.encode(expectedExtendedLightClientState) + abi.encode(blockCommRootV3), abi.encode(expectedExtendedLightClientState.blockCommRoot) ); + assertEq(extraFieldV3, expectedExtendedLightClientState.extraField); } // test that the tx reverts if we try to reinitialize more than once @@ -162,44 +206,13 @@ contract LightClientUpgradeToVxTest is Test { // of the upgraded contract is set to 0 uint256 myNewField = 123; uint256 myNewFieldV3 = 456; + uint256 extraField = 2; // upgrade to v2 first - lcV2Proxy = LCV2(upgraderV2.run(proxy, myNewField, admin)); - - assertEq(lcV2Proxy.newField(), myNewField); - - LCV1.LightClientState memory expectedLightClientState = - LCV1.LightClientState(stateV1.viewNum, stateV1.blockHeight, stateV1.blockCommRoot); - - LCV2.ExtendedLightClientState memory expectedExtendedLightClientState = - LCV2.ExtendedLightClientState(0); - - (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot) = - lcV2Proxy.finalizedState(); - assertEq(viewNum, expectedLightClientState.viewNum); - assertEq(blockHeight, expectedLightClientState.blockHeight); - assertEq(abi.encode(blockCommRoot), abi.encode(expectedLightClientState.blockCommRoot)); - - assertEq( - abi.encode(lcV2Proxy.getExtendedFinalizedState()), - abi.encode(expectedExtendedLightClientState) - ); + lcV2Proxy = LCV2(upgraderV2.run(proxy, myNewField, extraField, admin)); // upgrade to v3 lcV3Proxy = LCV3(upgraderV3.run(proxy, myNewFieldV3, admin)); - assertEq(lcV3Proxy.newField(), myNewField); - assertEq(lcV3Proxy.anotherField(), myNewFieldV3); - - (viewNum, blockHeight, blockCommRoot) = lcV3Proxy.finalizedState(); - assertEq(viewNum, expectedLightClientState.viewNum); - assertEq(blockHeight, expectedLightClientState.blockHeight); - assertEq(abi.encode(blockCommRoot), abi.encode(expectedLightClientState.blockCommRoot)); - - assertEq( - abi.encode(lcV3Proxy.getExtendedFinalizedState()), - abi.encode(expectedExtendedLightClientState) - ); - // expect a revert when we try to reinitialize vm.expectRevert(Initializable.InvalidInitialization.selector); lcV3Proxy.initializeV3(6); @@ -213,7 +226,9 @@ contract LightClientUpgradeToVxTest is Test { assertEq(patch, 0); //upgrade box - lcV2Proxy = LCV2(upgraderV2.run(proxy, 123, admin)); + uint256 newField = 123; + uint256 extraField = 2; + lcV2Proxy = LCV2(upgraderV2.run(proxy, newField, extraField, admin)); assertEq(address(lcV2Proxy), address(lcV1Proxy)); (uint8 majorV2, uint8 minorV2, uint8 patchV2) = lcV2Proxy.getVersion(); assertEq(majorV2, 2); @@ -229,7 +244,9 @@ contract LightClientUpgradeToVxTest is Test { abi.encodeWithSelector(OwnableUpgradeable.OwnableUnauthorizedAccount.selector, attacker) ); - lcV2Proxy = LCV2(upgraderV2.run(address(proxy), 123, attacker)); + uint256 newField = 123; + uint256 extraField = 2; + lcV2Proxy = LCV2(upgraderV2.run(address(proxy), newField, extraField, attacker)); } function testMaliciousUpgradeToV32Fails() public { diff --git a/contracts/test/LightClientV2.sol b/contracts/test/LightClientV2.sol index 863869cd0..e89da579d 100644 --- a/contracts/test/LightClientV2.sol +++ b/contracts/test/LightClientV2.sol @@ -6,6 +6,8 @@ pragma experimental ABIEncoderV2; import { BN254 } from "bn254/BN254.sol"; import { IPlonkVerifier } from "../src/interfaces/IPlonkVerifier.sol"; import { LightClient } from "../src/LightClient.sol"; +import { PlonkVerifier } from "../src/libraries/PlonkVerifier.sol"; +import { LightClientStateUpdateVK as VkLib } from "../src/libraries/LightClientStateUpdateVK.sol"; /// @notice A light client for HotShot consensus. Keeping track of its finalized states in safe, /// authenticated ways. @@ -16,11 +18,14 @@ contract LightClientV2 is LightClient { uint256 public newField; struct ExtendedLightClientState { + uint64 viewNum; + uint64 blockHeight; + BN254.ScalarField blockCommRoot; uint256 extraField; } /// @notice mapping to store the extended light client states in order to simplify upgrades - ExtendedLightClientState public extendedFinalzedState; + ExtendedLightClientState public extendedFinalizedState; /// @notice Initialize v2 /// @param _newField New field amount @@ -30,8 +35,12 @@ contract LightClientV2 is LightClient { /// when the base implementation contract is initialized for the first time, the _initialized /// version /// is set to 1. Since this is the 2nd implementation, the next contract version is 2. - function initializeV2(uint256 _newField) external reinitializer(2) { + function initializeV2(uint256 _newField, uint256 _extraField) external reinitializer(2) { newField = _newField; + extendedFinalizedState.viewNum = finalizedState.viewNum; + extendedFinalizedState.blockHeight = finalizedState.blockHeight; + extendedFinalizedState.blockCommRoot = finalizedState.blockCommRoot; + extendedFinalizedState.extraField = _extraField; } /// @notice Use this to get the implementation contract version @@ -52,9 +61,9 @@ contract LightClientV2 is LightClient { /// before any newer state can be accepted since the stake table commitments of that block /// become the snapshots used for vote verifications later on. function newFinalizedState( - LightClientState memory newState, + ExtendedLightClientState memory newState, IPlonkVerifier.PlonkProof memory proof - ) external virtual override { + ) external virtual { if ( newState.viewNum <= finalizedState.viewNum || newState.blockHeight <= finalizedState.blockHeight @@ -74,20 +83,32 @@ contract LightClientV2 is LightClient { // because newState is in memory and states[finalizedState] is in storage, they have // different data handling mechanisms // and this each field needs to be assigned individually - finalizedState = newState; - extendedFinalzedState.extraField = 2; + extendedFinalizedState = newState; emit NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot); } - /// @dev Simple getter function for the extended finalized state - function getExtendedFinalizedState() - public - view - virtual - returns (ExtendedLightClientState memory) - { - return extendedFinalzedState; + /// @notice Verify the Plonk proof, marked as `virtual` for easier testing as we can swap VK + /// used in inherited contracts. + function verifyProof( + ExtendedLightClientState memory state, + IPlonkVerifier.PlonkProof memory proof + ) internal virtual { + IPlonkVerifier.VerifyingKey memory vk = VkLib.getVk(); + + // Prepare the public input + uint256[7] memory publicInput; + publicInput[0] = uint256(state.viewNum); + publicInput[1] = uint256(state.blockHeight); + publicInput[2] = BN254.ScalarField.unwrap(state.blockCommRoot); + publicInput[3] = BN254.ScalarField.unwrap(genesisStakeTableState.blsKeyComm); + publicInput[4] = BN254.ScalarField.unwrap(genesisStakeTableState.schnorrKeyComm); + publicInput[5] = BN254.ScalarField.unwrap(genesisStakeTableState.amountComm); + publicInput[6] = genesisStakeTableState.threshold; + + if (!PlonkVerifier.verify(vk, publicInput, proof)) { + revert InvalidProof(); + } } } diff --git a/contracts/test/UpgradeLightClientToV2.s.sol b/contracts/test/UpgradeLightClientToV2.s.sol index 7eb152fcd..e7405484e 100644 --- a/contracts/test/UpgradeLightClientToV2.s.sol +++ b/contracts/test/UpgradeLightClientToV2.s.sol @@ -11,12 +11,15 @@ contract UpgradeLightClientScript is Script { /// @param mostRecentlyDeployedProxy address of deployed proxy /// @return address of the proxy /// TODO get the most recent deployment from the devops tooling - function run(address mostRecentlyDeployedProxy, uint256 newField, address admin) - external - returns (address) - { + function run( + address mostRecentlyDeployedProxy, + uint256 newField, + uint256 extraField, + address admin + ) external returns (address) { vm.startBroadcast(admin); - address proxy = upgradeLightClient(mostRecentlyDeployedProxy, address(new LCV2()), newField); + address proxy = + upgradeLightClient(mostRecentlyDeployedProxy, address(new LCV2()), newField, extraField); vm.stopBroadcast(); return proxy; } @@ -27,13 +30,17 @@ contract UpgradeLightClientScript is Script { /// @param proxyAddress address of proxy /// @param newLightClient address of new implementation /// @return address of the proxy - function upgradeLightClient(address proxyAddress, address newLightClient, uint256 newField) - public - returns (address) - { + function upgradeLightClient( + address proxyAddress, + address newLightClient, + uint256 newField, + uint256 extraField + ) public returns (address) { LC proxy = LC(proxyAddress); //make the function call on the previous implementation - proxy.upgradeToAndCall(newLightClient, abi.encodeCall(LCV2.initializeV2, newField)); //proxy + proxy.upgradeToAndCall( + newLightClient, abi.encodeCall(LCV2.initializeV2, (newField, extraField)) + ); //proxy // address now points to the new // implementation return address(proxy); From 33098c67f463cca9878f8cba668cc103c259aafa Mon Sep 17 00:00:00 2001 From: Alex Xiong Date: Mon, 9 Sep 2024 12:02:39 +0800 Subject: [PATCH 26/27] remove redundent permissionedProverEnabled flag --- .gas-snapshot | 2 +- .../artifacts/LightClientMock_bytecode.json | 2 +- .../artifacts/LightClient_bytecode.json | 2 +- contract-bindings/src/light_client.rs | 130 +++++++++--------- contract-bindings/src/light_client_mock.rs | 130 +++++++++--------- contracts/src/LightClient.sol | 14 +- contracts/test/LightClient.t.sol | 13 +- 7 files changed, 146 insertions(+), 147 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index 4bfac792f..32c4d32fe 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,3 +1,3 @@ -LightClientBench:testCorrectUpdateBench() (gas: 524301) +LightClientBench:testCorrectUpdateBench() (gas: 499764) PlonkVerifier2_verify_Test:test_verify_succeeds() (gas: 381889) PlonkVerifier_verify_Test:test_verify_succeeds() (gas: 388519) \ No newline at end of file diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json index 99d58edc5..3d8e2d087 100644 --- a/contract-bindings/artifacts/LightClientMock_bytecode.json +++ b/contract-bindings/artifacts/LightClientMock_bytecode.json @@ -1 +1 @@ -"0x60a0604052306080523480156200001557600080fd5b506040516200335738038062003357833981016040819052620000389162000503565b6200004262000058565b6200004f8383836200010c565b5050506200065f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a95760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001095780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b82516001600160401b031615158062000131575060208301516001600160401b031615155b806200013f57506020820151155b806200014d57506040820151155b806200015b57506060820151155b806200016657508151155b1562000185576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b0390811668010000000000000000026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b199091161790556200022443428562000229565b505050565b600a5415801590620002f75750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b03169081106200026c576200026c620005bc565b6000918252602090912060029091020154600a8054680100000000000000009092046001600160401b031691620002a690600190620005e8565b81548110620002b957620002b9620005bc565b6000918252602090912060029091020154620002eb91906801000000000000000090046001600160401b031662000604565b6001600160401b031610155b156200038357600954600a805490916001600160401b0316908110620003215762000321620005bc565b60009182526020822060029091020180546001600160c01b0319168155600101819055600980546001600160401b0316916200035d836200062e565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600a8054600181018255600091909152935160029094027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881018054935194518716600160801b02600160801b600160c01b031995881668010000000000000000026001600160801b03199095169690971695909517929092179290921693909317909155517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a990910155565b604051606081016001600160401b03811182821017156200049a57634e487b7160e01b600052604160045260246000fd5b60405290565b604051608081016001600160401b03811182821017156200049a57634e487b7160e01b600052604160045260246000fd5b80516001600160401b0381168114620004e957600080fd5b919050565b805163ffffffff81168114620004e957600080fd5b60008060008385036101008112156200051b57600080fd5b60608112156200052a57600080fd5b6200053462000469565b6200053f86620004d1565b81526200054f60208701620004d1565b60208201526040868101519082015293506080605f19820112156200057357600080fd5b506200057e620004a0565b60608581015182526080860151602083015260a0860151604083015260c0860151908201529150620005b360e08501620004ee565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115620005fe57620005fe620005d2565b92915050565b6001600160401b03828116828216039080821115620006275762000627620005d2565b5092915050565b60006001600160401b038281166002600160401b03198101620006555762000655620005d2565b6001019392505050565b608051612cce620006896000396000818161114b0152818161117401526112f30152612cce6000f3fe60806040526004361061019c5760003560e01c80638da5cb5b116100ec578063c23b9e9e1161008a578063e030330111610064578063e0303301146105ed578063f2fde38b1461060d578063f56761601461062d578063f9e50d191461064d57600080fd5b8063c23b9e9e14610568578063c8e5e498146105a1578063d24d933d146105bd57600080fd5b80639fdb54a7116100c65780639fdb54a71461044b578063ad3cb1cc146104a1578063b5adea3c146104df578063bd32519a1461053757600080fd5b80638da5cb5b146103ce57806396c1ca611461040b5780639baa3cc91461042b57600080fd5b8063313df7b11161015957806352d1902d1161013357806352d1902d1461036157806369cc6a0414610384578063715018a6146103995780638584d23f146103ae57600080fd5b8063313df7b1146102d3578063426d31941461030b5780634f1ef2861461034e57600080fd5b8063013fa5fc146101a157806302b592f3146101c35780630d8e6e2c146102215780632063d4f71461024e5780632d52aad61461026e5780632f79889d1461029b575b600080fd5b3480156101ad57600080fd5b506101c16101bc366004612142565b610662565b005b3480156101cf57600080fd5b506101e36101de36600461215d565b61071f565b60405161021894939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b34801561022d57600080fd5b50604080516001815260006020820181905291810191909152606001610218565b34801561025a57600080fd5b506101c16102693660046122d3565b61076a565b34801561027a57600080fd5b506101c161028936600461215d565b600b805460ff19166001179055600c55565b3480156102a757600080fd5b506009546102bb906001600160401b031681565b6040516001600160401b039091168152602001610218565b3480156102df57600080fd5b506008546102f3906001600160a01b031681565b6040516001600160a01b039091168152602001610218565b34801561031757600080fd5b5060005460015460025460035461032e9392919084565b604080519485526020850193909352918301526060820152608001610218565b6101c161035c366004612487565b6108be565b34801561036d57600080fd5b506103766108dd565b604051908152602001610218565b34801561039057600080fd5b506101c16108fa565b3480156103a557600080fd5b506101c161096a565b3480156103ba57600080fd5b506103766103c936600461215d565b61097c565b3480156103da57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166102f3565b34801561041757600080fd5b506101c1610426366004612540565b610a9c565b34801561043757600080fd5b506101c161044636600461255b565b610b11565b34801561045757600080fd5b5060065460075461047b916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610218565b3480156104ad57600080fd5b506104d2604051806040016040528060058152602001640352e302e360dc1b81525081565b604051610218919061260b565b3480156104eb57600080fd5b506101c16104fa36600461263e565b80516006805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905560400151600755565b34801561054357600080fd5b5060085461055890600160a01b900460ff1681565b6040519015158152602001610218565b34801561057457600080fd5b5060085461058c90600160a81b900463ffffffff1681565b60405163ffffffff9091168152602001610218565b3480156105ad57600080fd5b506101c1600b805460ff19169055565b3480156105c957600080fd5b5060045460055461047b916001600160401b0380821692600160401b909204169083565b3480156105f957600080fd5b5061055861060836600461265a565b610c35565b34801561061957600080fd5b506101c1610628366004612142565b610c6b565b34801561063957600080fd5b506101c161064836600461267c565b610cae565b34801561065957600080fd5b50600a54610376565b61066a610d5c565b6001600160a01b0381166106915760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036106c05760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a81b0319166001600160a01b0383811691909117600160a01b1791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600a818154811061072f57600080fd5b6000918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b600854600160a01b900460ff16801561078e57506008546001600160a01b03163314155b156107ac576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806107e5575060065460208301516001600160401b03600160401b9092048216911611155b156108035760405163051c46ef60e01b815260040160405180910390fd5b6108108260400151610db7565b61081a8282610e27565b81516006805460208501516001600160401b03908116600160401b026001600160801b03199092169316929092179190911790556040820151600755610861434284610f1f565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516108b291815260200190565b60405180910390a35050565b6108c6611140565b6108cf826111e5565b6108d98282611226565b5050565b60006108e76112e8565b50600080516020612ca283398151915290565b610902610d5c565b600854600160a01b900460ff161561094f57600880546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610972610d5c565b6109686000611331565b600a805460009161098e600183612787565b8154811061099e5761099e61279a565b6000918252602090912060029091020154600160801b90046001600160401b031683106109de57604051631856a49960e21b815260040160405180910390fd5b6009546001600160401b03165b81811015610a645783600a8281548110610a0757610a0761279a565b6000918252602090912060029091020154600160801b90046001600160401b03161115610a5c57600a8181548110610a4157610a4161279a565b90600052602060002090600202016001015492505050919050565b6001016109eb565b50600a610a72600183612787565b81548110610a8257610a8261279a565b906000526020600020906002020160010154915050919050565b610aa4610d5c565b610e108163ffffffff161080610acd575060085463ffffffff600160a81b909104811690821611155b15610aeb576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a81b0263ffffffff60a81b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610b565750825b90506000826001600160401b03166001148015610b725750303b155b905081158015610b80575080155b15610b9e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610bc857845460ff60401b1916600160401b1785555b610bd1866113a2565b610bd96113b3565b610be48989896113bb565b8315610c2a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600b5460009060ff16610c5157610c4c83836114c6565b610c62565b81600c5484610c609190612787565b115b90505b92915050565b610c73610d5c565b6001600160a01b038116610ca257604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610cab81611331565b50565b610cba600a6000611e30565b60005b81518110156108d957600a828281518110610cda57610cda61279a565b602090810291909101810151825460018181018555600094855293839020825160029092020180549383015160408401516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026001600160801b031990971691909416179490941793909316178255606001519082015501610cbd565b33610d8e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109685760405163118cdaa760e01b8152336004820152602401610c99565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806108d95760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610c99565b6000610e316115d7565b9050610e3b611e51565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a083015260005460c08301525163ce537a7760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063ce537a7790610ebb908590859088906004016129b7565b602060405180830381865af4158015610ed8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efc9190612be6565b610f19576040516309bde33960e01b815260040160405180910390fd5b50505050565b600a5415801590610fd85750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b0316908110610f5e57610f5e61279a565b6000918252602090912060029091020154600a8054600160401b9092046001600160401b031691610f9190600190612787565b81548110610fa157610fa161279a565b6000918252602090912060029091020154610fcc9190600160401b90046001600160401b0316612c08565b6001600160401b031610155b1561105e57600954600a805490916001600160401b0316908110610ffe57610ffe61279a565b60009182526020822060029091020180546001600160c01b0319168155600101819055600980546001600160401b03169161103883612c2f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600a8054600181018255600091909152935160029094027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a990910155565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806111c757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111bb600080516020612ca2833981519152546001600160a01b031690565b6001600160a01b031614155b156109685760405163703e46dd60e11b815260040160405180910390fd5b6111ed610d5c565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d90602001610714565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611280575060408051601f3d908101601f1916820190925261127d91810190612c55565b60015b6112a857604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610c99565b600080516020612ca283398151915281146112d957604051632a87526960e21b815260048101829052602401610c99565b6112e38383611c07565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109685760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6113aa611c5d565b610cab81611ca6565b610968611c5d565b82516001600160401b03161515806113df575060208301516001600160401b031615155b806113ec57506020820151155b806113f957506040820151155b8061140657506060820151155b8061141057508151155b1561142e576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b199091161790556112e3434285610f1f565b600a54600090438411806114da5750600381105b156114f85760405163b0b4387760e01b815260040160405180910390fd5b60008080611507600185612787565b90505b816115a25786600a82815481106115235761152361279a565b60009182526020909120600290910201546001600160401b0316116115765760019150600a81815481106115595761155961279a565b60009182526020909120600290910201546001600160401b031692505b600281106115a2576009546001600160401b031681146115a2578061159a81612c6e565b91505061150a565b816115c05760405163b0b4387760e01b815260040160405180910390fd5b856115cb8489612787565b11979650505050505050565b6115df611e6f565b620100008152600760208201527f1369aa78dc50135ad756d62c97a64a0edcd30066584168200d9d1facf82ca4f56040820151527f2cf23456d712b06f8e3aa5bf0acc3e46a3d094602a3a2b99d873bba05a4391476020604083015101527f08a35f379d2d2c490a51006697275e4db79b67b4a175c1477e262d29e25e42316060820151527f218828131bb7940ccc88c561b299755af4bf0b71ed930b129e8be0a1218139ea6020606083015101527f23a2172436c1145b36d5bc6d3b31fa1610c73a543ea443918aaa3ee175f9921b6080820151527f2502adf404d62877c310214ae9942e93c40b154d34c024bab48a3ca057e60a116020608083015101527f1bb88ada91ab7734882f7826b81275320081ac485f9cf8bfbc3ba54b6eb4dff360a0820151527f25c74a27e9a3b20114a3a91f31c20f01777e7ed913e0ef949f0285e2e7c2069b602060a083015101527f12b0ce76ac8b0dbd405ebc5dd0bae0f91aed50033c7ea36fc62aaba2b98333dc60c0820151527f185b42af49dd1cbe337a84f74b704172428e754a0bea024ab3eb2f996afb2c47602060c083015101527f21f53ad4538b45438bbf0521446070223920e3df6f9022a64cc16d7f94e85c0860e0820151527f2278ac3dedfdac7feb9725a022497175518eada52c8932fc40e6e75bea889fb8602060e083015101527f0876136f81c16298487bfb1be74d4a3487ec45645ab1d09dc2e5b865d62230df610100820151527f098c641c947ecd798dfd5e1b2fe428024cdf03061a53ff774ea8a9e3de9d3f2b602061010083015101527f15eaac2c6232d2268bf79dc47ed9666f992fb3d96ad23fb21690c21586c5472e610120820151527f0f10f1ffc54881287fda6f200bc85d8245b508d844a974098a41119867b325d0602061012083015101527f0895ceea40b085534e9739ca5442ba48b3a3592affde2b509df74521b47d8ab0610140820151527f2e12ec5800ac92fe2a8e7040bc5b435b9eb71e31380173fa7688bf81fcbba455602061014083015101527f2f5384eb5653e47576efe248e7903f463243414bfed5237dda750df3996bd918610160820151527f1c3cd6b11da8704cdc871ab4fa323d7ee57bd40ce165b49a56d5ef6489cd251a602061016083015101527f13579994957ce1554cc1e5b194fb63c9513707f627414f8442681ae736e36450610180820151527f26c9bdcd96d8e420b12974ade93ad9c312c4185213d2f6831a7c625a18890e95602061018083015101527f0cc70a1d542a9a1535ae5d9201696adc5c99c1bcebd9951dfa8afec79fa0b6446101a0820151527f10b043d9f1869181b96579d6616efc17a5df7b84c4d431d966c9094bf1e8815360206101a083015101527f198a65309d131a43b0ab1c47659d0336cfbf62b27f4727106b4fd971c73dd4036101c0820151527f23df99eac3c1947903b211b800efeb76f47d5e87b7414866543492e8c7798d1a60206101c083015101527f221cc5e47b81ce8dcfa72ef981916a8eddef12fcde59c56c62830c126ebef0de6101e0820151527f231f99340c35c9e09652a6df73c9cec5d88738cb71ff45716fdc9e9e45a4926e60206101e083015101527f2c9f1489fce0f263e03f3e97bf0a72273aafcca9325ff47786adb04a52a6d22c610200820151527f21f66e28f17e01e9fd593e16d022c4eca25bd5db96daec606d97b604cc414838602061020083015101527f2015745604a9571e226bd99043cfaf1f96267cc5de67f497563ff81100531d26610220820151527f206889ff4c58dd08ee1107191a2a5bc5dbae55c49d7d8397801799868d10f805602061022083015101527f21062ab8f8ecd8932b429a1eb8614b1e03db61bff6a5cd2d5d7ea193e90e9927610240820151527f217f9b27b934b88ffe555d682dfe6e8b6d503f86b14bbd96342bc48487a60b27602061024083015101527f1c9eda2d195cb731f903235ead6a4f7c66db49da713ecb27afee076f0eea7154610260820151527f2647c161c00b90258e1cefebb17481f8a5d91b5f9dca626e3e89a9215bcca16a602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611c1082611cae565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611c55576112e38282611d13565b6108d9611d89565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661096857604051631afcd79f60e31b815260040160405180910390fd5b610c73611c5d565b806001600160a01b03163b600003611ce457604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610c99565b600080516020612ca283398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611d309190612c85565b600060405180830381855af49150503d8060008114611d6b576040519150601f19603f3d011682016040523d82523d6000602084013e611d70565b606091505b5091509150611d80858383611da8565b95945050505050565b34156109685760405163b398979f60e01b815260040160405180910390fd5b606082611dbd57611db882611e07565b611e00565b8151158015611dd457506001600160a01b0384163b155b15611dfd57604051639996b31560e01b81526001600160a01b0385166004820152602401610c99565b50805b9392505050565b805115611e175780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825560020290600052602060002090810190610cab91906120fc565b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611ea6604051806040016040528060008152602001600081525090565b8152602001611ec8604051806040016040528060008152602001600081525090565b8152602001611eea604051806040016040528060008152602001600081525090565b8152602001611f0c604051806040016040528060008152602001600081525090565b8152602001611f2e604051806040016040528060008152602001600081525090565b8152602001611f50604051806040016040528060008152602001600081525090565b8152602001611f72604051806040016040528060008152602001600081525090565b8152602001611f94604051806040016040528060008152602001600081525090565b8152602001611fb6604051806040016040528060008152602001600081525090565b8152602001611fd8604051806040016040528060008152602001600081525090565b8152602001611ffa604051806040016040528060008152602001600081525090565b815260200161201c604051806040016040528060008152602001600081525090565b815260200161203e604051806040016040528060008152602001600081525090565b8152602001612060604051806040016040528060008152602001600081525090565b8152602001612082604051806040016040528060008152602001600081525090565b81526020016120a4604051806040016040528060008152602001600081525090565b81526020016120c6604051806040016040528060008152602001600081525090565b81526020016120e8604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b5b808211156121225780546001600160c01b0319168155600060018201556002016120fd565b5090565b80356001600160a01b038116811461213d57600080fd5b919050565b60006020828403121561215457600080fd5b610c6282612126565b60006020828403121561216f57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b03811182821017156121af576121af612176565b60405290565b604051608081016001600160401b03811182821017156121af576121af612176565b604051601f8201601f191681016001600160401b03811182821017156121ff576121ff612176565b604052919050565b80356001600160401b038116811461213d57600080fd5b60006060828403121561223057600080fd5b604051606081018181106001600160401b038211171561225257612252612176565b60405290508061226183612207565b815261226f60208401612207565b6020820152604083013560408201525092915050565b60006040828403121561229757600080fd5b604051604081018181106001600160401b03821117156122b9576122b9612176565b604052823581526020928301359281019290925250919050565b6000808284036104e08112156122e857600080fd5b6122f2858561221e565b925061048080605f198301121561230857600080fd5b61231061218c565b915061231f8660608701612285565b825261232e8660a08701612285565b60208301526123408660e08701612285565b604083015261012061235487828801612285565b606084015261016061236888828901612285565b60808501526101a061237c89828a01612285565b60a08601526101e06123908a828b01612285565b60c08701526102206123a48b828c01612285565b60e08801526102606123b88c828d01612285565b6101008901526102a06123cd8d828e01612285565b878a01526123df8d6102e08e01612285565b6101408a01526123f38d6103208e01612285565b868a01526124058d6103608e01612285565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b6000806040838503121561249a57600080fd5b6124a383612126565b91506020808401356001600160401b03808211156124c057600080fd5b818601915086601f8301126124d457600080fd5b8135818111156124e6576124e6612176565b6124f8601f8201601f191685016121d7565b9150808252878482850101111561250e57600080fd5b80848401858401376000848284010152508093505050509250929050565b803563ffffffff8116811461213d57600080fd5b60006020828403121561255257600080fd5b610c628261252c565b60008060008084860361012081121561257357600080fd5b61257d878761221e565b94506080605f198201121561259157600080fd5b5061259a6121b5565b60608681013582526080870135602083015260a0870135604083015260c08701359082015292506125cd60e0860161252c565b91506125dc6101008601612126565b905092959194509250565b60005b838110156126025781810151838201526020016125ea565b50506000910152565b602081526000825180602084015261262a8160408501602087016125e7565b601f01601f19169190910160400192915050565b60006060828403121561265057600080fd5b610c62838361221e565b6000806040838503121561266d57600080fd5b50508035926020909101359150565b6000602080838503121561268f57600080fd5b82356001600160401b03808211156126a657600080fd5b818501915085601f8301126126ba57600080fd5b8135818111156126cc576126cc612176565b6126da848260051b016121d7565b818152848101925060079190911b8301840190878211156126fa57600080fd5b928401925b8184101561276657608084890312156127185760008081fd5b6127206121b5565b61272985612207565b8152612736868601612207565b868201526040612747818701612207565b90820152606085810135908201528352608090930192918401916126ff565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c6557610c65612771565b634e487b7160e01b600052603260045260246000fd5b8060005b6007811015610f195781518452602093840193909101906001016127b4565b6127e882825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e084015250608081015161010061284b8185018380518252602090810151910152565b60a0830151915061014061286b8186018480518252602090810151910152565b60c0840151925061018061288b8187018580518252602090810151910152565b60e085015193506101c06128ab8188018680518252602090810151910152565b928501519350610200926128cb8785018680518252602090810151910152565b61012086015194506102406128ec8189018780518252602090810151910152565b9286015194506102809261290c8885018780518252602090810151910152565b61016087015195506102c061292d818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a6082019050845182526020850151602083015260408501516129ea604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612a378185018380518252602090810151910152565b60c08701519150610140612a578186018480518252602090810151910152565b60e08801519250610180612a778187018580518252602090810151910152565b9188015192506101c091612a978684018580518252602090810151910152565b6101208901519350610200612ab88188018680518252602090810151910152565b91890151935061024091612ad88784018680518252602090810151910152565b6101608a01519450610280612af98189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612bd06105008301856127b0565b612bde6105e08301846127d3565b949350505050565b600060208284031215612bf857600080fd5b81518015158114611e0057600080fd5b6001600160401b03828116828216039080821115612c2857612c28612771565b5092915050565b60006001600160401b03808316818103612c4b57612c4b612771565b6001019392505050565b600060208284031215612c6757600080fd5b5051919050565b600081612c7d57612c7d612771565b506000190190565b60008251612c978184602087016125e7565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" +"0x60a0604052306080523480156200001557600080fd5b506040516200337b3803806200337b833981016040819052620000389162000512565b6200004262000058565b6200004f8383836200010c565b5050506200066e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a95760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001095780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b82516001600160401b031615158062000131575060208301516001600160401b031615155b806200013f57506020820151155b806200014d57506040820151155b806200015b57506060820151155b806200016657508151155b1562000185576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b0390811668010000000000000000026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a01b0263ffffffff60a01b199091161790556200022443428562000229565b505050565b60095415801590620002f8575060085460098054600160a01b830463ffffffff1692600160c01b90046001600160401b03169081106200026d576200026d620005cb565b600091825260209091206002909102015460098054680100000000000000009092046001600160401b031691620002a790600190620005f7565b81548110620002ba57620002ba620005cb565b6000918252602090912060029091020154620002ec91906801000000000000000090046001600160401b031662000613565b6001600160401b031610155b156200039257600854600980549091600160c01b90046001600160401b0316908110620003295762000329620005cb565b60009182526020822060029091020180546001600160c01b03191681556001015560088054600160c01b90046001600160401b03169060186200036c836200063d565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b0394851681529284166020808501918252830151851684830190815292909101516060840190815260098054600181018255600091909152935160029094027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81018054935194518716600160801b02600160801b600160c01b031995881668010000000000000000026001600160801b03199095169690971695909517929092179290921693909317909155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b090910155565b604051606081016001600160401b0381118282101715620004a957634e487b7160e01b600052604160045260246000fd5b60405290565b604051608081016001600160401b0381118282101715620004a957634e487b7160e01b600052604160045260246000fd5b80516001600160401b0381168114620004f857600080fd5b919050565b805163ffffffff81168114620004f857600080fd5b60008060008385036101008112156200052a57600080fd5b60608112156200053957600080fd5b6200054362000478565b6200054e86620004e0565b81526200055e60208701620004e0565b60208201526040868101519082015293506080605f19820112156200058257600080fd5b506200058d620004af565b60608581015182526080860151602083015260a0860151604083015260c0860151908201529150620005c260e08501620004fd565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156200060d576200060d620005e1565b92915050565b6001600160401b03828116828216039080821115620006365762000636620005e1565b5092915050565b60006001600160401b038281166002600160401b03198101620006645762000664620005e1565b6001019392505050565b608051612ce362000698600039600081816111590152818161118201526113010152612ce36000f3fe60806040526004361061019c5760003560e01c80638584d23f116100ec578063c23b9e9e1161008a578063e030330111610064578063e0303301146105ef578063f2fde38b1461060f578063f56761601461062f578063f9e50d191461064f57600080fd5b8063c23b9e9e1461056a578063c8e5e498146105a3578063d24d933d146105bf57600080fd5b80639baa3cc9116100c65780639baa3cc91461045e5780639fdb54a71461047e578063ad3cb1cc146104d4578063b5adea3c1461051257600080fd5b80638584d23f146103e15780638da5cb5b1461040157806396c1ca611461043e57600080fd5b8063313df7b11161015957806352d1902d1161013357806352d1902d1461036857806369cc6a041461038b578063715018a6146103a0578063826e41fc146103b557600080fd5b8063313df7b1146102da578063426d3194146103125780634f1ef2861461035557600080fd5b8063013fa5fc146101a157806302b592f3146101c35780630d8e6e2c146102215780632063d4f71461024e5780632d52aad61461026e5780632f79889d1461029b575b600080fd5b3480156101ad57600080fd5b506101c16101bc366004612157565b610664565b005b3480156101cf57600080fd5b506101e36101de366004612172565b610717565b60405161021894939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b34801561022d57600080fd5b50604080516001815260006020820181905291810191909152606001610218565b34801561025a57600080fd5b506101c16102693660046122e8565b610762565b34801561027a57600080fd5b506101c1610289366004612172565b600a805460ff19166001179055600b55565b3480156102a757600080fd5b506008546102c290600160c01b90046001600160401b031681565b6040516001600160401b039091168152602001610218565b3480156102e657600080fd5b506008546102fa906001600160a01b031681565b6040516001600160a01b039091168152602001610218565b34801561031e57600080fd5b506000546001546002546003546103359392919084565b604080519485526020850193909352918301526060820152608001610218565b6101c161036336600461249c565b6108b7565b34801561037457600080fd5b5061037d6108d6565b604051908152602001610218565b34801561039757600080fd5b506101c16108f3565b3480156103ac57600080fd5b506101c1610962565b3480156103c157600080fd5b506008546001600160a01b031615155b6040519015158152602001610218565b3480156103ed57600080fd5b5061037d6103fc366004612172565b610974565b34801561040d57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166102fa565b34801561044a57600080fd5b506101c1610459366004612555565b610a9b565b34801561046a57600080fd5b506101c1610479366004612570565b610b10565b34801561048a57600080fd5b506006546007546104ae916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610218565b3480156104e057600080fd5b50610505604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102189190612620565b34801561051e57600080fd5b506101c161052d366004612653565b80516006805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905560400151600755565b34801561057657600080fd5b5060085461058e90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610218565b3480156105af57600080fd5b506101c1600a805460ff19169055565b3480156105cb57600080fd5b506004546005546104ae916001600160401b0380821692600160401b909204169083565b3480156105fb57600080fd5b506103d161060a36600461266f565b610c34565b34801561061b57600080fd5b506101c161062a366004612157565b610c6a565b34801561063b57600080fd5b506101c161064a366004612691565b610cad565b34801561065b57600080fd5b5060095461037d565b61066c610d5b565b6001600160a01b0381166106935760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036106c25760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b6009818154811061072757600080fd5b6000918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b6008546001600160a01b03161515801561078757506008546001600160a01b03163314155b156107a5576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806107de575060065460208301516001600160401b03600160401b9092048216911611155b156107fc5760405163051c46ef60e01b815260040160405180910390fd5b6108098260400151610db6565b6108138282610e26565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561085a434284610f1e565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516108ab91815260200190565b60405180910390a35050565b6108bf61114e565b6108c8826111f3565b6108d28282611234565b5050565b60006108e06112f6565b50600080516020612cb783398151915290565b6108fb610d5b565b6008546001600160a01b03161561094757600880546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b61096a610d5b565b610960600061133f565b6009805460009161098660018361279c565b81548110610996576109966127af565b6000918252602090912060029091020154600160801b90046001600160401b031683106109d657604051631856a49960e21b815260040160405180910390fd5b600854600160c01b90046001600160401b03165b81811015610a63578360098281548110610a0657610a066127af565b6000918252602090912060029091020154600160801b90046001600160401b03161115610a5b5760098181548110610a4057610a406127af565b90600052602060002090600202016001015492505050919050565b6001016109ea565b506009610a7160018361279c565b81548110610a8157610a816127af565b906000526020600020906002020160010154915050919050565b610aa3610d5b565b610e108163ffffffff161080610acc575060085463ffffffff600160a01b909104811690821611155b15610aea576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610b555750825b90506000826001600160401b03166001148015610b715750303b155b905081158015610b7f575080155b15610b9d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610bc757845460ff60401b1916600160401b1785555b610bd0866113b0565b610bd86113c1565b610be38989896113c9565b8315610c2957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600a5460009060ff16610c5057610c4b83836114d4565b610c61565b81600b5484610c5f919061279c565b115b90505b92915050565b610c72610d5b565b6001600160a01b038116610ca157604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610caa8161133f565b50565b610cb960096000611e45565b60005b81518110156108d2576009828281518110610cd957610cd96127af565b602090810291909101810151825460018181018555600094855293839020825160029092020180549383015160408401516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026001600160801b031990971691909416179490941793909316178255606001519082015501610cbc565b33610d8d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109605760405163118cdaa760e01b8152336004820152602401610c98565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806108d25760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610c98565b6000610e306115ec565b9050610e3a611e66565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a083015260005460c08301525163ce537a7760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063ce537a7790610eba908590859088906004016129cc565b602060405180830381865af4158015610ed7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efb9190612bfb565b610f18576040516309bde33960e01b815260040160405180910390fd5b50505050565b60095415801590610fd8575060085460098054600160a01b830463ffffffff1692600160c01b90046001600160401b0316908110610f5e57610f5e6127af565b600091825260209091206002909102015460098054600160401b9092046001600160401b031691610f919060019061279c565b81548110610fa157610fa16127af565b6000918252602090912060029091020154610fcc9190600160401b90046001600160401b0316612c1d565b6001600160401b031610155b1561106c57600854600980549091600160c01b90046001600160401b0316908110611005576110056127af565b60009182526020822060029091020180546001600160c01b03191681556001015560088054600160c01b90046001600160401b031690601861104683612c44565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b0394851681529284166020808501918252830151851684830190815292909101516060840190815260098054600181018255600091909152935160029094027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b090910155565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806111d557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111c9600080516020612cb7833981519152546001600160a01b031690565b6001600160a01b031614155b156109605760405163703e46dd60e11b815260040160405180910390fd5b6111fb610d5b565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161070c565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561128e575060408051601f3d908101601f1916820190925261128b91810190612c6a565b60015b6112b657604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610c98565b600080516020612cb783398151915281146112e757604051632a87526960e21b815260048101829052602401610c98565b6112f18383611c1c565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109605760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6113b8611c72565b610caa81611cbb565b610960611c72565b82516001600160401b03161515806113ed575060208301516001600160401b031615155b806113fa57506020820151155b8061140757506040820151155b8061141457506060820151155b8061141e57508151155b1561143c576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a01b0263ffffffff60a01b199091161790556112f1434285610f1e565b600954600090438411806114e85750600381105b156115065760405163b0b4387760e01b815260040160405180910390fd5b6000808061151560018561279c565b90505b816115b7578660098281548110611531576115316127af565b60009182526020909120600290910201546001600160401b031611611584576001915060098181548110611567576115676127af565b60009182526020909120600290910201546001600160401b031692505b600281106115b757600854600160c01b90046001600160401b031681146115b757806115af81612c83565b915050611518565b816115d55760405163b0b4387760e01b815260040160405180910390fd5b856115e0848961279c565b11979650505050505050565b6115f4611e84565b620100008152600760208201527f1369aa78dc50135ad756d62c97a64a0edcd30066584168200d9d1facf82ca4f56040820151527f2cf23456d712b06f8e3aa5bf0acc3e46a3d094602a3a2b99d873bba05a4391476020604083015101527f08a35f379d2d2c490a51006697275e4db79b67b4a175c1477e262d29e25e42316060820151527f218828131bb7940ccc88c561b299755af4bf0b71ed930b129e8be0a1218139ea6020606083015101527f23a2172436c1145b36d5bc6d3b31fa1610c73a543ea443918aaa3ee175f9921b6080820151527f2502adf404d62877c310214ae9942e93c40b154d34c024bab48a3ca057e60a116020608083015101527f1bb88ada91ab7734882f7826b81275320081ac485f9cf8bfbc3ba54b6eb4dff360a0820151527f25c74a27e9a3b20114a3a91f31c20f01777e7ed913e0ef949f0285e2e7c2069b602060a083015101527f12b0ce76ac8b0dbd405ebc5dd0bae0f91aed50033c7ea36fc62aaba2b98333dc60c0820151527f185b42af49dd1cbe337a84f74b704172428e754a0bea024ab3eb2f996afb2c47602060c083015101527f21f53ad4538b45438bbf0521446070223920e3df6f9022a64cc16d7f94e85c0860e0820151527f2278ac3dedfdac7feb9725a022497175518eada52c8932fc40e6e75bea889fb8602060e083015101527f0876136f81c16298487bfb1be74d4a3487ec45645ab1d09dc2e5b865d62230df610100820151527f098c641c947ecd798dfd5e1b2fe428024cdf03061a53ff774ea8a9e3de9d3f2b602061010083015101527f15eaac2c6232d2268bf79dc47ed9666f992fb3d96ad23fb21690c21586c5472e610120820151527f0f10f1ffc54881287fda6f200bc85d8245b508d844a974098a41119867b325d0602061012083015101527f0895ceea40b085534e9739ca5442ba48b3a3592affde2b509df74521b47d8ab0610140820151527f2e12ec5800ac92fe2a8e7040bc5b435b9eb71e31380173fa7688bf81fcbba455602061014083015101527f2f5384eb5653e47576efe248e7903f463243414bfed5237dda750df3996bd918610160820151527f1c3cd6b11da8704cdc871ab4fa323d7ee57bd40ce165b49a56d5ef6489cd251a602061016083015101527f13579994957ce1554cc1e5b194fb63c9513707f627414f8442681ae736e36450610180820151527f26c9bdcd96d8e420b12974ade93ad9c312c4185213d2f6831a7c625a18890e95602061018083015101527f0cc70a1d542a9a1535ae5d9201696adc5c99c1bcebd9951dfa8afec79fa0b6446101a0820151527f10b043d9f1869181b96579d6616efc17a5df7b84c4d431d966c9094bf1e8815360206101a083015101527f198a65309d131a43b0ab1c47659d0336cfbf62b27f4727106b4fd971c73dd4036101c0820151527f23df99eac3c1947903b211b800efeb76f47d5e87b7414866543492e8c7798d1a60206101c083015101527f221cc5e47b81ce8dcfa72ef981916a8eddef12fcde59c56c62830c126ebef0de6101e0820151527f231f99340c35c9e09652a6df73c9cec5d88738cb71ff45716fdc9e9e45a4926e60206101e083015101527f2c9f1489fce0f263e03f3e97bf0a72273aafcca9325ff47786adb04a52a6d22c610200820151527f21f66e28f17e01e9fd593e16d022c4eca25bd5db96daec606d97b604cc414838602061020083015101527f2015745604a9571e226bd99043cfaf1f96267cc5de67f497563ff81100531d26610220820151527f206889ff4c58dd08ee1107191a2a5bc5dbae55c49d7d8397801799868d10f805602061022083015101527f21062ab8f8ecd8932b429a1eb8614b1e03db61bff6a5cd2d5d7ea193e90e9927610240820151527f217f9b27b934b88ffe555d682dfe6e8b6d503f86b14bbd96342bc48487a60b27602061024083015101527f1c9eda2d195cb731f903235ead6a4f7c66db49da713ecb27afee076f0eea7154610260820151527f2647c161c00b90258e1cefebb17481f8a5d91b5f9dca626e3e89a9215bcca16a602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611c2582611cc3565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611c6a576112f18282611d28565b6108d2611d9e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661096057604051631afcd79f60e31b815260040160405180910390fd5b610c72611c72565b806001600160a01b03163b600003611cf957604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610c98565b600080516020612cb783398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611d459190612c9a565b600060405180830381855af49150503d8060008114611d80576040519150601f19603f3d011682016040523d82523d6000602084013e611d85565b606091505b5091509150611d95858383611dbd565b95945050505050565b34156109605760405163b398979f60e01b815260040160405180910390fd5b606082611dd257611dcd82611e1c565b611e15565b8151158015611de957506001600160a01b0384163b155b15611e1257604051639996b31560e01b81526001600160a01b0385166004820152602401610c98565b50805b9392505050565b805115611e2c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546000825560020290600052602060002090810190610caa9190612111565b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611ebb604051806040016040528060008152602001600081525090565b8152602001611edd604051806040016040528060008152602001600081525090565b8152602001611eff604051806040016040528060008152602001600081525090565b8152602001611f21604051806040016040528060008152602001600081525090565b8152602001611f43604051806040016040528060008152602001600081525090565b8152602001611f65604051806040016040528060008152602001600081525090565b8152602001611f87604051806040016040528060008152602001600081525090565b8152602001611fa9604051806040016040528060008152602001600081525090565b8152602001611fcb604051806040016040528060008152602001600081525090565b8152602001611fed604051806040016040528060008152602001600081525090565b815260200161200f604051806040016040528060008152602001600081525090565b8152602001612031604051806040016040528060008152602001600081525090565b8152602001612053604051806040016040528060008152602001600081525090565b8152602001612075604051806040016040528060008152602001600081525090565b8152602001612097604051806040016040528060008152602001600081525090565b81526020016120b9604051806040016040528060008152602001600081525090565b81526020016120db604051806040016040528060008152602001600081525090565b81526020016120fd604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b5b808211156121375780546001600160c01b031916815560006001820155600201612112565b5090565b80356001600160a01b038116811461215257600080fd5b919050565b60006020828403121561216957600080fd5b610c618261213b565b60006020828403121561218457600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b03811182821017156121c4576121c461218b565b60405290565b604051608081016001600160401b03811182821017156121c4576121c461218b565b604051601f8201601f191681016001600160401b03811182821017156122145761221461218b565b604052919050565b80356001600160401b038116811461215257600080fd5b60006060828403121561224557600080fd5b604051606081018181106001600160401b03821117156122675761226761218b565b6040529050806122768361221c565b81526122846020840161221c565b6020820152604083013560408201525092915050565b6000604082840312156122ac57600080fd5b604051604081018181106001600160401b03821117156122ce576122ce61218b565b604052823581526020928301359281019290925250919050565b6000808284036104e08112156122fd57600080fd5b6123078585612233565b925061048080605f198301121561231d57600080fd5b6123256121a1565b9150612334866060870161229a565b82526123438660a0870161229a565b60208301526123558660e0870161229a565b60408301526101206123698782880161229a565b606084015261016061237d8882890161229a565b60808501526101a061239189828a0161229a565b60a08601526101e06123a58a828b0161229a565b60c08701526102206123b98b828c0161229a565b60e08801526102606123cd8c828d0161229a565b6101008901526102a06123e28d828e0161229a565b878a01526123f48d6102e08e0161229a565b6101408a01526124088d6103208e0161229a565b868a015261241a8d6103608e0161229a565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b600080604083850312156124af57600080fd5b6124b88361213b565b91506020808401356001600160401b03808211156124d557600080fd5b818601915086601f8301126124e957600080fd5b8135818111156124fb576124fb61218b565b61250d601f8201601f191685016121ec565b9150808252878482850101111561252357600080fd5b80848401858401376000848284010152508093505050509250929050565b803563ffffffff8116811461215257600080fd5b60006020828403121561256757600080fd5b610c6182612541565b60008060008084860361012081121561258857600080fd5b6125928787612233565b94506080605f19820112156125a657600080fd5b506125af6121ca565b60608681013582526080870135602083015260a0870135604083015260c08701359082015292506125e260e08601612541565b91506125f1610100860161213b565b905092959194509250565b60005b838110156126175781810151838201526020016125ff565b50506000910152565b602081526000825180602084015261263f8160408501602087016125fc565b601f01601f19169190910160400192915050565b60006060828403121561266557600080fd5b610c618383612233565b6000806040838503121561268257600080fd5b50508035926020909101359150565b600060208083850312156126a457600080fd5b82356001600160401b03808211156126bb57600080fd5b818501915085601f8301126126cf57600080fd5b8135818111156126e1576126e161218b565b6126ef848260051b016121ec565b818152848101925060079190911b83018401908782111561270f57600080fd5b928401925b8184101561277b576080848903121561272d5760008081fd5b6127356121ca565b61273e8561221c565b815261274b86860161221c565b86820152604061275c81870161221c565b9082015260608581013590820152835260809093019291840191612714565b979650505050505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c6457610c64612786565b634e487b7160e01b600052603260045260246000fd5b8060005b6007811015610f185781518452602093840193909101906001016127c9565b6127fd82825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006128608185018380518252602090810151910152565b60a083015191506101406128808186018480518252602090810151910152565b60c084015192506101806128a08187018580518252602090810151910152565b60e085015193506101c06128c08188018680518252602090810151910152565b928501519350610200926128e08785018680518252602090810151910152565b61012086015194506102406129018189018780518252602090810151910152565b928601519450610280926129218885018780518252602090810151910152565b61016087015195506102c0612942818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a6082019050845182526020850151602083015260408501516129ff604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612a4c8185018380518252602090810151910152565b60c08701519150610140612a6c8186018480518252602090810151910152565b60e08801519250610180612a8c8187018580518252602090810151910152565b9188015192506101c091612aac8684018580518252602090810151910152565b6101208901519350610200612acd8188018680518252602090810151910152565b91890151935061024091612aed8784018680518252602090810151910152565b6101608a01519450610280612b0e8189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612be56105008301856127c5565b612bf36105e08301846127e8565b949350505050565b600060208284031215612c0d57600080fd5b81518015158114611e1557600080fd5b6001600160401b03828116828216039080821115612c3d57612c3d612786565b5092915050565b60006001600160401b03808316818103612c6057612c60612786565b6001019392505050565b600060208284031215612c7c57600080fd5b5051919050565b600081612c9257612c92612786565b506000190190565b60008251612cac8184602087016125fc565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json index dc52c561d..85e43ddb9 100644 --- a/contract-bindings/artifacts/LightClient_bytecode.json +++ b/contract-bindings/artifacts/LightClient_bytecode.json @@ -1 +1 @@ -"0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000da565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000775760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612971620001046000396000818161105d01528181611086015261120501526129716000f3fe6080604052600436106101405760003560e01c80638584d23f116100b6578063bd32519a1161006f578063bd32519a14610456578063c23b9e9e14610487578063d24d933d146104c0578063e0303301146104f0578063f2fde38b14610510578063f9e50d191461053057600080fd5b80638584d23f146103255780638da5cb5b1461034557806396c1ca61146103825780639baa3cc9146103a25780639fdb54a7146103c2578063ad3cb1cc1461041857600080fd5b8063313df7b111610108578063313df7b11461024a578063426d3194146102825780634f1ef286146102c557806352d1902d146102d857806369cc6a04146102fb578063715018a61461031057600080fd5b8063013fa5fc1461014557806302b592f3146101675780630d8e6e2c146101c55780632063d4f7146101f25780632f79889d14610212575b600080fd5b34801561015157600080fd5b50610165610160366004611ef7565b610545565b005b34801561017357600080fd5b50610187610182366004611f12565b610602565b6040516101bc94939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b3480156101d157600080fd5b506040805160018152600060208201819052918101919091526060016101bc565b3480156101fe57600080fd5b5061016561020d366004612066565b61064d565b34801561021e57600080fd5b50600954610232906001600160401b031681565b6040516001600160401b0390911681526020016101bc565b34801561025657600080fd5b5060085461026a906001600160a01b031681565b6040516001600160a01b0390911681526020016101bc565b34801561028e57600080fd5b506000546001546002546003546102a59392919084565b6040805194855260208501939093529183015260608201526080016101bc565b6101656102d336600461221a565b6107a1565b3480156102e457600080fd5b506102ed6107c0565b6040519081526020016101bc565b34801561030757600080fd5b506101656107dd565b34801561031c57600080fd5b5061016561084d565b34801561033157600080fd5b506102ed610340366004611f12565b61085f565b34801561035157600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031661026a565b34801561038e57600080fd5b5061016561039d3660046122d3565b61097f565b3480156103ae57600080fd5b506101656103bd3660046122ee565b6109f4565b3480156103ce57600080fd5b506006546007546103f2916001600160401b0380821692600160401b909204169083565b604080516001600160401b039485168152939092166020840152908201526060016101bc565b34801561042457600080fd5b50610449604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101bc91906123bf565b34801561046257600080fd5b5060085461047790600160a01b900460ff1681565b60405190151581526020016101bc565b34801561049357600080fd5b506008546104ab90600160a81b900463ffffffff1681565b60405163ffffffff90911681526020016101bc565b3480156104cc57600080fd5b506004546005546103f2916001600160401b0380821692600160401b909204169083565b3480156104fc57600080fd5b5061047761050b3660046123f2565b610b18565b34801561051c57600080fd5b5061016561052b366004611ef7565b610c2b565b34801561053c57600080fd5b50600a546102ed565b61054d610c6e565b6001600160a01b0381166105745760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036105a35760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a81b0319166001600160a01b0383811691909117600160a01b1791829055604051911681527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600a818154811061061257600080fd5b6000918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b600854600160a01b900460ff16801561067157506008546001600160a01b03163314155b1561068f576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806106c8575060065460208301516001600160401b03600160401b9092048216911611155b156106e65760405163051c46ef60e01b815260040160405180910390fd5b6106f38260400151610cc9565b6106fd8282610d39565b81516006805460208501516001600160401b03908116600160401b026001600160801b03199092169316929092179190911790556040820151600755610744434284610e31565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6846040015160405161079591815260200190565b60405180910390a35050565b6107a9611052565b6107b2826110f7565b6107bc8282611138565b5050565b60006107ca6111fa565b5060008051602061294583398151915290565b6107e5610c6e565b600854600160a01b900460ff161561083257600880546001600160a81b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610855610c6e565b61084b6000611243565b600a805460009161087160018361242a565b815481106108815761088161243d565b6000918252602090912060029091020154600160801b90046001600160401b031683106108c157604051631856a49960e21b815260040160405180910390fd5b6009546001600160401b03165b818110156109475783600a82815481106108ea576108ea61243d565b6000918252602090912060029091020154600160801b90046001600160401b0316111561093f57600a81815481106109245761092461243d565b90600052602060002090600202016001015492505050919050565b6001016108ce565b50600a61095560018361242a565b815481106109655761096561243d565b906000526020600020906002020160010154915050919050565b610987610c6e565b610e108163ffffffff1610806109b0575060085463ffffffff600160a81b909104811690821611155b156109ce576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a81b0263ffffffff60a81b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610a395750825b90506000826001600160401b03166001148015610a555750303b155b905081158015610a63575080155b15610a815760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610aab57845460ff60401b1916600160401b1785555b610ab4866112b4565b610abc6112c5565b610ac78989896112cd565b8315610b0d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600a5460009043841180610b2c5750600381105b15610b4a5760405163b0b4387760e01b815260040160405180910390fd5b60008080610b5960018561242a565b90505b81610bf45786600a8281548110610b7557610b7561243d565b60009182526020909120600290910201546001600160401b031611610bc85760019150600a8181548110610bab57610bab61243d565b60009182526020909120600290910201546001600160401b031692505b60028110610bf4576009546001600160401b03168114610bf45780610bec81612453565b915050610b5c565b81610c125760405163b0b4387760e01b815260040160405180910390fd5b85610c1d848961242a565b119450505050505b92915050565b610c33610c6e565b6001600160a01b038116610c6257604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610c6b81611243565b50565b33610ca07f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461084b5760405163118cdaa760e01b8152336004820152602401610c59565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806107bc5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610c59565b6000610d436113d8565b9050610d4d611c30565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a083015260005460c08301525163ce537a7760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063ce537a7790610dcd90859085908890600401612671565b602060405180830381865af4158015610dea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0e91906128a0565b610e2b576040516309bde33960e01b815260040160405180910390fd5b50505050565b600a5415801590610eea5750600854600954600a8054600160a81b90930463ffffffff169290916001600160401b0316908110610e7057610e7061243d565b6000918252602090912060029091020154600a8054600160401b9092046001600160401b031691610ea39060019061242a565b81548110610eb357610eb361243d565b6000918252602090912060029091020154610ede9190600160401b90046001600160401b03166128c2565b6001600160401b031610155b15610f7057600954600a805490916001600160401b0316908110610f1057610f1061243d565b60009182526020822060029091020180546001600160c01b0319168155600101819055600980546001600160401b031691610f4a836128e9565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600a8054600181018255600091909152935160029094027fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a881018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a990910155565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110d957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110cd600080516020612945833981519152546001600160a01b031690565b6001600160a01b031614155b1561084b5760405163703e46dd60e11b815260040160405180910390fd5b6110ff610c6e565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d906020016105f7565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611192575060408051601f3d908101601f1916820190925261118f9181019061290f565b60015b6111ba57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610c59565b60008051602061294583398151915281146111eb57604051632a87526960e21b815260048101829052602401610c59565b6111f58383611a07565b505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461084b5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6112bc611a5d565b610c6b81611aa6565b61084b611a5d565b82516001600160401b03161515806112f1575060208301516001600160401b031615155b806112fe57506020820151155b8061130b57506040820151155b8061131857506060820151155b8061132257508151155b15611340576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a81b0263ffffffff60a81b199091161790556111f5434285610e31565b6113e0611c4e565b621000008152600760208201527f23783d0e9777b7af65fbf849da7edb75e74b1eaf503e025d7f2f7f80991befa26040820151527f2a4e2fe8adfa53f468525582d5184c4c70bbdb946c21f216418a9879705e54a76020604083015101527f0624b2c1e77f24afceaf39451743b9fa80d5853fca7ba00389c675650774009b6060820151527f250d7719e94ca2df00dfe327938f5a8d4d837779b99837ca777a53d39127b1796020606083015101527f0dc09515152eaea66d0db2f571cc995e369d26fe647394f10db5398c917519dc6080820151527f1273144d6cec2c4a68b24a149379c0f5592bb7fbddbe32fa171919950ca404cb6020608083015101527f119521bb68caec216e2f05eeb466fb3abfe1f39baf7fe7cb392ea057b6a2d9bf60a0820151527f2d52adeaba8045e53ab526fe9982d0ea452def6b3ea0253d27a19ef3b46e8428602060a083015101527f16c3b5b217d302975a920d13374524d7a52e4a50fd7fb930842271ebf4a84efd60c0820151527f200788916b907b196972bde304318e885a2521514b2db5e4a11899c51204f089602060c083015101527f1127581afe753defca9aef12e7332db9978a200b1699ce3888c0f3aea6111dc360e0820151527f0881e13f00723be1a04872ed02b2d078c31e80feaf27724e262ce97c2cb0bb1d602060e083015101527f1482a3a6bb91d6483d153683e2404f2f5546e0e895530fdf132091498406e3de610100820151527efa52db3d52d905ead1248102f3a80a43a90d8400c68f60a62c543c417b2f4b602061010083015101527f0a57dadd4a55199525ac6ac6fabc87a4cccfdc98142bcef9dbf47de00ecc5164610120820151527f18d95abd9b8e12c36936aa218cfff582548a6bbff25c338c2006eaeb1fe5b696602061012083015101527f2bc40e91dd169b8bc143a02952a1b6c6e627bfeb7a2bbe5078e14123f3c54c1c610140820151527f108d65a20c579b6d9883275eb6889fc3f5fc79735ca9f611a13b67daa2fbc8d0602061014083015101527f21bc1f86d0608e5f0626b467ee6f8282b619223f60a7acb0fc63ba7bdaf783be610160820151527f05ef3282f8eef01515fb9a8a7d6ca06b8b007d1d512403efb268fb03ce5f09e9602061016083015101527f2cab66c1cb5a83869e73ac34fbe467486999babd541d9010ee9a804806eee4ef610180820151527f2db1982419c5a4a17593acff9535fa967683d75c8aec01319b64b84aada2ad84602061018083015101527f2c38667c6c7eb868bdd30c34dd3f4b84d9b9b1a27d7867b364c8b7831423e9086101a0820151527f2b2cb4044dd51165c48138219d51cf8d1689f91ed3eeefead6e055eb488a2ce260206101a083015101527f2d48e54703011df2c74a14dafde3af4fd83ec71875d8ddc3554658640cc955016101c0820151527f243a99d80d32eb5408b59d5b08302bede070d3fb0a8efe2f2262f865bffb4d0d60206101c083015101527f0455d2325bf6269a66f07d838f55f36947a3cd9b87edd8480bced95cbb45cc116101e0820151527f0f66d9085a6ed60b838179987e240992bff4c0516ccf6ccde4a1ca94ce8b986460206101e083015101527f2bac0d23c8585d1487ec611b5effc97e5852fea43a7cba36ccdd2c207931f394610200820151527f1860b54e01a06aea5adb4b13bf5baebab92b736807a3a89ff2040992b06ee6ec602061020083015101527f0c0bfa1c2fc6f8ed01233d5168db1e1dfe725504f032f669f50a92ae77c72906610220820151527f0d741e124c7d1069b8a400cbcdcfd90128a533901ad4de1e037fe72984dc34cf602061022083015101527f01cfed30085c9efce04668205794aa39b1a8ee591234b4c77a22f8c26d899e05610240820151527f2ab68ac82d36cedb647d14a5b0035e8c9a0be84780b7bae1133a27a880966ed1602061024083015101527f072e1d50f8b5cf8d574b3847276477d95bbd5116351000841f728da44f4043b5610260820151527f23f8ea6eacd0876d57220f57eabacbe76a2323411663731a251d5dca36f1b59f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611a1082611aae565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611a55576111f58282611b13565b6107bc611b89565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661084b57604051631afcd79f60e31b815260040160405180910390fd5b610c33611a5d565b806001600160a01b03163b600003611ae457604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610c59565b60008051602061294583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611b309190612928565b600060405180830381855af49150503d8060008114611b6b576040519150601f19603f3d011682016040523d82523d6000602084013e611b70565b606091505b5091509150611b80858383611ba8565b95945050505050565b341561084b5760405163b398979f60e01b815260040160405180910390fd5b606082611bbd57611bb882611c07565b611c00565b8151158015611bd457506001600160a01b0384163b155b15611bfd57604051639996b31560e01b81526001600160a01b0385166004820152602401610c59565b50805b9392505050565b805115611c175780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611c85604051806040016040528060008152602001600081525090565b8152602001611ca7604051806040016040528060008152602001600081525090565b8152602001611cc9604051806040016040528060008152602001600081525090565b8152602001611ceb604051806040016040528060008152602001600081525090565b8152602001611d0d604051806040016040528060008152602001600081525090565b8152602001611d2f604051806040016040528060008152602001600081525090565b8152602001611d51604051806040016040528060008152602001600081525090565b8152602001611d73604051806040016040528060008152602001600081525090565b8152602001611d95604051806040016040528060008152602001600081525090565b8152602001611db7604051806040016040528060008152602001600081525090565b8152602001611dd9604051806040016040528060008152602001600081525090565b8152602001611dfb604051806040016040528060008152602001600081525090565b8152602001611e1d604051806040016040528060008152602001600081525090565b8152602001611e3f604051806040016040528060008152602001600081525090565b8152602001611e61604051806040016040528060008152602001600081525090565b8152602001611e83604051806040016040528060008152602001600081525090565b8152602001611ea5604051806040016040528060008152602001600081525090565b8152602001611ec7604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b80356001600160a01b0381168114611ef257600080fd5b919050565b600060208284031215611f0957600080fd5b611c0082611edb565b600060208284031215611f2457600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b0381118282101715611f6457611f64611f2b565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611f9257611f92611f2b565b604052919050565b80356001600160401b0381168114611ef257600080fd5b600060608284031215611fc357600080fd5b604051606081018181106001600160401b0382111715611fe557611fe5611f2b565b604052905080611ff483611f9a565b815261200260208401611f9a565b6020820152604083013560408201525092915050565b60006040828403121561202a57600080fd5b604051604081018181106001600160401b038211171561204c5761204c611f2b565b604052823581526020928301359281019290925250919050565b6000808284036104e081121561207b57600080fd5b6120858585611fb1565b925061048080605f198301121561209b57600080fd5b6120a3611f41565b91506120b28660608701612018565b82526120c18660a08701612018565b60208301526120d38660e08701612018565b60408301526101206120e787828801612018565b60608401526101606120fb88828901612018565b60808501526101a061210f89828a01612018565b60a08601526101e06121238a828b01612018565b60c08701526102206121378b828c01612018565b60e088015261026061214b8c828d01612018565b6101008901526102a06121608d828e01612018565b878a01526121728d6102e08e01612018565b6101408a01526121868d6103208e01612018565b868a01526121988d6103608e01612018565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b6000806040838503121561222d57600080fd5b61223683611edb565b91506020808401356001600160401b038082111561225357600080fd5b818601915086601f83011261226757600080fd5b81358181111561227957612279611f2b565b61228b601f8201601f19168501611f6a565b915080825287848285010111156122a157600080fd5b80848401858401376000848284010152508093505050509250929050565b803563ffffffff81168114611ef257600080fd5b6000602082840312156122e557600080fd5b611c00826122bf565b60008060008084860361012081121561230657600080fd5b6123108787611fb1565b94506080605f198201121561232457600080fd5b50604051608081018181106001600160401b038211171561234757612347611f2b565b8060405250606086013581526080860135602082015260a0860135604082015260c086013560608201528093505061238160e086016122bf565b91506123906101008601611edb565b905092959194509250565b60005b838110156123b657818101518382015260200161239e565b50506000910152565b60208152600082518060208401526123de81604085016020870161239b565b601f01601f19169190910160400192915050565b6000806040838503121561240557600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c2557610c25612414565b634e487b7160e01b600052603260045260246000fd5b60008161246257612462612414565b506000190190565b8060005b6007811015610e2b57815184526020938401939091019060010161246e565b6124a282825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006125058185018380518252602090810151910152565b60a083015191506101406125258186018480518252602090810151910152565b60c084015192506101806125458187018580518252602090810151910152565b60e085015193506101c06125658188018680518252602090810151910152565b928501519350610200926125858785018680518252602090810151910152565b61012086015194506102406125a68189018780518252602090810151910152565b928601519450610280926125c68885018780518252602090810151910152565b61016087015195506102c06125e7818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a6082019050845182526020850151602083015260408501516126a4604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a08501516101006126f18185018380518252602090810151910152565b60c087015191506101406127118186018480518252602090810151910152565b60e088015192506101806127318187018580518252602090810151910152565b9188015192506101c0916127518684018580518252602090810151910152565b61012089015193506102006127728188018680518252602090810151910152565b918901519350610240916127928784018680518252602090810151910152565b6101608a015194506102806127b38189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e083015261288a61050083018561246a565b6128986105e083018461248d565b949350505050565b6000602082840312156128b257600080fd5b81518015158114611c0057600080fd5b6001600160401b038281168282160390808211156128e2576128e2612414565b5092915050565b60006001600160401b0380831681810361290557612905612414565b6001019392505050565b60006020828403121561292157600080fd5b5051919050565b6000825161293a81846020870161239b565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" +"0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000da565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000775760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b60805161298662000104600039600081816110720152818161109b015261121a01526129866000f3fe6080604052600436106101405760003560e01c8063826e41fc116100b6578063ad3cb1cc1161006f578063ad3cb1cc1461044b578063c23b9e9e14610489578063d24d933d146104c2578063e0303301146104f2578063f2fde38b14610512578063f9e50d191461053257600080fd5b8063826e41fc1461032c5780638584d23f146103585780638da5cb5b1461037857806396c1ca61146103b55780639baa3cc9146103d55780639fdb54a7146103f557600080fd5b8063313df7b111610108578063313df7b114610251578063426d3194146102895780634f1ef286146102cc57806352d1902d146102df57806369cc6a0414610302578063715018a61461031757600080fd5b8063013fa5fc1461014557806302b592f3146101675780630d8e6e2c146101c55780632063d4f7146101f25780632f79889d14610212575b600080fd5b34801561015157600080fd5b50610165610160366004611f0c565b610547565b005b34801561017357600080fd5b50610187610182366004611f27565b6105fa565b6040516101bc94939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b3480156101d157600080fd5b506040805160018152600060208201819052918101919091526060016101bc565b3480156101fe57600080fd5b5061016561020d36600461207b565b610645565b34801561021e57600080fd5b5060085461023990600160c01b90046001600160401b031681565b6040516001600160401b0390911681526020016101bc565b34801561025d57600080fd5b50600854610271906001600160a01b031681565b6040516001600160a01b0390911681526020016101bc565b34801561029557600080fd5b506000546001546002546003546102ac9392919084565b6040805194855260208501939093529183015260608201526080016101bc565b6101656102da36600461222f565b61079a565b3480156102eb57600080fd5b506102f46107b9565b6040519081526020016101bc565b34801561030e57600080fd5b506101656107d6565b34801561032357600080fd5b50610165610845565b34801561033857600080fd5b506008546001600160a01b031615155b60405190151581526020016101bc565b34801561036457600080fd5b506102f4610373366004611f27565b610857565b34801561038457600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610271565b3480156103c157600080fd5b506101656103d03660046122e8565b61097e565b3480156103e157600080fd5b506101656103f0366004612303565b6109f3565b34801561040157600080fd5b50600654600754610425916001600160401b0380821692600160401b909204169083565b604080516001600160401b039485168152939092166020840152908201526060016101bc565b34801561045757600080fd5b5061047c604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101bc91906123d4565b34801561049557600080fd5b506008546104ad90600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101bc565b3480156104ce57600080fd5b50600454600554610425916001600160401b0380821692600160401b909204169083565b3480156104fe57600080fd5b5061034861050d366004612407565b610b17565b34801561051e57600080fd5b5061016561052d366004611f0c565b610c31565b34801561053e57600080fd5b506009546102f4565b61054f610c74565b6001600160a01b0381166105765760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036105a55760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b6009818154811061060a57600080fd5b6000918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b6008546001600160a01b03161515801561066a57506008546001600160a01b03163314155b15610688576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806106c1575060065460208301516001600160401b03600160401b9092048216911611155b156106df5760405163051c46ef60e01b815260040160405180910390fd5b6106ec8260400151610ccf565b6106f68282610d3f565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561073d434284610e37565b81602001516001600160401b031682600001516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6846040015160405161078e91815260200190565b60405180910390a35050565b6107a2611067565b6107ab8261110c565b6107b5828261114d565b5050565b60006107c361120f565b5060008051602061295a83398151915290565b6107de610c74565b6008546001600160a01b03161561082a57600880546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c0245090600090a1565b60405163a863aec960e01b815260040160405180910390fd5b565b61084d610c74565b6108436000611258565b6009805460009161086960018361243f565b8154811061087957610879612452565b6000918252602090912060029091020154600160801b90046001600160401b031683106108b957604051631856a49960e21b815260040160405180910390fd5b600854600160c01b90046001600160401b03165b818110156109465783600982815481106108e9576108e9612452565b6000918252602090912060029091020154600160801b90046001600160401b0316111561093e576009818154811061092357610923612452565b90600052602060002090600202016001015492505050919050565b6001016108cd565b50600961095460018361243f565b8154811061096457610964612452565b906000526020600020906002020160010154915050919050565b610986610c74565b610e108163ffffffff1610806109af575060085463ffffffff600160a01b909104811690821611155b156109cd576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015610a385750825b90506000826001600160401b03166001148015610a545750303b155b905081158015610a62575080155b15610a805760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610aaa57845460ff60401b1916600160401b1785555b610ab3866112c9565b610abb6112da565b610ac68989896112e2565b8315610b0c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b60095460009043841180610b2b5750600381105b15610b495760405163b0b4387760e01b815260040160405180910390fd5b60008080610b5860018561243f565b90505b81610bfa578660098281548110610b7457610b74612452565b60009182526020909120600290910201546001600160401b031611610bc7576001915060098181548110610baa57610baa612452565b60009182526020909120600290910201546001600160401b031692505b60028110610bfa57600854600160c01b90046001600160401b03168114610bfa5780610bf281612468565b915050610b5b565b81610c185760405163b0b4387760e01b815260040160405180910390fd5b85610c23848961243f565b119450505050505b92915050565b610c39610c74565b6001600160a01b038116610c6857604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610c7181611258565b50565b33610ca67f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108435760405163118cdaa760e01b8152336004820152602401610c5f565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806107b55760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610c5f565b6000610d496113ed565b9050610d53611c45565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a083015260005460c08301525163ce537a7760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063ce537a7790610dd390859085908890600401612686565b602060405180830381865af4158015610df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1491906128b5565b610e31576040516309bde33960e01b815260040160405180910390fd5b50505050565b60095415801590610ef1575060085460098054600160a01b830463ffffffff1692600160c01b90046001600160401b0316908110610e7757610e77612452565b600091825260209091206002909102015460098054600160401b9092046001600160401b031691610eaa9060019061243f565b81548110610eba57610eba612452565b6000918252602090912060029091020154610ee59190600160401b90046001600160401b03166128d7565b6001600160401b031610155b15610f8557600854600980549091600160c01b90046001600160401b0316908110610f1e57610f1e612452565b60009182526020822060029091020180546001600160c01b03191681556001015560088054600160c01b90046001600160401b0316906018610f5f836128fe565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b0394851681529284166020808501918252830151851684830190815292909101516060840190815260098054600181018255600091909152935160029094027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b090910155565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110ee57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110e260008051602061295a833981519152546001600160a01b031690565b6001600160a01b031614155b156108435760405163703e46dd60e11b815260040160405180910390fd5b611114610c74565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d906020016105ef565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156111a7575060408051601f3d908101601f191682019092526111a491810190612924565b60015b6111cf57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610c5f565b60008051602061295a833981519152811461120057604051632a87526960e21b815260048101829052602401610c5f565b61120a8383611a1c565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108435760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6112d1611a72565b610c7181611abb565b610843611a72565b82516001600160401b0316151580611306575060208301516001600160401b031615155b8061131357506020820151155b8061132057506040820151155b8061132d57506060820151155b8061133757508151155b15611355576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b031993841691909516908117851790935560408088015160058190558751600055918701516001558601516002556060860151600355600680549092169092179092179091556007556008805463ffffffff8316600160a01b0263ffffffff60a01b1990911617905561120a434285610e37565b6113f5611c63565b621000008152600760208201527f23783d0e9777b7af65fbf849da7edb75e74b1eaf503e025d7f2f7f80991befa26040820151527f2a4e2fe8adfa53f468525582d5184c4c70bbdb946c21f216418a9879705e54a76020604083015101527f0624b2c1e77f24afceaf39451743b9fa80d5853fca7ba00389c675650774009b6060820151527f250d7719e94ca2df00dfe327938f5a8d4d837779b99837ca777a53d39127b1796020606083015101527f0dc09515152eaea66d0db2f571cc995e369d26fe647394f10db5398c917519dc6080820151527f1273144d6cec2c4a68b24a149379c0f5592bb7fbddbe32fa171919950ca404cb6020608083015101527f119521bb68caec216e2f05eeb466fb3abfe1f39baf7fe7cb392ea057b6a2d9bf60a0820151527f2d52adeaba8045e53ab526fe9982d0ea452def6b3ea0253d27a19ef3b46e8428602060a083015101527f16c3b5b217d302975a920d13374524d7a52e4a50fd7fb930842271ebf4a84efd60c0820151527f200788916b907b196972bde304318e885a2521514b2db5e4a11899c51204f089602060c083015101527f1127581afe753defca9aef12e7332db9978a200b1699ce3888c0f3aea6111dc360e0820151527f0881e13f00723be1a04872ed02b2d078c31e80feaf27724e262ce97c2cb0bb1d602060e083015101527f1482a3a6bb91d6483d153683e2404f2f5546e0e895530fdf132091498406e3de610100820151527efa52db3d52d905ead1248102f3a80a43a90d8400c68f60a62c543c417b2f4b602061010083015101527f0a57dadd4a55199525ac6ac6fabc87a4cccfdc98142bcef9dbf47de00ecc5164610120820151527f18d95abd9b8e12c36936aa218cfff582548a6bbff25c338c2006eaeb1fe5b696602061012083015101527f2bc40e91dd169b8bc143a02952a1b6c6e627bfeb7a2bbe5078e14123f3c54c1c610140820151527f108d65a20c579b6d9883275eb6889fc3f5fc79735ca9f611a13b67daa2fbc8d0602061014083015101527f21bc1f86d0608e5f0626b467ee6f8282b619223f60a7acb0fc63ba7bdaf783be610160820151527f05ef3282f8eef01515fb9a8a7d6ca06b8b007d1d512403efb268fb03ce5f09e9602061016083015101527f2cab66c1cb5a83869e73ac34fbe467486999babd541d9010ee9a804806eee4ef610180820151527f2db1982419c5a4a17593acff9535fa967683d75c8aec01319b64b84aada2ad84602061018083015101527f2c38667c6c7eb868bdd30c34dd3f4b84d9b9b1a27d7867b364c8b7831423e9086101a0820151527f2b2cb4044dd51165c48138219d51cf8d1689f91ed3eeefead6e055eb488a2ce260206101a083015101527f2d48e54703011df2c74a14dafde3af4fd83ec71875d8ddc3554658640cc955016101c0820151527f243a99d80d32eb5408b59d5b08302bede070d3fb0a8efe2f2262f865bffb4d0d60206101c083015101527f0455d2325bf6269a66f07d838f55f36947a3cd9b87edd8480bced95cbb45cc116101e0820151527f0f66d9085a6ed60b838179987e240992bff4c0516ccf6ccde4a1ca94ce8b986460206101e083015101527f2bac0d23c8585d1487ec611b5effc97e5852fea43a7cba36ccdd2c207931f394610200820151527f1860b54e01a06aea5adb4b13bf5baebab92b736807a3a89ff2040992b06ee6ec602061020083015101527f0c0bfa1c2fc6f8ed01233d5168db1e1dfe725504f032f669f50a92ae77c72906610220820151527f0d741e124c7d1069b8a400cbcdcfd90128a533901ad4de1e037fe72984dc34cf602061022083015101527f01cfed30085c9efce04668205794aa39b1a8ee591234b4c77a22f8c26d899e05610240820151527f2ab68ac82d36cedb647d14a5b0035e8c9a0be84780b7bae1133a27a880966ed1602061024083015101527f072e1d50f8b5cf8d574b3847276477d95bbd5116351000841f728da44f4043b5610260820151527f23f8ea6eacd0876d57220f57eabacbe76a2323411663731a251d5dca36f1b59f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611a2582611ac3565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a2805115611a6a5761120a8282611b28565b6107b5611b9e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661084357604051631afcd79f60e31b815260040160405180910390fd5b610c39611a72565b806001600160a01b03163b600003611af957604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610c5f565b60008051602061295a83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b031684604051611b45919061293d565b600060405180830381855af49150503d8060008114611b80576040519150601f19603f3d011682016040523d82523d6000602084013e611b85565b606091505b5091509150611b95858383611bbd565b95945050505050565b34156108435760405163b398979f60e01b815260040160405180910390fd5b606082611bd257611bcd82611c1c565b611c15565b8151158015611be957506001600160a01b0384163b155b15611c1257604051639996b31560e01b81526001600160a01b0385166004820152602401610c5f565b50805b9392505050565b805115611c2c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052806000815260200160008152602001611c9a604051806040016040528060008152602001600081525090565b8152602001611cbc604051806040016040528060008152602001600081525090565b8152602001611cde604051806040016040528060008152602001600081525090565b8152602001611d00604051806040016040528060008152602001600081525090565b8152602001611d22604051806040016040528060008152602001600081525090565b8152602001611d44604051806040016040528060008152602001600081525090565b8152602001611d66604051806040016040528060008152602001600081525090565b8152602001611d88604051806040016040528060008152602001600081525090565b8152602001611daa604051806040016040528060008152602001600081525090565b8152602001611dcc604051806040016040528060008152602001600081525090565b8152602001611dee604051806040016040528060008152602001600081525090565b8152602001611e10604051806040016040528060008152602001600081525090565b8152602001611e32604051806040016040528060008152602001600081525090565b8152602001611e54604051806040016040528060008152602001600081525090565b8152602001611e76604051806040016040528060008152602001600081525090565b8152602001611e98604051806040016040528060008152602001600081525090565b8152602001611eba604051806040016040528060008152602001600081525090565b8152602001611edc604051806040016040528060008152602001600081525090565b815260006020820181905260409091015290565b80356001600160a01b0381168114611f0757600080fd5b919050565b600060208284031215611f1e57600080fd5b611c1582611ef0565b600060208284031215611f3957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516102e081016001600160401b0381118282101715611f7957611f79611f40565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611fa757611fa7611f40565b604052919050565b80356001600160401b0381168114611f0757600080fd5b600060608284031215611fd857600080fd5b604051606081018181106001600160401b0382111715611ffa57611ffa611f40565b60405290508061200983611faf565b815261201760208401611faf565b6020820152604083013560408201525092915050565b60006040828403121561203f57600080fd5b604051604081018181106001600160401b038211171561206157612061611f40565b604052823581526020928301359281019290925250919050565b6000808284036104e081121561209057600080fd5b61209a8585611fc6565b925061048080605f19830112156120b057600080fd5b6120b8611f56565b91506120c7866060870161202d565b82526120d68660a0870161202d565b60208301526120e88660e0870161202d565b60408301526101206120fc8782880161202d565b60608401526101606121108882890161202d565b60808501526101a061212489828a0161202d565b60a08601526101e06121388a828b0161202d565b60c087015261022061214c8b828c0161202d565b60e08801526102606121608c828d0161202d565b6101008901526102a06121758d828e0161202d565b878a01526121878d6102e08e0161202d565b6101408a015261219b8d6103208e0161202d565b868a01526121ad8d6103608e0161202d565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b6000806040838503121561224257600080fd5b61224b83611ef0565b91506020808401356001600160401b038082111561226857600080fd5b818601915086601f83011261227c57600080fd5b81358181111561228e5761228e611f40565b6122a0601f8201601f19168501611f7f565b915080825287848285010111156122b657600080fd5b80848401858401376000848284010152508093505050509250929050565b803563ffffffff81168114611f0757600080fd5b6000602082840312156122fa57600080fd5b611c15826122d4565b60008060008084860361012081121561231b57600080fd5b6123258787611fc6565b94506080605f198201121561233957600080fd5b50604051608081018181106001600160401b038211171561235c5761235c611f40565b8060405250606086013581526080860135602082015260a0860135604082015260c086013560608201528093505061239660e086016122d4565b91506123a56101008601611ef0565b905092959194509250565b60005b838110156123cb5781810151838201526020016123b3565b50506000910152565b60208152600082518060208401526123f38160408501602087016123b0565b601f01601f19169190910160400192915050565b6000806040838503121561241a57600080fd5b50508035926020909101359150565b634e487b7160e01b600052601160045260246000fd5b81810381811115610c2b57610c2b612429565b634e487b7160e01b600052603260045260246000fd5b60008161247757612477612429565b506000190190565b8060005b6007811015610e31578151845260209384019390910190600101612483565b6124b782825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e084015250608081015161010061251a8185018380518252602090810151910152565b60a0830151915061014061253a8186018480518252602090810151910152565b60c0840151925061018061255a8187018580518252602090810151910152565b60e085015193506101c061257a8188018680518252602090810151910152565b9285015193506102009261259a8785018680518252602090810151910152565b61012086015194506102406125bb8189018780518252602090810151910152565b928601519450610280926125db8885018780518252602090810151910152565b61016087015195506102c06125fc818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b6000610a6082019050845182526020850151602083015260408501516126b9604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a08501516101006127068185018380518252602090810151910152565b60c087015191506101406127268186018480518252602090810151910152565b60e088015192506101806127468187018580518252602090810151910152565b9188015192506101c0916127668684018580518252602090810151910152565b61012089015193506102006127878188018680518252602090810151910152565b918901519350610240916127a78784018680518252602090810151910152565b6101608a015194506102806127c88189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e083015261289f61050083018561247f565b6128ad6105e08301846124a2565b949350505050565b6000602082840312156128c757600080fd5b81518015158114611c1557600080fd5b6001600160401b038281168282160390808211156128f7576128f7612429565b5092915050565b60006001600160401b0380831681810361291a5761291a612429565b6001019392505050565b60006020828403121561293657600080fd5b5051919050565b6000825161294f8184602087016123b0565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" diff --git a/contract-bindings/src/light_client.rs b/contract-bindings/src/light_client.rs index 6275ac6dd..64e5d13a1 100644 --- a/contract-bindings/src/light_client.rs +++ b/contract-bindings/src/light_client.rs @@ -271,6 +271,22 @@ pub mod light_client { state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("isPermissionedProverEnabled"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("isPermissionedProverEnabled",), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Bool, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bool"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("lagOverEscapeHatchThreshold"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -430,22 +446,6 @@ pub mod light_client { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), - ( - ::std::borrow::ToOwned::to_owned("permissionedProverEnabled"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("permissionedProverEnabled",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - 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 { @@ -1035,6 +1035,14 @@ pub mod light_client { ) .expect("method not found (this should never happen)") } + ///Calls the contract's `isPermissionedProverEnabled` (0x826e41fc) function + pub fn is_permissioned_prover_enabled( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([130, 110, 65, 252], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `lagOverEscapeHatchThreshold` (0xe0303301) function pub fn lag_over_escape_hatch_threshold( &self, @@ -1071,14 +1079,6 @@ pub mod light_client { .method_hash([49, 61, 247, 177], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `permissionedProverEnabled` (0xbd32519a) function - pub fn permissioned_prover_enabled( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([189, 50, 81, 154], ()) - .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 @@ -2337,6 +2337,24 @@ pub mod light_client { pub state_history_retention_period: u32, pub owner: ::ethers::core::types::Address, } + ///Container type for all input parameters for the `isPermissionedProverEnabled` function with signature `isPermissionedProverEnabled()` and selector `0x826e41fc` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "isPermissionedProverEnabled", + abi = "isPermissionedProverEnabled()" + )] + pub struct IsPermissionedProverEnabledCall; ///Container type for all input parameters for the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301` #[derive( Clone, @@ -2404,24 +2422,6 @@ pub mod light_client { )] #[ethcall(name = "permissionedProver", abi = "permissionedProver()")] pub struct PermissionedProverCall; - ///Container type for all input parameters for the `permissionedProverEnabled` function with signature `permissionedProverEnabled()` and selector `0xbd32519a` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "permissionedProverEnabled", - abi = "permissionedProverEnabled()" - )] - pub struct PermissionedProverEnabledCall; ///Container type for all input parameters for the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` #[derive( Clone, @@ -2587,11 +2587,11 @@ pub mod light_client { GetStateHistoryCount(GetStateHistoryCountCall), GetVersion(GetVersionCall), Initialize(InitializeCall), + IsPermissionedProverEnabled(IsPermissionedProverEnabledCall), LagOverEscapeHatchThreshold(LagOverEscapeHatchThresholdCall), NewFinalizedState(NewFinalizedStateCall), Owner(OwnerCall), PermissionedProver(PermissionedProverCall), - PermissionedProverEnabled(PermissionedProverEnabledCall), ProxiableUUID(ProxiableUUIDCall), RenounceOwnership(RenounceOwnershipCall), SetPermissionedProver(SetPermissionedProverCall), @@ -2647,6 +2647,11 @@ pub mod light_client { if let Ok(decoded) = ::decode(data) { return Ok(Self::Initialize(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::IsPermissionedProverEnabled(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -2665,11 +2670,6 @@ pub mod light_client { { return Ok(Self::PermissionedProver(decoded)); } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::PermissionedProverEnabled(decoded)); - } if let Ok(decoded) = ::decode(data) { return Ok(Self::ProxiableUUID(decoded)); @@ -2739,6 +2739,9 @@ pub mod light_client { } Self::GetVersion(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::IsPermissionedProverEnabled(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::LagOverEscapeHatchThreshold(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -2747,9 +2750,6 @@ pub mod light_client { Self::PermissionedProver(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::PermissionedProverEnabled(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::SetPermissionedProver(element) => { @@ -2786,11 +2786,11 @@ pub mod light_client { Self::GetStateHistoryCount(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::IsPermissionedProverEnabled(element) => ::core::fmt::Display::fmt(element, f), Self::LagOverEscapeHatchThreshold(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::PermissionedProver(element) => ::core::fmt::Display::fmt(element, f), - Self::PermissionedProverEnabled(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::SetPermissionedProver(element) => ::core::fmt::Display::fmt(element, f), @@ -2850,6 +2850,11 @@ pub mod light_client { Self::Initialize(value) } } + impl ::core::convert::From for LightClientCalls { + fn from(value: IsPermissionedProverEnabledCall) -> Self { + Self::IsPermissionedProverEnabled(value) + } + } impl ::core::convert::From for LightClientCalls { fn from(value: LagOverEscapeHatchThresholdCall) -> Self { Self::LagOverEscapeHatchThreshold(value) @@ -2870,11 +2875,6 @@ pub mod light_client { Self::PermissionedProver(value) } } - impl ::core::convert::From for LightClientCalls { - fn from(value: PermissionedProverEnabledCall) -> Self { - Self::PermissionedProverEnabled(value) - } - } impl ::core::convert::From for LightClientCalls { fn from(value: ProxiableUUIDCall) -> Self { Self::ProxiableUUID(value) @@ -3037,7 +3037,7 @@ pub mod light_client { pub minor_version: u8, pub patch_version: u8, } - ///Container type for all return fields from the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301` + ///Container type for all return fields from the `isPermissionedProverEnabled` function with signature `isPermissionedProverEnabled()` and selector `0x826e41fc` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3050,8 +3050,8 @@ pub mod light_client { Eq, Hash, )] - pub struct LagOverEscapeHatchThresholdReturn(pub bool); - ///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b` + pub struct IsPermissionedProverEnabledReturn(pub bool); + ///Container type for all return fields from the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3064,8 +3064,8 @@ pub mod light_client { Eq, Hash, )] - pub struct OwnerReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `permissionedProver` function with signature `permissionedProver()` and selector `0x313df7b1` + pub struct LagOverEscapeHatchThresholdReturn(pub bool); + ///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3078,8 +3078,8 @@ pub mod light_client { Eq, Hash, )] - pub struct PermissionedProverReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `permissionedProverEnabled` function with signature `permissionedProverEnabled()` and selector `0xbd32519a` + pub struct OwnerReturn(pub ::ethers::core::types::Address); + ///Container type for all return fields from the `permissionedProver` function with signature `permissionedProver()` and selector `0x313df7b1` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3092,7 +3092,7 @@ pub mod light_client { Eq, Hash, )] - pub struct PermissionedProverEnabledReturn(pub bool); + pub struct PermissionedProverReturn(pub ::ethers::core::types::Address); ///Container type for all return fields from the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` #[derive( Clone, diff --git a/contract-bindings/src/light_client_mock.rs b/contract-bindings/src/light_client_mock.rs index d0bf7accd..b1109b501 100644 --- a/contract-bindings/src/light_client_mock.rs +++ b/contract-bindings/src/light_client_mock.rs @@ -302,6 +302,22 @@ pub mod light_client_mock { state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("isPermissionedProverEnabled"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("isPermissionedProverEnabled",), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Bool, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bool"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("lagOverEscapeHatchThreshold"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -461,22 +477,6 @@ pub mod light_client_mock { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), - ( - ::std::borrow::ToOwned::to_owned("permissionedProverEnabled"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("permissionedProverEnabled",), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - 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 { @@ -1141,6 +1141,14 @@ pub mod light_client_mock { ) .expect("method not found (this should never happen)") } + ///Calls the contract's `isPermissionedProverEnabled` (0x826e41fc) function + pub fn is_permissioned_prover_enabled( + &self, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([130, 110, 65, 252], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `lagOverEscapeHatchThreshold` (0xe0303301) function pub fn lag_over_escape_hatch_threshold( &self, @@ -1177,14 +1185,6 @@ pub mod light_client_mock { .method_hash([49, 61, 247, 177], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `permissionedProverEnabled` (0xbd32519a) function - pub fn permissioned_prover_enabled( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([189, 50, 81, 154], ()) - .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 @@ -2480,6 +2480,24 @@ pub mod light_client_mock { pub state_history_retention_period: u32, pub owner: ::ethers::core::types::Address, } + ///Container type for all input parameters for the `isPermissionedProverEnabled` function with signature `isPermissionedProverEnabled()` and selector `0x826e41fc` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "isPermissionedProverEnabled", + abi = "isPermissionedProverEnabled()" + )] + pub struct IsPermissionedProverEnabledCall; ///Container type for all input parameters for the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301` #[derive( Clone, @@ -2547,24 +2565,6 @@ pub mod light_client_mock { )] #[ethcall(name = "permissionedProver", abi = "permissionedProver()")] pub struct PermissionedProverCall; - ///Container type for all input parameters for the `permissionedProverEnabled` function with signature `permissionedProverEnabled()` and selector `0xbd32519a` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall( - name = "permissionedProverEnabled", - abi = "permissionedProverEnabled()" - )] - pub struct PermissionedProverEnabledCall; ///Container type for all input parameters for the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` #[derive( Clone, @@ -2802,11 +2802,11 @@ pub mod light_client_mock { GetStateHistoryCount(GetStateHistoryCountCall), GetVersion(GetVersionCall), Initialize(InitializeCall), + IsPermissionedProverEnabled(IsPermissionedProverEnabledCall), LagOverEscapeHatchThreshold(LagOverEscapeHatchThresholdCall), NewFinalizedState(NewFinalizedStateCall), Owner(OwnerCall), PermissionedProver(PermissionedProverCall), - PermissionedProverEnabled(PermissionedProverEnabledCall), ProxiableUUID(ProxiableUUIDCall), RenounceOwnership(RenounceOwnershipCall), SetFinalizedState(SetFinalizedStateCall), @@ -2866,6 +2866,11 @@ pub mod light_client_mock { if let Ok(decoded) = ::decode(data) { return Ok(Self::Initialize(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::IsPermissionedProverEnabled(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -2884,11 +2889,6 @@ pub mod light_client_mock { { return Ok(Self::PermissionedProver(decoded)); } - if let Ok(decoded) = - ::decode(data) - { - return Ok(Self::PermissionedProverEnabled(decoded)); - } if let Ok(decoded) = ::decode(data) { return Ok(Self::ProxiableUUID(decoded)); @@ -2977,6 +2977,9 @@ pub mod light_client_mock { } Self::GetVersion(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::IsPermissionedProverEnabled(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::LagOverEscapeHatchThreshold(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -2985,9 +2988,6 @@ pub mod light_client_mock { Self::PermissionedProver(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::PermissionedProverEnabled(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::SetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element), @@ -3030,11 +3030,11 @@ pub mod light_client_mock { Self::GetStateHistoryCount(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::IsPermissionedProverEnabled(element) => ::core::fmt::Display::fmt(element, f), Self::LagOverEscapeHatchThreshold(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::PermissionedProver(element) => ::core::fmt::Display::fmt(element, f), - Self::PermissionedProverEnabled(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::SetFinalizedState(element) => ::core::fmt::Display::fmt(element, f), @@ -3098,6 +3098,11 @@ pub mod light_client_mock { Self::Initialize(value) } } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: IsPermissionedProverEnabledCall) -> Self { + Self::IsPermissionedProverEnabled(value) + } + } impl ::core::convert::From for LightClientMockCalls { fn from(value: LagOverEscapeHatchThresholdCall) -> Self { Self::LagOverEscapeHatchThreshold(value) @@ -3118,11 +3123,6 @@ pub mod light_client_mock { Self::PermissionedProver(value) } } - impl ::core::convert::From for LightClientMockCalls { - fn from(value: PermissionedProverEnabledCall) -> Self { - Self::PermissionedProverEnabled(value) - } - } impl ::core::convert::From for LightClientMockCalls { fn from(value: ProxiableUUIDCall) -> Self { Self::ProxiableUUID(value) @@ -3305,7 +3305,7 @@ pub mod light_client_mock { pub minor_version: u8, pub patch_version: u8, } - ///Container type for all return fields from the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301` + ///Container type for all return fields from the `isPermissionedProverEnabled` function with signature `isPermissionedProverEnabled()` and selector `0x826e41fc` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3318,8 +3318,8 @@ pub mod light_client_mock { Eq, Hash, )] - pub struct LagOverEscapeHatchThresholdReturn(pub bool); - ///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b` + pub struct IsPermissionedProverEnabledReturn(pub bool); + ///Container type for all return fields from the `lagOverEscapeHatchThreshold` function with signature `lagOverEscapeHatchThreshold(uint256,uint256)` and selector `0xe0303301` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3332,8 +3332,8 @@ pub mod light_client_mock { Eq, Hash, )] - pub struct OwnerReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `permissionedProver` function with signature `permissionedProver()` and selector `0x313df7b1` + pub struct LagOverEscapeHatchThresholdReturn(pub bool); + ///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3346,8 +3346,8 @@ pub mod light_client_mock { Eq, Hash, )] - pub struct PermissionedProverReturn(pub ::ethers::core::types::Address); - ///Container type for all return fields from the `permissionedProverEnabled` function with signature `permissionedProverEnabled()` and selector `0xbd32519a` + pub struct OwnerReturn(pub ::ethers::core::types::Address); + ///Container type for all return fields from the `permissionedProver` function with signature `permissionedProver()` and selector `0x313df7b1` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -3360,7 +3360,7 @@ pub mod light_client_mock { Eq, Hash, )] - pub struct PermissionedProverEnabledReturn(pub bool); + pub struct PermissionedProverReturn(pub ::ethers::core::types::Address); ///Container type for all return fields from the `proxiableUUID` function with signature `proxiableUUID()` and selector `0x52d1902d` #[derive( Clone, diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol index d2c1dba95..ff85e6321 100644 --- a/contracts/src/LightClient.sol +++ b/contracts/src/LightClient.sol @@ -58,9 +58,6 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// permissioned prover mode address public permissionedProver; - /// @notice a flag that indicates when a permissioned provrer is needed - bool public permissionedProverEnabled; - /// @notice Max number of seconds worth of state commitments to record based on this block /// timestamp uint32 public stateHistoryRetentionPeriod; @@ -235,7 +232,7 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { IPlonkVerifier.PlonkProof memory proof ) external virtual { //revert if we're in permissionedProver mode and the permissioned prover has not been set - if (permissionedProverEnabled && msg.sender != permissionedProver) { + if (isPermissionedProverEnabled() && msg.sender != permissionedProver) { revert ProverNotPermissioned(); } @@ -294,16 +291,14 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { revert NoChangeRequired(); } permissionedProver = prover; - permissionedProverEnabled = true; emit PermissionedProverRequired(permissionedProver); } /// @notice set the permissionedProverMode to false and set the permissionedProver to address(0) /// @dev if it was already disabled (permissioneProverMode == false), then revert with function disablePermissionedProverMode() public virtual onlyOwner { - if (permissionedProverEnabled) { + if (isPermissionedProverEnabled()) { permissionedProver = address(0); - permissionedProverEnabled = false; emit PermissionedProverNotRequired(); } else { revert NoChangeRequired(); @@ -448,4 +443,9 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { stateHistoryRetentionPeriod = historySeconds; } + + /// @notice Check if permissioned prover is enabled + function isPermissionedProverEnabled() public view returns (bool) { + return (permissionedProver != address(0)); + } } diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol index bd50050ae..3145862c0 100644 --- a/contracts/test/LightClient.t.sol +++ b/contracts/test/LightClient.t.sol @@ -170,7 +170,7 @@ contract LightClient_permissionedProver_Test is LightClientCommonTest { function test_NoProverPermissionsRequired() external { //ensure that the permissioned prover mode is set - assert(lc.permissionedProverEnabled()); + assert(lc.isPermissionedProverEnabled()); //set permissioned flag to false vm.expectEmit(true, true, true, true); @@ -179,7 +179,7 @@ contract LightClient_permissionedProver_Test is LightClientCommonTest { lc.disablePermissionedProverMode(); //assert that the contract is not permissioned - assert(lc.permissionedProverEnabled() == false); + assert(lc.isPermissionedProverEnabled() == false); // assert that the prover address is zero address when the contract is not permissioned assertEq(lc.permissionedProver(), address(0)); @@ -208,7 +208,7 @@ contract LightClient_permissionedProver_Test is LightClientCommonTest { } function test_UpdatePermissionedProverWhenPermissionedProverModeEnabled() external { - assert(lc.permissionedProverEnabled()); + assert(lc.isPermissionedProverEnabled()); assertEq(lc.permissionedProver(), permissionedProver); address newProver = makeAddr("another prover"); @@ -226,7 +226,7 @@ contract LightClient_permissionedProver_Test is LightClientCommonTest { // InvalidAddress() vm.assume(newProver != permissionedProver); //otherwise it would have reverted with // NoChangeRequired() - assert(lc.permissionedProverEnabled()); + assert(lc.isPermissionedProverEnabled()); assertEq(lc.permissionedProver(), permissionedProver); vm.expectEmit(true, true, true, true); @@ -260,7 +260,7 @@ contract LightClient_permissionedProver_Test is LightClientCommonTest { } function test_RevertWhen_sameProverSentInUpdate() public { - assertEq(lc.permissionedProverEnabled(), true); + assertEq(lc.isPermissionedProverEnabled(), true); address currentProver = lc.permissionedProver(); vm.prank(admin); vm.expectRevert(LC.NoChangeRequired.selector); @@ -1156,8 +1156,7 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { function test_revertWhenGetHotShotCommitmentInvalidHigh() public { // Get the highest HotShot blockheight recorded uint256 numCommitments = lc.getStateHistoryCount(); - (,, uint64 blockHeight, BN254.ScalarField comm) = - lc.stateHistoryCommitments(numCommitments - 1); + (,, uint64 blockHeight,) = lc.stateHistoryCommitments(numCommitments - 1); // Expect revert when attempting to retrieve a block height higher than the highest one // recorded vm.expectRevert(LC.InvalidHotShotBlockForCommitmentCheck.selector); From 44cb934c390d83592afcbf2f323397bf29536b4a Mon Sep 17 00:00:00 2001 From: Jarred Parr Date: Mon, 9 Sep 2024 08:52:10 -0600 Subject: [PATCH 27/27] new versions --- Cargo.lock | 56 +++++++++++++++++++++++++++--------------------------- Cargo.toml | 26 ++++++++++++------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 36013217d..39f9b6fd8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4079,8 +4079,8 @@ dependencies = [ [[package]] name = "hotshot" -version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" +version = "0.5.74" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.74#b08660bf9e01d4d59a79009d67100ba13895e4b2" dependencies = [ "anyhow", "async-broadcast", @@ -4127,7 +4127,7 @@ dependencies = [ [[package]] name = "hotshot-builder-api" version = "0.1.7" -source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.74#b08660bf9e01d4d59a79009d67100ba13895e4b2" dependencies = [ "async-trait", "clap", @@ -4145,8 +4145,8 @@ dependencies = [ [[package]] name = "hotshot-builder-core" -version = "0.1.45" -source = "git+https://github.com/EspressoSystems/hotshot-builder-core?branch=hotshot/rc-0.5.74#e13c1a8c6352232a235ec7347aeb6e6dab31fc39" +version = "0.1.47" +source = "git+https://github.com/EspressoSystems/marketplace-builder-core?tag=0.1.47#526782bbe1b04d76c0b931b00cd266017089c20b" dependencies = [ "anyhow", "async-broadcast", @@ -4202,7 +4202,7 @@ dependencies = [ [[package]] name = "hotshot-events-service" version = "0.1.40" -source = "git+https://github.com/EspressoSystems/hotshot-events-service.git?branch=hotshot/rc-0.5.74#e9e11a15c4b931e62689142348afe38777c98854" +source = "git+https://github.com/EspressoSystems/hotshot-events-service.git?tag=0.1.46#90502054552d5d1563920b21d45e9a2b235335b4" dependencies = [ "async-broadcast", "async-compatibility-layer", @@ -4227,8 +4227,8 @@ dependencies = [ [[package]] name = "hotshot-example-types" -version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" +version = "0.5.74" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.74#b08660bf9e01d4d59a79009d67100ba13895e4b2" dependencies = [ "anyhow", "async-broadcast", @@ -4260,8 +4260,8 @@ dependencies = [ [[package]] name = "hotshot-fakeapi" -version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" +version = "0.5.74" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.74#b08660bf9e01d4d59a79009d67100ba13895e4b2" dependencies = [ "anyhow", "async-lock 2.8.0", @@ -4279,8 +4279,8 @@ dependencies = [ [[package]] name = "hotshot-macros" -version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" +version = "0.5.74" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.74#b08660bf9e01d4d59a79009d67100ba13895e4b2" dependencies = [ "derive_builder", "proc-macro2", @@ -4290,8 +4290,8 @@ dependencies = [ [[package]] name = "hotshot-orchestrator" -version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" +version = "0.5.74" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.74#b08660bf9e01d4d59a79009d67100ba13895e4b2" dependencies = [ "anyhow", "async-compatibility-layer", @@ -4321,7 +4321,7 @@ dependencies = [ [[package]] name = "hotshot-query-service" version = "0.1.53" -source = "git+https://github.com/EspressoSystems/hotshot-query-service?branch=hotshot/rc-0.5.74#34837ac6f47c69ac38434b256244008e39c9361c" +source = "git+https://github.com/EspressoSystems/hotshot-query-service?tag=0.1.56#90e628fb7043608731e2e23c32ad6dee3c090602" dependencies = [ "anyhow", "ark-serialize", @@ -4376,8 +4376,8 @@ dependencies = [ [[package]] name = "hotshot-stake-table" -version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" +version = "0.5.74" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.74#b08660bf9e01d4d59a79009d67100ba13895e4b2" dependencies = [ "ark-bn254", "ark-ed-on-bn254", @@ -4438,8 +4438,8 @@ dependencies = [ [[package]] name = "hotshot-task" -version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" +version = "0.5.74" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.74#b08660bf9e01d4d59a79009d67100ba13895e4b2" dependencies = [ "anyhow", "async-broadcast", @@ -4453,8 +4453,8 @@ dependencies = [ [[package]] name = "hotshot-task-impls" -version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" +version = "0.5.74" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.74#b08660bf9e01d4d59a79009d67100ba13895e4b2" dependencies = [ "anyhow", "async-broadcast", @@ -4490,8 +4490,8 @@ dependencies = [ [[package]] name = "hotshot-testing" -version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" +version = "0.5.74" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.74#b08660bf9e01d4d59a79009d67100ba13895e4b2" dependencies = [ "anyhow", "async-broadcast", @@ -4537,7 +4537,7 @@ dependencies = [ [[package]] name = "hotshot-types" version = "0.1.11" -source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.74#b08660bf9e01d4d59a79009d67100ba13895e4b2" dependencies = [ "anyhow", "ark-bn254", @@ -5793,8 +5793,8 @@ dependencies = [ [[package]] name = "libp2p-networking" -version = "0.5.73" -source = "git+https://github.com/EspressoSystems/hotshot?tag=rc-0.5.74#f532baa295b2230969cbd5fb0b78e8930bf0a03b" +version = "0.5.74" +source = "git+https://github.com/EspressoSystems/hotshot?tag=0.5.74#b08660bf9e01d4d59a79009d67100ba13895e4b2" dependencies = [ "anyhow", "async-compatibility-layer", @@ -6181,8 +6181,8 @@ dependencies = [ [[package]] name = "marketplace-builder-core" -version = "0.1.46" -source = "git+https://github.com/EspressoSystems/marketplace-builder-core?branch=hotshot/rc-0.5.74#8bbf04909f5ee43ff0b798eeaa032707e5ce9b29" +version = "0.1.47" +source = "git+https://github.com/EspressoSystems/marketplace-builder-core?tag=0.1.47#526782bbe1b04d76c0b931b00cd266017089c20b" dependencies = [ "anyhow", "async-broadcast", diff --git a/Cargo.toml b/Cargo.toml index 95e0f135b..d55402b34 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,23 +54,23 @@ dotenvy = "0.15" ethers = { version = "2.0", features = ["solc"] } futures = "0.3" -hotshot = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74", features = ["dependency-tasks"] } +hotshot = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.74", features = ["dependency-tasks"] } # Hotshot imports -hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", tag = "rc-0.5.74" } -hotshot-builder-core = { git = "https://github.com/EspressoSystems/hotshot-builder-core", branch = "hotshot/rc-0.5.74" } -marketplace-builder-core = { git = "https://github.com/EspressoSystems/marketplace-builder-core", branch = "hotshot/rc-0.5.74" } -hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", branch = "hotshot/rc-0.5.74" } -hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74" } -hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", branch = "hotshot/rc-0.5.74" } -hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74" } +hotshot-builder-api = { git = "https://github.com/EspressoSystems/HotShot.git", tag = "0.5.74" } +hotshot-builder-core = { git = "https://github.com/EspressoSystems/marketplace-builder-core", tag = "0.1.47" } +marketplace-builder-core = { git = "https://github.com/EspressoSystems/marketplace-builder-core", tag = "0.1.47" } +hotshot-events-service = { git = "https://github.com/EspressoSystems/hotshot-events-service.git", tag = "0.1.46" } +hotshot-orchestrator = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.74" } +hotshot-query-service = { git = "https://github.com/EspressoSystems/hotshot-query-service", tag = "0.1.56" } +hotshot-stake-table = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.74" } hotshot-state-prover = { version = "0.1.0", path = "hotshot-state-prover" } -hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74" } -hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74", features = ["dependency-tasks"] } -hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74" } -libp2p-networking = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74" } +hotshot-task = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.74" } +hotshot-testing = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.74", features = ["dependency-tasks"] } +hotshot-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.74" } +libp2p-networking = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.74" } hotshot-contract-adapter = { version = "0.1.0", path = "contracts/rust/adapter" } # Temporary, used to pull in the mock auction results provider -hotshot-example-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "rc-0.5.74" } +hotshot-example-types = { git = "https://github.com/EspressoSystems/hotshot", tag = "0.5.74" } # Push CDN imports cdn-broker = { git = "https://github.com/EspressoSystems/Push-CDN", features = [