diff --git a/.changeset/spicy-buckets-beam.md b/.changeset/spicy-buckets-beam.md new file mode 100644 index 0000000000000..c2b3df98fe01c --- /dev/null +++ b/.changeset/spicy-buckets-beam.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts-bedrock': minor +--- + +Refactors the MerkleTrie get function to throw explicitly instead of returning an existence boolean diff --git a/.changeset/tall-pets-punch.md b/.changeset/tall-pets-punch.md new file mode 100644 index 0000000000000..e47366a4b334d --- /dev/null +++ b/.changeset/tall-pets-punch.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts-bedrock': patch +--- + +Adds the `go-fuzz` package and a fuzz mode for Bedrock's `MerkleTrie.sol` diff --git a/go.work b/go.work index 9d05ab2d5bdfd..0fc4cf2a78119 100644 --- a/go.work +++ b/go.work @@ -17,6 +17,7 @@ use ( ./op-proposer ./op-service ./proxyd + ./packages/contracts-bedrock/go-fuzz ) replace github.com/ethereum/go-ethereum v1.10.26 => github.com/ethereum-optimism/op-geth v0.0.0-20221104231810-30db39cae2be diff --git a/op-bindings/bindings/optimismportal.go b/op-bindings/bindings/optimismportal.go index ab3145b97a239..0993d0ed2b54f 100644 --- a/op-bindings/bindings/optimismportal.go +++ b/op-bindings/bindings/optimismportal.go @@ -48,8 +48,8 @@ type TypesWithdrawalTransaction 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\":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\":true,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"opaqueData\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"WithdrawalProven\",\"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\":\"MAXIMUM_BASE_FEE\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"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\":[],\"name\":\"donateETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"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\":\"structTypes.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"_l2OutputIndex\",\"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\"},{\"inputs\":[{\"components\":[{\"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\":\"structTypes.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"_l2OutputIndex\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"structTypes.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\"}],\"name\":\"proveWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"provenWithdrawals\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2OutputIndex\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x6101206040523480156200001257600080fd5b50604051620050cf380380620050cf833981016040819052620000359162000261565b6000608081905260a052600160c0526001600160a01b0382166101005260e08190526200006162000069565b50506200029d565b600054610100900460ff16158080156200008a5750600054600160ff909116105b80620000ba5750620000a730620001af60201b62001a091760201c565b158015620000ba575060005460ff166001145b620001235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000147576000805461ff0019166101001790555b603280546001600160a01b03191661dead17905562000165620001be565b8015620001ac576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6001600160a01b03163b151590565b600054610100900460ff166200022b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016200011a565b60408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b600080604083850312156200027557600080fd5b82516001600160a01b03811681146200028d57600080fd5b6020939093015192949293505050565b60805160a05160c05160e05161010051614dca62000305600039600081816101a001528181610aa401528181610f420152818161132d015261159f0152600081816105190152611d7501526000610ead01526000610e8401526000610e5b0152614dca6000f3fe6080604052600436106101625760003560e01c80638b4c40b0116100c0578063cd7c978911610074578063e965084c11610059578063e965084c14610468578063e9e05c42146104f4578063f4daa2911461050757600080fd5b8063cd7c9789146103b2578063cff0ab96146103c757600080fd5b80639bf62d82116100a55780639bf62d8214610340578063a14238e71461036d578063ca3e99ba1461039d57600080fd5b80638b4c40b0146101875780638c3152e91461032057600080fd5b806364b79208116101175780636dbffb78116100fc5780636dbffb78146102c55780638129fc1c146102f5578063867ead131461030a57600080fd5b806364b79208146102995780636bb0291e146102b057600080fd5b80634870496f116101485780634870496f1461022557806354fd4d50146102455780635c1f28271461026757600080fd5b80621c2ff61461018e57806313620abd146101ec57600080fd5b36610189576101873334620186a060006040518060200160405280600081525061053b565b005b600080fd5b34801561019a57600080fd5b506101c27f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101f857600080fd5b50610204633b9aca0081565b6040516fffffffffffffffffffffffffffffffff90911681526020016101e3565b34801561023157600080fd5b50610187610240366004614482565b6109b3565b34801561025157600080fd5b5061025a610e54565b6040516101e391906145d8565b34801561027357600080fd5b5061028b6fffffffffffffffffffffffffffffffff81565b6040519081526020016101e3565b3480156102a557600080fd5b5061028b627a120081565b3480156102bc57600080fd5b5061028b600481565b3480156102d157600080fd5b506102e56102e03660046145eb565b610ef7565b60405190151581526020016101e3565b34801561030157600080fd5b50610187610fce565b34801561031657600080fd5b5061028b61271081565b34801561032c57600080fd5b5061018761033b366004614604565b61118c565b34801561034c57600080fd5b506032546101c29073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037957600080fd5b506102e56103883660046145eb565b60336020526000908152604090205460ff1681565b3480156103a957600080fd5b5061028b6119f8565b3480156103be57600080fd5b5061028b600881565b3480156103d357600080fd5b5060015461042f906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101e3565b34801561047457600080fd5b506104c66104833660046145eb565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101e3565b610187610502366004614639565b61053b565b34801561051357600080fd5b5061028b7f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156105f25773ffffffffffffffffffffffffffffffffffffffff8716156105f257604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b33328114610613575033731111000000000000000000000000000000001111015b6000348888888860405160200161062e9594939291906146c6565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161069e91906145d8565b60405180910390a450506001546000906106de907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361475a565b905080156108125760006106f66004627a12006147a0565b6001546107219190700100000000000000000000000000000000900467ffffffffffffffff16614808565b9050600060086107356004627a12006147a0565b6001546107559085906fffffffffffffffffffffffffffffffff1661487c565b61075f91906147a0565b61076991906147a0565b6001549091506000906107ac906107939084906fffffffffffffffffffffffffffffffff16614938565b6127106fffffffffffffffffffffffffffffffff611a25565b905060018411156107d3576107d06107938260086107cb60018961475a565b611a44565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054849190601090610845908490700100000000000000000000000000000000900467ffffffffffffffff166149ac565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315610921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016105e9565b60015460009061094d906fffffffffffffffffffffffffffffffff1667ffffffffffffffff86166149d8565b6fffffffffffffffffffffffffffffffff169050600061097148633b9aca00611a99565b61097b9083614a10565b905060005a61098a908661475a565b9050808211156109a6576109a66109a1828461475a565b611ab0565b5050505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610a72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016105e9565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b249190614a44565b519050610b3e610b3936869003860186614aa9565b611ade565b8114610bcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016105e9565b6000610bd787611b3a565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c63575080604001516fffffffffffffffffffffffffffffffff1687148015610c63575080518314155b610cef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e00000000000000000060648201526084016105e9565b610d07826040880135610d028789614b0f565b611b6a565b610d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016105e9565b604080516060810182528481526fffffffffffffffffffffffffffffffff42811660208084019182528b831684860190815260008881526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558a830151908b0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a45050505050505050565b6060610e7f7f0000000000000000000000000000000000000000000000000000000000000000611c31565b610ea87f0000000000000000000000000000000000000000000000000000000000000000611c31565b610ed17f0000000000000000000000000000000000000000000000000000000000000000611c31565b604051602001610ee393929190614b93565b604051602081830303815290604052905090565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090610fc89073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401606060405180830381865afa158015610f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fad9190614a44565b602001516fffffffffffffffffffffffffffffffff16611d6e565b92915050565b600054610100900460ff1615808015610fee5750600054600160ff909116105b806110085750303b158015611008575060005460ff166001145b611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105e9565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156110f257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055611126611da2565b801561118957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016105e9565b600061124082611b3a565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361132b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e00000000000000000000000000000000000060648201526084016105e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa158015611396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ba9190614c09565b81602001516fffffffffffffffffffffffffffffffff161015611485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a4016105e9565b6114a481602001516fffffffffffffffffffffffffffffffff16611d6e565b611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a4016105e9565b60408181015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa1580156115fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161f9190614a44565b82518151919250146116d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a4016105e9565b6116f881602001516fffffffffffffffffffffffffffffffff16611d6e565b6117aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a4016105e9565b60008381526033602052604090205460ff1615611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016105e9565b600083815260336020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055608084015161189290614e2090614c22565b5a1015611921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016105e9565b8360200151603260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006119848560400151866080015187606001518860a00151611e85565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b906119e990841515815260200190565b60405180910390a25050505050565b611a066004627a12006147a0565b81565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000611a3a611a348585611e9f565b83611eaf565b90505b9392505050565b6000670de0b6b3a7640000611a85611a5c85836147a0565b611a6e90670de0b6b3a7640000614808565b611a8085670de0b6b3a764000061487c565b611ebe565b611a8f908661487c565b611a3a91906147a0565b600081831015611aa95781611a3d565b5090919050565b6000805a90505b825a611ac3908361475a565b1015611ad957611ad282614c3a565b9150611ab7565b505050565b60008160000151826020015183604001518460600151604051602001611b1d949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611b1d979096959101614c72565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250611c289101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611eef565b95945050505050565b606081600003611c7457505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611c9e5780611c8881614c3a565b9150611c979050600a83614a10565b9150611c78565b60008167ffffffffffffffff811115611cb957611cb96142a8565b6040519080825280601f01601f191660200182016040528015611ce3576020820181803683370190505b5090505b8415611d6657611cf860018361475a565b9150611d05600a86614cc9565b611d10906030614c22565b60f81b818381518110611d2557611d25614cdd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d5f600a86614a10565b9450611ce7565b949350505050565b6000611d9a7f000000000000000000000000000000000000000000000000000000000000000083614c22565b421192915050565b600054610100900460ff16611e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105e9565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b600080600080845160208601878a8af19695505050505050565b600081831215611aa95781611a3d565b6000818312611aa95781611a3d565b6000611a3d670de0b6b3a764000083611ed686611f13565b611ee0919061487c565b611eea91906147a0565b612157565b600080611efb86612396565b9050611f09818686866123c8565b9695505050505050565b6000808213611f7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105e9565b60006060611f8b84612405565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361218857506000919050565b680755bf798b4a1bf1e582126121fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016105e9565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606081805190602001206040516020016123b291815260200190565b6040516020818303038152906040529050919050565b60008060006123d88786866124db565b915091508180156123fa57508051602080830191909120875191880191909120145b979650505050505050565b6000808211612470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105e9565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6000606060006124ea856125f9565b905060008060006124fc848a896126e8565b815192955090935091501580806125105750815b61259c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2070726f76696465642070726f6f6620697320696e60448201527f76616c696400000000000000000000000000000000000000000000000000000060648201526084016105e9565b6000816125b857604051806020016040528060008152506125e4565b6125e4866125c760018861475a565b815181106125d7576125d7614cdd565b6020026020010151612dec565b805115159c909b509950505050505050505050565b805160609060008167ffffffffffffffff811115612619576126196142a8565b60405190808252806020026020018201604052801561265e57816020015b60408051808201909152606080825260208201528152602001906001900390816126375790505b50905060005b828110156126e057604051806040016040528086838151811061268957612689614cdd565b602002602001015181526020016126b88784815181106126ab576126ab614cdd565b6020026020010151612e23565b8152508282815181106126cd576126cd614cdd565b6020908102919091010152600101612664565b509392505050565b600060608180806126f887612e36565b905060008660405160200161270f91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152606080835260208301529150600090819060005b8c51811015612d6e578c818151811061276f5761276f614cdd565b6020026020010151915082846127859190614c22565b9350612792600188614c22565b96508360000361284d57815180516020918201206040516127e2926127bc92910190815260200190565b604051602081830303815290604052868051602091820120825192909101919091201490565b612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016105e9565b6129a4565b8151516020116129035781518051602091820120604051612877926127bc92910190815260200190565b612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016105e9565b8151855160208088019190912082519190920120146129a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016105e9565b6129b060106001614c22565b82602001515103612a225785518414612d6e5760008685815181106129d7576129d7614cdd565b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110612a0257612a02614cdd565b60200260200101519050612a1581612fd1565b9650600194505050612d5c565b600282602001515103612cd4576000612a3a83612ff6565b9050600081600081518110612a5157612a51614cdd565b016020015160f81c90506000612a68600283614d0c565b612a73906002614d2e565b90506000612a84848360ff1661301a565b90506000612a928b8a61301a565b90506000612aa08383613050565b9050825182511015612b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a20696e76616c6964206b6579206c656e677468206660448201527f6f72206c656166206f7220657874656e73696f6e206e6f64650000000000000060648201526084016105e9565b60ff851660021480612b49575060ff85166003145b15612bb357808351148015612b5e5750808251145b15612b7057612b6d818b614c22565b99505b6040518060400160405280600181526020017f80000000000000000000000000000000000000000000000000000000000000008152509a50505050505050612d6e565b60ff85161580612bc6575060ff85166001145b15612c4c5782518114612c16576040518060400160405280600181526020017f80000000000000000000000000000000000000000000000000000000000000008152509a50505050505050612d6e565b612c3d8860200151600181518110612c3057612c30614cdd565b6020026020010151612fd1565b9a509750612d5c945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016105e9565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016105e9565b80612d6681614c3a565b915050612754565b5085612d7a868561301a565b60408051808201909152600181527f80000000000000000000000000000000000000000000000000000000000000006020918201528651908701207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4211498509850985050505050505093509350939050565b60208101518051606091610fc891612e069060019061475a565b81518110612e1657612e16614cdd565b60200260200101516130ff565b6060610fc8612e318361325f565b613348565b80516060906000612e48826002614d51565b67ffffffffffffffff811115612e6057612e606142a8565b6040519080825280601f01601f191660200182016040528015612e8a576020820181803683370190505b5090506000805b83811015612fc757858181518110612eab57612eab614cdd565b6020910101517fff000000000000000000000000000000000000000000000000000000000000008116925060041c7f0ff00000000000000000000000000000000000000000000000000000000000001683612f07836002614d51565b81518110612f1757612f17614cdd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f0f00000000000000000000000000000000000000000000000000000000000000821683612f75836002614d51565b612f80906001614c22565b81518110612f9057612f90614cdd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612e91565b5090949350505050565b60606020826000015110612fed57612fe8826130ff565b610fc8565b610fc8826135ac565b6060610fc86130158360200151600081518110612e1657612e16614cdd565b612e36565b6060825182106130395750604080516020810190915260008152610fc8565b611a3d838384865161304b919061475a565b6135c2565b60008060008351855110613065578351613068565b84515b90505b80821080156130ef575083828151811061308757613087614cdd565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168583815181106130c6576130c6614cdd565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156126e05781600101915061306b565b6060600080600061310f8561379a565b91945092509050600081600181111561312a5761312a614d8e565b146131b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016105e9565b6131c18284614c22565b855114613250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016105e9565b611c2885602001518484614207565b6040805180820190915260008082526020820152600082511161332a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105e9565b50604080518082019091528151815260209182019181019190915290565b606060008060006133588561379a565b91945092509050600181600181111561337357613373614d8e565b14613400576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016105e9565b845161340c8385614c22565b14613499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016105e9565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816134b25790505090506000845b87518110156135a0576000806135256040518060400160405280858d60000151613509919061475a565b8152602001858d6020015161351e9190614c22565b905261379a565b5091509150604051806040016040528083836135419190614c22565b8152602001848c602001516135569190614c22565b81525085858151811061356b5761356b614cdd565b6020908102919091010152613581600185614c22565b935061358d8183614c22565b6135979084614c22565b925050506134df565b50815295945050505050565b6060610fc8826020015160008460000151614207565b60608182601f011015613631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105e9565b82828401101561369d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105e9565b8183018451101561370a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016105e9565b6060821580156137295760405191506000825260208201604052613791565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561376257805183526020928301920161374a565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b600080600080846000015111613858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105e9565b6020840151805160001a607f811161387d576000600160009450945094505050614200565b60b78111613a8b57600061389260808361475a565b90508087600001511161394d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016105e9565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806139c657507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016105e9565b5060019550935060009250614200915050565b60bf8111613dd9576000613aa060b78361475a565b905080876000015111613b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016105e9565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613c39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016105e9565b600184015160088302610100031c60378111613cfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016105e9565b613d078184614c22565b895111613dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016105e9565b613dc7836001614c22565b97509550600094506142009350505050565b60f78111613eba576000613dee60c08361475a565b905080876000015111613ea9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016105e9565b600195509350849250614200915050565b6000613ec760f78361475a565b905080876000015111613f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016105e9565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016105e9565b600184015160088302610100031c60378111614124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016105e9565b61412e8184614c22565b8951116141e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016105e9565b6141ee836001614c22565b97509550600194506142009350505050565b9193909250565b606060008267ffffffffffffffff811115614224576142246142a8565b6040519080825280601f01601f19166020018201604052801561424e576020820181803683370190505b50905082600003614260579050611a3d565b600061426c8587614c22565b90506020820160005b8581101561428d578281015182820152602001614275565b8581111561429c576000868301525b50919695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561431e5761431e6142a8565b604052919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461434a57600080fd5b919050565b600082601f83011261436057600080fd5b813567ffffffffffffffff81111561437a5761437a6142a8565b6143ab60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016142d7565b8181528460208386010111156143c057600080fd5b816020850160208301376000918101602001919091529392505050565b600060c082840312156143ef57600080fd5b60405160c0810167ffffffffffffffff8282108183111715614413576144136142a8565b816040528293508435835261442a60208601614326565b602084015261443b60408601614326565b6040840152606085013560608401526080850135608084015260a085013591508082111561446857600080fd5b506144758582860161434f565b60a0830152505092915050565b600080600080600085870360e081121561449b57600080fd5b863567ffffffffffffffff808211156144b357600080fd5b6144bf8a838b016143dd565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0840112156144f857600080fd5b60408901955060c089013592508083111561451257600080fd5b828901925089601f84011261452657600080fd5b823591508082111561453757600080fd5b508860208260051b840101111561454d57600080fd5b959894975092955050506020019190565b60005b83811015614579578181015183820152602001614561565b83811115614588576000848401525b50505050565b600081518084526145a681602086016020860161455e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a3d602083018461458e565b6000602082840312156145fd57600080fd5b5035919050565b60006020828403121561461657600080fd5b813567ffffffffffffffff81111561462d57600080fd5b611d66848285016143dd565b600080600080600060a0868803121561465157600080fd5b61465a86614326565b945060208601359350604086013567ffffffffffffffff808216821461467f57600080fd5b909350606087013590811515821461469657600080fd5b909250608087013590808211156146ac57600080fd5b506146b98882890161434f565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b60488201526000825161471a81604985016020870161455e565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561476c5761476c61472b565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826147af576147af614771565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156148035761480361472b565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156148425761484261472b565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156148765761487661472b565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156148bd576148bd61472b565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156148f8576148f861472b565b600087129250878205871284841616156149145761491461472b565b8785058712818416161561492a5761492a61472b565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156149725761497261472b565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156149a6576149a661472b565b50500190565b600067ffffffffffffffff8083168185168083038211156149cf576149cf61472b565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615614a0757614a0761472b565b02949350505050565b600082614a1f57614a1f614771565b500490565b80516fffffffffffffffffffffffffffffffff8116811461434a57600080fd5b600060608284031215614a5657600080fd5b6040516060810181811067ffffffffffffffff82111715614a7957614a796142a8565b60405282518152614a8c60208401614a24565b6020820152614a9d60408401614a24565b60408201529392505050565b600060808284031215614abb57600080fd5b6040516080810181811067ffffffffffffffff82111715614ade57614ade6142a8565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614b2a57614b2a6142a8565b8360051b6020614b3b8183016142d7565b868152918501918181019036841115614b5357600080fd5b865b84811015614b8757803586811115614b6d5760008081fd5b614b7936828b0161434f565b845250918301918301614b55565b50979650505050505050565b60008451614ba581846020890161455e565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551614be1816001850160208a0161455e565b60019201918201528351614bfc81600284016020880161455e565b0160020195945050505050565b600060208284031215614c1b57600080fd5b5051919050565b60008219821115614c3557614c3561472b565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c6b57614c6b61472b565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614cbd60c083018461458e565b98975050505050505050565b600082614cd857614cd8614771565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680614d1f57614d1f614771565b8060ff84160691505092915050565b600060ff821660ff841680821015614d4857614d4861472b565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d8957614d8961472b565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", + 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\":true,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"opaqueData\",\"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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"WithdrawalProven\",\"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\":[],\"name\":\"donateETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"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\":\"structTypes.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"isBlockFinalized\",\"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\"},{\"inputs\":[{\"components\":[{\"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\":\"structTypes.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"structTypes.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\"}],\"name\":\"proveWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"provenWithdrawals\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x6101206040523480156200001257600080fd5b50604051620051c4380380620051c4833981016040819052620000359162000261565b6000608081905260a052600160c0526001600160a01b0382166101005260e08190526200006162000069565b50506200029d565b600054610100900460ff16158080156200008a5750600054600160ff909116105b80620000ba5750620000a730620001af60201b620019f81760201c565b158015620000ba575060005460ff166001145b620001235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000147576000805461ff0019166101001790555b603280546001600160a01b03191661dead17905562000165620001be565b8015620001ac576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6001600160a01b03163b151590565b600054610100900460ff166200022b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016200011a565b60408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b600080604083850312156200027557600080fd5b82516001600160a01b03811681146200028d57600080fd5b6020939093015192949293505050565b60805160a05160c05160e05161010051614ebf620003056000396000818161018501528181610aba0152818161126b015281816114dd015261196e0152600081816104da0152611e2501526000610ec201526000610e9901526000610e700152614ebf6000f3fe6080604052600436106101475760003560e01c80638c3152e9116100c0578063cd7c978911610074578063e965084c11610059578063e965084c14610429578063e9e05c42146104b5578063f4daa291146104c857600080fd5b8063cd7c978914610373578063cff0ab961461038857600080fd5b8063a14238e7116100a5578063a14238e7146102fe578063c4fc47981461033e578063ca3e99ba1461035e57600080fd5b80638c3152e9146102b15780639bf62d82146102d157600080fd5b806364b79208116101175780638129fc1c116100fc5780638129fc1c14610286578063867ead131461029b5780638b4c40b01461016c57600080fd5b806364b792081461024c5780636bb0291e1461027157600080fd5b80621c2ff61461017357806313620abd146101d15780634870496f1461020a57806354fd4d501461022a57600080fd5b3661016e5761016c3334620186a06000604051806020016040528060008152506104fc565b005b600080fd5b34801561017f57600080fd5b506101a77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101dd57600080fd5b506101e9633b9aca0081565b6040516fffffffffffffffffffffffffffffffff90911681526020016101c8565b34801561021657600080fd5b5061016c6102253660046145ad565b6109c9565b34801561023657600080fd5b5061023f610e69565b6040516101c89190614703565b34801561025857600080fd5b50610263627a120081565b6040519081526020016101c8565b34801561027d57600080fd5b50610263600481565b34801561029257600080fd5b5061016c610f0c565b3480156102a757600080fd5b5061026361271081565b3480156102bd57600080fd5b5061016c6102cc366004614716565b6110ca565b3480156102dd57600080fd5b506032546101a79073ffffffffffffffffffffffffffffffffffffffff1681565b34801561030a57600080fd5b5061032e61031936600461474b565b60336020526000908152604090205460ff1681565b60405190151581526020016101c8565b34801561034a57600080fd5b5061032e61035936600461474b565b611923565b34801561036a57600080fd5b506102636119e7565b34801561037f57600080fd5b50610263600881565b34801561039457600080fd5b506001546103f0906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101c8565b34801561043557600080fd5b5061048761044436600461474b565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101c8565b61016c6104c3366004614764565b6104fc565b3480156104d457600080fd5b506102637f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156105b35773ffffffffffffffffffffffffffffffffffffffff8716156105b357604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146105d4575033731111000000000000000000000000000000001111015b600034888888886040516020016105ef9594939291906147f1565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161065f9190614703565b60405180910390a4505060015460009061069f907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614885565b905080156108285760006106b76004627a12006148cb565b6001546106e29190700100000000000000000000000000000000900467ffffffffffffffff16614933565b9050600060086106f66004627a12006148cb565b6001546107169085906fffffffffffffffffffffffffffffffff166149a7565b61072091906148cb565b61072a91906148cb565b60015490915060009061077690610760906107589085906fffffffffffffffffffffffffffffffff16614a63565b612710611a14565b6fffffffffffffffffffffffffffffffff611a2d565b905060018411156107e9576107e6610760670de0b6b3a76400006107d261079e6008836148cb565b6107b090670de0b6b3a7640000614933565b6107bb60018a614885565b6107cd90670de0b6b3a7640000614ad7565b611a3c565b6107dc90856149a7565b61075891906148cb565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805484919060109061085b908490700100000000000000000000000000000000900467ffffffffffffffff16614b14565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016105aa565b600154600090610963906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8616614b40565b6fffffffffffffffffffffffffffffffff169050600061098748633b9aca00611a6d565b6109919083614b78565b905060005a6109a09086614885565b9050808211156109bc576109bc6109b78284614885565b611a7d565b5050505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610a88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016105aa565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b399190614b8c565b519050610b53610b4e36869003860186614bdb565b611aab565b8114610be1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016105aa565b6000610bec87611b07565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c78575080604001516fffffffffffffffffffffffffffffffff1687148015610c78575080518314155b610d04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e00000000000000000060648201526084016105aa565b610d1c826040880135610d178789614c41565b611b37565b610da8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016105aa565b604080516060810182528481526fffffffffffffffffffffffffffffffff42811660208084019182528b831684860190815260008881526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558a830151908b0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a45050505050505050565b6060610e947f0000000000000000000000000000000000000000000000000000000000000000611bfe565b610ebd7f0000000000000000000000000000000000000000000000000000000000000000611bfe565b610ee67f0000000000000000000000000000000000000000000000000000000000000000611bfe565b604051602001610ef893929190614cc5565b604051602081830303815290604052905090565b600054610100900460ff1615808015610f2c5750600054600160ff909116105b80610f465750303b158015610f46575060005460ff166001145b610fd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105aa565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561103057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055611064611d3b565b80156110c757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016105aa565b600061117e82611b07565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff80821694830185905270010000000000000000000000000000000090910416918101919091529293509003611269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e00000000000000000000000000000000000060648201526084016105aa565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f89190614d3b565b81602001516fffffffffffffffffffffffffffffffff1610156113c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a4016105aa565b6113e281602001516fffffffffffffffffffffffffffffffff16611e1e565b611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a4016105aa565b60408181015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015611538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155c9190614b8c565b8251815191925014611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a4016105aa565b6116238160200151611e1e565b6116d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a4016105aa565b60008381526033602052604090205460ff1615611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016105aa565b600083815260336020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560808401516117bd90614e2090614d54565b5a101561184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016105aa565b8360200151603260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006118af8560400151866080015187606001518860a00151611e52565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061191490841515815260200190565b60405180910390a25050505050565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018290526000906119e19073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa1580156119b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d89190614b8c565b60200151611e1e565b92915050565b6119f56004627a12006148cb565b81565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600081831215611a245781611a26565b825b9392505050565b6000818312611a245781611a26565b6000611a26670de0b6b3a764000083611a5486611e6c565b611a5e91906149a7565b611a6891906148cb565b6120b0565b600081831015611a245781611a26565b6000805a90505b825a611a909083614885565b1015611aa657611a9f82614d6c565b9150611a84565b505050565b60008160000151826020015183604001518460600151604051602001611aea949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611aea979096959101614da4565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250611bf59101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529085876122ef565b95945050505050565b606081600003611c4157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611c6b5780611c5581614d6c565b9150611c649050600a83614b78565b9150611c45565b60008167ffffffffffffffff811115611c8657611c866143d3565b6040519080825280601f01601f191660200182016040528015611cb0576020820181803683370190505b5090505b8415611d3357611cc5600183614885565b9150611cd2600a86614dfb565b611cdd906030614d54565b60f81b818381518110611cf257611cf2614e0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d2c600a86614b78565b9450611cb4565b949350505050565b600054610100900460ff16611dd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105aa565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6000611e4a7f000000000000000000000000000000000000000000000000000000000000000083614d54565b421192915050565b600080600080845160208601878a8af19695505050505050565b6000808213611ed7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105aa565b60006060611ee484612313565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136120e157506000919050565b680755bf798b4a1bf1e58212612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016105aa565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000806122fb866123e9565b90506123098186868661241b565b9695505050505050565b600080821161237e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105aa565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060818051906020012060405160200161240591815260200190565b6040516020818303038152906040529050919050565b6000611bf58461242c878686612442565b8051602091820120825192909101919091201490565b6060600061244f84612e5f565b9050600061245c86612f4e565b905060008460405160200161247391815260200190565b60405160208183030381529060405290506000805b8451811015612dd65760008582815181106124a5576124a5614e0f565b602002602001015190508451831115612540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016105aa565b826000036125f9578051805160209182012060405161258e9261256892910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b6125f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016105aa565b612750565b8051516020116126af57805180516020918201206040516126239261256892910190815260200190565b6125f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016105aa565b805184516020808701919091208251919092012014612750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016105aa565b61275c60106001614d54565b8160200151510361293d57845183036128d5576000612798826020015160108151811061278b5761278b614e0f565b60200260200101516130e9565b9050600081511161282b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016105aa565b600187516128399190614885565b83146128c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016105aa565b9650611a2695505050505050565b60008584815181106128e9576128e9614e0f565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061291457612914614e0f565b6020026020010151905061292781613249565b9550612934600186614d54565b94505050612dc3565b600281602001515103612d3b5760006129558261326e565b905060008160008151811061296c5761296c614e0f565b016020015160f81c90506000612983600283614e3e565b61298e906002614e60565b9050600061299f848360ff16613292565b905060006129ad8a89613292565b905060006129bb83836132c8565b905080835114612a4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016105aa565b60ff851660021480612a62575060ff85166003145b15612c565780825114612af7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016105aa565b6000612b13886020015160018151811061278b5761278b614e0f565b90506000815111612ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016105aa565b60018d51612bb49190614885565b8914612c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016105aa565b9c50611a269b505050505050505050505050565b60ff85161580612c69575060ff85166001145b15612ca857612c958760200151600181518110612c8857612c88614e0f565b6020026020010151613249565b9950612ca1818a614d54565b9850612d30565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016105aa565b505050505050612dc3565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016105aa565b5080612dce81614d6c565b915050612488565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016105aa565b805160609060008167ffffffffffffffff811115612e7f57612e7f6143d3565b604051908082528060200260200182016040528015612ec457816020015b6040805180820190915260608082526020820152815260200190600190039081612e9d5790505b50905060005b82811015612f46576040518060400160405280868381518110612eef57612eef614e0f565b60200260200101518152602001612f1e878481518110612f1157612f11614e0f565b6020026020010151613377565b815250828281518110612f3357612f33614e0f565b6020908102919091010152600101612eca565b509392505050565b80516060906000612f60826002614ad7565b67ffffffffffffffff811115612f7857612f786143d3565b6040519080825280601f01601f191660200182016040528015612fa2576020820181803683370190505b5090506000805b838110156130df57858181518110612fc357612fc3614e0f565b6020910101517fff000000000000000000000000000000000000000000000000000000000000008116925060041c7f0ff0000000000000000000000000000000000000000000000000000000000000168361301f836002614ad7565b8151811061302f5761302f614e0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f0f0000000000000000000000000000000000000000000000000000000000000082168361308d836002614ad7565b613098906001614d54565b815181106130a8576130a8614e0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612fa9565b5090949350505050565b606060008060006130f98561338a565b91945092509050600081600181111561311457613114614e83565b146131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016105aa565b6131ab8284614d54565b85511461323a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016105aa565b611bf585602001518484613df7565b6060602082600001511061326557613260826130e9565b6119e1565b6119e182613e98565b60606119e161328d836020015160008151811061278b5761278b614e0f565b612f4e565b6060825182106132b157506040805160208101909152600081526119e1565b611a2683838486516132c39190614885565b613eae565b600080600083518551106132dd5783516132e0565b84515b90505b808210801561336757508382815181106132ff576132ff614e0f565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191685838151811061333e5761333e614e0f565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15612f46578160010191506132e3565b60606119e161338583614086565b61416f565b600080600080846000015111613448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105aa565b6020840151805160001a607f811161346d576000600160009450945094505050613df0565b60b7811161367b576000613482608083614885565b90508087600001511161353d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016105aa565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806135b657507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016105aa565b5060019550935060009250613df0915050565b60bf81116139c957600061369060b783614885565b90508087600001511161374b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016105aa565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016105aa565b600184015160088302610100031c603781116138ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016105aa565b6138f78184614d54565b8951116139ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016105aa565b6139b7836001614d54565b9750955060009450613df09350505050565b60f78111613aaa5760006139de60c083614885565b905080876000015111613a99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016105aa565b600195509350849250613df0915050565b6000613ab760f783614885565b905080876000015111613b72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016105aa565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613c50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016105aa565b600184015160088302610100031c60378111613d14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016105aa565b613d1e8184614d54565b895111613dd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016105aa565b613dde836001614d54565b9750955060019450613df09350505050565b9193909250565b606060008267ffffffffffffffff811115613e1457613e146143d3565b6040519080825280601f01601f191660200182016040528015613e3e576020820181803683370190505b50905082600003613e50579050611a26565b6000613e5c8587614d54565b90506020820160005b85811015613e7d578281015182820152602001613e65565b85811115613e8c576000868301525b50919695505050505050565b60606119e1826020015160008460000151613df7565b60608182601f011015613f1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105aa565b828284011015613f89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105aa565b81830184511015613ff6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016105aa565b606082158015614015576040519150600082526020820160405261407d565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561404e578051835260209283019201614036565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105aa565b50604080518082019091528151815260209182019181019190915290565b6060600080600061417f8561338a565b91945092509050600181600181111561419a5761419a614e83565b14614227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016105aa565b84516142338385614d54565b146142c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016105aa565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816142d95790505090506000845b87518110156143c75760008061434c6040518060400160405280858d600001516143309190614885565b8152602001858d602001516143459190614d54565b905261338a565b5091509150604051806040016040528083836143689190614d54565b8152602001848c6020015161437d9190614d54565b81525085858151811061439257614392614e0f565b60209081029190910101526143a8600185614d54565b93506143b48183614d54565b6143be9084614d54565b92505050614306565b50815295945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614449576144496143d3565b604052919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461447557600080fd5b919050565b600082601f83011261448b57600080fd5b813567ffffffffffffffff8111156144a5576144a56143d3565b6144d660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614402565b8181528460208386010111156144eb57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561451a57600080fd5b60405160c0810167ffffffffffffffff828210818311171561453e5761453e6143d3565b816040528293508435835261455560208601614451565b602084015261456660408601614451565b6040840152606085013560608401526080850135608084015260a085013591508082111561459357600080fd5b506145a08582860161447a565b60a0830152505092915050565b600080600080600085870360e08112156145c657600080fd5b863567ffffffffffffffff808211156145de57600080fd5b6145ea8a838b01614508565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561462357600080fd5b60408901955060c089013592508083111561463d57600080fd5b828901925089601f84011261465157600080fd5b823591508082111561466257600080fd5b508860208260051b840101111561467857600080fd5b959894975092955050506020019190565b60005b838110156146a457818101518382015260200161468c565b838111156146b3576000848401525b50505050565b600081518084526146d1816020860160208601614689565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a2660208301846146b9565b60006020828403121561472857600080fd5b813567ffffffffffffffff81111561473f57600080fd5b611d3384828501614508565b60006020828403121561475d57600080fd5b5035919050565b600080600080600060a0868803121561477c57600080fd5b61478586614451565b945060208601359350604086013567ffffffffffffffff80821682146147aa57600080fd5b90935060608701359081151582146147c157600080fd5b909250608087013590808211156147d757600080fd5b506147e48882890161447a565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614845816049850160208701614689565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561489757614897614856565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826148da576148da61489c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561492e5761492e614856565b500590565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561496d5761496d614856565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156149a1576149a1614856565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156149e8576149e8614856565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614a2357614a23614856565b60008712925087820587128484161615614a3f57614a3f614856565b87850587128184161615614a5557614a55614856565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614a9d57614a9d614856565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614ad157614ad1614856565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b0f57614b0f614856565b500290565b600067ffffffffffffffff808316818516808303821115614b3757614b37614856565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615614b6f57614b6f614856565b02949350505050565b600082614b8757614b8761489c565b500490565b600060408284031215614b9e57600080fd5b6040516040810181811067ffffffffffffffff82111715614bc157614bc16143d3565b604052825181526020928301519281019290925250919050565b600060808284031215614bed57600080fd5b6040516080810181811067ffffffffffffffff82111715614c1057614c106143d3565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614c5c57614c5c6143d3565b8360051b6020614c6d818301614402565b868152918501918181019036841115614c8557600080fd5b865b84811015614cb957803586811115614c9f5760008081fd5b614cab36828b0161447a565b845250918301918301614c87565b50979650505050505050565b60008451614cd7818460208901614689565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551614d13816001850160208a01614689565b60019201918201528351614d2e816002840160208801614689565b0160020195945050505050565b600060208284031215614d4d57600080fd5b5051919050565b60008219821115614d6757614d67614856565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d9d57614d9d614856565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614def60c08301846146b9565b98975050505050505050565b600082614e0a57614e0a61489c565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680614e5157614e5161489c565b8060ff84160691505092915050565b600060ff821660ff841680821015614e7a57614e7a614856565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", } // OptimismPortalABI is the input ABI used to generate the binding from. diff --git a/op-bindings/bindings/optimismportal_more.go b/op-bindings/bindings/optimismportal_more.go index 367ac5eb15db1..8102870b770c6 100644 --- a/op-bindings/bindings/optimismportal_more.go +++ b/op-bindings/bindings/optimismportal_more.go @@ -13,7 +13,7 @@ const OptimismPortalStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contrac var OptimismPortalStorageLayout = new(solc.StorageLayout) -var OptimismPortalDeployedBin = "0x6080604052600436106101625760003560e01c80638b4c40b0116100c0578063cd7c978911610074578063e965084c11610059578063e965084c14610468578063e9e05c42146104f4578063f4daa2911461050757600080fd5b8063cd7c9789146103b2578063cff0ab96146103c757600080fd5b80639bf62d82116100a55780639bf62d8214610340578063a14238e71461036d578063ca3e99ba1461039d57600080fd5b80638b4c40b0146101875780638c3152e91461032057600080fd5b806364b79208116101175780636dbffb78116100fc5780636dbffb78146102c55780638129fc1c146102f5578063867ead131461030a57600080fd5b806364b79208146102995780636bb0291e146102b057600080fd5b80634870496f116101485780634870496f1461022557806354fd4d50146102455780635c1f28271461026757600080fd5b80621c2ff61461018e57806313620abd146101ec57600080fd5b36610189576101873334620186a060006040518060200160405280600081525061053b565b005b600080fd5b34801561019a57600080fd5b506101c27f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101f857600080fd5b50610204633b9aca0081565b6040516fffffffffffffffffffffffffffffffff90911681526020016101e3565b34801561023157600080fd5b50610187610240366004614482565b6109b3565b34801561025157600080fd5b5061025a610e54565b6040516101e391906145d8565b34801561027357600080fd5b5061028b6fffffffffffffffffffffffffffffffff81565b6040519081526020016101e3565b3480156102a557600080fd5b5061028b627a120081565b3480156102bc57600080fd5b5061028b600481565b3480156102d157600080fd5b506102e56102e03660046145eb565b610ef7565b60405190151581526020016101e3565b34801561030157600080fd5b50610187610fce565b34801561031657600080fd5b5061028b61271081565b34801561032c57600080fd5b5061018761033b366004614604565b61118c565b34801561034c57600080fd5b506032546101c29073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037957600080fd5b506102e56103883660046145eb565b60336020526000908152604090205460ff1681565b3480156103a957600080fd5b5061028b6119f8565b3480156103be57600080fd5b5061028b600881565b3480156103d357600080fd5b5060015461042f906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101e3565b34801561047457600080fd5b506104c66104833660046145eb565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101e3565b610187610502366004614639565b61053b565b34801561051357600080fd5b5061028b7f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156105f25773ffffffffffffffffffffffffffffffffffffffff8716156105f257604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b33328114610613575033731111000000000000000000000000000000001111015b6000348888888860405160200161062e9594939291906146c6565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161069e91906145d8565b60405180910390a450506001546000906106de907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361475a565b905080156108125760006106f66004627a12006147a0565b6001546107219190700100000000000000000000000000000000900467ffffffffffffffff16614808565b9050600060086107356004627a12006147a0565b6001546107559085906fffffffffffffffffffffffffffffffff1661487c565b61075f91906147a0565b61076991906147a0565b6001549091506000906107ac906107939084906fffffffffffffffffffffffffffffffff16614938565b6127106fffffffffffffffffffffffffffffffff611a25565b905060018411156107d3576107d06107938260086107cb60018961475a565b611a44565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054849190601090610845908490700100000000000000000000000000000000900467ffffffffffffffff166149ac565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315610921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016105e9565b60015460009061094d906fffffffffffffffffffffffffffffffff1667ffffffffffffffff86166149d8565b6fffffffffffffffffffffffffffffffff169050600061097148633b9aca00611a99565b61097b9083614a10565b905060005a61098a908661475a565b9050808211156109a6576109a66109a1828461475a565b611ab0565b5050505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610a72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016105e9565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b249190614a44565b519050610b3e610b3936869003860186614aa9565b611ade565b8114610bcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016105e9565b6000610bd787611b3a565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c63575080604001516fffffffffffffffffffffffffffffffff1687148015610c63575080518314155b610cef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e00000000000000000060648201526084016105e9565b610d07826040880135610d028789614b0f565b611b6a565b610d93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016105e9565b604080516060810182528481526fffffffffffffffffffffffffffffffff42811660208084019182528b831684860190815260008881526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558a830151908b0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a45050505050505050565b6060610e7f7f0000000000000000000000000000000000000000000000000000000000000000611c31565b610ea87f0000000000000000000000000000000000000000000000000000000000000000611c31565b610ed17f0000000000000000000000000000000000000000000000000000000000000000611c31565b604051602001610ee393929190614b93565b604051602081830303815290604052905090565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090610fc89073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401606060405180830381865afa158015610f89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fad9190614a44565b602001516fffffffffffffffffffffffffffffffff16611d6e565b92915050565b600054610100900460ff1615808015610fee5750600054600160ff909116105b806110085750303b158015611008575060005460ff166001145b611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105e9565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156110f257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055611126611da2565b801561118957600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016105e9565b600061124082611b3a565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff8082169483018590527001000000000000000000000000000000009091041691810191909152929350900361132b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e00000000000000000000000000000000000060648201526084016105e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa158015611396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ba9190614c09565b81602001516fffffffffffffffffffffffffffffffff161015611485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a4016105e9565b6114a481602001516fffffffffffffffffffffffffffffffff16611d6e565b611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a4016105e9565b60408181015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401606060405180830381865afa1580156115fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161f9190614a44565b82518151919250146116d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a4016105e9565b6116f881602001516fffffffffffffffffffffffffffffffff16611d6e565b6117aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a4016105e9565b60008381526033602052604090205460ff1615611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016105e9565b600083815260336020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055608084015161189290614e2090614c22565b5a1015611921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016105e9565b8360200151603260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006119848560400151866080015187606001518860a00151611e85565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b906119e990841515815260200190565b60405180910390a25050505050565b611a066004627a12006147a0565b81565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6000611a3a611a348585611e9f565b83611eaf565b90505b9392505050565b6000670de0b6b3a7640000611a85611a5c85836147a0565b611a6e90670de0b6b3a7640000614808565b611a8085670de0b6b3a764000061487c565b611ebe565b611a8f908661487c565b611a3a91906147a0565b600081831015611aa95781611a3d565b5090919050565b6000805a90505b825a611ac3908361475a565b1015611ad957611ad282614c3a565b9150611ab7565b505050565b60008160000151826020015183604001518460600151604051602001611b1d949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611b1d979096959101614c72565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250611c289101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611eef565b95945050505050565b606081600003611c7457505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611c9e5780611c8881614c3a565b9150611c979050600a83614a10565b9150611c78565b60008167ffffffffffffffff811115611cb957611cb96142a8565b6040519080825280601f01601f191660200182016040528015611ce3576020820181803683370190505b5090505b8415611d6657611cf860018361475a565b9150611d05600a86614cc9565b611d10906030614c22565b60f81b818381518110611d2557611d25614cdd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d5f600a86614a10565b9450611ce7565b949350505050565b6000611d9a7f000000000000000000000000000000000000000000000000000000000000000083614c22565b421192915050565b600054610100900460ff16611e39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105e9565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b600080600080845160208601878a8af19695505050505050565b600081831215611aa95781611a3d565b6000818312611aa95781611a3d565b6000611a3d670de0b6b3a764000083611ed686611f13565b611ee0919061487c565b611eea91906147a0565b612157565b600080611efb86612396565b9050611f09818686866123c8565b9695505050505050565b6000808213611f7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105e9565b60006060611f8b84612405565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c1821361218857506000919050565b680755bf798b4a1bf1e582126121fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016105e9565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b606081805190602001206040516020016123b291815260200190565b6040516020818303038152906040529050919050565b60008060006123d88786866124db565b915091508180156123fa57508051602080830191909120875191880191909120145b979650505050505050565b6000808211612470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105e9565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6000606060006124ea856125f9565b905060008060006124fc848a896126e8565b815192955090935091501580806125105750815b61259c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2070726f76696465642070726f6f6620697320696e60448201527f76616c696400000000000000000000000000000000000000000000000000000060648201526084016105e9565b6000816125b857604051806020016040528060008152506125e4565b6125e4866125c760018861475a565b815181106125d7576125d7614cdd565b6020026020010151612dec565b805115159c909b509950505050505050505050565b805160609060008167ffffffffffffffff811115612619576126196142a8565b60405190808252806020026020018201604052801561265e57816020015b60408051808201909152606080825260208201528152602001906001900390816126375790505b50905060005b828110156126e057604051806040016040528086838151811061268957612689614cdd565b602002602001015181526020016126b88784815181106126ab576126ab614cdd565b6020026020010151612e23565b8152508282815181106126cd576126cd614cdd565b6020908102919091010152600101612664565b509392505050565b600060608180806126f887612e36565b905060008660405160200161270f91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152606080835260208301529150600090819060005b8c51811015612d6e578c818151811061276f5761276f614cdd565b6020026020010151915082846127859190614c22565b9350612792600188614c22565b96508360000361284d57815180516020918201206040516127e2926127bc92910190815260200190565b604051602081830303815290604052868051602091820120825192909101919091201490565b612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016105e9565b6129a4565b8151516020116129035781518051602091820120604051612877926127bc92910190815260200190565b612848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016105e9565b8151855160208088019190912082519190920120146129a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016105e9565b6129b060106001614c22565b82602001515103612a225785518414612d6e5760008685815181106129d7576129d7614cdd565b602001015160f81c60f81b60f81c9050600083602001518260ff1681518110612a0257612a02614cdd565b60200260200101519050612a1581612fd1565b9650600194505050612d5c565b600282602001515103612cd4576000612a3a83612ff6565b9050600081600081518110612a5157612a51614cdd565b016020015160f81c90506000612a68600283614d0c565b612a73906002614d2e565b90506000612a84848360ff1661301a565b90506000612a928b8a61301a565b90506000612aa08383613050565b9050825182511015612b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a20696e76616c6964206b6579206c656e677468206660448201527f6f72206c656166206f7220657874656e73696f6e206e6f64650000000000000060648201526084016105e9565b60ff851660021480612b49575060ff85166003145b15612bb357808351148015612b5e5750808251145b15612b7057612b6d818b614c22565b99505b6040518060400160405280600181526020017f80000000000000000000000000000000000000000000000000000000000000008152509a50505050505050612d6e565b60ff85161580612bc6575060ff85166001145b15612c4c5782518114612c16576040518060400160405280600181526020017f80000000000000000000000000000000000000000000000000000000000000008152509a50505050505050612d6e565b612c3d8860200151600181518110612c3057612c30614cdd565b6020026020010151612fd1565b9a509750612d5c945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016105e9565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016105e9565b80612d6681614c3a565b915050612754565b5085612d7a868561301a565b60408051808201909152600181527f80000000000000000000000000000000000000000000000000000000000000006020918201528651908701207f56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4211498509850985050505050505093509350939050565b60208101518051606091610fc891612e069060019061475a565b81518110612e1657612e16614cdd565b60200260200101516130ff565b6060610fc8612e318361325f565b613348565b80516060906000612e48826002614d51565b67ffffffffffffffff811115612e6057612e606142a8565b6040519080825280601f01601f191660200182016040528015612e8a576020820181803683370190505b5090506000805b83811015612fc757858181518110612eab57612eab614cdd565b6020910101517fff000000000000000000000000000000000000000000000000000000000000008116925060041c7f0ff00000000000000000000000000000000000000000000000000000000000001683612f07836002614d51565b81518110612f1757612f17614cdd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f0f00000000000000000000000000000000000000000000000000000000000000821683612f75836002614d51565b612f80906001614c22565b81518110612f9057612f90614cdd565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612e91565b5090949350505050565b60606020826000015110612fed57612fe8826130ff565b610fc8565b610fc8826135ac565b6060610fc86130158360200151600081518110612e1657612e16614cdd565b612e36565b6060825182106130395750604080516020810190915260008152610fc8565b611a3d838384865161304b919061475a565b6135c2565b60008060008351855110613065578351613068565b84515b90505b80821080156130ef575083828151811061308757613087614cdd565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168583815181106130c6576130c6614cdd565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156126e05781600101915061306b565b6060600080600061310f8561379a565b91945092509050600081600181111561312a5761312a614d8e565b146131b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016105e9565b6131c18284614c22565b855114613250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016105e9565b611c2885602001518484614207565b6040805180820190915260008082526020820152600082511161332a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105e9565b50604080518082019091528151815260209182019181019190915290565b606060008060006133588561379a565b91945092509050600181600181111561337357613373614d8e565b14613400576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016105e9565b845161340c8385614c22565b14613499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016105e9565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816134b25790505090506000845b87518110156135a0576000806135256040518060400160405280858d60000151613509919061475a565b8152602001858d6020015161351e9190614c22565b905261379a565b5091509150604051806040016040528083836135419190614c22565b8152602001848c602001516135569190614c22565b81525085858151811061356b5761356b614cdd565b6020908102919091010152613581600185614c22565b935061358d8183614c22565b6135979084614c22565b925050506134df565b50815295945050505050565b6060610fc8826020015160008460000151614207565b60608182601f011015613631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105e9565b82828401101561369d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105e9565b8183018451101561370a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016105e9565b6060821580156137295760405191506000825260208201604052613791565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561376257805183526020928301920161374a565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b600080600080846000015111613858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105e9565b6020840151805160001a607f811161387d576000600160009450945094505050614200565b60b78111613a8b57600061389260808361475a565b90508087600001511161394d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016105e9565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806139c657507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016105e9565b5060019550935060009250614200915050565b60bf8111613dd9576000613aa060b78361475a565b905080876000015111613b5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016105e9565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613c39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016105e9565b600184015160088302610100031c60378111613cfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016105e9565b613d078184614c22565b895111613dbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016105e9565b613dc7836001614c22565b97509550600094506142009350505050565b60f78111613eba576000613dee60c08361475a565b905080876000015111613ea9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016105e9565b600195509350849250614200915050565b6000613ec760f78361475a565b905080876000015111613f82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016105e9565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003614060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016105e9565b600184015160088302610100031c60378111614124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016105e9565b61412e8184614c22565b8951116141e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016105e9565b6141ee836001614c22565b97509550600194506142009350505050565b9193909250565b606060008267ffffffffffffffff811115614224576142246142a8565b6040519080825280601f01601f19166020018201604052801561424e576020820181803683370190505b50905082600003614260579050611a3d565b600061426c8587614c22565b90506020820160005b8581101561428d578281015182820152602001614275565b8581111561429c576000868301525b50919695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561431e5761431e6142a8565b604052919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461434a57600080fd5b919050565b600082601f83011261436057600080fd5b813567ffffffffffffffff81111561437a5761437a6142a8565b6143ab60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016142d7565b8181528460208386010111156143c057600080fd5b816020850160208301376000918101602001919091529392505050565b600060c082840312156143ef57600080fd5b60405160c0810167ffffffffffffffff8282108183111715614413576144136142a8565b816040528293508435835261442a60208601614326565b602084015261443b60408601614326565b6040840152606085013560608401526080850135608084015260a085013591508082111561446857600080fd5b506144758582860161434f565b60a0830152505092915050565b600080600080600085870360e081121561449b57600080fd5b863567ffffffffffffffff808211156144b357600080fd5b6144bf8a838b016143dd565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0840112156144f857600080fd5b60408901955060c089013592508083111561451257600080fd5b828901925089601f84011261452657600080fd5b823591508082111561453757600080fd5b508860208260051b840101111561454d57600080fd5b959894975092955050506020019190565b60005b83811015614579578181015183820152602001614561565b83811115614588576000848401525b50505050565b600081518084526145a681602086016020860161455e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a3d602083018461458e565b6000602082840312156145fd57600080fd5b5035919050565b60006020828403121561461657600080fd5b813567ffffffffffffffff81111561462d57600080fd5b611d66848285016143dd565b600080600080600060a0868803121561465157600080fd5b61465a86614326565b945060208601359350604086013567ffffffffffffffff808216821461467f57600080fd5b909350606087013590811515821461469657600080fd5b909250608087013590808211156146ac57600080fd5b506146b98882890161434f565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b60488201526000825161471a81604985016020870161455e565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561476c5761476c61472b565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826147af576147af614771565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156148035761480361472b565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156148425761484261472b565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156148765761487661472b565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156148bd576148bd61472b565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156148f8576148f861472b565b600087129250878205871284841616156149145761491461472b565b8785058712818416161561492a5761492a61472b565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156149725761497261472b565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156149a6576149a661472b565b50500190565b600067ffffffffffffffff8083168185168083038211156149cf576149cf61472b565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615614a0757614a0761472b565b02949350505050565b600082614a1f57614a1f614771565b500490565b80516fffffffffffffffffffffffffffffffff8116811461434a57600080fd5b600060608284031215614a5657600080fd5b6040516060810181811067ffffffffffffffff82111715614a7957614a796142a8565b60405282518152614a8c60208401614a24565b6020820152614a9d60408401614a24565b60408201529392505050565b600060808284031215614abb57600080fd5b6040516080810181811067ffffffffffffffff82111715614ade57614ade6142a8565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614b2a57614b2a6142a8565b8360051b6020614b3b8183016142d7565b868152918501918181019036841115614b5357600080fd5b865b84811015614b8757803586811115614b6d5760008081fd5b614b7936828b0161434f565b845250918301918301614b55565b50979650505050505050565b60008451614ba581846020890161455e565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551614be1816001850160208a0161455e565b60019201918201528351614bfc81600284016020880161455e565b0160020195945050505050565b600060208284031215614c1b57600080fd5b5051919050565b60008219821115614c3557614c3561472b565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c6b57614c6b61472b565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614cbd60c083018461458e565b98975050505050505050565b600082614cd857614cd8614771565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680614d1f57614d1f614771565b8060ff84160691505092915050565b600060ff821660ff841680821015614d4857614d4861472b565b90039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d8957614d8961472b565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a" +var OptimismPortalDeployedBin = "0x6080604052600436106101475760003560e01c80638c3152e9116100c0578063cd7c978911610074578063e965084c11610059578063e965084c14610429578063e9e05c42146104b5578063f4daa291146104c857600080fd5b8063cd7c978914610373578063cff0ab961461038857600080fd5b8063a14238e7116100a5578063a14238e7146102fe578063c4fc47981461033e578063ca3e99ba1461035e57600080fd5b80638c3152e9146102b15780639bf62d82146102d157600080fd5b806364b79208116101175780638129fc1c116100fc5780638129fc1c14610286578063867ead131461029b5780638b4c40b01461016c57600080fd5b806364b792081461024c5780636bb0291e1461027157600080fd5b80621c2ff61461017357806313620abd146101d15780634870496f1461020a57806354fd4d501461022a57600080fd5b3661016e5761016c3334620186a06000604051806020016040528060008152506104fc565b005b600080fd5b34801561017f57600080fd5b506101a77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101dd57600080fd5b506101e9633b9aca0081565b6040516fffffffffffffffffffffffffffffffff90911681526020016101c8565b34801561021657600080fd5b5061016c6102253660046145ad565b6109c9565b34801561023657600080fd5b5061023f610e69565b6040516101c89190614703565b34801561025857600080fd5b50610263627a120081565b6040519081526020016101c8565b34801561027d57600080fd5b50610263600481565b34801561029257600080fd5b5061016c610f0c565b3480156102a757600080fd5b5061026361271081565b3480156102bd57600080fd5b5061016c6102cc366004614716565b6110ca565b3480156102dd57600080fd5b506032546101a79073ffffffffffffffffffffffffffffffffffffffff1681565b34801561030a57600080fd5b5061032e61031936600461474b565b60336020526000908152604090205460ff1681565b60405190151581526020016101c8565b34801561034a57600080fd5b5061032e61035936600461474b565b611923565b34801561036a57600080fd5b506102636119e7565b34801561037f57600080fd5b50610263600881565b34801561039457600080fd5b506001546103f0906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101c8565b34801561043557600080fd5b5061048761044436600461474b565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101c8565b61016c6104c3366004614764565b6104fc565b3480156104d457600080fd5b506102637f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156105b35773ffffffffffffffffffffffffffffffffffffffff8716156105b357604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146105d4575033731111000000000000000000000000000000001111015b600034888888886040516020016105ef9594939291906147f1565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161065f9190614703565b60405180910390a4505060015460009061069f907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614885565b905080156108285760006106b76004627a12006148cb565b6001546106e29190700100000000000000000000000000000000900467ffffffffffffffff16614933565b9050600060086106f66004627a12006148cb565b6001546107169085906fffffffffffffffffffffffffffffffff166149a7565b61072091906148cb565b61072a91906148cb565b60015490915060009061077690610760906107589085906fffffffffffffffffffffffffffffffff16614a63565b612710611a14565b6fffffffffffffffffffffffffffffffff611a2d565b905060018411156107e9576107e6610760670de0b6b3a76400006107d261079e6008836148cb565b6107b090670de0b6b3a7640000614933565b6107bb60018a614885565b6107cd90670de0b6b3a7640000614ad7565b611a3c565b6107dc90856149a7565b61075891906148cb565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805484919060109061085b908490700100000000000000000000000000000000900467ffffffffffffffff16614b14565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016105aa565b600154600090610963906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8616614b40565b6fffffffffffffffffffffffffffffffff169050600061098748633b9aca00611a6d565b6109919083614b78565b905060005a6109a09086614885565b9050808211156109bc576109bc6109b78284614885565b611a7d565b5050505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610a88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016105aa565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b399190614b8c565b519050610b53610b4e36869003860186614bdb565b611aab565b8114610be1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016105aa565b6000610bec87611b07565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c78575080604001516fffffffffffffffffffffffffffffffff1687148015610c78575080518314155b610d04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e00000000000000000060648201526084016105aa565b610d1c826040880135610d178789614c41565b611b37565b610da8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016105aa565b604080516060810182528481526fffffffffffffffffffffffffffffffff42811660208084019182528b831684860190815260008881526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558a830151908b0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a45050505050505050565b6060610e947f0000000000000000000000000000000000000000000000000000000000000000611bfe565b610ebd7f0000000000000000000000000000000000000000000000000000000000000000611bfe565b610ee67f0000000000000000000000000000000000000000000000000000000000000000611bfe565b604051602001610ef893929190614cc5565b604051602081830303815290604052905090565b600054610100900460ff1615808015610f2c5750600054600160ff909116105b80610f465750303b158015610f46575060005460ff166001145b610fd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105aa565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561103057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055611064611d3b565b80156110c757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016105aa565b600061117e82611b07565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff80821694830185905270010000000000000000000000000000000090910416918101919091529293509003611269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e00000000000000000000000000000000000060648201526084016105aa565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f89190614d3b565b81602001516fffffffffffffffffffffffffffffffff1610156113c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a4016105aa565b6113e281602001516fffffffffffffffffffffffffffffffff16611e1e565b611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a4016105aa565b60408181015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015611538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155c9190614b8c565b8251815191925014611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a4016105aa565b6116238160200151611e1e565b6116d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a4016105aa565b60008381526033602052604090205460ff1615611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016105aa565b600083815260336020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560808401516117bd90614e2090614d54565b5a101561184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016105aa565b8360200151603260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006118af8560400151866080015187606001518860a00151611e52565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061191490841515815260200190565b60405180910390a25050505050565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018290526000906119e19073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa1580156119b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d89190614b8c565b60200151611e1e565b92915050565b6119f56004627a12006148cb565b81565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600081831215611a245781611a26565b825b9392505050565b6000818312611a245781611a26565b6000611a26670de0b6b3a764000083611a5486611e6c565b611a5e91906149a7565b611a6891906148cb565b6120b0565b600081831015611a245781611a26565b6000805a90505b825a611a909083614885565b1015611aa657611a9f82614d6c565b9150611a84565b505050565b60008160000151826020015183604001518460600151604051602001611aea949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611aea979096959101614da4565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250611bf59101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529085876122ef565b95945050505050565b606081600003611c4157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611c6b5780611c5581614d6c565b9150611c649050600a83614b78565b9150611c45565b60008167ffffffffffffffff811115611c8657611c866143d3565b6040519080825280601f01601f191660200182016040528015611cb0576020820181803683370190505b5090505b8415611d3357611cc5600183614885565b9150611cd2600a86614dfb565b611cdd906030614d54565b60f81b818381518110611cf257611cf2614e0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d2c600a86614b78565b9450611cb4565b949350505050565b600054610100900460ff16611dd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105aa565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6000611e4a7f000000000000000000000000000000000000000000000000000000000000000083614d54565b421192915050565b600080600080845160208601878a8af19695505050505050565b6000808213611ed7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105aa565b60006060611ee484612313565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136120e157506000919050565b680755bf798b4a1bf1e58212612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016105aa565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000806122fb866123e9565b90506123098186868661241b565b9695505050505050565b600080821161237e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105aa565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060818051906020012060405160200161240591815260200190565b6040516020818303038152906040529050919050565b6000611bf58461242c878686612442565b8051602091820120825192909101919091201490565b6060600061244f84612e5f565b9050600061245c86612f4e565b905060008460405160200161247391815260200190565b60405160208183030381529060405290506000805b8451811015612dd65760008582815181106124a5576124a5614e0f565b602002602001015190508451831115612540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016105aa565b826000036125f9578051805160209182012060405161258e9261256892910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b6125f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016105aa565b612750565b8051516020116126af57805180516020918201206040516126239261256892910190815260200190565b6125f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016105aa565b805184516020808701919091208251919092012014612750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016105aa565b61275c60106001614d54565b8160200151510361293d57845183036128d5576000612798826020015160108151811061278b5761278b614e0f565b60200260200101516130e9565b9050600081511161282b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016105aa565b600187516128399190614885565b83146128c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016105aa565b9650611a2695505050505050565b60008584815181106128e9576128e9614e0f565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061291457612914614e0f565b6020026020010151905061292781613249565b9550612934600186614d54565b94505050612dc3565b600281602001515103612d3b5760006129558261326e565b905060008160008151811061296c5761296c614e0f565b016020015160f81c90506000612983600283614e3e565b61298e906002614e60565b9050600061299f848360ff16613292565b905060006129ad8a89613292565b905060006129bb83836132c8565b905080835114612a4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016105aa565b60ff851660021480612a62575060ff85166003145b15612c565780825114612af7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016105aa565b6000612b13886020015160018151811061278b5761278b614e0f565b90506000815111612ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016105aa565b60018d51612bb49190614885565b8914612c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016105aa565b9c50611a269b505050505050505050505050565b60ff85161580612c69575060ff85166001145b15612ca857612c958760200151600181518110612c8857612c88614e0f565b6020026020010151613249565b9950612ca1818a614d54565b9850612d30565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016105aa565b505050505050612dc3565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016105aa565b5080612dce81614d6c565b915050612488565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016105aa565b805160609060008167ffffffffffffffff811115612e7f57612e7f6143d3565b604051908082528060200260200182016040528015612ec457816020015b6040805180820190915260608082526020820152815260200190600190039081612e9d5790505b50905060005b82811015612f46576040518060400160405280868381518110612eef57612eef614e0f565b60200260200101518152602001612f1e878481518110612f1157612f11614e0f565b6020026020010151613377565b815250828281518110612f3357612f33614e0f565b6020908102919091010152600101612eca565b509392505050565b80516060906000612f60826002614ad7565b67ffffffffffffffff811115612f7857612f786143d3565b6040519080825280601f01601f191660200182016040528015612fa2576020820181803683370190505b5090506000805b838110156130df57858181518110612fc357612fc3614e0f565b6020910101517fff000000000000000000000000000000000000000000000000000000000000008116925060041c7f0ff0000000000000000000000000000000000000000000000000000000000000168361301f836002614ad7565b8151811061302f5761302f614e0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f0f0000000000000000000000000000000000000000000000000000000000000082168361308d836002614ad7565b613098906001614d54565b815181106130a8576130a8614e0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612fa9565b5090949350505050565b606060008060006130f98561338a565b91945092509050600081600181111561311457613114614e83565b146131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016105aa565b6131ab8284614d54565b85511461323a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016105aa565b611bf585602001518484613df7565b6060602082600001511061326557613260826130e9565b6119e1565b6119e182613e98565b60606119e161328d836020015160008151811061278b5761278b614e0f565b612f4e565b6060825182106132b157506040805160208101909152600081526119e1565b611a2683838486516132c39190614885565b613eae565b600080600083518551106132dd5783516132e0565b84515b90505b808210801561336757508382815181106132ff576132ff614e0f565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191685838151811061333e5761333e614e0f565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15612f46578160010191506132e3565b60606119e161338583614086565b61416f565b600080600080846000015111613448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105aa565b6020840151805160001a607f811161346d576000600160009450945094505050613df0565b60b7811161367b576000613482608083614885565b90508087600001511161353d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016105aa565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806135b657507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016105aa565b5060019550935060009250613df0915050565b60bf81116139c957600061369060b783614885565b90508087600001511161374b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016105aa565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016105aa565b600184015160088302610100031c603781116138ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016105aa565b6138f78184614d54565b8951116139ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016105aa565b6139b7836001614d54565b9750955060009450613df09350505050565b60f78111613aaa5760006139de60c083614885565b905080876000015111613a99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016105aa565b600195509350849250613df0915050565b6000613ab760f783614885565b905080876000015111613b72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016105aa565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613c50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016105aa565b600184015160088302610100031c60378111613d14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016105aa565b613d1e8184614d54565b895111613dd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016105aa565b613dde836001614d54565b9750955060019450613df09350505050565b9193909250565b606060008267ffffffffffffffff811115613e1457613e146143d3565b6040519080825280601f01601f191660200182016040528015613e3e576020820181803683370190505b50905082600003613e50579050611a26565b6000613e5c8587614d54565b90506020820160005b85811015613e7d578281015182820152602001613e65565b85811115613e8c576000868301525b50919695505050505050565b60606119e1826020015160008460000151613df7565b60608182601f011015613f1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105aa565b828284011015613f89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105aa565b81830184511015613ff6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016105aa565b606082158015614015576040519150600082526020820160405261407d565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561404e578051835260209283019201614036565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105aa565b50604080518082019091528151815260209182019181019190915290565b6060600080600061417f8561338a565b91945092509050600181600181111561419a5761419a614e83565b14614227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016105aa565b84516142338385614d54565b146142c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016105aa565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816142d95790505090506000845b87518110156143c75760008061434c6040518060400160405280858d600001516143309190614885565b8152602001858d602001516143459190614d54565b905261338a565b5091509150604051806040016040528083836143689190614d54565b8152602001848c6020015161437d9190614d54565b81525085858151811061439257614392614e0f565b60209081029190910101526143a8600185614d54565b93506143b48183614d54565b6143be9084614d54565b92505050614306565b50815295945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614449576144496143d3565b604052919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461447557600080fd5b919050565b600082601f83011261448b57600080fd5b813567ffffffffffffffff8111156144a5576144a56143d3565b6144d660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614402565b8181528460208386010111156144eb57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561451a57600080fd5b60405160c0810167ffffffffffffffff828210818311171561453e5761453e6143d3565b816040528293508435835261455560208601614451565b602084015261456660408601614451565b6040840152606085013560608401526080850135608084015260a085013591508082111561459357600080fd5b506145a08582860161447a565b60a0830152505092915050565b600080600080600085870360e08112156145c657600080fd5b863567ffffffffffffffff808211156145de57600080fd5b6145ea8a838b01614508565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561462357600080fd5b60408901955060c089013592508083111561463d57600080fd5b828901925089601f84011261465157600080fd5b823591508082111561466257600080fd5b508860208260051b840101111561467857600080fd5b959894975092955050506020019190565b60005b838110156146a457818101518382015260200161468c565b838111156146b3576000848401525b50505050565b600081518084526146d1816020860160208601614689565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a2660208301846146b9565b60006020828403121561472857600080fd5b813567ffffffffffffffff81111561473f57600080fd5b611d3384828501614508565b60006020828403121561475d57600080fd5b5035919050565b600080600080600060a0868803121561477c57600080fd5b61478586614451565b945060208601359350604086013567ffffffffffffffff80821682146147aa57600080fd5b90935060608701359081151582146147c157600080fd5b909250608087013590808211156147d757600080fd5b506147e48882890161447a565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614845816049850160208701614689565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561489757614897614856565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826148da576148da61489c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561492e5761492e614856565b500590565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561496d5761496d614856565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156149a1576149a1614856565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156149e8576149e8614856565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614a2357614a23614856565b60008712925087820587128484161615614a3f57614a3f614856565b87850587128184161615614a5557614a55614856565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614a9d57614a9d614856565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614ad157614ad1614856565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b0f57614b0f614856565b500290565b600067ffffffffffffffff808316818516808303821115614b3757614b37614856565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615614b6f57614b6f614856565b02949350505050565b600082614b8757614b8761489c565b500490565b600060408284031215614b9e57600080fd5b6040516040810181811067ffffffffffffffff82111715614bc157614bc16143d3565b604052825181526020928301519281019290925250919050565b600060808284031215614bed57600080fd5b6040516080810181811067ffffffffffffffff82111715614c1057614c106143d3565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614c5c57614c5c6143d3565b8360051b6020614c6d818301614402565b868152918501918181019036841115614c8557600080fd5b865b84811015614cb957803586811115614c9f5760008081fd5b614cab36828b0161447a565b845250918301918301614c87565b50979650505050505050565b60008451614cd7818460208901614689565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551614d13816001850160208a01614689565b60019201918201528351614d2e816002840160208801614689565b0160020195945050505050565b600060208284031215614d4d57600080fd5b5051919050565b60008219821115614d6757614d67614856565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d9d57614d9d614856565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614def60c08301846146b9565b98975050505050505050565b600082614e0a57614e0a61489c565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680614e5157614e5161489c565b8060ff84160691505092915050565b600060ff821660ff841680821015614e7a57614e7a614856565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a" func init() { if err := json.Unmarshal([]byte(OptimismPortalStorageLayoutJSON), OptimismPortalStorageLayout); err != nil { diff --git a/packages/contracts-bedrock/.gas-snapshot b/packages/contracts-bedrock/.gas-snapshot index ab0da774946e5..275a0dee67a98 100644 --- a/packages/contracts-bedrock/.gas-snapshot +++ b/packages/contracts-bedrock/.gas-snapshot @@ -133,6 +133,27 @@ LegacyERC20ETH_Test:test_mint() (gas: 10649) LegacyERC20ETH_Test:test_transfer() (gas: 10711) LegacyERC20ETH_Test:test_transferFrom() (gas: 12887) LegacyMessagePasser_Test:test_LegacyMessagePasser_passMessageToL1_Succeeds() (gas: 34519) +MerkleTrie_Test:test_get_reverts_corruptedProof() (gas: 5686) +MerkleTrie_Test:test_get_reverts_extraProofElements() (gas: 60560) +MerkleTrie_Test:test_get_reverts_invalidDataRemainder() (gas: 35827) +MerkleTrie_Test:test_get_reverts_invalidInternalNodeHash() (gas: 50763) +MerkleTrie_Test:test_get_reverts_nonexistentKey1() (gas: 59624) +MerkleTrie_Test:test_get_reverts_nonexistentKey2() (gas: 23359) +MerkleTrie_Test:test_get_reverts_smallerPathThanKey1() (gas: 53476) +MerkleTrie_Test:test_get_reverts_smallerPathThanKey2() (gas: 54913) +MerkleTrie_Test:test_get_reverts_wrongKeyProof() (gas: 53844) +MerkleTrie_Test:test_get_reverts_zeroBranchValueLength() (gas: 43222) +MerkleTrie_Test:test_get_reverts_zeroLengthKey() (gas: 15886) +MerkleTrie_Test:test_get_validProofSucceeds1() (gas: 61619) +MerkleTrie_Test:test_get_validProofSucceeds10() (gas: 50546) +MerkleTrie_Test:test_get_validProofSucceeds2() (gas: 71531) +MerkleTrie_Test:test_get_validProofSucceeds3() (gas: 32779) +MerkleTrie_Test:test_get_validProofSucceeds4() (gas: 23553) +MerkleTrie_Test:test_get_validProofSucceeds5() (gas: 84215) +MerkleTrie_Test:test_get_validProofSucceeds6() (gas: 72991) +MerkleTrie_Test:test_get_validProofSucceeds7() (gas: 79670) +MerkleTrie_Test:test_get_validProofSucceeds8() (gas: 50546) +MerkleTrie_Test:test_get_validProofSucceeds9() (gas: 50501) OptimismMintableERC20_Test:test_bridge() (gas: 7599) OptimismMintableERC20_Test:test_burn() (gas: 51031) OptimismMintableERC20_Test:test_burnRevertsFromNotBridge() (gas: 11164) @@ -151,27 +172,27 @@ OptimismPortalUpgradeable_Test:test_initialize_cannotInitImpl_reverts() (gas: 10 OptimismPortalUpgradeable_Test:test_initialize_cannotInitProxy_reverts() (gas: 15789) OptimismPortalUpgradeable_Test:test_params_initValuesOnProxy_success() (gas: 16033) OptimismPortalUpgradeable_Test:test_upgradeToAndCall_upgrading_success() (gas: 180435) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputRootChanges_reverts() (gas: 199706) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputTimestampIsNotFinalized_reverts() (gas: 202003) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalNotProven_reverts() (gas: 39656) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalProofNotOldEnough_reverts() (gas: 197092) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onInsufficientGas_reverts() (gas: 197814) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onRecentWithdrawal_reverts() (gas: 177851) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReentrancy_reverts() (gas: 236156) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReplay_reverts() (gas: 237807) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_provenWithdrawalHash_success() (gas: 229466) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_targetFails_fails() (gas: 332126) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_timestampLessThanL2OracleStart_reverts() (gas: 193794) -OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onInvalidOutputRootProof_reverts() (gas: 83498) -OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onSelfCall_reverts() (gas: 50732) -OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_oninvalidWithdrawalProof_reverts() (gas: 136758) -OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRoot_success() (gas: 277056) -OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProve_reverts() (gas: 189117) -OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_validWithdrawalProof_success() (gas: 179324) -OptimismPortal_Test:test_OptimismPortalConstructor() (gas: 17276) -OptimismPortal_Test:test_OptimismPortalReceiveEth_success() (gas: 127480) -OptimismPortal_Test:test_depositTransaction_NoValueContract_success() (gas: 76681) -OptimismPortal_Test:test_depositTransaction_NoValueEOA_success() (gas: 77153) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputRootChanges_reverts() (gas: 198517) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputTimestampIsNotFinalized_reverts() (gas: 200739) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalNotProven_reverts() (gas: 39634) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalProofNotOldEnough_reverts() (gas: 196193) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onInsufficientGas_reverts() (gas: 194402) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onRecentWithdrawal_reverts() (gas: 174437) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReentrancy_reverts() (gas: 234659) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReplay_reverts() (gas: 238957) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_provenWithdrawalHash_success() (gas: 230626) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_targetFails_fails() (gas: 333263) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_timestampLessThanL2OracleStart_reverts() (gas: 194807) +OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onInvalidOutputRootProof_reverts() (gas: 85539) +OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onInvalidWithdrawalProof_reverts() (gas: 137224) +OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onSelfCall_reverts() (gas: 50754) +OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRoot_success() (gas: 277238) +OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProve_reverts() (gas: 190171) +OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_validWithdrawalProof_success() (gas: 180360) +OptimismPortal_Test:test_OptimismPortalConstructor() (gas: 17298) +OptimismPortal_Test:test_OptimismPortalReceiveEth_success() (gas: 127483) +OptimismPortal_Test:test_depositTransaction_NoValueContract_success() (gas: 76706) +OptimismPortal_Test:test_depositTransaction_NoValueEOA_success() (gas: 76984) OptimismPortal_Test:test_depositTransaction_contractCreation_reverts() (gas: 14245) OptimismPortal_Test:test_depositTransaction_createWithZeroValueForContract_success() (gas: 76707) OptimismPortal_Test:test_depositTransaction_createWithZeroValueForEOA_success() (gas: 77029) diff --git a/packages/contracts-bedrock/.gitignore b/packages/contracts-bedrock/.gitignore index 1387a606e95c7..316eb6927408f 100644 --- a/packages/contracts-bedrock/.gitignore +++ b/packages/contracts-bedrock/.gitignore @@ -10,3 +10,4 @@ src/contract-artifacts.ts tmp-artifacts deployments/mainnet-forked deploy-config/mainnet-forked.json +go-fuzz/fuzz diff --git a/packages/contracts-bedrock/contracts/libraries/trie/MerkleTrie.sol b/packages/contracts-bedrock/contracts/libraries/trie/MerkleTrie.sol index ce99211b1b3b0..13799f6af5862 100644 --- a/packages/contracts-bedrock/contracts/libraries/trie/MerkleTrie.sol +++ b/packages/contracts-bedrock/contracts/libraries/trie/MerkleTrie.sol @@ -54,11 +54,6 @@ library MerkleTrie { */ uint8 internal constant PREFIX_LEAF_ODD = 3; - /** - * @notice RLP representation of `NULL`. - */ - bytes internal constant RLP_NULL = hex"80"; - /** * @notice Verifies a proof that a given key/value pair is present in the trie. * @@ -78,8 +73,7 @@ library MerkleTrie { bytes[] memory _proof, bytes32 _root ) internal pure returns (bool) { - (bool exists, bytes memory value) = get(_key, _proof, _root); - return (exists && Bytes.equal(_value, value)); + return Bytes.equal(_value, get(_key, _proof, _root)); } /** @@ -89,71 +83,27 @@ library MerkleTrie { * @param _proof Merkle trie inclusion proof for the key. * @param _root Known root of the Merkle trie. * - * @return Whether or not the key exists. * @return Value of the key if it exists. */ function get( bytes memory _key, bytes[] memory _proof, bytes32 _root - ) internal pure returns (bool, bytes memory) { + ) internal pure returns (bytes memory) { TrieNode[] memory proof = _parseProof(_proof); - (uint256 pathLength, bytes memory keyRemainder, bool isFinalNode) = _walkNodePath( - proof, - _key, - _root - ); - - bool noRemainder = keyRemainder.length == 0; - - require(noRemainder || isFinalNode, "MerkleTrie: provided proof is invalid"); - - bytes memory value = noRemainder ? _getNodeValue(proof[pathLength - 1]) : bytes(""); - - return (value.length > 0, value); - } - - /** - * @notice Walks through a proof using a provided key. - * - * @param _proof Inclusion proof to walk through. - * @param _key Key to use for the walk. - * @param _root Known root of the trie. - * - * @return Length of the final path - * @return Portion of the key remaining after the walk. - * @return Whether or not we've hit a dead end. - */ - // solhint-disable-next-line code-complexity - function _walkNodePath( - TrieNode[] memory _proof, - bytes memory _key, - bytes32 _root - ) - private - pure - returns ( - uint256, - bytes memory, - bool - ) - { - uint256 pathLength = 0; bytes memory key = Bytes.toNibbles(_key); - bytes memory currentNodeID = abi.encodePacked(_root); uint256 currentKeyIndex = 0; - uint256 currentKeyIncrement = 0; - TrieNode memory currentNode; // Proof is top-down, so we start at the first element (root). - for (uint256 i = 0; i < _proof.length; i++) { - currentNode = _proof[i]; - currentKeyIndex += currentKeyIncrement; + for (uint256 i = 0; i < proof.length; i++) { + TrieNode memory currentNode = proof[i]; - // Keep track of the proof elements we actually need. - // It's expensive to resize arrays, so this simply reduces gas costs. - pathLength += 1; + // Key index should never exceed total key length or we'll be out of bounds. + require( + currentKeyIndex <= key.length, + "MerkleTrie: key index exceeds total key length" + ); if (currentKeyIndex == 0) { // First proof element is always the root node. @@ -177,17 +127,31 @@ library MerkleTrie { if (currentNode.decoded.length == BRANCH_NODE_LENGTH) { if (currentKeyIndex == key.length) { - // We've hit the end of the key - // meaning the value should be within this branch node. - break; + // Value is the last element of the decoded list (for branch nodes). There's + // some ambiguity in the Merkle trie specification because bytes(0) is a + // valid value to place into the trie, but for branch nodes bytes(0) can exist + // even when the value wasn't explicitly placed there. Geth treats a value of + // bytes(0) as "key does not exist" and so we do the same. + bytes memory value = RLPReader.readBytes(currentNode.decoded[TREE_RADIX]); + require( + value.length > 0, + "MerkleTrie: value length must be greater than zero (branch)" + ); + + // Extra proof elements are not allowed. + require( + i == proof.length - 1, + "MerkleTrie: value node must be last node in proof (branch)" + ); + + return value; } else { // We're not at the end of the key yet. // Figure out what the next node ID should be and continue. uint8 branchKey = uint8(key[currentKeyIndex]); RLPReader.RLPItem memory nextNode = currentNode.decoded[branchKey]; currentNodeID = _getNodeID(nextNode); - currentKeyIncrement = 1; - continue; + currentKeyIndex += 1; } } else if (currentNode.decoded.length == LEAF_OR_EXTENSION_NODE_LENGTH) { bytes memory path = _getNodePath(currentNode); @@ -197,38 +161,49 @@ library MerkleTrie { bytes memory keyRemainder = Bytes.slice(key, currentKeyIndex); uint256 sharedNibbleLength = _getSharedNibbleLength(pathRemainder, keyRemainder); + // Whether this is a leaf node or an extension node, the path remainder MUST be a + // prefix of the key remainder (or be equal to the key remainder) or the proof is + // considered invalid. require( - keyRemainder.length >= pathRemainder.length, - "MerkleTrie: invalid key length for leaf or extension node" + pathRemainder.length == sharedNibbleLength, + "MerkleTrie: path remainder must share all nibbles with key" ); if (prefix == PREFIX_LEAF_EVEN || prefix == PREFIX_LEAF_ODD) { - if ( - pathRemainder.length == sharedNibbleLength && - keyRemainder.length == sharedNibbleLength - ) { - // The key within this leaf matches our key exactly. - // Increment the key index to reflect that we have no remainder. - currentKeyIndex += sharedNibbleLength; - } + // Prefix of 2 or 3 means this is a leaf node. For the leaf node to be valid, + // the key remainder must be exactly equal to the path remainder. We already + // did the necessary byte comparison, so it's more efficient here to check that + // the key remainder length equals the shared nibble length, which implies + // equality with the path remainder (since we already did the same check with + // the path remainder and the shared nibble length). + require( + keyRemainder.length == sharedNibbleLength, + "MerkleTrie: key remainder must be identical to path remainder" + ); + + // Our Merkle Trie is designed specifically for the purposes of the Ethereum + // state trie. Empty values are not allowed in the state trie, so we can safely + // say that if the value is empty, the key should not exist and the proof is + // invalid. + bytes memory value = RLPReader.readBytes(currentNode.decoded[1]); + require( + value.length > 0, + "MerkleTrie: value length must be greater than zero (leaf)" + ); - // We've hit a leaf node, so our next node should be NULL. - currentNodeID = RLP_NULL; - break; + // Extra proof elements are not allowed. + require( + i == proof.length - 1, + "MerkleTrie: value node must be last node in proof (leaf)" + ); + + return value; } else if (prefix == PREFIX_EXTENSION_EVEN || prefix == PREFIX_EXTENSION_ODD) { - if (sharedNibbleLength != pathRemainder.length) { - // Our extension node is not identical to the remainder. - // We've hit the end of this path - // updates will need to modify this extension. - currentNodeID = RLP_NULL; - break; - } else { - // Our extension shares some nibbles. - // Carry on to the next node. - currentNodeID = _getNodeID(currentNode.decoded[1]); - currentKeyIncrement = sharedNibbleLength; - continue; - } + // Prefix of 0 or 1 means this is an extension node. We move onto the next node + // in the proof and increment the key index by the length of the path remainder + // which is equal to the shared nibble length. + currentNodeID = _getNodeID(currentNode.decoded[1]); + currentKeyIndex += sharedNibbleLength; } else { revert("MerkleTrie: received a node with an unknown prefix"); } @@ -237,11 +212,7 @@ library MerkleTrie { } } - return ( - pathLength, - Bytes.slice(key, currentKeyIndex), - Bytes.equal(currentNodeID, RLP_NULL) - ); + revert("MerkleTrie: ran out of proof elements"); } /** @@ -287,17 +258,6 @@ library MerkleTrie { return Bytes.toNibbles(RLPReader.readBytes(_node.decoded[0])); } - /** - * @notice Gets the value for a node. - * - * @param _node Node to get a value for. - * - * @return Node value, as hex bytes. - */ - function _getNodeValue(TrieNode memory _node) private pure returns (bytes memory) { - return RLPReader.readBytes(_node.decoded[_node.decoded.length - 1]); - } - /** * @notice Utility; determines the number of nibbles shared between two nibble arrays. * diff --git a/packages/contracts-bedrock/contracts/libraries/trie/SecureMerkleTrie.sol b/packages/contracts-bedrock/contracts/libraries/trie/SecureMerkleTrie.sol index 3246b29ad102f..2d0b33d58cae9 100644 --- a/packages/contracts-bedrock/contracts/libraries/trie/SecureMerkleTrie.sol +++ b/packages/contracts-bedrock/contracts/libraries/trie/SecureMerkleTrie.sol @@ -40,14 +40,13 @@ library SecureMerkleTrie { * @param _proof Merkle trie inclusion proof for the key. * @param _root Known root of the Merkle trie. * - * @return Whether or not the key exists. * @return Value of the key if it exists. */ function get( bytes memory _key, bytes[] memory _proof, bytes32 _root - ) internal pure returns (bool, bytes memory) { + ) internal pure returns (bytes memory) { bytes memory key = _getSecureKey(_key); return MerkleTrie.get(key, _proof, _root); } diff --git a/packages/contracts-bedrock/contracts/test/MerkleTrie.t.sol b/packages/contracts-bedrock/contracts/test/MerkleTrie.t.sol new file mode 100644 index 0000000000000..1e831839b7821 --- /dev/null +++ b/packages/contracts-bedrock/contracts/test/MerkleTrie.t.sol @@ -0,0 +1,367 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { CommonTest } from "./CommonTest.t.sol"; +import { MerkleTrie } from "../libraries/trie/MerkleTrie.sol"; + +contract MerkleTrie_Test is CommonTest { + function test_get_validProofSucceeds1() external { + bytes32 root = 0xd582f99275e227a1cf4284899e5ff06ee56da8859be71b553397c69151bc942f; + bytes memory key = hex"6b6579326262"; + bytes memory val = hex"6176616c32"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"e68416b65793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; + proof[1] = hex"f84580a0582eed8dd051b823d13f8648cdcd08aa2d8dac239f458863c4620e8c4d605debca83206262856176616c32ca83206363856176616c3380808080808080808080808080"; + proof[2] = hex"ca83206262856176616c32"; + + assertEq( + val, + MerkleTrie.get( + key, + proof, + root + ) + ); + } + + function test_get_validProofSucceeds2() external { + bytes32 root = 0xd582f99275e227a1cf4284899e5ff06ee56da8859be71b553397c69151bc942f; + bytes memory key = hex"6b6579316161"; + bytes memory val = hex"303132333435363738393031323334353637383930313233343536373839303132333435363738397878"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"e68416b65793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; + proof[1] = hex"f84580a0582eed8dd051b823d13f8648cdcd08aa2d8dac239f458863c4620e8c4d605debca83206262856176616c32ca83206363856176616c3380808080808080808080808080"; + proof[2] = hex"ef83206161aa303132333435363738393031323334353637383930313233343536373839303132333435363738397878"; + + assertEq( + val, + MerkleTrie.get( + key, + proof, + root + ) + ); + } + + function test_get_validProofSucceeds3() external { + bytes32 root = 0xf838216fa749aefa91e0b672a9c06d3e6e983f913d7107b5dab4af60b5f5abed; + bytes memory key = hex"6b6579316161"; + bytes memory val = hex"303132333435363738393031323334353637383930313233343536373839303132333435363738397878"; + bytes[] memory proof = new bytes[](1); + proof[0] = hex"f387206b6579316161aa303132333435363738393031323334353637383930313233343536373839303132333435363738397878"; + + assertEq( + val, + MerkleTrie.get( + key, + proof, + root + ) + ); + } + + function test_get_validProofSucceeds4() external { + bytes32 root = 0x37956bab6bba472308146808d5311ac19cb4a7daae5df7efcc0f32badc97f55e; + bytes memory key = hex"6b6579316161"; + bytes memory val = hex"3031323334"; + bytes[] memory proof = new bytes[](1); + proof[0] = hex"ce87206b6579316161853031323334"; + + assertEq( + val, + MerkleTrie.get( + key, + proof, + root + ) + ); + } + + function test_get_validProofSucceeds5() external { + bytes32 root = 0xcb65032e2f76c48b82b5c24b3db8f670ce73982869d38cd39a624f23d62a9e89; + bytes memory key = hex"6b657931"; + bytes memory val = hex"30313233343536373839303132333435363738393031323334353637383930313233343536373839566572795f4c6f6e67"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"e68416b65793a0f3f387240403976788281c0a6ee5b3fc08360d276039d635bb824ea7e6fed779"; + proof[1] = hex"f87180a034d14ccc7685aa2beb64f78b11ee2a335eae82047ef97c79b7dda7f0732b9f4ca05fb052b64e23d177131d9f32e9c5b942209eb7229e9a07c99a5d93245f53af18a09a137197a43a880648d5887cce656a5e6bbbe5e44ecb4f264395ccaddbe1acca80808080808080808080808080"; + proof[2] = hex"f862808080808080a057895fdbd71e2c67c2f9274a56811ff5cf458720a7fa713a135e3890f8cafcf8808080808080808080b130313233343536373839303132333435363738393031323334353637383930313233343536373839566572795f4c6f6e67"; + + assertEq( + val, + MerkleTrie.get( + key, + proof, + root + ) + ); + } + + function test_get_validProofSucceeds6() external { + bytes32 root = 0xcb65032e2f76c48b82b5c24b3db8f670ce73982869d38cd39a624f23d62a9e89; + bytes memory key = hex"6b657932"; + bytes memory val = hex"73686f7274"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"e68416b65793a0f3f387240403976788281c0a6ee5b3fc08360d276039d635bb824ea7e6fed779"; + proof[1] = hex"f87180a034d14ccc7685aa2beb64f78b11ee2a335eae82047ef97c79b7dda7f0732b9f4ca05fb052b64e23d177131d9f32e9c5b942209eb7229e9a07c99a5d93245f53af18a09a137197a43a880648d5887cce656a5e6bbbe5e44ecb4f264395ccaddbe1acca80808080808080808080808080"; + proof[2] = hex"df808080808080c9823262856176616c338080808080808080808573686f7274"; + + assertEq( + val, + MerkleTrie.get( + key, + proof, + root + ) + ); + } + + function test_get_validProofSucceeds7() external { + bytes32 root = 0xcb65032e2f76c48b82b5c24b3db8f670ce73982869d38cd39a624f23d62a9e89; + bytes memory key = hex"6b657933"; + bytes memory val = hex"31323334353637383930313233343536373839303132333435363738393031"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"e68416b65793a0f3f387240403976788281c0a6ee5b3fc08360d276039d635bb824ea7e6fed779"; + proof[1] = hex"f87180a034d14ccc7685aa2beb64f78b11ee2a335eae82047ef97c79b7dda7f0732b9f4ca05fb052b64e23d177131d9f32e9c5b942209eb7229e9a07c99a5d93245f53af18a09a137197a43a880648d5887cce656a5e6bbbe5e44ecb4f264395ccaddbe1acca80808080808080808080808080"; + proof[2] = hex"f839808080808080c9823363856176616c338080808080808080809f31323334353637383930313233343536373839303132333435363738393031"; + + assertEq( + val, + MerkleTrie.get( + key, + proof, + root + ) + ); + } + + function test_get_validProofSucceeds8() external { + bytes32 root = 0x72e6c01ad0c9a7b517d4bc68a5b323287fe80f0e68f5415b4b95ecbc8ad83978; + bytes memory key = hex"61"; + bytes memory val = hex"61"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"d916d780c22061c22062c2206380808080808080808080808080"; + proof[1] = hex"d780c22061c22062c2206380808080808080808080808080"; + proof[2] = hex"c22061"; + + assertEq( + val, + MerkleTrie.get( + key, + proof, + root + ) + ); + } + + function test_get_validProofSucceeds9() external { + bytes32 root = 0x72e6c01ad0c9a7b517d4bc68a5b323287fe80f0e68f5415b4b95ecbc8ad83978; + bytes memory key = hex"62"; + bytes memory val = hex"62"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"d916d780c22061c22062c2206380808080808080808080808080"; + proof[1] = hex"d780c22061c22062c2206380808080808080808080808080"; + proof[2] = hex"c22062"; + + assertEq( + val, + MerkleTrie.get( + key, + proof, + root + ) + ); + } + + function test_get_validProofSucceeds10() external { + bytes32 root = 0x72e6c01ad0c9a7b517d4bc68a5b323287fe80f0e68f5415b4b95ecbc8ad83978; + bytes memory key = hex"63"; + bytes memory val = hex"63"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"d916d780c22061c22062c2206380808080808080808080808080"; + proof[1] = hex"d780c22061c22062c2206380808080808080808080808080"; + proof[2] = hex"c22063"; + + assertEq( + val, + MerkleTrie.get( + key, + proof, + root + ) + ); + } + + function test_get_reverts_nonexistentKey1() external { + bytes32 root = 0xd582f99275e227a1cf4284899e5ff06ee56da8859be71b553397c69151bc942f; + bytes memory key = hex"6b657932"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"e68416b65793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; + proof[1] = hex"f84580a0582eed8dd051b823d13f8648cdcd08aa2d8dac239f458863c4620e8c4d605debca83206262856176616c32ca83206363856176616c3380808080808080808080808080"; + proof[2] = hex"ca83206262856176616c32"; + + vm.expectRevert("MerkleTrie: path remainder must share all nibbles with key"); + MerkleTrie.get( + key, + proof, + root + ); + } + + function test_get_reverts_nonexistentKey2() external { + bytes32 root = 0xd582f99275e227a1cf4284899e5ff06ee56da8859be71b553397c69151bc942f; + bytes memory key = hex"616e7972616e646f6d6b6579"; + bytes[] memory proof = new bytes[](1); + proof[0] = hex"e68416b65793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; + + vm.expectRevert("MerkleTrie: path remainder must share all nibbles with key"); + MerkleTrie.get( + key, + proof, + root + ); + } + + function test_get_reverts_wrongKeyProof() external { + bytes32 root = 0x2858eebfa9d96c8a9e6a0cae9d86ec9189127110f132d63f07d3544c2a75a696; + bytes memory key = hex"6b6579316161"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"e216a04892c039d654f1be9af20e88ae53e9ab5fa5520190e0fb2f805823e45ebad22f"; + proof[1] = hex"f84780d687206e6f746865728d33343938683472697568677765808080808080808080a0854405b57aa6dc458bc41899a761cbbb1f66a4998af6dd0e8601c1b845395ae38080808080"; + proof[2] = hex"d687206e6f746865728d33343938683472697568677765"; + + vm.expectRevert("MerkleTrie: invalid internal node hash"); + MerkleTrie.get( + key, + proof, + root + ); + } + + function test_get_reverts_corruptedProof() external { + bytes32 root = 0x2858eebfa9d96c8a9e6a0cae9d86ec9189127110f132d63f07d3544c2a75a696; + bytes memory key = hex"6b6579326262"; + bytes[] memory proof = new bytes[](5); + proof[0] = hex"2fd2ba5ee42358802ffbe0900152a55fabe953ae880ef29abef154d639c09248a016e2"; + proof[1] = hex"f84780d687206e6f746865728d33343938683472697568677765808080808080808080a0854405b57aa6dc458bc41899a761cbbb1f66a4998af6dd0e8601c1b845395ae38080808080"; + proof[2] = hex"e583165793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; + proof[3] = hex"f84580a0582eed8dd051b823d13f8648cdcd08aa2d8dac239f458863c4620e8c4d605debca83206262856176616c32ca83206363856176616c3380808080808080808080808080"; + proof[4] = hex"ca83206262856176616c32"; + + vm.expectRevert("RLPReader: decoded item type for list is not a list item"); + MerkleTrie.get( + key, + proof, + root + ); + } + + function test_get_reverts_invalidDataRemainder() external { + bytes32 root = 0x278c88eb59beba4f8b94f940c41614bb0dd80c305859ebffcd6ce07c93ca3749; + bytes memory key = hex"aa"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"d91ad780808080808080808080c32081aac32081ab8080808080"; + proof[1] = hex"d780808080808080808080c32081aac32081ab8080808080"; + proof[2] = hex"c32081aa000000000000000000000000000000"; + + vm.expectRevert("RLPReader: list item has an invalid data remainder"); + MerkleTrie.get( + key, + proof, + root + ); + } + + function test_get_reverts_invalidInternalNodeHash() external { + bytes32 root = 0xa827dff1a657bb9bb9a1c3abe9db173e2f1359f15eb06f1647ea21ac7c95d8fa; + bytes memory key = hex"aa"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"e21aa09862c6b113008c4204c13755693cbb868acc25ebaa98db11df8c89a0c0dd3157"; + proof[1] = hex"f380808080808080808080a0de2a9c6a46b6ea71ab9e881c8420570cf19e833c85df6026b04f085016e78f00c220118080808080"; + proof[2] = hex"de2a9c6a46b6ea71ab9e881c8420570cf19e833c85df6026b04f085016e78f"; + + vm.expectRevert("MerkleTrie: invalid internal node hash"); + MerkleTrie.get( + key, + proof, + root + ); + } + + function test_get_reverts_zeroBranchValueLength() external { + bytes32 root = 0xe04b3589eef96b237cd49ccb5dcf6e654a47682bfa0961d563ab843f7ad1e035; + bytes memory key = hex"aa"; + bytes[] memory proof = new bytes[](2); + proof[0] = hex"dd8200aad98080808080808080808080c43b82aabbc43c82aacc80808080"; + proof[1] = hex"d98080808080808080808080c43b82aabbc43c82aacc80808080"; + + vm.expectRevert("MerkleTrie: value length must be greater than zero (branch)"); + MerkleTrie.get( + key, + proof, + root + ); + } + + function test_get_reverts_zeroLengthKey() external { + bytes32 root = 0x54157fd62cdf2f474e7bfec2d3cd581e807bee38488c9590cb887add98936b73; + bytes memory key = hex""; + bytes[] memory proof = new bytes[](1); + proof[0] = hex"c78320f00082b443"; + + vm.expectRevert("MerkleTrie: path remainder must share all nibbles with key"); + MerkleTrie.get( + key, + proof, + root + ); + } + + function test_get_reverts_smallerPathThanKey1() external { + bytes32 root = 0xa513ba530659356fb7588a2c831944e80fd8aedaa5a4dc36f918152be2be0605; + bytes memory key = hex"01"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"db10d9c32081bbc582202381aa808080808080808080808080808080"; + proof[1] = hex"d9c32081bbc582202381aa808080808080808080808080808080"; + proof[2] = hex"c582202381aa"; + + vm.expectRevert("MerkleTrie: path remainder must share all nibbles with key"); + MerkleTrie.get( + key, + proof, + root + ); + } + + function test_get_reverts_smallerPathThanKey2() external { + bytes32 root = 0xa06abffaec4ebe8ccde595f4547b864b4421b21c1fc699973f94710c9bc17979; + bytes memory key = hex"aa"; + bytes[] memory proof = new bytes[](3); + proof[0] = hex"e21aa07ea462226a3dc0a46afb4ded39306d7a84d311ada3557dfc75a909fd25530905"; + proof[1] = hex"f380808080808080808080a027f11bd3af96d137b9287632f44dd00fea1ca1bd70386c30985ede8cc287476e808080c220338080"; + proof[2] = hex"e48200bba0a6911545ed01c2d3f4e15b8b27c7bfba97738bd5e6dd674dd07033428a4c53af"; + + vm.expectRevert("MerkleTrie: path remainder must share all nibbles with key"); + MerkleTrie.get( + key, + proof, + root + ); + } + + function test_get_reverts_extraProofElements() external { + bytes32 root = 0x278c88eb59beba4f8b94f940c41614bb0dd80c305859ebffcd6ce07c93ca3749; + bytes memory key = hex"aa"; + bytes[] memory proof = new bytes[](4); + proof[0] = hex"d91ad780808080808080808080c32081aac32081ab8080808080"; + proof[1] = hex"d780808080808080808080c32081aac32081ab8080808080"; + proof[2] = hex"c32081aa"; + proof[3] = hex"c32081aa"; + + vm.expectRevert("MerkleTrie: value node must be last node in proof (leaf)"); + MerkleTrie.get( + key, + proof, + root + ); + } +} diff --git a/packages/contracts-bedrock/contracts/test/OptimismPortal.t.sol b/packages/contracts-bedrock/contracts/test/OptimismPortal.t.sol index 9783344e9e2d3..e405362c62a0c 100644 --- a/packages/contracts-bedrock/contracts/test/OptimismPortal.t.sol +++ b/packages/contracts-bedrock/contracts/test/OptimismPortal.t.sol @@ -362,10 +362,10 @@ contract OptimismPortal_FinalizeWithdrawal_Test is Portal_Initializer { // Test: proveWithdrawalTransaction reverts if the proof is invalid due to non-existence of // the withdrawal. - function test_proveWithdrawalTransaction_oninvalidWithdrawalProof_reverts() external { + function test_proveWithdrawalTransaction_onInvalidWithdrawalProof_reverts() external { // modify the default test values to invalidate the proof. _defaultTx.data = hex"abcd"; - vm.expectRevert("OptimismPortal: invalid withdrawal inclusion proof"); + vm.expectRevert("MerkleTrie: path remainder must share all nibbles with key"); op.proveWithdrawalTransaction( _defaultTx, _proposedOutputIndex, diff --git a/packages/contracts-bedrock/go-fuzz/README.md b/packages/contracts-bedrock/go-fuzz/README.md new file mode 100644 index 0000000000000..ab89047b208fb --- /dev/null +++ b/packages/contracts-bedrock/go-fuzz/README.md @@ -0,0 +1,32 @@ +# `go-fuzz` + +A lightweight input fuzzing utility used for testing various Bedrock contracts. + +
+├── go-fuzz +│ ├── cmd: `go-fuzz`'s binary +│ └── trie: Utility for generating random merkle trie roots / inclusion proofs ++ +## Usage + +To generate an abi-encoded fuzz case, pass in a mode via the `-m` flag as well as an optional variant via the `-v` flag. + +### Available Modes + +#### `trie` + +> **Note** +> Variant required for `trie` mode. + +| Variant | Description | +| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| `valid` | Generate a test case with a valid proof of inclusion for the k/v pair in the trie. | +| `extra_proof_elems` | Generate an invalid test case with an extra proof element attached to an otherwise valid proof of inclusion for the passed k/v. | +| `corrupted_proof` | Generate an invalid test case where the proof is malformed. | +| `invalid_data_remainder` | Generate an invalid test case where a random element of the proof has more bytes than the length designates within the RLP list encoding. | +| `invalid_large_internal_hash` | Generate an invalid test case where a long proof element is incorrect for the root. | +| `invalid_internal_node_hash` | Generate an invalid test case where a small proof element is incorrect for the root. | +| `prefixed_valid_key` | Generate a valid test case with a key that has been given a random prefix | +| `empty_key` | Generate a valid test case with a proof of inclusion for an empty key. | +| `partial_proof` | Generate an invalid test case with a partially correct proof | diff --git a/packages/contracts-bedrock/go-fuzz/cmd/fuzz.go b/packages/contracts-bedrock/go-fuzz/cmd/fuzz.go new file mode 100644 index 0000000000000..f6441bdf2cc97 --- /dev/null +++ b/packages/contracts-bedrock/go-fuzz/cmd/fuzz.go @@ -0,0 +1,31 @@ +package main + +import ( + "flag" + "log" + + t "github.com/ethereum-optimism/optimism/packages/contracts-bedrock/go-fuzz/trie" +) + +// Mode enum +const ( + // Enables the `trie` fuzzer + trie string = "trie" +) + +func main() { + mode := flag.String("m", "", "Fuzzer mode") + variant := flag.String("v", "", "Mode variant") + flag.Parse() + + if len(*mode) < 1 { + log.Fatal("Must pass a mode for the fuzzer!") + } + + switch *mode { + case trie: + t.FuzzTrie(*variant) + default: + log.Fatal("Invalid mode!") + } +} diff --git a/packages/contracts-bedrock/go-fuzz/go.mod b/packages/contracts-bedrock/go-fuzz/go.mod new file mode 100644 index 0000000000000..fa8155c185073 --- /dev/null +++ b/packages/contracts-bedrock/go-fuzz/go.mod @@ -0,0 +1,26 @@ +module github.com/ethereum-optimism/optimism/packages/contracts-bedrock/go-fuzz + +go 1.19 + +require github.com/ethereum/go-ethereum v1.10.26 + +require ( + github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect + github.com/VictoriaMetrics/fastcache v1.6.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/go-ole/go-ole v1.2.1 // indirect + github.com/go-stack/stack v1.8.0 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/tsdb v0.7.1 // indirect + github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect + github.com/tklauser/go-sysconf v0.3.5 // indirect + github.com/tklauser/numcpus v0.2.2 // indirect + golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect +) diff --git a/packages/contracts-bedrock/go-fuzz/go.sum b/packages/contracts-bedrock/go-fuzz/go.sum new file mode 100644 index 0000000000000..8be6ece524dd9 --- /dev/null +++ b/packages/contracts-bedrock/go-fuzz/go.sum @@ -0,0 +1,141 @@ +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= +github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= +github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= +github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= +github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= +github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= +github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= +github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d h1:4SFsTMi4UahlKoloni7L4eYzhFRifURQLw+yv0QDCx8= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/packages/contracts-bedrock/go-fuzz/trie/trie.go b/packages/contracts-bedrock/go-fuzz/trie/trie.go new file mode 100644 index 0000000000000..183c7733a1d8c --- /dev/null +++ b/packages/contracts-bedrock/go-fuzz/trie/trie.go @@ -0,0 +1,252 @@ +package trie + +import ( + "crypto/rand" + "fmt" + "log" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/ethdb/memorydb" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" +) + +// Variant enum +const ( + // Generate a test case with a valid proof of inclusion for the k/v pair in the trie. + valid string = "valid" + // Generate an invalid test case with an extra proof element attached to an otherwise + // valid proof of inclusion for the passed k/v. + extraProofElems = "extra_proof_elems" + // Generate an invalid test case where the proof is malformed. + corruptedProof = "corrupted_proof" + // Generate an invalid test case where a random element of the proof has more bytes than the + // length designates within the RLP list encoding. + invalidDataRemainder = "invalid_data_remainder" + // Generate an invalid test case where a long proof element is incorrect for the root. + invalidLargeInternalHash = "invalid_large_internal_hash" + // Generate an invalid test case where a small proof element is incorrect for the root. + invalidInternalNodeHash = "invalid_internal_node_hash" + // Generate a valid test case with a key that has been given a random prefix + prefixedValidKey = "prefixed_valid_key" + // Generate a valid test case with a proof of inclusion for an empty key. + emptyKey = "empty_key" + // Generate an invalid test case with a partially correct proof + partialProof = "partial_proof" +) + +// Generate an abi-encoded `trieTestCase` of a specified variant +func FuzzTrie(variant string) { + if len(variant) < 1 { + log.Fatal("Must pass a variant to the trie fuzzer!") + } + + var testCase trieTestCase + switch variant { + case valid: + testCase = genTrieTestCase(false) + break + case extraProofElems: + testCase = genTrieTestCase(false) + // Duplicate the last element of the proof + testCase.Proof = append(testCase.Proof, [][]byte{testCase.Proof[len(testCase.Proof)-1]}...) + break + case corruptedProof: + testCase = genTrieTestCase(false) + + // Re-encode a random element within the proof + idx := randRange(0, int64(len(testCase.Proof))) + encoded, _ := rlp.EncodeToBytes(testCase.Proof[idx]) + testCase.Proof[idx] = encoded + break + case invalidDataRemainder: + testCase = genTrieTestCase(false) + + // Alter true length of random proof element by appending random bytes + // Do not update the encoded length + idx := randRange(0, int64(len(testCase.Proof))) + bytes := make([]byte, randRange(1, 512)) + rand.Read(bytes) + testCase.Proof[idx] = append(testCase.Proof[idx], bytes...) + break + case invalidLargeInternalHash: + testCase = genTrieTestCase(false) + + // Clobber 4 bytes within a list element of a random proof element + // TODO: Improve this by decoding the proof elem and choosing random + // bytes to overwrite. + idx := randRange(1, int64(len(testCase.Proof))) + b := make([]byte, 4) + rand.Read(b) + testCase.Proof[idx] = append( + testCase.Proof[idx][:20], + append( + b, + testCase.Proof[idx][24:]..., + )..., + ) + + break + case invalidInternalNodeHash: + testCase = genTrieTestCase(false) + // Assign the last proof element to an encoded list containing a + // random 29 byte value + b := make([]byte, 29) + rand.Read(b) + e, _ := rlp.EncodeToBytes(b) + testCase.Proof[len(testCase.Proof)-1] = append([]byte{0xc0 + 30}, e...) + break + case prefixedValidKey: + testCase = genTrieTestCase(false) + + bytes := make([]byte, randRange(1, 16)) + testCase.Key = append(bytes, testCase.Key...) + break + case emptyKey: + testCase = genTrieTestCase(true) + break + case partialProof: + testCase = genTrieTestCase(false) + + // Cut the proof in half + proofLen := len(testCase.Proof) + newProof := make([][]byte, proofLen/2) + for i := 0; i < proofLen/2; i++ { + newProof[i] = testCase.Proof[i] + } + + testCase.Proof = newProof + break + default: + log.Fatal("Invalid variant passed to trie fuzzer!") + } + + // Print encoded test case with no newline so that foundry's FFI can read the output + fmt.Print(testCase.AbiEncode()) +} + +// Generate a random test case for Bedrock's MerkleTrie verifier. +func genTrieTestCase(selectEmptyKey bool) trieTestCase { + // Create an empty merkle trie + memdb := memorydb.New() + randTrie := trie.NewEmpty(trie.NewDatabase(memdb)) + + // Get a random number of elements to put into the trie + randN := randRange(2, 1024) + // Get a random key/value pair to generate a proof of inclusion for + randSelect := randRange(0, randN) + + // Create a fixed-length key as well as a randomly-sized value + // We create these out of the loop to reduce mem allocations. + randKey := make([]byte, 32) + randValue := make([]byte, randRange(2, 1024)) + + // Randomly selected key/value for proof generation + var key []byte + var value []byte + + // Add `randN` elements to the trie + for i := int64(0); i < randN; i++ { + // Randomize the contents of `randKey` and `randValue` + rand.Read(randKey) + rand.Read(randValue) + + // Clear the selected key if `selectEmptyKey` is true + if i == randSelect && selectEmptyKey { + randKey = make([]byte, 0) + } + + // Insert the random k/v pair into the trie + if err := randTrie.TryUpdate(randKey, randValue); err != nil { + log.Fatal("Error adding key-value pair to trie") + } + + // If this is our randomly selected k/v pair, store it in `key` & `value` + if i == randSelect { + key = randKey + value = randValue + } + } + + // Generate proof for `key`'s inclusion in our trie + var proof proofList + if err := randTrie.Prove(key, 0, &proof); err != nil { + log.Fatal("Error creating proof for randomly selected key's inclusion in generated trie") + } + + // Create our test case with the data collected + testCase := trieTestCase{ + Root: randTrie.Hash(), + Key: key, + Value: value, + Proof: proof, + } + + return testCase +} + +// Represents a test case for bedrock's `MerkleTrie.sol` +type trieTestCase struct { + Root common.Hash + Key []byte + Value []byte + Proof [][]byte +} + +// Tuple type to encode `TrieTestCase` +var ( + trieTestCaseTuple, _ = abi.NewType("tuple", "TrieTestCase", []abi.ArgumentMarshaling{ + {Name: "root", Type: "bytes32"}, + {Name: "key", Type: "bytes"}, + {Name: "value", Type: "bytes"}, + {Name: "proof", Type: "bytes[]"}, + }) + + encoder = abi.Arguments{ + {Type: trieTestCaseTuple}, + } +) + +// Encodes the trieTestCase as the `trieTestCaseTuple`. +func (t *trieTestCase) AbiEncode() string { + // Encode the contents of the struct as a tuple + packed, err := encoder.Pack(&t) + if err != nil { + log.Fatalf("Error packing TrieTestCase: %v", err) + } + + // Remove the pointer and encode the packed bytes as a hex string + return hexutil.Encode(packed[32:]) +} + +// Helper that generates a cryptographically secure random 64-bit integer +// between the range [min, max) +func randRange(min int64, max int64) int64 { + r, err := rand.Int(rand.Reader, new(big.Int).Sub(new(big.Int).SetInt64(max), new(big.Int).SetInt64(min))) + if err != nil { + log.Fatal("Failed to generate random number within bounds") + } + + return (new(big.Int).Add(r, new(big.Int).SetInt64(min))).Int64() +} + +// Represents a range between two 64-bit integers +type intRange struct { + min int64 + max int64 +} + +// Custom type to write the generated proof to +type proofList [][]byte + +func (n *proofList) Put(key []byte, value []byte) error { + *n = append(*n, value) + return nil +} + +func (n *proofList) Delete(key []byte) error { + panic("not supported") +}