diff --git a/Makefile b/Makefile index 6e55077de..494ed9049 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ ################## update dependencies #################### ETHEREUM_SUBMODULE_COMMIT_OR_TAG := morph-v2.1.0 ETHEREUM_TARGET_VERSION := v1.10.14-0.20251219060125-03910bc750a2 -TENDERMINT_TARGET_VERSION := v0.3.2 +TENDERMINT_TARGET_VERSION := v0.3.3 ETHEREUM_MODULE_NAME := github.com/morph-l2/go-ethereum TENDERMINT_MODULE_NAME := github.com/morph-l2/tendermint diff --git a/MakefileEks.mk b/MakefileEks.mk index 96e62d9b4..b2c3c7a31 100644 --- a/MakefileEks.mk +++ b/MakefileEks.mk @@ -121,6 +121,8 @@ build-bk-prod-morph-prod-mainnet-to-morph-token-price-oracle: if [ ! -d dist ]; then mkdir -p dist; fi env GO111MODULE=on CGO_LDFLAGS="-ldl" CGO_ENABLED=1 go build -v $(LDFLAGS) -o token-price-oracle/token-price-oracle ./token-price-oracle/cmd cp token-price-oracle/token-price-oracle dist/ + aws s3 cp s3://morph-0582-morph-technical-department-mainnet-data/morph-setup/secret-manager-wrapper.tar.gz ./ + tar -xvzf secret-manager-wrapper.tar.gz start-bk-prod-morph-prod-mainnet-to-morph-token-price-oracle: @@ -202,4 +204,4 @@ build-bk-prod-morph-prod-testnet-to-morph-staking-oracle-holesky: tar -xvzf secret-manager-wrapper.tar.gz start-bk-prod-morph-prod-testnet-to-morph-staking-oracle-holesky: - /data/secret-manager-wrapper ./staking-oracle \ No newline at end of file + /data/secret-manager-wrapper ./staking-oracle diff --git a/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex b/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex index a0cd87ec7..262279f7c 100644 --- a/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex +++ b/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex @@ -1 +1 @@ -0x608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063a85006ca116100dd578063d99bc80e11610088578063e3176bd511610063578063e3176bd51461037a578063f2fde38b14610383578063fd0ad31e14610396575f80fd5b8063d99bc80e1461033a578063da35a26f1461034d578063e172d3a114610360575f80fd5b8063bdc6f0a0116100b8578063bdc6f0a0146102ed578063c276067714610300578063d5ad4a9714610327575f80fd5b8063a85006ca146102b1578063ae453cd5146102ba578063bb7862ca146102cd575f80fd5b80635f9cd92e1161013d5780638da5cb5b116101185780638da5cb5b14610259578063927ede2d146102775780639b1597821461029e575f80fd5b80635f9cd92e146101f2578063715018a6146102055780638770d7071461020d575f80fd5b80633e4cbbe61161016d5780633e4cbbe6146101c35780635ad9945a146101d65780635e45da23146101e9575f80fd5b806329aa604b146101885780633c7f5283146101ae575b5f80fd5b61019b610196366004611173565b61039e565b6040519081526020015b60405180910390f35b6101c16101bc36600461118a565b6103bd565b005b61019b6101d13660046111cd565b61052e565b61019b6101e436600461123a565b6105e2565b61019b60685481565b6101c16102003660046112b6565b6107d2565b6101c1610867565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a5565b60335473ffffffffffffffffffffffffffffffffffffffff16610234565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16102ac3660046112cf565b61087a565b61019b60675481565b61019b6102c8366004611173565b61095c565b606b546102349073ffffffffffffffffffffffffffffffffffffffff1681565b6101c16102fb366004611325565b6109d2565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c1610335366004611173565b610b03565b6101c1610348366004611173565b610b49565b6101c161035b366004611398565b610b8f565b61019b61036e3660046113c2565b60100261520801919050565b61019b60655481565b6101c16103913660046112b6565b610d48565b60665461019b565b606681815481106103ad575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104475760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156104995760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d657373616765730000000000000000000000604482015260640161043e565b81606754146104ea5760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d61746368000000000000000000000000604482015260640161043e565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa15801561059c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c09190611401565b156105cc57505f6105dc565b6065546105d99083611427565b90505b92915050565b5f607e8161068c565b5f816105f957506001919050565b5b811561060f5760089190911c906001016105fa565b919050565b80608083106001811461064c5761062a846105eb565b60808101835360018301925084816020036008021b835280830192505061066d565b848415166001811461066057848353610665565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061069f60018c83610614565b90506106ad60018983610614565b90506106b98982610675565b90506106c760018b83610614565b9050600186146001811461072f576038871060018114610714576106ea886105eb565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610729565b87608001835360018301925087898437918701915b50610740565b61073d5f89355f1a84610614565b91505b5061074b8c82610675565b90508181035f80603883106001811461077e57610767846105eb565b60f78101600882021b851793506001019150610789565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b6107da610de5565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61086f610de5565b6108785f610e4c565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109255760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e676572000000000000000000000000000000000000000000606482015260840161043e565b610930838383610ec2565b337311110000000000000000000000000000000011110161095581865f878787610fbe565b5050505050565b6066545f9082106109af5760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e6765000000000000604482015260640161043e565b606682815481106109c2576109c2611463565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610a7d5760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f6174657761790000000000000000000000000000000000000000000000000000606482015260840161043e565b73ffffffffffffffffffffffffffffffffffffffff86163b15610ae25760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f41000000000000000000000000000000000000000000000000604482015260640161043e565b610aed838383610ec2565b610afb868686868686610fbe565b505050505050565b610b0b610de5565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610522565b610b51610de5565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610522565b5f54610100900460ff1615808015610bad57505f54600160ff909116105b80610bc65750303b158015610bc657505f5460ff166001145b610c385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161043e565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c94575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610c9c61106f565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610d43575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610d50610de5565b73ffffffffffffffffffffffffffffffffffffffff8116610dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161043e565b610de281610e4c565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161043e565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115610f3a5760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d6974000000000000000000000000000000000000000000000000000000606482015260840161043e565b601081026152080180841015610fb85760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e7369632067617300000000000000000000000000606482015260840161043e565b50505050565b6066545f610fd18883888a8989896105e2565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e9061105d908a9087908b908b908b90611490565b60405180910390a35050505050505050565b5f54610100900460ff166110eb5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b6108785f54610100900460ff1661116a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b61087833610e4c565b5f60208284031215611183575f80fd5b5035919050565b5f806040838503121561119b575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461060f575f80fd5b5f80604083850312156111de575f80fd5b6111e7836111aa565b946020939093013593505050565b5f8083601f840112611205575f80fd5b50813567ffffffffffffffff81111561121c575f80fd5b602083019150836020828501011115611233575f80fd5b9250929050565b5f805f805f805f60c0888a031215611250575f80fd5b611259886111aa565b96506020880135955060408801359450611275606089016111aa565b93506080880135925060a088013567ffffffffffffffff811115611297575f80fd5b6112a38a828b016111f5565b989b979a50959850939692959293505050565b5f602082840312156112c6575f80fd5b6105d9826111aa565b5f805f80606085870312156112e2575f80fd5b6112eb856111aa565b935060208501359250604085013567ffffffffffffffff81111561130d575f80fd5b611319878288016111f5565b95989497509550505050565b5f805f805f8060a0878903121561133a575f80fd5b611343876111aa565b9550611351602088016111aa565b94506040870135935060608701359250608087013567ffffffffffffffff81111561137a575f80fd5b61138689828a016111f5565b979a9699509497509295939492505050565b5f80604083850312156113a9575f80fd5b823591506113b9602084016111aa565b90509250929050565b5f80602083850312156113d3575f80fd5b823567ffffffffffffffff8111156113e9575f80fd5b6113f5858286016111f5565b90969095509350505050565b5f60208284031215611411575f80fd5b81518015158114611420575f80fd5b9392505050565b80820281158282048414176105dc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a +0x608060405234801561000f575f80fd5b50600436106101a5575f3560e01c8063ae453cd5116100e8578063d99bc80e11610093578063e3176bd51161006e578063e3176bd5146103c2578063f2fde38b146103cb578063f7ca0c51146103de578063fd0ad31e146103fd575f80fd5b8063d99bc80e14610382578063da35a26f14610395578063e172d3a1146103a8575f80fd5b8063bdc6f0a0116100c3578063bdc6f0a014610335578063c276067714610348578063d5ad4a971461036f575f80fd5b8063ae453cd5146102fa578063b59b1a781461030d578063bb7862ca14610315575f80fd5b8063715018a6116101535780638dc73d871161012e5780638dc73d8714610298578063927ede2d146102b75780639b159782146102de578063a85006ca146102f1575f80fd5b8063715018a6146102265780638770d7071461022e5780638da5cb5b1461027a575f80fd5b80635ad9945a116101835780635ad9945a146101f75780635e45da231461020a5780635f9cd92e14610213575f80fd5b806329aa604b146101a95780633c7f5283146101cf5780633e4cbbe6146101e4575b5f80fd5b6101bc6101b7366004611229565b610405565b6040519081526020015b60405180910390f35b6101e26101dd366004611240565b610424565b005b6101bc6101f2366004611283565b610595565b6101bc6102053660046112f0565b610649565b6101bc60685481565b6101e261022136600461136c565b610839565b6101e26108ce565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c6565b60335473ffffffffffffffffffffffffffffffffffffffff16610255565b6101bc6102a6366004611229565b606c6020525f908152604090205481565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6101e26102ec366004611385565b6108e1565b6101bc60675481565b6101bc610308366004611229565b6109c3565b6101bc610a39565b606b546102559073ffffffffffffffffffffffffffffffffffffffff1681565b6101e26103433660046113db565b610a7c565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6101e261037d366004611229565b610bad565b6101e2610390366004611229565b610bf3565b6101e26103a336600461144e565b610c39565b6101bc6103b6366004611478565b60100261520801919050565b6101bc60655481565b6101e26103d936600461136c565b610df2565b6101bc6103ec366004611229565b5f908152606c602052604090205490565b6066546101bc565b60668181548110610414575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104ae5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156105005760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d65737361676573000000000000000000000060448201526064016104a5565b81606754146105515760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d6174636800000000000000000000000060448201526064016104a5565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa158015610603573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062791906114b7565b1561063357505f610643565b60655461064090836114dd565b90505b92915050565b5f607e816106f3565b5f8161066057506001919050565b5b81156106765760089190911c90600101610661565b919050565b8060808310600181146106b35761069184610652565b60808101835360018301925084816020036008021b83528083019250506106d4565b84841516600181146106c7578483536106cc565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061070660018c8361067b565b90506107146001898361067b565b905061072089826106dc565b905061072e60018b8361067b565b9050600186146001811461079657603887106001811461077b5761075188610652565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610790565b87608001835360018301925087898437918701915b506107a7565b6107a45f89355f1a8461067b565b91505b506107b28c826106dc565b90508181035f8060388310600181146107e5576107ce84610652565b60f78101600882021b8517935060010191506107f0565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b610841610e8f565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108d6610e8f565b6108df5f610ef6565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461098c5760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016104a5565b610997838383610f6c565b33731111000000000000000000000000000000001111016109bc81865f878787611068565b5050505050565b6066545f908210610a165760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e676500000000000060448201526064016104a5565b60668281548110610a2957610a29611519565b905f5260205f2001549050919050565b6066546067545f91118015610a5d57506067545f908152606c602052604090205415155b15610a7757506067545f908152606c602052604090205490565b504290565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610b275760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f617465776179000000000000000000000000000000000000000000000000000060648201526084016104a5565b73ffffffffffffffffffffffffffffffffffffffff86163b15610b8c5760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f4100000000000000000000000000000000000000000000000060448201526064016104a5565b610b97838383610f6c565b610ba5868686868686611068565b505050505050565b610bb5610e8f565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610589565b610bfb610e8f565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610589565b5f54610100900460ff1615808015610c5757505f54600160ff909116105b80610c705750303b158015610c7057505f5460ff166001145b610ce25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610d3e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610d46611125565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610ded575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610dfa610e8f565b73ffffffffffffffffffffffffffffffffffffffff8116610e835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104a5565b610e8c81610ef6565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104a5565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115610fe45760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d697400000000000000000000000000000000000000000000000000000060648201526084016104a5565b6010810261520801808410156110625760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e736963206761730000000000000000000000000060648201526084016104a5565b50505050565b6066545f61107b8883888a898989610649565b60668054600181019091557f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354018190555f838152606c6020526040908190204290555190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e90611113908a9087908b908b908b90611546565b60405180910390a35050505050505050565b5f54610100900460ff166111a15760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a5565b6108df5f54610100900460ff166112205760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a5565b6108df33610ef6565b5f60208284031215611239575f80fd5b5035919050565b5f8060408385031215611251575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff81168114610676575f80fd5b5f8060408385031215611294575f80fd5b61129d83611260565b946020939093013593505050565b5f8083601f8401126112bb575f80fd5b50813567ffffffffffffffff8111156112d2575f80fd5b6020830191508360208285010111156112e9575f80fd5b9250929050565b5f805f805f805f60c0888a031215611306575f80fd5b61130f88611260565b9650602088013595506040880135945061132b60608901611260565b93506080880135925060a088013567ffffffffffffffff81111561134d575f80fd5b6113598a828b016112ab565b989b979a50959850939692959293505050565b5f6020828403121561137c575f80fd5b61064082611260565b5f805f8060608587031215611398575f80fd5b6113a185611260565b935060208501359250604085013567ffffffffffffffff8111156113c3575f80fd5b6113cf878288016112ab565b95989497509550505050565b5f805f805f8060a087890312156113f0575f80fd5b6113f987611260565b955061140760208801611260565b94506040870135935060608701359250608087013567ffffffffffffffff811115611430575f80fd5b61143c89828a016112ab565b979a9699509497509295939492505050565b5f806040838503121561145f575f80fd5b8235915061146f60208401611260565b90509250929050565b5f8060208385031215611489575f80fd5b823567ffffffffffffffff81111561149f575f80fd5b6114ab858286016112ab565b90969095509350505050565b5f602082840312156114c7575f80fd5b815180151581146114d6575f80fd5b9392505050565b8082028115828204841417610643577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a diff --git a/bindings/bin/rollup_deployed.hex b/bindings/bin/rollup_deployed.hex index 8f137b13b..5c9b85600 100644 --- a/bindings/bin/rollup_deployed.hex +++ b/bindings/bin/rollup_deployed.hex @@ -1 +1 @@ -0x608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd146109b1578063f2fde38b146109d0578063fb1e8b04146109ef575f80fd5b8063ddd8a3dc1461095e578063de8b30351461097d578063dff7827e1461099c575f80fd5b8063cd4edc69116100b7578063cd4edc6914610917578063ce5db8d61461092a578063d279c1911461093f575f80fd5b8063b35dac4e146108ba578063b3e0a509146108d9578063bedb86fb146108f8575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d1461085b578063b31a77d314610886578063b34844251461089b575f80fd5b8063a415d8dc146107f9578063a479265d14610827578063a4f209b01461083c575f80fd5b80638f1d37761161016c5780638f1d3776146106f9578063910129d4146107a957806397fc007c146107da575f80fd5b8063728cdbca146106a457806388b1ea09146106c35780638da5cb5b146106dc575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa146106465780636c578c1d14610671578063715018a614610690575f80fd5b80635ef7a94a1461057b5780635f77cf1d146105db5780636126729014610627575f80fd5b8063428868b51161022c578063428868b51461053257806357e0af6c146105455780635c975abb14610564575f80fd5b80632b7ac3f3146104c75780633b70c18a146104fe5780633e001b661461051d575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b3660046140c8565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b506103966103913660046140fa565b610a04565b005b3480156103a3575f80fd5b506103966103b2366004614158565b610ad6565b3480156103c2575f80fd5b5061033f6103d13660046140c8565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b506103966104083660046141a0565b610e2f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c3660046140c8565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c3660046140c8565b611326565b34801561047c575f80fd5b5061036961048b3660046140c8565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b63660046140c8565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104e6906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b348015610509575f80fd5b50609b546104e6906001600160a01b031681565b348015610528575f80fd5b5061036960aa5481565b6103966105403660046141df565b611354565b348015610550575f80fd5b5061039661055f3660046140c8565b611bbb565b34801561056f575f80fd5b5060655460ff1661033f565b348015610586575f80fd5b506105bb6105953660046140c8565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b3480156105e6575f80fd5b5061060e7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610632575f80fd5b506103966106413660046140c8565b611c66565b348015610651575f80fd5b506103696106603660046140c8565b60ab6020525f908152604090205481565b34801561067c575f80fd5b5061039661068b3660046140fa565b611e7b565b34801561069b575f80fd5b50610396611f38565b3480156106af575f80fd5b506103966106be36600461424c565b611f4b565b3480156106ce575f80fd5b5060a65461033f9060ff1681565b3480156106e7575f80fd5b506033546001600160a01b03166104e6565b348015610704575f80fd5b506107656107133660046140c8565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b3480156107b4575f80fd5b5061033f6107c33660046140c8565b5f90815260a4602052604090206003015460ff1690565b3480156107e5575f80fd5b506103966107f43660046140fa565b61228e565b348015610804575f80fd5b5061033f6108133660046140fa565b609f6020525f908152604090205460ff1681565b348015610832575f80fd5b5061036960995481565b348015610847575f80fd5b506103966108563660046140c8565b612371565b348015610866575f80fd5b506103696108753660046140fa565b60a56020525f908152604090205481565b348015610891575f80fd5b5061036960a85481565b3480156108a6575f80fd5b506103966108b53660046142a7565b612421565b3480156108c5575f80fd5b506103966108d43660046140fa565b612742565b3480156108e4575f80fd5b506103966108f33660046141a0565b61279b565b348015610903575f80fd5b5061039661091236600461431b565b612aeb565b61039661092536600461434d565b612c46565b348015610935575f80fd5b5061036960985481565b34801561094a575f80fd5b506103966109593660046140fa565b613212565b348015610969575f80fd5b506097546104e6906001600160a01b031681565b348015610988575f80fd5b5061033f6109973660046140c8565b6132d1565b3480156109a7575f80fd5b50610369609a5481565b3480156109bc575f80fd5b506103966109cb3660046140c8565b61331b565b3480156109db575f80fd5b506103966109ea3660046140fa565b6133be565b3480156109fa575f80fd5b5061036960a95481565b610a0c61344b565b6001600160a01b0381165f908152609f602052604090205460ff1615610a795760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610ade61344b565b5f8111610b2d5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610a70565b5f80610b3985856134a5565b915091505f610b4c836001015160c01c90565b5f81815260a160205260409020549091508214610bab5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b5f60a181610bb987856143a2565b81526020019081526020015f205414610c395760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610a70565b609d548111610cb05760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b610cbb6001826143b5565b609e555b8315610e2757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610d07816132d1565b15610d62575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610d529084906143a2565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610ddf575060a85481145b15610de9575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610cbf575b505050505050565b60a85415610e7f5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b610e8761353e565b5f80610e9384846134a5565b915091505f610ea6836001015160c01c90565b5f81815260a160205260409020549091508214610f055760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b610f0e81611326565b610f5a5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b610f63816132d1565b15610fb05760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003015460ff16156110115760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610a70565b5f81815260a260205260409020600101544210156110715760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610a70565b605983015160a05f6110846001856143b5565b81526020019081526020015f2054146110df5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f81815260a060205260409020541561113a5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610a70565b80609d546001011461118e5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b609d819055600160a35f6111a3866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a060205260409020556111f26111e5846011015160c01c90565b600985015160c01c613591565b60a25f6112006001846143b5565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab919061123990846143b5565b81526020019081526020015f205f905560a45f60018361125991906143b5565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611302866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061134e57505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156113c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e491906143c8565b6114305760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b60a854156114805760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b61148861353e565b61149560208301836143e3565b60ff1615806114b357506114ac60208301836143e3565b60ff166001145b6114ff5760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610a70565b60808201356115505760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610a70565b60a08201356115a15760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610a70565b5f806115b86115b36020860186614403565b6134a5565b915091505f6115cb836001015160c01c90565b90505f60a1816115dc8460016143a2565b81526020019081526020015f2054146116375760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610a70565b609e5481146116885760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b5f81815260a1602052604090205482146116e45760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610a70565b5f81815260ab60205260409020546080860135146117445760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f611753846011015160c01c90565b90505f61177f6117696060890160408a01614464565b61177960808a0160608b0161447d565b8461364e565b9050611791608088016060890161447d565b6001939093019261ffff1691909101905f8049156117b0575f496117d2565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b905060f96117e360208a018a6143e3565b60ff166001036117f257506101015b6040805182810190915296506118178761180f60208c018c6143e3565b60ff16613692565b60c085901b60018801526118458761183560808c0160608d0161447d565b61ffff1660c01b60099190910152565b60c084811b6011890152601988018490526039880183905260808a0135605989015260a08a0135607989015289013560998801526118a98761188a60208b018b614403565b60405161189892919061449e565b604051809103902060b99190910152565b60d9870186905260016118bf60208b018b6143e3565b60ff16106118f1576118f1876118db60608c0160408d01614464565b67ffffffffffffffff1660c01b60f99190910152565b8087205f86815260a1602090815260408083209390935560ab905290812060a08b0135905560a65460ff16156119505760a7545f90815260a460205260409020600201546099544291611943916143a2565b61194d91906143b5565b90505b6040518060800160405280428152602001826098544261197091906143a2565b61197a91906143a2565b815260200161198f60608d0160408e01614464565b67ffffffffffffffff1681526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611a0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3191906144ad565b90525f87815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8790556097546001600160a01b031692506374fe27b79150893590611a9990611a93908c018c614403565b5f613699565b5f611aa760408d018d614403565b6040518663ffffffff1660e01b8152600401611ac795949392919061450b565b602060405180830381865afa158015611ae2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0691906143c8565b611b785760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b5f84815260a16020526040808220549051909186917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050565b611bc361344b565b5f81118015611bd457506099548114155b611c205760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610a70565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff16158015611c8657505f5460ff8083169116105b611cf85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611d335f5460ff1690565b60ff16600214611d855760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610a70565b81611df85760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610a70565b609e545f90815260ab6020526040902054611e2157609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611c5a565b611e8361344b565b6001600160a01b0381165f908152609f602052604090205460ff16611eea5760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610a70565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610acb565b611f4061344b565b611f495f6136ed565b565b5f54610100900460ff1615808015611f6957505f54600160ff909116105b80611f825750303b158015611f8257505f5460ff166001145b611ff45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f805460ff191660011790558015612032575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038616158061204f57506001600160a01b038516155b15612086576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0387166120dc5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610a70565b6120e4613756565b6120ec6137da565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015612285575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b61229661344b565b6001600160a01b038116158015906122bc5750609c546001600160a01b03828116911614155b6123085760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610a70565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61237961344b565b5f81118015612389575060648111155b8015612397575060a9548114155b6123e35760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610a70565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611c5a565b60a854156124715760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b61247961353e565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156124e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061250991906143c8565b6125555760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b5f8061256186866134a5565b915091505f612574836001015160c01c90565b5f81815260a1602052604090205490915082146125d35760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b6125dc816132d1565b6126285760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a6805460ff191690556099546002909101544291612681916143a2565b116126f7575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f757400000000000000000000000000000000000000000000000000918301919091526126f29183919061385e565b612285565b6127028386866139ba565b61228581336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250613b6d565b61274a61344b565b60aa80545f90915561275c8282613c39565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611c5a565b6127a361344b565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea541561281a5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610a70565b5f8061282684846134a5565b915091505f612839836001015160c01c90565b905080156128895760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610a70565b5f612895846079015190565b9050806128e45760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610a70565b600984015160c01c156129395760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610a70565b5f612945856019015190565b036129925760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610a70565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440146129be856039015190565b14612a0b5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610a70565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b612af361344b565b8015612c1457612b01613ce4565b60a65460ff1615612bd35760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091612b559084906143a2565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612c1c613d3e565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612bf6565b50565b335f908152609f602052604090205460ff16612ca45760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610a70565b60a85415612cf45760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612cfc61353e565b60a65460ff1615612d4f5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610a70565b8167ffffffffffffffff16609d5410612daa5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a160205260409020548114612e115760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b612e248267ffffffffffffffff16611326565b612e705760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612eeb5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a260205260409020600101544210612f7b5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610a70565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fef91906144ad565b34101561303e5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b99763460405161319091815260200190565b60405180910390a35f609d5460016131a891906143a2565b90505b609e548111613200578267ffffffffffffffff1681146131ee576099545f82815260a26020526040812060010180549091906131e89084906143a2565b90915550505b806131f88161457e565b9150506131ab565b505060a6805460ff1916600117905550565b335f90815260a56020526040812054908190036132715760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610a70565b335f90815260a5602052604081205561328a8282613c39565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a826040516132c591815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b03161580159061134e5750505f90815260a46020526040902060030154610100900460ff161590565b61332361344b565b5f8111801561333457506098548114155b6133805760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610a70565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611c5a565b6133c661344b565b6001600160a01b0381166134425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a70565b612c43816136ed565b6033546001600160a01b03163314611f495760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a70565b5f805f6134b28585613d77565b90505f8160ff165f036134d3576134c98686613de7565b9094509050613530565b8160ff166001036134e8576134c98686613e50565b60405162461bcd60e51b815260206004820152601960248201527f556e737570706f727465642062617463682076657273696f6e000000000000006044820152606401610a70565b808420925050509250929050565b60655460ff1615611f495760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a70565b805f0361359c575050565b8082035f5b82811015613648576101008184038111156135bb57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b15801561361e575f80fd5b505af1158015613630573d5f803e3d5ffd5b505050506101008301925050610100810190506135a1565b50505050565b6040805160c085901b815260f084901b6008820152600a60208502820181019092525f9181016136838161ffff871686613ea3565b82900390912095945050505050565b8082535050565b60605f808080806136ac888a018a6146a2565b95509550955095509550508187106136ca5794506136e69350505050565b8387106136de5782955050505050506136e6565b509293505050505b9392505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166137d25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f49613f69565b5f54610100900460ff166138565760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f49613ff1565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af11580156138e2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390691906144ad565b5f86815260a460205260409020600101549091506139259082906143a2565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a5909152812080549091906139649084906143a2565b909155505060405161397790849061473f565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80613a075760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610a70565b5f613a16846001015160c01c90565b90505f613a24856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613a53876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613b15885160f81c90565b858888866040518663ffffffff1660e01b8152600401613b3995949392919061476b565b5f6040518083038186803b158015613b4f575f80fd5b505afa158015613b61573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a954909190606490613b91908461479c565b613b9b91906147b3565b9050613ba781836143b5565b60aa5f828254613bb791906143a2565b90915550506001600160a01b0384165f90815260a5602052604081208054839290613be39084906143a2565b9091555050604051613bf690849061473f565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8015613ce0575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613c88576040519150601f19603f3d011682016040523d82523d5f602084013e613c8d565b606091505b5050905080613cde5760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a70565b505b5050565b613cec61353e565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d213390565b6040516001600160a01b03909116815260200160405180910390a1565b613d46614076565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613d21565b5f81613dc55760405162461bcd60e51b815260206004820152601260248201527f456d7074792062617463682068656164657200000000000000000000000000006044820152606401610a70565b82825f818110613dd757613dd76147eb565b919091013560f81c949350505050565b5f8160f9811015613e3a5760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610a70565b6040519150808483378082016040529250929050565b5f816101018114613e3a5760405162461bcd60e51b815260206004820181905260248201527f626174636820686561646572206c656e67746820697320696e636f72726563746044820152606401610a70565b5f825f03613eb25750826136e6565b609b546001600160a01b03165f5b84811015613f5f576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa158015613f26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f4a91906144ad565b87525060209095019460019384019301613ec0565b5093949350505050565b5f54610100900460ff16613fe55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b6065805460ff19169055565b5f54610100900460ff1661406d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f49336136ed565b60655460ff16611f495760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a70565b5f602082840312156140d8575f80fd5b5035919050565b80356001600160a01b03811681146140f5575f80fd5b919050565b5f6020828403121561410a575f80fd5b6136e6826140df565b5f8083601f840112614123575f80fd5b50813567ffffffffffffffff81111561413a575f80fd5b602083019150836020828501011115614151575f80fd5b9250929050565b5f805f6040848603121561416a575f80fd5b833567ffffffffffffffff811115614180575f80fd5b61418c86828701614113565b909790965060209590950135949350505050565b5f80602083850312156141b1575f80fd5b823567ffffffffffffffff8111156141c7575f80fd5b6141d385828601614113565b90969095509350505050565b5f80604083850312156141f0575f80fd5b823567ffffffffffffffff80821115614207575f80fd5b9084019060e0828703121561421a575f80fd5b9092506020840135908082111561422f575f80fd5b50830160608186031215614241575f80fd5b809150509250929050565b5f805f805f8060c08789031215614261575f80fd5b61426a876140df565b9550614278602088016140df565b9450614286604088016140df565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156142ba575f80fd5b843567ffffffffffffffff808211156142d1575f80fd5b6142dd88838901614113565b909650945060208701359150808211156142f5575f80fd5b5061430287828801614113565b95989497509550505050565b8015158114612c43575f80fd5b5f6020828403121561432b575f80fd5b81356136e68161430e565b803567ffffffffffffffff811681146140f5575f80fd5b5f806040838503121561435e575f80fd5b61436783614336565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561134e5761134e614375565b8181038181111561134e5761134e614375565b5f602082840312156143d8575f80fd5b81516136e68161430e565b5f602082840312156143f3575f80fd5b813560ff811681146136e6575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614436575f80fd5b83018035915067ffffffffffffffff821115614450575f80fd5b602001915036819003821315614151575f80fd5b5f60208284031215614474575f80fd5b6136e682614336565b5f6020828403121561448d575f80fd5b813561ffff811681146136e6575f80fd5b818382375f9101908152919050565b5f602082840312156144bd575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b818110156145555784516001600160a01b031683529383019391830191600101614530565b505087604086015284810360608601526145708187896144c4565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145ae576145ae614375565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126145f1575f80fd5b8135602067ffffffffffffffff8083111561460e5761460e6145b5565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614651576146516145b5565b6040529384526020818701810194908101925087851115614670575f80fd5b6020870191505b8482101561469757614688826140df565b83529183019190830190614677565b979650505050505050565b5f805f805f8060c087890312156146b7575f80fd5b86359550602087013567ffffffffffffffff808211156146d5575f80fd5b6146e18a838b016145e2565b96506040890135955060608901359150808211156146fd575f80fd5b6147098a838b016145e2565b94506080890135935060a0890135915080821115614725575f80fd5b5061473289828a016145e2565b9150509295509295509295565b5f82515f5b8181101561475e5760208186018101518583015201614744565b505f920191825250919050565b858152846020820152608060408201525f61478a6080830185876144c4565b90508260608301529695505050505050565b808202811582820484141761134e5761134e614375565b5f826147e6577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c6343000818000a +0x608060405260043610610332575f3560e01c806388b1ea09116101a7578063bedb86fb116100e7578063d8dc99d211610092578063dff7827e1161006d578063dff7827e14610a3a578063e3fff1dd14610a4f578063f2fde38b14610a6e578063fb1e8b0414610a8d575f80fd5b8063d8dc99d2146109e7578063ddd8a3dc146109fc578063de8b303514610a1b575f80fd5b8063ce5db8d6116100c2578063ce5db8d614610994578063cf9a6745146109a9578063d279c191146109c8575f80fd5b8063bedb86fb14610943578063c555389214610962578063cd4edc6914610981575f80fd5b8063a479265d11610152578063b31a77d31161012d578063b31a77d3146108d1578063b3484425146108e6578063b35dac4e14610905578063b3e0a50914610924575f80fd5b8063a479265d14610872578063a4f209b014610887578063abc8d68d146108a6575f80fd5b8063910129d411610182578063910129d4146107f457806397fc007c14610825578063a415d8dc14610844575f80fd5b806388b1ea091461070e5780638da5cb5b146107275780638f1d377614610744575f80fd5b80633b70c18a116102725780635ef7a94a1161021d57806368589dfa116101f857806368589dfa146106915780636c578c1d146106bc578063715018a6146106db578063728cdbca146106ef575f80fd5b80635ef7a94a146105c65780635f77cf1d146106265780636126729014610672575f80fd5b80634e8f1d671161024d5780634e8f1d671461057157806357e0af6c146105905780635c975abb146105af575f80fd5b80633b70c18a1461052a5780633e001b6614610549578063428868b51461055e575f80fd5b806313361101116102dd57806321e2f9e0116102b857806321e2f9e01461047e5780632362f03e1461049d5780632571098d146104c85780632b7ac3f3146104f3575f80fd5b8063133611011461041a57806318463fb01461043957806318af3b2b1461044e575f80fd5b806310d445831161030d57806310d44583146103c4578063116a1f42146103e3578063121dcd5014610405575f80fd5b806304d772151461033d578063059def61146103805780630ceb6780146103a3575f80fd5b3661033957005b5f80fd5b348015610348575f80fd5b5061036b61035736600461462b565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561038b575f80fd5b50610395609d5481565b604051908152602001610377565b3480156103ae575f80fd5b506103c26103bd36600461465d565b610aa2565b005b3480156103cf575f80fd5b506103c26103de3660046146bb565b610b74565b3480156103ee575f80fd5b5061036b6103fd36600461462b565b609d54101590565b348015610410575f80fd5b50610395609e5481565b348015610425575f80fd5b506103c2610434366004614703565b610eb0565b348015610444575f80fd5b5061039560a75481565b348015610459575f80fd5b5061036b61046836600461462b565b5f90815260a26020526040902060010154421090565b348015610489575f80fd5b5061036b61049836600461462b565b61138a565b3480156104a8575f80fd5b506103956104b736600461462b565b60a16020525f908152604090205481565b3480156104d3575f80fd5b506103956104e236600461462b565b60a06020525f908152604090205481565b3480156104fe575f80fd5b50609c54610512906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b348015610535575f80fd5b50609b54610512906001600160a01b031681565b348015610554575f80fd5b5061039560aa5481565b6103c261056c366004614768565b6113b8565b34801561057c575f80fd5b506103c261058b3660046147c8565b6115f4565b34801561059b575f80fd5b506103c26105aa36600461462b565b6118c2565b3480156105ba575f80fd5b5060655460ff1661036b565b3480156105d1575f80fd5b506106066105e036600461462b565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610377565b348015610631575f80fd5b506106597f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610377565b34801561067d575f80fd5b506103c261068c36600461462b565b61196d565b34801561069c575f80fd5b506103956106ab36600461462b565b60ab6020525f908152604090205481565b3480156106c7575f80fd5b506103c26106d636600461465d565b611b48565b3480156106e6575f80fd5b506103c2611c05565b3480156106fa575f80fd5b506103c2610709366004614879565b611c18565b348015610719575f80fd5b5060a65461036b9060ff1681565b348015610732575f80fd5b506033546001600160a01b0316610512565b34801561074f575f80fd5b506107b061075e36600461462b565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c001610377565b3480156107ff575f80fd5b5061036b61080e36600461462b565b5f90815260a4602052604090206003015460ff1690565b348015610830575f80fd5b506103c261083f36600461465d565b611f21565b34801561084f575f80fd5b5061036b61085e36600461465d565b609f6020525f908152604090205460ff1681565b34801561087d575f80fd5b5061039560995481565b348015610892575f80fd5b506103c26108a136600461462b565b612004565b3480156108b1575f80fd5b506103956108c036600461465d565b60a56020525f908152604090205481565b3480156108dc575f80fd5b5061039560a85481565b3480156108f1575f80fd5b506103c26109003660046148d4565b6120b4565b348015610910575f80fd5b506103c261091f36600461465d565b6123b8565b34801561092f575f80fd5b506103c261093e366004614703565b612411565b34801561094e575f80fd5b506103c261095d366004614948565b612761565b34801561096d575f80fd5b506103c261097c36600461462b565b61289f565b6103c261098f36600461497a565b612942565b34801561099f575f80fd5b5061039560985481565b3480156109b4575f80fd5b506103c26109c336600461462b565b612ed4565b3480156109d3575f80fd5b506103c26109e236600461465d565b613043565b3480156109f2575f80fd5b5061039560ac5481565b348015610a07575f80fd5b50609754610512906001600160a01b031681565b348015610a26575f80fd5b5061036b610a3536600461462b565b613102565b348015610a45575f80fd5b50610395609a5481565b348015610a5a575f80fd5b506103c2610a6936600461462b565b61314c565b348015610a79575f80fd5b506103c2610a8836600461465d565b6131ef565b348015610a98575f80fd5b5061039560a95481565b610aaa61327c565b6001600160a01b0381165f908152609f602052604090205460ff1615610b175760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610b7c61327c565b5f8111610bcb5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610b0e565b5f80610bd785856132d6565b915091505f610bea836001015160c01c90565b5f81815260a160205260409020549091508214610c495760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b5f60a181610c5787856149cf565b81526020019081526020015f205414610cd75760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610b0e565b609d548111610d4e5760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610b0e565b610d596001826149e2565b609e555b8315610ea857604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610da581613102565b15610e00575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610df09084906149cf565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810191909155600301805461ffff1916905560a85415801590610e60575060a85481145b15610e6a575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610d5d575b505050505050565b60a85415610f005760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b610f0861336f565b5f80610f1484846132d6565b915091505f610f27836001015160c01c90565b5f81815260a160205260409020549091508214610f865760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b610f8f8161138a565b610fdb5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610b0e565b610fe481613102565b156110315760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610b0e565b5f81815260a4602052604090206003015460ff16156110925760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610b0e565b5f81815260a260205260409020600101544210156110f25760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610b0e565b605983015160a05f6111056001856149e2565b81526020019081526020015f2054146111605760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610b0e565b5f81815260a06020526040902054156111bb5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610b0e565b80609d546001011461120f5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610b0e565b609d819055600160a35f611224866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a06020526040902055611273611266846011015160c01c90565b600985015160c01c6133c2565b60a25f6112816001846149e2565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab91906112ba90846149e2565b81526020019081526020015f205f905560a45f6001836112da91906149e2565b815260208082019290925260409081015f90812080547fffffffff000000000000000000000000000000000000000000000000000000001681556001810182905560028101829055600301805461ffff1916905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611366866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a26020526040812054158015906113b257505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611424573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061144891906149f5565b6114945760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610b0e565b60a854156114e45760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b6114ec61336f565b60ac54609b54604080517fb59b1a7800000000000000000000000000000000000000000000000000000000815290514293926001600160a01b03169163b59b1a789160048083019260209291908290030181865afa158015611550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115749190614a10565b61157e91906149cf565b10156115e6575f6115956080840160608501614a27565b61ffff16116115e65760405162461bcd60e51b815260206004820152600b60248201527f6c316d73672064656c61790000000000000000000000000000000000000000006044820152606401610b0e565b6115f0828261347f565b5050565b60a854156116445760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b61164c61336f565b60ac54609e545f90815260a260205260408120549091429161166e91906149cf565b1090505f4260ac54609b5f9054906101000a90046001600160a01b03166001600160a01b031663b59b1a786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ea9190614a10565b6116f491906149cf565b109050811580156117025750805b15611769575f61171860808a0160608b01614a27565b61ffff16116117695760405162461bcd60e51b815260206004820152600b60248201527f6c316d73672064656c61790000000000000000000000000000000000000000006044820152606401610b0e565b81806117725750805b6117be5760405162461bcd60e51b815260206004820152600e60248201527f696e76616c69642074696d696e670000000000000000000000000000000000006044820152606401610b0e565b6117c8888861347f565b5f806117d488886132d6565b915091505f6117e7836001015160c01c90565b905080609e541461183a5760405162461bcd60e51b815260206004820152601660248201527f696e636f727265637420626174636820686561646572000000000000000000006044820152606401610b0e565b5f81815260a1602052604090205482146118965760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b5f81815260a260205260409020426001909101556118b5838888613bb2565b5050505050505050505050565b6118ca61327c565b5f811180156118db57506099548114155b6119275760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610b0e565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff1615801561198d57505f5460ff8083169116105b6119ff5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b0e565b5f805461ffff191660ff831617610100179055611a1d5f5460ff1690565b60ff16600214611a6f5760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610b0e565b81611ae25760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610b0e565b609e545f90815260ab6020526040902054611b0b57609e545f90815260ab602052604090208290555b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611961565b611b5061327c565b6001600160a01b0381165f908152609f602052604090205460ff16611bb75760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610b0e565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610b69565b611c0d61327c565b611c165f613d65565b565b5f54610100900460ff1615808015611c3657505f54600160ff909116105b80611c4f5750303b158015611c4f57505f5460ff166001145b611cc15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b0e565b5f805460ff191660011790558015611ce2575f805461ff0019166101001790555b6001600160a01b0386161580611cff57506001600160a01b038516155b15611d36576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716611d8c5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610b0e565b611d94613dce565b611d9c613e52565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015611f18575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b611f2961327c565b6001600160a01b03811615801590611f4f5750609c546001600160a01b03828116911614155b611f9b5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610b0e565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61200c61327c565b5f8111801561201c575060648111155b801561202a575060a9548114155b6120765760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610b0e565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611961565b60a854156121045760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b61210c61336f565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612178573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219c91906149f5565b6121e85760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610b0e565b5f806121f486866132d6565b915091505f612207836001015160c01c90565b5f81815260a1602052604090205490915082146122665760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b61226f81613102565b6122bb5760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610b0e565b5f81815260a46020526040902060038101805461ff00191661010017905560a6805460ff1916905560995460029091015442916122f7916149cf565b1161236d575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f7574000000000000000000000000000000000000000000000000009183019190915261236891839190613ed6565b611f18565b612378838686613bb2565b611f1881336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250614032565b6123c061327c565b60aa80545f9091556123d282826140fe565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611961565b61241961327c565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea54156124905760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610b0e565b5f8061249c84846132d6565b915091505f6124af836001015160c01c90565b905080156124ff5760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610b0e565b5f61250b846079015190565b90508061255a5760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610b0e565b600984015160c01c156125af5760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610b0e565b5f6125bb856019015190565b036126085760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610b0e565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014612634856039015190565b146126815760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610b0e565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b61276961327c565b801561286d576127776141a8565b60a65460ff161561282c5760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a590925282208054919290916127cb9084906149cf565b909155505060a7545f90815260a46020526040812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810191909155600301805461ffff1916905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612875614202565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361284f565b50565b6128a761327c565b5f811180156128b8575060ac548114155b6129045760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206e657720726f6c6c75702064656c617920706572696f64006044820152606401610b0e565b60ac80549082905560408051828152602081018490527f624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad19101611961565b335f908152609f602052604090205460ff166129a05760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610b0e565b60a854156129f05760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b6129f861336f565b60a65460ff1615612a4b5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610b0e565b8167ffffffffffffffff16609d5410612aa65760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610b0e565b67ffffffffffffffff82165f90815260a160205260409020548114612b0d5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b612b208267ffffffffffffffff1661138a565b612b6c5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610b0e565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612be75760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610b0e565b67ffffffffffffffff82165f90815260a260205260409020600101544210612c775760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610b0e565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cc7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ceb9190614a10565b341015612d3a5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610b0e565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009093169816979097171783559451600183015591516002820155925160039093018054925115156101000261ff00199415159490941661ffff19909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b997634604051612e5291815260200190565b60405180910390a35f609d546001612e6a91906149cf565b90505b609e548111612ec2578267ffffffffffffffff168114612eb0576099545f82815260a2602052604081206001018054909190612eaa9084906149cf565b90915550505b80612eba81614a48565b915050612e6d565b505060a6805460ff1916600117905550565b5f54600390610100900460ff16158015612ef457505f5460ff8083169116105b612f665760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b0e565b5f805461ffff191660ff831617610100178155829003612fc85760405162461bcd60e51b815260206004820152601b60248201527f696e76616c696420726f6c6c75702064656c617920706572696f6400000000006044820152606401610b0e565b60ac829055604080515f8152602081018490527f624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad1910160405180910390a15f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611961565b335f90815260a56020526040812054908190036130a25760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610b0e565b335f90815260a560205260408120556130bb82826140fe565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a826040516130f691815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b0316158015906113b25750505f90815260a46020526040902060030154610100900460ff161590565b61315461327c565b5f8111801561316557506098548114155b6131b15760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610b0e565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611961565b6131f761327c565b6001600160a01b0381166132735760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b0e565b61289c81613d65565b6033546001600160a01b03163314611c165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0e565b5f805f6132e3858561423b565b90505f8160ff165f03613304576132fa86866142ab565b9094509050613361565b8160ff16600103613319576132fa8686614314565b60405162461bcd60e51b815260206004820152601960248201527f556e737570706f727465642062617463682076657273696f6e000000000000006044820152606401610b0e565b808420925050509250929050565b60655460ff1615611c165760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b0e565b805f036133cd575050565b8082035f5b82811015613479576101008184038111156133ec57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b15801561344f575f80fd5b505af1158015613461573d5f803e3d5ffd5b505050506101008301925050610100810190506133d2565b50505050565b61348c6020830183614a7f565b60ff1615806134aa57506134a36020830183614a7f565b60ff166001145b6134f65760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610b0e565b60808201356135475760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610b0e565b60a08201356135985760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610b0e565b5f806135af6135aa6020860186614a9f565b6132d6565b915091505f6135c2836001015160c01c90565b90505f60a1816135d38460016149cf565b81526020019081526020015f20541461362e5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610b0e565b609e54811461367f5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610b0e565b5f81815260a1602052604090205482146136db5760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610b0e565b5f81815260ab602052604090205460808601351461373b5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610b0e565b5f61374a846011015160c01c90565b90505f6137766137606060890160408a01614b00565b61377060808a0160608b01614a27565b84614367565b90506137886080880160608901614a27565b6001939093019261ffff1691909101905f8049156137a7575f496137c9565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b905060f96137da60208a018a614a7f565b60ff166001036137e957506101015b60408051828101909152965061380e8761380660208c018c614a7f565b60ff166143ab565b60c085901b600188015261383c8761382c60808c0160608d01614a27565b61ffff1660c01b60099190910152565b60c084811b6011890152601988018490526039880183905260808a0135605989015260a08a0135607989015289013560998801526138a08761388160208b018b614a9f565b60405161388f929190614b19565b604051809103902060b99190910152565b60d9870186905260016138b660208b018b614a7f565b60ff16106138e8576138e8876138d260608c0160408d01614b00565b67ffffffffffffffff1660c01b60f99190910152565b8087205f86815260a1602090815260408083209390935560ab905290812060a08b0135905560a65460ff16156139475760a7545f90815260a46020526040902060020154609954429161393a916149cf565b61394491906149e2565b90505b6040518060800160405280428152602001826098544261396791906149cf565b61397191906149cf565b815260200161398660608d0160408e01614b00565b67ffffffffffffffff1681526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015613a04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a289190614a10565b90525f87815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8790556097546001600160a01b031692506374fe27b79150893590613a9090613a8a908c018c614a9f565b5f6143b2565b5f613a9e60408d018d614a9f565b6040518663ffffffff1660e01b8152600401613abe959493929190614b6f565b602060405180830381865afa158015613ad9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613afd91906149f5565b613b6f5760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610b0e565b5f84815260a16020526040808220549051909186917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050565b80613bff5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610b0e565b5f613c0e846001015160c01c90565b90505f613c1c856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613c4b876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613d0d885160f81c90565b858888866040518663ffffffff1660e01b8152600401613d31959493929190614be2565b5f6040518083038186803b158015613d47575f80fd5b505afa158015613d59573d5f803e3d5ffd5b50505050505050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613e4a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b611c16614406565b5f54610100900460ff16613ece5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b611c1661448e565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015613f5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f7e9190614a10565b5f86815260a46020526040902060010154909150613f9d9082906149cf565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a590915281208054909190613fdc9084906149cf565b9091555050604051613fef908490614c13565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b5f83815260a4602052604081206001015460a9549091906064906140569084614c3f565b6140609190614c56565b905061406c81836149e2565b60aa5f82825461407c91906149cf565b90915550506001600160a01b0384165f90815260a56020526040812080548392906140a89084906149cf565b90915550506040516140bb908490614c13565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80156115f0575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461414d576040519150601f19603f3d011682016040523d82523d5f602084013e614152565b606091505b50509050806141a35760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610b0e565b505050565b6141b061336f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586141e53390565b6040516001600160a01b03909116815260200160405180910390a1565b61420a614513565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336141e5565b5f816142895760405162461bcd60e51b815260206004820152601260248201527f456d7074792062617463682068656164657200000000000000000000000000006044820152606401610b0e565b82825f81811061429b5761429b614c8e565b919091013560f81c949350505050565b5f8160f98110156142fe5760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610b0e565b6040519150808483378082016040529250929050565b5f8161010181146142fe5760405162461bcd60e51b815260206004820181905260248201527f626174636820686561646572206c656e67746820697320696e636f72726563746044820152606401610b0e565b6040805160c085901b815260f084901b6008820152600a60208502820181019092525f91810161439c8161ffff871686614565565b82900390912095945050505050565b8082535050565b60605f808080806143c5888a018a614da8565b95509550955095509550508187106143e35794506143ff9350505050565b8387106143f75782955050505050506143ff565b509293505050505b9392505050565b5f54610100900460ff166144825760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b6065805460ff19169055565b5f54610100900460ff1661450a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b611c1633613d65565b60655460ff16611c165760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610b0e565b5f825f036145745750826143ff565b609b546001600160a01b03165f5b84811015614621576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa1580156145e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061460c9190614a10565b87525060209095019460019384019301614582565b5093949350505050565b5f6020828403121561463b575f80fd5b5035919050565b80356001600160a01b0381168114614658575f80fd5b919050565b5f6020828403121561466d575f80fd5b6143ff82614642565b5f8083601f840112614686575f80fd5b50813567ffffffffffffffff81111561469d575f80fd5b6020830191508360208285010111156146b4575f80fd5b9250929050565b5f805f604084860312156146cd575f80fd5b833567ffffffffffffffff8111156146e3575f80fd5b6146ef86828701614676565b909790965060209590950135949350505050565b5f8060208385031215614714575f80fd5b823567ffffffffffffffff81111561472a575f80fd5b61473685828601614676565b90969095509350505050565b5f60e08284031215614752575f80fd5b50919050565b5f60608284031215614752575f80fd5b5f8060408385031215614779575f80fd5b823567ffffffffffffffff80821115614790575f80fd5b61479c86838701614742565b935060208501359150808211156147b1575f80fd5b506147be85828601614758565b9150509250929050565b5f805f805f80608087890312156147dd575f80fd5b863567ffffffffffffffff808211156147f4575f80fd5b6148008a838b01614742565b97506020890135915080821115614815575f80fd5b6148218a838b01614758565b96506040890135915080821115614836575f80fd5b6148428a838b01614676565b9096509450606089013591508082111561485a575f80fd5b5061486789828a01614676565b979a9699509497509295939492505050565b5f805f805f8060c0878903121561488e575f80fd5b61489787614642565b95506148a560208801614642565b94506148b360408801614642565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156148e7575f80fd5b843567ffffffffffffffff808211156148fe575f80fd5b61490a88838901614676565b90965094506020870135915080821115614922575f80fd5b5061492f87828801614676565b95989497509550505050565b801515811461289c575f80fd5b5f60208284031215614958575f80fd5b81356143ff8161493b565b803567ffffffffffffffff81168114614658575f80fd5b5f806040838503121561498b575f80fd5b61499483614963565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156113b2576113b26149a2565b818103818111156113b2576113b26149a2565b5f60208284031215614a05575f80fd5b81516143ff8161493b565b5f60208284031215614a20575f80fd5b5051919050565b5f60208284031215614a37575f80fd5b813561ffff811681146143ff575f80fd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a7857614a786149a2565b5060010190565b5f60208284031215614a8f575f80fd5b813560ff811681146143ff575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614ad2575f80fd5b83018035915067ffffffffffffffff821115614aec575f80fd5b6020019150368190038213156146b4575f80fd5b5f60208284031215614b10575f80fd5b6143ff82614963565b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b81811015614bb95784516001600160a01b031683529383019391830191600101614b94565b50508760408601528481036060860152614bd4818789614b28565b9a9950505050505050505050565b858152846020820152608060408201525f614c01608083018587614b28565b90508260608301529695505050505050565b5f82515f5b81811015614c325760208186018101518583015201614c18565b505f920191825250919050565b80820281158282048414176113b2576113b26149a2565b5f82614c89577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112614cf7575f80fd5b8135602067ffffffffffffffff80831115614d1457614d14614cbb565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614d5757614d57614cbb565b6040529384526020818701810194908101925087851115614d76575f80fd5b6020870191505b84821015614d9d57614d8e82614642565b83529183019190830190614d7d565b979650505050505050565b5f805f805f8060c08789031215614dbd575f80fd5b86359550602087013567ffffffffffffffff80821115614ddb575f80fd5b614de78a838b01614ce8565b9650604089013595506060890135915080821115614e03575f80fd5b614e0f8a838b01614ce8565b94506080890135935060a0890135915080821115614e2b575f80fd5b50614e3889828a01614ce8565b915050929550929550929556fea164736f6c6343000818000a diff --git a/bindings/bindings/l1messagequeuewithgaspriceoracle.go b/bindings/bindings/l1messagequeuewithgaspriceoracle.go index fca2a8623..c2a248f6c 100644 --- a/bindings/bindings/l1messagequeuewithgaspriceoracle.go +++ b/bindings/bindings/l1messagequeuewithgaspriceoracle.go @@ -31,8 +31,8 @@ var ( // L1MessageQueueWithGasPriceOracleMetaData contains all meta data concerning the L1MessageQueueWithGasPriceOracle contract. var L1MessageQueueWithGasPriceOracleMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rollup\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_enforcedTxGateway\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"DequeueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"queueIndex\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"QueueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldGateway\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newGateway\",\"type\":\"address\"}],\"name\":\"UpdateEnforcedTxGateway\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldGasOracle\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newGasOracle\",\"type\":\"address\"}],\"name\":\"UpdateGasOracle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldL2BaseFee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newL2BaseFee\",\"type\":\"uint256\"}],\"name\":\"UpdateL2BaseFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_oldMaxGasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxGasLimit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldWhitelistChecker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newWhitelistChecker\",\"type\":\"address\"}],\"name\":\"UpdateWhitelistChecker\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ENFORCED_TX_GATEWAAY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROLLUP_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendEnforcedTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"calculateIntrinsicGasFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"computeTransactionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"estimateCrossDomainMessageFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"}],\"name\":\"getCrossDomainMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_whitelistChecker\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BaseFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextCrossDomainMessageIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingQueueIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"popCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newL2BaseFee\",\"type\":\"uint256\"}],\"name\":\"setL2BaseFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"updateMaxGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newWhitelistChecker\",\"type\":\"address\"}],\"name\":\"updateWhitelistChecker\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"whitelistChecker\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60e060405234801562000010575f80fd5b506040516200171438038062001714833981016040819052620000339162000185565b6001600160a01b03831615806200005157506001600160a01b038216155b806200006457506001600160a01b038116155b156200008357604051630ecc6fdf60e41b815260040160405180910390fd5b6200008d620000ab565b6001600160a01b0392831660805290821660a0521660c052620001cc565b5f54610100900460ff1615620001175760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000167575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b038116811462000180575f80fd5b919050565b5f805f6060848603121562000198575f80fd5b620001a38462000169565b9250620001b36020850162000169565b9150620001c36040850162000169565b90509250925092565b60805160a05160c0516115086200020c5f395f818161030501526109d501525f818161021201526103c001525f818161027c015261087d01526115085ff3fe608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063a85006ca116100dd578063d99bc80e11610088578063e3176bd511610063578063e3176bd51461037a578063f2fde38b14610383578063fd0ad31e14610396575f80fd5b8063d99bc80e1461033a578063da35a26f1461034d578063e172d3a114610360575f80fd5b8063bdc6f0a0116100b8578063bdc6f0a0146102ed578063c276067714610300578063d5ad4a9714610327575f80fd5b8063a85006ca146102b1578063ae453cd5146102ba578063bb7862ca146102cd575f80fd5b80635f9cd92e1161013d5780638da5cb5b116101185780638da5cb5b14610259578063927ede2d146102775780639b1597821461029e575f80fd5b80635f9cd92e146101f2578063715018a6146102055780638770d7071461020d575f80fd5b80633e4cbbe61161016d5780633e4cbbe6146101c35780635ad9945a146101d65780635e45da23146101e9575f80fd5b806329aa604b146101885780633c7f5283146101ae575b5f80fd5b61019b610196366004611173565b61039e565b6040519081526020015b60405180910390f35b6101c16101bc36600461118a565b6103bd565b005b61019b6101d13660046111cd565b61052e565b61019b6101e436600461123a565b6105e2565b61019b60685481565b6101c16102003660046112b6565b6107d2565b6101c1610867565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a5565b60335473ffffffffffffffffffffffffffffffffffffffff16610234565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16102ac3660046112cf565b61087a565b61019b60675481565b61019b6102c8366004611173565b61095c565b606b546102349073ffffffffffffffffffffffffffffffffffffffff1681565b6101c16102fb366004611325565b6109d2565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c1610335366004611173565b610b03565b6101c1610348366004611173565b610b49565b6101c161035b366004611398565b610b8f565b61019b61036e3660046113c2565b60100261520801919050565b61019b60655481565b6101c16103913660046112b6565b610d48565b60665461019b565b606681815481106103ad575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104475760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156104995760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d657373616765730000000000000000000000604482015260640161043e565b81606754146104ea5760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d61746368000000000000000000000000604482015260640161043e565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa15801561059c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c09190611401565b156105cc57505f6105dc565b6065546105d99083611427565b90505b92915050565b5f607e8161068c565b5f816105f957506001919050565b5b811561060f5760089190911c906001016105fa565b919050565b80608083106001811461064c5761062a846105eb565b60808101835360018301925084816020036008021b835280830192505061066d565b848415166001811461066057848353610665565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061069f60018c83610614565b90506106ad60018983610614565b90506106b98982610675565b90506106c760018b83610614565b9050600186146001811461072f576038871060018114610714576106ea886105eb565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610729565b87608001835360018301925087898437918701915b50610740565b61073d5f89355f1a84610614565b91505b5061074b8c82610675565b90508181035f80603883106001811461077e57610767846105eb565b60f78101600882021b851793506001019150610789565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b6107da610de5565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61086f610de5565b6108785f610e4c565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109255760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e676572000000000000000000000000000000000000000000606482015260840161043e565b610930838383610ec2565b337311110000000000000000000000000000000011110161095581865f878787610fbe565b5050505050565b6066545f9082106109af5760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e6765000000000000604482015260640161043e565b606682815481106109c2576109c2611463565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610a7d5760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f6174657761790000000000000000000000000000000000000000000000000000606482015260840161043e565b73ffffffffffffffffffffffffffffffffffffffff86163b15610ae25760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f41000000000000000000000000000000000000000000000000604482015260640161043e565b610aed838383610ec2565b610afb868686868686610fbe565b505050505050565b610b0b610de5565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610522565b610b51610de5565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610522565b5f54610100900460ff1615808015610bad57505f54600160ff909116105b80610bc65750303b158015610bc657505f5460ff166001145b610c385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161043e565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c94575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610c9c61106f565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610d43575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610d50610de5565b73ffffffffffffffffffffffffffffffffffffffff8116610dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161043e565b610de281610e4c565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161043e565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115610f3a5760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d6974000000000000000000000000000000000000000000000000000000606482015260840161043e565b601081026152080180841015610fb85760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e7369632067617300000000000000000000000000606482015260840161043e565b50505050565b6066545f610fd18883888a8989896105e2565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e9061105d908a9087908b908b908b90611490565b60405180910390a35050505050505050565b5f54610100900460ff166110eb5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b6108785f54610100900460ff1661116a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b61087833610e4c565b5f60208284031215611183575f80fd5b5035919050565b5f806040838503121561119b575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461060f575f80fd5b5f80604083850312156111de575f80fd5b6111e7836111aa565b946020939093013593505050565b5f8083601f840112611205575f80fd5b50813567ffffffffffffffff81111561121c575f80fd5b602083019150836020828501011115611233575f80fd5b9250929050565b5f805f805f805f60c0888a031215611250575f80fd5b611259886111aa565b96506020880135955060408801359450611275606089016111aa565b93506080880135925060a088013567ffffffffffffffff811115611297575f80fd5b6112a38a828b016111f5565b989b979a50959850939692959293505050565b5f602082840312156112c6575f80fd5b6105d9826111aa565b5f805f80606085870312156112e2575f80fd5b6112eb856111aa565b935060208501359250604085013567ffffffffffffffff81111561130d575f80fd5b611319878288016111f5565b95989497509550505050565b5f805f805f8060a0878903121561133a575f80fd5b611343876111aa565b9550611351602088016111aa565b94506040870135935060608701359250608087013567ffffffffffffffff81111561137a575f80fd5b61138689828a016111f5565b979a9699509497509295939492505050565b5f80604083850312156113a9575f80fd5b823591506113b9602084016111aa565b90509250929050565b5f80602083850312156113d3575f80fd5b823567ffffffffffffffff8111156113e9575f80fd5b6113f5858286016111f5565b90969095509350505050565b5f60208284031215611411575f80fd5b81518015158114611420575f80fd5b9392505050565b80820281158282048414176105dc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rollup\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_enforcedTxGateway\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"DequeueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"queueIndex\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"QueueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldGateway\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newGateway\",\"type\":\"address\"}],\"name\":\"UpdateEnforcedTxGateway\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldGasOracle\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newGasOracle\",\"type\":\"address\"}],\"name\":\"UpdateGasOracle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldL2BaseFee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newL2BaseFee\",\"type\":\"uint256\"}],\"name\":\"UpdateL2BaseFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_oldMaxGasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxGasLimit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldWhitelistChecker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newWhitelistChecker\",\"type\":\"address\"}],\"name\":\"UpdateWhitelistChecker\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ENFORCED_TX_GATEWAAY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROLLUP_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendEnforcedTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"calculateIntrinsicGasFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"computeTransactionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"estimateCrossDomainMessageFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"}],\"name\":\"getCrossDomainMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFirstUnfinalizedMessageEnqueueTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getMessageEnqueueTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_whitelistChecker\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BaseFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"messageEnqueueTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextCrossDomainMessageIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingQueueIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"popCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newL2BaseFee\",\"type\":\"uint256\"}],\"name\":\"setL2BaseFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"updateMaxGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newWhitelistChecker\",\"type\":\"address\"}],\"name\":\"updateWhitelistChecker\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"whitelistChecker\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x60e060405234801562000010575f80fd5b50604051620017ca380380620017ca833981016040819052620000339162000185565b6001600160a01b03831615806200005157506001600160a01b038216155b806200006457506001600160a01b038116155b156200008357604051630ecc6fdf60e41b815260040160405180910390fd5b6200008d620000ab565b6001600160a01b0392831660805290821660a0521660c052620001cc565b5f54610100900460ff1615620001175760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000167575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b038116811462000180575f80fd5b919050565b5f805f6060848603121562000198575f80fd5b620001a38462000169565b9250620001b36020850162000169565b9150620001c36040850162000169565b90509250925092565b60805160a05160c0516115be6200020c5f395f818161034d0152610a7f01525f8181610233015261042701525f81816102bc01526108e401526115be5ff3fe608060405234801561000f575f80fd5b50600436106101a5575f3560e01c8063ae453cd5116100e8578063d99bc80e11610093578063e3176bd51161006e578063e3176bd5146103c2578063f2fde38b146103cb578063f7ca0c51146103de578063fd0ad31e146103fd575f80fd5b8063d99bc80e14610382578063da35a26f14610395578063e172d3a1146103a8575f80fd5b8063bdc6f0a0116100c3578063bdc6f0a014610335578063c276067714610348578063d5ad4a971461036f575f80fd5b8063ae453cd5146102fa578063b59b1a781461030d578063bb7862ca14610315575f80fd5b8063715018a6116101535780638dc73d871161012e5780638dc73d8714610298578063927ede2d146102b75780639b159782146102de578063a85006ca146102f1575f80fd5b8063715018a6146102265780638770d7071461022e5780638da5cb5b1461027a575f80fd5b80635ad9945a116101835780635ad9945a146101f75780635e45da231461020a5780635f9cd92e14610213575f80fd5b806329aa604b146101a95780633c7f5283146101cf5780633e4cbbe6146101e4575b5f80fd5b6101bc6101b7366004611229565b610405565b6040519081526020015b60405180910390f35b6101e26101dd366004611240565b610424565b005b6101bc6101f2366004611283565b610595565b6101bc6102053660046112f0565b610649565b6101bc60685481565b6101e261022136600461136c565b610839565b6101e26108ce565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c6565b60335473ffffffffffffffffffffffffffffffffffffffff16610255565b6101bc6102a6366004611229565b606c6020525f908152604090205481565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6101e26102ec366004611385565b6108e1565b6101bc60675481565b6101bc610308366004611229565b6109c3565b6101bc610a39565b606b546102559073ffffffffffffffffffffffffffffffffffffffff1681565b6101e26103433660046113db565b610a7c565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6101e261037d366004611229565b610bad565b6101e2610390366004611229565b610bf3565b6101e26103a336600461144e565b610c39565b6101bc6103b6366004611478565b60100261520801919050565b6101bc60655481565b6101e26103d936600461136c565b610df2565b6101bc6103ec366004611229565b5f908152606c602052604090205490565b6066546101bc565b60668181548110610414575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104ae5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156105005760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d65737361676573000000000000000000000060448201526064016104a5565b81606754146105515760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d6174636800000000000000000000000060448201526064016104a5565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa158015610603573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062791906114b7565b1561063357505f610643565b60655461064090836114dd565b90505b92915050565b5f607e816106f3565b5f8161066057506001919050565b5b81156106765760089190911c90600101610661565b919050565b8060808310600181146106b35761069184610652565b60808101835360018301925084816020036008021b83528083019250506106d4565b84841516600181146106c7578483536106cc565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061070660018c8361067b565b90506107146001898361067b565b905061072089826106dc565b905061072e60018b8361067b565b9050600186146001811461079657603887106001811461077b5761075188610652565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610790565b87608001835360018301925087898437918701915b506107a7565b6107a45f89355f1a8461067b565b91505b506107b28c826106dc565b90508181035f8060388310600181146107e5576107ce84610652565b60f78101600882021b8517935060010191506107f0565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b610841610e8f565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108d6610e8f565b6108df5f610ef6565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461098c5760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016104a5565b610997838383610f6c565b33731111000000000000000000000000000000001111016109bc81865f878787611068565b5050505050565b6066545f908210610a165760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e676500000000000060448201526064016104a5565b60668281548110610a2957610a29611519565b905f5260205f2001549050919050565b6066546067545f91118015610a5d57506067545f908152606c602052604090205415155b15610a7757506067545f908152606c602052604090205490565b504290565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610b275760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f617465776179000000000000000000000000000000000000000000000000000060648201526084016104a5565b73ffffffffffffffffffffffffffffffffffffffff86163b15610b8c5760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f4100000000000000000000000000000000000000000000000060448201526064016104a5565b610b97838383610f6c565b610ba5868686868686611068565b505050505050565b610bb5610e8f565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610589565b610bfb610e8f565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610589565b5f54610100900460ff1615808015610c5757505f54600160ff909116105b80610c705750303b158015610c7057505f5460ff166001145b610ce25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610d3e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610d46611125565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610ded575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610dfa610e8f565b73ffffffffffffffffffffffffffffffffffffffff8116610e835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104a5565b610e8c81610ef6565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104a5565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115610fe45760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d697400000000000000000000000000000000000000000000000000000060648201526084016104a5565b6010810261520801808410156110625760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e736963206761730000000000000000000000000060648201526084016104a5565b50505050565b6066545f61107b8883888a898989610649565b60668054600181019091557f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354018190555f838152606c6020526040908190204290555190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e90611113908a9087908b908b908b90611546565b60405180910390a35050505050505050565b5f54610100900460ff166111a15760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a5565b6108df5f54610100900460ff166112205760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a5565b6108df33610ef6565b5f60208284031215611239575f80fd5b5035919050565b5f8060408385031215611251575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff81168114610676575f80fd5b5f8060408385031215611294575f80fd5b61129d83611260565b946020939093013593505050565b5f8083601f8401126112bb575f80fd5b50813567ffffffffffffffff8111156112d2575f80fd5b6020830191508360208285010111156112e9575f80fd5b9250929050565b5f805f805f805f60c0888a031215611306575f80fd5b61130f88611260565b9650602088013595506040880135945061132b60608901611260565b93506080880135925060a088013567ffffffffffffffff81111561134d575f80fd5b6113598a828b016112ab565b989b979a50959850939692959293505050565b5f6020828403121561137c575f80fd5b61064082611260565b5f805f8060608587031215611398575f80fd5b6113a185611260565b935060208501359250604085013567ffffffffffffffff8111156113c3575f80fd5b6113cf878288016112ab565b95989497509550505050565b5f805f805f8060a087890312156113f0575f80fd5b6113f987611260565b955061140760208801611260565b94506040870135935060608701359250608087013567ffffffffffffffff811115611430575f80fd5b61143c89828a016112ab565b979a9699509497509295939492505050565b5f806040838503121561145f575f80fd5b8235915061146f60208401611260565b90509250929050565b5f8060208385031215611489575f80fd5b823567ffffffffffffffff81111561149f575f80fd5b6114ab858286016112ab565b90969095509350505050565b5f602082840312156114c7575f80fd5b815180151581146114d6575f80fd5b9392505050565b8082028115828204841417610643577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a", } // L1MessageQueueWithGasPriceOracleABI is the input ABI used to generate the binding from. @@ -419,6 +419,68 @@ func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerS return _L1MessageQueueWithGasPriceOracle.Contract.GetCrossDomainMessage(&_L1MessageQueueWithGasPriceOracle.CallOpts, _queueIndex) } +// GetFirstUnfinalizedMessageEnqueueTime is a free data retrieval call binding the contract method 0xb59b1a78. +// +// Solidity: function getFirstUnfinalizedMessageEnqueueTime() view returns(uint256 timestamp) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCaller) GetFirstUnfinalizedMessageEnqueueTime(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _L1MessageQueueWithGasPriceOracle.contract.Call(opts, &out, "getFirstUnfinalizedMessageEnqueueTime") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetFirstUnfinalizedMessageEnqueueTime is a free data retrieval call binding the contract method 0xb59b1a78. +// +// Solidity: function getFirstUnfinalizedMessageEnqueueTime() view returns(uint256 timestamp) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleSession) GetFirstUnfinalizedMessageEnqueueTime() (*big.Int, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.GetFirstUnfinalizedMessageEnqueueTime(&_L1MessageQueueWithGasPriceOracle.CallOpts) +} + +// GetFirstUnfinalizedMessageEnqueueTime is a free data retrieval call binding the contract method 0xb59b1a78. +// +// Solidity: function getFirstUnfinalizedMessageEnqueueTime() view returns(uint256 timestamp) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerSession) GetFirstUnfinalizedMessageEnqueueTime() (*big.Int, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.GetFirstUnfinalizedMessageEnqueueTime(&_L1MessageQueueWithGasPriceOracle.CallOpts) +} + +// GetMessageEnqueueTimestamp is a free data retrieval call binding the contract method 0xf7ca0c51. +// +// Solidity: function getMessageEnqueueTimestamp(uint256 index) view returns(uint256 timestamp) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCaller) GetMessageEnqueueTimestamp(opts *bind.CallOpts, index *big.Int) (*big.Int, error) { + var out []interface{} + err := _L1MessageQueueWithGasPriceOracle.contract.Call(opts, &out, "getMessageEnqueueTimestamp", index) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetMessageEnqueueTimestamp is a free data retrieval call binding the contract method 0xf7ca0c51. +// +// Solidity: function getMessageEnqueueTimestamp(uint256 index) view returns(uint256 timestamp) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleSession) GetMessageEnqueueTimestamp(index *big.Int) (*big.Int, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.GetMessageEnqueueTimestamp(&_L1MessageQueueWithGasPriceOracle.CallOpts, index) +} + +// GetMessageEnqueueTimestamp is a free data retrieval call binding the contract method 0xf7ca0c51. +// +// Solidity: function getMessageEnqueueTimestamp(uint256 index) view returns(uint256 timestamp) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerSession) GetMessageEnqueueTimestamp(index *big.Int) (*big.Int, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.GetMessageEnqueueTimestamp(&_L1MessageQueueWithGasPriceOracle.CallOpts, index) +} + // L2BaseFee is a free data retrieval call binding the contract method 0xe3176bd5. // // Solidity: function l2BaseFee() view returns(uint256) @@ -481,6 +543,37 @@ func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerS return _L1MessageQueueWithGasPriceOracle.Contract.MaxGasLimit(&_L1MessageQueueWithGasPriceOracle.CallOpts) } +// MessageEnqueueTime is a free data retrieval call binding the contract method 0x8dc73d87. +// +// Solidity: function messageEnqueueTime(uint256 ) view returns(uint256) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCaller) MessageEnqueueTime(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) { + var out []interface{} + err := _L1MessageQueueWithGasPriceOracle.contract.Call(opts, &out, "messageEnqueueTime", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MessageEnqueueTime is a free data retrieval call binding the contract method 0x8dc73d87. +// +// Solidity: function messageEnqueueTime(uint256 ) view returns(uint256) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleSession) MessageEnqueueTime(arg0 *big.Int) (*big.Int, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.MessageEnqueueTime(&_L1MessageQueueWithGasPriceOracle.CallOpts, arg0) +} + +// MessageEnqueueTime is a free data retrieval call binding the contract method 0x8dc73d87. +// +// Solidity: function messageEnqueueTime(uint256 ) view returns(uint256) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerSession) MessageEnqueueTime(arg0 *big.Int) (*big.Int, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.MessageEnqueueTime(&_L1MessageQueueWithGasPriceOracle.CallOpts, arg0) +} + // MessageQueue is a free data retrieval call binding the contract method 0x29aa604b. // // Solidity: function messageQueue(uint256 ) view returns(bytes32) diff --git a/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go b/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go index 95974e781..beaba5dd0 100644 --- a/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go +++ b/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go @@ -9,11 +9,11 @@ import ( "morph-l2/bindings/solc" ) -const L1MessageQueueWithGasPriceOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1013_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1012_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"l2BaseFee\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_bytes32)dyn_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"pendingQueueIndex\",\"offset\":0,\"slot\":\"103\",\"type\":\"t_uint256\"},{\"astId\":1008,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"maxGasLimit\",\"offset\":0,\"slot\":\"104\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__droppedMessageBitmap\",\"offset\":0,\"slot\":\"105\",\"type\":\"t_struct(BitMap)1014_storage\"},{\"astId\":1010,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__skippedMessageBitmap\",\"offset\":0,\"slot\":\"106\",\"type\":\"t_mapping(t_uint256,t_uint256)\"},{\"astId\":1011,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"whitelistChecker\",\"offset\":0,\"slot\":\"107\",\"type\":\"t_address\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\"},\"t_array(t_uint256)1012_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1013_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(BitMap)1014_storage\":{\"encoding\":\"inplace\",\"label\":\"struct BitMapsUpgradeable.BitMap\",\"numberOfBytes\":\"32\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" +const L1MessageQueueWithGasPriceOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1014_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1013_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"l2BaseFee\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_bytes32)dyn_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"pendingQueueIndex\",\"offset\":0,\"slot\":\"103\",\"type\":\"t_uint256\"},{\"astId\":1008,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"maxGasLimit\",\"offset\":0,\"slot\":\"104\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__droppedMessageBitmap\",\"offset\":0,\"slot\":\"105\",\"type\":\"t_struct(BitMap)1015_storage\"},{\"astId\":1010,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__skippedMessageBitmap\",\"offset\":0,\"slot\":\"106\",\"type\":\"t_mapping(t_uint256,t_uint256)\"},{\"astId\":1011,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"whitelistChecker\",\"offset\":0,\"slot\":\"107\",\"type\":\"t_address\"},{\"astId\":1012,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"messageEnqueueTime\",\"offset\":0,\"slot\":\"108\",\"type\":\"t_mapping(t_uint256,t_uint256)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\"},\"t_array(t_uint256)1013_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1014_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(BitMap)1015_storage\":{\"encoding\":\"inplace\",\"label\":\"struct BitMapsUpgradeable.BitMap\",\"numberOfBytes\":\"32\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var L1MessageQueueWithGasPriceOracleStorageLayout = new(solc.StorageLayout) -var L1MessageQueueWithGasPriceOracleDeployedBin = "0x608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063a85006ca116100dd578063d99bc80e11610088578063e3176bd511610063578063e3176bd51461037a578063f2fde38b14610383578063fd0ad31e14610396575f80fd5b8063d99bc80e1461033a578063da35a26f1461034d578063e172d3a114610360575f80fd5b8063bdc6f0a0116100b8578063bdc6f0a0146102ed578063c276067714610300578063d5ad4a9714610327575f80fd5b8063a85006ca146102b1578063ae453cd5146102ba578063bb7862ca146102cd575f80fd5b80635f9cd92e1161013d5780638da5cb5b116101185780638da5cb5b14610259578063927ede2d146102775780639b1597821461029e575f80fd5b80635f9cd92e146101f2578063715018a6146102055780638770d7071461020d575f80fd5b80633e4cbbe61161016d5780633e4cbbe6146101c35780635ad9945a146101d65780635e45da23146101e9575f80fd5b806329aa604b146101885780633c7f5283146101ae575b5f80fd5b61019b6101963660046112df565b61039e565b6040519081526020015b60405180910390f35b6101c16101bc3660046112f6565b6103bd565b005b61019b6101d1366004611339565b61057c565b61019b6101e43660046113a6565b610630565b61019b60685481565b6101c1610200366004611422565b610820565b6101c16108b5565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a5565b60335473ffffffffffffffffffffffffffffffffffffffff16610234565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16102ac36600461143b565b6108c8565b61019b60675481565b61019b6102c83660046112df565b6109c4565b606b546102349073ffffffffffffffffffffffffffffffffffffffff1681565b6101c16102fb366004611491565b610a54565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16103353660046112df565b610bb9565b6101c16103483660046112df565b610bff565b6101c161035b366004611504565b610c45565b61019b61036e36600461152e565b60100261520801919050565b61019b60655481565b6101c1610391366004611422565b610e18565b60665461019b565b606681815481106103ad575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156104cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f706f7020746f6f206d616e79206d6573736167657300000000000000000000006044820152606401610458565b8160675414610538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f737461727420696e646578206d69736d617463680000000000000000000000006044820152606401610458565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa1580156105ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060e919061156d565b1561061a57505f61062a565b6065546106279083611593565b90505b92915050565b5f607e816106da565b5f8161064757506001919050565b5b811561065d5760089190911c90600101610648565b919050565b80608083106001811461069a5761067884610639565b60808101835360018301925084816020036008021b83528083019250506106bb565b84841516600181146106ae578483536106b3565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b600560405101806106ed60018c83610662565b90506106fb60018983610662565b905061070789826106c3565b905061071560018b83610662565b9050600186146001811461077d5760388710600181146107625761073888610639565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610777565b87608001835360018301925087898437918701915b5061078e565b61078b5f89355f1a84610662565b91505b506107998c826106c3565b90508181035f8060388310600181146107cc576107b584610639565b60f78101600882021b8517935060010191506107d7565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b610828610ecf565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108bd610ecf565b6108c65f610f50565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e6765720000000000000000000000000000000000000000006064820152608401610458565b610998838383610fc6565b33731111000000000000000000000000000000001111016109bd81865f8787876110f6565b5050505050565b6066545f908210610a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e67650000000000006044820152606401610458565b60668281548110610a4457610a446115cf565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610b19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f61746577617900000000000000000000000000000000000000000000000000006064820152608401610458565b73ffffffffffffffffffffffffffffffffffffffff86163b15610b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6f6e6c7920454f410000000000000000000000000000000000000000000000006044820152606401610458565b610ba3838383610fc6565b610bb18686868686866110f6565b505050505050565b610bc1610ecf565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610570565b610c07610ecf565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610570565b5f54610100900460ff1615808015610c6357505f54600160ff909116105b80610c7c5750303b158015610c7c57505f5460ff166001145b610d08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610458565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610d64575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610d6c6111a7565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610e13575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610e20610ecf565b73ffffffffffffffffffffffffffffffffffffffff8116610ec3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610458565b610ecc81610f50565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d69740000000000000000000000000000000000000000000000000000006064820152608401610458565b6010810261520801808410156110f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e73696320676173000000000000000000000000006064820152608401610458565b50505050565b6066545f6111098883888a898989610630565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e90611195908a9087908b908b908b906115fc565b60405180910390a35050505050505050565b5f54610100900460ff1661123d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610458565b6108c65f54610100900460ff166112d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610458565b6108c633610f50565b5f602082840312156112ef575f80fd5b5035919050565b5f8060408385031215611307575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461065d575f80fd5b5f806040838503121561134a575f80fd5b61135383611316565b946020939093013593505050565b5f8083601f840112611371575f80fd5b50813567ffffffffffffffff811115611388575f80fd5b60208301915083602082850101111561139f575f80fd5b9250929050565b5f805f805f805f60c0888a0312156113bc575f80fd5b6113c588611316565b965060208801359550604088013594506113e160608901611316565b93506080880135925060a088013567ffffffffffffffff811115611403575f80fd5b61140f8a828b01611361565b989b979a50959850939692959293505050565b5f60208284031215611432575f80fd5b61062782611316565b5f805f806060858703121561144e575f80fd5b61145785611316565b935060208501359250604085013567ffffffffffffffff811115611479575f80fd5b61148587828801611361565b95989497509550505050565b5f805f805f8060a087890312156114a6575f80fd5b6114af87611316565b95506114bd60208801611316565b94506040870135935060608701359250608087013567ffffffffffffffff8111156114e6575f80fd5b6114f289828a01611361565b979a9699509497509295939492505050565b5f8060408385031215611515575f80fd5b8235915061152560208401611316565b90509250929050565b5f806020838503121561153f575f80fd5b823567ffffffffffffffff811115611555575f80fd5b61156185828601611361565b90969095509350505050565b5f6020828403121561157d575f80fd5b8151801515811461158c575f80fd5b9392505050565b808202811582820484141761062a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a" +var L1MessageQueueWithGasPriceOracleDeployedBin = "0x608060405234801561000f575f80fd5b50600436106101a5575f3560e01c8063ae453cd5116100e8578063d99bc80e11610093578063e3176bd51161006e578063e3176bd5146103c2578063f2fde38b146103cb578063f7ca0c51146103de578063fd0ad31e146103fd575f80fd5b8063d99bc80e14610382578063da35a26f14610395578063e172d3a1146103a8575f80fd5b8063bdc6f0a0116100c3578063bdc6f0a014610335578063c276067714610348578063d5ad4a971461036f575f80fd5b8063ae453cd5146102fa578063b59b1a781461030d578063bb7862ca14610315575f80fd5b8063715018a6116101535780638dc73d871161012e5780638dc73d8714610298578063927ede2d146102b75780639b159782146102de578063a85006ca146102f1575f80fd5b8063715018a6146102265780638770d7071461022e5780638da5cb5b1461027a575f80fd5b80635ad9945a116101835780635ad9945a146101f75780635e45da231461020a5780635f9cd92e14610213575f80fd5b806329aa604b146101a95780633c7f5283146101cf5780633e4cbbe6146101e4575b5f80fd5b6101bc6101b7366004611395565b610405565b6040519081526020015b60405180910390f35b6101e26101dd3660046113ac565b610424565b005b6101bc6101f23660046113ef565b6105e3565b6101bc61020536600461145c565b610697565b6101bc60685481565b6101e26102213660046114d8565b610887565b6101e261091c565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c6565b60335473ffffffffffffffffffffffffffffffffffffffff16610255565b6101bc6102a6366004611395565b606c6020525f908152604090205481565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6101e26102ec3660046114f1565b61092f565b6101bc60675481565b6101bc610308366004611395565b610a2b565b6101bc610abb565b606b546102559073ffffffffffffffffffffffffffffffffffffffff1681565b6101e2610343366004611547565b610afe565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6101e261037d366004611395565b610c63565b6101e2610390366004611395565b610ca9565b6101e26103a33660046115ba565b610cef565b6101bc6103b63660046115e4565b60100261520801919050565b6101bc60655481565b6101e26103d93660046114d8565b610ec2565b6101bc6103ec366004611395565b5f908152606c602052604090205490565b6066546101bc565b60668181548110610414575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b610100811115610534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f706f7020746f6f206d616e79206d65737361676573000000000000000000000060448201526064016104bf565b816067541461059f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f737461727420696e646578206d69736d6174636800000000000000000000000060448201526064016104bf565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa158015610651573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106759190611623565b1561068157505f610691565b60655461068e9083611649565b90505b92915050565b5f607e81610741565b5f816106ae57506001919050565b5b81156106c45760089190911c906001016106af565b919050565b806080831060018114610701576106df846106a0565b60808101835360018301925084816020036008021b8352808301925050610722565b84841516600181146107155784835361071a565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061075460018c836106c9565b9050610762600189836106c9565b905061076e898261072a565b905061077c60018b836106c9565b905060018614600181146107e45760388710600181146107c95761079f886106a0565b8060b701845360018401935088816020036008021b845280840193505087898437918701916107de565b87608001835360018301925087898437918701915b506107f5565b6107f25f89355f1a846106c9565b91505b506108008c8261072a565b90508181035f8060388310600181146108335761081c846106a0565b60f78101600882021b85179350600101915061083e565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b61088f610f79565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610924610f79565b61092d5f610ffa565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016104bf565b6109ff838383611070565b3373111100000000000000000000000000000000111101610a2481865f8787876111a0565b5050505050565b6066545f908210610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e676500000000000060448201526064016104bf565b60668281548110610aab57610aab611685565b905f5260205f2001549050919050565b6066546067545f91118015610adf57506067545f908152606c602052604090205415155b15610af957506067545f908152606c602052604090205490565b504290565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610bc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f617465776179000000000000000000000000000000000000000000000000000060648201526084016104bf565b73ffffffffffffffffffffffffffffffffffffffff86163b15610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6f6e6c7920454f4100000000000000000000000000000000000000000000000060448201526064016104bf565b610c4d838383611070565b610c5b8686868686866111a0565b505050505050565b610c6b610f79565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c591016105d7565b610cb1610f79565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead36632991016105d7565b5f54610100900460ff1615808015610d0d57505f54600160ff909116105b80610d265750303b158015610d2657505f5460ff166001145b610db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104bf565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e0e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610e1661125d565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610ebd575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610eca610f79565b73ffffffffffffffffffffffffffffffffffffffff8116610f6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104bf565b610f7681610ffa565b50565b60335473ffffffffffffffffffffffffffffffffffffffff16331461092d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bf565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115611102576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d697400000000000000000000000000000000000000000000000000000060648201526084016104bf565b60108102615208018084101561119a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e736963206761730000000000000000000000000060648201526084016104bf565b50505050565b6066545f6111b38883888a898989610697565b60668054600181019091557f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354018190555f838152606c6020526040908190204290555190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e9061124b908a9087908b908b908b906116b2565b60405180910390a35050505050505050565b5f54610100900460ff166112f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104bf565b61092d5f54610100900460ff1661138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104bf565b61092d33610ffa565b5f602082840312156113a5575f80fd5b5035919050565b5f80604083850312156113bd575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff811681146106c4575f80fd5b5f8060408385031215611400575f80fd5b611409836113cc565b946020939093013593505050565b5f8083601f840112611427575f80fd5b50813567ffffffffffffffff81111561143e575f80fd5b602083019150836020828501011115611455575f80fd5b9250929050565b5f805f805f805f60c0888a031215611472575f80fd5b61147b886113cc565b96506020880135955060408801359450611497606089016113cc565b93506080880135925060a088013567ffffffffffffffff8111156114b9575f80fd5b6114c58a828b01611417565b989b979a50959850939692959293505050565b5f602082840312156114e8575f80fd5b61068e826113cc565b5f805f8060608587031215611504575f80fd5b61150d856113cc565b935060208501359250604085013567ffffffffffffffff81111561152f575f80fd5b61153b87828801611417565b95989497509550505050565b5f805f805f8060a0878903121561155c575f80fd5b611565876113cc565b9550611573602088016113cc565b94506040870135935060608701359250608087013567ffffffffffffffff81111561159c575f80fd5b6115a889828a01611417565b979a9699509497509295939492505050565b5f80604083850312156115cb575f80fd5b823591506115db602084016113cc565b90509250929050565b5f80602083850312156115f5575f80fd5b823567ffffffffffffffff81111561160b575f80fd5b61161785828601611417565b90969095509350505050565b5f60208284031215611633575f80fd5b81518015158114611642575f80fd5b9392505050565b8082028115828204841417610691577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L1MessageQueueWithGasPriceOracleStorageLayoutJSON), L1MessageQueueWithGasPriceOracleStorageLayout); err != nil { diff --git a/bindings/bindings/l1sequencer.go b/bindings/bindings/l1sequencer.go new file mode 100644 index 000000000..80110f035 --- /dev/null +++ b/bindings/bindings/l1sequencer.go @@ -0,0 +1,820 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/morph-l2/go-ethereum" + "github.com/morph-l2/go-ethereum/accounts/abi" + "github.com/morph-l2/go-ethereum/accounts/abi/bind" + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/core/types" + "github.com/morph-l2/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// L1SequencerMetaData contains all meta data concerning the L1Sequencer contract. +var L1SequencerMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"getSequencer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sequencer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateSequencer\",\"inputs\":[{\"name\":\"newSequencer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SequencerUpdated\",\"inputs\":[{\"name\":\"oldSequencer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newSequencer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", + Bin: "0x608060405234801561000f575f80fd5b5061081a8061001d5f395ff3fe608060405234801561000f575f80fd5b506004361061007a575f3560e01c8063715018a611610058578063715018a6146100f65780638da5cb5b146100fe578063c4d66de81461011c578063f2fde38b1461012f575f80fd5b806343ae20a31461007e5780634d96a90a146100935780635c1bba38146100d6575b5f80fd5b61009161008c3660046107d3565b610142565b005b60655473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6065546100ad9073ffffffffffffffffffffffffffffffffffffffff1681565b6100916102c7565b60335473ffffffffffffffffffffffffffffffffffffffff166100ad565b61009161012a3660046107d3565b6102da565b61009161013d3660046107d3565b6104ed565b61014a6105a4565b73ffffffffffffffffffffffffffffffffffffffff81166101cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c69642073657175656e63657200000000000000000000000000000060448201526064015b60405180910390fd5b60655473ffffffffffffffffffffffffffffffffffffffff90811690821603610251576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f73616d652073657175656e63657200000000000000000000000000000000000060448201526064016101c3565b6065805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907fcd58b762453bd126b48db83f2cecd464f5281dd7e5e6824b528c09d0482984d6905f90a35050565b6102cf6105a4565b6102d85f610625565b565b5f54610100900460ff16158080156102f857505f54600160ff909116105b806103115750303b15801561031157505f5460ff166001145b61039d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016101c3565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156103f9575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8216610476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c6964206f776e65720000000000000000000000000000000000000060448201526064016101c3565b61047e61069b565b61048782610625565b80156104e9575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6104f56105a4565b73ffffffffffffffffffffffffffffffffffffffff8116610598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101c3565b6105a181610625565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146102d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101c3565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16610731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016101c3565b6102d85f54610100900460ff166107ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016101c3565b6102d833610625565b5f602082840312156107e3575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610806575f80fd5b939250505056fea164736f6c6343000818000a", +} + +// L1SequencerABI is the input ABI used to generate the binding from. +// Deprecated: Use L1SequencerMetaData.ABI instead. +var L1SequencerABI = L1SequencerMetaData.ABI + +// L1SequencerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use L1SequencerMetaData.Bin instead. +var L1SequencerBin = L1SequencerMetaData.Bin + +// DeployL1Sequencer deploys a new Ethereum contract, binding an instance of L1Sequencer to it. +func DeployL1Sequencer(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L1Sequencer, error) { + parsed, err := L1SequencerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L1SequencerBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &L1Sequencer{L1SequencerCaller: L1SequencerCaller{contract: contract}, L1SequencerTransactor: L1SequencerTransactor{contract: contract}, L1SequencerFilterer: L1SequencerFilterer{contract: contract}}, nil +} + +// L1Sequencer is an auto generated Go binding around an Ethereum contract. +type L1Sequencer struct { + L1SequencerCaller // Read-only binding to the contract + L1SequencerTransactor // Write-only binding to the contract + L1SequencerFilterer // Log filterer for contract events +} + +// L1SequencerCaller is an auto generated read-only Go binding around an Ethereum contract. +type L1SequencerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// L1SequencerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type L1SequencerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// L1SequencerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type L1SequencerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// L1SequencerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type L1SequencerSession struct { + Contract *L1Sequencer // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// L1SequencerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type L1SequencerCallerSession struct { + Contract *L1SequencerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// L1SequencerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type L1SequencerTransactorSession struct { + Contract *L1SequencerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// L1SequencerRaw is an auto generated low-level Go binding around an Ethereum contract. +type L1SequencerRaw struct { + Contract *L1Sequencer // Generic contract binding to access the raw methods on +} + +// L1SequencerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type L1SequencerCallerRaw struct { + Contract *L1SequencerCaller // Generic read-only contract binding to access the raw methods on +} + +// L1SequencerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type L1SequencerTransactorRaw struct { + Contract *L1SequencerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewL1Sequencer creates a new instance of L1Sequencer, bound to a specific deployed contract. +func NewL1Sequencer(address common.Address, backend bind.ContractBackend) (*L1Sequencer, error) { + contract, err := bindL1Sequencer(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &L1Sequencer{L1SequencerCaller: L1SequencerCaller{contract: contract}, L1SequencerTransactor: L1SequencerTransactor{contract: contract}, L1SequencerFilterer: L1SequencerFilterer{contract: contract}}, nil +} + +// NewL1SequencerCaller creates a new read-only instance of L1Sequencer, bound to a specific deployed contract. +func NewL1SequencerCaller(address common.Address, caller bind.ContractCaller) (*L1SequencerCaller, error) { + contract, err := bindL1Sequencer(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &L1SequencerCaller{contract: contract}, nil +} + +// NewL1SequencerTransactor creates a new write-only instance of L1Sequencer, bound to a specific deployed contract. +func NewL1SequencerTransactor(address common.Address, transactor bind.ContractTransactor) (*L1SequencerTransactor, error) { + contract, err := bindL1Sequencer(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &L1SequencerTransactor{contract: contract}, nil +} + +// NewL1SequencerFilterer creates a new log filterer instance of L1Sequencer, bound to a specific deployed contract. +func NewL1SequencerFilterer(address common.Address, filterer bind.ContractFilterer) (*L1SequencerFilterer, error) { + contract, err := bindL1Sequencer(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &L1SequencerFilterer{contract: contract}, nil +} + +// bindL1Sequencer binds a generic wrapper to an already deployed contract. +func bindL1Sequencer(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := L1SequencerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_L1Sequencer *L1SequencerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _L1Sequencer.Contract.L1SequencerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_L1Sequencer *L1SequencerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L1Sequencer.Contract.L1SequencerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_L1Sequencer *L1SequencerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _L1Sequencer.Contract.L1SequencerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_L1Sequencer *L1SequencerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _L1Sequencer.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_L1Sequencer *L1SequencerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L1Sequencer.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_L1Sequencer *L1SequencerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _L1Sequencer.Contract.contract.Transact(opts, method, params...) +} + +// GetSequencer is a free data retrieval call binding the contract method 0x4d96a90a. +// +// Solidity: function getSequencer() view returns(address) +func (_L1Sequencer *L1SequencerCaller) GetSequencer(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L1Sequencer.contract.Call(opts, &out, "getSequencer") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetSequencer is a free data retrieval call binding the contract method 0x4d96a90a. +// +// Solidity: function getSequencer() view returns(address) +func (_L1Sequencer *L1SequencerSession) GetSequencer() (common.Address, error) { + return _L1Sequencer.Contract.GetSequencer(&_L1Sequencer.CallOpts) +} + +// GetSequencer is a free data retrieval call binding the contract method 0x4d96a90a. +// +// Solidity: function getSequencer() view returns(address) +func (_L1Sequencer *L1SequencerCallerSession) GetSequencer() (common.Address, error) { + return _L1Sequencer.Contract.GetSequencer(&_L1Sequencer.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_L1Sequencer *L1SequencerCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L1Sequencer.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_L1Sequencer *L1SequencerSession) Owner() (common.Address, error) { + return _L1Sequencer.Contract.Owner(&_L1Sequencer.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_L1Sequencer *L1SequencerCallerSession) Owner() (common.Address, error) { + return _L1Sequencer.Contract.Owner(&_L1Sequencer.CallOpts) +} + +// Sequencer is a free data retrieval call binding the contract method 0x5c1bba38. +// +// Solidity: function sequencer() view returns(address) +func (_L1Sequencer *L1SequencerCaller) Sequencer(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L1Sequencer.contract.Call(opts, &out, "sequencer") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Sequencer is a free data retrieval call binding the contract method 0x5c1bba38. +// +// Solidity: function sequencer() view returns(address) +func (_L1Sequencer *L1SequencerSession) Sequencer() (common.Address, error) { + return _L1Sequencer.Contract.Sequencer(&_L1Sequencer.CallOpts) +} + +// Sequencer is a free data retrieval call binding the contract method 0x5c1bba38. +// +// Solidity: function sequencer() view returns(address) +func (_L1Sequencer *L1SequencerCallerSession) Sequencer() (common.Address, error) { + return _L1Sequencer.Contract.Sequencer(&_L1Sequencer.CallOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address _owner) returns() +func (_L1Sequencer *L1SequencerTransactor) Initialize(opts *bind.TransactOpts, _owner common.Address) (*types.Transaction, error) { + return _L1Sequencer.contract.Transact(opts, "initialize", _owner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address _owner) returns() +func (_L1Sequencer *L1SequencerSession) Initialize(_owner common.Address) (*types.Transaction, error) { + return _L1Sequencer.Contract.Initialize(&_L1Sequencer.TransactOpts, _owner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address _owner) returns() +func (_L1Sequencer *L1SequencerTransactorSession) Initialize(_owner common.Address) (*types.Transaction, error) { + return _L1Sequencer.Contract.Initialize(&_L1Sequencer.TransactOpts, _owner) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_L1Sequencer *L1SequencerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L1Sequencer.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_L1Sequencer *L1SequencerSession) RenounceOwnership() (*types.Transaction, error) { + return _L1Sequencer.Contract.RenounceOwnership(&_L1Sequencer.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_L1Sequencer *L1SequencerTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _L1Sequencer.Contract.RenounceOwnership(&_L1Sequencer.TransactOpts) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_L1Sequencer *L1SequencerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _L1Sequencer.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_L1Sequencer *L1SequencerSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _L1Sequencer.Contract.TransferOwnership(&_L1Sequencer.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_L1Sequencer *L1SequencerTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _L1Sequencer.Contract.TransferOwnership(&_L1Sequencer.TransactOpts, newOwner) +} + +// UpdateSequencer is a paid mutator transaction binding the contract method 0x43ae20a3. +// +// Solidity: function updateSequencer(address newSequencer) returns() +func (_L1Sequencer *L1SequencerTransactor) UpdateSequencer(opts *bind.TransactOpts, newSequencer common.Address) (*types.Transaction, error) { + return _L1Sequencer.contract.Transact(opts, "updateSequencer", newSequencer) +} + +// UpdateSequencer is a paid mutator transaction binding the contract method 0x43ae20a3. +// +// Solidity: function updateSequencer(address newSequencer) returns() +func (_L1Sequencer *L1SequencerSession) UpdateSequencer(newSequencer common.Address) (*types.Transaction, error) { + return _L1Sequencer.Contract.UpdateSequencer(&_L1Sequencer.TransactOpts, newSequencer) +} + +// UpdateSequencer is a paid mutator transaction binding the contract method 0x43ae20a3. +// +// Solidity: function updateSequencer(address newSequencer) returns() +func (_L1Sequencer *L1SequencerTransactorSession) UpdateSequencer(newSequencer common.Address) (*types.Transaction, error) { + return _L1Sequencer.Contract.UpdateSequencer(&_L1Sequencer.TransactOpts, newSequencer) +} + +// L1SequencerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L1Sequencer contract. +type L1SequencerInitializedIterator struct { + Event *L1SequencerInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1SequencerInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1SequencerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1SequencerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1SequencerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1SequencerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1SequencerInitialized represents a Initialized event raised by the L1Sequencer contract. +type L1SequencerInitialized struct { + Version uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_L1Sequencer *L1SequencerFilterer) FilterInitialized(opts *bind.FilterOpts) (*L1SequencerInitializedIterator, error) { + + logs, sub, err := _L1Sequencer.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &L1SequencerInitializedIterator{contract: _L1Sequencer.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_L1Sequencer *L1SequencerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L1SequencerInitialized) (event.Subscription, error) { + + logs, sub, err := _L1Sequencer.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1SequencerInitialized) + if err := _L1Sequencer.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_L1Sequencer *L1SequencerFilterer) ParseInitialized(log types.Log) (*L1SequencerInitialized, error) { + event := new(L1SequencerInitialized) + if err := _L1Sequencer.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L1SequencerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the L1Sequencer contract. +type L1SequencerOwnershipTransferredIterator struct { + Event *L1SequencerOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1SequencerOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1SequencerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1SequencerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1SequencerOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1SequencerOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1SequencerOwnershipTransferred represents a OwnershipTransferred event raised by the L1Sequencer contract. +type L1SequencerOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_L1Sequencer *L1SequencerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*L1SequencerOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _L1Sequencer.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &L1SequencerOwnershipTransferredIterator{contract: _L1Sequencer.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_L1Sequencer *L1SequencerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *L1SequencerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _L1Sequencer.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1SequencerOwnershipTransferred) + if err := _L1Sequencer.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_L1Sequencer *L1SequencerFilterer) ParseOwnershipTransferred(log types.Log) (*L1SequencerOwnershipTransferred, error) { + event := new(L1SequencerOwnershipTransferred) + if err := _L1Sequencer.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L1SequencerSequencerUpdatedIterator is returned from FilterSequencerUpdated and is used to iterate over the raw logs and unpacked data for SequencerUpdated events raised by the L1Sequencer contract. +type L1SequencerSequencerUpdatedIterator struct { + Event *L1SequencerSequencerUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1SequencerSequencerUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1SequencerSequencerUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1SequencerSequencerUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1SequencerSequencerUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1SequencerSequencerUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1SequencerSequencerUpdated represents a SequencerUpdated event raised by the L1Sequencer contract. +type L1SequencerSequencerUpdated struct { + OldSequencer common.Address + NewSequencer common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSequencerUpdated is a free log retrieval operation binding the contract event 0xcd58b762453bd126b48db83f2cecd464f5281dd7e5e6824b528c09d0482984d6. +// +// Solidity: event SequencerUpdated(address indexed oldSequencer, address indexed newSequencer) +func (_L1Sequencer *L1SequencerFilterer) FilterSequencerUpdated(opts *bind.FilterOpts, oldSequencer []common.Address, newSequencer []common.Address) (*L1SequencerSequencerUpdatedIterator, error) { + + var oldSequencerRule []interface{} + for _, oldSequencerItem := range oldSequencer { + oldSequencerRule = append(oldSequencerRule, oldSequencerItem) + } + var newSequencerRule []interface{} + for _, newSequencerItem := range newSequencer { + newSequencerRule = append(newSequencerRule, newSequencerItem) + } + + logs, sub, err := _L1Sequencer.contract.FilterLogs(opts, "SequencerUpdated", oldSequencerRule, newSequencerRule) + if err != nil { + return nil, err + } + return &L1SequencerSequencerUpdatedIterator{contract: _L1Sequencer.contract, event: "SequencerUpdated", logs: logs, sub: sub}, nil +} + +// WatchSequencerUpdated is a free log subscription operation binding the contract event 0xcd58b762453bd126b48db83f2cecd464f5281dd7e5e6824b528c09d0482984d6. +// +// Solidity: event SequencerUpdated(address indexed oldSequencer, address indexed newSequencer) +func (_L1Sequencer *L1SequencerFilterer) WatchSequencerUpdated(opts *bind.WatchOpts, sink chan<- *L1SequencerSequencerUpdated, oldSequencer []common.Address, newSequencer []common.Address) (event.Subscription, error) { + + var oldSequencerRule []interface{} + for _, oldSequencerItem := range oldSequencer { + oldSequencerRule = append(oldSequencerRule, oldSequencerItem) + } + var newSequencerRule []interface{} + for _, newSequencerItem := range newSequencer { + newSequencerRule = append(newSequencerRule, newSequencerItem) + } + + logs, sub, err := _L1Sequencer.contract.WatchLogs(opts, "SequencerUpdated", oldSequencerRule, newSequencerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1SequencerSequencerUpdated) + if err := _L1Sequencer.contract.UnpackLog(event, "SequencerUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSequencerUpdated is a log parse operation binding the contract event 0xcd58b762453bd126b48db83f2cecd464f5281dd7e5e6824b528c09d0482984d6. +// +// Solidity: event SequencerUpdated(address indexed oldSequencer, address indexed newSequencer) +func (_L1Sequencer *L1SequencerFilterer) ParseSequencerUpdated(log types.Log) (*L1SequencerSequencerUpdated, error) { + event := new(L1SequencerSequencerUpdated) + if err := _L1Sequencer.contract.UnpackLog(event, "SequencerUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/bindings/bindings/rollup.go b/bindings/bindings/rollup.go index 75ab0ee21..81d257d11 100644 --- a/bindings/bindings/rollup.go +++ b/bindings/bindings/rollup.go @@ -49,8 +49,8 @@ type IRollupBatchSignatureInput struct { // RollupMetaData contains all meta data concerning the Rollup contract. var RollupMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainID\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"res\",\"type\":\"string\"}],\"name\":\"ChallengeRes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ChallengeRewardClaim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"}],\"name\":\"ChallengeState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ProveRemainingClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateChallenger\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"UpdateFinalizationPeriodSeconds\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPercent\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPercent\",\"type\":\"uint256\"}],\"name\":\"UpdateProofRewardPercent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newWindow\",\"type\":\"uint256\"}],\"name\":\"UpdateProofWindow\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LAYER_2_CHAIN_ID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__maxNumTxInChunk\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"batchChallengeReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchChallenged\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchChallengedSuccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchDataStore\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"originTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"finalizeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchExist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInsideChallengeWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_batchHash\",\"type\":\"bytes32\"}],\"name\":\"challengeState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"challenges\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"challengeSuccess\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"finished\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimProveRemaining\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"lastBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"numL1Messages\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIRollup.BatchDataInput\",\"name\":\"batchDataInput\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"sequencerSets\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structIRollup.BatchSignatureInput\",\"name\":\"batchSignatureInput\",\"type\":\"tuple\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizationPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"finalizeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1StakingContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_prevStateRoot\",\"type\":\"bytes32\"}],\"name\":\"initialize2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"challengerAddress\",\"type\":\"address\"}],\"name\":\"isChallenger\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isChallenger\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1StakingContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastCommittedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofRewardPercent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofWindow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proveRemaining\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_batchProof\",\"type\":\"bytes\"}],\"name\":\"proveState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertReqIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"updateFinalizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newWindow\",\"type\":\"uint256\"}],\"name\":\"updateProofWindow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newProofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"updateRewardPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newVerifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"withdrawalRoots\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a060405234801562000010575f80fd5b50604051620049833803806200498383398101604081905262000033916200010f565b6001600160401b0381166080526200004a62000051565b506200013e565b5f54610100900460ff1615620000bd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146200010d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f6020828403121562000120575f80fd5b81516001600160401b038116811462000137575f80fd5b9392505050565b6080516148256200015e5f395f81816105ec0152613a2901526148255ff3fe608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd146109b1578063f2fde38b146109d0578063fb1e8b04146109ef575f80fd5b8063ddd8a3dc1461095e578063de8b30351461097d578063dff7827e1461099c575f80fd5b8063cd4edc69116100b7578063cd4edc6914610917578063ce5db8d61461092a578063d279c1911461093f575f80fd5b8063b35dac4e146108ba578063b3e0a509146108d9578063bedb86fb146108f8575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d1461085b578063b31a77d314610886578063b34844251461089b575f80fd5b8063a415d8dc146107f9578063a479265d14610827578063a4f209b01461083c575f80fd5b80638f1d37761161016c5780638f1d3776146106f9578063910129d4146107a957806397fc007c146107da575f80fd5b8063728cdbca146106a457806388b1ea09146106c35780638da5cb5b146106dc575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa146106465780636c578c1d14610671578063715018a614610690575f80fd5b80635ef7a94a1461057b5780635f77cf1d146105db5780636126729014610627575f80fd5b8063428868b51161022c578063428868b51461053257806357e0af6c146105455780635c975abb14610564575f80fd5b80632b7ac3f3146104c75780633b70c18a146104fe5780633e001b661461051d575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b3660046140c8565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b506103966103913660046140fa565b610a04565b005b3480156103a3575f80fd5b506103966103b2366004614158565b610ad6565b3480156103c2575f80fd5b5061033f6103d13660046140c8565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b506103966104083660046141a0565b610e2f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c3660046140c8565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c3660046140c8565b611326565b34801561047c575f80fd5b5061036961048b3660046140c8565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b63660046140c8565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104e6906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b348015610509575f80fd5b50609b546104e6906001600160a01b031681565b348015610528575f80fd5b5061036960aa5481565b6103966105403660046141df565b611354565b348015610550575f80fd5b5061039661055f3660046140c8565b611bbb565b34801561056f575f80fd5b5060655460ff1661033f565b348015610586575f80fd5b506105bb6105953660046140c8565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b3480156105e6575f80fd5b5061060e7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610632575f80fd5b506103966106413660046140c8565b611c66565b348015610651575f80fd5b506103696106603660046140c8565b60ab6020525f908152604090205481565b34801561067c575f80fd5b5061039661068b3660046140fa565b611e7b565b34801561069b575f80fd5b50610396611f38565b3480156106af575f80fd5b506103966106be36600461424c565b611f4b565b3480156106ce575f80fd5b5060a65461033f9060ff1681565b3480156106e7575f80fd5b506033546001600160a01b03166104e6565b348015610704575f80fd5b506107656107133660046140c8565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b3480156107b4575f80fd5b5061033f6107c33660046140c8565b5f90815260a4602052604090206003015460ff1690565b3480156107e5575f80fd5b506103966107f43660046140fa565b61228e565b348015610804575f80fd5b5061033f6108133660046140fa565b609f6020525f908152604090205460ff1681565b348015610832575f80fd5b5061036960995481565b348015610847575f80fd5b506103966108563660046140c8565b612371565b348015610866575f80fd5b506103696108753660046140fa565b60a56020525f908152604090205481565b348015610891575f80fd5b5061036960a85481565b3480156108a6575f80fd5b506103966108b53660046142a7565b612421565b3480156108c5575f80fd5b506103966108d43660046140fa565b612742565b3480156108e4575f80fd5b506103966108f33660046141a0565b61279b565b348015610903575f80fd5b5061039661091236600461431b565b612aeb565b61039661092536600461434d565b612c46565b348015610935575f80fd5b5061036960985481565b34801561094a575f80fd5b506103966109593660046140fa565b613212565b348015610969575f80fd5b506097546104e6906001600160a01b031681565b348015610988575f80fd5b5061033f6109973660046140c8565b6132d1565b3480156109a7575f80fd5b50610369609a5481565b3480156109bc575f80fd5b506103966109cb3660046140c8565b61331b565b3480156109db575f80fd5b506103966109ea3660046140fa565b6133be565b3480156109fa575f80fd5b5061036960a95481565b610a0c61344b565b6001600160a01b0381165f908152609f602052604090205460ff1615610a795760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610ade61344b565b5f8111610b2d5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610a70565b5f80610b3985856134a5565b915091505f610b4c836001015160c01c90565b5f81815260a160205260409020549091508214610bab5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b5f60a181610bb987856143a2565b81526020019081526020015f205414610c395760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610a70565b609d548111610cb05760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b610cbb6001826143b5565b609e555b8315610e2757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610d07816132d1565b15610d62575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610d529084906143a2565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610ddf575060a85481145b15610de9575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610cbf575b505050505050565b60a85415610e7f5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b610e8761353e565b5f80610e9384846134a5565b915091505f610ea6836001015160c01c90565b5f81815260a160205260409020549091508214610f055760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b610f0e81611326565b610f5a5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b610f63816132d1565b15610fb05760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003015460ff16156110115760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610a70565b5f81815260a260205260409020600101544210156110715760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610a70565b605983015160a05f6110846001856143b5565b81526020019081526020015f2054146110df5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f81815260a060205260409020541561113a5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610a70565b80609d546001011461118e5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b609d819055600160a35f6111a3866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a060205260409020556111f26111e5846011015160c01c90565b600985015160c01c613591565b60a25f6112006001846143b5565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab919061123990846143b5565b81526020019081526020015f205f905560a45f60018361125991906143b5565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611302866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061134e57505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156113c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e491906143c8565b6114305760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b60a854156114805760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b61148861353e565b61149560208301836143e3565b60ff1615806114b357506114ac60208301836143e3565b60ff166001145b6114ff5760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610a70565b60808201356115505760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610a70565b60a08201356115a15760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610a70565b5f806115b86115b36020860186614403565b6134a5565b915091505f6115cb836001015160c01c90565b90505f60a1816115dc8460016143a2565b81526020019081526020015f2054146116375760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610a70565b609e5481146116885760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b5f81815260a1602052604090205482146116e45760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610a70565b5f81815260ab60205260409020546080860135146117445760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f611753846011015160c01c90565b90505f61177f6117696060890160408a01614464565b61177960808a0160608b0161447d565b8461364e565b9050611791608088016060890161447d565b6001939093019261ffff1691909101905f8049156117b0575f496117d2565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b905060f96117e360208a018a6143e3565b60ff166001036117f257506101015b6040805182810190915296506118178761180f60208c018c6143e3565b60ff16613692565b60c085901b60018801526118458761183560808c0160608d0161447d565b61ffff1660c01b60099190910152565b60c084811b6011890152601988018490526039880183905260808a0135605989015260a08a0135607989015289013560998801526118a98761188a60208b018b614403565b60405161189892919061449e565b604051809103902060b99190910152565b60d9870186905260016118bf60208b018b6143e3565b60ff16106118f1576118f1876118db60608c0160408d01614464565b67ffffffffffffffff1660c01b60f99190910152565b8087205f86815260a1602090815260408083209390935560ab905290812060a08b0135905560a65460ff16156119505760a7545f90815260a460205260409020600201546099544291611943916143a2565b61194d91906143b5565b90505b6040518060800160405280428152602001826098544261197091906143a2565b61197a91906143a2565b815260200161198f60608d0160408e01614464565b67ffffffffffffffff1681526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611a0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3191906144ad565b90525f87815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8790556097546001600160a01b031692506374fe27b79150893590611a9990611a93908c018c614403565b5f613699565b5f611aa760408d018d614403565b6040518663ffffffff1660e01b8152600401611ac795949392919061450b565b602060405180830381865afa158015611ae2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0691906143c8565b611b785760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b5f84815260a16020526040808220549051909186917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050565b611bc361344b565b5f81118015611bd457506099548114155b611c205760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610a70565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff16158015611c8657505f5460ff8083169116105b611cf85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611d335f5460ff1690565b60ff16600214611d855760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610a70565b81611df85760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610a70565b609e545f90815260ab6020526040902054611e2157609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611c5a565b611e8361344b565b6001600160a01b0381165f908152609f602052604090205460ff16611eea5760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610a70565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610acb565b611f4061344b565b611f495f6136ed565b565b5f54610100900460ff1615808015611f6957505f54600160ff909116105b80611f825750303b158015611f8257505f5460ff166001145b611ff45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f805460ff191660011790558015612032575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038616158061204f57506001600160a01b038516155b15612086576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0387166120dc5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610a70565b6120e4613756565b6120ec6137da565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015612285575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b61229661344b565b6001600160a01b038116158015906122bc5750609c546001600160a01b03828116911614155b6123085760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610a70565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61237961344b565b5f81118015612389575060648111155b8015612397575060a9548114155b6123e35760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610a70565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611c5a565b60a854156124715760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b61247961353e565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156124e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061250991906143c8565b6125555760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b5f8061256186866134a5565b915091505f612574836001015160c01c90565b5f81815260a1602052604090205490915082146125d35760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b6125dc816132d1565b6126285760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a6805460ff191690556099546002909101544291612681916143a2565b116126f7575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f757400000000000000000000000000000000000000000000000000918301919091526126f29183919061385e565b612285565b6127028386866139ba565b61228581336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250613b6d565b61274a61344b565b60aa80545f90915561275c8282613c39565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611c5a565b6127a361344b565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea541561281a5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610a70565b5f8061282684846134a5565b915091505f612839836001015160c01c90565b905080156128895760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610a70565b5f612895846079015190565b9050806128e45760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610a70565b600984015160c01c156129395760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610a70565b5f612945856019015190565b036129925760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610a70565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440146129be856039015190565b14612a0b5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610a70565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b612af361344b565b8015612c1457612b01613ce4565b60a65460ff1615612bd35760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091612b559084906143a2565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612c1c613d3e565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612bf6565b50565b335f908152609f602052604090205460ff16612ca45760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610a70565b60a85415612cf45760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612cfc61353e565b60a65460ff1615612d4f5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610a70565b8167ffffffffffffffff16609d5410612daa5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a160205260409020548114612e115760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b612e248267ffffffffffffffff16611326565b612e705760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612eeb5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a260205260409020600101544210612f7b5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610a70565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fef91906144ad565b34101561303e5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b99763460405161319091815260200190565b60405180910390a35f609d5460016131a891906143a2565b90505b609e548111613200578267ffffffffffffffff1681146131ee576099545f82815260a26020526040812060010180549091906131e89084906143a2565b90915550505b806131f88161457e565b9150506131ab565b505060a6805460ff1916600117905550565b335f90815260a56020526040812054908190036132715760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610a70565b335f90815260a5602052604081205561328a8282613c39565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a826040516132c591815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b03161580159061134e5750505f90815260a46020526040902060030154610100900460ff161590565b61332361344b565b5f8111801561333457506098548114155b6133805760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610a70565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611c5a565b6133c661344b565b6001600160a01b0381166134425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a70565b612c43816136ed565b6033546001600160a01b03163314611f495760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a70565b5f805f6134b28585613d77565b90505f8160ff165f036134d3576134c98686613de7565b9094509050613530565b8160ff166001036134e8576134c98686613e50565b60405162461bcd60e51b815260206004820152601960248201527f556e737570706f727465642062617463682076657273696f6e000000000000006044820152606401610a70565b808420925050509250929050565b60655460ff1615611f495760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a70565b805f0361359c575050565b8082035f5b82811015613648576101008184038111156135bb57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b15801561361e575f80fd5b505af1158015613630573d5f803e3d5ffd5b505050506101008301925050610100810190506135a1565b50505050565b6040805160c085901b815260f084901b6008820152600a60208502820181019092525f9181016136838161ffff871686613ea3565b82900390912095945050505050565b8082535050565b60605f808080806136ac888a018a6146a2565b95509550955095509550508187106136ca5794506136e69350505050565b8387106136de5782955050505050506136e6565b509293505050505b9392505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166137d25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f49613f69565b5f54610100900460ff166138565760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f49613ff1565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af11580156138e2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390691906144ad565b5f86815260a460205260409020600101549091506139259082906143a2565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a5909152812080549091906139649084906143a2565b909155505060405161397790849061473f565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80613a075760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610a70565b5f613a16846001015160c01c90565b90505f613a24856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613a53876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613b15885160f81c90565b858888866040518663ffffffff1660e01b8152600401613b3995949392919061476b565b5f6040518083038186803b158015613b4f575f80fd5b505afa158015613b61573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a954909190606490613b91908461479c565b613b9b91906147b3565b9050613ba781836143b5565b60aa5f828254613bb791906143a2565b90915550506001600160a01b0384165f90815260a5602052604081208054839290613be39084906143a2565b9091555050604051613bf690849061473f565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8015613ce0575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613c88576040519150601f19603f3d011682016040523d82523d5f602084013e613c8d565b606091505b5050905080613cde5760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a70565b505b5050565b613cec61353e565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d213390565b6040516001600160a01b03909116815260200160405180910390a1565b613d46614076565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613d21565b5f81613dc55760405162461bcd60e51b815260206004820152601260248201527f456d7074792062617463682068656164657200000000000000000000000000006044820152606401610a70565b82825f818110613dd757613dd76147eb565b919091013560f81c949350505050565b5f8160f9811015613e3a5760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610a70565b6040519150808483378082016040529250929050565b5f816101018114613e3a5760405162461bcd60e51b815260206004820181905260248201527f626174636820686561646572206c656e67746820697320696e636f72726563746044820152606401610a70565b5f825f03613eb25750826136e6565b609b546001600160a01b03165f5b84811015613f5f576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa158015613f26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f4a91906144ad565b87525060209095019460019384019301613ec0565b5093949350505050565b5f54610100900460ff16613fe55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b6065805460ff19169055565b5f54610100900460ff1661406d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f49336136ed565b60655460ff16611f495760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a70565b5f602082840312156140d8575f80fd5b5035919050565b80356001600160a01b03811681146140f5575f80fd5b919050565b5f6020828403121561410a575f80fd5b6136e6826140df565b5f8083601f840112614123575f80fd5b50813567ffffffffffffffff81111561413a575f80fd5b602083019150836020828501011115614151575f80fd5b9250929050565b5f805f6040848603121561416a575f80fd5b833567ffffffffffffffff811115614180575f80fd5b61418c86828701614113565b909790965060209590950135949350505050565b5f80602083850312156141b1575f80fd5b823567ffffffffffffffff8111156141c7575f80fd5b6141d385828601614113565b90969095509350505050565b5f80604083850312156141f0575f80fd5b823567ffffffffffffffff80821115614207575f80fd5b9084019060e0828703121561421a575f80fd5b9092506020840135908082111561422f575f80fd5b50830160608186031215614241575f80fd5b809150509250929050565b5f805f805f8060c08789031215614261575f80fd5b61426a876140df565b9550614278602088016140df565b9450614286604088016140df565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156142ba575f80fd5b843567ffffffffffffffff808211156142d1575f80fd5b6142dd88838901614113565b909650945060208701359150808211156142f5575f80fd5b5061430287828801614113565b95989497509550505050565b8015158114612c43575f80fd5b5f6020828403121561432b575f80fd5b81356136e68161430e565b803567ffffffffffffffff811681146140f5575f80fd5b5f806040838503121561435e575f80fd5b61436783614336565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561134e5761134e614375565b8181038181111561134e5761134e614375565b5f602082840312156143d8575f80fd5b81516136e68161430e565b5f602082840312156143f3575f80fd5b813560ff811681146136e6575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614436575f80fd5b83018035915067ffffffffffffffff821115614450575f80fd5b602001915036819003821315614151575f80fd5b5f60208284031215614474575f80fd5b6136e682614336565b5f6020828403121561448d575f80fd5b813561ffff811681146136e6575f80fd5b818382375f9101908152919050565b5f602082840312156144bd575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b818110156145555784516001600160a01b031683529383019391830191600101614530565b505087604086015284810360608601526145708187896144c4565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145ae576145ae614375565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126145f1575f80fd5b8135602067ffffffffffffffff8083111561460e5761460e6145b5565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614651576146516145b5565b6040529384526020818701810194908101925087851115614670575f80fd5b6020870191505b8482101561469757614688826140df565b83529183019190830190614677565b979650505050505050565b5f805f805f8060c087890312156146b7575f80fd5b86359550602087013567ffffffffffffffff808211156146d5575f80fd5b6146e18a838b016145e2565b96506040890135955060608901359150808211156146fd575f80fd5b6147098a838b016145e2565b94506080890135935060a0890135915080821115614725575f80fd5b5061473289828a016145e2565b9150509295509295509295565b5f82515f5b8181101561475e5760208186018101518583015201614744565b505f920191825250919050565b858152846020820152608060408201525f61478a6080830185876144c4565b90508260608301529695505050505050565b808202811582820484141761134e5761134e614375565b5f826147e6577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainID\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"res\",\"type\":\"string\"}],\"name\":\"ChallengeRes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ChallengeRewardClaim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"}],\"name\":\"ChallengeState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ProveRemainingClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateChallenger\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"UpdateFinalizationPeriodSeconds\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPercent\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPercent\",\"type\":\"uint256\"}],\"name\":\"UpdateProofRewardPercent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newWindow\",\"type\":\"uint256\"}],\"name\":\"UpdateProofWindow\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"UpdateRollupDelayPeriod\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LAYER_2_CHAIN_ID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__maxNumTxInChunk\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"batchChallengeReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchChallenged\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchChallengedSuccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchDataStore\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"originTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"finalizeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchExist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInsideChallengeWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_batchHash\",\"type\":\"bytes32\"}],\"name\":\"challengeState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"challenges\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"challengeSuccess\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"finished\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimProveRemaining\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"lastBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"numL1Messages\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIRollup.BatchDataInput\",\"name\":\"batchDataInput\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"sequencerSets\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structIRollup.BatchSignatureInput\",\"name\":\"batchSignatureInput\",\"type\":\"tuple\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"lastBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"numL1Messages\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIRollup.BatchDataInput\",\"name\":\"batchDataInput\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"sequencerSets\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structIRollup.BatchSignatureInput\",\"name\":\"batchSignatureInput\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_batchProof\",\"type\":\"bytes\"}],\"name\":\"commitBatchWithProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizationPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"finalizeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1StakingContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_prevStateRoot\",\"type\":\"bytes32\"}],\"name\":\"initialize2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_rollupDelayPeriod\",\"type\":\"uint256\"}],\"name\":\"initialize3\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"challengerAddress\",\"type\":\"address\"}],\"name\":\"isChallenger\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isChallenger\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1StakingContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastCommittedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofRewardPercent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofWindow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proveRemaining\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_batchProof\",\"type\":\"bytes\"}],\"name\":\"proveState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertReqIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupDelayPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"updateFinalizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newWindow\",\"type\":\"uint256\"}],\"name\":\"updateProofWindow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newProofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"updateRewardPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"updateRollupDelayPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newVerifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"withdrawalRoots\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a060405234801562000010575f80fd5b5060405162004fb038038062004fb083398101604081905262000033916200010f565b6001600160401b0381166080526200004a62000051565b506200013e565b5f54610100900460ff1615620000bd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146200010d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f6020828403121562000120575f80fd5b81516001600160401b038116811462000137575f80fd5b9392505050565b608051614e526200015e5f395f81816106370152613c210152614e525ff3fe608060405260043610610332575f3560e01c806388b1ea09116101a7578063bedb86fb116100e7578063d8dc99d211610092578063dff7827e1161006d578063dff7827e14610a3a578063e3fff1dd14610a4f578063f2fde38b14610a6e578063fb1e8b0414610a8d575f80fd5b8063d8dc99d2146109e7578063ddd8a3dc146109fc578063de8b303514610a1b575f80fd5b8063ce5db8d6116100c2578063ce5db8d614610994578063cf9a6745146109a9578063d279c191146109c8575f80fd5b8063bedb86fb14610943578063c555389214610962578063cd4edc6914610981575f80fd5b8063a479265d11610152578063b31a77d31161012d578063b31a77d3146108d1578063b3484425146108e6578063b35dac4e14610905578063b3e0a50914610924575f80fd5b8063a479265d14610872578063a4f209b014610887578063abc8d68d146108a6575f80fd5b8063910129d411610182578063910129d4146107f457806397fc007c14610825578063a415d8dc14610844575f80fd5b806388b1ea091461070e5780638da5cb5b146107275780638f1d377614610744575f80fd5b80633b70c18a116102725780635ef7a94a1161021d57806368589dfa116101f857806368589dfa146106915780636c578c1d146106bc578063715018a6146106db578063728cdbca146106ef575f80fd5b80635ef7a94a146105c65780635f77cf1d146106265780636126729014610672575f80fd5b80634e8f1d671161024d5780634e8f1d671461057157806357e0af6c146105905780635c975abb146105af575f80fd5b80633b70c18a1461052a5780633e001b6614610549578063428868b51461055e575f80fd5b806313361101116102dd57806321e2f9e0116102b857806321e2f9e01461047e5780632362f03e1461049d5780632571098d146104c85780632b7ac3f3146104f3575f80fd5b8063133611011461041a57806318463fb01461043957806318af3b2b1461044e575f80fd5b806310d445831161030d57806310d44583146103c4578063116a1f42146103e3578063121dcd5014610405575f80fd5b806304d772151461033d578063059def61146103805780630ceb6780146103a3575f80fd5b3661033957005b5f80fd5b348015610348575f80fd5b5061036b61035736600461462b565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561038b575f80fd5b50610395609d5481565b604051908152602001610377565b3480156103ae575f80fd5b506103c26103bd36600461465d565b610aa2565b005b3480156103cf575f80fd5b506103c26103de3660046146bb565b610b74565b3480156103ee575f80fd5b5061036b6103fd36600461462b565b609d54101590565b348015610410575f80fd5b50610395609e5481565b348015610425575f80fd5b506103c2610434366004614703565b610eb0565b348015610444575f80fd5b5061039560a75481565b348015610459575f80fd5b5061036b61046836600461462b565b5f90815260a26020526040902060010154421090565b348015610489575f80fd5b5061036b61049836600461462b565b61138a565b3480156104a8575f80fd5b506103956104b736600461462b565b60a16020525f908152604090205481565b3480156104d3575f80fd5b506103956104e236600461462b565b60a06020525f908152604090205481565b3480156104fe575f80fd5b50609c54610512906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b348015610535575f80fd5b50609b54610512906001600160a01b031681565b348015610554575f80fd5b5061039560aa5481565b6103c261056c366004614768565b6113b8565b34801561057c575f80fd5b506103c261058b3660046147c8565b6115f4565b34801561059b575f80fd5b506103c26105aa36600461462b565b6118c2565b3480156105ba575f80fd5b5060655460ff1661036b565b3480156105d1575f80fd5b506106066105e036600461462b565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610377565b348015610631575f80fd5b506106597f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610377565b34801561067d575f80fd5b506103c261068c36600461462b565b61196d565b34801561069c575f80fd5b506103956106ab36600461462b565b60ab6020525f908152604090205481565b3480156106c7575f80fd5b506103c26106d636600461465d565b611b48565b3480156106e6575f80fd5b506103c2611c05565b3480156106fa575f80fd5b506103c2610709366004614879565b611c18565b348015610719575f80fd5b5060a65461036b9060ff1681565b348015610732575f80fd5b506033546001600160a01b0316610512565b34801561074f575f80fd5b506107b061075e36600461462b565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c001610377565b3480156107ff575f80fd5b5061036b61080e36600461462b565b5f90815260a4602052604090206003015460ff1690565b348015610830575f80fd5b506103c261083f36600461465d565b611f21565b34801561084f575f80fd5b5061036b61085e36600461465d565b609f6020525f908152604090205460ff1681565b34801561087d575f80fd5b5061039560995481565b348015610892575f80fd5b506103c26108a136600461462b565b612004565b3480156108b1575f80fd5b506103956108c036600461465d565b60a56020525f908152604090205481565b3480156108dc575f80fd5b5061039560a85481565b3480156108f1575f80fd5b506103c26109003660046148d4565b6120b4565b348015610910575f80fd5b506103c261091f36600461465d565b6123b8565b34801561092f575f80fd5b506103c261093e366004614703565b612411565b34801561094e575f80fd5b506103c261095d366004614948565b612761565b34801561096d575f80fd5b506103c261097c36600461462b565b61289f565b6103c261098f36600461497a565b612942565b34801561099f575f80fd5b5061039560985481565b3480156109b4575f80fd5b506103c26109c336600461462b565b612ed4565b3480156109d3575f80fd5b506103c26109e236600461465d565b613043565b3480156109f2575f80fd5b5061039560ac5481565b348015610a07575f80fd5b50609754610512906001600160a01b031681565b348015610a26575f80fd5b5061036b610a3536600461462b565b613102565b348015610a45575f80fd5b50610395609a5481565b348015610a5a575f80fd5b506103c2610a6936600461462b565b61314c565b348015610a79575f80fd5b506103c2610a8836600461465d565b6131ef565b348015610a98575f80fd5b5061039560a95481565b610aaa61327c565b6001600160a01b0381165f908152609f602052604090205460ff1615610b175760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610b7c61327c565b5f8111610bcb5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610b0e565b5f80610bd785856132d6565b915091505f610bea836001015160c01c90565b5f81815260a160205260409020549091508214610c495760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b5f60a181610c5787856149cf565b81526020019081526020015f205414610cd75760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610b0e565b609d548111610d4e5760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610b0e565b610d596001826149e2565b609e555b8315610ea857604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610da581613102565b15610e00575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610df09084906149cf565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810191909155600301805461ffff1916905560a85415801590610e60575060a85481145b15610e6a575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610d5d575b505050505050565b60a85415610f005760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b610f0861336f565b5f80610f1484846132d6565b915091505f610f27836001015160c01c90565b5f81815260a160205260409020549091508214610f865760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b610f8f8161138a565b610fdb5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610b0e565b610fe481613102565b156110315760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610b0e565b5f81815260a4602052604090206003015460ff16156110925760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610b0e565b5f81815260a260205260409020600101544210156110f25760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610b0e565b605983015160a05f6111056001856149e2565b81526020019081526020015f2054146111605760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610b0e565b5f81815260a06020526040902054156111bb5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610b0e565b80609d546001011461120f5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610b0e565b609d819055600160a35f611224866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a06020526040902055611273611266846011015160c01c90565b600985015160c01c6133c2565b60a25f6112816001846149e2565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab91906112ba90846149e2565b81526020019081526020015f205f905560a45f6001836112da91906149e2565b815260208082019290925260409081015f90812080547fffffffff000000000000000000000000000000000000000000000000000000001681556001810182905560028101829055600301805461ffff1916905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611366866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a26020526040812054158015906113b257505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611424573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061144891906149f5565b6114945760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610b0e565b60a854156114e45760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b6114ec61336f565b60ac54609b54604080517fb59b1a7800000000000000000000000000000000000000000000000000000000815290514293926001600160a01b03169163b59b1a789160048083019260209291908290030181865afa158015611550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115749190614a10565b61157e91906149cf565b10156115e6575f6115956080840160608501614a27565b61ffff16116115e65760405162461bcd60e51b815260206004820152600b60248201527f6c316d73672064656c61790000000000000000000000000000000000000000006044820152606401610b0e565b6115f0828261347f565b5050565b60a854156116445760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b61164c61336f565b60ac54609e545f90815260a260205260408120549091429161166e91906149cf565b1090505f4260ac54609b5f9054906101000a90046001600160a01b03166001600160a01b031663b59b1a786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ea9190614a10565b6116f491906149cf565b109050811580156117025750805b15611769575f61171860808a0160608b01614a27565b61ffff16116117695760405162461bcd60e51b815260206004820152600b60248201527f6c316d73672064656c61790000000000000000000000000000000000000000006044820152606401610b0e565b81806117725750805b6117be5760405162461bcd60e51b815260206004820152600e60248201527f696e76616c69642074696d696e670000000000000000000000000000000000006044820152606401610b0e565b6117c8888861347f565b5f806117d488886132d6565b915091505f6117e7836001015160c01c90565b905080609e541461183a5760405162461bcd60e51b815260206004820152601660248201527f696e636f727265637420626174636820686561646572000000000000000000006044820152606401610b0e565b5f81815260a1602052604090205482146118965760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b5f81815260a260205260409020426001909101556118b5838888613bb2565b5050505050505050505050565b6118ca61327c565b5f811180156118db57506099548114155b6119275760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610b0e565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff1615801561198d57505f5460ff8083169116105b6119ff5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b0e565b5f805461ffff191660ff831617610100179055611a1d5f5460ff1690565b60ff16600214611a6f5760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610b0e565b81611ae25760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610b0e565b609e545f90815260ab6020526040902054611b0b57609e545f90815260ab602052604090208290555b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611961565b611b5061327c565b6001600160a01b0381165f908152609f602052604090205460ff16611bb75760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610b0e565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610b69565b611c0d61327c565b611c165f613d65565b565b5f54610100900460ff1615808015611c3657505f54600160ff909116105b80611c4f5750303b158015611c4f57505f5460ff166001145b611cc15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b0e565b5f805460ff191660011790558015611ce2575f805461ff0019166101001790555b6001600160a01b0386161580611cff57506001600160a01b038516155b15611d36576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716611d8c5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610b0e565b611d94613dce565b611d9c613e52565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015611f18575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b611f2961327c565b6001600160a01b03811615801590611f4f5750609c546001600160a01b03828116911614155b611f9b5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610b0e565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61200c61327c565b5f8111801561201c575060648111155b801561202a575060a9548114155b6120765760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610b0e565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611961565b60a854156121045760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b61210c61336f565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612178573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219c91906149f5565b6121e85760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610b0e565b5f806121f486866132d6565b915091505f612207836001015160c01c90565b5f81815260a1602052604090205490915082146122665760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b61226f81613102565b6122bb5760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610b0e565b5f81815260a46020526040902060038101805461ff00191661010017905560a6805460ff1916905560995460029091015442916122f7916149cf565b1161236d575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f7574000000000000000000000000000000000000000000000000009183019190915261236891839190613ed6565b611f18565b612378838686613bb2565b611f1881336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250614032565b6123c061327c565b60aa80545f9091556123d282826140fe565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611961565b61241961327c565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea54156124905760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610b0e565b5f8061249c84846132d6565b915091505f6124af836001015160c01c90565b905080156124ff5760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610b0e565b5f61250b846079015190565b90508061255a5760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610b0e565b600984015160c01c156125af5760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610b0e565b5f6125bb856019015190565b036126085760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610b0e565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014612634856039015190565b146126815760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610b0e565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b61276961327c565b801561286d576127776141a8565b60a65460ff161561282c5760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a590925282208054919290916127cb9084906149cf565b909155505060a7545f90815260a46020526040812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810191909155600301805461ffff1916905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612875614202565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361284f565b50565b6128a761327c565b5f811180156128b8575060ac548114155b6129045760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206e657720726f6c6c75702064656c617920706572696f64006044820152606401610b0e565b60ac80549082905560408051828152602081018490527f624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad19101611961565b335f908152609f602052604090205460ff166129a05760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610b0e565b60a854156129f05760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b6129f861336f565b60a65460ff1615612a4b5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610b0e565b8167ffffffffffffffff16609d5410612aa65760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610b0e565b67ffffffffffffffff82165f90815260a160205260409020548114612b0d5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b612b208267ffffffffffffffff1661138a565b612b6c5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610b0e565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612be75760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610b0e565b67ffffffffffffffff82165f90815260a260205260409020600101544210612c775760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610b0e565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cc7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ceb9190614a10565b341015612d3a5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610b0e565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009093169816979097171783559451600183015591516002820155925160039093018054925115156101000261ff00199415159490941661ffff19909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b997634604051612e5291815260200190565b60405180910390a35f609d546001612e6a91906149cf565b90505b609e548111612ec2578267ffffffffffffffff168114612eb0576099545f82815260a2602052604081206001018054909190612eaa9084906149cf565b90915550505b80612eba81614a48565b915050612e6d565b505060a6805460ff1916600117905550565b5f54600390610100900460ff16158015612ef457505f5460ff8083169116105b612f665760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b0e565b5f805461ffff191660ff831617610100178155829003612fc85760405162461bcd60e51b815260206004820152601b60248201527f696e76616c696420726f6c6c75702064656c617920706572696f6400000000006044820152606401610b0e565b60ac829055604080515f8152602081018490527f624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad1910160405180910390a15f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611961565b335f90815260a56020526040812054908190036130a25760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610b0e565b335f90815260a560205260408120556130bb82826140fe565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a826040516130f691815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b0316158015906113b25750505f90815260a46020526040902060030154610100900460ff161590565b61315461327c565b5f8111801561316557506098548114155b6131b15760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610b0e565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611961565b6131f761327c565b6001600160a01b0381166132735760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b0e565b61289c81613d65565b6033546001600160a01b03163314611c165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0e565b5f805f6132e3858561423b565b90505f8160ff165f03613304576132fa86866142ab565b9094509050613361565b8160ff16600103613319576132fa8686614314565b60405162461bcd60e51b815260206004820152601960248201527f556e737570706f727465642062617463682076657273696f6e000000000000006044820152606401610b0e565b808420925050509250929050565b60655460ff1615611c165760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b0e565b805f036133cd575050565b8082035f5b82811015613479576101008184038111156133ec57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b15801561344f575f80fd5b505af1158015613461573d5f803e3d5ffd5b505050506101008301925050610100810190506133d2565b50505050565b61348c6020830183614a7f565b60ff1615806134aa57506134a36020830183614a7f565b60ff166001145b6134f65760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610b0e565b60808201356135475760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610b0e565b60a08201356135985760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610b0e565b5f806135af6135aa6020860186614a9f565b6132d6565b915091505f6135c2836001015160c01c90565b90505f60a1816135d38460016149cf565b81526020019081526020015f20541461362e5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610b0e565b609e54811461367f5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610b0e565b5f81815260a1602052604090205482146136db5760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610b0e565b5f81815260ab602052604090205460808601351461373b5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610b0e565b5f61374a846011015160c01c90565b90505f6137766137606060890160408a01614b00565b61377060808a0160608b01614a27565b84614367565b90506137886080880160608901614a27565b6001939093019261ffff1691909101905f8049156137a7575f496137c9565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b905060f96137da60208a018a614a7f565b60ff166001036137e957506101015b60408051828101909152965061380e8761380660208c018c614a7f565b60ff166143ab565b60c085901b600188015261383c8761382c60808c0160608d01614a27565b61ffff1660c01b60099190910152565b60c084811b6011890152601988018490526039880183905260808a0135605989015260a08a0135607989015289013560998801526138a08761388160208b018b614a9f565b60405161388f929190614b19565b604051809103902060b99190910152565b60d9870186905260016138b660208b018b614a7f565b60ff16106138e8576138e8876138d260608c0160408d01614b00565b67ffffffffffffffff1660c01b60f99190910152565b8087205f86815260a1602090815260408083209390935560ab905290812060a08b0135905560a65460ff16156139475760a7545f90815260a46020526040902060020154609954429161393a916149cf565b61394491906149e2565b90505b6040518060800160405280428152602001826098544261396791906149cf565b61397191906149cf565b815260200161398660608d0160408e01614b00565b67ffffffffffffffff1681526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015613a04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a289190614a10565b90525f87815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8790556097546001600160a01b031692506374fe27b79150893590613a9090613a8a908c018c614a9f565b5f6143b2565b5f613a9e60408d018d614a9f565b6040518663ffffffff1660e01b8152600401613abe959493929190614b6f565b602060405180830381865afa158015613ad9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613afd91906149f5565b613b6f5760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610b0e565b5f84815260a16020526040808220549051909186917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050565b80613bff5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610b0e565b5f613c0e846001015160c01c90565b90505f613c1c856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613c4b876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613d0d885160f81c90565b858888866040518663ffffffff1660e01b8152600401613d31959493929190614be2565b5f6040518083038186803b158015613d47575f80fd5b505afa158015613d59573d5f803e3d5ffd5b50505050505050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613e4a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b611c16614406565b5f54610100900460ff16613ece5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b611c1661448e565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015613f5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f7e9190614a10565b5f86815260a46020526040902060010154909150613f9d9082906149cf565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a590915281208054909190613fdc9084906149cf565b9091555050604051613fef908490614c13565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b5f83815260a4602052604081206001015460a9549091906064906140569084614c3f565b6140609190614c56565b905061406c81836149e2565b60aa5f82825461407c91906149cf565b90915550506001600160a01b0384165f90815260a56020526040812080548392906140a89084906149cf565b90915550506040516140bb908490614c13565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80156115f0575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461414d576040519150601f19603f3d011682016040523d82523d5f602084013e614152565b606091505b50509050806141a35760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610b0e565b505050565b6141b061336f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586141e53390565b6040516001600160a01b03909116815260200160405180910390a1565b61420a614513565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336141e5565b5f816142895760405162461bcd60e51b815260206004820152601260248201527f456d7074792062617463682068656164657200000000000000000000000000006044820152606401610b0e565b82825f81811061429b5761429b614c8e565b919091013560f81c949350505050565b5f8160f98110156142fe5760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610b0e565b6040519150808483378082016040529250929050565b5f8161010181146142fe5760405162461bcd60e51b815260206004820181905260248201527f626174636820686561646572206c656e67746820697320696e636f72726563746044820152606401610b0e565b6040805160c085901b815260f084901b6008820152600a60208502820181019092525f91810161439c8161ffff871686614565565b82900390912095945050505050565b8082535050565b60605f808080806143c5888a018a614da8565b95509550955095509550508187106143e35794506143ff9350505050565b8387106143f75782955050505050506143ff565b509293505050505b9392505050565b5f54610100900460ff166144825760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b6065805460ff19169055565b5f54610100900460ff1661450a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b611c1633613d65565b60655460ff16611c165760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610b0e565b5f825f036145745750826143ff565b609b546001600160a01b03165f5b84811015614621576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa1580156145e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061460c9190614a10565b87525060209095019460019384019301614582565b5093949350505050565b5f6020828403121561463b575f80fd5b5035919050565b80356001600160a01b0381168114614658575f80fd5b919050565b5f6020828403121561466d575f80fd5b6143ff82614642565b5f8083601f840112614686575f80fd5b50813567ffffffffffffffff81111561469d575f80fd5b6020830191508360208285010111156146b4575f80fd5b9250929050565b5f805f604084860312156146cd575f80fd5b833567ffffffffffffffff8111156146e3575f80fd5b6146ef86828701614676565b909790965060209590950135949350505050565b5f8060208385031215614714575f80fd5b823567ffffffffffffffff81111561472a575f80fd5b61473685828601614676565b90969095509350505050565b5f60e08284031215614752575f80fd5b50919050565b5f60608284031215614752575f80fd5b5f8060408385031215614779575f80fd5b823567ffffffffffffffff80821115614790575f80fd5b61479c86838701614742565b935060208501359150808211156147b1575f80fd5b506147be85828601614758565b9150509250929050565b5f805f805f80608087890312156147dd575f80fd5b863567ffffffffffffffff808211156147f4575f80fd5b6148008a838b01614742565b97506020890135915080821115614815575f80fd5b6148218a838b01614758565b96506040890135915080821115614836575f80fd5b6148428a838b01614676565b9096509450606089013591508082111561485a575f80fd5b5061486789828a01614676565b979a9699509497509295939492505050565b5f805f805f8060c0878903121561488e575f80fd5b61489787614642565b95506148a560208801614642565b94506148b360408801614642565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156148e7575f80fd5b843567ffffffffffffffff808211156148fe575f80fd5b61490a88838901614676565b90965094506020870135915080821115614922575f80fd5b5061492f87828801614676565b95989497509550505050565b801515811461289c575f80fd5b5f60208284031215614958575f80fd5b81356143ff8161493b565b803567ffffffffffffffff81168114614658575f80fd5b5f806040838503121561498b575f80fd5b61499483614963565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156113b2576113b26149a2565b818103818111156113b2576113b26149a2565b5f60208284031215614a05575f80fd5b81516143ff8161493b565b5f60208284031215614a20575f80fd5b5051919050565b5f60208284031215614a37575f80fd5b813561ffff811681146143ff575f80fd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a7857614a786149a2565b5060010190565b5f60208284031215614a8f575f80fd5b813560ff811681146143ff575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614ad2575f80fd5b83018035915067ffffffffffffffff821115614aec575f80fd5b6020019150368190038213156146b4575f80fd5b5f60208284031215614b10575f80fd5b6143ff82614963565b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b81811015614bb95784516001600160a01b031683529383019391830191600101614b94565b50508760408601528481036060860152614bd4818789614b28565b9a9950505050505050505050565b858152846020820152608060408201525f614c01608083018587614b28565b90508260608301529695505050505050565b5f82515f5b81811015614c325760208186018101518583015201614c18565b505f920191825250919050565b80820281158282048414176113b2576113b26149a2565b5f82614c89577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112614cf7575f80fd5b8135602067ffffffffffffffff80831115614d1457614d14614cbb565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614d5757614d57614cbb565b6040529384526020818701810194908101925087851115614d76575f80fd5b6020870191505b84821015614d9d57614d8e82614642565b83529183019190830190614d7d565b979650505050505050565b5f805f805f8060c08789031215614dbd575f80fd5b86359550602087013567ffffffffffffffff80821115614ddb575f80fd5b614de78a838b01614ce8565b9650604089013595506060890135915080821115614e03575f80fd5b614e0f8a838b01614ce8565b94506080890135935060a0890135915080821115614e2b575f80fd5b50614e3889828a01614ce8565b915050929550929550929556fea164736f6c6343000818000a", } // RollupABI is the input ABI used to generate the binding from. @@ -1115,6 +1115,37 @@ func (_Rollup *RollupCallerSession) RevertReqIndex() (*big.Int, error) { return _Rollup.Contract.RevertReqIndex(&_Rollup.CallOpts) } +// RollupDelayPeriod is a free data retrieval call binding the contract method 0xd8dc99d2. +// +// Solidity: function rollupDelayPeriod() view returns(uint256) +func (_Rollup *RollupCaller) RollupDelayPeriod(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Rollup.contract.Call(opts, &out, "rollupDelayPeriod") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// RollupDelayPeriod is a free data retrieval call binding the contract method 0xd8dc99d2. +// +// Solidity: function rollupDelayPeriod() view returns(uint256) +func (_Rollup *RollupSession) RollupDelayPeriod() (*big.Int, error) { + return _Rollup.Contract.RollupDelayPeriod(&_Rollup.CallOpts) +} + +// RollupDelayPeriod is a free data retrieval call binding the contract method 0xd8dc99d2. +// +// Solidity: function rollupDelayPeriod() view returns(uint256) +func (_Rollup *RollupCallerSession) RollupDelayPeriod() (*big.Int, error) { + return _Rollup.Contract.RollupDelayPeriod(&_Rollup.CallOpts) +} + // Verifier is a free data retrieval call binding the contract method 0x2b7ac3f3. // // Solidity: function verifier() view returns(address) @@ -1282,6 +1313,27 @@ func (_Rollup *RollupTransactorSession) CommitBatch(batchDataInput IRollupBatchD return _Rollup.Contract.CommitBatch(&_Rollup.TransactOpts, batchDataInput, batchSignatureInput) } +// CommitBatchWithProof is a paid mutator transaction binding the contract method 0x4e8f1d67. +// +// Solidity: function commitBatchWithProof((uint8,bytes,uint64,uint16,bytes32,bytes32,bytes32) batchDataInput, (uint256,bytes,bytes) batchSignatureInput, bytes _batchHeader, bytes _batchProof) returns() +func (_Rollup *RollupTransactor) CommitBatchWithProof(opts *bind.TransactOpts, batchDataInput IRollupBatchDataInput, batchSignatureInput IRollupBatchSignatureInput, _batchHeader []byte, _batchProof []byte) (*types.Transaction, error) { + return _Rollup.contract.Transact(opts, "commitBatchWithProof", batchDataInput, batchSignatureInput, _batchHeader, _batchProof) +} + +// CommitBatchWithProof is a paid mutator transaction binding the contract method 0x4e8f1d67. +// +// Solidity: function commitBatchWithProof((uint8,bytes,uint64,uint16,bytes32,bytes32,bytes32) batchDataInput, (uint256,bytes,bytes) batchSignatureInput, bytes _batchHeader, bytes _batchProof) returns() +func (_Rollup *RollupSession) CommitBatchWithProof(batchDataInput IRollupBatchDataInput, batchSignatureInput IRollupBatchSignatureInput, _batchHeader []byte, _batchProof []byte) (*types.Transaction, error) { + return _Rollup.Contract.CommitBatchWithProof(&_Rollup.TransactOpts, batchDataInput, batchSignatureInput, _batchHeader, _batchProof) +} + +// CommitBatchWithProof is a paid mutator transaction binding the contract method 0x4e8f1d67. +// +// Solidity: function commitBatchWithProof((uint8,bytes,uint64,uint16,bytes32,bytes32,bytes32) batchDataInput, (uint256,bytes,bytes) batchSignatureInput, bytes _batchHeader, bytes _batchProof) returns() +func (_Rollup *RollupTransactorSession) CommitBatchWithProof(batchDataInput IRollupBatchDataInput, batchSignatureInput IRollupBatchSignatureInput, _batchHeader []byte, _batchProof []byte) (*types.Transaction, error) { + return _Rollup.Contract.CommitBatchWithProof(&_Rollup.TransactOpts, batchDataInput, batchSignatureInput, _batchHeader, _batchProof) +} + // FinalizeBatch is a paid mutator transaction binding the contract method 0x13361101. // // Solidity: function finalizeBatch(bytes _batchHeader) returns() @@ -1366,6 +1418,27 @@ func (_Rollup *RollupTransactorSession) Initialize2(_prevStateRoot [32]byte) (*t return _Rollup.Contract.Initialize2(&_Rollup.TransactOpts, _prevStateRoot) } +// Initialize3 is a paid mutator transaction binding the contract method 0xcf9a6745. +// +// Solidity: function initialize3(uint256 _rollupDelayPeriod) returns() +func (_Rollup *RollupTransactor) Initialize3(opts *bind.TransactOpts, _rollupDelayPeriod *big.Int) (*types.Transaction, error) { + return _Rollup.contract.Transact(opts, "initialize3", _rollupDelayPeriod) +} + +// Initialize3 is a paid mutator transaction binding the contract method 0xcf9a6745. +// +// Solidity: function initialize3(uint256 _rollupDelayPeriod) returns() +func (_Rollup *RollupSession) Initialize3(_rollupDelayPeriod *big.Int) (*types.Transaction, error) { + return _Rollup.Contract.Initialize3(&_Rollup.TransactOpts, _rollupDelayPeriod) +} + +// Initialize3 is a paid mutator transaction binding the contract method 0xcf9a6745. +// +// Solidity: function initialize3(uint256 _rollupDelayPeriod) returns() +func (_Rollup *RollupTransactorSession) Initialize3(_rollupDelayPeriod *big.Int) (*types.Transaction, error) { + return _Rollup.Contract.Initialize3(&_Rollup.TransactOpts, _rollupDelayPeriod) +} + // ProveState is a paid mutator transaction binding the contract method 0xb3484425. // // Solidity: function proveState(bytes _batchHeader, bytes _batchProof) returns() @@ -1555,6 +1628,27 @@ func (_Rollup *RollupTransactorSession) UpdateRewardPercentage(_newProofRewardPe return _Rollup.Contract.UpdateRewardPercentage(&_Rollup.TransactOpts, _newProofRewardPercent) } +// UpdateRollupDelayPeriod is a paid mutator transaction binding the contract method 0xc5553892. +// +// Solidity: function updateRollupDelayPeriod(uint256 _newPeriod) returns() +func (_Rollup *RollupTransactor) UpdateRollupDelayPeriod(opts *bind.TransactOpts, _newPeriod *big.Int) (*types.Transaction, error) { + return _Rollup.contract.Transact(opts, "updateRollupDelayPeriod", _newPeriod) +} + +// UpdateRollupDelayPeriod is a paid mutator transaction binding the contract method 0xc5553892. +// +// Solidity: function updateRollupDelayPeriod(uint256 _newPeriod) returns() +func (_Rollup *RollupSession) UpdateRollupDelayPeriod(_newPeriod *big.Int) (*types.Transaction, error) { + return _Rollup.Contract.UpdateRollupDelayPeriod(&_Rollup.TransactOpts, _newPeriod) +} + +// UpdateRollupDelayPeriod is a paid mutator transaction binding the contract method 0xc5553892. +// +// Solidity: function updateRollupDelayPeriod(uint256 _newPeriod) returns() +func (_Rollup *RollupTransactorSession) UpdateRollupDelayPeriod(_newPeriod *big.Int) (*types.Transaction, error) { + return _Rollup.Contract.UpdateRollupDelayPeriod(&_Rollup.TransactOpts, _newPeriod) +} + // UpdateVerifier is a paid mutator transaction binding the contract method 0x97fc007c. // // Solidity: function updateVerifier(address _newVerifier) returns() @@ -3759,6 +3853,141 @@ func (_Rollup *RollupFilterer) ParseUpdateProofWindow(log types.Log) (*RollupUpd return event, nil } +// RollupUpdateRollupDelayPeriodIterator is returned from FilterUpdateRollupDelayPeriod and is used to iterate over the raw logs and unpacked data for UpdateRollupDelayPeriod events raised by the Rollup contract. +type RollupUpdateRollupDelayPeriodIterator struct { + Event *RollupUpdateRollupDelayPeriod // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *RollupUpdateRollupDelayPeriodIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(RollupUpdateRollupDelayPeriod) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(RollupUpdateRollupDelayPeriod) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *RollupUpdateRollupDelayPeriodIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *RollupUpdateRollupDelayPeriodIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// RollupUpdateRollupDelayPeriod represents a UpdateRollupDelayPeriod event raised by the Rollup contract. +type RollupUpdateRollupDelayPeriod struct { + OldPeriod *big.Int + NewPeriod *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUpdateRollupDelayPeriod is a free log retrieval operation binding the contract event 0x624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad1. +// +// Solidity: event UpdateRollupDelayPeriod(uint256 oldPeriod, uint256 newPeriod) +func (_Rollup *RollupFilterer) FilterUpdateRollupDelayPeriod(opts *bind.FilterOpts) (*RollupUpdateRollupDelayPeriodIterator, error) { + + logs, sub, err := _Rollup.contract.FilterLogs(opts, "UpdateRollupDelayPeriod") + if err != nil { + return nil, err + } + return &RollupUpdateRollupDelayPeriodIterator{contract: _Rollup.contract, event: "UpdateRollupDelayPeriod", logs: logs, sub: sub}, nil +} + +// WatchUpdateRollupDelayPeriod is a free log subscription operation binding the contract event 0x624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad1. +// +// Solidity: event UpdateRollupDelayPeriod(uint256 oldPeriod, uint256 newPeriod) +func (_Rollup *RollupFilterer) WatchUpdateRollupDelayPeriod(opts *bind.WatchOpts, sink chan<- *RollupUpdateRollupDelayPeriod) (event.Subscription, error) { + + logs, sub, err := _Rollup.contract.WatchLogs(opts, "UpdateRollupDelayPeriod") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(RollupUpdateRollupDelayPeriod) + if err := _Rollup.contract.UnpackLog(event, "UpdateRollupDelayPeriod", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUpdateRollupDelayPeriod is a log parse operation binding the contract event 0x624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad1. +// +// Solidity: event UpdateRollupDelayPeriod(uint256 oldPeriod, uint256 newPeriod) +func (_Rollup *RollupFilterer) ParseUpdateRollupDelayPeriod(log types.Log) (*RollupUpdateRollupDelayPeriod, error) { + event := new(RollupUpdateRollupDelayPeriod) + if err := _Rollup.contract.UnpackLog(event, "UpdateRollupDelayPeriod", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // RollupUpdateVerifierIterator is returned from FilterUpdateVerifier and is used to iterate over the raw logs and unpacked data for UpdateVerifier events raised by the Rollup contract. type RollupUpdateVerifierIterator struct { Event *RollupUpdateVerifier // Event containing the contract specifics and raw log diff --git a/bindings/bindings/rollup_more.go b/bindings/bindings/rollup_more.go index 126e8accf..fc6e626f1 100644 --- a/bindings/bindings/rollup_more.go +++ b/bindings/bindings/rollup_more.go @@ -9,11 +9,11 @@ import ( "morph-l2/bindings/solc" ) -const RollupStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1029_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1028_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_paused\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_bool\"},{\"astId\":1006,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)1028_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"l1StakingContract\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_address\"},{\"astId\":1008,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"finalizationPeriodSeconds\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"proofWindow\",\"offset\":0,\"slot\":\"153\",\"type\":\"t_uint256\"},{\"astId\":1010,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__maxNumTxInChunk\",\"offset\":0,\"slot\":\"154\",\"type\":\"t_uint256\"},{\"astId\":1011,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"155\",\"type\":\"t_address\"},{\"astId\":1012,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"verifier\",\"offset\":0,\"slot\":\"156\",\"type\":\"t_address\"},{\"astId\":1013,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"lastFinalizedBatchIndex\",\"offset\":0,\"slot\":\"157\",\"type\":\"t_uint256\"},{\"astId\":1014,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"lastCommittedBatchIndex\",\"offset\":0,\"slot\":\"158\",\"type\":\"t_uint256\"},{\"astId\":1015,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"isChallenger\",\"offset\":0,\"slot\":\"159\",\"type\":\"t_mapping(t_address,t_bool)\"},{\"astId\":1016,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"finalizedStateRoots\",\"offset\":0,\"slot\":\"160\",\"type\":\"t_mapping(t_uint256,t_bytes32)\"},{\"astId\":1017,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"committedBatches\",\"offset\":0,\"slot\":\"161\",\"type\":\"t_mapping(t_uint256,t_bytes32)\"},{\"astId\":1018,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"batchDataStore\",\"offset\":0,\"slot\":\"162\",\"type\":\"t_mapping(t_uint256,t_struct(BatchData)1031_storage)\"},{\"astId\":1019,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"withdrawalRoots\",\"offset\":0,\"slot\":\"163\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1020,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"challenges\",\"offset\":0,\"slot\":\"164\",\"type\":\"t_mapping(t_uint256,t_struct(BatchChallenge)1030_storage)\"},{\"astId\":1021,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"batchChallengeReward\",\"offset\":0,\"slot\":\"165\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1022,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"inChallenge\",\"offset\":0,\"slot\":\"166\",\"type\":\"t_bool\"},{\"astId\":1023,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"batchChallenged\",\"offset\":0,\"slot\":\"167\",\"type\":\"t_uint256\"},{\"astId\":1024,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"revertReqIndex\",\"offset\":0,\"slot\":\"168\",\"type\":\"t_uint256\"},{\"astId\":1025,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"proofRewardPercent\",\"offset\":0,\"slot\":\"169\",\"type\":\"t_uint256\"},{\"astId\":1026,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"proveRemaining\",\"offset\":0,\"slot\":\"170\",\"type\":\"t_uint256\"},{\"astId\":1027,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"committedStateRoots\",\"offset\":0,\"slot\":\"171\",\"type\":\"t_mapping(t_uint256,t_bytes32)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)1028_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1029_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_bool\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_uint256,t_bytes32)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e bytes32)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_bytes32\"},\"t_mapping(t_uint256,t_struct(BatchChallenge)1030_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IRollup.BatchChallenge)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(BatchChallenge)1030_storage\"},\"t_mapping(t_uint256,t_struct(BatchData)1031_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IRollup.BatchData)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(BatchData)1031_storage\"},\"t_struct(BatchChallenge)1030_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IRollup.BatchChallenge\",\"numberOfBytes\":\"128\"},\"t_struct(BatchData)1031_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IRollup.BatchData\",\"numberOfBytes\":\"128\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" +const RollupStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1030_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1029_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_paused\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_bool\"},{\"astId\":1006,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)1029_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"l1StakingContract\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_address\"},{\"astId\":1008,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"finalizationPeriodSeconds\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"proofWindow\",\"offset\":0,\"slot\":\"153\",\"type\":\"t_uint256\"},{\"astId\":1010,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__maxNumTxInChunk\",\"offset\":0,\"slot\":\"154\",\"type\":\"t_uint256\"},{\"astId\":1011,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"155\",\"type\":\"t_address\"},{\"astId\":1012,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"verifier\",\"offset\":0,\"slot\":\"156\",\"type\":\"t_address\"},{\"astId\":1013,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"lastFinalizedBatchIndex\",\"offset\":0,\"slot\":\"157\",\"type\":\"t_uint256\"},{\"astId\":1014,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"lastCommittedBatchIndex\",\"offset\":0,\"slot\":\"158\",\"type\":\"t_uint256\"},{\"astId\":1015,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"isChallenger\",\"offset\":0,\"slot\":\"159\",\"type\":\"t_mapping(t_address,t_bool)\"},{\"astId\":1016,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"finalizedStateRoots\",\"offset\":0,\"slot\":\"160\",\"type\":\"t_mapping(t_uint256,t_bytes32)\"},{\"astId\":1017,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"committedBatches\",\"offset\":0,\"slot\":\"161\",\"type\":\"t_mapping(t_uint256,t_bytes32)\"},{\"astId\":1018,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"batchDataStore\",\"offset\":0,\"slot\":\"162\",\"type\":\"t_mapping(t_uint256,t_struct(BatchData)1032_storage)\"},{\"astId\":1019,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"withdrawalRoots\",\"offset\":0,\"slot\":\"163\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1020,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"challenges\",\"offset\":0,\"slot\":\"164\",\"type\":\"t_mapping(t_uint256,t_struct(BatchChallenge)1031_storage)\"},{\"astId\":1021,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"batchChallengeReward\",\"offset\":0,\"slot\":\"165\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1022,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"inChallenge\",\"offset\":0,\"slot\":\"166\",\"type\":\"t_bool\"},{\"astId\":1023,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"batchChallenged\",\"offset\":0,\"slot\":\"167\",\"type\":\"t_uint256\"},{\"astId\":1024,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"revertReqIndex\",\"offset\":0,\"slot\":\"168\",\"type\":\"t_uint256\"},{\"astId\":1025,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"proofRewardPercent\",\"offset\":0,\"slot\":\"169\",\"type\":\"t_uint256\"},{\"astId\":1026,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"proveRemaining\",\"offset\":0,\"slot\":\"170\",\"type\":\"t_uint256\"},{\"astId\":1027,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"committedStateRoots\",\"offset\":0,\"slot\":\"171\",\"type\":\"t_mapping(t_uint256,t_bytes32)\"},{\"astId\":1028,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"rollupDelayPeriod\",\"offset\":0,\"slot\":\"172\",\"type\":\"t_uint256\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)1029_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1030_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_bool\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_uint256,t_bytes32)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e bytes32)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_bytes32\"},\"t_mapping(t_uint256,t_struct(BatchChallenge)1031_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IRollup.BatchChallenge)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(BatchChallenge)1031_storage\"},\"t_mapping(t_uint256,t_struct(BatchData)1032_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IRollup.BatchData)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(BatchData)1032_storage\"},\"t_struct(BatchChallenge)1031_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IRollup.BatchChallenge\",\"numberOfBytes\":\"128\"},\"t_struct(BatchData)1032_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IRollup.BatchData\",\"numberOfBytes\":\"128\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var RollupStorageLayout = new(solc.StorageLayout) -var RollupDeployedBin = "0x608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd14610a0c578063f2fde38b14610a2b578063fb1e8b0414610a4a575f80fd5b8063ddd8a3dc146109ac578063de8b3035146109d8578063dff7827e146109f7575f80fd5b8063cd4edc69116100b7578063cd4edc6914610965578063ce5db8d614610978578063d279c1911461098d575f80fd5b8063b35dac4e14610908578063b3e0a50914610927578063bedb86fb14610946575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d146108a9578063b31a77d3146108d4578063b3484425146108e9575f80fd5b8063a415d8dc14610847578063a479265d14610875578063a4f209b01461088a575f80fd5b80638f1d37761161016c5780638f1d37761461072d578063910129d4146107f757806397fc007c14610828575f80fd5b8063728cdbca146106cb57806388b1ea09146106ea5780638da5cb5b14610703575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa1461066d5780636c578c1d14610698578063715018a6146106b7575f80fd5b80635ef7a94a146105a25780635f77cf1d14610602578063612672901461064e575f80fd5b8063428868b51161022c578063428868b51461055957806357e0af6c1461056c5780635c975abb1461058b575f80fd5b80632b7ac3f3146104c75780633b70c18a146105185780633e001b6614610544575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b366004614ba2565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b50610396610391366004614be1565b610a5f565b005b3480156103a3575f80fd5b506103966103b2366004614c3f565b610b83565b3480156103c2575f80fd5b5061033f6103d1366004614ba2565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b50610396610408366004614c87565b610f6f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c366004614ba2565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c366004614ba2565b61156e565b34801561047c575f80fd5b5061036961048b366004614ba2565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b6366004614ba2565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034b565b348015610523575f80fd5b50609b546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b34801561054f575f80fd5b5061036960aa5481565b610396610567366004614cc6565b61159c565b348015610577575f80fd5b50610396610586366004614ba2565b611f48565b348015610596575f80fd5b5060655460ff1661033f565b3480156105ad575f80fd5b506105e26105bc366004614ba2565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b34801561060d575f80fd5b506106357f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610659575f80fd5b50610396610668366004614ba2565b61200d565b348015610678575f80fd5b50610369610687366004614ba2565b60ab6020525f908152604090205481565b3480156106a3575f80fd5b506103966106b2366004614be1565b612270565b3480156106c2575f80fd5b5061039661237f565b3480156106d6575f80fd5b506103966106e5366004614d33565b612392565b3480156106f5575f80fd5b5060a65461033f9060ff1681565b34801561070e575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166104f3565b348015610738575f80fd5b506107a6610747366004614ba2565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff8316936801000000000000000090930473ffffffffffffffffffffffffffffffffffffffff16929060ff8082169161010090041686565b6040805167ffffffffffffffff909716875273ffffffffffffffffffffffffffffffffffffffff909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b348015610802575f80fd5b5061033f610811366004614ba2565b5f90815260a4602052604090206003015460ff1690565b348015610833575f80fd5b50610396610842366004614be1565b61275b565b348015610852575f80fd5b5061033f610861366004614be1565b609f6020525f908152604090205460ff1681565b348015610880575f80fd5b5061036960995481565b348015610895575f80fd5b506103966108a4366004614ba2565b61287f565b3480156108b4575f80fd5b506103696108c3366004614be1565b60a56020525f908152604090205481565b3480156108df575f80fd5b5061036960a85481565b3480156108f4575f80fd5b50610396610903366004614d8e565b612949565b348015610913575f80fd5b50610396610922366004614be1565b612d28565b348015610932575f80fd5b50610396610941366004614c87565b612d8e565b348015610951575f80fd5b50610396610960366004614e02565b61317a565b610396610973366004614e34565b61330d565b348015610983575f80fd5b5061036960985481565b348015610998575f80fd5b506103966109a7366004614be1565b613a22565b3480156109b7575f80fd5b506097546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b3480156109e3575f80fd5b5061033f6109f2366004614ba2565b613b08565b348015610a02575f80fd5b50610369609a5481565b348015610a17575f80fd5b50610396610a26366004614ba2565b613b5f565b348015610a36575f80fd5b50610396610a45366004614be1565b613c1c565b348015610a55575f80fd5b5061036960a95481565b610a67613cd0565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff1615610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610b8b613cd0565b5f8111610bf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610af2565b5f80610c008585613d51565b915091505f610c13836001015160c01c90565b5f81815260a160205260409020549091508214610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b5f60a181610c9a8785614e89565b81526020019081526020015f205414610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610af2565b609d548111610dc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610af2565b610dd0600182614e9c565b609e555b8315610f6757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610e1c81613b08565b15610ea2575f81815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a59092528220805491929091610e74908490614e89565b909155505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610f1f575060a85481145b15610f29575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610dd4575b505050505050565b60a85415610fd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b610fe1613e04565b5f80610fed8484613d51565b915091505f611000836001015160c01c90565b5f81815260a160205260409020549091508214611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b6110828161156e565b6110e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610af2565b6110f181613b08565b15611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610af2565b5f81815260a4602052604090206003015460ff16156111d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610af2565b5f81815260a2602052604090206001015442101561124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610af2565b605983015160a05f611260600185614e9c565b81526020019081526020015f2054146112d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610af2565b5f81815260a060205260409020541561134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610af2565b80609d54600101146113b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610af2565b609d819055600160a35f6113cd866099015190565b815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560798301515f82815260a0602052604090205561143a61142d846011015160c01c90565b600985015160c01c613e71565b60a25f611448600184614e9c565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab91906114819084614e9c565b81526020019081526020015f205f905560a45f6001836114a19190614e9c565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d61154a866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061159657505f82815260a1602052604090205415155b92915050565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611622573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116469190614eaf565b6116ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610af2565b60a85415611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b61171e613e04565b61172b6020830183614eca565b60ff16158061174957506117426020830183614eca565b60ff166001145b6117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610af2565b608082013561181a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610af2565b60a0820135611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610af2565b5f8061189c6118976020860186614eea565b613d51565b915091505f6118af836001015160c01c90565b90505f60a1816118c0846001614e89565b81526020019081526020015f205414611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610af2565b609e5481146119a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610af2565b5f81815260a160205260409020548214611a16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610af2565b5f81815260ab6020526040902054608086013514611a90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610af2565b5f611a9f846011015160c01c90565b90505f611acb611ab56060890160408a01614f4b565b611ac560808a0160608b01614f64565b84613f3b565b9050611add6080880160608901614f64565b6001939093019261ffff1691909101905f804915611afc575f49611b1e565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b905060f9611b2f60208a018a614eca565b60ff16600103611b3e57506101015b604080518281019091529650611b6387611b5b60208c018c614eca565b60ff16613f7f565b60c085901b6001880152611b9187611b8160808c0160608d01614f64565b61ffff1660c01b60099190910152565b60c084811b6011890152601988018490526039880183905260808a0135605989015260a08a013560798901528901356099880152611bf587611bd660208b018b614eea565b604051611be4929190614f85565b604051809103902060b99190910152565b60d987018690526001611c0b60208b018b614eca565b60ff1610611c3d57611c3d87611c2760608c0160408d01614f4b565b67ffffffffffffffff1660c01b60f99190910152565b8087205f86815260a1602090815260408083209390935560ab905290812060a08b0135905560a65460ff1615611c9c5760a7545f90815260a460205260409020600201546099544291611c8f91614e89565b611c999190614e9c565b90505b60405180608001604052804281526020018260985442611cbc9190614e89565b611cc69190614e89565b8152602001611cdb60608d0160408e01614f4b565b67ffffffffffffffff16815260975460209091019073ffffffffffffffffffffffffffffffffffffffff1663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611d73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d979190614f94565b90525f87815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e87905560975473ffffffffffffffffffffffffffffffffffffffff1692506374fe27b79150893590611e0c90611e06908c018c614eea565b5f613f86565b5f611e1a60408d018d614eea565b6040518663ffffffff1660e01b8152600401611e3a959493929190614ff2565b602060405180830381865afa158015611e55573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e799190614eaf565b611f05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610af2565b5f84815260a16020526040808220549051909186917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050565b611f50613cd0565b5f81118015611f6157506099548114155b611fc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610af2565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff1615801561202d57505f5460ff8083169116105b6120b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610af2565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556120f45f5460ff1690565b60ff16600214612160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610af2565b816121ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610af2565b609e545f90815260ab602052604090205461221657609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001612001565b612278613cd0565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff16612306576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610af2565b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610b78565b612387613cd0565b6123905f613fda565b565b5f54610100900460ff16158080156123b057505f54600160ff909116105b806123c95750303b1580156123c957505f5460ff166001145b612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610af2565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156124b1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff861615806124e8575073ffffffffffffffffffffffffffffffffffffffff8516155b1561251f576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff871661259c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610af2565b6125a4614050565b6125ac6140ee565b6097805473ffffffffffffffffffffffffffffffffffffffff808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015612752575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b612763613cd0565b73ffffffffffffffffffffffffffffffffffffffff8116158015906127a35750609c5473ffffffffffffffffffffffffffffffffffffffff828116911614155b612809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610af2565b609c805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b612887613cd0565b5f81118015612897575060648111155b80156128a5575060a9548114155b61290b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610af2565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101612001565b60a854156129b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b6129bb613e04565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015612a41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a659190614eaf565b612acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610af2565b5f80612ad78686613d51565b915091505f612aea836001015160c01c90565b5f81815260a160205260409020549091508214612b63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b612b6c81613b08565b612bd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610af2565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556099546002909101544291612c4991614e89565b11612cdd575f81815260a460209081526040808320600390810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560a2835292819020909201548251808401909352600783527f54696d656f75740000000000000000000000000000000000000000000000000091830191909152612cd89183919061418c565b612752565b612ce883868661430f565b61275281336040518060400160405280600d81526020017f50726f6f662073756363657373000000000000000000000000000000000000008152506144e9565b612d30613cd0565b60aa80545f909155612d4282826145cf565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101612001565b612d96613cd0565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea5415612e27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610af2565b5f80612e338484613d51565b915091505f612e46836001015160c01c90565b90508015612eb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610af2565b5f612ebc846079015190565b905080612f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610af2565b600984015160c01c15612f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610af2565b5f612fa0856019015190565b03613007576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610af2565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014613033856039015190565b1461309a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610af2565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b613182613cd0565b80156132db576131906146a1565b60a65460ff161561328d5760a7545f90815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a590925282208054919290916131f1908490614e89565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b6132e3614726565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336132b0565b50565b335f908152609f602052604090205460ff16613385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610af2565b60a854156133ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b6133f7613e04565b60a65460ff1615613464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610af2565b8167ffffffffffffffff16609d54106134d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a16020526040902054811461355a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b61356d8267ffffffffffffffff1661156e565b6135d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a4602052604090205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1615613675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a26020526040902060010154421061371f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610af2565b60975f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613789573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137ad9190614f94565b341015613816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610af2565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a49095529690962094518554925173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921792909217905573ffffffffffffffffffffffffffffffffffffffff168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b99763460405161398291815260200190565b60405180910390a35f609d54600161399a9190614e89565b90505b609e5481116139f2578267ffffffffffffffff1681146139e0576099545f82815260a26020526040812060010180549091906139da908490614e89565b90915550505b806139ea81615072565b91505061399d565b505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b335f90815260a5602052604081205490819003613a9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610af2565b335f90815260a56020526040812055613ab482826145cf565b8173ffffffffffffffffffffffffffffffffffffffff167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a82604051613afc91815260200190565b60405180910390a25050565b5f81815260a4602052604081205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16158015906115965750505f90815260a46020526040902060030154610100900460ff161590565b613b67613cd0565b5f81118015613b7857506098548114155b613bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610af2565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101612001565b613c24613cd0565b73ffffffffffffffffffffffffffffffffffffffff8116613cc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610af2565b61330a81613fda565b60335473ffffffffffffffffffffffffffffffffffffffff163314612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610af2565b5f805f613d5e858561477d565b90505f8160ff165f03613d7f57613d758686614807565b9094509050613df6565b8160ff16600103613d9457613d75868661488a565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f556e737570706f727465642062617463682076657273696f6e000000000000006044820152606401610af2565b808420925050509250929050565b60655460ff1615612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610af2565b805f03613e7c575050565b8082035f5b82811015613f3557610100818403811115613e9b57508083035b609b546040517f3c7f5283000000000000000000000000000000000000000000000000000000008152600481018590526024810183905273ffffffffffffffffffffffffffffffffffffffff90911690633c7f5283906044015f604051808303815f87803b158015613f0b575f80fd5b505af1158015613f1d573d5f803e3d5ffd5b50505050610100830192505061010081019050613e81565b50505050565b6040805160c085901b815260f084901b6008820152600a60208502820181019092525f918101613f708161ffff8716866148f7565b82900390912095945050505050565b8082535050565b60605f80808080613f99888a018a615196565b9550955095509550955050818710613fb7579450613fd39350505050565b838710613fcb578295505050505050613fd3565b509293505050505b9392505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166140e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b6123906149d7565b5f54610100900460ff16614184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b612390614a97565b60a88390555f83815260a460205260408082205460975491517f45bc4d10000000000000000000000000000000000000000000000000000000008152600481018690526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff908116939216906345bc4d10906024016020604051808303815f875af115801561421d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142419190614f94565b5f86815260a46020526040902060010154909150614260908290614e89565b5f86815260a4602090815260408083205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16835260a5909152812080549091906142ac908490614e89565b90915550506040516142bf908490615233565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff84169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80614376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610af2565b5f614385846001015160c01c90565b90505f614393856039015190565b90505f7f00000000000000000000000000000000000000000000000000000000000000006143c2876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c5490915073ffffffffffffffffffffffffffffffffffffffff16632c09a848614491885160f81c90565b858888866040518663ffffffff1660e01b81526004016144b595949392919061525f565b5f6040518083038186803b1580156144cb575f80fd5b505afa1580156144dd573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a95490919060649061450d9084615290565b61451791906152a7565b90506145238183614e9c565b60aa5f8282546145339190614e89565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f90815260a560205260408120805483929061456c908490614e89565b909155505060405161457f908490615233565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff86169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b801561469d575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f811461462b576040519150601f19603f3d011682016040523d82523d5f602084013e614630565b606091505b505090508061469b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610af2565b505b5050565b6146a9613e04565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586146fc3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b61472e614b36565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336146fc565b5f816147e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f456d7074792062617463682068656164657200000000000000000000000000006044820152606401610af2565b82825f8181106147f7576147f76152df565b919091013560f81c949350505050565b5f8160f9811015614874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610af2565b6040519150808483378082016040529250929050565b5f816101018114614874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f626174636820686561646572206c656e67746820697320696e636f72726563746044820152606401610af2565b5f825f03614906575082613fd3565b609b5473ffffffffffffffffffffffffffffffffffffffff165f5b848110156149cd576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f9073ffffffffffffffffffffffffffffffffffffffff84169063ae453cd590602401602060405180830381865afa158015614994573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149b89190614f94565b87525060209095019460019384019301614921565b5093949350505050565b5f54610100900460ff16614a6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff16614b2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b61239033613fda565b60655460ff16612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610af2565b5f60208284031215614bb2575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114614bdc575f80fd5b919050565b5f60208284031215614bf1575f80fd5b613fd382614bb9565b5f8083601f840112614c0a575f80fd5b50813567ffffffffffffffff811115614c21575f80fd5b602083019150836020828501011115614c38575f80fd5b9250929050565b5f805f60408486031215614c51575f80fd5b833567ffffffffffffffff811115614c67575f80fd5b614c7386828701614bfa565b909790965060209590950135949350505050565b5f8060208385031215614c98575f80fd5b823567ffffffffffffffff811115614cae575f80fd5b614cba85828601614bfa565b90969095509350505050565b5f8060408385031215614cd7575f80fd5b823567ffffffffffffffff80821115614cee575f80fd5b9084019060e08287031215614d01575f80fd5b90925060208401359080821115614d16575f80fd5b50830160608186031215614d28575f80fd5b809150509250929050565b5f805f805f8060c08789031215614d48575f80fd5b614d5187614bb9565b9550614d5f60208801614bb9565b9450614d6d60408801614bb9565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f8060408587031215614da1575f80fd5b843567ffffffffffffffff80821115614db8575f80fd5b614dc488838901614bfa565b90965094506020870135915080821115614ddc575f80fd5b50614de987828801614bfa565b95989497509550505050565b801515811461330a575f80fd5b5f60208284031215614e12575f80fd5b8135613fd381614df5565b803567ffffffffffffffff81168114614bdc575f80fd5b5f8060408385031215614e45575f80fd5b614e4e83614e1d565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561159657611596614e5c565b8181038181111561159657611596614e5c565b5f60208284031215614ebf575f80fd5b8151613fd381614df5565b5f60208284031215614eda575f80fd5b813560ff81168114613fd3575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614f1d575f80fd5b83018035915067ffffffffffffffff821115614f37575f80fd5b602001915036819003821315614c38575f80fd5b5f60208284031215614f5b575f80fd5b613fd382614e1d565b5f60208284031215614f74575f80fd5b813561ffff81168114613fd3575f80fd5b818382375f9101908152919050565b5f60208284031215614fa4575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b8181101561504957845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101615017565b50508760408601528481036060860152615064818789614fab565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150a2576150a2614e5c565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126150e5575f80fd5b8135602067ffffffffffffffff80831115615102576151026150a9565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715615145576151456150a9565b6040529384526020818701810194908101925087851115615164575f80fd5b6020870191505b8482101561518b5761517c82614bb9565b8352918301919083019061516b565b979650505050505050565b5f805f805f8060c087890312156151ab575f80fd5b86359550602087013567ffffffffffffffff808211156151c9575f80fd5b6151d58a838b016150d6565b96506040890135955060608901359150808211156151f1575f80fd5b6151fd8a838b016150d6565b94506080890135935060a0890135915080821115615219575f80fd5b5061522689828a016150d6565b9150509295509295509295565b5f82515f5b818110156152525760208186018101518583015201615238565b505f920191825250919050565b858152846020820152608060408201525f61527e608083018587614fab565b90508260608301529695505050505050565b808202811582820484141761159657611596614e5c565b5f826152da577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c6343000818000a" +var RollupDeployedBin = "0x608060405260043610610332575f3560e01c806388b1ea09116101a7578063bedb86fb116100e7578063d8dc99d211610092578063dff7827e1161006d578063dff7827e14610a95578063e3fff1dd14610aaa578063f2fde38b14610ac9578063fb1e8b0414610ae8575f80fd5b8063d8dc99d214610a35578063ddd8a3dc14610a4a578063de8b303514610a76575f80fd5b8063ce5db8d6116100c2578063ce5db8d6146109e2578063cf9a6745146109f7578063d279c19114610a16575f80fd5b8063bedb86fb14610991578063c5553892146109b0578063cd4edc69146109cf575f80fd5b8063a479265d11610152578063b31a77d31161012d578063b31a77d31461091f578063b348442514610934578063b35dac4e14610953578063b3e0a50914610972575f80fd5b8063a479265d146108c0578063a4f209b0146108d5578063abc8d68d146108f4575f80fd5b8063910129d411610182578063910129d41461084257806397fc007c14610873578063a415d8dc14610892575f80fd5b806388b1ea09146107355780638da5cb5b1461074e5780638f1d377614610778575f80fd5b80633b70c18a116102725780635ef7a94a1161021d57806368589dfa116101f857806368589dfa146106b85780636c578c1d146106e3578063715018a614610702578063728cdbca14610716575f80fd5b80635ef7a94a146105ed5780635f77cf1d1461064d5780636126729014610699575f80fd5b80634e8f1d671161024d5780634e8f1d671461059857806357e0af6c146105b75780635c975abb146105d6575f80fd5b80633b70c18a146105445780633e001b6614610570578063428868b514610585575f80fd5b806313361101116102dd57806321e2f9e0116102b857806321e2f9e01461047e5780632362f03e1461049d5780632571098d146104c85780632b7ac3f3146104f3575f80fd5b8063133611011461041a57806318463fb01461043957806318af3b2b1461044e575f80fd5b806310d445831161030d57806310d44583146103c4578063116a1f42146103e3578063121dcd5014610405575f80fd5b806304d772151461033d578063059def61146103805780630ceb6780146103a3575f80fd5b3661033957005b5f80fd5b348015610348575f80fd5b5061036b610357366004615372565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561038b575f80fd5b50610395609d5481565b604051908152602001610377565b3480156103ae575f80fd5b506103c26103bd3660046153b1565b610afd565b005b3480156103cf575f80fd5b506103c26103de36600461540f565b610c21565b3480156103ee575f80fd5b5061036b6103fd366004615372565b609d54101590565b348015610410575f80fd5b50610395609e5481565b348015610425575f80fd5b506103c2610434366004615457565b61100d565b348015610444575f80fd5b5061039560a75481565b348015610459575f80fd5b5061036b610468366004615372565b5f90815260a26020526040902060010154421090565b348015610489575f80fd5b5061036b610498366004615372565b61160c565b3480156104a8575f80fd5b506103956104b7366004615372565b60a16020525f908152604090205481565b3480156104d3575f80fd5b506103956104e2366004615372565b60a06020525f908152604090205481565b3480156104fe575f80fd5b50609c5461051f9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610377565b34801561054f575f80fd5b50609b5461051f9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561057b575f80fd5b5061039560aa5481565b6103c26105933660046154bc565b61163a565b3480156105a3575f80fd5b506103c26105b236600461551c565b6118eb565b3480156105c2575f80fd5b506103c26105d1366004615372565b611c55565b3480156105e1575f80fd5b5060655460ff1661036b565b3480156105f8575f80fd5b5061062d610607366004615372565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610377565b348015610658575f80fd5b506106807f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610377565b3480156106a4575f80fd5b506103c26106b3366004615372565b611d1a565b3480156106c3575f80fd5b506103956106d2366004615372565b60ab6020525f908152604090205481565b3480156106ee575f80fd5b506103c26106fd3660046153b1565b611f7d565b34801561070d575f80fd5b506103c261208c565b348015610721575f80fd5b506103c26107303660046155cd565b61209f565b348015610740575f80fd5b5060a65461036b9060ff1681565b348015610759575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff1661051f565b348015610783575f80fd5b506107f1610792366004615372565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff8316936801000000000000000090930473ffffffffffffffffffffffffffffffffffffffff16929060ff8082169161010090041686565b6040805167ffffffffffffffff909716875273ffffffffffffffffffffffffffffffffffffffff909516602087015293850192909252606084015215156080830152151560a082015260c001610377565b34801561084d575f80fd5b5061036b61085c366004615372565b5f90815260a4602052604090206003015460ff1690565b34801561087e575f80fd5b506103c261088d3660046153b1565b612468565b34801561089d575f80fd5b5061036b6108ac3660046153b1565b609f6020525f908152604090205460ff1681565b3480156108cb575f80fd5b5061039560995481565b3480156108e0575f80fd5b506103c26108ef366004615372565b61258c565b3480156108ff575f80fd5b5061039561090e3660046153b1565b60a56020525f908152604090205481565b34801561092a575f80fd5b5061039560a85481565b34801561093f575f80fd5b506103c261094e366004615628565b612656565b34801561095e575f80fd5b506103c261096d3660046153b1565b612a35565b34801561097d575f80fd5b506103c261098c366004615457565b612a9b565b34801561099c575f80fd5b506103c26109ab36600461569c565b612e87565b3480156109bb575f80fd5b506103c26109ca366004615372565b61301a565b6103c26109dd3660046156ce565b6130d7565b3480156109ed575f80fd5b5061039560985481565b348015610a02575f80fd5b506103c2610a11366004615372565b6137ec565b348015610a21575f80fd5b506103c2610a303660046153b1565b6139c9565b348015610a40575f80fd5b5061039560ac5481565b348015610a55575f80fd5b5060975461051f9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a81575f80fd5b5061036b610a90366004615372565b613aaf565b348015610aa0575f80fd5b50610395609a5481565b348015610ab5575f80fd5b506103c2610ac4366004615372565b613b06565b348015610ad4575f80fd5b506103c2610ae33660046153b1565b613bc3565b348015610af3575f80fd5b5061039560a95481565b610b05613c77565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff1615610b99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610c29613c77565b5f8111610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610b90565b5f80610c9e8585613cf8565b915091505f610cb1836001015160c01c90565b5f81815260a160205260409020549091508214610d2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b90565b5f60a181610d388785615723565b81526020019081526020015f205414610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610b90565b609d548111610e63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610b90565b610e6e600182615736565b609e555b831561100557604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610eba81613aaf565b15610f40575f81815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a59092528220805491929091610f12908490615723565b909155505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610fbd575060a85481145b15610fc7575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610e72575b505050505050565b60a85415611077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b90565b61107f613dab565b5f8061108b8484613cf8565b915091505f61109e836001015160c01c90565b5f81815260a160205260409020549091508214611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b90565b6111208161160c565b611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610b90565b61118f81613aaf565b156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610b90565b5f81815260a4602052604090206003015460ff1615611271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610b90565b5f81815260a260205260409020600101544210156112eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610b90565b605983015160a05f6112fe600185615736565b81526020019081526020015f205414611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610b90565b5f81815260a06020526040902054156113e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610b90565b80609d5460010114611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610b90565b609d819055600160a35f61146b866099015190565b815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560798301515f82815260a060205260409020556114d86114cb846011015160c01c90565b600985015160c01c613e18565b60a25f6114e6600184615736565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab919061151f9084615736565b81526020019081526020015f205f905560a45f60018361153f9190615736565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d6115e8866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061163457505f82815260a1602052604090205415155b92915050565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156116c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e49190615749565b61174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610b90565b60a854156117b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b90565b6117bc613dab565b60ac54609b54604080517fb59b1a78000000000000000000000000000000000000000000000000000000008152905142939273ffffffffffffffffffffffffffffffffffffffff169163b59b1a789160048083019260209291908290030181865afa15801561182d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118519190615764565b61185b9190615723565b10156118dd575f611872608084016060850161577b565b61ffff16116118dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6c316d73672064656c61790000000000000000000000000000000000000000006044820152606401610b90565b6118e78282613ee2565b5050565b60a85415611955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b90565b61195d613dab565b60ac54609e545f90815260a260205260408120549091429161197f9190615723565b1090505f4260ac54609b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b59b1a786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a159190615764565b611a1f9190615723565b10905081158015611a2d5750805b15611aae575f611a4360808a0160608b0161577b565b61ffff1611611aae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6c316d73672064656c61790000000000000000000000000000000000000000006044820152606401610b90565b8180611ab75750805b611b1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c69642074696d696e670000000000000000000000000000000000006044820152606401610b90565b611b278888613ee2565b5f80611b338888613cf8565b915091505f611b46836001015160c01c90565b905080609e5414611bb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e636f727265637420626174636820686561646572000000000000000000006044820152606401610b90565b5f81815260a160205260409020548214611c29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b90565b5f81815260a26020526040902042600190910155611c4883888861470c565b5050505050505050505050565b611c5d613c77565b5f81118015611c6e57506099548114155b611cd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610b90565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff16158015611d3a57505f5460ff8083169116105b611dc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b90565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611e015f5460ff1690565b60ff16600214611e6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610b90565b81611efa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610b90565b609e545f90815260ab6020526040902054611f2357609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611d0e565b611f85613c77565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff16612013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610b90565b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610c16565b612094613c77565b61209d5f6148e6565b565b5f54610100900460ff16158080156120bd57505f54600160ff909116105b806120d65750303b1580156120d657505f5460ff166001145b612162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b90565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156121be575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff861615806121f5575073ffffffffffffffffffffffffffffffffffffffff8516155b1561222c576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166122a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610b90565b6122b161495c565b6122b96149fa565b6097805473ffffffffffffffffffffffffffffffffffffffff808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a1801561245f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b612470613c77565b73ffffffffffffffffffffffffffffffffffffffff8116158015906124b05750609c5473ffffffffffffffffffffffffffffffffffffffff828116911614155b612516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610b90565b609c805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b612594613c77565b5f811180156125a4575060648111155b80156125b2575060a9548114155b612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610b90565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611d0e565b60a854156126c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b90565b6126c8613dab565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa15801561274e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127729190615749565b6127d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610b90565b5f806127e48686613cf8565b915091505f6127f7836001015160c01c90565b5f81815260a160205260409020549091508214612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b90565b61287981613aaf565b6128df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610b90565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055609954600290910154429161295691615723565b116129ea575f81815260a460209081526040808320600390810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560a2835292819020909201548251808401909352600783527f54696d656f757400000000000000000000000000000000000000000000000000918301919091526129e591839190614a98565b61245f565b6129f583868661470c565b61245f81336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250614c1b565b612a3d613c77565b60aa80545f909155612a4f8282614d01565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611d0e565b612aa3613c77565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea5415612b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610b90565b5f80612b408484613cf8565b915091505f612b53836001015160c01c90565b90508015612bbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610b90565b5f612bc9846079015190565b905080612c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610b90565b600984015160c01c15612ca1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610b90565b5f612cad856019015190565b03612d14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610b90565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014612d40856039015190565b14612da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610b90565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b612e8f613c77565b8015612fe857612e9d614dd2565b60a65460ff1615612f9a5760a7545f90815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a59092528220805491929091612efe908490615723565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b612ff0614e57565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612fbd565b50565b613022613c77565b5f81118015613033575060ac548114155b613099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c6964206e657720726f6c6c75702064656c617920706572696f64006044820152606401610b90565b60ac80549082905560408051828152602081018490527f624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad19101611d0e565b335f908152609f602052604090205460ff1661314f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610b90565b60a854156131b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b90565b6131c1613dab565b60a65460ff161561322e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610b90565b8167ffffffffffffffff16609d54106132a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610b90565b67ffffffffffffffff82165f90815260a160205260409020548114613324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b90565b6133378267ffffffffffffffff1661160c565b61339d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610b90565b67ffffffffffffffff82165f90815260a4602052604090205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff161561343f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610b90565b67ffffffffffffffff82165f90815260a2602052604090206001015442106134e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610b90565b60975f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613553573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135779190615764565b3410156135e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610b90565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a49095529690962094518554925173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921792909217905573ffffffffffffffffffffffffffffffffffffffff168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b99763460405161374c91815260200190565b60405180910390a35f609d5460016137649190615723565b90505b609e5481116137bc578267ffffffffffffffff1681146137aa576099545f82815260a26020526040812060010180549091906137a4908490615723565b90915550505b806137b48161579c565b915050613767565b505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b5f54600390610100900460ff1615801561380c57505f5460ff8083169116105b613898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b90565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100178155829003613931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c696420726f6c6c75702064656c617920706572696f6400000000006044820152606401610b90565b60ac829055604080515f8152602081018490527f624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad1910160405180910390a15f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611d0e565b335f90815260a5602052604081205490819003613a42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610b90565b335f90815260a56020526040812055613a5b8282614d01565b8173ffffffffffffffffffffffffffffffffffffffff167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a82604051613aa391815260200190565b60405180910390a25050565b5f81815260a4602052604081205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16158015906116345750505f90815260a46020526040902060030154610100900460ff161590565b613b0e613c77565b5f81118015613b1f57506098548114155b613b85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610b90565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611d0e565b613bcb613c77565b73ffffffffffffffffffffffffffffffffffffffff8116613c6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b90565b613017816148e6565b60335473ffffffffffffffffffffffffffffffffffffffff16331461209d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b90565b5f805f613d058585614eae565b90505f8160ff165f03613d2657613d1c8686614f38565b9094509050613d9d565b8160ff16600103613d3b57613d1c8686614fbb565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f556e737570706f727465642062617463682076657273696f6e000000000000006044820152606401610b90565b808420925050509250929050565b60655460ff161561209d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b90565b805f03613e23575050565b8082035f5b82811015613edc57610100818403811115613e4257508083035b609b546040517f3c7f5283000000000000000000000000000000000000000000000000000000008152600481018590526024810183905273ffffffffffffffffffffffffffffffffffffffff90911690633c7f5283906044015f604051808303815f87803b158015613eb2575f80fd5b505af1158015613ec4573d5f803e3d5ffd5b50505050610100830192505061010081019050613e28565b50505050565b613eef60208301836157d3565b60ff161580613f0d5750613f0660208301836157d3565b60ff166001145b613f73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610b90565b6080820135613fde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610b90565b60a0820135614049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610b90565b5f8061406061405b60208601866157f3565b613cf8565b915091505f614073836001015160c01c90565b90505f60a181614084846001615723565b81526020019081526020015f2054146140f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610b90565b609e548114614164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610b90565b5f81815260a1602052604090205482146141da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610b90565b5f81815260ab6020526040902054608086013514614254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610b90565b5f614263846011015160c01c90565b90505f61428f6142796060890160408a01615854565b61428960808a0160608b0161577b565b84615028565b90506142a1608088016060890161577b565b6001939093019261ffff1691909101905f8049156142c0575f496142e2565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b905060f96142f360208a018a6157d3565b60ff1660010361430257506101015b6040805182810190915296506143278761431f60208c018c6157d3565b60ff1661506c565b60c085901b60018801526143558761434560808c0160608d0161577b565b61ffff1660c01b60099190910152565b60c084811b6011890152601988018490526039880183905260808a0135605989015260a08a0135607989015289013560998801526143b98761439a60208b018b6157f3565b6040516143a892919061586d565b604051809103902060b99190910152565b60d9870186905260016143cf60208b018b6157d3565b60ff161061440157614401876143eb60608c0160408d01615854565b67ffffffffffffffff1660c01b60f99190910152565b8087205f86815260a1602090815260408083209390935560ab905290812060a08b0135905560a65460ff16156144605760a7545f90815260a46020526040902060020154609954429161445391615723565b61445d9190615736565b90505b604051806080016040528042815260200182609854426144809190615723565b61448a9190615723565b815260200161449f60608d0160408e01615854565b67ffffffffffffffff16815260975460209091019073ffffffffffffffffffffffffffffffffffffffff1663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015614537573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061455b9190615764565b90525f87815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e87905560975473ffffffffffffffffffffffffffffffffffffffff1692506374fe27b791508935906145d0906145ca908c018c6157f3565b5f615073565b5f6145de60408d018d6157f3565b6040518663ffffffff1660e01b81526004016145fe9594939291906158c3565b602060405180830381865afa158015614619573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061463d9190615749565b6146c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610b90565b5f84815260a16020526040808220549051909186917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050565b80614773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610b90565b5f614782846001015160c01c90565b90505f614790856039015190565b90505f7f00000000000000000000000000000000000000000000000000000000000000006147bf876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c5490915073ffffffffffffffffffffffffffffffffffffffff16632c09a84861488e885160f81c90565b858888866040518663ffffffff1660e01b81526004016148b2959493929190615943565b5f6040518083038186803b1580156148c8575f80fd5b505afa1580156148da573d5f803e3d5ffd5b50505050505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166149f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b90565b61209d6150c7565b5f54610100900460ff16614a90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b90565b61209d615187565b60a88390555f83815260a460205260408082205460975491517f45bc4d10000000000000000000000000000000000000000000000000000000008152600481018690526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff908116939216906345bc4d10906024016020604051808303815f875af1158015614b29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b4d9190615764565b5f86815260a46020526040902060010154909150614b6c908290615723565b5f86815260a4602090815260408083205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16835260a590915281208054909190614bb8908490615723565b9091555050604051614bcb908490615974565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff84169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b5f83815260a4602052604081206001015460a954909190606490614c3f90846159a0565b614c4991906159b7565b9050614c558183615736565b60aa5f828254614c659190615723565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f90815260a5602052604081208054839290614c9e908490615723565b9091555050604051614cb1908490615974565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff86169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80156118e7575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114614d5d576040519150601f19603f3d011682016040523d82523d5f602084013e614d62565b606091505b5050905080614dcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610b90565b505050565b614dda613dab565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258614e2d3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b614e5f615226565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33614e2d565b5f81614f16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f456d7074792062617463682068656164657200000000000000000000000000006044820152606401610b90565b82825f818110614f2857614f286159ef565b919091013560f81c949350505050565b5f8160f9811015614fa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610b90565b6040519150808483378082016040529250929050565b5f816101018114614fa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f626174636820686561646572206c656e67746820697320696e636f72726563746044820152606401610b90565b6040805160c085901b815260f084901b6008820152600a60208502820181019092525f91810161505d8161ffff871686615292565b82900390912095945050505050565b8082535050565b60605f80808080615086888a018a615b09565b95509550955095509550508187106150a45794506150c09350505050565b8387106150b85782955050505050506150c0565b509293505050505b9392505050565b5f54610100900460ff1661515d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b90565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff1661521d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b90565b61209d336148e6565b60655460ff1661209d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610b90565b5f825f036152a15750826150c0565b609b5473ffffffffffffffffffffffffffffffffffffffff165f5b84811015615368576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f9073ffffffffffffffffffffffffffffffffffffffff84169063ae453cd590602401602060405180830381865afa15801561532f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906153539190615764565b875250602090950194600193840193016152bc565b5093949350505050565b5f60208284031215615382575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146153ac575f80fd5b919050565b5f602082840312156153c1575f80fd5b6150c082615389565b5f8083601f8401126153da575f80fd5b50813567ffffffffffffffff8111156153f1575f80fd5b602083019150836020828501011115615408575f80fd5b9250929050565b5f805f60408486031215615421575f80fd5b833567ffffffffffffffff811115615437575f80fd5b615443868287016153ca565b909790965060209590950135949350505050565b5f8060208385031215615468575f80fd5b823567ffffffffffffffff81111561547e575f80fd5b61548a858286016153ca565b90969095509350505050565b5f60e082840312156154a6575f80fd5b50919050565b5f606082840312156154a6575f80fd5b5f80604083850312156154cd575f80fd5b823567ffffffffffffffff808211156154e4575f80fd5b6154f086838701615496565b93506020850135915080821115615505575f80fd5b50615512858286016154ac565b9150509250929050565b5f805f805f8060808789031215615531575f80fd5b863567ffffffffffffffff80821115615548575f80fd5b6155548a838b01615496565b97506020890135915080821115615569575f80fd5b6155758a838b016154ac565b9650604089013591508082111561558a575f80fd5b6155968a838b016153ca565b909650945060608901359150808211156155ae575f80fd5b506155bb89828a016153ca565b979a9699509497509295939492505050565b5f805f805f8060c087890312156155e2575f80fd5b6155eb87615389565b95506155f960208801615389565b945061560760408801615389565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f806040858703121561563b575f80fd5b843567ffffffffffffffff80821115615652575f80fd5b61565e888389016153ca565b90965094506020870135915080821115615676575f80fd5b50615683878288016153ca565b95989497509550505050565b8015158114613017575f80fd5b5f602082840312156156ac575f80fd5b81356150c08161568f565b803567ffffffffffffffff811681146153ac575f80fd5b5f80604083850312156156df575f80fd5b6156e8836156b7565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611634576116346156f6565b81810381811115611634576116346156f6565b5f60208284031215615759575f80fd5b81516150c08161568f565b5f60208284031215615774575f80fd5b5051919050565b5f6020828403121561578b575f80fd5b813561ffff811681146150c0575f80fd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157cc576157cc6156f6565b5060010190565b5f602082840312156157e3575f80fd5b813560ff811681146150c0575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615826575f80fd5b83018035915067ffffffffffffffff821115615840575f80fd5b602001915036819003821315615408575f80fd5b5f60208284031215615864575f80fd5b6150c0826156b7565b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b8181101561591a57845173ffffffffffffffffffffffffffffffffffffffff16835293830193918301916001016158e8565b5050876040860152848103606086015261593581878961587c565b9a9950505050505050505050565b858152846020820152608060408201525f61596260808301858761587c565b90508260608301529695505050505050565b5f82515f5b818110156159935760208186018101518583015201615979565b505f920191825250919050565b8082028115828204841417611634576116346156f6565b5f826159ea577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112615a58575f80fd5b8135602067ffffffffffffffff80831115615a7557615a75615a1c565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715615ab857615ab8615a1c565b6040529384526020818701810194908101925087851115615ad7575f80fd5b6020870191505b84821015615afe57615aef82615389565b83529183019190830190615ade565b979650505050505050565b5f805f805f8060c08789031215615b1e575f80fd5b86359550602087013567ffffffffffffffff80821115615b3c575f80fd5b615b488a838b01615a49565b9650604089013595506060890135915080821115615b64575f80fd5b615b708a838b01615a49565b94506080890135935060a0890135915080821115615b8c575f80fd5b50615b9989828a01615a49565b915050929550929550929556fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(RollupStorageLayoutJSON), RollupStorageLayout); err != nil { diff --git a/bindings/go.mod b/bindings/go.mod index cb76dba78..e5d397882 100644 --- a/bindings/go.mod +++ b/bindings/go.mod @@ -2,7 +2,7 @@ module morph-l2/bindings go 1.24.0 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.3 require github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 diff --git a/contracts/contracts/l1/L1Sequencer.sol b/contracts/contracts/l1/L1Sequencer.sol new file mode 100644 index 000000000..3a46768bd --- /dev/null +++ b/contracts/contracts/l1/L1Sequencer.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: MIT +pragma solidity =0.8.24; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +/// @title L1Sequencer +/// @notice L1 contract for managing the sequencer address. +/// The sequencer address can be updated by the owner (multisig recommended). +contract L1Sequencer is OwnableUpgradeable { + // ============ Storage ============ + + /// @notice Current sequencer address + address public sequencer; + + // ============ Events ============ + + /// @notice Emitted when sequencer is updated + event SequencerUpdated(address indexed oldSequencer, address indexed newSequencer); + + // ============ Initializer ============ + + /// @notice Initialize the contract + /// @param _owner Contract owner (multisig recommended) + /// @param _initialSequencer Initial sequencer address (can be address(0) to set later) + function initialize(address _owner, address _initialSequencer) external initializer { + require(_owner != address(0), "invalid owner"); + + __Ownable_init(); + _transferOwnership(_owner); + + // Set initial sequencer if provided + if (_initialSequencer != address(0)) { + sequencer = _initialSequencer; + emit SequencerUpdated(address(0), _initialSequencer); + } + } + + // ============ Admin Functions ============ + + /// @notice Update sequencer address (takes effect immediately) + /// @param newSequencer New sequencer address + function updateSequencer(address newSequencer) external onlyOwner { + require(newSequencer != address(0), "invalid sequencer"); + require(newSequencer != sequencer, "same sequencer"); + + address oldSequencer = sequencer; + sequencer = newSequencer; + + emit SequencerUpdated(oldSequencer, newSequencer); + } + + // ============ View Functions ============ + + /// @notice Get current sequencer address + function getSequencer() external view returns (address) { + return sequencer; + } +} diff --git a/contracts/contracts/l1/rollup/IL1MessageQueue.sol b/contracts/contracts/l1/rollup/IL1MessageQueue.sol index 3a61d3832..e06a4df30 100644 --- a/contracts/contracts/l1/rollup/IL1MessageQueue.sol +++ b/contracts/contracts/l1/rollup/IL1MessageQueue.sol @@ -57,6 +57,11 @@ interface IL1MessageQueue { /// @notice The start index of all pending inclusion messages. function pendingQueueIndex() external view returns (uint256); + /// @notice Return the enqueue timestamp of the first unfinalized message. + /// @dev Used for checking if L1 messages are being processed within acceptable time. + /// @return timestamp The block.timestamp when the first unfinalized message was enqueued. + function getFirstUnfinalizedMessageEnqueueTime() external view returns (uint256 timestamp); + /// @notice Return the index of next appended message. /// @dev Also the total number of appended messages. function nextCrossDomainMessageIndex() external view returns (uint256); diff --git a/contracts/contracts/l1/rollup/IRollup.sol b/contracts/contracts/l1/rollup/IRollup.sol index caa0d300c..02150042e 100644 --- a/contracts/contracts/l1/rollup/IRollup.sol +++ b/contracts/contracts/l1/rollup/IRollup.sol @@ -118,6 +118,11 @@ interface IRollup { /// @param newPercent The new proofRewardPercent. event UpdateProofRewardPercent(uint256 oldPercent, uint256 newPercent); + /// @notice Emitted when the rollup delay period is updated. + /// @param oldPeriod The old rollupDelayPeriod. + /// @param newPeriod The new rollupDelayPeriod. + event UpdateRollupDelayPeriod(uint256 oldPeriod, uint256 newPeriod); + /// @notice Emit when prove remaining claimed. /// @param receiver receiver address. /// @param amount claimed amount. @@ -182,6 +187,20 @@ interface IRollup { BatchSignatureInput calldata batchSignatureInput ) external payable; + /// @notice Commit a batch with ZKP proof for permissionless submission. + /// @dev This function allows anyone to submit batches when the sequencer is offline or censoring. + /// + /// @param batchDataInput The BatchDataInput struct + /// @param batchSignatureInput The BatchSignatureInput struct + /// @param batchHeader The batch header for ZKP verification + /// @param batchProof The ZKP proof data + function commitBatchWithProof( + BatchDataInput calldata batchDataInput, + BatchSignatureInput calldata batchSignatureInput, + bytes calldata batchHeader, + bytes calldata batchProof + ) external; + /// @notice Revert a pending batch. /// @dev one can only revert unfinalized batches. /// @param batchHeader The header of current batch, see the encoding in comments of `commitBatch`. diff --git a/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol b/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol index 3d86a753c..c345d4a32 100644 --- a/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol +++ b/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol @@ -57,6 +57,8 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue /// @inheritdoc IL1MessageQueueWithGasPriceOracle address public whitelistChecker; + mapping(uint256 => uint256) public messageEnqueueTime; + /********************** * Function Modifiers * **********************/ @@ -149,11 +151,7 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue len := 1 leave } - for { - - } gt(v, 0) { - - } { + for {} gt(v, 0) {} { len := add(len, 1) v := shr(8, v) } @@ -260,6 +258,19 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue return hash; } + function getFirstUnfinalizedMessageEnqueueTime() external view returns (uint256 timestamp) { + if (pendingQueueIndex < messageQueue.length && messageEnqueueTime[pendingQueueIndex] != 0) { + // has pending messages and return enqueue time + return messageEnqueueTime[pendingQueueIndex]; + } + // no pending messages, return current timestamp + return block.timestamp; + } + + function getMessageEnqueueTimestamp(uint256 index) external view returns (uint256 timestamp) { + return messageEnqueueTime[index]; + } + /***************************** * Public Mutating Functions * *****************************/ @@ -363,6 +374,7 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue uint256 _queueIndex = messageQueue.length; bytes32 _hash = computeTransactionHash(_sender, _queueIndex, _value, _target, _gasLimit, _data); messageQueue.push(_hash); + messageEnqueueTime[_queueIndex] = block.timestamp; // emit event emit QueueTransaction(_sender, _target, _value, uint64(_queueIndex), _gasLimit, _data); diff --git a/contracts/contracts/l1/rollup/Rollup.sol b/contracts/contracts/l1/rollup/Rollup.sol index c44303dcc..2148bb60e 100644 --- a/contracts/contracts/l1/rollup/Rollup.sol +++ b/contracts/contracts/l1/rollup/Rollup.sol @@ -100,6 +100,10 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { /// @notice committedStateRoots mapping(uint256 batchIndex => bytes32 stateRoot) public committedStateRoots; + /// @notice The delay period for permissionless batch submission. + /// @dev After this period, anyone can submit batches if sequencers are offline or censoring. + uint256 public rollupDelayPeriod; + /********************** * Function Modifiers * **********************/ @@ -183,6 +187,14 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { } } + /// @notice Initializer for upgrade to version 3. + /// @param _rollupDelayPeriod The delay period for permissionless batch submission. + function initialize3(uint256 _rollupDelayPeriod) external reinitializer(3) { + require(_rollupDelayPeriod != 0, "invalid rollup delay period"); + rollupDelayPeriod = _rollupDelayPeriod; + emit UpdateRollupDelayPeriod(0, _rollupDelayPeriod); + } + /************************ * Restricted Functions * ************************/ @@ -220,6 +232,19 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { BatchDataInput calldata batchDataInput, BatchSignatureInput calldata batchSignatureInput ) external payable override onlyActiveStaker nonReqRevert whenNotPaused { + // check l1msg delay - sequencer must process L1 messages when delayed + if ( + IL1MessageQueue(messageQueue).getFirstUnfinalizedMessageEnqueueTime() + rollupDelayPeriod < block.timestamp + ) { + require(batchDataInput.numL1Messages > 0, "l1msg delay"); + } + _commitBatchWithBatchData(batchDataInput, batchSignatureInput); + } + + function _commitBatchWithBatchData( + BatchDataInput calldata batchDataInput, + BatchSignatureInput calldata batchSignatureInput + ) internal { require(batchDataInput.version == 0 || batchDataInput.version == 1, "invalid version"); require(batchDataInput.prevStateRoot != bytes32(0), "previous state root is zero"); require(batchDataInput.postStateRoot != bytes32(0), "new state root is zero"); @@ -259,7 +284,7 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { } bytes32 _blobVersionedHash = (blobhash(0) == bytes32(0)) ? ZERO_VERSIONED_HASH : blobhash(0); - { + { uint256 _headerLength = BatchHeaderCodecV0.BATCH_HEADER_LENGTH; if (batchDataInput.version == 1) { _headerLength = BatchHeaderCodecV1.BATCH_HEADER_LENGTH; @@ -318,6 +343,46 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { emit CommitBatch(_batchIndex, committedBatches[_batchIndex]); } + /// @inheritdoc IRollup + /// @dev Allows permissionless batch submission when sequencers are offline or censoring. + /// Entry conditions: rollup delay OR L1 message queue delay must be met. + function commitBatchWithProof( + BatchDataInput calldata batchDataInput, + BatchSignatureInput calldata batchSignatureInput, + bytes calldata _batchHeader, + bytes calldata _batchProof + ) external override nonReqRevert whenNotPaused { + // check delay timing - allow if EITHER batch submission OR L1 message processing is stalled + // This enables permissionless batch submission when sequencers are offline or censoring + bool rollupDelay = batchDataStore[lastCommittedBatchIndex].originTimestamp + rollupDelayPeriod < + block.timestamp; + + // Check if L1 message queue is delayed + bool l1MsgQueueDelayed = IL1MessageQueue(messageQueue).getFirstUnfinalizedMessageEnqueueTime() + + rollupDelayPeriod < + block.timestamp; + + if (!rollupDelay && l1MsgQueueDelayed) { + require(batchDataInput.numL1Messages > 0, "l1msg delay"); + } + require(rollupDelay || l1MsgQueueDelayed, "invalid timing"); + + _commitBatchWithBatchData(batchDataInput, batchSignatureInput); + + // get batch data from batch header + (uint256 memPtr, bytes32 _batchHash) = _loadBatchHeader(_batchHeader); + // check batch hash + uint256 _batchIndex = BatchHeaderCodecV0.getBatchIndex(memPtr); + require(lastCommittedBatchIndex == _batchIndex, "incorrect batch header"); + require(committedBatches[_batchIndex] == _batchHash, "incorrect batch hash"); + + // Override finalizeTimestamp for ZKP-backed immediate finality + batchDataStore[_batchIndex].finalizeTimestamp = block.timestamp; + + // verify proof + _verifyProof(memPtr, _batchProof); + } + /// @inheritdoc IRollup /// @dev If the owner wants to revert a sequence of batches by sending multiple transactions, /// make sure to revert recent batches first. @@ -407,6 +472,15 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { emit UpdateFinalizationPeriodSeconds(_oldFinalizationPeriodSeconds, finalizationPeriodSeconds); } + /// @notice Update rollupDelayPeriod. + /// @param _newPeriod New rollup delay period. + function updateRollupDelayPeriod(uint256 _newPeriod) external onlyOwner { + require(_newPeriod > 0 && _newPeriod != rollupDelayPeriod, "invalid new rollup delay period"); + uint256 _oldRollupDelayPeriod = rollupDelayPeriod; + rollupDelayPeriod = _newPeriod; + emit UpdateRollupDelayPeriod(_oldRollupDelayPeriod, rollupDelayPeriod); + } + /// @notice Add an account to the challenger list. /// @param _account The address of account to add. function addChallenger(address _account) external onlyOwner { @@ -477,7 +551,10 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { *****************************/ /// @dev proveState proves a batch by submitting a proof. - function proveState(bytes calldata _batchHeader, bytes calldata _batchProof) external nonReqRevert whenNotPaused onlyActiveStaker{ + function proveState( + bytes calldata _batchHeader, + bytes calldata _batchProof + ) external nonReqRevert whenNotPaused onlyActiveStaker { // get batch data from batch header (uint256 memPtr, bytes32 _batchHash) = _loadBatchHeader(_batchHeader); // check batch hash @@ -727,7 +804,7 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { if (_version == 0) { (_memPtr, _length) = BatchHeaderCodecV0.loadAndValidate(_batchHeader); } else if (_version == 1) { - (_memPtr, _length) = BatchHeaderCodecV1.loadAndValidate(_batchHeader); + (_memPtr, _length) = BatchHeaderCodecV1.loadAndValidate(_batchHeader); } else { revert("Unsupported batch version"); } diff --git a/contracts/contracts/test/Rollup.t.sol b/contracts/contracts/test/Rollup.t.sol index 92d7d9dd2..c7fd2ae33 100644 --- a/contracts/contracts/test/Rollup.t.sol +++ b/contracts/contracts/test/Rollup.t.sol @@ -8,6 +8,587 @@ import {IL1Staking} from "../l1/staking/IL1Staking.sol"; import {BatchHeaderCodecV0} from "../libraries/codec/BatchHeaderCodecV0.sol"; import {BatchHeaderCodecV1} from "../libraries/codec/BatchHeaderCodecV1.sol"; +contract RollupCommitBatchWithProofTest is L1MessageBaseTest { + /// @dev Test contract for commitBatchWithProof function + /// This function allows permissionless batch submission when sequencers are stalled. + /// Key checks: inChallenge, parent batch finalized, timing delay, proof verification + + bytes public batchHeader0; + bytes32 public batchHash0; + IRollup.BatchSignatureInput public batchSignatureInput; + + // Slot constants for storage manipulation (from forge inspect Rollup storageLayout) + uint256 constant ROLLUP_DELAY_PERIOD_SLOT = 172; // slot for rollupDelayPeriod + + // ZERO_VERSIONED_HASH constant from Rollup contract + bytes32 constant ZERO_VERSIONED_HASH = 0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014; + + function setUp() public virtual override { + super.setUp(); + + // Setup batch signature input + batchSignatureInput = IRollup.BatchSignatureInput( + uint256(0), + abi.encode(uint256(0), new address[](0), uint256(0), new address[](0), uint256(0), new address[](0)), + bytes("0x") + ); + + // Import genesis batch + bytes memory _batchHeader0 = new bytes(249); + bytes32 bytesData0 = bytes32(uint256(0)); + bytes32 bytesData1 = bytes32(uint256(1)); + + assembly { + mstore(add(_batchHeader0, add(0x20, 25)), 1) + mstore(add(_batchHeader0, add(0x20, 57)), 0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014) + mstore(add(_batchHeader0, add(0x20, 89)), bytesData0) + mstore(add(_batchHeader0, add(0x20, 121)), bytesData1) + } + + batchHeader0 = _batchHeader0; + + hevm.prank(multisig); + rollup.importGenesisBatch(batchHeader0); + batchHash0 = rollup.committedBatches(0); + + // Setup staker + hevm.deal(alice, 5 * STAKING_VALUE); + Types.StakerInfo memory stakerInfo = ffi.generateStakerInfo(alice); + address[] memory addrs = new address[](1); + addrs[0] = alice; + hevm.prank(multisig); + l1Staking.updateWhitelist(addrs, new address[](0)); + hevm.prank(alice); + l1Staking.register{value: STAKING_VALUE}(stakerInfo.tmKey, stakerInfo.blsKey); + + // Set rollupDelayPeriod (e.g., 1 hour) - no prank needed for hevm.store + hevm.store(address(rollup), bytes32(ROLLUP_DELAY_PERIOD_SLOT), bytes32(uint256(3600))); + } + + /// @dev Helper to compute dataHash for a batch with no L1 messages + /// dataHash = keccak256(lastBlockNumber || numL1Messages) + function _computeDataHash(uint64 lastBlockNumber, uint16 numL1Messages) internal pure returns (bytes32) { + // Construct the data: 8 bytes lastBlockNumber + 2 bytes numL1Messages + bytes memory data = new bytes(10); + assembly { + mstore(add(data, 0x20), shl(192, lastBlockNumber)) // 8 bytes + mstore(add(data, 0x28), shl(240, numL1Messages)) // 2 bytes at offset 8 + } + return keccak256(data); + } + + /// @dev Helper to compute sequencerSetVerifyHash from sequencerSets + function _getSequencerSetVerifyHash() internal view returns (bytes32) { + return keccak256(batchSignatureInput.sequencerSets); + } + + /// @dev Helper to create batch header that matches what _commitBatchWithBatchData produces + function _createMatchingBatchHeader( + uint64 lastBlockNumber, + uint16 numL1Messages, + bytes32 prevStateRoot, + bytes32 postStateRoot, + bytes32 withdrawalRoot + ) internal view returns (bytes memory batchHeader1) { + batchHeader1 = new bytes(BatchHeaderCodecV0.BATCH_HEADER_LENGTH); + bytes32 _parentBatchHash = batchHash0; + bytes32 dataHash = _computeDataHash(lastBlockNumber, numL1Messages); + bytes32 sequencerSetVerifyHash = _getSequencerSetVerifyHash(); + + assembly { + mstore(add(batchHeader1, 0x20), 0) // version = 0 + mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex = 1 + mstore(add(batchHeader1, add(0x20, 9)), shl(192, numL1Messages)) // l1MessagePopped + mstore(add(batchHeader1, add(0x20, 17)), shl(192, numL1Messages)) // totalL1MessagePopped + mstore(add(batchHeader1, add(0x20, 25)), dataHash) // dataHash + mstore(add(batchHeader1, add(0x20, 57)), ZERO_VERSIONED_HASH) // l2TxBlobVersionedHash (no blob in test) + mstore(add(batchHeader1, add(0x20, 89)), prevStateRoot) // prevStateHash + mstore(add(batchHeader1, add(0x20, 121)), postStateRoot) // postStateHash + mstore(add(batchHeader1, add(0x20, 153)), withdrawalRoot) // withdrawRootHash + mstore(add(batchHeader1, add(0x20, 185)), sequencerSetVerifyHash) // sequencerSetVerifyHash = keccak256(sequencerSets) + mstore(add(batchHeader1, add(0x20, 217)), _parentBatchHash) // parentBatchHash + } + } + + /// @dev Helper to mock verifier call + /// Note: The actual call is to verifyAggregateProof(uint256,uint256,bytes,bytes32) + function _mockVerifierCall() internal { + hevm.mockCall( + rollup.verifier(), + abi.encodeWithSignature("verifyAggregateProof(uint256,uint256,bytes,bytes32)"), + abi.encode() + ); + } + + /// @dev Helper to mock L1 message queue calls for stalled state + function _mockMessageQueueStalled() internal { + hevm.mockCall( + address(l1MessageQueueWithGasPriceOracle), + abi.encodeWithSignature("getFirstUnfinalizedMessageEnqueueTime()"), + abi.encode(1) // Very old timestamp - stalled + ); + hevm.mockCall( + address(l1MessageQueueWithGasPriceOracle), + abi.encodeWithSignature("popCrossDomainMessage(uint256,uint256)"), + abi.encode() + ); + } + + /// @notice Test: commitBatchWithProof reverts when timing requirements not met + function test_commitBatchWithProof_reverts_when_timing_not_met() public { + // Mock message queue to return a recent timestamp (not stalled) + hevm.mockCall( + address(l1MessageQueueWithGasPriceOracle), + abi.encodeWithSignature("getFirstUnfinalizedMessageEnqueueTime()"), + abi.encode(block.timestamp) // Recent timestamp - not stalled + ); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(uint256(1)), + postStateRoot: bytes32(uint256(2)), + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(uint256(1)), bytes32(uint256(2)), getTreeRoot()); + + // Don't warp time - both conditions should fail: batch not stalled and L1 messages not stalled + hevm.prank(alice); + hevm.expectRevert("invalid timing"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof reverts on version mismatch in consistency check + /// Note: Version 1 requires different header length, so this tests the "invalid version" error from _commitBatchWithBatchData + function test_commitBatchWithProof_reverts_on_invalid_version() public { + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + // Create batchDataInput with version 2 (invalid) + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 2, // Invalid version + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(uint256(1)), + postStateRoot: bytes32(uint256(2)), + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(uint256(1)), bytes32(uint256(2)), getTreeRoot()); + + hevm.prank(alice); + hevm.expectRevert("invalid version"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof reverts when paused + function test_commitBatchWithProof_reverts_when_paused() public { + // Pause the rollup contract + hevm.prank(multisig); + rollup.setPause(true); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(uint256(1)), + postStateRoot: bytes32(uint256(2)), + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(uint256(1)), bytes32(uint256(2)), getTreeRoot()); + + hevm.prank(alice); + hevm.expectRevert("Pausable: paused"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof reverts on zero previous state root + function test_commitBatchWithProof_reverts_on_zero_prevStateRoot() public { + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + // Create batchDataInput with zero prevStateRoot + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(0), // Zero! + postStateRoot: bytes32(uint256(2)), + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(0), bytes32(uint256(2)), getTreeRoot()); + + hevm.prank(alice); + hevm.expectRevert("previous state root is zero"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof reverts on zero post state root + function test_commitBatchWithProof_reverts_on_zero_postStateRoot() public { + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + // Create batchDataInput with zero postStateRoot + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(uint256(1)), + postStateRoot: bytes32(0), // Zero! + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(uint256(1)), bytes32(0), getTreeRoot()); + + hevm.prank(alice); + hevm.expectRevert("new state root is zero"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof reverts on incorrect parent batch hash + function test_commitBatchWithProof_reverts_on_incorrect_parent_batch_hash() public { + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + // Create a fake parent batch header with wrong data + bytes memory fakeBatchHeader0 = new bytes(249); + assembly { + mstore(add(fakeBatchHeader0, add(0x20, 25)), 999) // Wrong data + } + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: fakeBatchHeader0, // Using fake parent + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(uint256(1)), + postStateRoot: bytes32(uint256(2)), + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(uint256(1)), bytes32(uint256(2)), getTreeRoot()); + + hevm.prank(alice); + hevm.expectRevert("incorrect parent batch hash"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof reverts on incorrect previous state root (doesn't match parent) + function test_commitBatchWithProof_reverts_on_incorrect_previous_state_root() public { + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + // Genesis batch has stateRoot = 1, so using 999 should fail + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(uint256(999)), // Doesn't match genesis state root + postStateRoot: bytes32(uint256(2)), + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(uint256(999)), bytes32(uint256(2)), getTreeRoot()); + + hevm.prank(alice); + hevm.expectRevert("incorrect previous state root"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof succeeds when system is stalled + function test_commitBatchWithProof_succeeds_when_stalled() public { + _mockVerifierCall(); + _mockMessageQueueStalled(); + + // Warp time to simulate stall (> rollupDelayPeriod) + hevm.warp(block.timestamp + 7200); + + bytes32 prevStateRoot = bytes32(uint256(1)); + bytes32 postStateRoot = bytes32(uint256(2)); + bytes32 withdrawalRoot = getTreeRoot(); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: prevStateRoot, + postStateRoot: postStateRoot, + withdrawalRoot: withdrawalRoot + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, prevStateRoot, postStateRoot, withdrawalRoot); + + hevm.prank(alice); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + hex"deadbeef" // Non-empty proof required + ); + + // Verify batch was committed (finalization happens separately via finalizeBatch) + assertEq(rollup.lastCommittedBatchIndex(), 1); + // finalizeTimestamp is set to block.timestamp, allowing immediate finalization + // but lastFinalizedBatchIndex is not updated until finalizeBatch is called + assertEq(rollup.lastFinalizedBatchIndex(), 0); + } + + /// @notice Test: commitBatchWithProof emits CommitBatch event + function test_commitBatchWithProof_emits_events() public { + _mockVerifierCall(); + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + bytes32 prevStateRoot = bytes32(uint256(1)); + bytes32 postStateRoot = bytes32(uint256(2)); + bytes32 withdrawalRoot = getTreeRoot(); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: prevStateRoot, + postStateRoot: postStateRoot, + withdrawalRoot: withdrawalRoot + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, prevStateRoot, postStateRoot, withdrawalRoot); + + // Expect CommitBatch event (check batchIndex only) + hevm.expectEmit(true, false, false, false); + emit IRollup.CommitBatch(1, bytes32(0)); + + hevm.prank(alice); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + hex"deadbeef" // Non-empty proof required + ); + } + + /// @notice Test: commitBatchWithProof calls verifier with proof + function test_commitBatchWithProof_calls_verifier() public { + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + bytes32 prevStateRoot = bytes32(uint256(1)); + bytes32 postStateRoot = bytes32(uint256(2)); + bytes32 withdrawalRoot = getTreeRoot(); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: prevStateRoot, + postStateRoot: postStateRoot, + withdrawalRoot: withdrawalRoot + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, prevStateRoot, postStateRoot, withdrawalRoot); + bytes memory mockProof = hex"deadbeef"; + + // Mock the verifier - it should be called with the proof + _mockVerifierCall(); + + hevm.prank(alice); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + mockProof + ); + + // Verify batch was committed and proof verification passed + assertEq(rollup.lastCommittedBatchIndex(), 1); + } + + /// @notice Test: commitBatchWithProof sets finalizeTimestamp for immediate finalization + function test_commitBatchWithProof_sets_finalizeTimestamp() public { + _mockVerifierCall(); + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + bytes32 prevStateRoot = bytes32(uint256(1)); + bytes32 postStateRoot = bytes32(uint256(2)); + bytes32 withdrawalRoot = getTreeRoot(); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: prevStateRoot, + postStateRoot: postStateRoot, + withdrawalRoot: withdrawalRoot + }); + + // Create batch header with matching data + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, prevStateRoot, postStateRoot, withdrawalRoot); + + hevm.prank(alice); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + hex"deadbeef" // Non-empty proof required + ); + + // Verify batch was committed + assertEq(rollup.lastCommittedBatchIndex(), 1); + // finalizeTimestamp is set to block.timestamp, so batch can be finalized immediately + assertFalse(rollup.batchInsideChallengeWindow(1)); + } + + /// @notice Test: commitBatchWithProof reverts when L1 message delayed but no L1 messages provided + function test_commitBatchWithProof_reverts_when_l1msg_delayed_no_messages() public { + // To trigger "l1msg delay" error, we need: + // 1. rollupDelay = false: originTs + period >= block.timestamp + // 2. l1MsgQueueDelayed = true: enqueueTime + period < block.timestamp + // 3. numL1Messages = 0 + // + // Genesis batch originTimestamp ≈ 1 (from setUp) + // rollupDelayPeriod = 3600 + // + // Setup: enqueueTime = 0, block.timestamp = 3601 + // - rollupDelay = 1 + 3600 < 3601 => 3601 < 3601 => false ✓ + // - l1MsgQueueDelayed = 0 + 3600 < 3601 => 3600 < 3601 => true ✓ + + // Mock L1 message enqueue time to 0 (simulates old unfinalized messages) + hevm.mockCall( + address(l1MessageQueueWithGasPriceOracle), + abi.encodeWithSignature("getFirstUnfinalizedMessageEnqueueTime()"), + abi.encode(0) + ); + + // Warp to exactly 3601 to trigger the condition + hevm.warp(3601); + + bytes32 prevStateRoot = bytes32(uint256(1)); + bytes32 postStateRoot = bytes32(uint256(2)); + bytes32 withdrawalRoot = getTreeRoot(); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, // No L1 messages! + prevStateRoot: prevStateRoot, + postStateRoot: postStateRoot, + withdrawalRoot: withdrawalRoot + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, prevStateRoot, postStateRoot, withdrawalRoot); + + // Should revert because L1 messages are delayed but no L1 messages provided + hevm.prank(alice); + hevm.expectRevert("l1msg delay"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + hex"deadbeef" + ); + } + + /// @notice Test: commitBatchWithProof succeeds when queue is empty (no unfinalized messages) + function test_commitBatchWithProof_succeeds_when_queue_empty() public { + _mockVerifierCall(); + + // When queue is empty, L1MessageQueueWithGasPriceOracle.getFirstUnfinalizedMessageEnqueueTime() + // returns block.timestamp, which makes l1MsgQueueDelayed = false + // (because block.timestamp + rollupDelayPeriod >= block.timestamp is always true) + + // Warp first so we have a stable timestamp to mock + hevm.warp(block.timestamp + 7200); + + // Mock getFirstUnfinalizedMessageEnqueueTime to return block.timestamp (queue empty behavior) + hevm.mockCall( + address(l1MessageQueueWithGasPriceOracle), + abi.encodeWithSignature("getFirstUnfinalizedMessageEnqueueTime()"), + abi.encode(block.timestamp) + ); + + bytes32 prevStateRoot = bytes32(uint256(1)); + bytes32 postStateRoot = bytes32(uint256(2)); + bytes32 withdrawalRoot = getTreeRoot(); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, // No L1 messages - OK because queue is empty (l1MsgQueueDelayed = false) + prevStateRoot: prevStateRoot, + postStateRoot: postStateRoot, + withdrawalRoot: withdrawalRoot + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, prevStateRoot, postStateRoot, withdrawalRoot); + + // Should succeed: + // - rollupDelay = true (7200 > 3600) + // - l1MsgQueueDelayed = false (block.timestamp + 3600 >= block.timestamp) + // Entry condition satisfied, no L1 message requirement triggered + hevm.prank(alice); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + hex"deadbeef" + ); + + assertEq(rollup.lastCommittedBatchIndex(), 1); + } +} + contract RollupCommitBatchTest is L1MessageBaseTest { address public caller = address(0xb4c79daB8f259C7Aee6E5b2Aa729821864227e84); IRollup.BatchDataInput public batchDataInput; diff --git a/contracts/deploy/013-DeployProxys.ts b/contracts/deploy/013-DeployProxys.ts index 24545613a..6b3a4a5ce 100644 --- a/contracts/deploy/013-DeployProxys.ts +++ b/contracts/deploy/013-DeployProxys.ts @@ -48,6 +48,7 @@ export const deployContractProxies = async ( const RollupProxyStorageName = ProxyStorageName.RollupProxyStorageName const L1StakingProxyStorageName = ProxyStorageName.L1StakingProxyStorageName + const L1SequencerProxyStorageName = ProxyStorageName.L1SequencerProxyStorageName const L1GatewayRouterProxyStorageName = ProxyStorageName.L1GatewayRouterProxyStorageName const L1ETHGatewayProxyStorageName = ProxyStorageName.L1ETHGatewayProxyStorageName @@ -112,6 +113,13 @@ export const deployContractProxies = async ( return err } + // ************************ sequencer contracts deploy ************************ + // L1SequencerProxy deploy + err = await deployContractProxyByStorageName(hre, path, deployer, L1SequencerProxyStorageName) + if (err != "") { + return err + } + // ************************ rollup contracts deploy ************************ // RollupProxy deploy err = await deployContractProxyByStorageName(hre, path, deployer, RollupProxyStorageName) @@ -274,6 +282,7 @@ export const deployContractProxiesConcurrently = async ( ProxyStorageName.L1CrossDomainMessengerProxyStorageName, ProxyStorageName.L1MessageQueueWithGasPriceOracleProxyStorageName, ProxyStorageName.L1StakingProxyStorageName, + ProxyStorageName.L1SequencerProxyStorageName, ProxyStorageName.RollupProxyStorageName, ProxyStorageName.L1GatewayRouterProxyStorageName, ProxyStorageName.L1ETHGatewayProxyStorageName, diff --git a/contracts/deploy/014-DeployImpls.ts b/contracts/deploy/014-DeployImpls.ts index ed0653706..b32613018 100644 --- a/contracts/deploy/014-DeployImpls.ts +++ b/contracts/deploy/014-DeployImpls.ts @@ -122,6 +122,11 @@ export const deployContractImplsConcurrently = async ( deployPromises.push(deployContract(L1StakingFactoryName, StakingImplStorageName, [L1CrossDomainMessengerProxyAddress])) + // L1Sequencer deploy (no constructor args) + const L1SequencerFactoryName = ContractFactoryName.L1Sequencer + const L1SequencerImplStorageName = ImplStorageName.L1SequencerStorageName + deployPromises.push(deployContract(L1SequencerFactoryName, L1SequencerImplStorageName)) + const results = await Promise.all(deployPromises) for (const result of results) { @@ -382,6 +387,21 @@ export const deployContractImpls = async ( return err } + // ************************ sequencer contracts deploy ************************ + // L1Sequencer deploy + const L1SequencerFactoryName = ContractFactoryName.L1Sequencer + const L1SequencerImplStorageName = ImplStorageName.L1SequencerStorageName + Factory = await hre.ethers.getContractFactory(L1SequencerFactoryName) + contract = await Factory.deploy() + await contract.deployed() + console.log("%s=%s ; TX_HASH: %s", L1SequencerImplStorageName, contract.address.toLocaleLowerCase(), contract.deployTransaction.hash) + blockNumber = await hre.ethers.provider.getBlockNumber() + console.log("BLOCK_NUMBER: %s", blockNumber) + err = await storage(path, L1SequencerImplStorageName, contract.address.toLocaleLowerCase(), blockNumber || 0) + if (err != '') { + return err + } + // return return '' } diff --git a/contracts/deploy/019-AdminTransfer.ts b/contracts/deploy/019-AdminTransfer.ts index 566396b90..a0cd1b58a 100644 --- a/contracts/deploy/019-AdminTransfer.ts +++ b/contracts/deploy/019-AdminTransfer.ts @@ -109,6 +109,7 @@ export const AdminTransferConcurrently = async ( ProxyStorageName.L1CrossDomainMessengerProxyStorageName, ProxyStorageName.L1MessageQueueWithGasPriceOracleProxyStorageName, ProxyStorageName.L1StakingProxyStorageName, + ProxyStorageName.L1SequencerProxyStorageName, // Added L1Sequencer ProxyStorageName.RollupProxyStorageName, ProxyStorageName.L1GatewayRouterProxyStorageName, ProxyStorageName.L1ETHGatewayProxyStorageName, @@ -159,6 +160,7 @@ export const AdminTransfer = async ( const RollupProxyStorageName = ProxyStorageName.RollupProxyStorageName const L1StakingProxyStorageName = ProxyStorageName.L1StakingProxyStorageName + const L1SequencerProxyStorageName = ProxyStorageName.L1SequencerProxyStorageName const L1GatewayRouterProxyStorageName = ProxyStorageName.L1GatewayRouterProxyStorageName const L1ETHGatewayProxyStorageName = ProxyStorageName.L1ETHGatewayProxyStorageName @@ -192,6 +194,13 @@ export const AdminTransfer = async ( return err } + // ************************ sequencer contracts admin change ************************ + // L1SequencerProxy admin change + err = await AdminTransferByProxyStorageName(hre, path, deployer, L1SequencerProxyStorageName) + if (err != '') { + return err + } + // ************************ rollup contracts admin change ************************ // RollupProxy admin change err = await AdminTransferByProxyStorageName(hre, path, deployer, RollupProxyStorageName) diff --git a/contracts/deploy/022-SequencerInit.ts b/contracts/deploy/022-SequencerInit.ts new file mode 100644 index 000000000..e8de25116 --- /dev/null +++ b/contracts/deploy/022-SequencerInit.ts @@ -0,0 +1,89 @@ +import "@nomiclabs/hardhat-web3"; +import "@nomiclabs/hardhat-ethers"; +import "@nomiclabs/hardhat-waffle"; + +import { + HardhatRuntimeEnvironment +} from 'hardhat/types'; +import { assertContractVariable, getContractAddressByName, awaitCondition } from "../src/deploy-utils"; +import { ethers } from 'ethers' + +import { + ImplStorageName, + ProxyStorageName, + ContractFactoryName, +} from "../src/types" + +export const SequencerInit = async ( + hre: HardhatRuntimeEnvironment, + path: string, + deployer: any, + configTmp: any +): Promise => { + // L1Sequencer addresses + const L1SequencerProxyAddress = getContractAddressByName(path, ProxyStorageName.L1SequencerProxyStorageName) + const L1SequencerImplAddress = getContractAddressByName(path, ImplStorageName.L1SequencerStorageName) + const L1SequencerFactory = await hre.ethers.getContractFactory(ContractFactoryName.L1Sequencer) + + const IL1SequencerProxy = await hre.ethers.getContractAt(ContractFactoryName.DefaultProxyInterface, L1SequencerProxyAddress, deployer) + + if ( + (await IL1SequencerProxy.implementation()).toLocaleLowerCase() !== L1SequencerImplAddress.toLocaleLowerCase() + ) { + console.log('Upgrading the L1Sequencer proxy...') + + // Owner is the deployer (will be transferred to multisig in production) + const owner = await deployer.getAddress() + + // Get initial sequencer address from config (first sequencer address) + // Note: l2SequencerAddresses is defined in contracts/src/deploy-config/l1.ts + const initialSequencer = (configTmp.l2SequencerAddresses && configTmp.l2SequencerAddresses.length > 0) + ? configTmp.l2SequencerAddresses[0] + : ethers.constants.AddressZero + + console.log('Initial sequencer address:', initialSequencer) + + // Upgrade and initialize the proxy with owner and initial sequencer + // Note: We set sequencer in initialize() to avoid TransparentUpgradeableProxy admin restriction + await IL1SequencerProxy.upgradeToAndCall( + L1SequencerImplAddress, + L1SequencerFactory.interface.encodeFunctionData('initialize', [owner, initialSequencer]) + ) + + await awaitCondition( + async () => { + return ( + (await IL1SequencerProxy.implementation()).toLocaleLowerCase() === L1SequencerImplAddress.toLocaleLowerCase() + ) + }, + 3000, + 1000 + ) + + const contractTmp = new ethers.Contract( + L1SequencerProxyAddress, + L1SequencerFactory.interface, + deployer, + ) + + await assertContractVariable( + contractTmp, + 'owner', + owner, + ) + + if (initialSequencer !== ethers.constants.AddressZero) { + await assertContractVariable( + contractTmp, + 'sequencer', + initialSequencer, + ) + console.log('L1SequencerProxy upgrade success, initial sequencer set:', initialSequencer) + } else { + console.log('L1SequencerProxy upgrade success (no initial sequencer set)') + } + } + return '' +} + +export default SequencerInit diff --git a/contracts/deploy/index.ts b/contracts/deploy/index.ts index 16f69f20b..a30ab90fb 100644 --- a/contracts/deploy/index.ts +++ b/contracts/deploy/index.ts @@ -10,6 +10,7 @@ import StakingInit from './018-StakingInit' import {AdminTransfer,AdminTransferByProxyStorageName, AdminTransferConcurrently} from './019-AdminTransfer' import ContractInit from './020-ContractInit' import StakingRegister from './021-StakingRegister' +import SequencerInit from './022-SequencerInit' export { @@ -28,5 +29,6 @@ export { AdminTransferByProxyStorageName, AdminTransferConcurrently, ContractInit, - StakingRegister + StakingRegister, + SequencerInit } \ No newline at end of file diff --git a/contracts/go.mod b/contracts/go.mod index 05b2b2912..c0cdc1473 100644 --- a/contracts/go.mod +++ b/contracts/go.mod @@ -2,7 +2,7 @@ module morph-l2/contract go 1.24.0 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.3 require ( github.com/iden3/go-iden3-crypto v0.0.16 diff --git a/contracts/src/types.ts b/contracts/src/types.ts index ea2577c89..7e518addd 100644 --- a/contracts/src/types.ts +++ b/contracts/src/types.ts @@ -18,6 +18,8 @@ const ContractFactoryName = { MultipleVersionRollupVerifier: 'MultipleVersionRollupVerifier', // staking L1Staking: 'L1Staking', + // L1 sequencer + L1Sequencer: 'L1Sequencer', // gateway L1GatewayRouter: 'L1GatewayRouter', L1StandardERC20Gateway: 'L1StandardERC20Gateway', @@ -40,6 +42,8 @@ const ProxyStorageName = { RollupProxyStorageName: 'Proxy__Rollup', // staking L1StakingProxyStorageName: 'Proxy__L1Staking', + // L1 sequencer + L1SequencerProxyStorageName: 'Proxy__L1Sequencer', // gateway L1GatewayRouterProxyStorageName: 'Proxy__L1GatewayRouter', L1StandardERC20GatewayProxyStorageName: 'Proxy__L1StandardERC20Gateway', @@ -71,6 +75,8 @@ const ImplStorageName = { MultipleVersionRollupVerifierStorageName: 'Impl__MultipleVersionRollupVerifier', // staking L1StakingStorageName: 'Impl__L1Staking', + // L1 sequencer + L1SequencerStorageName: 'Impl__L1Sequencer', // gateway L1GatewayRouterStorageName: 'Impl__L1GatewayRouter', L1StandardERC20GatewayStorageName: 'Impl__L1StandardERC20Gateway', diff --git a/contracts/tasks/deploy.ts b/contracts/tasks/deploy.ts index 9ee6739a9..a7ea6bb6a 100644 --- a/contracts/tasks/deploy.ts +++ b/contracts/tasks/deploy.ts @@ -21,6 +21,7 @@ import { AdminTransferConcurrently, ContractInit, StakingRegister, + SequencerInit, } from '../deploy/index' import { ethers } from "ethers"; @@ -120,6 +121,12 @@ task("initialize") console.log('Staking init failed, err: ', err) return } + console.log('\n---------------------------------- Sequencer init ----------------------------------') + err = await SequencerInit(hre, storagePath, deployer, config) + if (err != '') { + console.log('Sequencer init failed, err: ', err) + return + } console.log('\n---------------------------------- Admin Transfer ----------------------------------') if (concurrent === 'true') { err = await AdminTransferConcurrently(hre, storagePath, deployer, config) diff --git a/node/blocktag/config.go b/node/blocktag/config.go new file mode 100644 index 000000000..43c282800 --- /dev/null +++ b/node/blocktag/config.go @@ -0,0 +1,52 @@ +package blocktag + +import ( + "fmt" + "time" + + "github.com/morph-l2/go-ethereum/common" + "github.com/urfave/cli" + + node "morph-l2/node/core" + "morph-l2/node/flags" +) + +const ( + // DefaultSafeConfirmations is the default number of L1 blocks to wait before considering a batch as safe + DefaultSafeConfirmations = 10 + // DefaultPollInterval is the default interval to poll L1 for batch status updates + DefaultPollInterval = 10 * time.Second +) + +// Config holds the configuration for BlockTagService +type Config struct { + RollupAddress common.Address + SafeConfirmations uint64 + PollInterval time.Duration +} + +// DefaultConfig returns the default configuration +func DefaultConfig() *Config { + return &Config{ + SafeConfirmations: DefaultSafeConfirmations, + PollInterval: DefaultPollInterval, + } +} + +// SetCliContext sets the configuration from CLI context +func (c *Config) SetCliContext(ctx *cli.Context) error { + // Determine RollupAddress: use explicit flag, or mainnet default, or error + if ctx.GlobalBool(flags.MainnetFlag.Name) { + c.RollupAddress = node.MainnetRollupContractAddress + } else if ctx.GlobalIsSet(flags.RollupContractAddress.Name) { + c.RollupAddress = common.HexToAddress(ctx.GlobalString(flags.RollupContractAddress.Name)) + } else { + return fmt.Errorf("rollup contract address is required: either specify --%s or use --%s for mainnet default", + flags.RollupContractAddress.Name, flags.MainnetFlag.Name) + } + + if ctx.GlobalIsSet(flags.BlockTagSafeConfirmations.Name) { + c.SafeConfirmations = ctx.GlobalUint64(flags.BlockTagSafeConfirmations.Name) + } + return nil +} diff --git a/node/blocktag/service.go b/node/blocktag/service.go new file mode 100644 index 000000000..45f7ecda3 --- /dev/null +++ b/node/blocktag/service.go @@ -0,0 +1,457 @@ +package blocktag + +import ( + "context" + "fmt" + "math/big" + "time" + + "github.com/morph-l2/go-ethereum/accounts/abi/bind" + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/ethclient" + "github.com/morph-l2/go-ethereum/rpc" + tmlog "github.com/tendermint/tendermint/libs/log" + + "morph-l2/bindings/bindings" + "morph-l2/node/types" +) + +// BlockTagType represents the type of block tag (safe or finalized) +type BlockTagType int + +const ( + TagTypeSafe BlockTagType = iota + TagTypeFinalized +) + +// BlockTagService is responsible for tracking and updating safe/finalized block tags +// based on L1 batch commit tx status. +// +// Key logic: +// - Safe: batch tx is committed to L1 with N block confirmations (configurable) +// - Finalized: batch tx's L1 block is finalized (using L1 finalized block tag) +type BlockTagService struct { + ctx context.Context + cancel context.CancelFunc + + // Current safe and finalized L2 block hashes + safeL2BlockHash common.Hash + finalizedL2BlockHash common.Hash + // Last notified hashes (to avoid redundant RPC calls) + lastNotifiedSafeHash common.Hash + lastNotifiedFinalizedHash common.Hash + + // Cached batch index for optimization (avoid full binary search each time) + // Separate caches for safe and finalized since they have different maxBatchIndex + lastKnownSafeBatchIndex uint64 + lastKnownFinalizedBatchIndex uint64 + + // Clients + l1Client *ethclient.Client + l2Client *types.RetryableClient + rollup *bindings.Rollup + + // Configuration + rollupAddress common.Address + safeConfirmations uint64 // Number of L1 blocks to wait before considering a batch as safe + pollInterval time.Duration + + logger tmlog.Logger + stop chan struct{} +} + +// NewBlockTagService creates a new BlockTagService +func NewBlockTagService( + ctx context.Context, + l1Client *ethclient.Client, + l2Client *types.RetryableClient, + config *Config, + logger tmlog.Logger, +) (*BlockTagService, error) { + if l1Client == nil { + return nil, fmt.Errorf("L1 client is required") + } + if config.RollupAddress == (common.Address{}) { + return nil, fmt.Errorf("Rollup contract address is required") + } + + rollup, err := bindings.NewRollup(config.RollupAddress, l1Client) + if err != nil { + return nil, fmt.Errorf("failed to create rollup binding: %w", err) + } + + ctx, cancel := context.WithCancel(ctx) + + return &BlockTagService{ + ctx: ctx, + cancel: cancel, + l1Client: l1Client, + l2Client: l2Client, + rollup: rollup, + rollupAddress: config.RollupAddress, + safeConfirmations: config.SafeConfirmations, + pollInterval: config.PollInterval, + logger: logger.With("module", "blocktag"), + stop: make(chan struct{}), + }, nil +} + +// Start starts the BlockTagService +func (s *BlockTagService) Start() error { + s.logger.Info("Starting BlockTagService", + "safeConfirmations", s.safeConfirmations, + "pollInterval", s.pollInterval, + ) + + // Initialize by checking current L1 batch status + if err := s.initialize(); err != nil { + s.logger.Error("Failed to initialize BlockTagService", "error", err) + // Don't return error, let the service start and retry + } + + go s.loop() + return nil +} + +// Stop stops the BlockTagService +func (s *BlockTagService) Stop() { + s.logger.Info("Stopping BlockTagService") + s.cancel() + <-s.stop + s.logger.Info("BlockTagService stopped") +} + +// initialize initializes the service by checking current L1 batch status +func (s *BlockTagService) initialize() error { + s.logger.Info("Initializing BlockTagService") + return s.updateBlockTags() +} + +// loop is the main loop that polls L1 for batch status updates +func (s *BlockTagService) loop() { + defer close(s.stop) + + ticker := time.NewTicker(s.pollInterval) + defer ticker.Stop() + + for { + select { + case <-s.ctx.Done(): + return + case <-ticker.C: + if err := s.updateBlockTags(); err != nil { + s.logger.Error("Failed to update block tags", "error", err) + } + } + } +} + +// updateBlockTags updates the safe and finalized block tags based on L1 batch tx status +func (s *BlockTagService) updateBlockTags() error { + l2Head, err := s.l2Client.BlockNumber(s.ctx) + if err != nil { + return fmt.Errorf("failed to get L2 head: %w", err) + } + + var safeBlockNum uint64 + var safeBlockHash common.Hash + + // Update safe block + safeBlockNum, safeBlockHash, err = s.getL2BlockForTag(TagTypeSafe, l2Head) + if err != nil { + s.logger.Error("Failed to get safe L2 block", "error", err) + } else if safeBlockHash != (common.Hash{}) { + s.setSafeL2Block(safeBlockHash) + } + + // Update finalized block + finalizedBlockNum, finalizedBlockHash, err := s.getL2BlockForTag(TagTypeFinalized, l2Head) + if err != nil { + s.logger.Error("Failed to get finalized L2 block", "error", err) + } else if finalizedBlockHash != (common.Hash{}) { + // If finalized > safe, update safe to finalized (finalized is a stronger state) + if finalizedBlockNum > safeBlockNum { + safeBlockHash = finalizedBlockHash + s.setSafeL2Block(safeBlockHash) + } + s.setFinalizedL2Block(finalizedBlockHash) + } + + // Notify geth + if err := s.notifyGeth(); err != nil { + s.logger.Error("Failed to notify geth of block tags", "error", err) + } + + s.logger.Debug("Block tags updated", + "l2Head", l2Head, + "safeL2BlockHash", s.safeL2BlockHash.Hex(), + "finalizedL2BlockHash", s.finalizedL2BlockHash.Hex(), + ) + + return nil +} + +// getL2BlockForTag gets the L2 block number and hash based on the L1 block tag +// Also validates state root matches between L1 batch and L2 block +func (s *BlockTagService) getL2BlockForTag(tagType BlockTagType, l2Head uint64) (uint64, common.Hash, error) { + var l1BlockTag rpc.BlockNumber + + switch tagType { + case TagTypeSafe: + latestL1, err := s.l1Client.BlockNumber(s.ctx) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("failed to get L1 latest block: %w", err) + } + if latestL1 <= s.safeConfirmations { + return 0, common.Hash{}, nil + } + l1BlockTag = rpc.BlockNumber(latestL1 - s.safeConfirmations) + + case TagTypeFinalized: + l1BlockTag = rpc.FinalizedBlockNumber + + default: + return 0, common.Hash{}, fmt.Errorf("unknown tag type: %d", tagType) + } + + // Query rollup contract at specified L1 block + lastCommittedBatchIndex, err := s.getLastCommittedBatchAtBlock(l1BlockTag) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("failed to get last committed batch: %w", err) + } + if lastCommittedBatchIndex == 0 { + return 0, common.Hash{}, nil + } + + // Find the largest completed batch (lastL2Block <= l2Head) + // This works for both synced and syncing scenarios + targetBatchIndex, targetBatchLastBlockNum, err := s.findCompletedBatchForL2Block(tagType, l2Head, lastCommittedBatchIndex) + if err != nil { + s.logger.Debug("No completed batch found", "l2Head", l2Head, "error", err) + return 0, common.Hash{}, nil + } + + // Validate state root. + // Skip validation for already finalized batches, as their state roots may have been + // deleted from the L1 contract after finalization + lastFinalizedBatchIndex, err := s.rollup.LastFinalizedBatchIndex(nil) + if err != nil { + s.logger.Info("Failed to get last finalized batch index, skipping state root validation", "error", err) + return 0, common.Hash{}, nil + } + if targetBatchIndex < lastFinalizedBatchIndex.Uint64() { + // Batch data may have been deleted after finalization, cannot validate + // Return error so caller skips this batch and keeps previous safe/finalized value + // TODO: optimize this by using a different approach to get the state root + s.logger.Info("batch already finalized, state root may be deleted", + "batchIndex", targetBatchIndex, + "lastFinalized", lastFinalizedBatchIndex.Uint64()) + return 0, common.Hash{}, nil + } + if err := s.validateBatchStateRoot(targetBatchIndex, targetBatchLastBlockNum); err != nil { + s.logger.Error("State root validation failed", + "tagType", tagType, + "batchIndex", targetBatchIndex, + "l2Block", targetBatchLastBlockNum, + "error", err, + ) + return 0, common.Hash{}, err + } + + // Get L2 block header for hash + l2Header, err := s.l2Client.HeaderByNumber(s.ctx, big.NewInt(int64(targetBatchLastBlockNum))) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("failed to get L2 block header: %w", err) + } + + l2BlockHash := l2Header.Hash() + + s.logger.Debug("Got L2 block for tag", + "tagType", tagType, + "l1BlockTag", l1BlockTag, + "batchIndex", targetBatchIndex, + "l2Block", targetBatchLastBlockNum, + "l2BlockHash", l2BlockHash.Hex(), + ) + + return targetBatchLastBlockNum, l2BlockHash, nil +} + +// validateBatchStateRoot validates that the state root of batch's lastL2Block matches L1 +func (s *BlockTagService) validateBatchStateRoot(batchIndex uint64, batchLastBlockNum uint64) error { + // Get L2 block header + l2Header, err := s.l2Client.HeaderByNumber(s.ctx, big.NewInt(int64(batchLastBlockNum))) + if err != nil { + return fmt.Errorf("failed to get L2 block header for block %d: %w", batchLastBlockNum, err) + } + + // Get state root from L1 committed batch + stateRoot, err := s.rollup.CommittedStateRoots(nil, big.NewInt(int64(batchIndex))) + if err != nil { + return fmt.Errorf("failed to get state root from L1: %w", err) + } + + // Compare state roots + l1StateRoot := common.BytesToHash(stateRoot[:]) + if l1StateRoot != l2Header.Root { + return fmt.Errorf("state root mismatch for batch %d: L1=%s, L2=%s", batchIndex, l1StateRoot.Hex(), l2Header.Root.Hex()) + } + + return nil +} + +// findCompletedBatchForL2Block finds the largest batch where lastL2Block <= l2BlockNum. +// Uses cached index for optimization: first call binary search, subsequent calls search forward. +// Separate caches for safe and finalized to avoid conflicts. +func (s *BlockTagService) findCompletedBatchForL2Block(tagType BlockTagType, l2HeaderNum uint64, lastCommittedBatchIndex uint64) (uint64, uint64, error) { + return s.findCompletedBatchForL2BlockWithDepth(tagType, l2HeaderNum, lastCommittedBatchIndex, 0) +} + +// findCompletedBatchForL2BlockWithDepth is the internal implementation with recursion depth limit. +// maxDepth is set to 1 to allow one retry after cache reset. +func (s *BlockTagService) findCompletedBatchForL2BlockWithDepth(tagType BlockTagType, l2HeaderNum uint64, lastCommittedBatchIndex uint64, depth int) (uint64, uint64, error) { + const maxDepth = 2 + + if lastCommittedBatchIndex == 0 { + return 0, 0, fmt.Errorf("no batches available") + } + + // Get cached index based on tag type + startIdx := s.getCachedBatchIndex(tagType) + if startIdx == 0 || startIdx > lastCommittedBatchIndex { + // First time or cache invalid: use binary search to find starting point + startIdx = s.binarySearchBatch(l2HeaderNum, lastCommittedBatchIndex) + if startIdx == 0 { + return 0, 0, fmt.Errorf("no completed batch found for L2 block %d", l2HeaderNum) + } + } + + // Search forward from startIdx + var resultIdx, resultLastL2Block uint64 + for idx := startIdx; idx <= lastCommittedBatchIndex; idx++ { + batchData, err := s.rollup.BatchDataStore(nil, big.NewInt(int64(idx))) + if err != nil { + return 0, 0, fmt.Errorf("failed to get batch data for index %d: %w", idx, err) + } + + lastL2Block := batchData.BlockNumber.Uint64() + if lastL2Block <= l2HeaderNum { + resultIdx = idx + resultLastL2Block = lastL2Block + s.setCachedBatchIndex(tagType, idx) + } else { + break + } + } + + // Handle L2 reorg: if cache was too new, reset and use binary search + if resultIdx == 0 { + if depth >= maxDepth { + return 0, 0, fmt.Errorf("no completed batch found for L2 block %d after retry", l2HeaderNum) + } + s.setCachedBatchIndex(tagType, 0) + return s.findCompletedBatchForL2BlockWithDepth(tagType, l2HeaderNum, lastCommittedBatchIndex, depth+1) + } + + return resultIdx, resultLastL2Block, nil +} + +func (s *BlockTagService) getCachedBatchIndex(tagType BlockTagType) uint64 { + if tagType == TagTypeSafe { + return s.lastKnownSafeBatchIndex + } + return s.lastKnownFinalizedBatchIndex +} + +func (s *BlockTagService) setCachedBatchIndex(tagType BlockTagType, idx uint64) { + if tagType == TagTypeSafe { + s.lastKnownSafeBatchIndex = idx + } else { + s.lastKnownFinalizedBatchIndex = idx + } +} + +// binarySearchBatch finds the largest batch index where lastL2BlockInBatch <= l2HeaderNum +func (s *BlockTagService) binarySearchBatch(l2HeaderNum uint64, maxBatchIndex uint64) uint64 { + low, high := uint64(1), maxBatchIndex + var result uint64 + + for low <= high { + mid := (low + high) / 2 + batchData, err := s.rollup.BatchDataStore(nil, big.NewInt(int64(mid))) + if err != nil { + return result // Return best result so far on error + } + + if batchData.BlockNumber.Uint64() <= l2HeaderNum { + result = mid + low = mid + 1 + } else { + high = mid - 1 + } + } + + return result +} + +// getLastCommittedBatchAtBlock queries the rollup contract at a specific L1 block +func (s *BlockTagService) getLastCommittedBatchAtBlock(l1BlockTag rpc.BlockNumber) (uint64, error) { + var blockNum *big.Int + if l1BlockTag == rpc.FinalizedBlockNumber { + blockNum = big.NewInt(int64(rpc.FinalizedBlockNumber)) + } else if l1BlockTag >= 0 { + blockNum = big.NewInt(int64(l1BlockTag)) + } + + lastCommitted, err := s.rollup.LastCommittedBatchIndex(&bind.CallOpts{ + BlockNumber: blockNum, + Context: s.ctx, + }) + if err != nil { + return 0, err + } + + return lastCommitted.Uint64(), nil +} + +// setSafeL2Block sets the safe L2 block hash +func (s *BlockTagService) setSafeL2Block(blockHash common.Hash) { + if blockHash != s.safeL2BlockHash { + s.safeL2BlockHash = blockHash + s.logger.Info("Updated safe L2 block", "hash", blockHash.Hex()) + } +} + +// setFinalizedL2Block sets the finalized L2 block hash +func (s *BlockTagService) setFinalizedL2Block(blockHash common.Hash) { + if blockHash != s.finalizedL2BlockHash { + s.finalizedL2BlockHash = blockHash + s.logger.Info("Updated finalized L2 block", "hash", blockHash.Hex()) + } +} + +// notifyGeth notifies geth of the new block tags via RPC +// Only calls RPC if there are changes since last notification +func (s *BlockTagService) notifyGeth() error { + safeBlockHash := s.safeL2BlockHash + finalizedBlockHash := s.finalizedL2BlockHash + + // Skip if no changes + if safeBlockHash == s.lastNotifiedSafeHash && finalizedBlockHash == s.lastNotifiedFinalizedHash { + return nil + } + + // Skip if both are empty + if safeBlockHash == (common.Hash{}) && finalizedBlockHash == (common.Hash{}) { + return nil + } + + if err := s.l2Client.SetBlockTags(s.ctx, safeBlockHash, finalizedBlockHash); err != nil { + return err + } + + // Update last notified hashes + s.lastNotifiedSafeHash = safeBlockHash + s.lastNotifiedFinalizedHash = finalizedBlockHash + return nil +} diff --git a/node/cmd/node/main.go b/node/cmd/node/main.go index faeed7960..3a3f949d0 100644 --- a/node/cmd/node/main.go +++ b/node/cmd/node/main.go @@ -6,19 +6,26 @@ import ( "os" "os/signal" "path/filepath" + "strings" "syscall" + "time" + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/crypto" "github.com/morph-l2/go-ethereum/ethclient" + tmlog "github.com/tendermint/tendermint/libs/log" tmnode "github.com/tendermint/tendermint/node" "github.com/tendermint/tendermint/privval" "github.com/urfave/cli" "morph-l2/bindings/bindings" + "morph-l2/node/blocktag" "morph-l2/node/cmd/keyconverter" node "morph-l2/node/core" "morph-l2/node/db" "morph-l2/node/derivation" "morph-l2/node/flags" + "morph-l2/node/l1sequencer" "morph-l2/node/sequencer" "morph-l2/node/sequencer/mock" "morph-l2/node/sync" @@ -52,12 +59,16 @@ func main() { func L2NodeMain(ctx *cli.Context) error { var ( - err error - executor *node.Executor - syncer *sync.Syncer - ms *mock.Sequencer - tmNode *tmnode.Node - dvNode *derivation.Derivation + err error + executor *node.Executor + syncer *sync.Syncer + ms *mock.Sequencer + tmNode *tmnode.Node + dvNode *derivation.Derivation + blockTagSvc *blocktag.BlockTagService + tracker *l1sequencer.L1Tracker + verifier *l1sequencer.SequencerVerifier + signer l1sequencer.Signer nodeConfig = node.DefaultConfig() ) @@ -116,14 +127,27 @@ func L2NodeMain(ctx *cli.Context) error { dvNode.Start() nodeConfig.Logger.Info("derivation node starting") } else { - // launch tendermint node + // ========== Create Syncer and L1 Sequencer Components ========== + syncer, err = node.NewSyncer(ctx, home, nodeConfig) + if err != nil { + return fmt.Errorf("failed to create syncer: %w", err) + } + + tracker, verifier, signer, err = initL1SequencerComponents(ctx, syncer.L1Client(), nodeConfig.Logger) + if err != nil { + return fmt.Errorf("failed to init L1 sequencer components: %w", err) + } + + // ========== Launch Tendermint Node ========== tmCfg, err := sequencer.LoadTmConfig(ctx, home) if err != nil { return err } tmVal := privval.LoadOrGenFilePV(tmCfg.PrivValidatorKeyFile(), tmCfg.PrivValidatorStateFile()) pubKey, _ := tmVal.GetPubKey() - newSyncerFunc := func() (*sync.Syncer, error) { return node.NewSyncer(ctx, home, nodeConfig) } + + // Create executor with syncer + newSyncerFunc := func() (*sync.Syncer, error) { return syncer, nil } // Reuse existing syncer executor, err = node.NewExecutor(newSyncerFunc, nodeConfig, pubKey) if err != nil { return err @@ -135,13 +159,20 @@ func L2NodeMain(ctx *cli.Context) error { } go ms.Start() } else { - if tmNode, err = sequencer.SetupNode(tmCfg, tmVal, executor, nodeConfig.Logger); err != nil { - return fmt.Errorf("failed to setup consensus node, error: %v", err) + tmNode, err = sequencer.SetupNode(tmCfg, tmVal, executor, nodeConfig.Logger, verifier, signer) + if err != nil { + return fmt.Errorf("failed to setup consensus node: %v", err) } if err = tmNode.Start(); err != nil { return fmt.Errorf("failed to start consensus node, error: %v", err) } } + + // ========== Initialize BlockTagService ========== + blockTagSvc, err = initBlockTagService(ctx, syncer.L1Client(), executor, nodeConfig.Logger) + if err != nil { + return fmt.Errorf("failed to init BlockTagService: %w", err) + } } interruptChannel := make(chan os.Signal, 1) @@ -168,10 +199,105 @@ func L2NodeMain(ctx *cli.Context) error { if dvNode != nil { dvNode.Stop() } + if blockTagSvc != nil { + blockTagSvc.Stop() + } + if tracker != nil { + tracker.Stop() + } return nil } +// initL1SequencerComponents initializes all L1 sequencer related components: +// - L1Tracker: monitors L1 sync status +// - SequencerCache: caches L1 sequencer address (nil if contract not configured) +// - Signer: signs blocks (nil if private key not configured) +func initL1SequencerComponents( + ctx *cli.Context, + l1Client *ethclient.Client, + logger tmlog.Logger, +) (*l1sequencer.L1Tracker, *l1sequencer.SequencerVerifier, l1sequencer.Signer, error) { + if l1Client == nil { + return nil, nil, nil, fmt.Errorf("L1 client is required, check l1.rpc configuration") + } + + // Get config from flags + lagThreshold := ctx.GlobalDuration(flags.L1SyncLagThreshold.Name) + if lagThreshold == 0 { + lagThreshold = 5 * time.Minute // default + } + contractAddr := common.HexToAddress(ctx.GlobalString(flags.L1SequencerContractAddr.Name)) + seqPrivKeyHex := ctx.GlobalString(flags.SequencerPrivateKey.Name) + + // Initialize L1 Tracker + tracker := l1sequencer.NewL1Tracker(context.Background(), l1Client, lagThreshold, logger) + if err := tracker.Start(); err != nil { + return nil, nil, nil, fmt.Errorf("failed to start L1 tracker: %w", err) + } + logger.Info("L1 Tracker started", "lagThreshold", lagThreshold) + + // Initialize Sequencer Verifier (optional) + var verifier *l1sequencer.SequencerVerifier + if contractAddr != (common.Address{}) { + caller, err := bindings.NewL1SequencerCaller(contractAddr, l1Client) + if err != nil { + tracker.Stop() + return nil, nil, nil, fmt.Errorf("failed to create L1Sequencer caller: %w", err) + } + verifier = l1sequencer.NewSequencerVerifier(caller, logger) + logger.Info("Sequencer verifier initialized", "contract", contractAddr.Hex()) + } else { + logger.Info("L1 Sequencer contract not configured, verifier disabled") + } + + // Initialize Signer (optional) + var signer l1sequencer.Signer + if seqPrivKeyHex != "" { + seqPrivKeyHex = strings.TrimPrefix(seqPrivKeyHex, "0x") + privKey, err := crypto.HexToECDSA(seqPrivKeyHex) + if err != nil { + tracker.Stop() + return nil, nil, nil, fmt.Errorf("invalid sequencer private key: %w", err) + } + signer, err = l1sequencer.NewLocalSigner(privKey, verifier, logger) + if err != nil { + tracker.Stop() + return nil, nil, nil, err + } + logger.Info("Sequencer signer initialized", "address", signer.Address().Hex()) + } else { + logger.Info("Sequencer private key not configured, signer disabled") + } + + return tracker, verifier, signer, nil +} + +// initBlockTagService initializes the block tag service +func initBlockTagService( + ctx *cli.Context, + l1Client *ethclient.Client, + executor *node.Executor, + logger tmlog.Logger, +) (*blocktag.BlockTagService, error) { + config := blocktag.DefaultConfig() + if err := config.SetCliContext(ctx); err != nil { + return nil, err + } + + svc, err := blocktag.NewBlockTagService(context.Background(), l1Client, executor.L2Client(), config, logger) + if err != nil { + return nil, err + } + + if err := svc.Start(); err != nil { + return nil, err + } + + logger.Info("BlockTagService started") + return svc, nil +} + func homeDir(ctx *cli.Context) (string, error) { home := ctx.GlobalString(flags.Home.Name) if home == "" { diff --git a/node/core/config.go b/node/core/config.go index cd3e80aae..a11b23897 100644 --- a/node/core/config.go +++ b/node/core/config.go @@ -25,6 +25,9 @@ import ( var ( MainnetUpgradeBatchTime uint64 = 0 MainnetBlsKeyCheckForkHeight uint64 = 18409547 + + // L1 Mainnet Contract Addresses + MainnetRollupContractAddress = common.HexToAddress("0x759894ced0e6af42c26668076ffa84d02e3cef60") ) type Config struct { diff --git a/node/flags/flags.go b/node/flags/flags.go index 3bb690e5c..e4c29e15f 100644 --- a/node/flags/flags.go +++ b/node/flags/flags.go @@ -220,6 +220,35 @@ var ( EnvVar: prefixEnvVar("DERIVATION_FETCH_BLOCK_RANGE"), } + // BlockTag options + BlockTagSafeConfirmations = cli.Uint64Flag{ + Name: "blocktag.safeConfirmations", + Usage: "Number of L1 blocks to wait before considering a batch as safe", + EnvVar: prefixEnvVar("BLOCKTAG_SAFE_CONFIRMATIONS"), + Value: 10, + } + + // L1 Sequencer options + L1SequencerContractAddr = cli.StringFlag{ + Name: "l1.sequencerContract", + Usage: "L1 Sequencer contract address for signature verification", + EnvVar: prefixEnvVar("L1_SEQUENCER_CONTRACT"), + } + + L1SyncLagThreshold = cli.DurationFlag{ + Name: "l1.syncLagThreshold", + Usage: "L1 sync lag threshold for warning logs", + EnvVar: prefixEnvVar("L1_SYNC_LAG_THRESHOLD"), + Value: 5 * 60 * 1000000000, // 5 minutes in nanoseconds + } + + // Sequencer private key for block signing (hex encoded, without 0x prefix) + SequencerPrivateKey = cli.StringFlag{ + Name: "sequencer.privateKey", + Usage: "Sequencer private key for block signing (hex encoded)", + EnvVar: prefixEnvVar("SEQUENCER_PRIVATE_KEY"), + } + // Batch rules UpgradeBatchTime = cli.Uint64Flag{ Name: "upgrade.batchTime", @@ -338,6 +367,14 @@ var Flags = []cli.Flag{ DerivationConfirmations, L1BeaconAddr, + // blocktag options + BlockTagSafeConfirmations, + + // L1 Sequencer options + L1SequencerContractAddr, + L1SyncLagThreshold, + SequencerPrivateKey, + // batch rules UpgradeBatchTime, MainnetFlag, diff --git a/node/go.mod b/node/go.mod index e8f9a3353..5804512a2 100644 --- a/node/go.mod +++ b/node/go.mod @@ -2,7 +2,7 @@ module morph-l2/node go 1.24.0 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.3 require ( github.com/cenkalti/backoff/v4 v4.1.3 @@ -11,7 +11,7 @@ require ( github.com/hashicorp/golang-lru v1.0.2 github.com/holiman/uint256 v1.2.4 github.com/klauspost/compress v1.17.9 - github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 + github.com/morph-l2/go-ethereum v1.10.14-0.20260115065009-43c9e2a6c033 github.com/prometheus/client_golang v1.17.0 github.com/spf13/viper v1.13.0 github.com/stretchr/testify v1.10.0 diff --git a/node/go.sum b/node/go.sum index d11447ab7..469923eff 100644 --- a/node/go.sum +++ b/node/go.sum @@ -361,10 +361,10 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= -github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= -github.com/morph-l2/tendermint v0.3.2 h1:Gu6Uj2G6c3YP2NAKFi7A46JZaOCdD4zfZDKCjt0pDm8= -github.com/morph-l2/tendermint v0.3.2/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= +github.com/morph-l2/go-ethereum v1.10.14-0.20260115065009-43c9e2a6c033 h1:p6Y/8mNezpH/UH0Tspa8iLM/GgjhILQFvdGsWDDlwdQ= +github.com/morph-l2/go-ethereum v1.10.14-0.20260115065009-43c9e2a6c033/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= +github.com/morph-l2/tendermint v0.3.3 h1:zsmzVJfKp+NuCr45ZUUY2ZJjnHAVLzwJLID6GxBR4i4= +github.com/morph-l2/tendermint v0.3.3/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= diff --git a/node/l1sequencer/signer.go b/node/l1sequencer/signer.go new file mode 100644 index 000000000..f03901ae3 --- /dev/null +++ b/node/l1sequencer/signer.go @@ -0,0 +1,71 @@ +package l1sequencer + +import ( + "context" + "crypto/ecdsa" + "fmt" + + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/crypto" + tmlog "github.com/tendermint/tendermint/libs/log" +) + +// Signer manages sequencer identity and signing capabilities. +// It abstracts the private key management, allowing for local key storage +// or remote signing services (e.g., HSM, KMS) in the future. +type Signer interface { + // Sign signs data with the sequencer's private key + Sign(data []byte) ([]byte, error) + + // Address returns the sequencer's address + Address() common.Address + + // IsActiveSequencer checks if this signer is the current L1 sequencer + IsActiveSequencer(ctx context.Context) (bool, error) +} + +// LocalSigner implements Signer with a local private key +type LocalSigner struct { + privKey *ecdsa.PrivateKey + address common.Address + verifier *SequencerVerifier + logger tmlog.Logger +} + +// NewLocalSigner creates a new LocalSigner with a local private key +func NewLocalSigner(privKey *ecdsa.PrivateKey, verifier *SequencerVerifier, logger tmlog.Logger) (*LocalSigner, error) { + if privKey == nil { + return nil, fmt.Errorf("private key is required") + } + + address := crypto.PubkeyToAddress(privKey.PublicKey) + + return &LocalSigner{ + privKey: privKey, + address: address, + verifier: verifier, + logger: logger.With("module", "signer"), + }, nil +} + +// Sign signs data with the sequencer's private key +func (s *LocalSigner) Sign(data []byte) ([]byte, error) { + signature, err := crypto.Sign(data, s.privKey) + if err != nil { + return nil, fmt.Errorf("failed to sign: %w", err) + } + return signature, nil +} + +// Address returns the sequencer's address +func (s *LocalSigner) Address() common.Address { + return s.address +} + +// IsActiveSequencer checks if this signer is the current L1 sequencer +func (s *LocalSigner) IsActiveSequencer(ctx context.Context) (bool, error) { + if s.verifier == nil { + return false, fmt.Errorf("sequencer verifier not set") + } + return s.verifier.IsSequencer(ctx, s.address) +} diff --git a/node/l1sequencer/tracker.go b/node/l1sequencer/tracker.go new file mode 100644 index 000000000..d8ea3b8c0 --- /dev/null +++ b/node/l1sequencer/tracker.go @@ -0,0 +1,86 @@ +package l1sequencer + +import ( + "context" + "time" + + "github.com/morph-l2/go-ethereum/ethclient" + tmlog "github.com/tendermint/tendermint/libs/log" +) + +// L1Tracker monitors L1 RPC sync status and logs warnings if behind. +// It runs as an independent service. +type L1Tracker struct { + ctx context.Context + cancel context.CancelFunc + l1Client *ethclient.Client + lagThreshold time.Duration + logger tmlog.Logger + stop chan struct{} +} + +// NewL1Tracker creates a new L1Tracker +func NewL1Tracker( + ctx context.Context, + l1Client *ethclient.Client, + lagThreshold time.Duration, + logger tmlog.Logger, +) *L1Tracker { + ctx, cancel := context.WithCancel(ctx) + return &L1Tracker{ + ctx: ctx, + cancel: cancel, + l1Client: l1Client, + lagThreshold: lagThreshold, + logger: logger.With("module", "l1tracker"), + stop: make(chan struct{}), + } +} + +// Start starts the L1Tracker +func (t *L1Tracker) Start() error { + t.logger.Info("Starting L1Tracker", "lagThreshold", t.lagThreshold) + go t.loop() + return nil +} + +// Stop stops the L1Tracker +func (t *L1Tracker) Stop() { + t.logger.Info("Stopping L1Tracker") + t.cancel() + <-t.stop +} + +func (t *L1Tracker) loop() { + defer close(t.stop) + + ticker := time.NewTicker(1 * time.Minute) + defer ticker.Stop() + + for { + select { + case <-t.ctx.Done(): + return + case <-ticker.C: + t.checkL1SyncLag() + } + } +} + +func (t *L1Tracker) checkL1SyncLag() { + header, err := t.l1Client.HeaderByNumber(t.ctx, nil) + if err != nil { + t.logger.Error("Failed to get L1 header", "error", err) + return + } + + blockTime := time.Unix(int64(header.Time), 0) + lag := time.Since(blockTime) + if lag > t.lagThreshold { + t.logger.Error("L1 RPC is behind", + "latestBlock", header.Number.Uint64(), + "blockTime", blockTime.Format(time.RFC3339), + "lag", lag.Round(time.Second), + ) + } +} diff --git a/node/l1sequencer/verifier.go b/node/l1sequencer/verifier.go new file mode 100644 index 000000000..1cbf8517a --- /dev/null +++ b/node/l1sequencer/verifier.go @@ -0,0 +1,97 @@ +package l1sequencer + +import ( + "context" + "fmt" + "sync" + "time" + + "github.com/morph-l2/go-ethereum/accounts/abi/bind" + "github.com/morph-l2/go-ethereum/common" + tmlog "github.com/tendermint/tendermint/libs/log" + + "morph-l2/bindings/bindings" +) + +const ( + // CacheTTL is the time-to-live for the sequencer verifier cache + //CacheTTL = 30 * time.Minute + CacheTTL = 10 * time.Second +) + +// SequencerVerifier verifies L1 sequencer status with caching. +// It provides IsSequencer() for checking if an address is the current sequencer. +type SequencerVerifier struct { + mutex sync.Mutex + sequencer common.Address + cacheExpiry time.Time + + caller *bindings.L1SequencerCaller + logger tmlog.Logger +} + +// NewSequencerVerifier creates a new SequencerVerifier +func NewSequencerVerifier(caller *bindings.L1SequencerCaller, logger tmlog.Logger) *SequencerVerifier { + return &SequencerVerifier{ + caller: caller, + logger: logger.With("module", "l1sequencer_verifier"), + } +} + +// flushCache refreshes the cache (caller must hold the lock) +func (c *SequencerVerifier) flushCache(ctx context.Context) error { + newSeq, err := c.caller.GetSequencer(&bind.CallOpts{Context: ctx}) + if err != nil { + return fmt.Errorf("failed to get sequencer from L1: %w", err) + } + + if c.sequencer != newSeq { + c.logger.Info("Sequencer address updated", + "old", c.sequencer.Hex(), + "new", newSeq.Hex()) + } + + c.sequencer = newSeq + c.cacheExpiry = time.Now().Add(CacheTTL) + return nil +} + +// IsSequencer checks if the given address is the current sequencer. +// It uses lazy loading: refreshes cache if expired, and retries on miss. +func (c *SequencerVerifier) IsSequencer(ctx context.Context, addr common.Address) (bool, error) { + c.mutex.Lock() + defer c.mutex.Unlock() + + // Cache expired, refresh + if time.Now().After(c.cacheExpiry) { + if err := c.flushCache(ctx); err != nil { + return false, err + } + } + + // Cache hit + if c.sequencer == addr { + return true, nil + } + + // Cache miss - maybe sequencer just updated, force refresh once + if err := c.flushCache(ctx); err != nil { + return false, err + } + + return c.sequencer == addr, nil +} + +// GetSequencer returns the cached sequencer address (refreshes if expired) +func (c *SequencerVerifier) GetSequencer(ctx context.Context) (common.Address, error) { + c.mutex.Lock() + defer c.mutex.Unlock() + + if time.Now().After(c.cacheExpiry) { + if err := c.flushCache(ctx); err != nil { + return common.Address{}, err + } + } + + return c.sequencer, nil +} diff --git a/node/sequencer/tm_node.go b/node/sequencer/tm_node.go index 6f6bf994c..b9cbffe38 100644 --- a/node/sequencer/tm_node.go +++ b/node/sequencer/tm_node.go @@ -14,11 +14,13 @@ import ( tmnode "github.com/tendermint/tendermint/node" "github.com/tendermint/tendermint/p2p" "github.com/tendermint/tendermint/proxy" + tmsequencer "github.com/tendermint/tendermint/sequencer" "github.com/tendermint/tendermint/types" "github.com/urfave/cli" node "morph-l2/node/core" "morph-l2/node/flags" + "morph-l2/node/l1sequencer" nodetypes "morph-l2/node/types" ) @@ -51,7 +53,17 @@ func LoadTmConfig(ctx *cli.Context, home string) (*config.Config, error) { return tmCfg, nil } -func SetupNode(tmCfg *config.Config, privValidator types.PrivValidator, executor *node.Executor, logger tmlog.Logger) (*tmnode.Node, error) { +// SetupNode creates a tendermint node with the given configuration. +// verifier: L1 sequencer verifier for signature verification (optional, can be nil) +// signer: sequencer signer for block signing (optional, can be nil) +func SetupNode( + tmCfg *config.Config, + privValidator types.PrivValidator, + executor *node.Executor, + logger tmlog.Logger, + verifier *l1sequencer.SequencerVerifier, + signer l1sequencer.Signer, +) (*tmnode.Node, error) { nodeLogger := logger.With("module", "main") nodeKey, err := p2p.LoadOrGenNodeKey(tmCfg.NodeKeyFile()) @@ -67,7 +79,12 @@ func SetupNode(tmCfg *config.Config, privValidator types.PrivValidator, executor return nil, fmt.Errorf("failed to load bls priv key") } - //var app types.Application + // Build verifier (SequencerVerifier implements tmsequencer.SequencerVerifier interface) + var tmVerifier tmsequencer.SequencerVerifier + if verifier != nil { + tmVerifier = verifier + } + n, err := tmnode.NewNode( tmCfg, executor, @@ -79,6 +96,8 @@ func SetupNode(tmCfg *config.Config, privValidator types.PrivValidator, executor tmnode.DefaultDBProvider, tmnode.DefaultMetricsProvider(tmCfg.Instrumentation), nodeLogger, + tmVerifier, + signer, ) return n, err } diff --git a/node/sync/bridge_client.go b/node/sync/bridge_client.go index bab51c45e..e8a73abf3 100644 --- a/node/sync/bridge_client.go +++ b/node/sync/bridge_client.go @@ -24,6 +24,11 @@ type BridgeClient struct { logger tmlog.Logger } +// L1Client returns the underlying L1 client (for sharing with other services) +func (c *BridgeClient) L1Client() *ethclient.Client { + return c.l1Client +} + func NewBridgeClient(l1Client *ethclient.Client, l1MessageQueueAddress common.Address, confirmations rpc.BlockNumber, logger tmlog.Logger) (*BridgeClient, error) { logger = logger.With("module", "bridge") filter, err := bindings.NewL1MessageQueueWithGasPriceOracleFilterer(l1MessageQueueAddress, l1Client) diff --git a/node/sync/syncer.go b/node/sync/syncer.go index 9c109ac06..c9948983a 100644 --- a/node/sync/syncer.go +++ b/node/sync/syncer.go @@ -196,3 +196,11 @@ func (s *Syncer) ReadL1MessagesInRange(start, end uint64) []types.L1Message { func (s *Syncer) LatestSynced() uint64 { return s.latestSynced } + +// L1Client returns the underlying L1 client (for sharing with other services) +func (s *Syncer) L1Client() *ethclient.Client { + if s.bridgeClient != nil { + return s.bridgeClient.L1Client() + } + return nil +} diff --git a/node/types/blob.go b/node/types/blob.go index 8abbeb4c2..d4aea96fb 100644 --- a/node/types/blob.go +++ b/node/types/blob.go @@ -153,6 +153,11 @@ func DecodeTxsFromBytes(txsBytes []byte) (eth.Transactions, error) { return nil, err } innerTx = new(eth.SetCodeTx) + case eth.AltFeeTxType: + if err := binary.Read(reader, binary.BigEndian, &firstByte); err != nil { + return nil, err + } + innerTx = new(eth.AltFeeTx) default: if firstByte <= 0xf7 { // legacy tx first byte must be greater than 0xf7(247) return nil, fmt.Errorf("not supported tx type: %d", firstByte) diff --git a/node/types/retryable_client.go b/node/types/retryable_client.go index 74328e71d..2af9f6d3f 100644 --- a/node/types/retryable_client.go +++ b/node/types/retryable_client.go @@ -240,6 +240,23 @@ func (rc *RetryableClient) CodeAt(ctx context.Context, contract common.Address, return } +func (rc *RetryableClient) SetBlockTags(ctx context.Context, safeBlockHash common.Hash, finalizedBlockHash common.Hash) (err error) { + if retryErr := backoff.Retry(func() error { + respErr := rc.authClient.SetBlockTags(ctx, safeBlockHash, finalizedBlockHash) + if respErr != nil { + rc.logger.Info("failed to call SetBlockTags", "error", respErr) + if retryableError(respErr) { + return respErr + } + err = respErr + } + return nil + }, rc.b); retryErr != nil { + return retryErr + } + return +} + // currently we want every error retryable, except the DiscontinuousBlockError func retryableError(err error) bool { // return strings.Contains(err.Error(), ConnectionRefused) || diff --git a/ops/devnet-morph/devnet/__init__.py b/ops/devnet-morph/devnet/__init__.py index 4ec81c897..385a7a2a3 100644 --- a/ops/devnet-morph/devnet/__init__.py +++ b/ops/devnet-morph/devnet/__init__.py @@ -248,6 +248,7 @@ def devnet_deploy(paths, args): env_data['MORPH_ROLLUP'] = addresses['Proxy__Rollup'] env_data['RUST_LOG'] = rust_log_level env_data['Proxy__L1Staking'] = addresses['Proxy__L1Staking'] + env_data['L1_SEQUENCER_CONTRACT'] = addresses.get('Proxy__L1Sequencer', '') envfile.seek(0) for key, value in env_data.items(): envfile.write(f'{key}={value}\n') diff --git a/ops/docker-sequencer-test/docker-compose.override.yml b/ops/docker-sequencer-test/docker-compose.override.yml index 50d960e27..ac4efdd4f 100644 --- a/ops/docker-sequencer-test/docker-compose.override.yml +++ b/ops/docker-sequencer-test/docker-compose.override.yml @@ -15,8 +15,8 @@ services: morph-geth-2: image: morph-geth-test:latest - # morph-geth-3: - # image: morph-geth-test:latest + morph-geth-3: + image: morph-geth-test:latest node-0: image: morph-node-test:latest @@ -24,16 +24,32 @@ services: context: ../.. dockerfile: ops/docker-sequencer-test/Dockerfile.l2-node-test environment: - - SEQUENCER_PRIVATE_KEY=${SEQUENCER_PRIVATE_KEY:-0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80} + - MORPH_NODE_SEQUENCER_PRIVATE_KEY=0xd99870855d97327d20c666abc78588f1449b1fac76ed0c86c1afb9ce2db85f32 + - MORPH_NODE_L1_SEQUENCER_CONTRACT=${L1_SEQUENCER_CONTRACT} + - MORPH_NODE_ROLLUP_ADDRESS=${MORPH_ROLLUP:-0x6900000000000000000000000000000000000010} + node-1: image: morph-node-test:latest + environment: + - MORPH_NODE_SEQUENCER_PRIVATE_KEY=0x0890c388c3bf5e04fee1d8f3c117e5f44f435ced7baf7bfd66c10e1f3a3f4b10 + - MORPH_NODE_L1_SEQUENCER_CONTRACT=${L1_SEQUENCER_CONTRACT} + - MORPH_NODE_ROLLUP_ADDRESS=${MORPH_ROLLUP:-0x6900000000000000000000000000000000000010} + node-2: image: morph-node-test:latest + environment: + - MORPH_NODE_L1_SEQUENCER_CONTRACT=${L1_SEQUENCER_CONTRACT} + - MORPH_NODE_ROLLUP_ADDRESS=${MORPH_ROLLUP:-0x6900000000000000000000000000000000000010} + + + node-3: + image: morph-node-test:latest + environment: + - MORPH_NODE_L1_SEQUENCER_CONTRACT=${L1_SEQUENCER_CONTRACT} + - MORPH_NODE_ROLLUP_ADDRESS=${MORPH_ROLLUP:-0x6900000000000000000000000000000000000010} - # node-3: - # image: morph-node-test:latest sentry-geth-0: image: morph-geth-test:latest diff --git a/ops/docker-sequencer-test/run-test.sh b/ops/docker-sequencer-test/run-test.sh index 823ba5273..3399f2433 100755 --- a/ops/docker-sequencer-test/run-test.sh +++ b/ops/docker-sequencer-test/run-test.sh @@ -234,6 +234,7 @@ with open(env_file, 'r+') as envfile: env_data['MORPH_PORTAL'] = addresses['Proxy__L1MessageQueueWithGasPriceOracle'] env_data['MORPH_ROLLUP'] = addresses['Proxy__Rollup'] env_data['MORPH_L1STAKING'] = addresses['Proxy__L1Staking'] + env_data['L1_SEQUENCER_CONTRACT'] = addresses.get('Proxy__L1Sequencer', '') envfile.seek(0) for key, value in env_data.items(): envfile.write(f'{key}={value}\n') diff --git a/ops/l2-genesis/go.mod b/ops/l2-genesis/go.mod index c87125349..54625e1be 100644 --- a/ops/l2-genesis/go.mod +++ b/ops/l2-genesis/go.mod @@ -2,7 +2,7 @@ module morph-l2/morph-deployer go 1.24.0 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.3 require ( github.com/holiman/uint256 v1.2.4 diff --git a/ops/tools/go.mod b/ops/tools/go.mod index 5ece6f2bd..031d413b2 100644 --- a/ops/tools/go.mod +++ b/ops/tools/go.mod @@ -2,7 +2,7 @@ module morph-l2/tools go 1.24.0 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.3 require ( github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 diff --git a/ops/tools/go.sum b/ops/tools/go.sum index 7bc000407..175de8ac4 100644 --- a/ops/tools/go.sum +++ b/ops/tools/go.sum @@ -165,8 +165,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= -github.com/morph-l2/tendermint v0.3.2 h1:Gu6Uj2G6c3YP2NAKFi7A46JZaOCdD4zfZDKCjt0pDm8= -github.com/morph-l2/tendermint v0.3.2/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= +github.com/morph-l2/tendermint v0.3.3 h1:zsmzVJfKp+NuCr45ZUUY2ZJjnHAVLzwJLID6GxBR4i4= +github.com/morph-l2/tendermint v0.3.3/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= diff --git a/oracle/go.mod b/oracle/go.mod index 2c115e81a..2286651f0 100644 --- a/oracle/go.mod +++ b/oracle/go.mod @@ -2,7 +2,7 @@ module morph-l2/oracle go 1.24.0 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.3 require ( github.com/go-kit/kit v0.12.0 diff --git a/oracle/go.sum b/oracle/go.sum index e4d6c750c..15719693c 100644 --- a/oracle/go.sum +++ b/oracle/go.sum @@ -176,8 +176,8 @@ github.com/morph-l2/externalsign v0.3.1 h1:UYFDZFB0L85A4rDvuwLNBiGEi0kSmg9AZ2v8Q github.com/morph-l2/externalsign v0.3.1/go.mod h1:b6NJ4GUiiG/gcSJsp3p8ExsIs4ZdphlrVALASnVoGJE= github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= -github.com/morph-l2/tendermint v0.3.2 h1:Gu6Uj2G6c3YP2NAKFi7A46JZaOCdD4zfZDKCjt0pDm8= -github.com/morph-l2/tendermint v0.3.2/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= +github.com/morph-l2/tendermint v0.3.3 h1:zsmzVJfKp+NuCr45ZUUY2ZJjnHAVLzwJLID6GxBR4i4= +github.com/morph-l2/tendermint v0.3.3/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= diff --git a/token-price-oracle/README.md b/token-price-oracle/README.md index 4c45911d2..0fa987961 100644 --- a/token-price-oracle/README.md +++ b/token-price-oracle/README.md @@ -1,173 +1,190 @@ -# Gas Price Oracle +# Token Price Oracle -Gas Price Oracle service monitors L1 gas prices and updates the GasPriceOracle contract on L2. +Token Price Oracle service monitors token prices and updates the price ratio between tokens and ETH to L2 on-chain contracts, enabling Alt Fee Token functionality. ## Features -- **L1 Base Fee Update**: Monitors L1 base fee and blob base fee, updates to L2 -- **Scalar Update**: Calculates and updates commit scalar and blob scalar -- **Transaction Manager**: Serializes all contract updates to avoid nonce conflicts -- **Metrics Monitoring**: Exposes Prometheus metrics -- **Flags Configuration**: Uses `urfave/cli` for configuration management (supports both CLI flags and environment variables) +- **Real-time Price Monitoring**: Fetches token USD prices from exchange APIs (Bitget) +- **Price Ratio Calculation**: Computes price ratio between tokens and ETH +- **Threshold-based Updates**: Only updates on-chain when price change exceeds threshold, saving Gas +- **Batch Updates**: Updates multiple token prices in a single `batchUpdatePrices` transaction +- **Fallback Mechanism**: Supports automatic switching between multiple data sources +- **Transaction Management**: Prevents nonce conflicts, supports local and external signing +- **Prometheus Monitoring**: Provides operational metrics -## Configuration - -The service uses flags that can be set either via command line or environment variables (with `GAS_ORACLE_` prefix). - -### Required Flags - -| Flag | Env Var | Description | -| --------------------- | --------------------------- | ------------------------------- | -| `--l1-eth-rpc` | `GAS_ORACLE_L1_ETH_RPC` | L1 RPC endpoint | -| `--l2-eth-rpc` | `GAS_ORACLE_L2_ETH_RPC` | L2 RPC endpoint | -| `--l1-beacon-rpc` | `GAS_ORACLE_L1_BEACON_RPC` | L1 Beacon Chain API endpoint | -| `--l1-rollup-address` | `GAS_ORACLE_L1_ROLLUP` | L1 Rollup contract address | -| `--private-key` | `GAS_ORACLE_L2_PRIVATE_KEY` | Private key for L2 transactions | - -### Optional Flags +## Quick Start -| Flag | Env Var | Default | Description | -| ------------------------------- | ---------------------------------- | --------------- | --------------------------- | -| `--l2-gas-price-oracle-address` | `GAS_ORACLE_L2_GAS_PRICE_ORACLE` | `0x5300...0002` | L2 GasPriceOracle contract | -| `--gas-threshold` | `GAS_ORACLE_GAS_THRESHOLD` | `10` | Update threshold percentage | -| `--interval` | `GAS_ORACLE_INTERVAL` | `6s` | Base fee update interval | -| `--overhead-interval` | `GAS_ORACLE_OVERHEAD_INTERVAL` | `10` | Scalar update frequency | -| `--txn-per-batch` | `GAS_ORACLE_TXN_PER_BATCH` | `50` | Expected txs per batch | -| `--log-level` | `GAS_ORACLE_LOG_LEVEL` | `info` | Log level | -| `--log-filename` | `GAS_ORACLE_LOG_FILENAME` | - | Log file path | -| `--metrics-server-enable` | `GAS_ORACLE_METRICS_SERVER_ENABLE` | `false` | Enable metrics server | -| `--metrics-hostname` | `GAS_ORACLE_METRICS_HOSTNAME` | `0.0.0.0` | Metrics server host | -| `--metrics-port` | `GAS_ORACLE_METRICS_PORT` | `6060` | Metrics server port | - -## Usage - -### Command Line +### Environment Variables (Local Signing Mode) ```bash -./bin/token-price-oracle \ - --l1-eth-rpc https://ethereum-rpc.com \ - --l2-eth-rpc https://morph-l2-rpc.com \ - --l1-beacon-rpc https://beacon-api.com \ - --l1-rollup-address 0x... \ - --private-key 0x... \ - --metrics-server-enable \ - --log-level debug +# Required +export TOKEN_PRICE_ORACLE_L2_ETH_RPC="https://rpc.morphl2.io" +export TOKEN_PRICE_ORACLE_PRIVATE_KEY="0x..." # Required for local signing only +export TOKEN_PRICE_ORACLE_BITGET_API_BASE_URL="https://api.bitget.com" +export TOKEN_PRICE_ORACLE_TOKEN_MAPPING_BITGET="1:BTCUSDT,2:ETHUSDT" + +# Optional +export TOKEN_PRICE_ORACLE_PRICE_UPDATE_INTERVAL="1m" +export TOKEN_PRICE_ORACLE_PRICE_THRESHOLD="100" # 1% (100 bps) +export TOKEN_PRICE_ORACLE_METRICS_SERVER_ENABLE="true" +export TOKEN_PRICE_ORACLE_METRICS_PORT="6060" +export TOKEN_PRICE_ORACLE_LOG_LEVEL="info" ``` -### Environment Variables - -```bash -export GAS_ORACLE_L1_ETH_RPC="https://ethereum-rpc.com" -export GAS_ORACLE_L2_ETH_RPC="https://morph-l2-rpc.com" -export GAS_ORACLE_L1_BEACON_RPC="https://beacon-api.com" -export GAS_ORACLE_L1_ROLLUP="0x..." -export GAS_ORACLE_L2_PRIVATE_KEY="0x..." -export GAS_ORACLE_METRICS_SERVER_ENABLE=true -export GAS_ORACLE_LOG_LEVEL=info - -./bin/token-price-oracle -``` +> **Note**: `PRIVATE_KEY` is only required when using local signing mode. For production, use [External Signing](#external-signing-recommended-for-production) instead. -## Build and Run - -**Note**: This project uses Go workspace and depends on `../bindings` module. +### Build and Run ```bash # Build make build # Run -make run - -# Test -make test +./build/bin/token-price-oracle -# Test Bitget price feed (requires network) -go test ./client -run TestBitgetPriceFeed -v - -# Docker +# Or use Docker make docker-build docker run -d \ - -e GAS_ORACLE_L1_ETH_RPC="..." \ - -e GAS_ORACLE_L2_ETH_RPC="..." \ - -e GAS_ORACLE_L1_BEACON_RPC="..." \ - -e GAS_ORACLE_L1_ROLLUP="0x..." \ - -e GAS_ORACLE_L2_PRIVATE_KEY="0x..." \ + -e TOKEN_PRICE_ORACLE_L2_ETH_RPC="..." \ + -e TOKEN_PRICE_ORACLE_PRIVATE_KEY="..." \ + -e TOKEN_PRICE_ORACLE_BITGET_API_BASE_URL="..." \ + -e TOKEN_PRICE_ORACLE_TOKEN_MAPPING_BITGET="..." \ morph/token-price-oracle:latest ``` -## Monitoring +## Configuration -When metrics server is enabled, it exposes metrics at `:/metrics`: +### Required (All Modes) -- `l1_base_fee` - L1 base fee (Gwei) -- `l1_base_fee_on_l2` - L1 base fee on L2 -- `l1_blob_base_fee_on_l2` - L1 blob base fee on L2 -- `commit_scalar` - Commit scalar value -- `blob_scalar` - Blob scalar value -- `txn_per_batch` - Transactions per batch -- `gas_oracle_owner_balance` - Oracle account balance -- `base_fee_update_count` - Total base fee updates -- `scalar_update_count` - Total scalar updates -- `update_errors_total` - Update errors by type +| Environment Variable | Description | +|---------------------|-------------| +| `TOKEN_PRICE_ORACLE_L2_ETH_RPC` | L2 node RPC endpoint | +| `TOKEN_PRICE_ORACLE_BITGET_API_BASE_URL` | Bitget API base URL | +| `TOKEN_PRICE_ORACLE_TOKEN_MAPPING_BITGET` | TokenID to trading pair mapping | -Health check endpoint: `:/health` +### Required (Local Signing Mode Only) -## Architecture +| Environment Variable | Description | +|---------------------|-------------| +| `TOKEN_PRICE_ORACLE_PRIVATE_KEY` | Signing private key (not needed if using external signing) | -``` -gas-price-oracle/ -├── cmd/ # Main entry point -├── flags/ # CLI flags definitions -├── config/ # Configuration from flags -├── updater/ # Update implementations -│ ├── basefee.go # Base fee updater -│ ├── scalar.go # Scalar updater -│ └── tx_manager.go # Transaction manager (prevents nonce conflicts) -├── client/ # Client wrappers -├── calc/ # Calculation logic -└── metrics/ # Prometheus metrics +### Optional + +| Environment Variable | Default | Description | +|---------------------|---------|-------------| +| `TOKEN_PRICE_ORACLE_PRICE_UPDATE_INTERVAL` | `1m` | Price update interval | +| `TOKEN_PRICE_ORACLE_PRICE_THRESHOLD` | `100` | Update threshold (basis points, 100=1%) | +| `TOKEN_PRICE_ORACLE_PRICE_FEED_PRIORITY` | `bitget` | Price feed priority | +| `TOKEN_PRICE_ORACLE_METRICS_SERVER_ENABLE` | `false` | Enable metrics server | +| `TOKEN_PRICE_ORACLE_METRICS_HOSTNAME` | `0.0.0.0` | Metrics server hostname | +| `TOKEN_PRICE_ORACLE_METRICS_PORT` | `6060` | Metrics server port | +| `TOKEN_PRICE_ORACLE_LOG_LEVEL` | `info` | Log level | +| `TOKEN_PRICE_ORACLE_LOG_FILENAME` | - | Log file path | + +### External Signing (Recommended for Production) + +| Environment Variable | Description | +|---------------------|-------------| +| `TOKEN_PRICE_ORACLE_EXTERNAL_SIGN` | Enable external signing (`true`/`false`) | +| `TOKEN_PRICE_ORACLE_EXTERNAL_SIGN_ADDRESS` | Signing account address | +| `TOKEN_PRICE_ORACLE_EXTERNAL_SIGN_APPID` | External signing service AppID | +| `TOKEN_PRICE_ORACLE_EXTERNAL_SIGN_CHAIN` | Chain identifier | +| `TOKEN_PRICE_ORACLE_EXTERNAL_SIGN_URL` | External signing service URL | +| `TOKEN_PRICE_ORACLE_EXTERNAL_SIGN_RSA_PRIV` | RSA private key (PEM format) | + +## Price Calculation -Uses: ../bindings/bindings (project root contract bindings) +### Price Ratio Formula + +``` +priceRatio = tokenScale × tokenPriceUSD × 10^(18 - tokenDecimals) / ethPriceUSD ``` -## Key Components +### Threshold -### Transaction Manager +Threshold is specified in basis points (bps): +- 1 bps = 0.01% +- 100 bps = 1% +- 10000 bps = 100% -All contract updates are serialized through `TxManager` to prevent nonce conflicts: +On-chain prices are only updated when price change exceeds the threshold, avoiding unnecessary Gas costs. -- Holds a mutex to ensure only one transaction is sent at a time -- Manages nonce retrieval and transaction confirmation -- Used by both `BaseFeeUpdater` and `ScalarUpdater` +## Monitoring -### Base Fee Updater +### Prometheus Metrics -- Runs on a fixed interval (default 6s) -- Fetches L1 base fee and blob base fee -- Updates L2 contract when threshold is exceeded +When metrics server is enabled, access `http://:/metrics`: -### Scalar Updater +| Metric | Type | Description | +|--------|------|-------------| +| `last_successful_update_timestamp` | Gauge | Last successful update timestamp | +| `updates_total{type="updated"}` | Counter | Actual update count | +| `updates_total{type="skipped"}` | Counter | Skipped update count | +| `update_errors_total{type="price"}` | Counter | Update error count | +| `account_balance_eth` | Gauge | Oracle account balance | -- Runs every N base fee update cycles (default 10) -- Reads `CommitBatch` events from L1 Rollup -- Calculates commit and blob scalars -- Updates L2 contract when necessary +### Health Check -### Blob Processing +```bash +curl http://:/health +``` -Blob data processing is partially implemented (interface defined in `calc/blob.go`). The actual blob parsing and L2 transaction extraction is deferred for future implementation. +### Suggested Alert Rules + +```yaml +# Price not updated for a long time +- alert: TokenPriceOracleStalled + expr: time() - last_successful_update_timestamp > 300 + for: 1m + labels: + severity: critical + +# Low account balance +- alert: TokenPriceOracleLowBalance + expr: account_balance_eth < 0.1 + for: 5m + labels: + severity: warning +``` + +## Project Structure -## Testing +``` +token-price-oracle/ +├── cmd/ # Entry point +├── flags/ # CLI flags definition +├── config/ # Configuration loading +├── client/ # Client wrappers +│ ├── l2_client.go # L2 chain client +│ ├── price_feed.go # Price feed interface +│ ├── bitget_sdk.go # Bitget API client +│ └── sign.go # External signing +├── updater/ # Update logic +│ ├── token_price.go # Price updater +│ ├── tx_manager.go # Transaction manager +│ └── factory.go # Factory methods +├── metrics/ # Prometheus metrics +└── README.md # This document +``` + +## Development ```bash -# Run all tests -go test ./... +# Run tests +make test # Test Bitget price feed (requires network) go test ./client -run TestBitgetPriceFeed -v -# Skip integration tests -go test ./... -short +# Format code +go fmt ./... + +# Local run +cp env.example .env +# Edit .env configuration +source .env && make run ``` +## License + +MIT diff --git a/token-price-oracle/client/l2_client.go b/token-price-oracle/client/l2_client.go index 25b1b7f63..a69ea044c 100644 --- a/token-price-oracle/client/l2_client.go +++ b/token-price-oracle/client/l2_client.go @@ -5,21 +5,27 @@ import ( "fmt" "math/big" + "github.com/morph-l2/externalsign" "github.com/morph-l2/go-ethereum/accounts/abi/bind" "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/crypto" "github.com/morph-l2/go-ethereum/ethclient" + "github.com/morph-l2/go-ethereum/log" + "morph-l2/token-price-oracle/config" ) // L2Client wraps L2 chain client type L2Client struct { - client *ethclient.Client - chainID *big.Int - opts *bind.TransactOpts + client *ethclient.Client + chainID *big.Int + opts *bind.TransactOpts + signer *Signer + externalSign bool } // NewL2Client creates new L2 client -func NewL2Client(rpcURL string, privateKey string) (*L2Client, error) { +func NewL2Client(rpcURL string, cfg *config.Config) (*L2Client, error) { client, err := ethclient.Dial(rpcURL) if err != nil { return nil, fmt.Errorf("failed to dial L2 RPC: %w", err) @@ -38,27 +44,75 @@ func NewL2Client(rpcURL string, privateKey string) (*L2Client, error) { return nil, fmt.Errorf("failed to get chain ID: %w", err) } - // Parse private key (remove 0x prefix if present) - privateKeyHex := privateKey - if len(privateKey) > 2 && privateKey[:2] == "0x" { - privateKeyHex = privateKey[2:] - } - key, err := crypto.HexToECDSA(privateKeyHex) - if err != nil { - return nil, fmt.Errorf("failed to parse private key: %w", err) + l2Client := &L2Client{ + client: client, + chainID: chainID, + externalSign: cfg.ExternalSign, } - // Create transaction options - opts, err := bind.NewKeyedTransactorWithChainID(key, chainID) - if err != nil { - return nil, fmt.Errorf("failed to create transactor: %w", err) + if cfg.ExternalSign { + // External sign mode + rsaPriv, err := externalsign.ParseRsaPrivateKey(cfg.ExternalSignRsaPriv) + if err != nil { + return nil, fmt.Errorf("failed to parse RSA private key: %w", err) + } + + l2Client.signer = NewSigner( + true, + cfg.ExternalSignAppid, + rsaPriv, + cfg.ExternalSignAddress, + cfg.ExternalSignChain, + cfg.ExternalSignUrl, + chainID, + ) + + fromAddr := common.HexToAddress(cfg.ExternalSignAddress) + ethSigner := types.NewLondonSigner(chainID) + + // Create opts with a placeholder signer for building transactions. + // This allows contract bindings to construct transaction objects so we can + // extract the calldata and target address. The placeholder signature is never + // actually broadcast - the real signing happens via external signer. + // SAFETY: NoSend is always true, and tx_manager.go only extracts To() and Data() + // from the placeholder tx, then creates a new properly signed transaction. + l2Client.opts = &bind.TransactOpts{ + From: fromAddr, + NoSend: true, // CRITICAL: Must always be true for external signing mode + Signer: func(address common.Address, tx *types.Transaction) (*types.Transaction, error) { + // Placeholder signer - returns tx with dummy signature to satisfy bind package. + // This tx is NEVER sent; only used to extract calldata for external signing. + return tx.WithSignature(ethSigner, make([]byte, 65)) + }, + } + + log.Info("L2 client initialized with external signing", + "address", cfg.ExternalSignAddress, + "chainID", chainID) + } else { + // Local private key mode + privateKeyHex := cfg.PrivateKey + if len(cfg.PrivateKey) > 2 && cfg.PrivateKey[:2] == "0x" { + privateKeyHex = cfg.PrivateKey[2:] + } + key, err := crypto.HexToECDSA(privateKeyHex) + if err != nil { + return nil, fmt.Errorf("failed to parse private key: %w", err) + } + + // Create transaction options + opts, err := bind.NewKeyedTransactorWithChainID(key, chainID) + if err != nil { + return nil, fmt.Errorf("failed to create transactor: %w", err) + } + l2Client.opts = opts + + log.Info("L2 client initialized with local signing", + "address", opts.From.Hex(), + "chainID", chainID) } - return &L2Client{ - client: client, - chainID: chainID, - opts: opts, - }, nil + return l2Client, nil } // Close closes client connection @@ -98,3 +152,18 @@ func (c *L2Client) GetBalance(ctx context.Context, address common.Address) (*big func (c *L2Client) WalletAddress() common.Address { return c.opts.From } + +// IsExternalSign returns whether external signing is enabled +func (c *L2Client) IsExternalSign() bool { + return c.externalSign +} + +// GetSigner returns the external signer (nil if using local signing) +func (c *L2Client) GetSigner() *Signer { + return c.signer +} + +// GetChainID returns the chain ID +func (c *L2Client) GetChainID() *big.Int { + return c.chainID +} diff --git a/token-price-oracle/client/sign.go b/token-price-oracle/client/sign.go new file mode 100644 index 000000000..340e32140 --- /dev/null +++ b/token-price-oracle/client/sign.go @@ -0,0 +1,158 @@ +package client + +import ( + "context" + "crypto/rsa" + "fmt" + "math/big" + + "github.com/morph-l2/externalsign" + "github.com/morph-l2/go-ethereum" + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/core/types" + "github.com/morph-l2/go-ethereum/log" +) + +// Signer handles transaction signing with support for both local and external signing +type Signer struct { + externalSign bool + externalSigner *externalsign.ExternalSign + externalSignUrl string + externalSignAddress common.Address + chainID *big.Int + signer types.Signer +} + +// NewSigner creates a new Signer instance +func NewSigner( + externalSign bool, + externalSignAppid string, + externalRsaPriv *rsa.PrivateKey, + externalSignAddress string, + externalSignChain string, + externalSignUrl string, + chainID *big.Int, +) *Signer { + signer := types.NewLondonSigner(chainID) + + s := &Signer{ + externalSign: externalSign, + externalSignUrl: externalSignUrl, + externalSignAddress: common.HexToAddress(externalSignAddress), + chainID: chainID, + signer: signer, + } + + if externalSign { + s.externalSigner = externalsign.NewExternalSign( + externalSignAppid, + externalRsaPriv, + externalSignAddress, + externalSignChain, + signer, + ) + log.Info("External signer initialized", + "address", externalSignAddress, + "chain", externalSignChain) + } + + return s +} + +// Sign signs a transaction using either external or local signing +func (s *Signer) Sign(tx *types.Transaction) (*types.Transaction, error) { + if !s.externalSign { + return nil, fmt.Errorf("local signing not supported in Signer, use bind.TransactOpts") + } + + signedTx, err := s.externalSigner.RequestSign(s.externalSignUrl, tx) + if err != nil { + return nil, fmt.Errorf("external sign request failed: %w", err) + } + return signedTx, nil +} + +// IsExternalSign returns whether external signing is enabled +func (s *Signer) IsExternalSign() bool { + return s.externalSign +} + +// GetFromAddress returns the signer's address +func (s *Signer) GetFromAddress() common.Address { + return s.externalSignAddress +} + +// CreateAndSignTx creates a new transaction and signs it +func (s *Signer) CreateAndSignTx( + ctx context.Context, + client *L2Client, + to common.Address, + callData []byte, +) (*types.Transaction, error) { + from := s.externalSignAddress + + nonce, err := client.GetClient().NonceAt(ctx, from, nil) + if err != nil { + return nil, fmt.Errorf("failed to get nonce: %w", err) + } + + // Get gas tip cap + tip, err := client.GetClient().SuggestGasTipCap(ctx) + if err != nil { + return nil, fmt.Errorf("failed to get gas tip cap: %w", err) + } + + // Get base fee from latest block + head, err := client.GetClient().HeaderByNumber(ctx, nil) + if err != nil { + return nil, fmt.Errorf("failed to get block header: %w", err) + } + + var gasFeeCap *big.Int + if head.BaseFee != nil { + gasFeeCap = new(big.Int).Add( + tip, + new(big.Int).Mul(head.BaseFee, big.NewInt(2)), + ) + } else { + gasFeeCap = new(big.Int).Set(tip) + } + + // Estimate gas + gas, err := client.GetClient().EstimateGas(ctx, ethereum.CallMsg{ + From: from, + To: &to, + GasFeeCap: gasFeeCap, + GasTipCap: tip, + Data: callData, + }) + if err != nil { + return nil, fmt.Errorf("failed to estimate gas: %w", err) + } + + // Add 50% buffer to gas estimate + gas = gas * 3 / 2 + + // Create transaction + tx := types.NewTx(&types.DynamicFeeTx{ + ChainID: s.chainID, + Nonce: nonce, + GasTipCap: tip, + GasFeeCap: gasFeeCap, + Gas: gas, + To: &to, + Data: callData, + }) + + log.Info("Created transaction for signing", + "from", from.Hex(), + "to", to.Hex(), + "nonce", nonce, + "gas", gas, + "gasFeeCap", gasFeeCap, + "gasTipCap", tip) + + // Sign transaction + return s.Sign(tx) +} + diff --git a/token-price-oracle/cmd/main.go b/token-price-oracle/cmd/main.go index f5cf155a1..f2ff3c841 100644 --- a/token-price-oracle/cmd/main.go +++ b/token-price-oracle/cmd/main.go @@ -104,7 +104,7 @@ func Main(cliCtx *cli.Context) error { } // Create L2 client - l2Client, err := client.NewL2Client(cfg.L2RPC, cfg.PrivateKey) + l2Client, err := client.NewL2Client(cfg.L2RPC, cfg) if err != nil { return fmt.Errorf("failed to create L2 client: %w", err) } diff --git a/token-price-oracle/config/config.go b/token-price-oracle/config/config.go index 9420fbb77..c66b69e9b 100644 --- a/token-price-oracle/config/config.go +++ b/token-price-oracle/config/config.go @@ -65,6 +65,14 @@ type Config struct { BitgetAPIBaseURL string // Bitget API base URL BinanceAPIBaseURL string // Binance API base URL + // External sign + ExternalSign bool + ExternalSignAddress string + ExternalSignAppid string + ExternalSignChain string + ExternalSignUrl string + ExternalSignRsaPriv string + // Metrics MetricsServerEnable bool MetricsHostname string @@ -85,6 +93,14 @@ func LoadConfig(ctx *cli.Context) (*Config, error) { L2RPC: ctx.String(flags.L2EthRPCFlag.Name), PrivateKey: ctx.String(flags.PrivateKeyFlag.Name), + // External sign + ExternalSign: ctx.Bool(flags.ExternalSignFlag.Name), + ExternalSignAddress: ctx.String(flags.ExternalSignAddressFlag.Name), + ExternalSignAppid: ctx.String(flags.ExternalSignAppidFlag.Name), + ExternalSignChain: ctx.String(flags.ExternalSignChainFlag.Name), + ExternalSignUrl: ctx.String(flags.ExternalSignUrlFlag.Name), + ExternalSignRsaPriv: ctx.String(flags.ExternalSignRsaPrivFlag.Name), + MetricsServerEnable: ctx.Bool(flags.MetricsServerEnableFlag.Name), MetricsHostname: ctx.String(flags.MetricsHostnameFlag.Name), MetricsPort: ctx.Uint64(flags.MetricsPortFlag.Name), @@ -208,6 +224,26 @@ func LoadConfig(ctx *cli.Context) (*Config, error) { } } + // Validate external sign config + if cfg.ExternalSign { + if cfg.ExternalSignAddress == "" || cfg.ExternalSignUrl == "" || + cfg.ExternalSignAppid == "" || cfg.ExternalSignChain == "" || + cfg.ExternalSignRsaPriv == "" { + return nil, fmt.Errorf("external sign is enabled but missing required config: address=%s, url=%s, appid=%s, chain=%s, rsa_priv_set=%t", + cfg.ExternalSignAddress, cfg.ExternalSignUrl, cfg.ExternalSignAppid, cfg.ExternalSignChain, cfg.ExternalSignRsaPriv != "") + } + + // Validate address format + if !common.IsHexAddress(cfg.ExternalSignAddress) { + return nil, fmt.Errorf("invalid external sign address format: %s", cfg.ExternalSignAddress) + } + } else { + // If not using external sign, private key is required + if cfg.PrivateKey == "" { + return nil, fmt.Errorf("private key is required when external sign is not enabled") + } + } + return cfg, nil } diff --git a/token-price-oracle/flags/flags.go b/token-price-oracle/flags/flags.go index 5cd598531..785783e15 100644 --- a/token-price-oracle/flags/flags.go +++ b/token-price-oracle/flags/flags.go @@ -22,10 +22,9 @@ var ( } PrivateKeyFlag = cli.StringFlag{ - Name: "private-key", - Usage: "The private key to use for sending transactions to L2", - Required: true, - EnvVar: prefixEnvVar("PRIVATE_KEY"), + Name: "private-key", + Usage: "The private key to use for sending transactions to L2 (not required if external-sign is enabled)", + EnvVar: prefixEnvVar("PRIVATE_KEY"), } /* Optional Flags */ @@ -140,6 +139,43 @@ var ( Value: 6060, EnvVar: prefixEnvVar("METRICS_PORT"), } + + // External sign flags + ExternalSignFlag = cli.BoolFlag{ + Name: "external-sign", + Usage: "Enable external sign", + EnvVar: prefixEnvVar("EXTERNAL_SIGN"), + } + + ExternalSignAddressFlag = cli.StringFlag{ + Name: "external-sign-address", + Usage: "The address of the external signer", + EnvVar: prefixEnvVar("EXTERNAL_SIGN_ADDRESS"), + } + + ExternalSignAppidFlag = cli.StringFlag{ + Name: "external-sign-appid", + Usage: "The appid for external sign", + EnvVar: prefixEnvVar("EXTERNAL_SIGN_APPID"), + } + + ExternalSignChainFlag = cli.StringFlag{ + Name: "external-sign-chain", + Usage: "The chain identifier for external sign", + EnvVar: prefixEnvVar("EXTERNAL_SIGN_CHAIN"), + } + + ExternalSignUrlFlag = cli.StringFlag{ + Name: "external-sign-url", + Usage: "The URL of the external sign service", + EnvVar: prefixEnvVar("EXTERNAL_SIGN_URL"), + } + + ExternalSignRsaPrivFlag = cli.StringFlag{ + Name: "external-sign-rsa-priv", + Usage: "The RSA private key for external sign", + EnvVar: prefixEnvVar("EXTERNAL_SIGN_RSA_PRIV"), + } ) var requiredFlags = []cli.Flag{ @@ -166,6 +202,14 @@ var optionalFlags = []cli.Flag{ MetricsServerEnableFlag, MetricsHostnameFlag, MetricsPortFlag, + + // External sign + ExternalSignFlag, + ExternalSignAddressFlag, + ExternalSignAppidFlag, + ExternalSignChainFlag, + ExternalSignUrlFlag, + ExternalSignRsaPrivFlag, } // Flags contains the list of configuration options available to the binary. diff --git a/token-price-oracle/go.mod b/token-price-oracle/go.mod index 771a77156..135e77688 100644 --- a/token-price-oracle/go.mod +++ b/token-price-oracle/go.mod @@ -8,6 +8,7 @@ replace ( ) require ( + github.com/morph-l2/externalsign v0.3.1 github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 github.com/prometheus/client_golang v1.17.0 github.com/sirupsen/logrus v1.9.3 @@ -35,6 +36,7 @@ require ( github.com/go-kit/kit v0.12.0 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-resty/resty/v2 v2.13.1 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect @@ -57,7 +59,6 @@ require ( github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect diff --git a/token-price-oracle/go.sum b/token-price-oracle/go.sum index 933430e9a..bd174e5ae 100644 --- a/token-price-oracle/go.sum +++ b/token-price-oracle/go.sum @@ -67,6 +67,8 @@ github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KE github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= +github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= @@ -143,6 +145,8 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/morph-l2/externalsign v0.3.1 h1:UYFDZFB0L85A4rDvuwLNBiGEi0kSmg9AZ2v8Q5O4dQo= +github.com/morph-l2/externalsign v0.3.1/go.mod h1:b6NJ4GUiiG/gcSJsp3p8ExsIs4ZdphlrVALASnVoGJE= github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -233,24 +237,35 @@ github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3C github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ= github.com/urfave/cli v1.22.17/go.mod h1:b0ht0aqgH/6pBYzzxURyrM4xXNgsoT/n2ZzwQiEhNVo= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -259,16 +274,26 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= @@ -276,6 +301,8 @@ golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/token-price-oracle/updater/tx_manager.go b/token-price-oracle/updater/tx_manager.go index 87a3c1dcf..ebed49395 100644 --- a/token-price-oracle/updater/tx_manager.go +++ b/token-price-oracle/updater/tx_manager.go @@ -33,6 +33,14 @@ func (m *TxManager) SendTransaction(ctx context.Context, txFunc func(*bind.Trans m.mu.Lock() defer m.mu.Unlock() + if m.l2Client.IsExternalSign() { + return m.sendWithExternalSign(ctx, txFunc) + } + return m.sendWithLocalSign(ctx, txFunc) +} + +// sendWithLocalSign sends transaction using local private key signing +func (m *TxManager) sendWithLocalSign(ctx context.Context, txFunc func(*bind.TransactOpts) (*types.Transaction, error)) (*types.Receipt, error) { fromAddr := m.l2Client.WalletAddress() // Check if there are pending transactions by comparing nonces @@ -84,7 +92,7 @@ func (m *TxManager) SendTransaction(ctx context.Context, txFunc func(*bind.Trans return nil, err } - log.Info("Transaction sent", + log.Info("Transaction sent (local sign)", "tx_hash", tx.Hash().Hex(), "nonce", tx.Nonce(), "gas_limit", tx.Gas()) @@ -101,6 +109,90 @@ func (m *TxManager) SendTransaction(ctx context.Context, txFunc func(*bind.Trans return receipt, nil } +// sendWithExternalSign sends transaction using external signing service +func (m *TxManager) sendWithExternalSign(ctx context.Context, txFunc func(*bind.TransactOpts) (*types.Transaction, error)) (*types.Receipt, error) { + signer := m.l2Client.GetSigner() + if signer == nil { + return nil, fmt.Errorf("external signer is not initialized") + } + + fromAddr := m.l2Client.WalletAddress() + + // Check if there are pending transactions by comparing nonces + confirmedNonce, err := m.l2Client.GetClient().NonceAt(ctx, fromAddr, nil) + if err != nil { + return nil, fmt.Errorf("failed to get confirmed nonce: %w", err) + } + + pendingNonce, err := m.l2Client.GetClient().PendingNonceAt(ctx, fromAddr) + if err != nil { + return nil, fmt.Errorf("failed to get pending nonce: %w", err) + } + + if pendingNonce > confirmedNonce { + // There are pending transactions, don't send new one + log.Warn("Found pending transactions, skipping this round", + "address", fromAddr.Hex(), + "confirmed_nonce", confirmedNonce, + "pending_nonce", pendingNonce, + "pending_count", pendingNonce-confirmedNonce) + return nil, fmt.Errorf("pending transactions exist (confirmed: %d, pending: %d)", confirmedNonce, pendingNonce) + } + + log.Info("No pending transactions, proceeding to send", + "address", fromAddr.Hex(), + "nonce", confirmedNonce) + + // Get transaction options (returns a copy) with NoSend=true to get calldata + auth := m.l2Client.GetOpts() + auth.Context = ctx + auth.NoSend = true + auth.GasLimit = 0 + + // Call txFunc to get the transaction (this gives us the calldata and to address) + tx, err := txFunc(auth) + if err != nil { + return nil, fmt.Errorf("failed to build transaction: %w", err) + } + + // Get the target contract address and calldata from the unsigned tx + if tx.To() == nil { + return nil, fmt.Errorf("contract creation transactions are not supported") + } + toAddr := *tx.To() + callData := tx.Data() + + log.Info("Building external sign transaction", + "to", toAddr.Hex(), + "calldata_len", len(callData)) + + // Create and sign transaction using external signer + signedTx, err := signer.CreateAndSignTx(ctx, m.l2Client, toAddr, callData) + if err != nil { + return nil, fmt.Errorf("failed to create and sign transaction: %w", err) + } + + // Send the signed transaction + err = m.l2Client.GetClient().SendTransaction(ctx, signedTx) + if err != nil { + return nil, fmt.Errorf("failed to send signed transaction: %w", err) + } + + log.Info("Transaction sent (external sign)", + "tx_hash", signedTx.Hash().Hex(), + "gas_limit", signedTx.Gas()) + + // Wait for transaction to be mined with custom timeout and retry logic + receipt, err := m.waitForReceipt(ctx, signedTx.Hash(), 60*time.Second, 2*time.Second) + if err != nil { + log.Error("Failed to wait for transaction receipt", + "tx_hash", signedTx.Hash().Hex(), + "error", err) + return nil, err + } + return receipt, nil +} + // waitForReceipt waits for a transaction receipt with timeout and custom polling interval func (m *TxManager) waitForReceipt(ctx context.Context, txHash common.Hash, timeout, pollInterval time.Duration) (*types.Receipt, error) { deadline := time.Now().Add(timeout) diff --git a/tx-submitter/go.mod b/tx-submitter/go.mod index 546e3b215..6b1e3cb31 100644 --- a/tx-submitter/go.mod +++ b/tx-submitter/go.mod @@ -2,7 +2,7 @@ module morph-l2/tx-submitter go 1.24.0 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.3 require ( github.com/consensys/gnark-crypto v0.16.0 @@ -13,7 +13,6 @@ require ( github.com/prometheus/client_golang v1.17.0 github.com/stretchr/testify v1.10.0 github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a - github.com/tendermint/tendermint v0.35.9 github.com/urfave/cli v1.22.17 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) @@ -34,13 +33,14 @@ require ( github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect github.com/ethereum/go-ethereum v1.10.26 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect - github.com/go-kit/log v0.2.1 // indirect + github.com/go-kit/kit v0.12.0 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-resty/resty/v2 v2.13.1 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.1 // indirect github.com/hashicorp/go-bexpr v0.1.13 // indirect @@ -57,7 +57,6 @@ require ( github.com/mitchellh/pointerstructure v1.2.1 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.5.0 // indirect @@ -68,7 +67,6 @@ require ( github.com/rjeczalik/notify v0.9.3 // indirect github.com/rs/cors v1.11.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/scroll-tech/zktrie v0.8.4 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/status-im/keycard-go v0.3.2 // indirect diff --git a/tx-submitter/go.sum b/tx-submitter/go.sum index e98ef3ac1..63d152c58 100644 --- a/tx-submitter/go.sum +++ b/tx-submitter/go.sum @@ -165,8 +165,6 @@ github.com/morph-l2/externalsign v0.3.1 h1:UYFDZFB0L85A4rDvuwLNBiGEi0kSmg9AZ2v8Q github.com/morph-l2/externalsign v0.3.1/go.mod h1:b6NJ4GUiiG/gcSJsp3p8ExsIs4ZdphlrVALASnVoGJE= github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= -github.com/morph-l2/tendermint v0.3.2 h1:Gu6Uj2G6c3YP2NAKFi7A46JZaOCdD4zfZDKCjt0pDm8= -github.com/morph-l2/tendermint v0.3.2/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= @@ -187,9 +185,6 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 h1:jik8PHtAIsPlCRJjJzl4udgEf7hawInF9texMeO2jrU= -github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -224,8 +219,6 @@ github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= -github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/scroll-tech/zktrie v0.8.4 h1:UagmnZ4Z3ITCk+aUq9NQZJNAwnWl4gSxsLb2Nl7IgRE= github.com/scroll-tech/zktrie v0.8.4/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= diff --git a/tx-submitter/services/rollup.go b/tx-submitter/services/rollup.go index 818dce38a..caa5471a4 100644 --- a/tx-submitter/services/rollup.go +++ b/tx-submitter/services/rollup.go @@ -19,13 +19,11 @@ import ( "github.com/morph-l2/go-ethereum/core" ethtypes "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/crypto" - "github.com/morph-l2/go-ethereum/crypto/bls12381" "github.com/morph-l2/go-ethereum/crypto/kzg4844" "github.com/morph-l2/go-ethereum/eth" "github.com/morph-l2/go-ethereum/log" "github.com/morph-l2/go-ethereum/params" "github.com/morph-l2/go-ethereum/rpc" - "github.com/tendermint/tendermint/blssignatures" "morph-l2/bindings/bindings" "morph-l2/tx-submitter/constants" @@ -1240,19 +1238,11 @@ func (r *Rollup) buildSignatureInput(batch *eth.RPCRollupBatch) (*bindings.IRoll return nil, fmt.Errorf("invalid batch signature") } signers := make([]common.Address, len(blsSignatures)) - sigs := make([]blssignatures.Signature, 0) for i, bz := range blsSignatures { if len(bz.Signature) > 0 { - sig, err := blssignatures.SignatureFromBytes(bz.Signature) - if err != nil { - return nil, err - } - sigs = append(sigs, sig) signers[i] = bz.Signer } } - aggregatedSig := blssignatures.AggregateSignatures(sigs) - blsSignature := bls12381.NewG1().EncodePoint(aggregatedSig) // query bitmap of signers bm, err := r.Staking.GetStakersBitmap(nil, signers) @@ -1266,7 +1256,7 @@ func (r *Rollup) buildSignatureInput(batch *eth.RPCRollupBatch) (*bindings.IRoll sigData := bindings.IRollupBatchSignatureInput{ SignedSequencersBitmap: bm, SequencerSets: batch.CurrentSequencerSetBytes, - Signature: blsSignature, + Signature: []byte("0x"), } return &sigData, nil }