Commit ef29d8a5 authored by Maurelian's avatar Maurelian Committed by GitHub

bedrock: Make portal upgradeable (#2825)

* bedrock: Make portal upgradeable

* bedrock: rebuild bindings and snapshot

* bedrock: update portal storage layout

* bedrock: Test oracle behind proxy

--wip--

* bedrock: Test portal behind a proxy

* bedrock: Set l2Sender in initialize

* bedrock: workarounds for forge test overflow bug

* bedrock: reorder inheritance in portal

This shifts the order of inheritance so that the initializable
values are in the first slot of the portal, which is consistent with
all other contracts we have that inherit from initializable

* Revert "bedrock: workarounds for forge test overflow bug"

Forge seems to be working again!?

This reverts commit bb8cdf2f3ecce1456c01e668f36b1429e02934d1.

* bedrock: Make ResourceMetering non-abstract

* bedrock: Add test for storage access post upgrade

* chore: update gas snapshot and bindings
parent 5c3b4bfa
---
'@eth-optimism/contracts-bedrock': patch
---
Make the Portal upgradeable
......@@ -38,8 +38,8 @@ type WithdrawalVerifierOutputRootProof struct {
// OptimismPortalMetaData contains all meta data concerning the OptimismPortal contract.
var OptimismPortalMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"_l2Oracle\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"mint\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"gasLimit\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isCreation\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"TransactionDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BASE_FEE_MAX_CHANGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ELASTICITY_MULTIPLIER\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIAL_BASE_FEE\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_ORACLE\",\"outputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINIMUM_BASE_FEE\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TARGET_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"_isCreation\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"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\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawerStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"structWithdrawalVerifier.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_withdrawalProof\",\"type\":\"bytes\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"isOutputFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"params\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"prevBaseFee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"prevBoughtGas\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"prevBlockNum\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]",
Bin: "0x60c0604052600180546001600160a01b03191661dead1790553480156200002557600080fd5b506040516200393638038062003936833981016040819052620000489162000096565b60408051606081018252633b9aca00808252600060208301819052436001600160401b031692909301829052600160c01b9091021790556001600160a01b0390911660a052608052620000d2565b60008060408385031215620000aa57600080fd5b82516001600160a01b0381168114620000c257600080fd5b6020939093015192949293505050565b60805160a05161380d620001296000396000818161011e0152818161088e015281816109050152818161099801528181610a6a0152610ce501526000818161038301528181610b1c0152610d68015261380d6000f3fe6080604052600436106100e05760003560e01c8063a14238e71161007f578063cff0ab9611610059578063cff0ab96146102aa578063e9e05c421461034b578063eecf1c361461035e578063f4daa2911461037157600080fd5b8063a14238e714610250578063ca3e99ba14610280578063cd7c97891461029557600080fd5b80636bb0291e116100bb5780636bb0291e146101c85780636dbffb78146101dd578063867ead131461020d5780639bf62d821461022357600080fd5b80621c2ff61461010c57806313620abd1461016a57806364b79208146101a357600080fd5b36610107576101053334620186a06000604051806020016040528060008152506103a5565b005b600080fd5b34801561011857600080fd5b506101407f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561017657600080fd5b50610182633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610161565b3480156101af57600080fd5b506101ba627a120081565b604051908152602001610161565b3480156101d457600080fd5b506101ba600481565b3480156101e957600080fd5b506101fd6101f8366004612ef1565b610845565b6040519015158152602001610161565b34801561021957600080fd5b506101ba61271081565b34801561022f57600080fd5b506001546101409073ffffffffffffffffffffffffffffffffffffffff1681565b34801561025c57600080fd5b506101fd61026b366004612ef1565b60026020526000908152604090205460ff1681565b34801561028c57600080fd5b506101ba610b53565b3480156102a157600080fd5b506101ba600881565b3480156102b657600080fd5b50600054610312906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610161565b610105610359366004612fb1565b6103a5565b61010561036c3660046130fb565b610b64565b34801561037d57600080fd5b506101ba7f000000000000000000000000000000000000000000000000000000000000000081565b8260005a9050831561045c5773ffffffffffffffffffffffffffffffffffffffff87161561045c57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b3332811461047d575033731111000000000000000000000000000000001111015b8773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f78231ae6eb73366f912bb1d64351601fb76344c537bbab635ce14d0f376f0195348a8a8a8a6040516104e2959493929190613266565b60405180910390a3506000805461051f907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436132cc565b905080156106a75760006105376004627a1200613312565b6000546105629190700100000000000000000000000000000000900467ffffffffffffffff1661337a565b9050600060086105766004627a1200613312565b6000546105969085906fffffffffffffffffffffffffffffffff166133ee565b6105a09190613312565b6105aa9190613312565b60008054919250906105f5906105df906105d79085906fffffffffffffffffffffffffffffffff166134aa565b61271061125b565b6fffffffffffffffffffffffffffffffff611276565b90506001841115610668576106656105df670de0b6b3a764000061065161061d600883613312565b61062f90670de0b6b3a764000061337a565b61063a60018a6132cc565b61064c90670de0b6b3a764000061351e565b611285565b61065b90856133ee565b6105d79190613312565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760005550505b600080548491906010906106da908490700100000000000000000000000000000000900467ffffffffffffffff1661355b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a12006000800160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156107b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f7420627579206d6f72652060448201527f676173207468616e20617661696c61626c6520676173206c696d6974000000006064820152608401610453565b600080546107df906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8616613587565b6fffffffffffffffffffffffffffffffff169050600061080348633b9aca006112b6565b61080d90836135bf565b905060005a61081c90866132cc565b9050808211156108385761083861083382846132cc565b6112c6565b5050505050505050505050565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa1580156108d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f891906135d3565b8051909150610b1a5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663529933df6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561096e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109929190613622565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634ab65d736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a259190613622565b905084811115610a3a57506000949350505050565b600082610a4783886132cc565b610a51919061363b565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae557610a9983866132cc565b610aa3908961364f565b6040518263ffffffff1660e01b8152600401610ac191815260200190565b6040805180830381865afa158015610add573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0191906135d3565b8051909450610b165750600095945050505050565b5050505b7f00000000000000000000000000000000000000000000000000000000000000008160200151610b4a919061364f565b42119392505050565b610b616004627a1200613312565b81565b60015473ffffffffffffffffffffffffffffffffffffffff1661dead14610c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e006064820152608401610453565b73ffffffffffffffffffffffffffffffffffffffff8916301415610cb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e7472616374006064820152608401610453565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6491906135d3565b90507f00000000000000000000000000000000000000000000000000000000000000008160200151610d96919061364f565b4211610e24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a6564000000000000000000000000000000000000006064820152608401610453565b610e3b610e3636869003860186613667565b6112f4565b815114610eca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f6600000000000000000000000000000000000000000000006064820152608401610453565b6000610f108d8d8d8d8d8d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061135092505050565b9050610f5781866040013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061138f92505050565b610fe3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610453565b60008181526002602052604090205460ff1615611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610453565b600081815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556110c5614e208a61364f565b5a1015611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c0000000000000000006064820152608401610453565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e16179055604080516020601f8a018190048102820181019092528881526000916111dd918e918d918f918691908f908f908190840183828082843760009201919091525061145892505050565b50600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061124390841515815260200190565b60405180910390a25050505050505050505050505050565b60008183121561126b578161126d565b825b90505b92915050565b600081831261126b578161126d565b600061126d670de0b6b3a76400008361129d866114e3565b6112a791906133ee565b6112b19190613312565b611727565b60008183101561126b578161126d565b6000805a90505b825a6112d990836132cc565b10156112ef576112e8826136cd565b91506112cd565b505050565b60008160000151826020015183604001518460600151604051602001611333949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600086868686868660405160200161136d96959493929190613706565b6040516020818303038152906040528051906020012090509695505050505050565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301819052925061144d9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611966565b9150505b9392505050565b6000606060008060008661ffff1667ffffffffffffffff81111561147e5761147e612f33565b6040519080825280601f01601f1916602001820160405280156114a8576020820181803683370190505b5090506000808751602089018b8e8ef191503d9250868311156114c9578692505b828152826000602083013e90999098509650505050505050565b600080821361154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610453565b6000606061155b8461198a565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361175857506000919050565b680755bf798b4a1bf1e582126117ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610453565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60008061197286611a60565b905061198081868686611a92565b9695505050505050565b60008082116119f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610453565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611a7c91815260200190565b6040516020818303038152906040529050919050565b6000806000611aa2878686611acf565b91509150818015611ac457508051602080830191909120875191880191909120145b979650505050505050565b600060606000611ade85611bc4565b90506000806000611af0848a89611cbf565b81519295509093509150158080611b045750815b611b6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610453565b600081611b865760405180602001604052806000815250611bb2565b611bb286611b956001886132cc565b81518110611ba557611ba561375d565b60200260200101516121dc565b919b919a509098505050505050505050565b60606000611bd183612206565b90506000815167ffffffffffffffff811115611bef57611bef612f33565b604051908082528060200260200182016040528015611c3457816020015b6040805180820190915260608082526020820152815260200190600190039081611c0d5790505b50905060005b8251811015611cb7576000611c67848381518110611c5a57611c5a61375d565b6020026020010151612239565b90506040518060400160405280828152602001611c8383612206565b815250838381518110611c9857611c9861375d565b6020026020010181905250508080611caf906136cd565b915050611c3a565b509392505050565b60006060818080611ccf876122e3565b90506000869050600080611cf6604051806040016040528060608152602001606081525090565b60005b8c51811015612198578c8181518110611d1457611d1461375d565b602002602001015191508284611d2a919061364f565b9350611d3760018861364f565b965083611db557815180516020909101208514611db0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610453565b611ea6565b815151602011611e3157815180516020909101208514611db0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610453565b84611e3f8360000151612466565b14611ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610453565b611eb26010600161364f565b8260200151511415611f2b578551841415611ecc57612198565b6000868581518110611ee057611ee061375d565b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611f0b57611f0b61375d565b60200260200101519050611f1e8161248e565b9650600194505050612186565b60028260200151511415612124576000611f44836124c4565b9050600081600081518110611f5b57611f5b61375d565b016020015160f81c90506000611f7260028361378c565b611f7d9060026137ae565b90506000611f8e848360ff166124e8565b90506000611f9c8b8a6124e8565b90506000611faa838361251e565b905060ff851660021480611fc1575060ff85166003145b1561201757808351148015611fd65750808251145b15611fe857611fe5818b61364f565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950612198945050505050565b60ff8516158061202a575060ff85166001145b1561209c578251811461206657507f80000000000000000000000000000000000000000000000000000000000000009950612198945050505050565b61208d88602001516001815181106120805761208061375d565b602002602001015161248e565b9a509750612186945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610453565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610453565b80612190816136cd565b915050611cf9565b507f80000000000000000000000000000000000000000000000000000000000000008414866121c787866124e8565b909e909d50909b509950505050505050505050565b60208101518051606091611270916121f6906001906132cc565b81518110611c5a57611c5a61375d565b604080518082018252600080825260209182015281518083019092528251825280830190820152606090611270906125ca565b60606000806000612249856127fd565b919450925090506000816001811115612264576122646137d1565b146122cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610453565b6122da85602001518484612c04565b95945050505050565b60606000825160026122f5919061351e565b67ffffffffffffffff81111561230d5761230d612f33565b6040519080825280601f01601f191660200182016040528015612337576020820181803683370190505b50905060005b835181101561245f57600484828151811061235a5761235a61375d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c8261238f83600261351e565b8151811061239f5761239f61375d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060108482815181106123e2576123e261375d565b01602001516123f4919060f81c61378c565b60f81b8261240383600261351e565b61240e90600161364f565b8151811061241e5761241e61375d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612457816136cd565b91505061233d565b5092915050565b600060208251101561247a57506020015190565b818060200190518101906112709190613622565b600060606020836000015110156124af576124a883612ce3565b90506124bb565b6124b883612239565b90505b61145181612466565b60606112706124e38360200151600081518110611c5a57611c5a61375d565b6122e3565b6060825182106125075750604080516020810190915260008152611270565b61126d838384865161251991906132cc565b612cee565b6000805b8084511180156125325750808351115b80156125b3575082818151811061254b5761254b61375d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061258a5761258a61375d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561126d57806125c2816136cd565b915050612522565b60606000806125d8846127fd565b919350909150600190508160018111156125f4576125f46137d1565b1461265b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610453565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126745790505090506000835b86518110156127f2576020821061273a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610453565b6000806127776040518060400160405280858c6000015161275b91906132cc565b8152602001858c60200151612770919061364f565b90526127fd565b509150915060405180604001604052808383612793919061364f565b8152602001848b602001516127a8919061364f565b8152508585815181106127bd576127bd61375d565b60209081029190910101526127d360018561364f565b93506127df818361364f565b6127e9908461364f565b925050506126a1565b508152949350505050565b60008060008084600001511161286f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610453565b6020840151805160001a607f8111612894576000600160009450945094505050612bfd565b60b7811161292a5760006128a96080836132cc565b905080876000015111612918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610453565b60019550935060009250612bfd915050565b60bf8111612a4d57600061293f60b7836132cc565b9050808760000151116129ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610453565b600183015160208290036101000a90046129c8818361364f565b885111612a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610453565b612a3c82600161364f565b9650945060009350612bfd92505050565b60f78111612ae2576000612a6260c0836132cc565b905080876000015111612ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610453565b600195509350849250612bfd915050565b6000612aef60f7836132cc565b905080876000015111612b5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610453565b600183015160208290036101000a9004612b78818361364f565b885111612be1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610453565b612bec82600161364f565b9650945060019350612bfd92505050565b9193909250565b606060008267ffffffffffffffff811115612c2157612c21612f33565b6040519080825280601f01601f191660200182016040528015612c4b576020820181803683370190505b509050805160001415612c5f579050611451565b6000612c6b858761364f565b90506020820160005b612c7f6020876135bf565b811015612cb65782518252612c9560208461364f565b9250612ca260208361364f565b915080612cae816136cd565b915050612c74565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061127082612edb565b606081612cfc81601f61364f565b1015612d64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610453565b82612d6f838261364f565b1015612dd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610453565b612de1828461364f565b84511015612e4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610453565b606082158015612e6a5760405191506000825260208201604052612ed2565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612ea3578051835260209283019201612e8b565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b6060611270826020015160008460000151612c04565b600060208284031215612f0357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612f2e57600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612fa957612fa9612f33565b604052919050565b600080600080600060a08688031215612fc957600080fd5b612fd286612f0a565b94506020808701359450604087013567ffffffffffffffff8082168214612ff857600080fd5b909450606088013590811515821461300f57600080fd5b9093506080880135908082111561302557600080fd5b818901915089601f83011261303957600080fd5b81358181111561304b5761304b612f33565b61307b847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612f62565b91508082528a8482850101111561309157600080fd5b80848401858401376000848284010152508093505050509295509295909350565b60008083601f8401126130c457600080fd5b50813567ffffffffffffffff8111156130dc57600080fd5b6020830191508360208285010111156130f457600080fd5b9250929050565b60008060008060008060008060008060006101808c8e03121561311d57600080fd5b8b359a5061312d60208d01612f0a565b995061313b60408d01612f0a565b985060608c0135975060808c0135965067ffffffffffffffff60a08d0135111561316457600080fd5b6131748d60a08e01358e016130b2565b909650945060c08c0135935060808c8e037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff200112156131b257600080fd5b60e08c01925067ffffffffffffffff6101608d013511156131d257600080fd5b6131e38d6101608e01358e016130b2565b81935080925050509295989b509295989b9093969950565b6000815180845260005b8181101561322157602081850181015186830182015201613205565b81811115613233576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b85815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611ac460a08301846131fb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156132de576132de61329d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613321576133216132e3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156133755761337561329d565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156133b4576133b461329d565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156133e8576133e861329d565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561342f5761342f61329d565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561346a5761346a61329d565b600087129250878205871284841616156134865761348661329d565b8785058712818416161561349c5761349c61329d565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156134e4576134e461329d565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156135185761351861329d565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135565761355661329d565b500290565b600067ffffffffffffffff80831681851680830382111561357e5761357e61329d565b01949350505050565b60006fffffffffffffffffffffffffffffffff808316818516818304811182151516156135b6576135b661329d565b02949350505050565b6000826135ce576135ce6132e3565b500490565b6000604082840312156135e557600080fd5b6040516040810181811067ffffffffffffffff8211171561360857613608612f33565b604052825181526020928301519281019290925250919050565b60006020828403121561363457600080fd5b5051919050565b60008261364a5761364a6132e3565b500690565b600082198211156136625761366261329d565b500190565b60006080828403121561367957600080fd5b6040516080810181811067ffffffffffffffff8211171561369c5761369c612f33565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136ff576136ff61329d565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261375160c08301846131fb565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff83168061379f5761379f6132e3565b8060ff84160691505092915050565b600060ff821660ff8416808210156137c8576137c861329d565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080a000a",
ABI: "[{\"inputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"_l2Oracle\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"mint\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"gasLimit\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isCreation\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"TransactionDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BASE_FEE_MAX_CHANGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ELASTICITY_MULTIPLIER\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIAL_BASE_FEE\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_ORACLE\",\"outputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINIMUM_BASE_FEE\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OPTIMISM_PORTAL_VERSION\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TARGET_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"_isCreation\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"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\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawerStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"structWithdrawalVerifier.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_withdrawalProof\",\"type\":\"bytes\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"isOutputFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"params\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"prevBaseFee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"prevBoughtGas\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"prevBlockNum\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]",
Bin: "0x60c06040523480156200001157600080fd5b5060405162003e5638038062003e56833981016040819052620000349162000276565b6200006e60408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b6001600160a01b03821660a05260808190526200008a62000092565b5050620002b2565b60016000620000a18262000155565b90508015620000ba576000805461ff0019166101001790555b603380546001600160a01b03191661dead1790556200010860408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b801562000151576000805461ff001916905560405160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b60008054610100900460ff1615620001ee578160ff1660011480156200018e57506200018c306200026760201b620013d91760201c565b155b620001e65760405162461bcd60e51b815260206004820152602e602482015260008051602062003e3683398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b506000919050565b60005460ff8084169116106200024d5760405162461bcd60e51b815260206004820152602e602482015260008051602062003e3683398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620001dd565b506000805460ff191660ff92909216919091179055600190565b6001600160a01b03163b151590565b600080604083850312156200028a57600080fd5b82516001600160a01b0381168114620002a257600080fd5b6020939093015192949293505050565b60805160a051613b2d6200030960003960008181610134015281816108e60152818161095d015281816109f001528181610ac20152610e630152600081816103d501528181610b740152610ee60152613b2d6000f3fe6080604052600436106100f65760003560e01c80639bf62d821161008a578063cff0ab9611610059578063cff0ab96146102fc578063e9e05c421461039d578063eecf1c36146103b0578063f4daa291146103c357600080fd5b80639bf62d8214610275578063a14238e7146102a2578063ca3e99ba146102d2578063cd7c9789146102e757600080fd5b80636bb0291e116100c65780636bb0291e146102055780636dbffb781461021a5780638129fc1c1461024a578063867ead131461025f57600080fd5b80621c2ff61461012257806313620abd1461018057806335c14a16146101b957806364b79208146101e057600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f7565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101ce600181565b60405160ff9091168152602001610177565b3480156101ec57600080fd5b506101f7627a120081565b604051908152602001610177565b34801561021157600080fd5b506101f7600481565b34801561022657600080fd5b5061023a610235366004613216565b61089d565b6040519015158152602001610177565b34801561025657600080fd5b5061011b610bab565b34801561026b57600080fd5b506101f761271081565b34801561028157600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102ae57600080fd5b5061023a6102bd366004613216565b60346020526000908152604090205460ff1681565b3480156102de57600080fd5b506101f7610cd1565b3480156102f357600080fd5b506101f7600881565b34801561030857600080fd5b50600154610364906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103ab3660046132d1565b6103f7565b61011b6103be36600461341b565b610ce2565b3480156103cf57600080fd5b506101f77f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156104ae5773ffffffffffffffffffffffffffffffffffffffff8716156104ae57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104cf575033731111000000000000000000000000000000001111015b8773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f78231ae6eb73366f912bb1d64351601fb76344c537bbab635ce14d0f376f0195348a8a8a8a604051610534959493929190613586565b60405180910390a350600154600090610573907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436135ec565b905080156106fc57600061058b6004627a1200613632565b6001546105b69190700100000000000000000000000000000000900467ffffffffffffffff1661369a565b9050600060086105ca6004627a1200613632565b6001546105ea9085906fffffffffffffffffffffffffffffffff1661370e565b6105f49190613632565b6105fe9190613632565b60015490915060009061064a906106349061062c9085906fffffffffffffffffffffffffffffffff166137ca565b6127106113f5565b6fffffffffffffffffffffffffffffffff611410565b905060018411156106bd576106ba610634670de0b6b3a76400006106a6610672600883613632565b61068490670de0b6b3a764000061369a565b61068f60018a6135ec565b6106a190670de0b6b3a764000061383e565b61141f565b6106b0908561370e565b61062c9190613632565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805484919060109061072f908490700100000000000000000000000000000000900467ffffffffffffffff1661387b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561080b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f7420627579206d6f72652060448201527f676173207468616e20617661696c61626c6520676173206c696d69740000000060648201526084016104a5565b600154600090610837906fffffffffffffffffffffffffffffffff1667ffffffffffffffff86166138a7565b6fffffffffffffffffffffffffffffffff169050600061085b48633b9aca00611450565b61086590836138df565b905060005a61087490866135ec565b9050808211156108905761089061088b82846135ec565b611460565b5050505050505050505050565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa15801561092c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095091906138f3565b8051909150610b725760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663529933df6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ea9190613942565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634ab65d736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7d9190613942565b905084811115610a9257506000949350505050565b600082610a9f83886135ec565b610aa9919061395b565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae557610af183866135ec565b610afb908961396f565b6040518263ffffffff1660e01b8152600401610b1991815260200190565b6040805180830381865afa158015610b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5991906138f3565b8051909450610b6e5750600095945050505050565b5050505b7f00000000000000000000000000000000000000000000000000000000000000008160200151610ba2919061396f565b42119392505050565b60016000610bb88261148e565b90508015610bed57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055610c6860408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b8015610ccd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610cdf6004627a1200613632565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610d8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a5565b73ffffffffffffffffffffffffffffffffffffffff8916301415610e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a5565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee291906138f3565b90507f00000000000000000000000000000000000000000000000000000000000000008160200151610f14919061396f565b4211610fa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a5565b610fb9610fb436869003860186613987565b611619565b815114611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a5565b600061108e8d8d8d8d8d8d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061167592505050565b90506110d581866040013586868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116b492505050565b611161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a5565b60008181526034602052604090205460ff1615611200576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a5565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611243614e208a61396f565b5a10156112d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a5565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e16179055604080516020601f8a0181900481028201810190925288815260009161135b918e918d918f918691908f908f908190840183828082843760009201919091525061177d92505050565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b906113c190841515815260200190565b60405180910390a25050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000818312156114055781611407565b825b90505b92915050565b60008183126114055781611407565b6000611407670de0b6b3a76400008361143786611808565b611441919061370e565b61144b9190613632565b611a4c565b6000818310156114055781611407565b6000805a90505b825a61147390836135ec565b101561148957611482826139ed565b9150611467565b505050565b60008054610100900460ff1615611545578160ff1660011480156114b15750303b155b61153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b506000919050565b60005460ff8084169116106115dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b60008160000151826020015183604001518460600151604051602001611658949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600086868686868660405160200161169296959493929190613a26565b6040516020818303038152906040528051906020012090509695505050505050565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506117729101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611c8b565b9150505b9392505050565b6000606060008060008661ffff1667ffffffffffffffff8111156117a3576117a3613253565b6040519080825280601f01601f1916602001820160405280156117cd576020820181803683370190505b5090506000808751602089018b8e8ef191503d9250868311156117ee578692505b828152826000602083013e90999098509650505050505050565b6000808213611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a5565b6000606061188084611caf565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213611a7d57506000919050565b680755bf798b4a1bf1e58212611aef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a5565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611c9786611d85565b9050611ca581868686611db7565b9695505050505050565b6000808211611d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a5565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611da191815260200190565b6040516020818303038152906040529050919050565b6000806000611dc7878686611df4565b91509150818015611de957508051602080830191909120875191880191909120145b979650505050505050565b600060606000611e0385611ee9565b90506000806000611e15848a89611fe4565b81519295509093509150158080611e295750815b611e8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064016104a5565b600081611eab5760405180602001604052806000815250611ed7565b611ed786611eba6001886135ec565b81518110611eca57611eca613a7d565b6020026020010151612501565b919b919a509098505050505050505050565b60606000611ef68361252b565b90506000815167ffffffffffffffff811115611f1457611f14613253565b604051908082528060200260200182016040528015611f5957816020015b6040805180820190915260608082526020820152815260200190600190039081611f325790505b50905060005b8251811015611fdc576000611f8c848381518110611f7f57611f7f613a7d565b602002602001015161255e565b90506040518060400160405280828152602001611fa88361252b565b815250838381518110611fbd57611fbd613a7d565b6020026020010181905250508080611fd4906139ed565b915050611f5f565b509392505050565b60006060818080611ff487612608565b9050600086905060008061201b604051806040016040528060608152602001606081525090565b60005b8c518110156124bd578c818151811061203957612039613a7d565b60200260200101519150828461204f919061396f565b935061205c60018861396f565b9650836120da578151805160209091012085146120d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016104a5565b6121cb565b815151602011612156578151805160209091012085146120d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016104a5565b84612164836000015161278b565b146121cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016104a5565b6121d76010600161396f565b82602001515114156122505785518414156121f1576124bd565b600086858151811061220557612205613a7d565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061223057612230613a7d565b60200260200101519050612243816127b3565b96506001945050506124ab565b60028260200151511415612449576000612269836127e9565b905060008160008151811061228057612280613a7d565b016020015160f81c90506000612297600283613aac565b6122a2906002613ace565b905060006122b3848360ff1661280d565b905060006122c18b8a61280d565b905060006122cf8383612843565b905060ff8516600214806122e6575060ff85166003145b1561233c578083511480156122fb5750808251145b1561230d5761230a818b61396f565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506124bd945050505050565b60ff8516158061234f575060ff85166001145b156123c1578251811461238b57507f800000000000000000000000000000000000000000000000000000000000000099506124bd945050505050565b6123b288602001516001815181106123a5576123a5613a7d565b60200260200101516127b3565b9a5097506124ab945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016104a5565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016104a5565b806124b5816139ed565b91505061201e565b507f80000000000000000000000000000000000000000000000000000000000000008414866124ec878661280d565b909e909d50909b509950505050505050505050565b6020810151805160609161140a9161251b906001906135ec565b81518110611f7f57611f7f613a7d565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061140a906128ef565b6060600080600061256e85612b22565b91945092509050600081600181111561258957612589613af1565b146125f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016104a5565b6125ff85602001518484612f29565b95945050505050565b606060008251600261261a919061383e565b67ffffffffffffffff81111561263257612632613253565b6040519080825280601f01601f19166020018201604052801561265c576020820181803683370190505b50905060005b835181101561278457600484828151811061267f5761267f613a7d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826126b483600261383e565b815181106126c4576126c4613a7d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061270757612707613a7d565b0160200151612719919060f81c613aac565b60f81b8261272883600261383e565b61273390600161396f565b8151811061274357612743613a7d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061277c816139ed565b915050612662565b5092915050565b600060208251101561279f57506020015190565b8180602001905181019061140a9190613942565b600060606020836000015110156127d4576127cd83613008565b90506127e0565b6127dd8361255e565b90505b6117768161278b565b606061140a6128088360200151600081518110611f7f57611f7f613a7d565b612608565b60608251821061282c575060408051602081019091526000815261140a565b611407838384865161283e91906135ec565b613013565b6000805b8084511180156128575750808351115b80156128d8575082818151811061287057612870613a7d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181106128af576128af613a7d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561140757806128e7816139ed565b915050612847565b60606000806128fd84612b22565b9193509091506001905081600181111561291957612919613af1565b14612980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016104a5565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816129995790505090506000835b8651811015612b175760208210612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016104a5565b600080612a9c6040518060400160405280858c60000151612a8091906135ec565b8152602001858c60200151612a95919061396f565b9052612b22565b509150915060405180604001604052808383612ab8919061396f565b8152602001848b60200151612acd919061396f565b815250858581518110612ae257612ae2613a7d565b6020908102919091010152612af860018561396f565b9350612b04818361396f565b612b0e908461396f565b925050506129c6565b508152949350505050565b600080600080846000015111612b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016104a5565b6020840151805160001a607f8111612bb9576000600160009450945094505050612f22565b60b78111612c4f576000612bce6080836135ec565b905080876000015111612c3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016104a5565b60019550935060009250612f22915050565b60bf8111612d72576000612c6460b7836135ec565b905080876000015111612cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016104a5565b600183015160208290036101000a9004612ced818361396f565b885111612d56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016104a5565b612d6182600161396f565b9650945060009350612f2292505050565b60f78111612e07576000612d8760c0836135ec565b905080876000015111612df6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016104a5565b600195509350849250612f22915050565b6000612e1460f7836135ec565b905080876000015111612e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016104a5565b600183015160208290036101000a9004612e9d818361396f565b885111612f06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016104a5565b612f1182600161396f565b9650945060019350612f2292505050565b9193909250565b606060008267ffffffffffffffff811115612f4657612f46613253565b6040519080825280601f01601f191660200182016040528015612f70576020820181803683370190505b509050805160001415612f84579050611776565b6000612f90858761396f565b90506020820160005b612fa46020876138df565b811015612fdb5782518252612fba60208461396f565b9250612fc760208361396f565b915080612fd3816139ed565b915050612f99565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061140a82613200565b60608161302181601f61396f565b1015613089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a5565b82613094838261396f565b10156130fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a5565b613106828461396f565b84511015613170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a5565b60608215801561318f57604051915060008252602082016040526131f7565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156131c85780518352602092830192016131b0565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606061140a826020015160008460000151612f29565b60006020828403121561322857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461161457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156132c9576132c9613253565b604052919050565b600080600080600060a086880312156132e957600080fd5b6132f28661322f565b94506020808701359450604087013567ffffffffffffffff808216821461331857600080fd5b909450606088013590811515821461332f57600080fd5b9093506080880135908082111561334557600080fd5b818901915089601f83011261335957600080fd5b81358181111561336b5761336b613253565b61339b847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613282565b91508082528a848285010111156133b157600080fd5b80848401858401376000848284010152508093505050509295509295909350565b60008083601f8401126133e457600080fd5b50813567ffffffffffffffff8111156133fc57600080fd5b60208301915083602082850101111561341457600080fd5b9250929050565b60008060008060008060008060008060006101808c8e03121561343d57600080fd5b8b359a5061344d60208d0161322f565b995061345b60408d0161322f565b985060608c0135975060808c0135965067ffffffffffffffff60a08d0135111561348457600080fd5b6134948d60a08e01358e016133d2565b909650945060c08c0135935060808c8e037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff200112156134d257600080fd5b60e08c01925067ffffffffffffffff6101608d013511156134f257600080fd5b6135038d6101608e01358e016133d2565b81935080925050509295989b509295989b9093969950565b6000815180845260005b8181101561354157602081850181015186830182015201613525565b81811115613553576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b85815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611de960a083018461351b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156135fe576135fe6135bd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261364157613641613603565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615613695576136956135bd565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156136d4576136d46135bd565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615613708576137086135bd565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561374f5761374f6135bd565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561378a5761378a6135bd565b600087129250878205871284841616156137a6576137a66135bd565b878505871281841616156137bc576137bc6135bd565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615613804576138046135bd565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615613838576138386135bd565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613876576138766135bd565b500290565b600067ffffffffffffffff80831681851680830382111561389e5761389e6135bd565b01949350505050565b60006fffffffffffffffffffffffffffffffff808316818516818304811182151516156138d6576138d66135bd565b02949350505050565b6000826138ee576138ee613603565b500490565b60006040828403121561390557600080fd5b6040516040810181811067ffffffffffffffff8211171561392857613928613253565b604052825181526020928301519281019290925250919050565b60006020828403121561395457600080fd5b5051919050565b60008261396a5761396a613603565b500690565b60008219821115613982576139826135bd565b500190565b60006080828403121561399957600080fd5b6040516080810181811067ffffffffffffffff821117156139bc576139bc613253565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a1f57613a1f6135bd565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613a7160c083018461351b565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680613abf57613abf613603565b8060ff84160691505092915050565b600060ff821660ff841680821015613ae857613ae86135bd565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080a000a496e697469616c697a61626c653a20636f6e747261637420697320616c726561",
}
// OptimismPortalABI is the input ABI used to generate the binding from.
......@@ -426,6 +426,37 @@ func (_OptimismPortal *OptimismPortalCallerSession) MINIMUMBASEFEE() (*big.Int,
return _OptimismPortal.Contract.MINIMUMBASEFEE(&_OptimismPortal.CallOpts)
}
// OPTIMISMPORTALVERSION is a free data retrieval call binding the contract method 0x35c14a16.
//
// Solidity: function OPTIMISM_PORTAL_VERSION() view returns(uint8)
func (_OptimismPortal *OptimismPortalCaller) OPTIMISMPORTALVERSION(opts *bind.CallOpts) (uint8, error) {
var out []interface{}
err := _OptimismPortal.contract.Call(opts, &out, "OPTIMISM_PORTAL_VERSION")
if err != nil {
return *new(uint8), err
}
out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
return out0, err
}
// OPTIMISMPORTALVERSION is a free data retrieval call binding the contract method 0x35c14a16.
//
// Solidity: function OPTIMISM_PORTAL_VERSION() view returns(uint8)
func (_OptimismPortal *OptimismPortalSession) OPTIMISMPORTALVERSION() (uint8, error) {
return _OptimismPortal.Contract.OPTIMISMPORTALVERSION(&_OptimismPortal.CallOpts)
}
// OPTIMISMPORTALVERSION is a free data retrieval call binding the contract method 0x35c14a16.
//
// Solidity: function OPTIMISM_PORTAL_VERSION() view returns(uint8)
func (_OptimismPortal *OptimismPortalCallerSession) OPTIMISMPORTALVERSION() (uint8, error) {
return _OptimismPortal.Contract.OPTIMISMPORTALVERSION(&_OptimismPortal.CallOpts)
}
// TARGETRESOURCELIMIT is a free data retrieval call binding the contract method 0xca3e99ba.
//
// Solidity: function TARGET_RESOURCE_LIMIT() view returns(int256)
......@@ -642,6 +673,27 @@ func (_OptimismPortal *OptimismPortalTransactorSession) FinalizeWithdrawalTransa
return _OptimismPortal.Contract.FinalizeWithdrawalTransaction(&_OptimismPortal.TransactOpts, _nonce, _sender, _target, _value, _gasLimit, _data, _l2BlockNumber, _outputRootProof, _withdrawalProof)
}
// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c.
//
// Solidity: function initialize() returns()
func (_OptimismPortal *OptimismPortalTransactor) Initialize(opts *bind.TransactOpts) (*types.Transaction, error) {
return _OptimismPortal.contract.Transact(opts, "initialize")
}
// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c.
//
// Solidity: function initialize() returns()
func (_OptimismPortal *OptimismPortalSession) Initialize() (*types.Transaction, error) {
return _OptimismPortal.Contract.Initialize(&_OptimismPortal.TransactOpts)
}
// Initialize is a paid mutator transaction binding the contract method 0x8129fc1c.
//
// Solidity: function initialize() returns()
func (_OptimismPortal *OptimismPortalTransactorSession) Initialize() (*types.Transaction, error) {
return _OptimismPortal.Contract.Initialize(&_OptimismPortal.TransactOpts)
}
// Receive is a paid mutator transaction binding the contract receive function.
//
// Solidity: receive() payable returns()
......@@ -663,6 +715,140 @@ func (_OptimismPortal *OptimismPortalTransactorSession) Receive() (*types.Transa
return _OptimismPortal.Contract.Receive(&_OptimismPortal.TransactOpts)
}
// OptimismPortalInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the OptimismPortal contract.
type OptimismPortalInitializedIterator struct {
Event *OptimismPortalInitialized // 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 *OptimismPortalInitializedIterator) 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(OptimismPortalInitialized)
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(OptimismPortalInitialized)
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 *OptimismPortalInitializedIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *OptimismPortalInitializedIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// OptimismPortalInitialized represents a Initialized event raised by the OptimismPortal contract.
type OptimismPortalInitialized 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 (_OptimismPortal *OptimismPortalFilterer) FilterInitialized(opts *bind.FilterOpts) (*OptimismPortalInitializedIterator, error) {
logs, sub, err := _OptimismPortal.contract.FilterLogs(opts, "Initialized")
if err != nil {
return nil, err
}
return &OptimismPortalInitializedIterator{contract: _OptimismPortal.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 (_OptimismPortal *OptimismPortalFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *OptimismPortalInitialized) (event.Subscription, error) {
logs, sub, err := _OptimismPortal.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(OptimismPortalInitialized)
if err := _OptimismPortal.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 (_OptimismPortal *OptimismPortalFilterer) ParseInitialized(log types.Log) (*OptimismPortalInitialized, error) {
event := new(OptimismPortalInitialized)
if err := _OptimismPortal.contract.UnpackLog(event, "Initialized", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// OptimismPortalTransactionDepositedIterator is returned from FilterTransactionDeposited and is used to iterate over the raw logs and unpacked data for TransactionDeposited events raised by the OptimismPortal contract.
type OptimismPortalTransactionDepositedIterator struct {
Event *OptimismPortalTransactionDeposited // Event containing the contract specifics and raw log
......
......@@ -2,4 +2,4 @@
// This file is a generated binding and any manual changes will be lost.
package bindings
var OptimismPortalDeployedBin = "0x6080604052600436106100e05760003560e01c8063a14238e71161007f578063cff0ab9611610059578063cff0ab96146102aa578063e9e05c421461034b578063eecf1c361461035e578063f4daa2911461037157600080fd5b8063a14238e714610250578063ca3e99ba14610280578063cd7c97891461029557600080fd5b80636bb0291e116100bb5780636bb0291e146101c85780636dbffb78146101dd578063867ead131461020d5780639bf62d821461022357600080fd5b80621c2ff61461010c57806313620abd1461016a57806364b79208146101a357600080fd5b36610107576101053334620186a06000604051806020016040528060008152506103a5565b005b600080fd5b34801561011857600080fd5b506101407f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561017657600080fd5b50610182633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610161565b3480156101af57600080fd5b506101ba627a120081565b604051908152602001610161565b3480156101d457600080fd5b506101ba600481565b3480156101e957600080fd5b506101fd6101f8366004612ef1565b610845565b6040519015158152602001610161565b34801561021957600080fd5b506101ba61271081565b34801561022f57600080fd5b506001546101409073ffffffffffffffffffffffffffffffffffffffff1681565b34801561025c57600080fd5b506101fd61026b366004612ef1565b60026020526000908152604090205460ff1681565b34801561028c57600080fd5b506101ba610b53565b3480156102a157600080fd5b506101ba600881565b3480156102b657600080fd5b50600054610312906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610161565b610105610359366004612fb1565b6103a5565b61010561036c3660046130fb565b610b64565b34801561037d57600080fd5b506101ba7f000000000000000000000000000000000000000000000000000000000000000081565b8260005a9050831561045c5773ffffffffffffffffffffffffffffffffffffffff87161561045c57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b3332811461047d575033731111000000000000000000000000000000001111015b8773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f78231ae6eb73366f912bb1d64351601fb76344c537bbab635ce14d0f376f0195348a8a8a8a6040516104e2959493929190613266565b60405180910390a3506000805461051f907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436132cc565b905080156106a75760006105376004627a1200613312565b6000546105629190700100000000000000000000000000000000900467ffffffffffffffff1661337a565b9050600060086105766004627a1200613312565b6000546105969085906fffffffffffffffffffffffffffffffff166133ee565b6105a09190613312565b6105aa9190613312565b60008054919250906105f5906105df906105d79085906fffffffffffffffffffffffffffffffff166134aa565b61271061125b565b6fffffffffffffffffffffffffffffffff611276565b90506001841115610668576106656105df670de0b6b3a764000061065161061d600883613312565b61062f90670de0b6b3a764000061337a565b61063a60018a6132cc565b61064c90670de0b6b3a764000061351e565b611285565b61065b90856133ee565b6105d79190613312565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760005550505b600080548491906010906106da908490700100000000000000000000000000000000900467ffffffffffffffff1661355b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a12006000800160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1613156107b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f7420627579206d6f72652060448201527f676173207468616e20617661696c61626c6520676173206c696d6974000000006064820152608401610453565b600080546107df906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8616613587565b6fffffffffffffffffffffffffffffffff169050600061080348633b9aca006112b6565b61080d90836135bf565b905060005a61081c90866132cc565b9050808211156108385761083861083382846132cc565b6112c6565b5050505050505050505050565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa1580156108d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f891906135d3565b8051909150610b1a5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663529933df6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561096e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109929190613622565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634ab65d736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a259190613622565b905084811115610a3a57506000949350505050565b600082610a4783886132cc565b610a51919061363b565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae557610a9983866132cc565b610aa3908961364f565b6040518263ffffffff1660e01b8152600401610ac191815260200190565b6040805180830381865afa158015610add573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0191906135d3565b8051909450610b165750600095945050505050565b5050505b7f00000000000000000000000000000000000000000000000000000000000000008160200151610b4a919061364f565b42119392505050565b610b616004627a1200613312565b81565b60015473ffffffffffffffffffffffffffffffffffffffff1661dead14610c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e006064820152608401610453565b73ffffffffffffffffffffffffffffffffffffffff8916301415610cb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e7472616374006064820152608401610453565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6491906135d3565b90507f00000000000000000000000000000000000000000000000000000000000000008160200151610d96919061364f565b4211610e24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a6564000000000000000000000000000000000000006064820152608401610453565b610e3b610e3636869003860186613667565b6112f4565b815114610eca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f6600000000000000000000000000000000000000000000006064820152608401610453565b6000610f108d8d8d8d8d8d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061135092505050565b9050610f5781866040013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061138f92505050565b610fe3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f6600000000000000000000000000006064820152608401610453565b60008181526002602052604090205460ff1615611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a656400000000000000000000006064820152608401610453565b600081815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556110c5614e208a61364f565b5a1015611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c0000000000000000006064820152608401610453565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e16179055604080516020601f8a018190048102820181019092528881526000916111dd918e918d918f918691908f908f908190840183828082843760009201919091525061145892505050565b50600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061124390841515815260200190565b60405180910390a25050505050505050505050505050565b60008183121561126b578161126d565b825b90505b92915050565b600081831261126b578161126d565b600061126d670de0b6b3a76400008361129d866114e3565b6112a791906133ee565b6112b19190613312565b611727565b60008183101561126b578161126d565b6000805a90505b825a6112d990836132cc565b10156112ef576112e8826136cd565b91506112cd565b505050565b60008160000151826020015183604001518460600151604051602001611333949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600086868686868660405160200161136d96959493929190613706565b6040516020818303038152906040528051906020012090509695505050505050565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301819052925061144d9101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611966565b9150505b9392505050565b6000606060008060008661ffff1667ffffffffffffffff81111561147e5761147e612f33565b6040519080825280601f01601f1916602001820160405280156114a8576020820181803683370190505b5090506000808751602089018b8e8ef191503d9250868311156114c9578692505b828152826000602083013e90999098509650505050505050565b600080821361154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610453565b6000606061155b8461198a565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361175857506000919050565b680755bf798b4a1bf1e582126117ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f5700000000000000000000000000000000000000006044820152606401610453565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60008061197286611a60565b905061198081868686611a92565b9695505050505050565b60008082116119f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e454400000000000000000000000000000000000000000000006044820152606401610453565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611a7c91815260200190565b6040516020818303038152906040529050919050565b6000806000611aa2878686611acf565b91509150818015611ac457508051602080830191909120875191880191909120145b979650505050505050565b600060606000611ade85611bc4565b90506000806000611af0848a89611cbf565b81519295509093509150158080611b045750815b611b6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e0000000000006044820152606401610453565b600081611b865760405180602001604052806000815250611bb2565b611bb286611b956001886132cc565b81518110611ba557611ba561375d565b60200260200101516121dc565b919b919a509098505050505050505050565b60606000611bd183612206565b90506000815167ffffffffffffffff811115611bef57611bef612f33565b604051908082528060200260200182016040528015611c3457816020015b6040805180820190915260608082526020820152815260200190600190039081611c0d5790505b50905060005b8251811015611cb7576000611c67848381518110611c5a57611c5a61375d565b6020026020010151612239565b90506040518060400160405280828152602001611c8383612206565b815250838381518110611c9857611c9861375d565b6020026020010181905250508080611caf906136cd565b915050611c3a565b509392505050565b60006060818080611ccf876122e3565b90506000869050600080611cf6604051806040016040528060608152602001606081525090565b60005b8c51811015612198578c8181518110611d1457611d1461375d565b602002602001015191508284611d2a919061364f565b9350611d3760018861364f565b965083611db557815180516020909101208514611db0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c696420726f6f7420686173680000000000000000000000000000006044820152606401610453565b611ea6565b815151602011611e3157815180516020909101208514611db0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c206861736800000000006044820152606401610453565b84611e3f8360000151612466565b14611ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f646520686173680000000000006044820152606401610453565b611eb26010600161364f565b8260200151511415611f2b578551841415611ecc57612198565b6000868581518110611ee057611ee061375d565b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110611f0b57611f0b61375d565b60200260200101519050611f1e8161248e565b9650600194505050612186565b60028260200151511415612124576000611f44836124c4565b9050600081600081518110611f5b57611f5b61375d565b016020015160f81c90506000611f7260028361378c565b611f7d9060026137ae565b90506000611f8e848360ff166124e8565b90506000611f9c8b8a6124e8565b90506000611faa838361251e565b905060ff851660021480611fc1575060ff85166003145b1561201757808351148015611fd65750808251145b15611fe857611fe5818b61364f565b99505b507f80000000000000000000000000000000000000000000000000000000000000009950612198945050505050565b60ff8516158061202a575060ff85166001145b1561209c578251811461206657507f80000000000000000000000000000000000000000000000000000000000000009950612198945050505050565b61208d88602001516001815181106120805761208061375d565b602002602001015161248e565b9a509750612186945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f70726566697800000000000000000000000000000000000000000000000000006064820152608401610453565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e0000006044820152606401610453565b80612190816136cd565b915050611cf9565b507f80000000000000000000000000000000000000000000000000000000000000008414866121c787866124e8565b909e909d50909b509950505050505050505050565b60208101518051606091611270916121f6906001906132cc565b81518110611c5a57611c5a61375d565b604080518082018252600080825260209182015281518083019092528251825280830190820152606090611270906125ca565b60606000806000612249856127fd565b919450925090506000816001811115612264576122646137d1565b146122cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e00000000000000006044820152606401610453565b6122da85602001518484612c04565b95945050505050565b60606000825160026122f5919061351e565b67ffffffffffffffff81111561230d5761230d612f33565b6040519080825280601f01601f191660200182016040528015612337576020820181803683370190505b50905060005b835181101561245f57600484828151811061235a5761235a61375d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c8261238f83600261351e565b8151811061239f5761239f61375d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060108482815181106123e2576123e261375d565b01602001516123f4919060f81c61378c565b60f81b8261240383600261351e565b61240e90600161364f565b8151811061241e5761241e61375d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612457816136cd565b91505061233d565b5092915050565b600060208251101561247a57506020015190565b818060200190518101906112709190613622565b600060606020836000015110156124af576124a883612ce3565b90506124bb565b6124b883612239565b90505b61145181612466565b60606112706124e38360200151600081518110611c5a57611c5a61375d565b6122e3565b6060825182106125075750604080516020810190915260008152611270565b61126d838384865161251991906132cc565b612cee565b6000805b8084511180156125325750808351115b80156125b3575082818151811061254b5761254b61375d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061258a5761258a61375d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561126d57806125c2816136cd565b915050612522565b60606000806125d8846127fd565b919350909150600190508160018111156125f4576125f46137d1565b1461265b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e0000000000000000006044820152606401610453565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816126745790505090506000835b86518110156127f2576020821061273a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e000000000000000000000000000000000000000000006064820152608401610453565b6000806127776040518060400160405280858c6000015161275b91906132cc565b8152602001858c60200151612770919061364f565b90526127fd565b509150915060405180604001604052808383612793919061364f565b8152602001848b602001516127a8919061364f565b8152508585815181106127bd576127bd61375d565b60209081029190910101526127d360018561364f565b93506127df818361364f565b6127e9908461364f565b925050506126a1565b508152949350505050565b60008060008084600001511161286f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e00000000000000006044820152606401610453565b6020840151805160001a607f8111612894576000600160009450945094505050612bfd565b60b7811161292a5760006128a96080836132cc565b905080876000015111612918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e000000000000006044820152606401610453565b60019550935060009250612bfd915050565b60bf8111612a4d57600061293f60b7836132cc565b9050808760000151116129ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e006044820152606401610453565b600183015160208290036101000a90046129c8818361364f565b885111612a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e00000000000000006044820152606401610453565b612a3c82600161364f565b9650945060009350612bfd92505050565b60f78111612ae2576000612a6260c0836132cc565b905080876000015111612ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e0000000000000000006044820152606401610453565b600195509350849250612bfd915050565b6000612aef60f7836132cc565b905080876000015111612b5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e0000006044820152606401610453565b600183015160208290036101000a9004612b78818361364f565b885111612be1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e000000000000000000006044820152606401610453565b612bec82600161364f565b9650945060019350612bfd92505050565b9193909250565b606060008267ffffffffffffffff811115612c2157612c21612f33565b6040519080825280601f01601f191660200182016040528015612c4b576020820181803683370190505b509050805160001415612c5f579050611451565b6000612c6b858761364f565b90506020820160005b612c7f6020876135bf565b811015612cb65782518252612c9560208461364f565b9250612ca260208361364f565b915080612cae816136cd565b915050612c74565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061127082612edb565b606081612cfc81601f61364f565b1015612d64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610453565b82612d6f838261364f565b1015612dd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610453565b612de1828461364f565b84511015612e4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610453565b606082158015612e6a5760405191506000825260208201604052612ed2565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612ea3578051835260209283019201612e8b565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b6060611270826020015160008460000151612c04565b600060208284031215612f0357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612f2e57600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612fa957612fa9612f33565b604052919050565b600080600080600060a08688031215612fc957600080fd5b612fd286612f0a565b94506020808701359450604087013567ffffffffffffffff8082168214612ff857600080fd5b909450606088013590811515821461300f57600080fd5b9093506080880135908082111561302557600080fd5b818901915089601f83011261303957600080fd5b81358181111561304b5761304b612f33565b61307b847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612f62565b91508082528a8482850101111561309157600080fd5b80848401858401376000848284010152508093505050509295509295909350565b60008083601f8401126130c457600080fd5b50813567ffffffffffffffff8111156130dc57600080fd5b6020830191508360208285010111156130f457600080fd5b9250929050565b60008060008060008060008060008060006101808c8e03121561311d57600080fd5b8b359a5061312d60208d01612f0a565b995061313b60408d01612f0a565b985060608c0135975060808c0135965067ffffffffffffffff60a08d0135111561316457600080fd5b6131748d60a08e01358e016130b2565b909650945060c08c0135935060808c8e037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff200112156131b257600080fd5b60e08c01925067ffffffffffffffff6101608d013511156131d257600080fd5b6131e38d6101608e01358e016130b2565b81935080925050509295989b509295989b9093969950565b6000815180845260005b8181101561322157602081850181015186830182015201613205565b81811115613233576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b85815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611ac460a08301846131fb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156132de576132de61329d565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613321576133216132e3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156133755761337561329d565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156133b4576133b461329d565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156133e8576133e861329d565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561342f5761342f61329d565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561346a5761346a61329d565b600087129250878205871284841616156134865761348661329d565b8785058712818416161561349c5761349c61329d565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156134e4576134e461329d565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156135185761351861329d565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135565761355661329d565b500290565b600067ffffffffffffffff80831681851680830382111561357e5761357e61329d565b01949350505050565b60006fffffffffffffffffffffffffffffffff808316818516818304811182151516156135b6576135b661329d565b02949350505050565b6000826135ce576135ce6132e3565b500490565b6000604082840312156135e557600080fd5b6040516040810181811067ffffffffffffffff8211171561360857613608612f33565b604052825181526020928301519281019290925250919050565b60006020828403121561363457600080fd5b5051919050565b60008261364a5761364a6132e3565b500690565b600082198211156136625761366261329d565b500190565b60006080828403121561367957600080fd5b6040516080810181811067ffffffffffffffff8211171561369c5761369c612f33565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136ff576136ff61329d565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261375160c08301846131fb565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff83168061379f5761379f6132e3565b8060ff84160691505092915050565b600060ff821660ff8416808210156137c8576137c861329d565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080a000a"
var OptimismPortalDeployedBin = "0x6080604052600436106100f65760003560e01c80639bf62d821161008a578063cff0ab9611610059578063cff0ab96146102fc578063e9e05c421461039d578063eecf1c36146103b0578063f4daa291146103c357600080fd5b80639bf62d8214610275578063a14238e7146102a2578063ca3e99ba146102d2578063cd7c9789146102e757600080fd5b80636bb0291e116100c65780636bb0291e146102055780636dbffb781461021a5780638129fc1c1461024a578063867ead131461025f57600080fd5b80621c2ff61461012257806313620abd1461018057806335c14a16146101b957806364b79208146101e057600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f7565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101ce600181565b60405160ff9091168152602001610177565b3480156101ec57600080fd5b506101f7627a120081565b604051908152602001610177565b34801561021157600080fd5b506101f7600481565b34801561022657600080fd5b5061023a610235366004613216565b61089d565b6040519015158152602001610177565b34801561025657600080fd5b5061011b610bab565b34801561026b57600080fd5b506101f761271081565b34801561028157600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102ae57600080fd5b5061023a6102bd366004613216565b60346020526000908152604090205460ff1681565b3480156102de57600080fd5b506101f7610cd1565b3480156102f357600080fd5b506101f7600881565b34801561030857600080fd5b50600154610364906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103ab3660046132d1565b6103f7565b61011b6103be36600461341b565b610ce2565b3480156103cf57600080fd5b506101f77f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156104ae5773ffffffffffffffffffffffffffffffffffffffff8716156104ae57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104cf575033731111000000000000000000000000000000001111015b8773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f78231ae6eb73366f912bb1d64351601fb76344c537bbab635ce14d0f376f0195348a8a8a8a604051610534959493929190613586565b60405180910390a350600154600090610573907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436135ec565b905080156106fc57600061058b6004627a1200613632565b6001546105b69190700100000000000000000000000000000000900467ffffffffffffffff1661369a565b9050600060086105ca6004627a1200613632565b6001546105ea9085906fffffffffffffffffffffffffffffffff1661370e565b6105f49190613632565b6105fe9190613632565b60015490915060009061064a906106349061062c9085906fffffffffffffffffffffffffffffffff166137ca565b6127106113f5565b6fffffffffffffffffffffffffffffffff611410565b905060018411156106bd576106ba610634670de0b6b3a76400006106a6610672600883613632565b61068490670de0b6b3a764000061369a565b61068f60018a6135ec565b6106a190670de0b6b3a764000061383e565b61141f565b6106b0908561370e565b61062c9190613632565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805484919060109061072f908490700100000000000000000000000000000000900467ffffffffffffffff1661387b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561080b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4f7074696d69736d506f7274616c3a2063616e6e6f7420627579206d6f72652060448201527f676173207468616e20617661696c61626c6520676173206c696d69740000000060648201526084016104a5565b600154600090610837906fffffffffffffffffffffffffffffffff1667ffffffffffffffff86166138a7565b6fffffffffffffffffffffffffffffffff169050600061085b48633b9aca00611450565b61086590836138df565b905060005a61087490866135ec565b9050808211156108905761089061088b82846135ec565b611460565b5050505050505050505050565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa15801561092c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095091906138f3565b8051909150610b725760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663529933df6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ea9190613942565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634ab65d736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7d9190613942565b905084811115610a9257506000949350505050565b600082610a9f83886135ec565b610aa9919061395b565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae557610af183866135ec565b610afb908961396f565b6040518263ffffffff1660e01b8152600401610b1991815260200190565b6040805180830381865afa158015610b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5991906138f3565b8051909450610b6e5750600095945050505050565b5050505b7f00000000000000000000000000000000000000000000000000000000000000008160200151610ba2919061396f565b42119392505050565b60016000610bb88261148e565b90508015610bed57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055610c6860408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b8015610ccd57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff831681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b610cdf6004627a1200613632565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610d8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a5565b73ffffffffffffffffffffffffffffffffffffffff8916301415610e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a5565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee291906138f3565b90507f00000000000000000000000000000000000000000000000000000000000000008160200151610f14919061396f565b4211610fa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a5565b610fb9610fb436869003860186613987565b611619565b815114611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a5565b600061108e8d8d8d8d8d8d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061167592505050565b90506110d581866040013586868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116b492505050565b611161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a5565b60008181526034602052604090205460ff1615611200576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a5565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055611243614e208a61396f565b5a10156112d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a5565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e16179055604080516020601f8a0181900481028201810190925288815260009161135b918e918d918f918691908f908f908190840183828082843760009201919091525061177d92505050565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b906113c190841515815260200190565b60405180910390a25050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000818312156114055781611407565b825b90505b92915050565b60008183126114055781611407565b6000611407670de0b6b3a76400008361143786611808565b611441919061370e565b61144b9190613632565b611a4c565b6000818310156114055781611407565b6000805a90505b825a61147390836135ec565b101561148957611482826139ed565b9150611467565b505050565b60008054610100900460ff1615611545578160ff1660011480156114b15750303b155b61153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b506000919050565b60005460ff8084169116106115dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b60008160000151826020015183604001518460600151604051602001611658949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600086868686868660405160200161169296959493929190613a26565b6040516020818303038152906040528051906020012090509695505050505050565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506117729101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611c8b565b9150505b9392505050565b6000606060008060008661ffff1667ffffffffffffffff8111156117a3576117a3613253565b6040519080825280601f01601f1916602001820160405280156117cd576020820181803683370190505b5090506000808751602089018b8e8ef191503d9250868311156117ee578692505b828152826000602083013e90999098509650505050505050565b6000808213611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a5565b6000606061188084611caf565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213611a7d57506000919050565b680755bf798b4a1bf1e58212611aef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a5565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611c9786611d85565b9050611ca581868686611db7565b9695505050505050565b6000808211611d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a5565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611da191815260200190565b6040516020818303038152906040529050919050565b6000806000611dc7878686611df4565b91509150818015611de957508051602080830191909120875191880191909120145b979650505050505050565b600060606000611e0385611ee9565b90506000806000611e15848a89611fe4565b81519295509093509150158080611e295750815b611e8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f76696465642070726f6f6620697320696e76616c69642e00000000000060448201526064016104a5565b600081611eab5760405180602001604052806000815250611ed7565b611ed786611eba6001886135ec565b81518110611eca57611eca613a7d565b6020026020010151612501565b919b919a509098505050505050505050565b60606000611ef68361252b565b90506000815167ffffffffffffffff811115611f1457611f14613253565b604051908082528060200260200182016040528015611f5957816020015b6040805180820190915260608082526020820152815260200190600190039081611f325790505b50905060005b8251811015611fdc576000611f8c848381518110611f7f57611f7f613a7d565b602002602001015161255e565b90506040518060400160405280828152602001611fa88361252b565b815250838381518110611fbd57611fbd613a7d565b6020026020010181905250508080611fd4906139ed565b915050611f5f565b509392505050565b60006060818080611ff487612608565b9050600086905060008061201b604051806040016040528060608152602001606081525090565b60005b8c518110156124bd578c818151811061203957612039613a7d565b60200260200101519150828461204f919061396f565b935061205c60018861396f565b9650836120da578151805160209091012085146120d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c696420726f6f74206861736800000000000000000000000000000060448201526064016104a5565b6121cb565b815151602011612156578151805160209091012085146120d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c6964206c6172676520696e7465726e616c2068617368000000000060448201526064016104a5565b84612164836000015161278b565b146121cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f496e76616c696420696e7465726e616c206e6f6465206861736800000000000060448201526064016104a5565b6121d76010600161396f565b82602001515114156122505785518414156121f1576124bd565b600086858151811061220557612205613a7d565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061223057612230613a7d565b60200260200101519050612243816127b3565b96506001945050506124ab565b60028260200151511415612449576000612269836127e9565b905060008160008151811061228057612280613a7d565b016020015160f81c90506000612297600283613aac565b6122a2906002613ace565b905060006122b3848360ff1661280d565b905060006122c18b8a61280d565b905060006122cf8383612843565b905060ff8516600214806122e6575060ff85166003145b1561233c578083511480156122fb5750808251145b1561230d5761230a818b61396f565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506124bd945050505050565b60ff8516158061234f575060ff85166001145b156123c1578251811461238b57507f800000000000000000000000000000000000000000000000000000000000000099506124bd945050505050565b6123b288602001516001815181106123a5576123a5613a7d565b60200260200101516127b3565b9a5097506124ab945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f52656365697665642061206e6f6465207769746820616e20756e6b6e6f776e2060448201527f707265666978000000000000000000000000000000000000000000000000000060648201526084016104a5565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f526563656976656420616e20756e706172736561626c65206e6f64652e00000060448201526064016104a5565b806124b5816139ed565b91505061201e565b507f80000000000000000000000000000000000000000000000000000000000000008414866124ec878661280d565b909e909d50909b509950505050505050505050565b6020810151805160609161140a9161251b906001906135ec565b81518110611f7f57611f7f613a7d565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061140a906128ef565b6060600080600061256e85612b22565b91945092509050600081600181111561258957612589613af1565b146125f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c502062797465732076616c75652e000000000000000060448201526064016104a5565b6125ff85602001518484612f29565b95945050505050565b606060008251600261261a919061383e565b67ffffffffffffffff81111561263257612632613253565b6040519080825280601f01601f19166020018201604052801561265c576020820181803683370190505b50905060005b835181101561278457600484828151811061267f5761267f613a7d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826126b483600261383e565b815181106126c4576126c4613a7d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061270757612707613a7d565b0160200151612719919060f81c613aac565b60f81b8261272883600261383e565b61273390600161396f565b8151811061274357612743613a7d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061277c816139ed565b915050612662565b5092915050565b600060208251101561279f57506020015190565b8180602001905181019061140a9190613942565b600060606020836000015110156127d4576127cd83613008565b90506127e0565b6127dd8361255e565b90505b6117768161278b565b606061140a6128088360200151600081518110611f7f57611f7f613a7d565b612608565b60608251821061282c575060408051602081019091526000815261140a565b611407838384865161283e91906135ec565b613013565b6000805b8084511180156128575750808351115b80156128d8575082818151811061287057612870613a7d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181106128af576128af613a7d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561140757806128e7816139ed565b915050612847565b60606000806128fd84612b22565b9193509091506001905081600181111561291957612919613af1565b14612980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c50206c6973742076616c75652e00000000000000000060448201526064016104a5565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816129995790505090506000835b8651811015612b175760208210612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f50726f766964656420524c50206c6973742065786365656473206d6178206c6960448201527f7374206c656e6774682e0000000000000000000000000000000000000000000060648201526084016104a5565b600080612a9c6040518060400160405280858c60000151612a8091906135ec565b8152602001858c60200151612a95919061396f565b9052612b22565b509150915060405180604001604052808383612ab8919061396f565b8152602001848b60200151612acd919061396f565b815250858581518110612ae257612ae2613a7d565b6020908102919091010152612af860018561396f565b9350612b04818361396f565b612b0e908461396f565b925050506129c6565b508152949350505050565b600080600080846000015111612b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f524c50206974656d2063616e6e6f74206265206e756c6c2e000000000000000060448201526064016104a5565b6020840151805160001a607f8111612bb9576000600160009450945094505050612f22565b60b78111612c4f576000612bce6080836135ec565b905080876000015111612c3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c696420524c502073686f727420737472696e672e0000000000000060448201526064016104a5565b60019550935060009250612f22915050565b60bf8111612d72576000612c6460b7836135ec565b905080876000015111612cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f496e76616c696420524c50206c6f6e6720737472696e67206c656e6774682e0060448201526064016104a5565b600183015160208290036101000a9004612ced818361396f565b885111612d56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420524c50206c6f6e6720737472696e672e000000000000000060448201526064016104a5565b612d6182600161396f565b9650945060009350612f2292505050565b60f78111612e07576000612d8760c0836135ec565b905080876000015111612df6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c696420524c502073686f7274206c6973742e00000000000000000060448201526064016104a5565b600195509350849250612f22915050565b6000612e1460f7836135ec565b905080876000015111612e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e76616c696420524c50206c6f6e67206c697374206c656e6774682e00000060448201526064016104a5565b600183015160208290036101000a9004612e9d818361396f565b885111612f06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c696420524c50206c6f6e67206c6973742e0000000000000000000060448201526064016104a5565b612f1182600161396f565b9650945060019350612f2292505050565b9193909250565b606060008267ffffffffffffffff811115612f4657612f46613253565b6040519080825280601f01601f191660200182016040528015612f70576020820181803683370190505b509050805160001415612f84579050611776565b6000612f90858761396f565b90506020820160005b612fa46020876138df565b811015612fdb5782518252612fba60208461396f565b9250612fc760208361396f565b915080612fd3816139ed565b915050612f99565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061140a82613200565b60608161302181601f61396f565b1015613089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a5565b82613094838261396f565b10156130fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a5565b613106828461396f565b84511015613170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a5565b60608215801561318f57604051915060008252602082016040526131f7565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156131c85780518352602092830192016131b0565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606061140a826020015160008460000151612f29565b60006020828403121561322857600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461161457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156132c9576132c9613253565b604052919050565b600080600080600060a086880312156132e957600080fd5b6132f28661322f565b94506020808701359450604087013567ffffffffffffffff808216821461331857600080fd5b909450606088013590811515821461332f57600080fd5b9093506080880135908082111561334557600080fd5b818901915089601f83011261335957600080fd5b81358181111561336b5761336b613253565b61339b847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613282565b91508082528a848285010111156133b157600080fd5b80848401858401376000848284010152508093505050509295509295909350565b60008083601f8401126133e457600080fd5b50813567ffffffffffffffff8111156133fc57600080fd5b60208301915083602082850101111561341457600080fd5b9250929050565b60008060008060008060008060008060006101808c8e03121561343d57600080fd5b8b359a5061344d60208d0161322f565b995061345b60408d0161322f565b985060608c0135975060808c0135965067ffffffffffffffff60a08d0135111561348457600080fd5b6134948d60a08e01358e016133d2565b909650945060c08c0135935060808c8e037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff200112156134d257600080fd5b60e08c01925067ffffffffffffffff6101608d013511156134f257600080fd5b6135038d6101608e01358e016133d2565b81935080925050509295989b509295989b9093969950565b6000815180845260005b8181101561354157602081850181015186830182015201613525565b81811115613553576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b85815284602082015267ffffffffffffffff84166040820152821515606082015260a060808201526000611de960a083018461351b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156135fe576135fe6135bd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261364157613641613603565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615613695576136956135bd565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156136d4576136d46135bd565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615613708576137086135bd565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561374f5761374f6135bd565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561378a5761378a6135bd565b600087129250878205871284841616156137a6576137a66135bd565b878505871281841616156137bc576137bc6135bd565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615613804576138046135bd565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615613838576138386135bd565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613876576138766135bd565b500290565b600067ffffffffffffffff80831681851680830382111561389e5761389e6135bd565b01949350505050565b60006fffffffffffffffffffffffffffffffff808316818516818304811182151516156138d6576138d66135bd565b02949350505050565b6000826138ee576138ee613603565b500490565b60006040828403121561390557600080fd5b6040516040810181811067ffffffffffffffff8211171561392857613928613253565b604052825181526020928301519281019290925250919050565b60006020828403121561395457600080fd5b5051919050565b60008261396a5761396a613603565b500690565b60008219821115613982576139826135bd565b500190565b60006080828403121561399957600080fd5b6040516080810181811067ffffffffffffffff821117156139bc576139bc613253565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a1f57613a1f6135bd565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613a7160c083018461351b565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680613abf57613abf613603565b8060ff84160691505092915050565b600060ff821660ff841680821015613ae857613ae86135bd565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080a000a"
......@@ -27,26 +27,26 @@ L1CrossDomainMessenger_Test:testCannot_L1MessengerPause() (gas: 10844)
L1CrossDomainMessenger_Test:testCannot_L1MessengerUnpause() (gas: 10858)
L1CrossDomainMessenger_Test:test_L1MessengerMessageVersion() (gas: 8388)
L1CrossDomainMessenger_Test:test_L1MessengerPause() (gas: 31860)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageSucceeds() (gas: 61283)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageToSystemContract() (gas: 44903)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageSucceeds() (gas: 61217)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageToSystemContract() (gas: 44837)
L1CrossDomainMessenger_Test:test_L1MessengerRelayShouldRevertIfPaused() (gas: 41587)
L1CrossDomainMessenger_Test:test_L1MessengerSendMessage() (gas: 172193)
L1CrossDomainMessenger_Test:test_L1MessengerTwiceSendMessage() (gas: 1254199)
L1CrossDomainMessenger_Test:test_L1MessengerSendMessage() (gas: 172199)
L1CrossDomainMessenger_Test:test_L1MessengerTwiceSendMessage() (gas: 1254211)
L1CrossDomainMessenger_Test:test_L1MessengerUnpause() (gas: 23804)
L1CrossDomainMessenger_Test:test_L1MessengerXDomainSenderReverts() (gas: 10599)
L1CrossDomainMessenger_Test:test_L1MessengerxDomainMessageSenderResets() (gas: 58601)
L1StandardBridge_Test:test_depositERC20() (gas: 452856)
L1StandardBridge_Test:test_depositERC20To() (gas: 454632)
L1StandardBridge_Test:test_depositETH() (gas: 247077)
L1StandardBridge_Test:test_depositETHTo() (gas: 204961)
L1StandardBridge_Test:test_finalizeERC20Withdrawal() (gas: 438745)
L1CrossDomainMessenger_Test:test_L1MessengerxDomainMessageSenderResets() (gas: 59022)
L1StandardBridge_Test:test_depositERC20() (gas: 452889)
L1StandardBridge_Test:test_depositERC20To() (gas: 454644)
L1StandardBridge_Test:test_depositETH() (gas: 247083)
L1StandardBridge_Test:test_depositETHTo() (gas: 204967)
L1StandardBridge_Test:test_finalizeERC20Withdrawal() (gas: 438779)
L1StandardBridge_Test:test_finalizeETHWithdrawal() (gas: 48005)
L1StandardBridge_Test:test_initialize() (gas: 14885)
L1StandardBridge_Test:test_onlyEOADepositERC20() (gas: 12085)
L1StandardBridge_Test:test_onlyEOADepositETH() (gas: 30637)
L1StandardBridge_Test:test_onlyL2BridgeFinalizeERC20Withdrawal() (gas: 23565)
L1StandardBridge_Test:test_onlyPortalFinalizeERC20Withdrawal() (gas: 22919)
L1StandardBridge_Test:test_receive() (gas: 391817)
L1StandardBridge_Test:test_receive() (gas: 391823)
L2CrossDomainMessenger_Test:testCannot_L2MessengerPause() (gas: 10843)
L2CrossDomainMessenger_Test:test_L2MessengerMessageVersion() (gas: 8410)
L2CrossDomainMessenger_Test:test_L2MessengerPause() (gas: 31837)
......@@ -57,27 +57,28 @@ L2CrossDomainMessenger_Test:test_L2MessengerSendMessage() (gas: 119682)
L2CrossDomainMessenger_Test:test_L2MessengerTwiceSendMessage() (gas: 133142)
L2CrossDomainMessenger_Test:test_L2MessengerXDomainSenderReverts() (gas: 10599)
L2CrossDomainMessenger_Test:test_L2MessengerxDomainMessageSenderResets() (gas: 54881)
L2OutputOracleTest:testCannot_appendEmptyOutput() (gas: 18216)
L2OutputOracleTest:testCannot_appendFutureTimetamp() (gas: 20183)
L2OutputOracleTest:testCannot_appendOnWrongFork() (gas: 20462)
L2OutputOracleTest:testCannot_appendOutputIfNotSequencer() (gas: 17607)
L2OutputOracleTest:testCannot_appendUnexpectedBlockNumber() (gas: 20086)
L2OutputOracleTest:testCannot_deleteL2Output_ifNotOwner() (gas: 18893)
L2OutputOracleTest:testCannot_deleteL2Output_withWrongRoot() (gas: 83353)
L2OutputOracleTest:testCannot_deleteL2Output_withWrongTime() (gas: 79346)
L2OutputOracleTest:test_appendWithBlockhashAndHeight() (gas: 69126)
L2OutputOracleTest:test_appendingAnotherOutput() (gas: 70475)
L2OutputOracleTest:test_changeSequencer() (gas: 35473)
L2OutputOracleTest:test_computeL2Timestamp() (gas: 19323)
L2OutputOracleTest:test_constructor() (gas: 40152)
L2OutputOracleTest:test_deleteL2Output() (gas: 69237)
L2OutputOracleTest:test_getL2Output() (gas: 76099)
L2OutputOracleTest:test_latestBlockNumber() (gas: 69878)
L2OutputOracleTest:test_nextBlockNumber() (gas: 9281)
L2OutputOracleTest:test_updateOwner() (gas: 24185)
L2OutputOracleUpgradeable_Test:test_cannotInitImpl() (gas: 8431)
L2OutputOracleTest:testCannot_appendEmptyOutput() (gas: 24163)
L2OutputOracleTest:testCannot_appendFutureTimetamp() (gas: 26130)
L2OutputOracleTest:testCannot_appendOnWrongFork() (gas: 26415)
L2OutputOracleTest:testCannot_appendOutputIfNotSequencer() (gas: 23554)
L2OutputOracleTest:testCannot_appendUnexpectedBlockNumber() (gas: 26039)
L2OutputOracleTest:testCannot_deleteL2Output_ifNotOwner() (gas: 24799)
L2OutputOracleTest:testCannot_deleteL2Output_withWrongRoot() (gas: 91157)
L2OutputOracleTest:testCannot_deleteL2Output_withWrongTime() (gas: 87150)
L2OutputOracleTest:test_appendWithBlockhashAndHeight() (gas: 75061)
L2OutputOracleTest:test_appendingAnotherOutput() (gas: 76861)
L2OutputOracleTest:test_changeSequencer() (gas: 55776)
L2OutputOracleTest:test_computeL2Timestamp() (gas: 30288)
L2OutputOracleTest:test_constructor() (gas: 48845)
L2OutputOracleTest:test_deleteL2Output() (gas: 76604)
L2OutputOracleTest:test_getL2Output() (gas: 83012)
L2OutputOracleTest:test_latestBlockNumber() (gas: 76264)
L2OutputOracleTest:test_nextBlockNumber() (gas: 15166)
L2OutputOracleTest:test_updateOwner() (gas: 34646)
L2OutputOracleUpgradeable_Test:test_cannotInitImpl() (gas: 8453)
L2OutputOracleUpgradeable_Test:test_cannotInitProxy() (gas: 13430)
L2OutputOracleUpgradeable_Test:test_initValuesOnProxy() (gas: 38906)
L2OutputOracleUpgradeable_Test:test_upgrading() (gas: 230843)
L2StandardBridge_Test:test_ERC20BridgeFailed_whenLocalTokenIsBridge() (gas: 133097)
L2StandardBridge_Test:test_cannotWithdrawEthWithoutSendingIt() (gas: 21611)
L2StandardBridge_Test:test_finalizeDeposit() (gas: 93100)
......@@ -113,21 +114,25 @@ OptimismMintableTokenFactory_Test:test_createStandardL2Token() (gas: 1100125)
OptimismMintableTokenFactory_Test:test_createStandardL2TokenSameTwice() (gas: 2181161)
OptimismMintableTokenFactory_Test:test_createStandardL2TokenShouldRevertIfRemoteIsZero() (gas: 9374)
OptimismMintableTokenFactory_Test:test_initializeShouldRevert() (gas: 12696)
OptimismPortal_Test:test_OptimismPortalConstructor() (gas: 11435)
OptimismPortal_Test:test_OptimismPortalContractCreationReverts() (gas: 9192)
OptimismPortal_Test:test_OptimismPortalReceiveEth() (gas: 121771)
OptimismPortal_Test:test_cannotVerifyRecentWithdrawal() (gas: 21886)
OptimismPortal_Test:test_depositTransaction_NoValueContract() (gas: 70746)
OptimismPortal_Test:test_depositTransaction_NoValueEOA() (gas: 71092)
OptimismPortal_Test:test_depositTransaction_createWithZeroValueForContract() (gas: 70751)
OptimismPortal_Test:test_depositTransaction_createWithZeroValueForEOA() (gas: 71095)
OptimismPortal_Test:test_depositTransaction_withEthValueAndContractContractCreation() (gas: 77795)
OptimismPortal_Test:test_depositTransaction_withEthValueAndEOAContractCreation() (gas: 69925)
OptimismPortal_Test:test_depositTransaction_withEthValueFromContract() (gas: 77456)
OptimismPortal_Test:test_depositTransaction_withEthValueFromEOA() (gas: 78072)
OptimismPortal_Test:test_invalidWithdrawalProof() (gas: 33769)
OptimismPortal_Test:test_isOutputFinalized() (gas: 109379)
OptimismPortal_Test:test_simple_isOutputFinalized() (gas: 17076)
OptimismPortalUpgradeable_Test:test_cannotInitImpl() (gas: 10958)
OptimismPortalUpgradeable_Test:test_cannotInitProxy() (gas: 15956)
OptimismPortalUpgradeable_Test:test_initValuesOnProxy() (gas: 15967)
OptimismPortalUpgradeable_Test:test_upgrading() (gas: 230843)
OptimismPortal_Test:test_OptimismPortalConstructor() (gas: 17286)
OptimismPortal_Test:test_OptimismPortalContractCreationReverts() (gas: 14214)
OptimismPortal_Test:test_OptimismPortalReceiveEth() (gas: 126643)
OptimismPortal_Test:test_cannotVerifyRecentWithdrawal() (gas: 31945)
OptimismPortal_Test:test_depositTransaction_NoValueContract() (gas: 75774)
OptimismPortal_Test:test_depositTransaction_NoValueEOA() (gas: 76120)
OptimismPortal_Test:test_depositTransaction_createWithZeroValueForContract() (gas: 75779)
OptimismPortal_Test:test_depositTransaction_createWithZeroValueForEOA() (gas: 76123)
OptimismPortal_Test:test_depositTransaction_withEthValueAndContractContractCreation() (gas: 82823)
OptimismPortal_Test:test_depositTransaction_withEthValueAndEOAContractCreation() (gas: 74941)
OptimismPortal_Test:test_depositTransaction_withEthValueFromContract() (gas: 82484)
OptimismPortal_Test:test_depositTransaction_withEthValueFromEOA() (gas: 83100)
OptimismPortal_Test:test_invalidWithdrawalProof() (gas: 45251)
OptimismPortal_Test:test_isOutputFinalized() (gas: 132162)
OptimismPortal_Test:test_simple_isOutputFinalized() (gas: 23965)
Proxy_Test:test_clashingFunctionSignatures() (gas: 101427)
Proxy_Test:test_implementationKey() (gas: 20942)
Proxy_Test:test_implementationProxyCallIfNotAdmin() (gas: 30021)
......
......@@ -91,11 +91,19 @@
+----------------------+----------------------------------------+------+--------+-------+
| Name | Type | Slot | Offset | Bytes |
+=======================================================================================+
| params | struct ResourceMetering.ResourceParams | 0 | 0 | 32 |
| _initialized | uint8 | 0 | 0 | 1 |
|----------------------+----------------------------------------+------+--------+-------|
| l2Sender | address | 1 | 0 | 20 |
| _initializing | bool | 0 | 1 | 1 |
|----------------------+----------------------------------------+------+--------+-------|
| finalizedWithdrawals | mapping(bytes32 => bool) | 2 | 0 | 32 |
| params | struct ResourceMetering.ResourceParams | 1 | 0 | 32 |
|----------------------+----------------------------------------+------+--------+-------|
| __gap | uint256[49] | 2 | 0 | 1568 |
|----------------------+----------------------------------------+------+--------+-------|
| l2Sender | address | 51 | 0 | 20 |
|----------------------+----------------------------------------+------+--------+-------|
| finalizedWithdrawals | mapping(bytes32 => bool) | 52 | 0 | 32 |
|----------------------+----------------------------------------+------+--------+-------|
| __gap | uint256[48] | 53 | 0 | 1536 |
+----------------------+----------------------------------------+------+--------+-------+
=======================
......
......@@ -6,6 +6,7 @@ import { WithdrawalVerifier } from "../libraries/Lib_WithdrawalVerifier.sol";
import { AddressAliasHelper } from "../libraries/AddressAliasHelper.sol";
import { ExcessivelySafeCall } from "../libraries/ExcessivelySafeCall.sol";
import { ResourceMetering } from "./ResourceMetering.sol";
import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
/**
* @custom:proxied
......@@ -14,7 +15,12 @@ import { ResourceMetering } from "./ResourceMetering.sol";
* and L2. Messages sent directly to the OptimismPortal have no form of replayability.
* Users are encouraged to use the L1CrossDomainMessenger for a higher-level interface.
*/
contract OptimismPortal is ResourceMetering {
contract OptimismPortal is Initializable, ResourceMetering {
/**
* @notice Contract version number.
*/
uint8 public constant OPTIMISM_PORTAL_VERSION = 1;
/**
* @notice Emitted when a transaction is deposited from L1 to L2. The parameters of this event
* are read by the rollup node and used to derive deposit transactions on L2.
......@@ -65,7 +71,7 @@ contract OptimismPortal is ResourceMetering {
* of this variable is the default L2 sender address, then we are NOT inside of a call
* to finalizeWithdrawalTransaction.
*/
address public l2Sender = DEFAULT_L2_SENDER;
address public l2Sender;
/**
* @notice The L2 gas limit set when eth is deposited using the receive() function.
......@@ -83,12 +89,29 @@ contract OptimismPortal is ResourceMetering {
mapping(bytes32 => bool) public finalizedWithdrawals;
/**
* @param _l2Oracle Address of the L2OutputOracle.
* @param _finalizationPeriodSeconds Finalization time in seconds.
* @notice Reserve extra slots (to to a total of 50) in the storage layout for future upgrades.
*/
uint256[48] private __gap;
/**
* @notice The constructor sets immutable values in the implementation.
* This means that these values can only changed by an upgrade. But the efficiency gains
* are worthwhile.
* Also ensures that the implementation is initialized upon deployment.
*/
constructor(L2OutputOracle _l2Oracle, uint256 _finalizationPeriodSeconds) {
// Set these immutable values into the bytcode of the implementation.
L2_ORACLE = _l2Oracle;
FINALIZATION_PERIOD_SECONDS = _finalizationPeriodSeconds;
initialize();
}
/**
* @notice Initializes the contract and parent contract(s).
*/
function initialize() public reinitializer(OPTIMISM_PORTAL_VERSION) {
l2Sender = DEFAULT_L2_SENDER;
__ResourceMetering_init();
}
/**
......
......@@ -58,9 +58,23 @@ contract ResourceMetering {
ResourceParams public params;
/**
* @notice Sets initial resource parameter values.
* @notice Reserve extra slots (to a total of 50) in the storage layout for future upgrades.
*/
uint256[49] private __gap;
/**
* @notice Set the initial values. In order to enable this contract to be used in an upgradable
* context, the constructor calls a separate init function.
*/
constructor() {
__ResourceMetering_init();
}
/**
* @notice Sets initial resource parameter values. This function must either be called by the
* initializer function of an upgradeable child contract.
*/
function __ResourceMetering_init() internal {
params = ResourceParams({
prevBaseFee: INITIAL_BASE_FEE,
prevBoughtGas: 0,
......
......@@ -17,6 +17,8 @@ import { AddressAliasHelper } from "../libraries/AddressAliasHelper.sol";
import { OVM_ETH } from "../L2/OVM_ETH.sol";
import { Lib_PredeployAddresses } from "../libraries/Lib_PredeployAddresses.sol";
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import { Proxy } from "../universal/Proxy.sol";
import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol";
contract CommonTest is Test {
address alice = address(128);
......@@ -46,6 +48,7 @@ contract CommonTest is Test {
contract L2OutputOracle_Initializer is CommonTest {
// Test target
L2OutputOracle oracle;
L2OutputOracle oracleImpl;
// Constructor arguments
address sequencer = 0x000000000000000000000000000000000000AbBa;
......@@ -69,7 +72,7 @@ contract L2OutputOracle_Initializer is CommonTest {
vm.warp(initL1Time);
vm.roll(startingBlockNumber);
// Deploy the L2OutputOracle and transfer owernship to the sequencer
oracle = new L2OutputOracle(
oracleImpl = new L2OutputOracle(
submissionInterval,
genesisL2Output,
historicalTotalBlocks,
......@@ -79,6 +82,39 @@ contract L2OutputOracle_Initializer is CommonTest {
sequencer,
owner
);
Proxy proxy = new Proxy(alice);
vm.prank(alice);
proxy.upgradeToAndCall(
address(oracleImpl),
abi.encodeWithSelector(
L2OutputOracle.initialize.selector,
genesisL2Output,
startingBlockNumber,
sequencer,
owner
)
);
oracle = L2OutputOracle(address(proxy));
}
}
contract Portal_Initializer is L2OutputOracle_Initializer {
// Test target
OptimismPortal opImpl;
OptimismPortal op;
function setUp() public override virtual {
L2OutputOracle_Initializer.setUp();
opImpl = new OptimismPortal(oracle, 7 days);
Proxy proxy = new Proxy(alice);
vm.prank(alice);
proxy.upgradeToAndCall(
address(opImpl),
abi.encodeWithSelector(
OptimismPortal.initialize.selector
)
);
op = OptimismPortal(payable(address(proxy)));
}
}
......@@ -125,7 +161,7 @@ contract Messenger_Initializer is L2OutputOracle_Initializer {
super.setUp();
// Deploy the OptimismPortal
op = new OptimismPortal(oracle, 100);
op = new OptimismPortal(oracle, 7 days);
vm.label(address(op), "OptimismPortal");
L1Messenger = new L1CrossDomainMessenger();
......@@ -320,3 +356,19 @@ contract Bridge_Initializer is Messenger_Initializer {
);
}
}
// Used for testing a future upgrade beyond the current implementations.
// We include some variables so that we can sanity check accessing storage values after an upgrade.
contract NextImpl is Initializable {
// Initializable occupies the zero-th slot.
bytes32 slot1;
bytes32[19] __gap;
bytes32 slot21;
bytes32 public constant slot21Init = bytes32(hex"1337");
function initialize() public reinitializer(2) {
// Slot21 is unused by an of our upgradeable contracts.
// This is used to verify that we can access this value after an upgrade.
slot21 = slot21Init;
}
}
......@@ -110,13 +110,7 @@ contract L1CrossDomainMessenger_Test is Messenger_Initializer {
// SentMessage event
vm.expectEmit(true, true, true, true);
emit SentMessage(
recipient,
alice,
hex"ff",
L1Messenger.messageNonce(),
100
);
emit SentMessage(recipient, alice, hex"ff", L1Messenger.messageNonce(), 100);
vm.prank(alice);
L1Messenger.sendMessage(recipient, hex"ff", uint32(100));
......@@ -128,10 +122,7 @@ contract L1CrossDomainMessenger_Test is Messenger_Initializer {
L1Messenger.sendMessage(recipient, hex"aa", uint32(500_000));
L1Messenger.sendMessage(recipient, hex"aa", uint32(500_000));
// the nonce increments for each message sent
assertEq(
nonce + 2,
L1Messenger.messageNonce()
);
assertEq(nonce + 2, L1Messenger.messageNonce());
}
function test_L1MessengerXDomainSenderReverts() external {
......@@ -151,20 +142,13 @@ contract L1CrossDomainMessenger_Test is Messenger_Initializer {
vm.expectCall(target, hex"1111");
// set the value of op.l2Sender() to be the L2 Cross Domain Messenger.
uint256 senderSlotIndex = 1;
uint256 senderSlotIndex = 51;
vm.store(address(op), bytes32(senderSlotIndex), bytes32(abi.encode(sender)));
vm.prank(address(op));
vm.expectEmit(true, true, true, true);
bytes32 hash = CrossDomainHashing.getVersionedHash(
0,
sender,
target,
0,
0,
hex"1111"
);
bytes32 hash = CrossDomainHashing.getVersionedHash(0, sender, target, 0, 0, hex"1111");
emit RelayedMessage(hash);
......@@ -206,7 +190,10 @@ contract L1CrossDomainMessenger_Test is Messenger_Initializer {
L1Messenger.xDomainMessageSender();
address sender = Lib_PredeployAddresses.L2_CROSS_DOMAIN_MESSENGER;
uint256 senderSlotIndex = 1;
uint256 senderSlotIndex = 51;
bytes32 slotValue = vm.load(address(op), bytes32(senderSlotIndex));
vm.store(address(op), bytes32(senderSlotIndex), bytes32(abi.encode(sender)));
vm.prank(address(op));
L1Messenger.relayMessage(0, address(0), address(0), 0, 0, hex"");
......
//SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
import { L2OutputOracle_Initializer } from "./CommonTest.t.sol";
import { L2OutputOracle_Initializer, NextImpl } from "./CommonTest.t.sol";
import { L2OutputOracle } from "../L1/L2OutputOracle.sol";
import { Proxy } from "../universal/Proxy.sol";
contract L2OutputOracleTest is L2OutputOracle_Initializer {
bytes32 appendedOutput1 = keccak256(abi.encode(1));
......@@ -336,28 +337,11 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer {
}
contract L2OutputOracleUpgradeable_Test is L2OutputOracle_Initializer {
L2OutputOracle oracleImpl;
Proxy internal proxy;
uint64 initialBlockNum;
function setUp() override public {
function setUp() public override {
super.setUp();
initialBlockNum = uint64(block.number);
// Rename the deployed oracle instance for the purposes of this test.
oracleImpl = oracle;
proxy = new Proxy(alice);
vm.prank(alice);
proxy.upgradeToAndCall(
address(oracleImpl),
abi.encodeWithSelector(
L2OutputOracle.initialize.selector,
genesisL2Output,
startingBlockNumber,
sequencer,
owner
)
);
proxy = Proxy(payable(address(oracle)));
}
function test_initValuesOnProxy() external {
......@@ -367,7 +351,9 @@ contract L2OutputOracleUpgradeable_Test is L2OutputOracle_Initializer {
assertEq(startingTimestamp, oracleImpl.STARTING_TIMESTAMP());
assertEq(l2BlockTime, oracleImpl.L2_BLOCK_TIME());
L2OutputOracle.OutputProposal memory initOutput = oracleImpl.getL2Output(startingBlockNumber);
L2OutputOracle.OutputProposal memory initOutput = oracleImpl.getL2Output(
startingBlockNumber
);
assertEq(genesisL2Output, initOutput.outputRoot);
assertEq(initL1Time, initOutput.timestamp);
......@@ -384,4 +370,23 @@ contract L2OutputOracleUpgradeable_Test is L2OutputOracle_Initializer {
vm.expectRevert("Initializable: contract is already initialized");
address(oracleImpl).call(abi.encodeWithSelector(L2OutputOracle.initialize.selector));
}
function test_upgrading() external {
// Check an unused slot before upgrading.
bytes32 slot21Before = vm.load(address(oracle), bytes32(uint256(21)));
assertEq(bytes32(0), slot21Before);
NextImpl nextImpl = new NextImpl();
vm.startPrank(alice);
proxy.upgradeToAndCall(
address(nextImpl),
abi.encodeWithSelector(NextImpl.initialize.selector)
);
assertEq(proxy.implementation(), address(nextImpl));
// Verify that the NextImpl contract initialized its values according as expected
bytes32 slot21After = vm.load(address(oracle), bytes32(uint256(21)));
bytes32 slot21Expected = NextImpl(address(oracle)).slot21Init();
assertEq(slot21Expected, slot21After);
}
}
//SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
import { L2OutputOracle_Initializer } from "./CommonTest.t.sol";
import { Portal_Initializer, CommonTest, NextImpl } from "./CommonTest.t.sol";
import { AddressAliasHelper } from "../libraries/AddressAliasHelper.sol";
import { L2OutputOracle } from "../L1/L2OutputOracle.sol";
import { OptimismPortal } from "../L1/OptimismPortal.sol";
import { WithdrawalVerifier } from "../libraries/Lib_WithdrawalVerifier.sol";
import { Proxy } from "../universal/Proxy.sol";
contract OptimismPortal_Test is L2OutputOracle_Initializer {
contract OptimismPortal_Test is Portal_Initializer {
event TransactionDeposited(
address indexed from,
address indexed to,
......@@ -19,14 +20,6 @@ contract OptimismPortal_Test is L2OutputOracle_Initializer {
bytes data
);
// Test target
OptimismPortal op;
function setUp() public override {
L2OutputOracle_Initializer.setUp();
op = new OptimismPortal(oracle, 7 days);
}
function test_OptimismPortalConstructor() external {
assertEq(op.FINALIZATION_PERIOD_SECONDS(), 7 days);
assertEq(address(op.L2_ORACLE()), address(oracle));
......@@ -319,3 +312,52 @@ contract OptimismPortal_Test is L2OutputOracle_Initializer {
assertEq(op.isOutputFinalized(checkpoint + 1), false);
}
}
contract OptimismPortalUpgradeable_Test is Portal_Initializer {
Proxy internal proxy;
uint64 initialBlockNum;
function setUp() public override {
super.setUp();
initialBlockNum = uint64(block.number);
proxy = Proxy(payable(address(op)));
}
function test_initValuesOnProxy() external {
(uint128 prevBaseFee, uint64 prevBoughtGas, uint64 prevBlockNum) = OptimismPortal(
payable(address(proxy))
).params();
assertEq(prevBaseFee, opImpl.INITIAL_BASE_FEE());
assertEq(prevBoughtGas, 0);
assertEq(prevBlockNum, initialBlockNum);
}
function test_cannotInitProxy() external {
vm.expectRevert("Initializable: contract is already initialized");
address(proxy).call(abi.encodeWithSelector(OptimismPortal.initialize.selector));
}
function test_cannotInitImpl() external {
vm.expectRevert("Initializable: contract is already initialized");
address(opImpl).call(abi.encodeWithSelector(OptimismPortal.initialize.selector));
}
function test_upgrading() external {
// Check an unused slot before upgrading.
bytes32 slot21Before = vm.load(address(op), bytes32(uint256(21)));
assertEq(bytes32(0), slot21Before);
NextImpl nextImpl = new NextImpl();
vm.startPrank(alice);
proxy.upgradeToAndCall(
address(nextImpl),
abi.encodeWithSelector(NextImpl.initialize.selector)
);
assertEq(proxy.implementation(), address(nextImpl));
// Verify that the NextImpl contract initialized its values according as expected
bytes32 slot21After = vm.load(address(op), bytes32(uint256(21)));
bytes32 slot21Expected = NextImpl(address(op)).slot21Init();
assertEq(slot21Expected, slot21After);
}
}
......@@ -3,8 +3,13 @@ pragma solidity 0.8.10;
import { CommonTest } from "./CommonTest.t.sol";
import { ResourceMetering } from "../L1/ResourceMetering.sol";
import { Proxy } from "../universal/Proxy.sol";
contract MeterUser is ResourceMetering {
constructor() {
__ResourceMetering_init();
}
function use(uint64 _amount) public metered(_amount) {}
}
......
......@@ -29,15 +29,18 @@ const deployFn: DeployFunction = async (hre) => {
const proxy = await hre.deployments.get('OptimismPortalProxy')
const Proxy = await hre.ethers.getContractAt('Proxy', proxy.address)
const portal = await hre.deployments.get('OptimismPortal')
const tx = await Proxy.upgradeTo(portal.address)
await tx.wait()
const OptimismPortal = await hre.ethers.getContractAt(
'OptimismPortal',
proxy.address
)
const portal = await hre.deployments.get('OptimismPortal')
const tx = await Proxy.upgradeToAndCall(
portal.address,
OptimismPortal.interface.encodeFunctionData('initialize()')
)
await tx.wait()
const l2Oracle = await OptimismPortal.L2_ORACLE()
if (l2Oracle !== oracle.address) {
throw new Error('L2 Oracle mismatch')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment