Commit e435facb authored by smartcontracts's avatar smartcontracts Committed by GitHub

feat: introduce delayed WETH (#9666)

Introduces a DelayedWETH contract so that bonds have a backup
mechanism in place.
parent b36eb551
......@@ -26,6 +26,7 @@
"WETH9",
"DeployerWhitelist",
"L1BlockNumber",
"DelayedWETH",
"DisputeGameFactory",
"FaultDisputeGame",
"AlphabetVM",
......
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
package bindings
import (
"errors"
"math/big"
"strings"
ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/event"
)
// Reference imports to suppress errors if they are not otherwise used.
var (
_ = errors.New
_ = big.NewInt
_ = strings.NewReader
_ = ethereum.NotFound
_ = bind.Bind
_ = common.Big1
_ = types.BloomLookup
_ = event.NewSubscription
)
// DelayedWETHMetaData contains all meta data concerning the DelayedWETH contract.
var DelayedWETHMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delay\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"config\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"hold\",\"inputs\":[{\"name\":\"_guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_config\",\"type\":\"address\",\"internalType\":\"contractSuperchainConfig\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recover\",\"inputs\":[{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"dst\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"dst\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unlock\",\"inputs\":[{\"name\":\"_guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"_guy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_wad\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"guy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"dst\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"dst\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unwrap\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawal\",\"inputs\":[{\"name\":\"src\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"wad\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]",
Bin: "0x60a06040523480156200001157600080fd5b5060405162001a2d38038062001a2d8339810160408190526200003491620002d7565b6080819052620000466000806200004d565b50620002f1565b600054610100900460ff16158080156200006e5750600054600160ff909116105b806200009e57506200008b30620001a760201b620012021760201c565b1580156200009e575060005460ff166001145b620001075760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156200012b576000805461ff0019166101001790555b62000135620001b6565b62000140836200021e565b606880546001600160a01b0319166001600160a01b0384161790558015620001a2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b600054610100900460ff16620002125760405162461bcd60e51b815260206004820152602b602482015260008051602062001a0d83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000fe565b6200021c62000270565b565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff16620002cc5760405162461bcd60e51b815260206004820152602b602482015260008051602062001a0d83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000fe565b6200021c336200021e565b600060208284031215620002ea57600080fd5b5051919050565b6080516116f96200031460003960008181610343015261112301526116f96000f3fe6080604052600436106101845760003560e01c8063715018a6116100d6578063a9059cbb1161007f578063dd62ed3e11610059578063dd62ed3e1461052b578063f2fde38b14610563578063f3fef3a31461058357600080fd5b8063a9059cbb146104af578063cd47bde1146104cf578063d0e30db01461052357600080fd5b80638da5cb5b116100b05780638da5cb5b1461041b57806395d89b4114610446578063977a5ec51461048f57600080fd5b8063715018a61461039457806379502c55146103a95780637eee288d146103fb57600080fd5b80632e1a7d4d1161013857806354fd4d501161011257806354fd4d50146102eb5780636a42b8f81461033457806370a082311461036757600080fd5b80632e1a7d4d14610284578063313ce567146102a4578063485cc955146102cb57600080fd5b80630ca35682116101695780630ca356821461022757806318160ddd1461024757806323b872dd1461026457600080fd5b806306fdde0314610198578063095ea7b3146101f757600080fd5b36610193576101916105a3565b005b600080fd5b3480156101a457600080fd5b506101e16040518060400160405280600d81526020017f577261707065642045746865720000000000000000000000000000000000000081525081565b6040516101ee91906114fb565b60405180910390f35b34801561020357600080fd5b50610217610212366004611590565b6105fe565b60405190151581526020016101ee565b34801561023357600080fd5b506101916102423660046115bc565b610677565b34801561025357600080fd5b50475b6040519081526020016101ee565b34801561027057600080fd5b5061021761027f3660046115d5565b6107be565b34801561029057600080fd5b5061019161029f3660046115bc565b6109d5565b3480156102b057600080fd5b506102b9601281565b60405160ff90911681526020016101ee565b3480156102d757600080fd5b506101916102e6366004611616565b6109e2565b3480156102f757600080fd5b506101e16040518060400160405280600581526020017f302e322e3000000000000000000000000000000000000000000000000000000081525081565b34801561034057600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610256565b34801561037357600080fd5b5061025661038236600461164f565b60656020526000908152604090205481565b3480156103a057600080fd5b50610191610bbf565b3480156103b557600080fd5b506068546103d69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ee565b34801561040757600080fd5b50610191610416366004611590565b610bd3565b34801561042757600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166103d6565b34801561045257600080fd5b506101e16040518060400160405280600481526020017f574554480000000000000000000000000000000000000000000000000000000081525081565b34801561049b57600080fd5b506101916104aa366004611590565b610d1f565b3480156104bb57600080fd5b506102176104ca366004611590565b610e0c565b3480156104db57600080fd5b5061050e6104ea366004611616565b60676020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101ee565b6101916105a3565b34801561053757600080fd5b50610256610546366004611616565b606660209081526000928352604080842090915290825290205481565b34801561056f57600080fd5b5061019161057e36600461164f565b610e20565b34801561058f57600080fd5b5061019161059e366004611590565b610ed4565b33600090815260656020526040812080543492906105c290849061169b565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b33600081815260666020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106669086815260200190565b60405180910390a350600192915050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146106fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064015b60405180910390fd5b8047101561078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f44656c61796564574554483a20696e73756666696369656e742062616c616e6360448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016106f4565b604051339082156108fc029083906000818181858888f193505050501580156107ba573d6000803e3d6000fd5b5050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152606560205260408120548211156107f057600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610866575073ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156108ee5773ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020548211156108a857600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152606660209081526040808320338452909152812080548492906108e89084906116b3565b90915550505b73ffffffffffffffffffffffffffffffffffffffff8416600090815260656020526040812080548492906109239084906116b3565b909155505073ffffffffffffffffffffffffffffffffffffffff83166000908152606560205260408120805484929061095d90849061169b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109c391815260200190565b60405180910390a35060019392505050565b6109df3382610ed4565b50565b600054610100900460ff1615808015610a025750600054600160ff909116105b80610a1c5750303b158015610a1c575060005460ff166001145b610aa8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106f4565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b0657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610b0e61121e565b610b17836112bd565b606880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610bba57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610bc7611334565b610bd160006112bd565b565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6491906116ca565b15610ccb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c61796564574554483a20636f6e7472616374206973207061757365640060448201526064016106f4565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120426001820155805490918391839190610d1590849061169b565b9091555050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610da0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064016106f4565b33600081815260666020908152604080832073ffffffffffffffffffffffffffffffffffffffff871680855290835292819020859055518481529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050565b6000610e193384846107be565b9392505050565b610e28611334565b73ffffffffffffffffffffffffffffffffffffffff8116610ecb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106f4565b6109df816112bd565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6591906116ca565b15610fcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c61796564574554483a20636f6e7472616374206973207061757365640060448201526064016106f4565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020805482111561108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44656c61796564574554483a20696e73756666696369656e7420756e6c6f636b60448201527f6564207769746864726177616c0000000000000000000000000000000000000060648201526084016106f4565b6000816001015411611120576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44656c61796564574554483a207769746864726177616c206e6f7420756e6c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106f4565b427f00000000000000000000000000000000000000000000000000000000000000008260010154611151919061169b565b11156111df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44656c61796564574554483a207769746864726177616c2064656c6179206e6f60448201527f74206d657400000000000000000000000000000000000000000000000000000060648201526084016106f4565b818160000160008282546111f391906116b3565b90915550610bba9050826113b5565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600054610100900460ff166112b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106f4565b610bd161145b565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610bd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106f4565b336000908152606560205260409020548111156113d157600080fd5b33600090815260656020526040812080548392906113f09084906116b3565b9091555050604051339082156108fc029083906000818181858888f19350505050158015611422573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600054610100900460ff166114f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106f4565b610bd1336112bd565b600060208083528351808285015260005b818110156115285785810183015185820160400152820161150c565b8181111561153a576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109df57600080fd5b600080604083850312156115a357600080fd5b82356115ae8161156e565b946020939093013593505050565b6000602082840312156115ce57600080fd5b5035919050565b6000806000606084860312156115ea57600080fd5b83356115f58161156e565b925060208401356116058161156e565b929592945050506040919091013590565b6000806040838503121561162957600080fd5b82356116348161156e565b915060208301356116448161156e565b809150509250929050565b60006020828403121561166157600080fd5b8135610e198161156e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156116ae576116ae61166c565b500190565b6000828210156116c5576116c561166c565b500390565b6000602082840312156116dc57600080fd5b81518015158114610e1957600080fdfea164736f6c634300080f000a496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069",
}
// DelayedWETHABI is the input ABI used to generate the binding from.
// Deprecated: Use DelayedWETHMetaData.ABI instead.
var DelayedWETHABI = DelayedWETHMetaData.ABI
// DelayedWETHBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use DelayedWETHMetaData.Bin instead.
var DelayedWETHBin = DelayedWETHMetaData.Bin
// DeployDelayedWETH deploys a new Ethereum contract, binding an instance of DelayedWETH to it.
func DeployDelayedWETH(auth *bind.TransactOpts, backend bind.ContractBackend, _delay *big.Int) (common.Address, *types.Transaction, *DelayedWETH, error) {
parsed, err := DelayedWETHMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
}
if parsed == nil {
return common.Address{}, nil, nil, errors.New("GetABI returned nil")
}
address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(DelayedWETHBin), backend, _delay)
if err != nil {
return common.Address{}, nil, nil, err
}
return address, tx, &DelayedWETH{DelayedWETHCaller: DelayedWETHCaller{contract: contract}, DelayedWETHTransactor: DelayedWETHTransactor{contract: contract}, DelayedWETHFilterer: DelayedWETHFilterer{contract: contract}}, nil
}
// DelayedWETH is an auto generated Go binding around an Ethereum contract.
type DelayedWETH struct {
DelayedWETHCaller // Read-only binding to the contract
DelayedWETHTransactor // Write-only binding to the contract
DelayedWETHFilterer // Log filterer for contract events
}
// DelayedWETHCaller is an auto generated read-only Go binding around an Ethereum contract.
type DelayedWETHCaller struct {
contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
// DelayedWETHTransactor is an auto generated write-only Go binding around an Ethereum contract.
type DelayedWETHTransactor struct {
contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
// DelayedWETHFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type DelayedWETHFilterer struct {
contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
// DelayedWETHSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type DelayedWETHSession struct {
Contract *DelayedWETH // Generic contract binding to set the session for
CallOpts bind.CallOpts // Call options to use throughout this session
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}
// DelayedWETHCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type DelayedWETHCallerSession struct {
Contract *DelayedWETHCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts // Call options to use throughout this session
}
// DelayedWETHTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type DelayedWETHTransactorSession struct {
Contract *DelayedWETHTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}
// DelayedWETHRaw is an auto generated low-level Go binding around an Ethereum contract.
type DelayedWETHRaw struct {
Contract *DelayedWETH // Generic contract binding to access the raw methods on
}
// DelayedWETHCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type DelayedWETHCallerRaw struct {
Contract *DelayedWETHCaller // Generic read-only contract binding to access the raw methods on
}
// DelayedWETHTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type DelayedWETHTransactorRaw struct {
Contract *DelayedWETHTransactor // Generic write-only contract binding to access the raw methods on
}
// NewDelayedWETH creates a new instance of DelayedWETH, bound to a specific deployed contract.
func NewDelayedWETH(address common.Address, backend bind.ContractBackend) (*DelayedWETH, error) {
contract, err := bindDelayedWETH(address, backend, backend, backend)
if err != nil {
return nil, err
}
return &DelayedWETH{DelayedWETHCaller: DelayedWETHCaller{contract: contract}, DelayedWETHTransactor: DelayedWETHTransactor{contract: contract}, DelayedWETHFilterer: DelayedWETHFilterer{contract: contract}}, nil
}
// NewDelayedWETHCaller creates a new read-only instance of DelayedWETH, bound to a specific deployed contract.
func NewDelayedWETHCaller(address common.Address, caller bind.ContractCaller) (*DelayedWETHCaller, error) {
contract, err := bindDelayedWETH(address, caller, nil, nil)
if err != nil {
return nil, err
}
return &DelayedWETHCaller{contract: contract}, nil
}
// NewDelayedWETHTransactor creates a new write-only instance of DelayedWETH, bound to a specific deployed contract.
func NewDelayedWETHTransactor(address common.Address, transactor bind.ContractTransactor) (*DelayedWETHTransactor, error) {
contract, err := bindDelayedWETH(address, nil, transactor, nil)
if err != nil {
return nil, err
}
return &DelayedWETHTransactor{contract: contract}, nil
}
// NewDelayedWETHFilterer creates a new log filterer instance of DelayedWETH, bound to a specific deployed contract.
func NewDelayedWETHFilterer(address common.Address, filterer bind.ContractFilterer) (*DelayedWETHFilterer, error) {
contract, err := bindDelayedWETH(address, nil, nil, filterer)
if err != nil {
return nil, err
}
return &DelayedWETHFilterer{contract: contract}, nil
}
// bindDelayedWETH binds a generic wrapper to an already deployed contract.
func bindDelayedWETH(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
parsed, err := abi.JSON(strings.NewReader(DelayedWETHABI))
if err != nil {
return nil, err
}
return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}
// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_DelayedWETH *DelayedWETHRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
return _DelayedWETH.Contract.DelayedWETHCaller.contract.Call(opts, result, method, params...)
}
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_DelayedWETH *DelayedWETHRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
return _DelayedWETH.Contract.DelayedWETHTransactor.contract.Transfer(opts)
}
// Transact invokes the (paid) contract method with params as input values.
func (_DelayedWETH *DelayedWETHRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
return _DelayedWETH.Contract.DelayedWETHTransactor.contract.Transact(opts, method, params...)
}
// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_DelayedWETH *DelayedWETHCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
return _DelayedWETH.Contract.contract.Call(opts, result, method, params...)
}
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_DelayedWETH *DelayedWETHTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
return _DelayedWETH.Contract.contract.Transfer(opts)
}
// Transact invokes the (paid) contract method with params as input values.
func (_DelayedWETH *DelayedWETHTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
return _DelayedWETH.Contract.contract.Transact(opts, method, params...)
}
// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
//
// Solidity: function allowance(address , address ) view returns(uint256)
func (_DelayedWETH *DelayedWETHCaller) Allowance(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (*big.Int, error) {
var out []interface{}
err := _DelayedWETH.contract.Call(opts, &out, "allowance", arg0, arg1)
if err != nil {
return *new(*big.Int), err
}
out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
return out0, err
}
// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
//
// Solidity: function allowance(address , address ) view returns(uint256)
func (_DelayedWETH *DelayedWETHSession) Allowance(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
return _DelayedWETH.Contract.Allowance(&_DelayedWETH.CallOpts, arg0, arg1)
}
// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
//
// Solidity: function allowance(address , address ) view returns(uint256)
func (_DelayedWETH *DelayedWETHCallerSession) Allowance(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
return _DelayedWETH.Contract.Allowance(&_DelayedWETH.CallOpts, arg0, arg1)
}
// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
//
// Solidity: function balanceOf(address ) view returns(uint256)
func (_DelayedWETH *DelayedWETHCaller) BalanceOf(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) {
var out []interface{}
err := _DelayedWETH.contract.Call(opts, &out, "balanceOf", arg0)
if err != nil {
return *new(*big.Int), err
}
out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
return out0, err
}
// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
//
// Solidity: function balanceOf(address ) view returns(uint256)
func (_DelayedWETH *DelayedWETHSession) BalanceOf(arg0 common.Address) (*big.Int, error) {
return _DelayedWETH.Contract.BalanceOf(&_DelayedWETH.CallOpts, arg0)
}
// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
//
// Solidity: function balanceOf(address ) view returns(uint256)
func (_DelayedWETH *DelayedWETHCallerSession) BalanceOf(arg0 common.Address) (*big.Int, error) {
return _DelayedWETH.Contract.BalanceOf(&_DelayedWETH.CallOpts, arg0)
}
// Config is a free data retrieval call binding the contract method 0x79502c55.
//
// Solidity: function config() view returns(address)
func (_DelayedWETH *DelayedWETHCaller) Config(opts *bind.CallOpts) (common.Address, error) {
var out []interface{}
err := _DelayedWETH.contract.Call(opts, &out, "config")
if err != nil {
return *new(common.Address), err
}
out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
return out0, err
}
// Config is a free data retrieval call binding the contract method 0x79502c55.
//
// Solidity: function config() view returns(address)
func (_DelayedWETH *DelayedWETHSession) Config() (common.Address, error) {
return _DelayedWETH.Contract.Config(&_DelayedWETH.CallOpts)
}
// Config is a free data retrieval call binding the contract method 0x79502c55.
//
// Solidity: function config() view returns(address)
func (_DelayedWETH *DelayedWETHCallerSession) Config() (common.Address, error) {
return _DelayedWETH.Contract.Config(&_DelayedWETH.CallOpts)
}
// Decimals is a free data retrieval call binding the contract method 0x313ce567.
//
// Solidity: function decimals() view returns(uint8)
func (_DelayedWETH *DelayedWETHCaller) Decimals(opts *bind.CallOpts) (uint8, error) {
var out []interface{}
err := _DelayedWETH.contract.Call(opts, &out, "decimals")
if err != nil {
return *new(uint8), err
}
out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
return out0, err
}
// Decimals is a free data retrieval call binding the contract method 0x313ce567.
//
// Solidity: function decimals() view returns(uint8)
func (_DelayedWETH *DelayedWETHSession) Decimals() (uint8, error) {
return _DelayedWETH.Contract.Decimals(&_DelayedWETH.CallOpts)
}
// Decimals is a free data retrieval call binding the contract method 0x313ce567.
//
// Solidity: function decimals() view returns(uint8)
func (_DelayedWETH *DelayedWETHCallerSession) Decimals() (uint8, error) {
return _DelayedWETH.Contract.Decimals(&_DelayedWETH.CallOpts)
}
// Delay is a free data retrieval call binding the contract method 0x6a42b8f8.
//
// Solidity: function delay() view returns(uint256)
func (_DelayedWETH *DelayedWETHCaller) Delay(opts *bind.CallOpts) (*big.Int, error) {
var out []interface{}
err := _DelayedWETH.contract.Call(opts, &out, "delay")
if err != nil {
return *new(*big.Int), err
}
out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
return out0, err
}
// Delay is a free data retrieval call binding the contract method 0x6a42b8f8.
//
// Solidity: function delay() view returns(uint256)
func (_DelayedWETH *DelayedWETHSession) Delay() (*big.Int, error) {
return _DelayedWETH.Contract.Delay(&_DelayedWETH.CallOpts)
}
// Delay is a free data retrieval call binding the contract method 0x6a42b8f8.
//
// Solidity: function delay() view returns(uint256)
func (_DelayedWETH *DelayedWETHCallerSession) Delay() (*big.Int, error) {
return _DelayedWETH.Contract.Delay(&_DelayedWETH.CallOpts)
}
// Name is a free data retrieval call binding the contract method 0x06fdde03.
//
// Solidity: function name() view returns(string)
func (_DelayedWETH *DelayedWETHCaller) Name(opts *bind.CallOpts) (string, error) {
var out []interface{}
err := _DelayedWETH.contract.Call(opts, &out, "name")
if err != nil {
return *new(string), err
}
out0 := *abi.ConvertType(out[0], new(string)).(*string)
return out0, err
}
// Name is a free data retrieval call binding the contract method 0x06fdde03.
//
// Solidity: function name() view returns(string)
func (_DelayedWETH *DelayedWETHSession) Name() (string, error) {
return _DelayedWETH.Contract.Name(&_DelayedWETH.CallOpts)
}
// Name is a free data retrieval call binding the contract method 0x06fdde03.
//
// Solidity: function name() view returns(string)
func (_DelayedWETH *DelayedWETHCallerSession) Name() (string, error) {
return _DelayedWETH.Contract.Name(&_DelayedWETH.CallOpts)
}
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
//
// Solidity: function owner() view returns(address)
func (_DelayedWETH *DelayedWETHCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
var out []interface{}
err := _DelayedWETH.contract.Call(opts, &out, "owner")
if err != nil {
return *new(common.Address), err
}
out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
return out0, err
}
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
//
// Solidity: function owner() view returns(address)
func (_DelayedWETH *DelayedWETHSession) Owner() (common.Address, error) {
return _DelayedWETH.Contract.Owner(&_DelayedWETH.CallOpts)
}
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
//
// Solidity: function owner() view returns(address)
func (_DelayedWETH *DelayedWETHCallerSession) Owner() (common.Address, error) {
return _DelayedWETH.Contract.Owner(&_DelayedWETH.CallOpts)
}
// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
//
// Solidity: function symbol() view returns(string)
func (_DelayedWETH *DelayedWETHCaller) Symbol(opts *bind.CallOpts) (string, error) {
var out []interface{}
err := _DelayedWETH.contract.Call(opts, &out, "symbol")
if err != nil {
return *new(string), err
}
out0 := *abi.ConvertType(out[0], new(string)).(*string)
return out0, err
}
// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
//
// Solidity: function symbol() view returns(string)
func (_DelayedWETH *DelayedWETHSession) Symbol() (string, error) {
return _DelayedWETH.Contract.Symbol(&_DelayedWETH.CallOpts)
}
// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
//
// Solidity: function symbol() view returns(string)
func (_DelayedWETH *DelayedWETHCallerSession) Symbol() (string, error) {
return _DelayedWETH.Contract.Symbol(&_DelayedWETH.CallOpts)
}
// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
//
// Solidity: function totalSupply() view returns(uint256)
func (_DelayedWETH *DelayedWETHCaller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {
var out []interface{}
err := _DelayedWETH.contract.Call(opts, &out, "totalSupply")
if err != nil {
return *new(*big.Int), err
}
out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
return out0, err
}
// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
//
// Solidity: function totalSupply() view returns(uint256)
func (_DelayedWETH *DelayedWETHSession) TotalSupply() (*big.Int, error) {
return _DelayedWETH.Contract.TotalSupply(&_DelayedWETH.CallOpts)
}
// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
//
// Solidity: function totalSupply() view returns(uint256)
func (_DelayedWETH *DelayedWETHCallerSession) TotalSupply() (*big.Int, error) {
return _DelayedWETH.Contract.TotalSupply(&_DelayedWETH.CallOpts)
}
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
//
// Solidity: function version() view returns(string)
func (_DelayedWETH *DelayedWETHCaller) Version(opts *bind.CallOpts) (string, error) {
var out []interface{}
err := _DelayedWETH.contract.Call(opts, &out, "version")
if err != nil {
return *new(string), err
}
out0 := *abi.ConvertType(out[0], new(string)).(*string)
return out0, err
}
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
//
// Solidity: function version() view returns(string)
func (_DelayedWETH *DelayedWETHSession) Version() (string, error) {
return _DelayedWETH.Contract.Version(&_DelayedWETH.CallOpts)
}
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
//
// Solidity: function version() view returns(string)
func (_DelayedWETH *DelayedWETHCallerSession) Version() (string, error) {
return _DelayedWETH.Contract.Version(&_DelayedWETH.CallOpts)
}
// Withdrawals is a free data retrieval call binding the contract method 0xcd47bde1.
//
// Solidity: function withdrawals(address , address ) view returns(uint256 amount, uint256 timestamp)
func (_DelayedWETH *DelayedWETHCaller) Withdrawals(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (struct {
Amount *big.Int
Timestamp *big.Int
}, error) {
var out []interface{}
err := _DelayedWETH.contract.Call(opts, &out, "withdrawals", arg0, arg1)
outstruct := new(struct {
Amount *big.Int
Timestamp *big.Int
})
if err != nil {
return *outstruct, err
}
outstruct.Amount = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
outstruct.Timestamp = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
return *outstruct, err
}
// Withdrawals is a free data retrieval call binding the contract method 0xcd47bde1.
//
// Solidity: function withdrawals(address , address ) view returns(uint256 amount, uint256 timestamp)
func (_DelayedWETH *DelayedWETHSession) Withdrawals(arg0 common.Address, arg1 common.Address) (struct {
Amount *big.Int
Timestamp *big.Int
}, error) {
return _DelayedWETH.Contract.Withdrawals(&_DelayedWETH.CallOpts, arg0, arg1)
}
// Withdrawals is a free data retrieval call binding the contract method 0xcd47bde1.
//
// Solidity: function withdrawals(address , address ) view returns(uint256 amount, uint256 timestamp)
func (_DelayedWETH *DelayedWETHCallerSession) Withdrawals(arg0 common.Address, arg1 common.Address) (struct {
Amount *big.Int
Timestamp *big.Int
}, error) {
return _DelayedWETH.Contract.Withdrawals(&_DelayedWETH.CallOpts, arg0, arg1)
}
// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
//
// Solidity: function approve(address guy, uint256 wad) returns(bool)
func (_DelayedWETH *DelayedWETHTransactor) Approve(opts *bind.TransactOpts, guy common.Address, wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.contract.Transact(opts, "approve", guy, wad)
}
// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
//
// Solidity: function approve(address guy, uint256 wad) returns(bool)
func (_DelayedWETH *DelayedWETHSession) Approve(guy common.Address, wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Approve(&_DelayedWETH.TransactOpts, guy, wad)
}
// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
//
// Solidity: function approve(address guy, uint256 wad) returns(bool)
func (_DelayedWETH *DelayedWETHTransactorSession) Approve(guy common.Address, wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Approve(&_DelayedWETH.TransactOpts, guy, wad)
}
// Deposit is a paid mutator transaction binding the contract method 0xd0e30db0.
//
// Solidity: function deposit() payable returns()
func (_DelayedWETH *DelayedWETHTransactor) Deposit(opts *bind.TransactOpts) (*types.Transaction, error) {
return _DelayedWETH.contract.Transact(opts, "deposit")
}
// Deposit is a paid mutator transaction binding the contract method 0xd0e30db0.
//
// Solidity: function deposit() payable returns()
func (_DelayedWETH *DelayedWETHSession) Deposit() (*types.Transaction, error) {
return _DelayedWETH.Contract.Deposit(&_DelayedWETH.TransactOpts)
}
// Deposit is a paid mutator transaction binding the contract method 0xd0e30db0.
//
// Solidity: function deposit() payable returns()
func (_DelayedWETH *DelayedWETHTransactorSession) Deposit() (*types.Transaction, error) {
return _DelayedWETH.Contract.Deposit(&_DelayedWETH.TransactOpts)
}
// Hold is a paid mutator transaction binding the contract method 0x977a5ec5.
//
// Solidity: function hold(address _guy, uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHTransactor) Hold(opts *bind.TransactOpts, _guy common.Address, _wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.contract.Transact(opts, "hold", _guy, _wad)
}
// Hold is a paid mutator transaction binding the contract method 0x977a5ec5.
//
// Solidity: function hold(address _guy, uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHSession) Hold(_guy common.Address, _wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Hold(&_DelayedWETH.TransactOpts, _guy, _wad)
}
// Hold is a paid mutator transaction binding the contract method 0x977a5ec5.
//
// Solidity: function hold(address _guy, uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHTransactorSession) Hold(_guy common.Address, _wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Hold(&_DelayedWETH.TransactOpts, _guy, _wad)
}
// Initialize is a paid mutator transaction binding the contract method 0x485cc955.
//
// Solidity: function initialize(address _owner, address _config) returns()
func (_DelayedWETH *DelayedWETHTransactor) Initialize(opts *bind.TransactOpts, _owner common.Address, _config common.Address) (*types.Transaction, error) {
return _DelayedWETH.contract.Transact(opts, "initialize", _owner, _config)
}
// Initialize is a paid mutator transaction binding the contract method 0x485cc955.
//
// Solidity: function initialize(address _owner, address _config) returns()
func (_DelayedWETH *DelayedWETHSession) Initialize(_owner common.Address, _config common.Address) (*types.Transaction, error) {
return _DelayedWETH.Contract.Initialize(&_DelayedWETH.TransactOpts, _owner, _config)
}
// Initialize is a paid mutator transaction binding the contract method 0x485cc955.
//
// Solidity: function initialize(address _owner, address _config) returns()
func (_DelayedWETH *DelayedWETHTransactorSession) Initialize(_owner common.Address, _config common.Address) (*types.Transaction, error) {
return _DelayedWETH.Contract.Initialize(&_DelayedWETH.TransactOpts, _owner, _config)
}
// Recover is a paid mutator transaction binding the contract method 0x0ca35682.
//
// Solidity: function recover(uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHTransactor) Recover(opts *bind.TransactOpts, _wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.contract.Transact(opts, "recover", _wad)
}
// Recover is a paid mutator transaction binding the contract method 0x0ca35682.
//
// Solidity: function recover(uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHSession) Recover(_wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Recover(&_DelayedWETH.TransactOpts, _wad)
}
// Recover is a paid mutator transaction binding the contract method 0x0ca35682.
//
// Solidity: function recover(uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHTransactorSession) Recover(_wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Recover(&_DelayedWETH.TransactOpts, _wad)
}
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
//
// Solidity: function renounceOwnership() returns()
func (_DelayedWETH *DelayedWETHTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
return _DelayedWETH.contract.Transact(opts, "renounceOwnership")
}
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
//
// Solidity: function renounceOwnership() returns()
func (_DelayedWETH *DelayedWETHSession) RenounceOwnership() (*types.Transaction, error) {
return _DelayedWETH.Contract.RenounceOwnership(&_DelayedWETH.TransactOpts)
}
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
//
// Solidity: function renounceOwnership() returns()
func (_DelayedWETH *DelayedWETHTransactorSession) RenounceOwnership() (*types.Transaction, error) {
return _DelayedWETH.Contract.RenounceOwnership(&_DelayedWETH.TransactOpts)
}
// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
//
// Solidity: function transfer(address dst, uint256 wad) returns(bool)
func (_DelayedWETH *DelayedWETHTransactor) Transfer(opts *bind.TransactOpts, dst common.Address, wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.contract.Transact(opts, "transfer", dst, wad)
}
// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
//
// Solidity: function transfer(address dst, uint256 wad) returns(bool)
func (_DelayedWETH *DelayedWETHSession) Transfer(dst common.Address, wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Transfer(&_DelayedWETH.TransactOpts, dst, wad)
}
// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
//
// Solidity: function transfer(address dst, uint256 wad) returns(bool)
func (_DelayedWETH *DelayedWETHTransactorSession) Transfer(dst common.Address, wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Transfer(&_DelayedWETH.TransactOpts, dst, wad)
}
// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
//
// Solidity: function transferFrom(address src, address dst, uint256 wad) returns(bool)
func (_DelayedWETH *DelayedWETHTransactor) TransferFrom(opts *bind.TransactOpts, src common.Address, dst common.Address, wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.contract.Transact(opts, "transferFrom", src, dst, wad)
}
// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
//
// Solidity: function transferFrom(address src, address dst, uint256 wad) returns(bool)
func (_DelayedWETH *DelayedWETHSession) TransferFrom(src common.Address, dst common.Address, wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.TransferFrom(&_DelayedWETH.TransactOpts, src, dst, wad)
}
// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
//
// Solidity: function transferFrom(address src, address dst, uint256 wad) returns(bool)
func (_DelayedWETH *DelayedWETHTransactorSession) TransferFrom(src common.Address, dst common.Address, wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.TransferFrom(&_DelayedWETH.TransactOpts, src, dst, wad)
}
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
//
// Solidity: function transferOwnership(address newOwner) returns()
func (_DelayedWETH *DelayedWETHTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
return _DelayedWETH.contract.Transact(opts, "transferOwnership", newOwner)
}
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
//
// Solidity: function transferOwnership(address newOwner) returns()
func (_DelayedWETH *DelayedWETHSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
return _DelayedWETH.Contract.TransferOwnership(&_DelayedWETH.TransactOpts, newOwner)
}
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
//
// Solidity: function transferOwnership(address newOwner) returns()
func (_DelayedWETH *DelayedWETHTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
return _DelayedWETH.Contract.TransferOwnership(&_DelayedWETH.TransactOpts, newOwner)
}
// Unlock is a paid mutator transaction binding the contract method 0x7eee288d.
//
// Solidity: function unlock(address _guy, uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHTransactor) Unlock(opts *bind.TransactOpts, _guy common.Address, _wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.contract.Transact(opts, "unlock", _guy, _wad)
}
// Unlock is a paid mutator transaction binding the contract method 0x7eee288d.
//
// Solidity: function unlock(address _guy, uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHSession) Unlock(_guy common.Address, _wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Unlock(&_DelayedWETH.TransactOpts, _guy, _wad)
}
// Unlock is a paid mutator transaction binding the contract method 0x7eee288d.
//
// Solidity: function unlock(address _guy, uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHTransactorSession) Unlock(_guy common.Address, _wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Unlock(&_DelayedWETH.TransactOpts, _guy, _wad)
}
// Withdraw is a paid mutator transaction binding the contract method 0x2e1a7d4d.
//
// Solidity: function withdraw(uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHTransactor) Withdraw(opts *bind.TransactOpts, _wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.contract.Transact(opts, "withdraw", _wad)
}
// Withdraw is a paid mutator transaction binding the contract method 0x2e1a7d4d.
//
// Solidity: function withdraw(uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHSession) Withdraw(_wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Withdraw(&_DelayedWETH.TransactOpts, _wad)
}
// Withdraw is a paid mutator transaction binding the contract method 0x2e1a7d4d.
//
// Solidity: function withdraw(uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHTransactorSession) Withdraw(_wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Withdraw(&_DelayedWETH.TransactOpts, _wad)
}
// Withdraw0 is a paid mutator transaction binding the contract method 0xf3fef3a3.
//
// Solidity: function withdraw(address _guy, uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHTransactor) Withdraw0(opts *bind.TransactOpts, _guy common.Address, _wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.contract.Transact(opts, "withdraw0", _guy, _wad)
}
// Withdraw0 is a paid mutator transaction binding the contract method 0xf3fef3a3.
//
// Solidity: function withdraw(address _guy, uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHSession) Withdraw0(_guy common.Address, _wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Withdraw0(&_DelayedWETH.TransactOpts, _guy, _wad)
}
// Withdraw0 is a paid mutator transaction binding the contract method 0xf3fef3a3.
//
// Solidity: function withdraw(address _guy, uint256 _wad) returns()
func (_DelayedWETH *DelayedWETHTransactorSession) Withdraw0(_guy common.Address, _wad *big.Int) (*types.Transaction, error) {
return _DelayedWETH.Contract.Withdraw0(&_DelayedWETH.TransactOpts, _guy, _wad)
}
// Receive is a paid mutator transaction binding the contract receive function.
//
// Solidity: receive() payable returns()
func (_DelayedWETH *DelayedWETHTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
return _DelayedWETH.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
}
// Receive is a paid mutator transaction binding the contract receive function.
//
// Solidity: receive() payable returns()
func (_DelayedWETH *DelayedWETHSession) Receive() (*types.Transaction, error) {
return _DelayedWETH.Contract.Receive(&_DelayedWETH.TransactOpts)
}
// Receive is a paid mutator transaction binding the contract receive function.
//
// Solidity: receive() payable returns()
func (_DelayedWETH *DelayedWETHTransactorSession) Receive() (*types.Transaction, error) {
return _DelayedWETH.Contract.Receive(&_DelayedWETH.TransactOpts)
}
// DelayedWETHApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the DelayedWETH contract.
type DelayedWETHApprovalIterator struct {
Event *DelayedWETHApproval // Event containing the contract specifics and raw log
contract *bind.BoundContract // Generic contract to use for unpacking event data
event string // Event name to use for unpacking event data
logs chan types.Log // Log channel receiving the found contract events
sub ethereum.Subscription // Subscription for errors, completion and termination
done bool // Whether the subscription completed delivering logs
fail error // Occurred error to stop iteration
}
// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *DelayedWETHApprovalIterator) Next() bool {
// If the iterator failed, stop iterating
if it.fail != nil {
return false
}
// If the iterator completed, deliver directly whatever's available
if it.done {
select {
case log := <-it.logs:
it.Event = new(DelayedWETHApproval)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
default:
return false
}
}
// Iterator still in progress, wait for either a data or an error event
select {
case log := <-it.logs:
it.Event = new(DelayedWETHApproval)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
case err := <-it.sub.Err():
it.done = true
it.fail = err
return it.Next()
}
}
// Error returns any retrieval or parsing error occurred during filtering.
func (it *DelayedWETHApprovalIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *DelayedWETHApprovalIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// DelayedWETHApproval represents a Approval event raised by the DelayedWETH contract.
type DelayedWETHApproval struct {
Src common.Address
Guy common.Address
Wad *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
//
// Solidity: event Approval(address indexed src, address indexed guy, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) FilterApproval(opts *bind.FilterOpts, src []common.Address, guy []common.Address) (*DelayedWETHApprovalIterator, error) {
var srcRule []interface{}
for _, srcItem := range src {
srcRule = append(srcRule, srcItem)
}
var guyRule []interface{}
for _, guyItem := range guy {
guyRule = append(guyRule, guyItem)
}
logs, sub, err := _DelayedWETH.contract.FilterLogs(opts, "Approval", srcRule, guyRule)
if err != nil {
return nil, err
}
return &DelayedWETHApprovalIterator{contract: _DelayedWETH.contract, event: "Approval", logs: logs, sub: sub}, nil
}
// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
//
// Solidity: event Approval(address indexed src, address indexed guy, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *DelayedWETHApproval, src []common.Address, guy []common.Address) (event.Subscription, error) {
var srcRule []interface{}
for _, srcItem := range src {
srcRule = append(srcRule, srcItem)
}
var guyRule []interface{}
for _, guyItem := range guy {
guyRule = append(guyRule, guyItem)
}
logs, sub, err := _DelayedWETH.contract.WatchLogs(opts, "Approval", srcRule, guyRule)
if err != nil {
return nil, err
}
return event.NewSubscription(func(quit <-chan struct{}) error {
defer sub.Unsubscribe()
for {
select {
case log := <-logs:
// New log arrived, parse the event and forward to the user
event := new(DelayedWETHApproval)
if err := _DelayedWETH.contract.UnpackLog(event, "Approval", log); err != nil {
return err
}
event.Raw = log
select {
case sink <- event:
case err := <-sub.Err():
return err
case <-quit:
return nil
}
case err := <-sub.Err():
return err
case <-quit:
return nil
}
}
}), nil
}
// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
//
// Solidity: event Approval(address indexed src, address indexed guy, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) ParseApproval(log types.Log) (*DelayedWETHApproval, error) {
event := new(DelayedWETHApproval)
if err := _DelayedWETH.contract.UnpackLog(event, "Approval", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// DelayedWETHDepositIterator is returned from FilterDeposit and is used to iterate over the raw logs and unpacked data for Deposit events raised by the DelayedWETH contract.
type DelayedWETHDepositIterator struct {
Event *DelayedWETHDeposit // Event containing the contract specifics and raw log
contract *bind.BoundContract // Generic contract to use for unpacking event data
event string // Event name to use for unpacking event data
logs chan types.Log // Log channel receiving the found contract events
sub ethereum.Subscription // Subscription for errors, completion and termination
done bool // Whether the subscription completed delivering logs
fail error // Occurred error to stop iteration
}
// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *DelayedWETHDepositIterator) Next() bool {
// If the iterator failed, stop iterating
if it.fail != nil {
return false
}
// If the iterator completed, deliver directly whatever's available
if it.done {
select {
case log := <-it.logs:
it.Event = new(DelayedWETHDeposit)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
default:
return false
}
}
// Iterator still in progress, wait for either a data or an error event
select {
case log := <-it.logs:
it.Event = new(DelayedWETHDeposit)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
case err := <-it.sub.Err():
it.done = true
it.fail = err
return it.Next()
}
}
// Error returns any retrieval or parsing error occurred during filtering.
func (it *DelayedWETHDepositIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *DelayedWETHDepositIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// DelayedWETHDeposit represents a Deposit event raised by the DelayedWETH contract.
type DelayedWETHDeposit struct {
Dst common.Address
Wad *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterDeposit is a free log retrieval operation binding the contract event 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c.
//
// Solidity: event Deposit(address indexed dst, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) FilterDeposit(opts *bind.FilterOpts, dst []common.Address) (*DelayedWETHDepositIterator, error) {
var dstRule []interface{}
for _, dstItem := range dst {
dstRule = append(dstRule, dstItem)
}
logs, sub, err := _DelayedWETH.contract.FilterLogs(opts, "Deposit", dstRule)
if err != nil {
return nil, err
}
return &DelayedWETHDepositIterator{contract: _DelayedWETH.contract, event: "Deposit", logs: logs, sub: sub}, nil
}
// WatchDeposit is a free log subscription operation binding the contract event 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c.
//
// Solidity: event Deposit(address indexed dst, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) WatchDeposit(opts *bind.WatchOpts, sink chan<- *DelayedWETHDeposit, dst []common.Address) (event.Subscription, error) {
var dstRule []interface{}
for _, dstItem := range dst {
dstRule = append(dstRule, dstItem)
}
logs, sub, err := _DelayedWETH.contract.WatchLogs(opts, "Deposit", dstRule)
if err != nil {
return nil, err
}
return event.NewSubscription(func(quit <-chan struct{}) error {
defer sub.Unsubscribe()
for {
select {
case log := <-logs:
// New log arrived, parse the event and forward to the user
event := new(DelayedWETHDeposit)
if err := _DelayedWETH.contract.UnpackLog(event, "Deposit", log); err != nil {
return err
}
event.Raw = log
select {
case sink <- event:
case err := <-sub.Err():
return err
case <-quit:
return nil
}
case err := <-sub.Err():
return err
case <-quit:
return nil
}
}
}), nil
}
// ParseDeposit is a log parse operation binding the contract event 0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c.
//
// Solidity: event Deposit(address indexed dst, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) ParseDeposit(log types.Log) (*DelayedWETHDeposit, error) {
event := new(DelayedWETHDeposit)
if err := _DelayedWETH.contract.UnpackLog(event, "Deposit", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// DelayedWETHInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the DelayedWETH contract.
type DelayedWETHInitializedIterator struct {
Event *DelayedWETHInitialized // Event containing the contract specifics and raw log
contract *bind.BoundContract // Generic contract to use for unpacking event data
event string // Event name to use for unpacking event data
logs chan types.Log // Log channel receiving the found contract events
sub ethereum.Subscription // Subscription for errors, completion and termination
done bool // Whether the subscription completed delivering logs
fail error // Occurred error to stop iteration
}
// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *DelayedWETHInitializedIterator) Next() bool {
// If the iterator failed, stop iterating
if it.fail != nil {
return false
}
// If the iterator completed, deliver directly whatever's available
if it.done {
select {
case log := <-it.logs:
it.Event = new(DelayedWETHInitialized)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
default:
return false
}
}
// Iterator still in progress, wait for either a data or an error event
select {
case log := <-it.logs:
it.Event = new(DelayedWETHInitialized)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
case err := <-it.sub.Err():
it.done = true
it.fail = err
return it.Next()
}
}
// Error returns any retrieval or parsing error occurred during filtering.
func (it *DelayedWETHInitializedIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *DelayedWETHInitializedIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// DelayedWETHInitialized represents a Initialized event raised by the DelayedWETH contract.
type DelayedWETHInitialized struct {
Version uint8
Raw types.Log // Blockchain specific contextual infos
}
// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
//
// Solidity: event Initialized(uint8 version)
func (_DelayedWETH *DelayedWETHFilterer) FilterInitialized(opts *bind.FilterOpts) (*DelayedWETHInitializedIterator, error) {
logs, sub, err := _DelayedWETH.contract.FilterLogs(opts, "Initialized")
if err != nil {
return nil, err
}
return &DelayedWETHInitializedIterator{contract: _DelayedWETH.contract, event: "Initialized", logs: logs, sub: sub}, nil
}
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
//
// Solidity: event Initialized(uint8 version)
func (_DelayedWETH *DelayedWETHFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *DelayedWETHInitialized) (event.Subscription, error) {
logs, sub, err := _DelayedWETH.contract.WatchLogs(opts, "Initialized")
if err != nil {
return nil, err
}
return event.NewSubscription(func(quit <-chan struct{}) error {
defer sub.Unsubscribe()
for {
select {
case log := <-logs:
// New log arrived, parse the event and forward to the user
event := new(DelayedWETHInitialized)
if err := _DelayedWETH.contract.UnpackLog(event, "Initialized", log); err != nil {
return err
}
event.Raw = log
select {
case sink <- event:
case err := <-sub.Err():
return err
case <-quit:
return nil
}
case err := <-sub.Err():
return err
case <-quit:
return nil
}
}
}), nil
}
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
//
// Solidity: event Initialized(uint8 version)
func (_DelayedWETH *DelayedWETHFilterer) ParseInitialized(log types.Log) (*DelayedWETHInitialized, error) {
event := new(DelayedWETHInitialized)
if err := _DelayedWETH.contract.UnpackLog(event, "Initialized", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// DelayedWETHOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the DelayedWETH contract.
type DelayedWETHOwnershipTransferredIterator struct {
Event *DelayedWETHOwnershipTransferred // Event containing the contract specifics and raw log
contract *bind.BoundContract // Generic contract to use for unpacking event data
event string // Event name to use for unpacking event data
logs chan types.Log // Log channel receiving the found contract events
sub ethereum.Subscription // Subscription for errors, completion and termination
done bool // Whether the subscription completed delivering logs
fail error // Occurred error to stop iteration
}
// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *DelayedWETHOwnershipTransferredIterator) Next() bool {
// If the iterator failed, stop iterating
if it.fail != nil {
return false
}
// If the iterator completed, deliver directly whatever's available
if it.done {
select {
case log := <-it.logs:
it.Event = new(DelayedWETHOwnershipTransferred)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
default:
return false
}
}
// Iterator still in progress, wait for either a data or an error event
select {
case log := <-it.logs:
it.Event = new(DelayedWETHOwnershipTransferred)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
case err := <-it.sub.Err():
it.done = true
it.fail = err
return it.Next()
}
}
// Error returns any retrieval or parsing error occurred during filtering.
func (it *DelayedWETHOwnershipTransferredIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *DelayedWETHOwnershipTransferredIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// DelayedWETHOwnershipTransferred represents a OwnershipTransferred event raised by the DelayedWETH contract.
type DelayedWETHOwnershipTransferred struct {
PreviousOwner common.Address
NewOwner common.Address
Raw types.Log // Blockchain specific contextual infos
}
// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
//
// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
func (_DelayedWETH *DelayedWETHFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*DelayedWETHOwnershipTransferredIterator, error) {
var previousOwnerRule []interface{}
for _, previousOwnerItem := range previousOwner {
previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
}
var newOwnerRule []interface{}
for _, newOwnerItem := range newOwner {
newOwnerRule = append(newOwnerRule, newOwnerItem)
}
logs, sub, err := _DelayedWETH.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
if err != nil {
return nil, err
}
return &DelayedWETHOwnershipTransferredIterator{contract: _DelayedWETH.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
}
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
//
// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
func (_DelayedWETH *DelayedWETHFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *DelayedWETHOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) {
var previousOwnerRule []interface{}
for _, previousOwnerItem := range previousOwner {
previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
}
var newOwnerRule []interface{}
for _, newOwnerItem := range newOwner {
newOwnerRule = append(newOwnerRule, newOwnerItem)
}
logs, sub, err := _DelayedWETH.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
if err != nil {
return nil, err
}
return event.NewSubscription(func(quit <-chan struct{}) error {
defer sub.Unsubscribe()
for {
select {
case log := <-logs:
// New log arrived, parse the event and forward to the user
event := new(DelayedWETHOwnershipTransferred)
if err := _DelayedWETH.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
return err
}
event.Raw = log
select {
case sink <- event:
case err := <-sub.Err():
return err
case <-quit:
return nil
}
case err := <-sub.Err():
return err
case <-quit:
return nil
}
}
}), nil
}
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
//
// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
func (_DelayedWETH *DelayedWETHFilterer) ParseOwnershipTransferred(log types.Log) (*DelayedWETHOwnershipTransferred, error) {
event := new(DelayedWETHOwnershipTransferred)
if err := _DelayedWETH.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// DelayedWETHTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the DelayedWETH contract.
type DelayedWETHTransferIterator struct {
Event *DelayedWETHTransfer // Event containing the contract specifics and raw log
contract *bind.BoundContract // Generic contract to use for unpacking event data
event string // Event name to use for unpacking event data
logs chan types.Log // Log channel receiving the found contract events
sub ethereum.Subscription // Subscription for errors, completion and termination
done bool // Whether the subscription completed delivering logs
fail error // Occurred error to stop iteration
}
// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *DelayedWETHTransferIterator) Next() bool {
// If the iterator failed, stop iterating
if it.fail != nil {
return false
}
// If the iterator completed, deliver directly whatever's available
if it.done {
select {
case log := <-it.logs:
it.Event = new(DelayedWETHTransfer)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
default:
return false
}
}
// Iterator still in progress, wait for either a data or an error event
select {
case log := <-it.logs:
it.Event = new(DelayedWETHTransfer)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
case err := <-it.sub.Err():
it.done = true
it.fail = err
return it.Next()
}
}
// Error returns any retrieval or parsing error occurred during filtering.
func (it *DelayedWETHTransferIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *DelayedWETHTransferIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// DelayedWETHTransfer represents a Transfer event raised by the DelayedWETH contract.
type DelayedWETHTransfer struct {
Src common.Address
Dst common.Address
Wad *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
//
// Solidity: event Transfer(address indexed src, address indexed dst, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) FilterTransfer(opts *bind.FilterOpts, src []common.Address, dst []common.Address) (*DelayedWETHTransferIterator, error) {
var srcRule []interface{}
for _, srcItem := range src {
srcRule = append(srcRule, srcItem)
}
var dstRule []interface{}
for _, dstItem := range dst {
dstRule = append(dstRule, dstItem)
}
logs, sub, err := _DelayedWETH.contract.FilterLogs(opts, "Transfer", srcRule, dstRule)
if err != nil {
return nil, err
}
return &DelayedWETHTransferIterator{contract: _DelayedWETH.contract, event: "Transfer", logs: logs, sub: sub}, nil
}
// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
//
// Solidity: event Transfer(address indexed src, address indexed dst, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *DelayedWETHTransfer, src []common.Address, dst []common.Address) (event.Subscription, error) {
var srcRule []interface{}
for _, srcItem := range src {
srcRule = append(srcRule, srcItem)
}
var dstRule []interface{}
for _, dstItem := range dst {
dstRule = append(dstRule, dstItem)
}
logs, sub, err := _DelayedWETH.contract.WatchLogs(opts, "Transfer", srcRule, dstRule)
if err != nil {
return nil, err
}
return event.NewSubscription(func(quit <-chan struct{}) error {
defer sub.Unsubscribe()
for {
select {
case log := <-logs:
// New log arrived, parse the event and forward to the user
event := new(DelayedWETHTransfer)
if err := _DelayedWETH.contract.UnpackLog(event, "Transfer", log); err != nil {
return err
}
event.Raw = log
select {
case sink <- event:
case err := <-sub.Err():
return err
case <-quit:
return nil
}
case err := <-sub.Err():
return err
case <-quit:
return nil
}
}
}), nil
}
// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
//
// Solidity: event Transfer(address indexed src, address indexed dst, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) ParseTransfer(log types.Log) (*DelayedWETHTransfer, error) {
event := new(DelayedWETHTransfer)
if err := _DelayedWETH.contract.UnpackLog(event, "Transfer", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// DelayedWETHUnwrapIterator is returned from FilterUnwrap and is used to iterate over the raw logs and unpacked data for Unwrap events raised by the DelayedWETH contract.
type DelayedWETHUnwrapIterator struct {
Event *DelayedWETHUnwrap // Event containing the contract specifics and raw log
contract *bind.BoundContract // Generic contract to use for unpacking event data
event string // Event name to use for unpacking event data
logs chan types.Log // Log channel receiving the found contract events
sub ethereum.Subscription // Subscription for errors, completion and termination
done bool // Whether the subscription completed delivering logs
fail error // Occurred error to stop iteration
}
// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *DelayedWETHUnwrapIterator) Next() bool {
// If the iterator failed, stop iterating
if it.fail != nil {
return false
}
// If the iterator completed, deliver directly whatever's available
if it.done {
select {
case log := <-it.logs:
it.Event = new(DelayedWETHUnwrap)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
default:
return false
}
}
// Iterator still in progress, wait for either a data or an error event
select {
case log := <-it.logs:
it.Event = new(DelayedWETHUnwrap)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
case err := <-it.sub.Err():
it.done = true
it.fail = err
return it.Next()
}
}
// Error returns any retrieval or parsing error occurred during filtering.
func (it *DelayedWETHUnwrapIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *DelayedWETHUnwrapIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// DelayedWETHUnwrap represents a Unwrap event raised by the DelayedWETH contract.
type DelayedWETHUnwrap struct {
Src common.Address
Wad *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterUnwrap is a free log retrieval operation binding the contract event 0x5dd085b6070b4cae004f84daafd199fd55b0bdfa11c3a802baffe89c2419d8c2.
//
// Solidity: event Unwrap(address indexed src, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) FilterUnwrap(opts *bind.FilterOpts, src []common.Address) (*DelayedWETHUnwrapIterator, error) {
var srcRule []interface{}
for _, srcItem := range src {
srcRule = append(srcRule, srcItem)
}
logs, sub, err := _DelayedWETH.contract.FilterLogs(opts, "Unwrap", srcRule)
if err != nil {
return nil, err
}
return &DelayedWETHUnwrapIterator{contract: _DelayedWETH.contract, event: "Unwrap", logs: logs, sub: sub}, nil
}
// WatchUnwrap is a free log subscription operation binding the contract event 0x5dd085b6070b4cae004f84daafd199fd55b0bdfa11c3a802baffe89c2419d8c2.
//
// Solidity: event Unwrap(address indexed src, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) WatchUnwrap(opts *bind.WatchOpts, sink chan<- *DelayedWETHUnwrap, src []common.Address) (event.Subscription, error) {
var srcRule []interface{}
for _, srcItem := range src {
srcRule = append(srcRule, srcItem)
}
logs, sub, err := _DelayedWETH.contract.WatchLogs(opts, "Unwrap", srcRule)
if err != nil {
return nil, err
}
return event.NewSubscription(func(quit <-chan struct{}) error {
defer sub.Unsubscribe()
for {
select {
case log := <-logs:
// New log arrived, parse the event and forward to the user
event := new(DelayedWETHUnwrap)
if err := _DelayedWETH.contract.UnpackLog(event, "Unwrap", log); err != nil {
return err
}
event.Raw = log
select {
case sink <- event:
case err := <-sub.Err():
return err
case <-quit:
return nil
}
case err := <-sub.Err():
return err
case <-quit:
return nil
}
}
}), nil
}
// ParseUnwrap is a log parse operation binding the contract event 0x5dd085b6070b4cae004f84daafd199fd55b0bdfa11c3a802baffe89c2419d8c2.
//
// Solidity: event Unwrap(address indexed src, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) ParseUnwrap(log types.Log) (*DelayedWETHUnwrap, error) {
event := new(DelayedWETHUnwrap)
if err := _DelayedWETH.contract.UnpackLog(event, "Unwrap", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// DelayedWETHWithdrawalIterator is returned from FilterWithdrawal and is used to iterate over the raw logs and unpacked data for Withdrawal events raised by the DelayedWETH contract.
type DelayedWETHWithdrawalIterator struct {
Event *DelayedWETHWithdrawal // Event containing the contract specifics and raw log
contract *bind.BoundContract // Generic contract to use for unpacking event data
event string // Event name to use for unpacking event data
logs chan types.Log // Log channel receiving the found contract events
sub ethereum.Subscription // Subscription for errors, completion and termination
done bool // Whether the subscription completed delivering logs
fail error // Occurred error to stop iteration
}
// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *DelayedWETHWithdrawalIterator) Next() bool {
// If the iterator failed, stop iterating
if it.fail != nil {
return false
}
// If the iterator completed, deliver directly whatever's available
if it.done {
select {
case log := <-it.logs:
it.Event = new(DelayedWETHWithdrawal)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
default:
return false
}
}
// Iterator still in progress, wait for either a data or an error event
select {
case log := <-it.logs:
it.Event = new(DelayedWETHWithdrawal)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
}
it.Event.Raw = log
return true
case err := <-it.sub.Err():
it.done = true
it.fail = err
return it.Next()
}
}
// Error returns any retrieval or parsing error occurred during filtering.
func (it *DelayedWETHWithdrawalIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *DelayedWETHWithdrawalIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// DelayedWETHWithdrawal represents a Withdrawal event raised by the DelayedWETH contract.
type DelayedWETHWithdrawal struct {
Src common.Address
Wad *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterWithdrawal is a free log retrieval operation binding the contract event 0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65.
//
// Solidity: event Withdrawal(address indexed src, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) FilterWithdrawal(opts *bind.FilterOpts, src []common.Address) (*DelayedWETHWithdrawalIterator, error) {
var srcRule []interface{}
for _, srcItem := range src {
srcRule = append(srcRule, srcItem)
}
logs, sub, err := _DelayedWETH.contract.FilterLogs(opts, "Withdrawal", srcRule)
if err != nil {
return nil, err
}
return &DelayedWETHWithdrawalIterator{contract: _DelayedWETH.contract, event: "Withdrawal", logs: logs, sub: sub}, nil
}
// WatchWithdrawal is a free log subscription operation binding the contract event 0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65.
//
// Solidity: event Withdrawal(address indexed src, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) WatchWithdrawal(opts *bind.WatchOpts, sink chan<- *DelayedWETHWithdrawal, src []common.Address) (event.Subscription, error) {
var srcRule []interface{}
for _, srcItem := range src {
srcRule = append(srcRule, srcItem)
}
logs, sub, err := _DelayedWETH.contract.WatchLogs(opts, "Withdrawal", srcRule)
if err != nil {
return nil, err
}
return event.NewSubscription(func(quit <-chan struct{}) error {
defer sub.Unsubscribe()
for {
select {
case log := <-logs:
// New log arrived, parse the event and forward to the user
event := new(DelayedWETHWithdrawal)
if err := _DelayedWETH.contract.UnpackLog(event, "Withdrawal", log); err != nil {
return err
}
event.Raw = log
select {
case sink <- event:
case err := <-sub.Err():
return err
case <-quit:
return nil
}
case err := <-sub.Err():
return err
case <-quit:
return nil
}
}
}), nil
}
// ParseWithdrawal is a log parse operation binding the contract event 0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65.
//
// Solidity: event Withdrawal(address indexed src, uint256 wad)
func (_DelayedWETH *DelayedWETHFilterer) ParseWithdrawal(log types.Log) (*DelayedWETHWithdrawal, error) {
event := new(DelayedWETHWithdrawal)
if err := _DelayedWETH.contract.UnpackLog(event, "Withdrawal", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
package bindings
import (
"encoding/json"
"github.com/ethereum-optimism/optimism/op-bindings/solc"
)
const DelayedWETHStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)50_storage\"},{\"astId\":1003,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1005,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"balanceOf\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1006,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"allowance\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":1007,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"withdrawals\",\"offset\":0,\"slot\":\"103\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_struct(WithdrawalRequest)1010_storage))\"},{\"astId\":1008,\"contract\":\"src/dispute/weth/DelayedWETH.sol:DelayedWETH\",\"label\":\"config\",\"offset\":0,\"slot\":\"104\",\"type\":\"t_contract(SuperchainConfig)1009\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\",\"base\":\"t_uint256\"},\"t_array(t_uint256)50_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_contract(SuperchainConfig)1009\":{\"encoding\":\"inplace\",\"label\":\"contract SuperchainConfig\",\"numberOfBytes\":\"20\"},\"t_mapping(t_address,t_mapping(t_address,t_struct(WithdrawalRequest)1010_storage))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e struct IDelayedWETH.WithdrawalRequest))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_struct(WithdrawalRequest)1010_storage)\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_struct(WithdrawalRequest)1010_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct IDelayedWETH.WithdrawalRequest)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(WithdrawalRequest)1010_storage\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_struct(WithdrawalRequest)1010_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IDelayedWETH.WithdrawalRequest\",\"numberOfBytes\":\"64\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}"
var DelayedWETHStorageLayout = new(solc.StorageLayout)
var DelayedWETHDeployedBin = "0x6080604052600436106101845760003560e01c8063715018a6116100d6578063a9059cbb1161007f578063dd62ed3e11610059578063dd62ed3e1461052b578063f2fde38b14610563578063f3fef3a31461058357600080fd5b8063a9059cbb146104af578063cd47bde1146104cf578063d0e30db01461052357600080fd5b80638da5cb5b116100b05780638da5cb5b1461041b57806395d89b4114610446578063977a5ec51461048f57600080fd5b8063715018a61461039457806379502c55146103a95780637eee288d146103fb57600080fd5b80632e1a7d4d1161013857806354fd4d501161011257806354fd4d50146102eb5780636a42b8f81461033457806370a082311461036757600080fd5b80632e1a7d4d14610284578063313ce567146102a4578063485cc955146102cb57600080fd5b80630ca35682116101695780630ca356821461022757806318160ddd1461024757806323b872dd1461026457600080fd5b806306fdde0314610198578063095ea7b3146101f757600080fd5b36610193576101916105a3565b005b600080fd5b3480156101a457600080fd5b506101e16040518060400160405280600d81526020017f577261707065642045746865720000000000000000000000000000000000000081525081565b6040516101ee91906114fb565b60405180910390f35b34801561020357600080fd5b50610217610212366004611590565b6105fe565b60405190151581526020016101ee565b34801561023357600080fd5b506101916102423660046115bc565b610677565b34801561025357600080fd5b50475b6040519081526020016101ee565b34801561027057600080fd5b5061021761027f3660046115d5565b6107be565b34801561029057600080fd5b5061019161029f3660046115bc565b6109d5565b3480156102b057600080fd5b506102b9601281565b60405160ff90911681526020016101ee565b3480156102d757600080fd5b506101916102e6366004611616565b6109e2565b3480156102f757600080fd5b506101e16040518060400160405280600581526020017f302e322e3000000000000000000000000000000000000000000000000000000081525081565b34801561034057600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610256565b34801561037357600080fd5b5061025661038236600461164f565b60656020526000908152604090205481565b3480156103a057600080fd5b50610191610bbf565b3480156103b557600080fd5b506068546103d69073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ee565b34801561040757600080fd5b50610191610416366004611590565b610bd3565b34801561042757600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166103d6565b34801561045257600080fd5b506101e16040518060400160405280600481526020017f574554480000000000000000000000000000000000000000000000000000000081525081565b34801561049b57600080fd5b506101916104aa366004611590565b610d1f565b3480156104bb57600080fd5b506102176104ca366004611590565b610e0c565b3480156104db57600080fd5b5061050e6104ea366004611616565b60676020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101ee565b6101916105a3565b34801561053757600080fd5b50610256610546366004611616565b606660209081526000928352604080842090915290825290205481565b34801561056f57600080fd5b5061019161057e36600461164f565b610e20565b34801561058f57600080fd5b5061019161059e366004611590565b610ed4565b33600090815260656020526040812080543492906105c290849061169b565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b33600081815260666020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106669086815260200190565b60405180910390a350600192915050565b60335473ffffffffffffffffffffffffffffffffffffffff1633146106fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064015b60405180910390fd5b8047101561078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f44656c61796564574554483a20696e73756666696369656e742062616c616e6360448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016106f4565b604051339082156108fc029083906000818181858888f193505050501580156107ba573d6000803e3d6000fd5b5050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152606560205260408120548211156107f057600080fd5b73ffffffffffffffffffffffffffffffffffffffff84163314801590610866575073ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156108ee5773ffffffffffffffffffffffffffffffffffffffff841660009081526066602090815260408083203384529091529020548211156108a857600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152606660209081526040808320338452909152812080548492906108e89084906116b3565b90915550505b73ffffffffffffffffffffffffffffffffffffffff8416600090815260656020526040812080548492906109239084906116b3565b909155505073ffffffffffffffffffffffffffffffffffffffff83166000908152606560205260408120805484929061095d90849061169b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109c391815260200190565b60405180910390a35060019392505050565b6109df3382610ed4565b50565b600054610100900460ff1615808015610a025750600054600160ff909116105b80610a1c5750303b158015610a1c575060005460ff166001145b610aa8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106f4565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610b0657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610b0e61121e565b610b17836112bd565b606880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610bba57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610bc7611334565b610bd160006112bd565b565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6491906116ca565b15610ccb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c61796564574554483a20636f6e7472616374206973207061757365640060448201526064016106f4565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120426001820155805490918391839190610d1590849061169b565b9091555050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610da0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f44656c61796564574554483a206e6f74206f776e65720000000000000000000060448201526064016106f4565b33600081815260666020908152604080832073ffffffffffffffffffffffffffffffffffffffff871680855290835292819020859055518481529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35050565b6000610e193384846107be565b9392505050565b610e28611334565b73ffffffffffffffffffffffffffffffffffffffff8116610ecb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106f4565b6109df816112bd565b606860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6591906116ca565b15610fcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c61796564574554483a20636f6e7472616374206973207061757365640060448201526064016106f4565b33600090815260676020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020805482111561108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f44656c61796564574554483a20696e73756666696369656e7420756e6c6f636b60448201527f6564207769746864726177616c0000000000000000000000000000000000000060648201526084016106f4565b6000816001015411611120576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44656c61796564574554483a207769746864726177616c206e6f7420756e6c6f60448201527f636b65640000000000000000000000000000000000000000000000000000000060648201526084016106f4565b427f00000000000000000000000000000000000000000000000000000000000000008260010154611151919061169b565b11156111df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44656c61796564574554483a207769746864726177616c2064656c6179206e6f60448201527f74206d657400000000000000000000000000000000000000000000000000000060648201526084016106f4565b818160000160008282546111f391906116b3565b90915550610bba9050826113b5565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600054610100900460ff166112b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106f4565b610bd161145b565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610bd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106f4565b336000908152606560205260409020548111156113d157600080fd5b33600090815260656020526040812080548392906113f09084906116b3565b9091555050604051339082156108fc029083906000818181858888f19350505050158015611422573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b600054610100900460ff166114f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106f4565b610bd1336112bd565b600060208083528351808285015260005b818110156115285785810183015185820160400152820161150c565b8181111561153a576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109df57600080fd5b600080604083850312156115a357600080fd5b82356115ae8161156e565b946020939093013593505050565b6000602082840312156115ce57600080fd5b5035919050565b6000806000606084860312156115ea57600080fd5b83356115f58161156e565b925060208401356116058161156e565b929592945050506040919091013590565b6000806040838503121561162957600080fd5b82356116348161156e565b915060208301356116448161156e565b809150509250929050565b60006020828403121561166157600080fd5b8135610e198161156e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156116ae576116ae61166c565b500190565b6000828210156116c5576116c561166c565b500390565b6000602082840312156116dc57600080fd5b81518015158114610e1957600080fdfea164736f6c634300080f000a"
func init() {
if err := json.Unmarshal([]byte(DelayedWETHStorageLayoutJSON), DelayedWETHStorageLayout); err != nil {
panic(err)
}
layouts["DelayedWETH"] = DelayedWETHStorageLayout
deployedBytecodes["DelayedWETH"] = DelayedWETHDeployedBin
immutableReferences["DelayedWETH"] = true
}
......@@ -30,8 +30,8 @@ var (
// FaultDisputeGameMetaData contains all meta data concerning the FaultDisputeGame contract.
var FaultDisputeGameMetaData = &bind.MetaData{
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_absolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_genesisBlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_genesisOutputRoot\",\"type\":\"bytes32\",\"internalType\":\"Hash\"},{\"name\":\"_maxGameDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_splitDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gameDuration\",\"type\":\"uint64\",\"internalType\":\"Duration\"},{\"name\":\"_vm\",\"type\":\"address\",\"internalType\":\"contractIBigStepper\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"absolutePrestate\",\"inputs\":[],\"outputs\":[{\"name\":\"absolutePrestate_\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addLocalData\",\"inputs\":[{\"name\":\"_ident\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_execLeafIdx\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"attack\",\"inputs\":[{\"name\":\"_parentIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"claimCredit\",\"inputs\":[{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimData\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"parentIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"counteredBy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bond\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"position\",\"type\":\"uint128\",\"internalType\":\"Position\"},{\"name\":\"clock\",\"type\":\"uint128\",\"internalType\":\"Clock\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDataLen\",\"inputs\":[],\"outputs\":[{\"name\":\"len_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimedBondFlag\",\"inputs\":[],\"outputs\":[{\"name\":\"claimedBondFlag_\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"createdAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"credit\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defend\",\"inputs\":[{\"name\":\"_parentIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"extraData\",\"inputs\":[],\"outputs\":[{\"name\":\"extraData_\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"gameData\",\"inputs\":[],\"outputs\":[{\"name\":\"gameType_\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"rootClaim_\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"extraData_\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameDuration\",\"inputs\":[],\"outputs\":[{\"name\":\"gameDuration_\",\"type\":\"uint64\",\"internalType\":\"Duration\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameType\",\"inputs\":[],\"outputs\":[{\"name\":\"gameType_\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"genesisBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"genesisBlockNumber_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"genesisOutputRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"genesisOutputRoot_\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRequiredBond\",\"inputs\":[{\"name\":\"_position\",\"type\":\"uint128\",\"internalType\":\"Position\"}],\"outputs\":[{\"name\":\"requiredBond_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"l1Head\",\"inputs\":[],\"outputs\":[{\"name\":\"l1Head_\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"l2BlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"l2BlockNumber_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"maxGameDepth\",\"inputs\":[],\"outputs\":[{\"name\":\"maxGameDepth_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"move\",\"inputs\":[{\"name\":\"_challengeIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_isAttack\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[],\"outputs\":[{\"name\":\"status_\",\"type\":\"uint8\",\"internalType\":\"enumGameStatus\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolveClaim\",\"inputs\":[{\"name\":\"_claimIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resolvedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rootClaim\",\"inputs\":[],\"outputs\":[{\"name\":\"rootClaim_\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"splitDepth\",\"inputs\":[],\"outputs\":[{\"name\":\"splitDepth_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"status\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumGameStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"step\",\"inputs\":[{\"name\":\"_claimIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_isAttack\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_stateData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"vm\",\"inputs\":[],\"outputs\":[{\"name\":\"vm_\",\"type\":\"address\",\"internalType\":\"contractIBigStepper\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Move\",\"inputs\":[{\"name\":\"parentIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"claim\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"Claim\"},{\"name\":\"claimant\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Resolved\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumGameStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BondTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotDefendRootClaim\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClaimAboveSplit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClaimAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClaimAlreadyResolved\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClockNotExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClockTimeExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DuplicateStep\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GameDepthExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GameNotInProgress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientBond\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidLocalIdent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidParent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPrestate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSplitDepth\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfOrderResolution\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRootClaim\",\"inputs\":[{\"name\":\"rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}]},{\"type\":\"error\",\"name\":\"ValidStep\",\"inputs\":[]}]",
Bin: "0x6101806040523480156200001257600080fd5b5060405162003be338038062003be383398101604081905262000035916200009b565b838310620000565760405163e62ccf3960e01b815260040160405180910390fd5b63ffffffff90971661016052608095909552610120939093526101409190915260a05260c0526001600160401b031660e0526001600160a01b03166101005262000140565b600080600080600080600080610100898b031215620000b957600080fd5b885163ffffffff81168114620000ce57600080fd5b60208a015160408b015160608c015160808d015160a08e015160c08f0151959d50939b509199509750955093506001600160401b03811681146200011157600080fd5b60e08a01519092506001600160a01b03811681146200012f57600080fd5b809150509295985092959890939650565b60805160a05160c05160e051610100516101205161014051610160516139aa62000239600039600081816104d301526120f50152600081816104080152612d4b0152600081816101ec015281816112710152611f500152600081816102f1015281816119cb0152611d2701526000818161067b01528181610e5f01526122530152600081816106ae01528181610c4d01528181610d160152818161182601528181611f2601528181612694015281816128d701528181612a0501528181612b0d0152612be901526000818161075001528181610cb901528181611715015261184701526000818161049801526118dd01526139aa6000f3fe6080604052600436106101d85760003560e01c80638d450a9511610102578063d8cc1a3c11610095578063f8f43ff611610064578063f8f43ff6146106fd578063fa24f7431461071d578063fa315aa914610741578063fdffbb281461077457600080fd5b8063d8cc1a3c1461064c578063e1f0c3761461066c578063ec5e63081461069f578063f3f7214e146106d257600080fd5b8063c55cd0c7116100d1578063c55cd0c714610561578063c6f0308c14610574578063cf09e0d0146105fe578063d5d44d801461061f57600080fd5b80638d450a9514610489578063bbdc02db146104bc578063bcef3b55146104fd578063c395e1ca1461053a57600080fd5b8063609d33341161017a57806368800abf1161014957806368800abf146103f95780638129fc1c1461042c5780638980e0cc146104345780638b85902b1461044957600080fd5b8063609d33341461037157806360e2746414610386578063632247ea146103a65780636361506d146103b957600080fd5b80632810e1d6116101b65780632810e1d6146102a057806335fef567146102b55780633a768463146102ca57806354fd4d501461031b57600080fd5b80630356fe3a146101dd57806319effeb41461021f578063200d2ed214610265575b600080fd5b3480156101e957600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040519081526020015b60405180910390f35b34801561022b57600080fd5b5060005461024c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610216565b34801561027157600080fd5b5060005461029390700100000000000000000000000000000000900460ff1681565b60405161021691906133e4565b3480156102ac57600080fd5b50610293610787565b6102c86102c3366004613425565b610984565b005b3480156102d657600080fd5b5060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610216565b34801561032757600080fd5b506103646040518060400160405280600581526020017f302e372e3000000000000000000000000000000000000000000000000000000081525081565b60405161021691906134b2565b34801561037d57600080fd5b50610364610994565b34801561039257600080fd5b506102c86103a13660046134e7565b6109a7565b6102c86103b4366004613520565b610a57565b3480156103c557600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013561020c565b34801561040557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b6102c861122d565b34801561044057600080fd5b5060015461020c565b34801561045557600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013561020c565b34801561049557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b3480156104c857600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610216565b34801561050957600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033561020c565b34801561054657600080fd5b5061020c610555366004613555565b50662386f26fc1000090565b6102c861056f366004613425565b6115c1565b34801561058057600080fd5b5061059461058f366004613587565b6115cd565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610216565b34801561060a57600080fd5b5060005461024c9067ffffffffffffffff1681565b34801561062b57600080fd5b5061020c61063a3660046134e7565b60026020526000908152604090205481565b34801561065857600080fd5b506102c86106673660046135e9565b611664565b34801561067857600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061024c565b3480156106ab57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b3480156106de57600080fd5b506040516fffffffffffffffffffffffffffffffff8152602001610216565b34801561070957600080fd5b506102c8610718366004613673565b611c99565b34801561072957600080fd5b506107326120f3565b6040516102169392919061369f565b34801561074d57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b6102c8610782366004613587565b612150565b600080600054700100000000000000000000000000000000900460ff1660028111156107b5576107b56133b5565b146107ec576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff16610828576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600081548110610854576108546136cd565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff161461088f576001610892565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff90911617700100000000000000000000000000000000836002811115610943576109436133b5565b021790556002811115610958576109586133b5565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b61099082826000610a57565b5050565b60606109a2604060206125b1565b905090565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260026020526040808220805490839055905190929083908381818185875af1925050503d8060008114610a12576040519150601f19603f3d011682016040523d82523d6000602084013e610a17565b606091505b5050905080610a52576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008054700100000000000000000000000000000000900460ff166002811115610a8357610a836133b5565b14610aba576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018481548110610acf57610acf6136cd565b600091825260208083206040805160e0810182526005909402909101805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff6401000000009092048216948601949094526001820154169184019190915260028101546fffffffffffffffffffffffffffffffff90811660608501526003820154608085015260049091015480821660a0850181905270010000000000000000000000000000000090910490911660c0840152919350909190610b94908390869061264816565b90506000610c34826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050861580610c765750610c737f0000000000000000000000000000000000000000000000000000000000000000600261372b565b81145b8015610c80575084155b15610cb7576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610d11576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d3c7f0000000000000000000000000000000000000000000000000000000000000000600161372b565b8103610d4e57610d4e86888588612650565b34662386f26fc100001115610d8f576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835160009063ffffffff90811614610def576001856000015163ffffffff1681548110610dbe57610dbe6136cd565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b60c0850151600090610e139067ffffffffffffffff165b67ffffffffffffffff1690565b67ffffffffffffffff1642610e3d610e06856fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610e51919061372b565b610e5b9190613743565b90507f000000000000000000000000000000000000000000000000000000000000000060011c677fffffffffffffff1667ffffffffffffffff82161115610ece576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526003602052604090205490915060ff1615610f4c576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600460008c8152602001908152602001600020600180805490506111e19190613743565b8154600181018355600092835260208320015560405133918c918e917f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be91a45050505050505050505050565b600554610100900460ff161561126f576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013511611326576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560048201526024015b60405180910390fd5b606636111561133d5763c407e0256000526004601cfd5b6040805160e08101825263ffffffff808252600060208301818152329484019485526fffffffffffffffffffffffffffffffff348116606086019081527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033560808701908152600160a088018181524280861660c08b0190815283548085018555938952995160059384027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf681018054995192909b167fffffffffffffffff0000000000000000000000000000000000000000000000009099169890981764010000000073ffffffffffffffffffffffffffffffffffffffff928316021790995599517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7870180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919099161790975591517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8850180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016918516919091179055517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf9840155935194519481167001000000000000000000000000000000009590911694909402939093177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa9093019290925581547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff90931692909217905580546101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b61099082826001610a57565b600181815481106115dd57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115611690576116906133b5565b146116c7576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600187815481106116dc576116dc6136cd565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b905061173b7f0000000000000000000000000000000000000000000000000000000000000000600161372b565b6117d7826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1614611818576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156119075761186b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613743565b6001901b61188a846fffffffffffffffffffffffffffffffff16612811565b67ffffffffffffffff1661189e9190613789565b156118db576118d26118c360016fffffffffffffffffffffffffffffffff871661379d565b865463ffffffff1660006128b7565b600301546118fd565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050611931565b6003850154915061192e6118c36fffffffffffffffffffffffffffffffff861660016137ce565b90505b600882901b60088a8a604051611948929190613802565b6040518091039020901b14611989576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119948c61299b565b905060006119a3836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced3290611a1d908f908f908f908f908a9060040161385b565b6020604051808303816000875af1158015611a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a609190613895565b600485015491149150600090600290611b0b906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611ba7896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611bb191906138ae565b611bbb91906138cf565b67ffffffffffffffff161590508115158103611c03576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615611c5a576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff166002811115611cc557611cc56133b5565b14611cfc576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600080611d0b866129ca565b93509350935093506000611d2185858585612df7565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db491906138f6565b905060018903611eac5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84611e10367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015611e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea69190613895565b506120e8565b60028903611ed85773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489611e10565b60038903611f045773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487611e10565b6004890361203d576000611f4a6fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000000612eb6565b611f74907f000000000000000000000000000000000000000000000000000000000000000061372b565b611f7f90600161372b565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015612012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120369190613895565b50506120e8565b600589036120b6576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390524660c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a401611e63565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003356060612149610994565b9050909192565b60008054700100000000000000000000000000000000900460ff16600281111561217c5761217c6133b5565b146121b3576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182815481106121c8576121c86136cd565b60009182526020822060059190910201600481015490925061220a90700100000000000000000000000000000000900460401c67ffffffffffffffff16610e06565b600483015490915060009061223c90700100000000000000000000000000000000900467ffffffffffffffff16610e06565b61224690426138ae565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c166122808284613913565b67ffffffffffffffff16116122c1576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526004602052604090208054851580156122e1575060055460ff165b15612318576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015801561232557508515155b1561238a578454640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156123585781612374565b600187015473ffffffffffffffffffffffffffffffffffffffff165b90506123808188612f6b565b5050505050505050565b60006fffffffffffffffffffffffffffffffff815b838110156124d05760008582815481106123bb576123bb6136cd565b6000918252602080832090910154808352600490915260409091205490915015612411576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018281548110612426576124266136cd565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff1615801561247f575060048101546fffffffffffffffffffffffffffffffff908116908516115b156124bd576001810154600482015473ffffffffffffffffffffffffffffffffffffffff90911695506fffffffffffffffffffffffffffffffff1693505b5050806124c990613936565b905061239f565b5061251873ffffffffffffffffffffffffffffffffffffffff8316156124f65782612512565b600188015473ffffffffffffffffffffffffffffffffffffffff165b88612f6b565b86547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff84160217875560008881526004602052604081206125749161337b565b8760000361238057600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050505050505050565b606060006125e884367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900361372b565b90508267ffffffffffffffff1667ffffffffffffffff81111561260d5761260d61396e565b6040519080825280601f01601f191660200182016040528015612637576020820181803683370190505b509150828160208401375092915050565b151760011b90565b600061266f6fffffffffffffffffffffffffffffffff841660016137ce565b9050600061267f828660016128b7565b9050600086901a838061277257506126b860027f0000000000000000000000000000000000000000000000000000000000000000613789565b600483015460029061275c906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61276691906138cf565b67ffffffffffffffff16145b156127ca5760ff81166001148061278c575060ff81166002145b6127c5576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161131d565b612808565b60ff811615612808576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161131d565b50505050505050565b60008061289e837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b60008082612900576128fb6fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000000613058565b61291b565b61291b856fffffffffffffffffffffffffffffffff1661321f565b905060018481548110612930576129306136cd565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461299357815460018054909163ffffffff1690811061297e5761297e6136cd565b90600052602060002090600502019150612941565b509392505050565b60008060008060006129ac866129ca565b93509350935093506129c084848484612df7565b9695505050505050565b60008060008060008590506000600182815481106129ea576129ea6136cd565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000090612ac1906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611612b02576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090612bc9906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169250821115612c4557825463ffffffff16612c0f7f0000000000000000000000000000000000000000000000000000000000000000600161372b565b8303612c19578391505b60018181548110612c2c57612c2c6136cd565b9060005260206000209060050201935080945050612b06565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff16612cae612c99856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff161490508015612d93576000612ce6836fffffffffffffffffffffffffffffffff16612811565b67ffffffffffffffff161115612d49576000612d20612d1860016fffffffffffffffffffffffffffffffff861661379d565b8960016128b7565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a50612d6d9050565b7f00000000000000000000000000000000000000000000000000000000000000009a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750612de9565b6000612db5612d186fffffffffffffffffffffffffffffffff851660016137ce565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff84168103612e5d578282604051602001612e409291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b604051602081830303815290604052805190602001209050612eae565b60408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a0016040516020818303038152906040528051906020012090505b949350505050565b600080612f43847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690508083036001841b600180831b0386831b17039250505092915050565b60028101546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff000000000000000000000000000000018101612fdb576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280830180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff17905573ffffffffffffffffffffffffffffffffffffffff8416600090815260209190915260408120805483929061304e90849061372b565b9091555050505050565b6000816130f7846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611613138576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131418361321f565b9050816131e0826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611613219576132166131fd83600161372b565b6fffffffffffffffffffffffffffffffff8316906132cb565b90505b92915050565b600081196001830116816132b3827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b600080613358847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050808303600180821b0385821b179250505092915050565b5080546000825590600052602060002090810190613399919061339c565b50565b5b808211156133b1576000815560010161339d565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061341f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561343857600080fd5b50508035926020909101359150565b6000815180845260005b8181101561346d57602081850181015186830182015201613451565b8181111561347f576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006132166020830184613447565b73ffffffffffffffffffffffffffffffffffffffff8116811461339957600080fd5b6000602082840312156134f957600080fd5b8135613504816134c5565b9392505050565b8035801515811461351b57600080fd5b919050565b60008060006060848603121561353557600080fd5b833592506020840135915061354c6040850161350b565b90509250925092565b60006020828403121561356757600080fd5b81356fffffffffffffffffffffffffffffffff8116811461350457600080fd5b60006020828403121561359957600080fd5b5035919050565b60008083601f8401126135b257600080fd5b50813567ffffffffffffffff8111156135ca57600080fd5b6020830191508360208285010111156135e257600080fd5b9250929050565b6000806000806000806080878903121561360257600080fd5b863595506136126020880161350b565b9450604087013567ffffffffffffffff8082111561362f57600080fd5b61363b8a838b016135a0565b9096509450606089013591508082111561365457600080fd5b5061366189828a016135a0565b979a9699509497509295939492505050565b60008060006060848603121561368857600080fd5b505081359360208301359350604090920135919050565b63ffffffff841681528260208201526060604082015260006136c46060830184613447565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561373e5761373e6136fc565b500190565b600082821015613755576137556136fc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826137985761379861375a565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156137c6576137c66136fc565b039392505050565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156137f9576137f96136fc565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60608152600061386f606083018789613812565b8281036020840152613882818688613812565b9150508260408301529695505050505050565b6000602082840312156138a757600080fd5b5051919050565b600067ffffffffffffffff838116908316818110156137c6576137c66136fc565b600067ffffffffffffffff808416806138ea576138ea61375a565b92169190910692915050565b60006020828403121561390857600080fd5b8151613504816134c5565b600067ffffffffffffffff8083168185168083038211156137f9576137f96136fc565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613967576139676136fc565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea164736f6c634300080f000a",
ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_gameType\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"_absolutePrestate\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_genesisBlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_genesisOutputRoot\",\"type\":\"bytes32\",\"internalType\":\"Hash\"},{\"name\":\"_maxGameDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_splitDepth\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_gameDuration\",\"type\":\"uint64\",\"internalType\":\"Duration\"},{\"name\":\"_vm\",\"type\":\"address\",\"internalType\":\"contractIBigStepper\"},{\"name\":\"_weth\",\"type\":\"address\",\"internalType\":\"contractIDelayedWETH\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"absolutePrestate\",\"inputs\":[],\"outputs\":[{\"name\":\"absolutePrestate_\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addLocalData\",\"inputs\":[{\"name\":\"_ident\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_execLeafIdx\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_partOffset\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"attack\",\"inputs\":[{\"name\":\"_parentIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"claimCredit\",\"inputs\":[{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimData\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"parentIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"counteredBy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimant\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"bond\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"position\",\"type\":\"uint128\",\"internalType\":\"Position\"},{\"name\":\"clock\",\"type\":\"uint128\",\"internalType\":\"Clock\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDataLen\",\"inputs\":[],\"outputs\":[{\"name\":\"len_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimedBondFlag\",\"inputs\":[],\"outputs\":[{\"name\":\"claimedBondFlag_\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"createdAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"credit\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defend\",\"inputs\":[{\"name\":\"_parentIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"extraData\",\"inputs\":[],\"outputs\":[{\"name\":\"extraData_\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"gameData\",\"inputs\":[],\"outputs\":[{\"name\":\"gameType_\",\"type\":\"uint32\",\"internalType\":\"GameType\"},{\"name\":\"rootClaim_\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"extraData_\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameDuration\",\"inputs\":[],\"outputs\":[{\"name\":\"gameDuration_\",\"type\":\"uint64\",\"internalType\":\"Duration\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"gameType\",\"inputs\":[],\"outputs\":[{\"name\":\"gameType_\",\"type\":\"uint32\",\"internalType\":\"GameType\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"genesisBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"genesisBlockNumber_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"genesisOutputRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"genesisOutputRoot_\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRequiredBond\",\"inputs\":[{\"name\":\"_position\",\"type\":\"uint128\",\"internalType\":\"Position\"}],\"outputs\":[{\"name\":\"requiredBond_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"l1Head\",\"inputs\":[],\"outputs\":[{\"name\":\"l1Head_\",\"type\":\"bytes32\",\"internalType\":\"Hash\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"l2BlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"l2BlockNumber_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"maxGameDepth\",\"inputs\":[],\"outputs\":[{\"name\":\"maxGameDepth_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"move\",\"inputs\":[{\"name\":\"_challengeIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_claim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"},{\"name\":\"_isAttack\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resolve\",\"inputs\":[],\"outputs\":[{\"name\":\"status_\",\"type\":\"uint8\",\"internalType\":\"enumGameStatus\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resolveClaim\",\"inputs\":[{\"name\":\"_claimIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resolvedAt\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"Timestamp\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rootClaim\",\"inputs\":[],\"outputs\":[{\"name\":\"rootClaim_\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"splitDepth\",\"inputs\":[],\"outputs\":[{\"name\":\"splitDepth_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"status\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumGameStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"step\",\"inputs\":[{\"name\":\"_claimIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_isAttack\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"_stateData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"_proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"vm\",\"inputs\":[],\"outputs\":[{\"name\":\"vm_\",\"type\":\"address\",\"internalType\":\"contractIBigStepper\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weth\",\"inputs\":[],\"outputs\":[{\"name\":\"weth_\",\"type\":\"address\",\"internalType\":\"contractIDelayedWETH\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Move\",\"inputs\":[{\"name\":\"parentIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"claim\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"Claim\"},{\"name\":\"claimant\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Resolved\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumGameStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BondTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotDefendRootClaim\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClaimAboveSplit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClaimAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClaimAlreadyResolved\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClockNotExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClockTimeExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DuplicateStep\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GameDepthExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GameNotInProgress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientBond\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidLocalIdent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidParent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPrestate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSplitDepth\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoCreditToClaim\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfOrderResolution\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRootClaim\",\"inputs\":[{\"name\":\"rootClaim\",\"type\":\"bytes32\",\"internalType\":\"Claim\"}]},{\"type\":\"error\",\"name\":\"ValidStep\",\"inputs\":[]}]",
Bin: "0x6101a06040523480156200001257600080fd5b5060405162003f3238038062003f328339810160408190526200003591620000cd565b848410620000565760405163e62ccf3960e01b815260040160405180910390fd5b63ffffffff90981661016052608096909652610120949094526101409290925260a05260c0526001600160401b031660e0526001600160a01b0390811661010052166101805262000176565b6001600160a01b0381168114620000b857600080fd5b50565b8051620000c881620000a2565b919050565b60008060008060008060008060006101208a8c031215620000ed57600080fd5b895163ffffffff811681146200010257600080fd5b8099505060208a0151975060408a0151965060608a0151955060808a0151945060a08a0151935060c08a015160018060401b03811681146200014357600080fd5b60e08b01519093506200015681620000a2565b9150620001676101008b01620000bb565b90509295985092959850929598565b60805160a05160c05160e0516101005161012051610140516101605161018051613c9c620002966000396000818161032601528181610a870152818161135f0152818161175101526132f201526000818161050201526123480152600081816104370152612f9e0152600081816101e70152818161143d01526121a30152600081816102d201528181611c1e0152611f7a0152600081816106aa01528181610f8a01526124a60152600081816106dd01528181610d7801528181610e4101528181611a7901528181612179015281816128e701528181612b2a01528181612c5801528181612d600152612e3c01526000818161077f01528181610de4015281816119680152611a9a0152600081816104c70152611b300152613c9c6000f3fe6080604052600436106101cf5760003560e01c80638d450a95116100f6578063d8cc1a3c1161008f578063f8f43ff611610061578063f8f43ff61461072c578063fa24f7431461074c578063fa315aa914610770578063fdffbb28146107a357005b8063d8cc1a3c1461067b578063e1f0c3761461069b578063ec5e6308146106ce578063f3f7214e1461070157005b8063c55cd0c7116100c8578063c55cd0c714610590578063c6f0308c146105a3578063cf09e0d01461062d578063d5d44d801461064e57005b80638d450a95146104b8578063bbdc02db146104eb578063bcef3b551461052c578063c395e1ca1461056957005b8063609d33341161016857806368800abf1161013a57806368800abf146104285780638129fc1c1461045b5780638980e0cc146104635780638b85902b1461047857005b8063609d3334146103a057806360e27464146103b5578063632247ea146103d55780636361506d146103e857005b806335fef567116101a157806335fef567146102b05780633a768463146102c35780633fc8cef31461031757806354fd4d501461034a57005b80630356fe3a146101d857806319effeb41461021a578063200d2ed2146102605780632810e1d61461029b57005b366101d657005b005b3480156101e457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040519081526020015b60405180910390f35b34801561022657600080fd5b506000546102479068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610211565b34801561026c57600080fd5b5060005461028e90700100000000000000000000000000000000900460ff1681565b60405161021191906136d6565b3480156102a757600080fd5b5061028e6107b6565b6101d66102be366004613717565b6109b3565b3480156102cf57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610211565b34801561032357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102f2565b34801561035657600080fd5b506103936040518060400160405280600581526020017f302e372e3000000000000000000000000000000000000000000000000000000081525081565b60405161021191906137a4565b3480156103ac57600080fd5b506103936109c3565b3480156103c157600080fd5b506101d66103d03660046137d9565b6109d6565b6101d66103e3366004613812565b610b82565b3480156103f457600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360200135610207565b34801561043457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610207565b6101d66113f9565b34801561046f57600080fd5b50600154610207565b34801561048457600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360400135610207565b3480156104c457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610207565b3480156104f757600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610211565b34801561053857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900335610207565b34801561057557600080fd5b50610207610584366004613847565b50662386f26fc1000090565b6101d661059e366004613717565b611814565b3480156105af57600080fd5b506105c36105be366004613879565b611820565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610211565b34801561063957600080fd5b506000546102479067ffffffffffffffff1681565b34801561065a57600080fd5b506102076106693660046137d9565b60026020526000908152604090205481565b34801561068757600080fd5b506101d66106963660046138db565b6118b7565b3480156106a757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610247565b3480156106da57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610207565b34801561070d57600080fd5b506040516fffffffffffffffffffffffffffffffff8152602001610211565b34801561073857600080fd5b506101d6610747366004613965565b611eec565b34801561075857600080fd5b50610761612346565b60405161021193929190613991565b34801561077c57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610207565b6101d66107b1366004613879565b6123a3565b600080600054700100000000000000000000000000000000900460ff1660028111156107e4576107e46136a7565b1461081b576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff16610857576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600081548110610883576108836139bf565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff16146108be5760016108c1565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff90911617700100000000000000000000000000000000836002811115610972576109726136a7565b021790556002811115610987576109876136a7565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b6109bf82826000610b82565b5050565b60606109d160406020612804565b905090565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040812080549082905590819003610a3b576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063f3fef3a390604401600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610b3d576040519150601f19603f3d011682016040523d82523d6000602084013e610b42565b606091505b5050905080610b7d576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008054700100000000000000000000000000000000900460ff166002811115610bae57610bae6136a7565b14610be5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018481548110610bfa57610bfa6139bf565b600091825260208083206040805160e0810182526005909402909101805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff6401000000009092048216948601949094526001820154169184019190915260028101546fffffffffffffffffffffffffffffffff90811660608501526003820154608085015260049091015480821660a0850181905270010000000000000000000000000000000090910490911660c0840152919350909190610cbf908390869061289b16565b90506000610d5f826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050861580610da15750610d9e7f00000000000000000000000000000000000000000000000000000000000000006002613a1d565b81145b8015610dab575084155b15610de2576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610e3c576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e677f00000000000000000000000000000000000000000000000000000000000000006001613a1d565b8103610e7957610e79868885886128a3565b34662386f26fc100001115610eba576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835160009063ffffffff90811614610f1a576001856000015163ffffffff1681548110610ee957610ee96139bf565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b60c0850151600090610f3e9067ffffffffffffffff165b67ffffffffffffffff1690565b67ffffffffffffffff1642610f68610f31856fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610f7c9190613a1d565b610f869190613a35565b90507f000000000000000000000000000000000000000000000000000000000000000060011c677fffffffffffffff1667ffffffffffffffff82161115610ff9576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526003602052604090205490915060ff1615611077576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600460008c81526020019081526020016000206001808054905061130c9190613a35565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263d0e30db09234926004808301939282900301818588803b1580156113a457600080fd5b505af11580156113b8573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b600554610100900460ff161561143b576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360400135116114f2576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560048201526024015b60405180910390fd5b60663611156115095763c407e0256000526004601cfd5b6040805160e08101825263ffffffff808252600060208301818152328486019081526fffffffffffffffffffffffffffffffff34818116606088019081527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033560808901908152600160a08a0181815242861660c08c0190815282548084018455928a529a5160059092027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf681018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915594517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf787018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905590517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8860180549185167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909216919091179055517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf9850155915195518116700100000000000000000000000000000000029516949094177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa9091015583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f00000000000000000000000000000000000000000000000000000000000000009092169363d0e30db093926004828101939282900301818588803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b50506000805467ffffffffffffffff42167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009091161790555050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905550565b6109bf82826001610b82565b6001818154811061183057600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff1660028111156118e3576118e36136a7565b1461191a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001878154811061192f5761192f6139bf565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b905061198e7f00000000000000000000000000000000000000000000000000000000000000006001613a1d565b611a2a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1614611a6b576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808915611b5a57611abe7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613a35565b6001901b611add846fffffffffffffffffffffffffffffffff16612a64565b67ffffffffffffffff16611af19190613a7b565b15611b2e57611b25611b1660016fffffffffffffffffffffffffffffffff8716613a8f565b865463ffffffff166000612b0a565b60030154611b50565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050611b84565b60038501549150611b81611b166fffffffffffffffffffffffffffffffff86166001613ac0565b90505b600882901b60088a8a604051611b9b929190613af4565b6040518091039020901b14611bdc576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611be78c612bee565b90506000611bf6836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced3290611c70908f908f908f908f908a90600401613b4d565b6020604051808303816000875af1158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613b87565b600485015491149150600090600290611d5e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611dfa896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611e049190613ba0565b611e0e9190613bc1565b67ffffffffffffffff161590508115158103611e56576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615611ead576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff166002811115611f1857611f186136a7565b14611f4f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600080611f5e86612c1d565b93509350935093506000611f748585858561304a565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fe3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120079190613be8565b9050600189036120ff5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84612063367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156120d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f99190613b87565b5061233b565b6002890361212b5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489612063565b600389036121575773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487612063565b6004890361229057600061219d6fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000000613109565b6121c7907f0000000000000000000000000000000000000000000000000000000000000000613a1d565b6121d2906001613a1d565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015612265573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122899190613b87565b505061233b565b60058903612309576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390524660c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016120b6565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900335606061239c6109c3565b9050909192565b60008054700100000000000000000000000000000000900460ff1660028111156123cf576123cf6136a7565b14612406576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001828154811061241b5761241b6139bf565b60009182526020822060059190910201600481015490925061245d90700100000000000000000000000000000000900460401c67ffffffffffffffff16610f31565b600483015490915060009061248f90700100000000000000000000000000000000900467ffffffffffffffff16610f31565b6124999042613ba0565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c166124d38284613c05565b67ffffffffffffffff1611612514576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600460205260409020805485158015612534575060055460ff165b1561256b576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015801561257857508515155b156125dd578454640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156125ab57816125c7565b600187015473ffffffffffffffffffffffffffffffffffffffff165b90506125d381886131be565b5050505050505050565b60006fffffffffffffffffffffffffffffffff815b8381101561272357600085828154811061260e5761260e6139bf565b6000918252602080832090910154808352600490915260409091205490915015612664576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018281548110612679576126796139bf565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156126d2575060048101546fffffffffffffffffffffffffffffffff908116908516115b15612710576001810154600482015473ffffffffffffffffffffffffffffffffffffffff90911695506fffffffffffffffffffffffffffffffff1693505b50508061271c90613c28565b90506125f2565b5061276b73ffffffffffffffffffffffffffffffffffffffff8316156127495782612765565b600188015473ffffffffffffffffffffffffffffffffffffffff165b886131be565b86547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff84160217875560008881526004602052604081206127c79161366d565b876000036125d357600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050505050505050565b6060600061283b84367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003613a1d565b90508267ffffffffffffffff1667ffffffffffffffff81111561286057612860613c60565b6040519080825280601f01601f19166020018201604052801561288a576020820181803683370190505b509150828160208401375092915050565b151760011b90565b60006128c26fffffffffffffffffffffffffffffffff84166001613ac0565b905060006128d282866001612b0a565b9050600086901a83806129c5575061290b60027f0000000000000000000000000000000000000000000000000000000000000000613a7b565b60048301546002906129af906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6129b99190613bc1565b67ffffffffffffffff16145b15612a1d5760ff8116600114806129df575060ff81166002145b612a18576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016114e9565b612a5b565b60ff811615612a5b576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016114e9565b50505050505050565b600080612af1837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b60008082612b5357612b4e6fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000061334a565b612b6e565b612b6e856fffffffffffffffffffffffffffffffff16613511565b905060018481548110612b8357612b836139bf565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff828116911614612be657815460018054909163ffffffff16908110612bd157612bd16139bf565b90600052602060002090600502019150612b94565b509392505050565b6000806000806000612bff86612c1d565b9350935093509350612c138484848461304a565b9695505050505050565b6000806000806000859050600060018281548110612c3d57612c3d6139bf565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000090612d14906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611612d55576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090612e1c906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169250821115612e9857825463ffffffff16612e627f00000000000000000000000000000000000000000000000000000000000000006001613a1d565b8303612e6c578391505b60018181548110612e7f57612e7f6139bf565b9060005260206000209060050201935080945050612d59565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff16612f01612eec856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff161490508015612fe6576000612f39836fffffffffffffffffffffffffffffffff16612a64565b67ffffffffffffffff161115612f9c576000612f73612f6b60016fffffffffffffffffffffffffffffffff8616613a8f565b896001612b0a565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a50612fc09050565b7f00000000000000000000000000000000000000000000000000000000000000009a505b600386015460048701549099506fffffffffffffffffffffffffffffffff16975061303c565b6000613008612f6b6fffffffffffffffffffffffffffffffff85166001613ac0565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff841681036130b05782826040516020016130939291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b604051602081830303815290604052805190602001209050613101565b60408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a0016040516020818303038152906040528051906020012090505b949350505050565b600080613196847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690508083036001841b600180831b0386831b17039250505092915050565b60028101546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff00000000000000000000000000000001810161322e576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280830180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff17905573ffffffffffffffffffffffffffffffffffffffff841660009081526020919091526040812080548392906132a1908490613a1d565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690637eee288d90604401600060405180830381600087803b15801561333657600080fd5b505af1158015612a5b573d6000803e3d6000fd5b6000816133e9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff161161342a576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343383613511565b9050816134d2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff161161350b576135086134ef836001613a1d565b6fffffffffffffffffffffffffffffffff8316906135bd565b90505b92915050565b600081196001830116816135a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b60008061364a847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050808303600180821b0385821b179250505092915050565b508054600082559060005260206000209081019061368b919061368e565b50565b5b808211156136a3576000815560010161368f565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613711577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561372a57600080fd5b50508035926020909101359150565b6000815180845260005b8181101561375f57602081850181015186830182015201613743565b81811115613771576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006135086020830184613739565b73ffffffffffffffffffffffffffffffffffffffff8116811461368b57600080fd5b6000602082840312156137eb57600080fd5b81356137f6816137b7565b9392505050565b8035801515811461380d57600080fd5b919050565b60008060006060848603121561382757600080fd5b833592506020840135915061383e604085016137fd565b90509250925092565b60006020828403121561385957600080fd5b81356fffffffffffffffffffffffffffffffff811681146137f657600080fd5b60006020828403121561388b57600080fd5b5035919050565b60008083601f8401126138a457600080fd5b50813567ffffffffffffffff8111156138bc57600080fd5b6020830191508360208285010111156138d457600080fd5b9250929050565b600080600080600080608087890312156138f457600080fd5b86359550613904602088016137fd565b9450604087013567ffffffffffffffff8082111561392157600080fd5b61392d8a838b01613892565b9096509450606089013591508082111561394657600080fd5b5061395389828a01613892565b979a9699509497509295939492505050565b60008060006060848603121561397a57600080fd5b505081359360208301359350604090920135919050565b63ffffffff841681528260208201526060604082015260006139b66060830184613739565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115613a3057613a306139ee565b500190565b600082821015613a4757613a476139ee565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613a8a57613a8a613a4c565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015613ab857613ab86139ee565b039392505050565b60006fffffffffffffffffffffffffffffffff808316818516808303821115613aeb57613aeb6139ee565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000613b61606083018789613b04565b8281036020840152613b74818688613b04565b9150508260408301529695505050505050565b600060208284031215613b9957600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015613ab857613ab86139ee565b600067ffffffffffffffff80841680613bdc57613bdc613a4c565b92169190910692915050565b600060208284031215613bfa57600080fd5b81516137f6816137b7565b600067ffffffffffffffff808316818516808303821115613aeb57613aeb6139ee565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c5957613c596139ee565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea164736f6c634300080f000a",
}
// FaultDisputeGameABI is the input ABI used to generate the binding from.
......@@ -43,7 +43,7 @@ var FaultDisputeGameABI = FaultDisputeGameMetaData.ABI
var FaultDisputeGameBin = FaultDisputeGameMetaData.Bin
// DeployFaultDisputeGame deploys a new Ethereum contract, binding an instance of FaultDisputeGame to it.
func DeployFaultDisputeGame(auth *bind.TransactOpts, backend bind.ContractBackend, _gameType uint32, _absolutePrestate [32]byte, _genesisBlockNumber *big.Int, _genesisOutputRoot [32]byte, _maxGameDepth *big.Int, _splitDepth *big.Int, _gameDuration uint64, _vm common.Address) (common.Address, *types.Transaction, *FaultDisputeGame, error) {
func DeployFaultDisputeGame(auth *bind.TransactOpts, backend bind.ContractBackend, _gameType uint32, _absolutePrestate [32]byte, _genesisBlockNumber *big.Int, _genesisOutputRoot [32]byte, _maxGameDepth *big.Int, _splitDepth *big.Int, _gameDuration uint64, _vm common.Address, _weth common.Address) (common.Address, *types.Transaction, *FaultDisputeGame, error) {
parsed, err := FaultDisputeGameMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
......@@ -52,7 +52,7 @@ func DeployFaultDisputeGame(auth *bind.TransactOpts, backend bind.ContractBacken
return common.Address{}, nil, nil, errors.New("GetABI returned nil")
}
address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(FaultDisputeGameBin), backend, _gameType, _absolutePrestate, _genesisBlockNumber, _genesisOutputRoot, _maxGameDepth, _splitDepth, _gameDuration, _vm)
address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(FaultDisputeGameBin), backend, _gameType, _absolutePrestate, _genesisBlockNumber, _genesisOutputRoot, _maxGameDepth, _splitDepth, _gameDuration, _vm, _weth)
if err != nil {
return common.Address{}, nil, nil, err
}
......@@ -941,6 +941,37 @@ func (_FaultDisputeGame *FaultDisputeGameCallerSession) Vm() (common.Address, er
return _FaultDisputeGame.Contract.Vm(&_FaultDisputeGame.CallOpts)
}
// Weth is a free data retrieval call binding the contract method 0x3fc8cef3.
//
// Solidity: function weth() view returns(address weth_)
func (_FaultDisputeGame *FaultDisputeGameCaller) Weth(opts *bind.CallOpts) (common.Address, error) {
var out []interface{}
err := _FaultDisputeGame.contract.Call(opts, &out, "weth")
if err != nil {
return *new(common.Address), err
}
out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
return out0, err
}
// Weth is a free data retrieval call binding the contract method 0x3fc8cef3.
//
// Solidity: function weth() view returns(address weth_)
func (_FaultDisputeGame *FaultDisputeGameSession) Weth() (common.Address, error) {
return _FaultDisputeGame.Contract.Weth(&_FaultDisputeGame.CallOpts)
}
// Weth is a free data retrieval call binding the contract method 0x3fc8cef3.
//
// Solidity: function weth() view returns(address weth_)
func (_FaultDisputeGame *FaultDisputeGameCallerSession) Weth() (common.Address, error) {
return _FaultDisputeGame.Contract.Weth(&_FaultDisputeGame.CallOpts)
}
// AddLocalData is a paid mutator transaction binding the contract method 0xf8f43ff6.
//
// Solidity: function addLocalData(uint256 _ident, uint256 _execLeafIdx, uint256 _partOffset) returns()
......@@ -1130,6 +1161,48 @@ func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Step(_claimIndex *bi
return _FaultDisputeGame.Contract.Step(&_FaultDisputeGame.TransactOpts, _claimIndex, _isAttack, _stateData, _proof)
}
// Fallback is a paid mutator transaction binding the contract fallback function.
//
// Solidity: fallback() payable returns()
func (_FaultDisputeGame *FaultDisputeGameTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) {
return _FaultDisputeGame.contract.RawTransact(opts, calldata)
}
// Fallback is a paid mutator transaction binding the contract fallback function.
//
// Solidity: fallback() payable returns()
func (_FaultDisputeGame *FaultDisputeGameSession) Fallback(calldata []byte) (*types.Transaction, error) {
return _FaultDisputeGame.Contract.Fallback(&_FaultDisputeGame.TransactOpts, calldata)
}
// Fallback is a paid mutator transaction binding the contract fallback function.
//
// Solidity: fallback() payable returns()
func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) {
return _FaultDisputeGame.Contract.Fallback(&_FaultDisputeGame.TransactOpts, calldata)
}
// Receive is a paid mutator transaction binding the contract receive function.
//
// Solidity: receive() payable returns()
func (_FaultDisputeGame *FaultDisputeGameTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {
return _FaultDisputeGame.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
}
// Receive is a paid mutator transaction binding the contract receive function.
//
// Solidity: receive() payable returns()
func (_FaultDisputeGame *FaultDisputeGameSession) Receive() (*types.Transaction, error) {
return _FaultDisputeGame.Contract.Receive(&_FaultDisputeGame.TransactOpts)
}
// Receive is a paid mutator transaction binding the contract receive function.
//
// Solidity: receive() payable returns()
func (_FaultDisputeGame *FaultDisputeGameTransactorSession) Receive() (*types.Transaction, error) {
return _FaultDisputeGame.Contract.Receive(&_FaultDisputeGame.TransactOpts)
}
// FaultDisputeGameMoveIterator is returned from FilterMove and is used to iterate over the raw logs and unpacked data for Move events raised by the FaultDisputeGame contract.
type FaultDisputeGameMoveIterator struct {
Event *FaultDisputeGameMove // Event containing the contract specifics and raw log
......
......@@ -13,7 +13,7 @@ const FaultDisputeGameStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contr
var FaultDisputeGameStorageLayout = new(solc.StorageLayout)
var FaultDisputeGameDeployedBin = "0x6080604052600436106101d85760003560e01c80638d450a9511610102578063d8cc1a3c11610095578063f8f43ff611610064578063f8f43ff6146106fd578063fa24f7431461071d578063fa315aa914610741578063fdffbb281461077457600080fd5b8063d8cc1a3c1461064c578063e1f0c3761461066c578063ec5e63081461069f578063f3f7214e146106d257600080fd5b8063c55cd0c7116100d1578063c55cd0c714610561578063c6f0308c14610574578063cf09e0d0146105fe578063d5d44d801461061f57600080fd5b80638d450a9514610489578063bbdc02db146104bc578063bcef3b55146104fd578063c395e1ca1461053a57600080fd5b8063609d33341161017a57806368800abf1161014957806368800abf146103f95780638129fc1c1461042c5780638980e0cc146104345780638b85902b1461044957600080fd5b8063609d33341461037157806360e2746414610386578063632247ea146103a65780636361506d146103b957600080fd5b80632810e1d6116101b65780632810e1d6146102a057806335fef567146102b55780633a768463146102ca57806354fd4d501461031b57600080fd5b80630356fe3a146101dd57806319effeb41461021f578063200d2ed214610265575b600080fd5b3480156101e957600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040519081526020015b60405180910390f35b34801561022b57600080fd5b5060005461024c9068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610216565b34801561027157600080fd5b5060005461029390700100000000000000000000000000000000900460ff1681565b60405161021691906133e4565b3480156102ac57600080fd5b50610293610787565b6102c86102c3366004613425565b610984565b005b3480156102d657600080fd5b5060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610216565b34801561032757600080fd5b506103646040518060400160405280600581526020017f302e372e3000000000000000000000000000000000000000000000000000000081525081565b60405161021691906134b2565b34801561037d57600080fd5b50610364610994565b34801561039257600080fd5b506102c86103a13660046134e7565b6109a7565b6102c86103b4366004613520565b610a57565b3480156103c557600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013561020c565b34801561040557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b6102c861122d565b34801561044057600080fd5b5060015461020c565b34801561045557600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013561020c565b34801561049557600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b3480156104c857600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610216565b34801561050957600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033561020c565b34801561054657600080fd5b5061020c610555366004613555565b50662386f26fc1000090565b6102c861056f366004613425565b6115c1565b34801561058057600080fd5b5061059461058f366004613587565b6115cd565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610216565b34801561060a57600080fd5b5060005461024c9067ffffffffffffffff1681565b34801561062b57600080fd5b5061020c61063a3660046134e7565b60026020526000908152604090205481565b34801561065857600080fd5b506102c86106673660046135e9565b611664565b34801561067857600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061024c565b3480156106ab57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b3480156106de57600080fd5b506040516fffffffffffffffffffffffffffffffff8152602001610216565b34801561070957600080fd5b506102c8610718366004613673565b611c99565b34801561072957600080fd5b506107326120f3565b6040516102169392919061369f565b34801561074d57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061020c565b6102c8610782366004613587565b612150565b600080600054700100000000000000000000000000000000900460ff1660028111156107b5576107b56133b5565b146107ec576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff16610828576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600081548110610854576108546136cd565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff161461088f576001610892565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff90911617700100000000000000000000000000000000836002811115610943576109436133b5565b021790556002811115610958576109586133b5565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b61099082826000610a57565b5050565b60606109a2604060206125b1565b905090565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260026020526040808220805490839055905190929083908381818185875af1925050503d8060008114610a12576040519150601f19603f3d011682016040523d82523d6000602084013e610a17565b606091505b5050905080610a52576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008054700100000000000000000000000000000000900460ff166002811115610a8357610a836133b5565b14610aba576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018481548110610acf57610acf6136cd565b600091825260208083206040805160e0810182526005909402909101805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff6401000000009092048216948601949094526001820154169184019190915260028101546fffffffffffffffffffffffffffffffff90811660608501526003820154608085015260049091015480821660a0850181905270010000000000000000000000000000000090910490911660c0840152919350909190610b94908390869061264816565b90506000610c34826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050861580610c765750610c737f0000000000000000000000000000000000000000000000000000000000000000600261372b565b81145b8015610c80575084155b15610cb7576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610d11576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d3c7f0000000000000000000000000000000000000000000000000000000000000000600161372b565b8103610d4e57610d4e86888588612650565b34662386f26fc100001115610d8f576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835160009063ffffffff90811614610def576001856000015163ffffffff1681548110610dbe57610dbe6136cd565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b60c0850151600090610e139067ffffffffffffffff165b67ffffffffffffffff1690565b67ffffffffffffffff1642610e3d610e06856fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610e51919061372b565b610e5b9190613743565b90507f000000000000000000000000000000000000000000000000000000000000000060011c677fffffffffffffff1667ffffffffffffffff82161115610ece576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526003602052604090205490915060ff1615610f4c576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600460008c8152602001908152602001600020600180805490506111e19190613743565b8154600181018355600092835260208320015560405133918c918e917f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be91a45050505050505050505050565b600554610100900460ff161561126f576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036040013511611326576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560048201526024015b60405180910390fd5b606636111561133d5763c407e0256000526004601cfd5b6040805160e08101825263ffffffff808252600060208301818152329484019485526fffffffffffffffffffffffffffffffff348116606086019081527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033560808701908152600160a088018181524280861660c08b0190815283548085018555938952995160059384027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf681018054995192909b167fffffffffffffffff0000000000000000000000000000000000000000000000009099169890981764010000000073ffffffffffffffffffffffffffffffffffffffff928316021790995599517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7870180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919099161790975591517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8850180547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016918516919091179055517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf9840155935194519481167001000000000000000000000000000000009590911694909402939093177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa9093019290925581547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff90931692909217905580546101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b61099082826001610a57565b600181815481106115dd57600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff166002811115611690576116906133b5565b146116c7576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600187815481106116dc576116dc6136cd565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b905061173b7f0000000000000000000000000000000000000000000000000000000000000000600161372b565b6117d7826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1614611818576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008089156119075761186b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613743565b6001901b61188a846fffffffffffffffffffffffffffffffff16612811565b67ffffffffffffffff1661189e9190613789565b156118db576118d26118c360016fffffffffffffffffffffffffffffffff871661379d565b865463ffffffff1660006128b7565b600301546118fd565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050611931565b6003850154915061192e6118c36fffffffffffffffffffffffffffffffff861660016137ce565b90505b600882901b60088a8a604051611948929190613802565b6040518091039020901b14611989576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119948c61299b565b905060006119a3836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced3290611a1d908f908f908f908f908a9060040161385b565b6020604051808303816000875af1158015611a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a609190613895565b600485015491149150600090600290611b0b906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611ba7896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611bb191906138ae565b611bbb91906138cf565b67ffffffffffffffff161590508115158103611c03576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615611c5a576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff166002811115611cc557611cc56133b5565b14611cfc576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600080611d0b866129ca565b93509350935093506000611d2185858585612df7565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db491906138f6565b905060018903611eac5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84611e10367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af1158015611e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea69190613895565b506120e8565b60028903611ed85773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489611e10565b60038903611f045773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487611e10565b6004890361203d576000611f4a6fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000000612eb6565b611f74907f000000000000000000000000000000000000000000000000000000000000000061372b565b611f7f90600161372b565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015612012573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120369190613895565b50506120e8565b600589036120b6576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390524660c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a401611e63565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003356060612149610994565b9050909192565b60008054700100000000000000000000000000000000900460ff16600281111561217c5761217c6133b5565b146121b3576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600182815481106121c8576121c86136cd565b60009182526020822060059190910201600481015490925061220a90700100000000000000000000000000000000900460401c67ffffffffffffffff16610e06565b600483015490915060009061223c90700100000000000000000000000000000000900467ffffffffffffffff16610e06565b61224690426138ae565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c166122808284613913565b67ffffffffffffffff16116122c1576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526004602052604090208054851580156122e1575060055460ff165b15612318576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015801561232557508515155b1561238a578454640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156123585781612374565b600187015473ffffffffffffffffffffffffffffffffffffffff165b90506123808188612f6b565b5050505050505050565b60006fffffffffffffffffffffffffffffffff815b838110156124d05760008582815481106123bb576123bb6136cd565b6000918252602080832090910154808352600490915260409091205490915015612411576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018281548110612426576124266136cd565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff1615801561247f575060048101546fffffffffffffffffffffffffffffffff908116908516115b156124bd576001810154600482015473ffffffffffffffffffffffffffffffffffffffff90911695506fffffffffffffffffffffffffffffffff1693505b5050806124c990613936565b905061239f565b5061251873ffffffffffffffffffffffffffffffffffffffff8316156124f65782612512565b600188015473ffffffffffffffffffffffffffffffffffffffff165b88612f6b565b86547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff84160217875560008881526004602052604081206125749161337b565b8760000361238057600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050505050505050565b606060006125e884367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900361372b565b90508267ffffffffffffffff1667ffffffffffffffff81111561260d5761260d61396e565b6040519080825280601f01601f191660200182016040528015612637576020820181803683370190505b509150828160208401375092915050565b151760011b90565b600061266f6fffffffffffffffffffffffffffffffff841660016137ce565b9050600061267f828660016128b7565b9050600086901a838061277257506126b860027f0000000000000000000000000000000000000000000000000000000000000000613789565b600483015460029061275c906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b61276691906138cf565b67ffffffffffffffff16145b156127ca5760ff81166001148061278c575060ff81166002145b6127c5576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161131d565b612808565b60ff811615612808576040517ff40239db0000000000000000000000000000000000000000000000000000000081526004810188905260240161131d565b50505050505050565b60008061289e837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b60008082612900576128fb6fffffffffffffffffffffffffffffffff86167f0000000000000000000000000000000000000000000000000000000000000000613058565b61291b565b61291b856fffffffffffffffffffffffffffffffff1661321f565b905060018481548110612930576129306136cd565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff82811691161461299357815460018054909163ffffffff1690811061297e5761297e6136cd565b90600052602060002090600502019150612941565b509392505050565b60008060008060006129ac866129ca565b93509350935093506129c084848484612df7565b9695505050505050565b60008060008060008590506000600182815481106129ea576129ea6136cd565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000090612ac1906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611612b02576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090612bc9906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169250821115612c4557825463ffffffff16612c0f7f0000000000000000000000000000000000000000000000000000000000000000600161372b565b8303612c19578391505b60018181548110612c2c57612c2c6136cd565b9060005260206000209060050201935080945050612b06565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff16612cae612c99856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff161490508015612d93576000612ce6836fffffffffffffffffffffffffffffffff16612811565b67ffffffffffffffff161115612d49576000612d20612d1860016fffffffffffffffffffffffffffffffff861661379d565b8960016128b7565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a50612d6d9050565b7f00000000000000000000000000000000000000000000000000000000000000009a505b600386015460048701549099506fffffffffffffffffffffffffffffffff169750612de9565b6000612db5612d186fffffffffffffffffffffffffffffffff851660016137ce565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff84168103612e5d578282604051602001612e409291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b604051602081830303815290604052805190602001209050612eae565b60408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a0016040516020818303038152906040528051906020012090505b949350505050565b600080612f43847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690508083036001841b600180831b0386831b17039250505092915050565b60028101546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff000000000000000000000000000000018101612fdb576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280830180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff17905573ffffffffffffffffffffffffffffffffffffffff8416600090815260209190915260408120805483929061304e90849061372b565b9091555050505050565b6000816130f7846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611613138576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131418361321f565b9050816131e0826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611613219576132166131fd83600161372b565b6fffffffffffffffffffffffffffffffff8316906132cb565b90505b92915050565b600081196001830116816132b3827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b600080613358847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050808303600180821b0385821b179250505092915050565b5080546000825590600052602060002090810190613399919061339c565b50565b5b808211156133b1576000815560010161339d565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061341f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561343857600080fd5b50508035926020909101359150565b6000815180845260005b8181101561346d57602081850181015186830182015201613451565b8181111561347f576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006132166020830184613447565b73ffffffffffffffffffffffffffffffffffffffff8116811461339957600080fd5b6000602082840312156134f957600080fd5b8135613504816134c5565b9392505050565b8035801515811461351b57600080fd5b919050565b60008060006060848603121561353557600080fd5b833592506020840135915061354c6040850161350b565b90509250925092565b60006020828403121561356757600080fd5b81356fffffffffffffffffffffffffffffffff8116811461350457600080fd5b60006020828403121561359957600080fd5b5035919050565b60008083601f8401126135b257600080fd5b50813567ffffffffffffffff8111156135ca57600080fd5b6020830191508360208285010111156135e257600080fd5b9250929050565b6000806000806000806080878903121561360257600080fd5b863595506136126020880161350b565b9450604087013567ffffffffffffffff8082111561362f57600080fd5b61363b8a838b016135a0565b9096509450606089013591508082111561365457600080fd5b5061366189828a016135a0565b979a9699509497509295939492505050565b60008060006060848603121561368857600080fd5b505081359360208301359350604090920135919050565b63ffffffff841681528260208201526060604082015260006136c46060830184613447565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561373e5761373e6136fc565b500190565b600082821015613755576137556136fc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826137985761379861375a565b500690565b60006fffffffffffffffffffffffffffffffff838116908316818110156137c6576137c66136fc565b039392505050565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156137f9576137f96136fc565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60608152600061386f606083018789613812565b8281036020840152613882818688613812565b9150508260408301529695505050505050565b6000602082840312156138a757600080fd5b5051919050565b600067ffffffffffffffff838116908316818110156137c6576137c66136fc565b600067ffffffffffffffff808416806138ea576138ea61375a565b92169190910692915050565b60006020828403121561390857600080fd5b8151613504816134c5565b600067ffffffffffffffff8083168185168083038211156137f9576137f96136fc565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613967576139676136fc565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea164736f6c634300080f000a"
var FaultDisputeGameDeployedBin = "0x6080604052600436106101cf5760003560e01c80638d450a95116100f6578063d8cc1a3c1161008f578063f8f43ff611610061578063f8f43ff61461072c578063fa24f7431461074c578063fa315aa914610770578063fdffbb28146107a357005b8063d8cc1a3c1461067b578063e1f0c3761461069b578063ec5e6308146106ce578063f3f7214e1461070157005b8063c55cd0c7116100c8578063c55cd0c714610590578063c6f0308c146105a3578063cf09e0d01461062d578063d5d44d801461064e57005b80638d450a95146104b8578063bbdc02db146104eb578063bcef3b551461052c578063c395e1ca1461056957005b8063609d33341161016857806368800abf1161013a57806368800abf146104285780638129fc1c1461045b5780638980e0cc146104635780638b85902b1461047857005b8063609d3334146103a057806360e27464146103b5578063632247ea146103d55780636361506d146103e857005b806335fef567116101a157806335fef567146102b05780633a768463146102c35780633fc8cef31461031757806354fd4d501461034a57005b80630356fe3a146101d857806319effeb41461021a578063200d2ed2146102605780632810e1d61461029b57005b366101d657005b005b3480156101e457600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040519081526020015b60405180910390f35b34801561022657600080fd5b506000546102479068010000000000000000900467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610211565b34801561026c57600080fd5b5060005461028e90700100000000000000000000000000000000900460ff1681565b60405161021191906136d6565b3480156102a757600080fd5b5061028e6107b6565b6101d66102be366004613717565b6109b3565b3480156102cf57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610211565b34801561032357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102f2565b34801561035657600080fd5b506103936040518060400160405280600581526020017f302e372e3000000000000000000000000000000000000000000000000000000081525081565b60405161021191906137a4565b3480156103ac57600080fd5b506103936109c3565b3480156103c157600080fd5b506101d66103d03660046137d9565b6109d6565b6101d66103e3366004613812565b610b82565b3480156103f457600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360200135610207565b34801561043457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610207565b6101d66113f9565b34801561046f57600080fd5b50600154610207565b34801561048457600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360400135610207565b3480156104c457600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610207565b3480156104f757600080fd5b5060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610211565b34801561053857600080fd5b50367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900335610207565b34801561057557600080fd5b50610207610584366004613847565b50662386f26fc1000090565b6101d661059e366004613717565b611814565b3480156105af57600080fd5b506105c36105be366004613879565b611820565b6040805163ffffffff909816885273ffffffffffffffffffffffffffffffffffffffff968716602089015295909416948601949094526fffffffffffffffffffffffffffffffff9182166060860152608085015291821660a08401521660c082015260e001610211565b34801561063957600080fd5b506000546102479067ffffffffffffffff1681565b34801561065a57600080fd5b506102076106693660046137d9565b60026020526000908152604090205481565b34801561068757600080fd5b506101d66106963660046138db565b6118b7565b3480156106a757600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610247565b3480156106da57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610207565b34801561070d57600080fd5b506040516fffffffffffffffffffffffffffffffff8152602001610211565b34801561073857600080fd5b506101d6610747366004613965565b611eec565b34801561075857600080fd5b50610761612346565b60405161021193929190613991565b34801561077c57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610207565b6101d66107b1366004613879565b6123a3565b600080600054700100000000000000000000000000000000900460ff1660028111156107e4576107e46136a7565b1461081b576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460ff16610857576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600081548110610883576108836139bf565b6000918252602090912060059091020154640100000000900473ffffffffffffffffffffffffffffffffffffffff16146108be5760016108c1565b60025b6000805467ffffffffffffffff421668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff82168117835592935083927fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffff000000000000000000ffffffffffffffff90911617700100000000000000000000000000000000836002811115610972576109726136a7565b021790556002811115610987576109876136a7565b6040517f5e186f09b9c93491f14e277eea7faa5de6a2d4bda75a79af7a3684fbfb42da6090600090a290565b6109bf82826000610b82565b5050565b60606109d160406020612804565b905090565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040812080549082905590819003610a3b576040517f17bfe5f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517ff3fef3a300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063f3fef3a390604401600060405180830381600087803b158015610acb57600080fd5b505af1158015610adf573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610b3d576040519150601f19603f3d011682016040523d82523d6000602084013e610b42565b606091505b5050905080610b7d576040517f83e6cc6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60008054700100000000000000000000000000000000900460ff166002811115610bae57610bae6136a7565b14610be5576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018481548110610bfa57610bfa6139bf565b600091825260208083206040805160e0810182526005909402909101805463ffffffff808216865273ffffffffffffffffffffffffffffffffffffffff6401000000009092048216948601949094526001820154169184019190915260028101546fffffffffffffffffffffffffffffffff90811660608501526003820154608085015260049091015480821660a0850181905270010000000000000000000000000000000090910490911660c0840152919350909190610cbf908390869061289b16565b90506000610d5f826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050861580610da15750610d9e7f00000000000000000000000000000000000000000000000000000000000000006002613a1d565b81145b8015610dab575084155b15610de2576040517fa42637bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000811115610e3c576040517f56f57b2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e677f00000000000000000000000000000000000000000000000000000000000000006001613a1d565b8103610e7957610e79868885886128a3565b34662386f26fc100001115610eba576040517fe92c469f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835160009063ffffffff90811614610f1a576001856000015163ffffffff1681548110610ee957610ee96139bf565b906000526020600020906005020160040160109054906101000a90046fffffffffffffffffffffffffffffffff1690505b60c0850151600090610f3e9067ffffffffffffffff165b67ffffffffffffffff1690565b67ffffffffffffffff1642610f68610f31856fffffffffffffffffffffffffffffffff1660401c90565b67ffffffffffffffff16610f7c9190613a1d565b610f869190613a35565b90507f000000000000000000000000000000000000000000000000000000000000000060011c677fffffffffffffff1667ffffffffffffffff82161115610ff9576040517f3381d11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604082901b421760008a8152608087901b6fffffffffffffffffffffffffffffffff8d1617602052604081209192509060008181526003602052604090205490915060ff1615611077576040517f80497e3b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60016003600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060016040518060e001604052808d63ffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001346fffffffffffffffffffffffffffffffff1681526020018c8152602001886fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506080820151816003015560a08201518160040160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160040160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055505050600460008c81526020019081526020016000206001808054905061130c9190613a35565b81546001810183556000928352602083200155604080517fd0e30db0000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263d0e30db09234926004808301939282900301818588803b1580156113a457600080fd5b505af11580156113b8573d6000803e3d6000fd5b50506040513393508d92508e91507f9b3245740ec3b155098a55be84957a4da13eaf7f14a8bc6f53126c0b9350f2be90600090a45050505050505050505050565b600554610100900460ff161561143b576040517f0dc149f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900360400135116114f2576040517ff40239db000000000000000000000000000000000000000000000000000000008152367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90033560048201526024015b60405180910390fd5b60663611156115095763c407e0256000526004601cfd5b6040805160e08101825263ffffffff808252600060208301818152328486019081526fffffffffffffffffffffffffffffffff34818116606088019081527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe369081013560f01c90033560808901908152600160a08a0181815242861660c08c0190815282548084018455928a529a5160059092027fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf681018054995173ffffffffffffffffffffffffffffffffffffffff908116640100000000027fffffffffffffffff000000000000000000000000000000000000000000000000909b1694909c16939093179890981790915594517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf787018054918a167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117905590517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf8860180549185167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909216919091179055517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf9850155915195518116700100000000000000000000000000000000029516949094177fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cfa9091015583517fd0e30db000000000000000000000000000000000000000000000000000000000815293517f00000000000000000000000000000000000000000000000000000000000000009092169363d0e30db093926004828101939282900301818588803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b50506000805467ffffffffffffffff42167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009091161790555050600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905550565b6109bf82826001610b82565b6001818154811061183057600080fd5b60009182526020909120600590910201805460018201546002830154600384015460049094015463ffffffff8416955064010000000090930473ffffffffffffffffffffffffffffffffffffffff908116949216926fffffffffffffffffffffffffffffffff91821692918082169170010000000000000000000000000000000090041687565b60008054700100000000000000000000000000000000900460ff1660028111156118e3576118e36136a7565b1461191a576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001878154811061192f5761192f6139bf565b6000918252602082206005919091020160048101549092506fffffffffffffffffffffffffffffffff16908715821760011b905061198e7f00000000000000000000000000000000000000000000000000000000000000006001613a1d565b611a2a826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1614611a6b576040517f5f53dd9800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808915611b5a57611abe7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613a35565b6001901b611add846fffffffffffffffffffffffffffffffff16612a64565b67ffffffffffffffff16611af19190613a7b565b15611b2e57611b25611b1660016fffffffffffffffffffffffffffffffff8716613a8f565b865463ffffffff166000612b0a565b60030154611b50565b7f00000000000000000000000000000000000000000000000000000000000000005b9150849050611b84565b60038501549150611b81611b166fffffffffffffffffffffffffffffffff86166001613ac0565b90505b600882901b60088a8a604051611b9b929190613af4565b6040518091039020901b14611bdc576040517f696550ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611be78c612bee565b90506000611bf6836003015490565b6040517fe14ced320000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e14ced3290611c70908f908f908f908f908a90600401613b4d565b6020604051808303816000875af1158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613b87565b600485015491149150600090600290611d5e906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611dfa896fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b611e049190613ba0565b611e0e9190613bc1565b67ffffffffffffffff161590508115158103611e56576040517ffb4e40dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8754640100000000900473ffffffffffffffffffffffffffffffffffffffff1615611ead576040517f9071e6af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505085547fffffffffffffffff0000000000000000000000000000000000000000ffffffff163364010000000002179095555050505050505050505050565b60008054700100000000000000000000000000000000900460ff166002811115611f1857611f186136a7565b14611f4f576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600080611f5e86612c1d565b93509350935093506000611f748585858561304a565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fe3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120079190613be8565b9050600189036120ff5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a84612063367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c90036020013590565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526024830191909152604482015260206064820152608481018a905260a4015b6020604051808303816000875af11580156120d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f99190613b87565b5061233b565b6002890361212b5773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8489612063565b600389036121575773ffffffffffffffffffffffffffffffffffffffff81166352f0f3ad8a8487612063565b6004890361229057600061219d6fffffffffffffffffffffffffffffffff85167f0000000000000000000000000000000000000000000000000000000000000000613109565b6121c7907f0000000000000000000000000000000000000000000000000000000000000000613a1d565b6121d2906001613a1d565b905073ffffffffffffffffffffffffffffffffffffffff82166352f0f3ad8b8560405160e084901b7fffffffff000000000000000000000000000000000000000000000000000000001681526004810192909252602482015260c084901b604482015260086064820152608481018b905260a4016020604051808303816000875af1158015612265573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122899190613b87565b505061233b565b60058903612309576040517f52f0f3ad000000000000000000000000000000000000000000000000000000008152600481018a9052602481018390524660c01b6044820152600860648201526084810188905273ffffffffffffffffffffffffffffffffffffffff8216906352f0f3ad9060a4016120b6565b6040517fff137e6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b7f0000000000000000000000000000000000000000000000000000000000000000367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c900335606061239c6109c3565b9050909192565b60008054700100000000000000000000000000000000900460ff1660028111156123cf576123cf6136a7565b14612406576040517f67fe195000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001828154811061241b5761241b6139bf565b60009182526020822060059190910201600481015490925061245d90700100000000000000000000000000000000900460401c67ffffffffffffffff16610f31565b600483015490915060009061248f90700100000000000000000000000000000000900467ffffffffffffffff16610f31565b6124999042613ba0565b9050677fffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000060011c166124d38284613c05565b67ffffffffffffffff1611612514576040517ff2440b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600460205260409020805485158015612534575060055460ff165b1561256b576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015801561257857508515155b156125dd578454640100000000900473ffffffffffffffffffffffffffffffffffffffff16600081156125ab57816125c7565b600187015473ffffffffffffffffffffffffffffffffffffffff165b90506125d381886131be565b5050505050505050565b60006fffffffffffffffffffffffffffffffff815b8381101561272357600085828154811061260e5761260e6139bf565b6000918252602080832090910154808352600490915260409091205490915015612664576040517f9a07664600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060018281548110612679576126796139bf565b600091825260209091206005909102018054909150640100000000900473ffffffffffffffffffffffffffffffffffffffff161580156126d2575060048101546fffffffffffffffffffffffffffffffff908116908516115b15612710576001810154600482015473ffffffffffffffffffffffffffffffffffffffff90911695506fffffffffffffffffffffffffffffffff1693505b50508061271c90613c28565b90506125f2565b5061276b73ffffffffffffffffffffffffffffffffffffffff8316156127495782612765565b600188015473ffffffffffffffffffffffffffffffffffffffff165b886131be565b86547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff84160217875560008881526004602052604081206127c79161366d565b876000036125d357600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555050505050505050565b6060600061283b84367ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe81013560f01c9003613a1d565b90508267ffffffffffffffff1667ffffffffffffffff81111561286057612860613c60565b6040519080825280601f01601f19166020018201604052801561288a576020820181803683370190505b509150828160208401375092915050565b151760011b90565b60006128c26fffffffffffffffffffffffffffffffff84166001613ac0565b905060006128d282866001612b0a565b9050600086901a83806129c5575061290b60027f0000000000000000000000000000000000000000000000000000000000000000613a7b565b60048301546002906129af906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b6129b99190613bc1565b67ffffffffffffffff16145b15612a1d5760ff8116600114806129df575060ff81166002145b612a18576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016114e9565b612a5b565b60ff811615612a5b576040517ff40239db000000000000000000000000000000000000000000000000000000008152600481018890526024016114e9565b50505050505050565b600080612af1837e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b600167ffffffffffffffff919091161b90920392915050565b60008082612b5357612b4e6fffffffffffffffffffffffffffffffff86167f000000000000000000000000000000000000000000000000000000000000000061334a565b612b6e565b612b6e856fffffffffffffffffffffffffffffffff16613511565b905060018481548110612b8357612b836139bf565b906000526020600020906005020191505b60048201546fffffffffffffffffffffffffffffffff828116911614612be657815460018054909163ffffffff16908110612bd157612bd16139bf565b90600052602060002090600502019150612b94565b509392505050565b6000806000806000612bff86612c1d565b9350935093509350612c138484848461304a565b9695505050505050565b6000806000806000859050600060018281548110612c3d57612c3d6139bf565b600091825260209091206004600590920201908101549091507f000000000000000000000000000000000000000000000000000000000000000090612d14906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1611612d55576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b60048301547f000000000000000000000000000000000000000000000000000000000000000090612e1c906fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169250821115612e9857825463ffffffff16612e627f00000000000000000000000000000000000000000000000000000000000000006001613a1d565b8303612e6c578391505b60018181548110612e7f57612e7f6139bf565b9060005260206000209060050201935080945050612d59565b600481810154908401546fffffffffffffffffffffffffffffffff91821691166000816fffffffffffffffffffffffffffffffff16612f01612eec856fffffffffffffffffffffffffffffffff1660011c90565b6fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff161490508015612fe6576000612f39836fffffffffffffffffffffffffffffffff16612a64565b67ffffffffffffffff161115612f9c576000612f73612f6b60016fffffffffffffffffffffffffffffffff8616613a8f565b896001612b0a565b6003810154600490910154909c506fffffffffffffffffffffffffffffffff169a50612fc09050565b7f00000000000000000000000000000000000000000000000000000000000000009a505b600386015460048701549099506fffffffffffffffffffffffffffffffff16975061303c565b6000613008612f6b6fffffffffffffffffffffffffffffffff85166001613ac0565b6003808901546004808b015492840154930154909e506fffffffffffffffffffffffffffffffff9182169d50919b50169850505b505050505050509193509193565b60006fffffffffffffffffffffffffffffffff841681036130b05782826040516020016130939291909182526fffffffffffffffffffffffffffffffff16602082015260400190565b604051602081830303815290604052805190602001209050613101565b60408051602081018790526fffffffffffffffffffffffffffffffff8087169282019290925260608101859052908316608082015260a0016040516020818303038152906040528051906020012090505b949350505050565b600080613196847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff1690508083036001841b600180831b0386831b17039250505092915050565b60028101546fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff00000000000000000000000000000001810161322e576040517ff1a9458100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280830180547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff17905573ffffffffffffffffffffffffffffffffffffffff841660009081526020919091526040812080548392906132a1908490613a1d565b90915550506040517f7eee288d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690637eee288d90604401600060405180830381600087803b15801561333657600080fd5b505af1158015612a5b573d6000803e3d6000fd5b6000816133e9846fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff161161342a576040517fb34b5c2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61343383613511565b9050816134d2826fffffffffffffffffffffffffffffffff167e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff161161350b576135086134ef836001613a1d565b6fffffffffffffffffffffffffffffffff8316906135bd565b90505b92915050565b600081196001830116816135a5827e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169390931c8015179392505050565b60008061364a847e09010a0d15021d0b0e10121619031e080c141c0f111807131b17061a05041f7f07c4acdd0000000000000000000000000000000000000000000000000000000067ffffffffffffffff831160061b83811c63ffffffff1060051b1792831c600181901c17600281901c17600481901c17600881901c17601081901c170260fb1c1a1790565b67ffffffffffffffff169050808303600180821b0385821b179250505092915050565b508054600082559060005260206000209081019061368b919061368e565b50565b5b808211156136a3576000815560010161368f565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613711577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561372a57600080fd5b50508035926020909101359150565b6000815180845260005b8181101561375f57602081850181015186830182015201613743565b81811115613771576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006135086020830184613739565b73ffffffffffffffffffffffffffffffffffffffff8116811461368b57600080fd5b6000602082840312156137eb57600080fd5b81356137f6816137b7565b9392505050565b8035801515811461380d57600080fd5b919050565b60008060006060848603121561382757600080fd5b833592506020840135915061383e604085016137fd565b90509250925092565b60006020828403121561385957600080fd5b81356fffffffffffffffffffffffffffffffff811681146137f657600080fd5b60006020828403121561388b57600080fd5b5035919050565b60008083601f8401126138a457600080fd5b50813567ffffffffffffffff8111156138bc57600080fd5b6020830191508360208285010111156138d457600080fd5b9250929050565b600080600080600080608087890312156138f457600080fd5b86359550613904602088016137fd565b9450604087013567ffffffffffffffff8082111561392157600080fd5b61392d8a838b01613892565b9096509450606089013591508082111561394657600080fd5b5061395389828a01613892565b979a9699509497509295939492505050565b60008060006060848603121561397a57600080fd5b505081359360208301359350604090920135919050565b63ffffffff841681528260208201526060604082015260006139b66060830184613739565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115613a3057613a306139ee565b500190565b600082821015613a4757613a476139ee565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613a8a57613a8a613a4c565b500690565b60006fffffffffffffffffffffffffffffffff83811690831681811015613ab857613ab86139ee565b039392505050565b60006fffffffffffffffffffffffffffffffff808316818516808303821115613aeb57613aeb6139ee565b01949350505050565b8183823760009101908152919050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b606081526000613b61606083018789613b04565b8281036020840152613b74818688613b04565b9150508260408301529695505050505050565b600060208284031215613b9957600080fd5b5051919050565b600067ffffffffffffffff83811690831681811015613ab857613ab86139ee565b600067ffffffffffffffff80841680613bdc57613bdc613a4c565b92169190910692915050565b600060208284031215613bfa57600080fd5b81516137f6816137b7565b600067ffffffffffffffff808316818516808303821115613aeb57613aeb6139ee565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c5957613c596139ee565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea164736f6c634300080f000a"
func init() {
......
......@@ -213,6 +213,8 @@ type DeployConfig struct {
FaultGameGenesisOutputRoot common.Hash `json:"faultGameGenesisOutputRoot"`
// FaultGameSplitDepth is the depth at which the fault dispute game splits from output roots to execution trace claims.
FaultGameSplitDepth uint64 `json:"faultGameSplitDepth"`
// FaultGameWithdrawalDelay is the number of seconds that users must wait before withdrawing ETH from a fault game.
FaultGameWithdrawalDelay uint64 `json:"faultGameWithdrawalDelay"`
// PreimageOracleMinProposalSize is the minimum number of bytes that a large preimage oracle proposal can be.
PreimageOracleMinProposalSize uint64 `json:"preimageOracleMinProposalSize"`
// PreimageOracleChallengePeriod is the number of seconds that challengers have to challenge a large preimage proposal.
......
......@@ -71,6 +71,7 @@
"faultGameGenesisBlock": 0,
"faultGameGenesisOutputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
"faultGameSplitDepth": 0,
"faultGameWithdrawalDelay": 604800,
"preimageOracleMinProposalSize": 1800000,
"preimageOracleChallengePeriod": 86400,
"preimageOracleCancunActivationTimestamp": 0,
......
......@@ -178,8 +178,8 @@ func (h *FactoryHelper) StartOutputCannonGame(ctx context.Context, l2Node string
h.require.NoError(err, "create fault dispute game")
rcpt, err := wait.ForReceiptOK(ctx, h.client, tx.Hash())
h.require.NoError(err, "wait for create fault dispute game receipt to be OK")
h.require.Len(rcpt.Logs, 1, "should have emitted a single DisputeGameCreated event")
createdEvent, err := h.factory.ParseDisputeGameCreated(*rcpt.Logs[0])
h.require.Len(rcpt.Logs, 2, "should have emitted a single DisputeGameCreated event")
createdEvent, err := h.factory.ParseDisputeGameCreated(*rcpt.Logs[1])
h.require.NoError(err)
game, err := bindings.NewFaultDisputeGame(createdEvent.DisputeProxy, h.client)
h.require.NoError(err)
......@@ -244,8 +244,8 @@ func (h *FactoryHelper) StartOutputAlphabetGame(ctx context.Context, l2Node stri
h.require.NoError(err, "create output bisection game")
rcpt, err := wait.ForReceiptOK(ctx, h.client, tx.Hash())
h.require.NoError(err, "wait for create output bisection game receipt to be OK")
h.require.Len(rcpt.Logs, 1, "should have emitted a single DisputeGameCreated event")
createdEvent, err := h.factory.ParseDisputeGameCreated(*rcpt.Logs[0])
h.require.Len(rcpt.Logs, 2, "should have emitted a single DisputeGameCreated event")
createdEvent, err := h.factory.ParseDisputeGameCreated(*rcpt.Logs[1])
h.require.NoError(err)
game, err := bindings.NewFaultDisputeGame(createdEvent.DisputeProxy, h.client)
h.require.NoError(err)
......
......@@ -5,7 +5,7 @@ GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_1() (gas: 4061
GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_0() (gas: 450308)
GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_1() (gas: 3496057)
GasBenchMark_L1StandardBridge_Finalize:test_finalizeETHWithdrawal_benchmark() (gas: 59803)
GasBenchMark_L2OutputOracle:test_proposeL2Output_benchmark() (gas: 92951)
GasBenchMark_L2OutputOracle:test_proposeL2Output_benchmark() (gas: 92930)
GasBenchMark_OptimismPortal:test_depositTransaction_benchmark() (gas: 68360)
GasBenchMark_OptimismPortal:test_depositTransaction_benchmark_1() (gas: 69013)
GasBenchMark_OptimismPortal:test_proveWithdrawalTransaction_benchmark() (gas: 155553)
\ No newline at end of file
GasBenchMark_OptimismPortal:test_proveWithdrawalTransaction_benchmark() (gas: 155556)
\ No newline at end of file
......@@ -55,6 +55,7 @@
"faultGameGenesisBlock": 0,
"faultGameGenesisOutputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
"faultGameSplitDepth": 14,
"faultGameWithdrawalDelay": 604800,
"preimageOracleMinProposalSize": 10000,
"preimageOracleChallengePeriod": 120,
"preimageOracleCancunActivationTimestamp": 0,
......
......@@ -49,6 +49,7 @@
"faultGameGenesisBlock": 4061224,
"faultGameGenesisOutputRoot": "0xd08055c58b2c5149565c636b44fad2c25b5ccddef1385a2cb721529d7480b242",
"faultGameSplitDepth": 32,
"faultGameWithdrawalDelay": 604800,
"preimageOracleMinProposalSize": 1800000,
"preimageOracleChallengePeriod": 86400,
"preimageOracleCancunActivationTimestamp": 1705473120,
......
......@@ -49,6 +49,7 @@
"faultGameGenesisBlock": 0,
"faultGameGenesisOutputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
"faultGameSplitDepth": 4,
"faultGameWithdrawalDelay": 604800,
"preimageOracleMinProposalSize": 10000,
"preimageOracleChallengePeriod": 120,
"preimageOracleCancunActivationTimestamp": 0,
......
......@@ -73,6 +73,7 @@
"faultGameMaxDuration": 86400,
"faultGameGenesisBlock": 0,
"faultGameSplitDepth": 0,
"faultGameWithdrawalDelay": 604800,
"fundDevAccounts": false,
"requiredProtocolVersion": "0x0000000000000000000000000000000000000005000000000000000000000000",
"recommendedProtocolVersion": "0x0000000000000000000000000000000000000005000000000000000000000000"
......
......@@ -49,6 +49,7 @@
"faultGameGenesisBlock": 4061224,
"faultGameGenesisOutputRoot": "0xd08055c58b2c5149565c636b44fad2c25b5ccddef1385a2cb721529d7480b242",
"faultGameSplitDepth": 32,
"faultGameWithdrawalDelay": 604800,
"preimageOracleMinProposalSize": 1800000,
"preimageOracleChallengePeriod": 86400,
"preimageOracleCancunActivationTimestamp": 1706655072,
......
# `FaultDisputeGame` Invariants
## FaultDisputeGame always returns all ETH on total resolution
**Test:** [`FaultDisputeGame.t.sol#L38`](../test/invariants/FaultDisputeGame.t.sol#L38)
**Test:** [`FaultDisputeGame.t.sol#L39`](../test/invariants/FaultDisputeGame.t.sol#L39)
The FaultDisputeGame contract should always return all ETH in the contract to the correct recipients upon resolution of all outstanding claims. There may never be any ETH left in the contract after a full resolution.
\ No newline at end of file
# `OptimismPortal2` Invariants
## Deposits of any value should always succeed unless `_to` = `address(0)` or `_isCreation` = `true`.
**Test:** [`OptimismPortal2.t.sol#L158`](../test/invariants/OptimismPortal2.t.sol#L158)
**Test:** [`OptimismPortal2.t.sol#L160`](../test/invariants/OptimismPortal2.t.sol#L160)
All deposits, barring creation transactions and transactions sent to `address(0)`, should always succeed.
## `finalizeWithdrawalTransaction` should revert if the proof maturity period has not elapsed.
**Test:** [`OptimismPortal2.t.sol#L180`](../test/invariants/OptimismPortal2.t.sol#L180)
**Test:** [`OptimismPortal2.t.sol#L182`](../test/invariants/OptimismPortal2.t.sol#L182)
A withdrawal that has been proven should not be able to be finalized until after the proof maturity period has elapsed.
## `finalizeWithdrawalTransaction` should revert if the withdrawal has already been finalized.
**Test:** [`OptimismPortal2.t.sol#L209`](../test/invariants/OptimismPortal2.t.sol#L209)
**Test:** [`OptimismPortal2.t.sol#L211`](../test/invariants/OptimismPortal2.t.sol#L211)
Ensures that there is no chain of calls that can be made that allows a withdrawal to be finalized twice.
## A withdrawal should **always** be able to be finalized `PROOF_MATURITY_DELAY_SECONDS` after it was successfully proven, if the game has resolved and passed the air-gap.
**Test:** [`OptimismPortal2.t.sol#L237`](../test/invariants/OptimismPortal2.t.sol#L237)
**Test:** [`OptimismPortal2.t.sol#L239`](../test/invariants/OptimismPortal2.t.sol#L239)
This invariant asserts that there is no chain of calls that can be made that will prevent a withdrawal from being finalized exactly `PROOF_MATURITY_DELAY_SECONDS` after it was successfully proven and the game has resolved and passed the air-gap.
\ No newline at end of file
......@@ -10,6 +10,7 @@ import { Constants } from "src/libraries/Constants.sol";
import { L1StandardBridge } from "src/L1/L1StandardBridge.sol";
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol";
import { ProtocolVersion, ProtocolVersions } from "src/L1/ProtocolVersions.sol";
import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol";
......@@ -178,6 +179,32 @@ library ChainAssertions {
require(factory.owner() == _expectedOwner);
}
/// @notice Asserts that the DelayedWETH is setup correctly
function checkDelayedWETH(
Types.ContractSet memory _contracts,
DeployConfig _cfg,
bool _isProxy,
address _expectedOwner
)
internal
view
{
console.log("Running chain assertions on the DelayedWETH");
DelayedWETH weth = DelayedWETH(payable(_contracts.DelayedWETH));
// Check that the contract is initialized
assertSlotValueIsOne({ _contractAddress: address(weth), _slot: 0, _offset: 0 });
if (_isProxy) {
require(weth.owner() == _expectedOwner);
require(weth.delay() == _cfg.faultGameWithdrawalDelay());
require(weth.config() == SuperchainConfig(_contracts.SuperchainConfig));
} else {
require(weth.owner() == _expectedOwner);
require(weth.delay() == _cfg.faultGameWithdrawalDelay());
}
}
/// @notice Asserts that the L2OutputOracle is setup correctly
function checkL2OutputOracle(
Types.ContractSet memory _contracts,
......
......@@ -34,6 +34,7 @@ import { Constants } from "src/libraries/Constants.sol";
import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol";
import { PermissionedDisputeGame } from "src/dispute/PermissionedDisputeGame.sol";
import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol";
import { PreimageOracle } from "src/cannon/PreimageOracle.sol";
import { MIPS } from "src/cannon/MIPS.sol";
import { L1ERC721Bridge } from "src/L1/L1ERC721Bridge.sol";
......@@ -66,6 +67,18 @@ contract Deploy is Deployer {
using stdJson for string;
/// @notice FaultDisputeGameParams is a struct that contains the parameters necessary to call
/// the function _setFaultGameImplementation. This struct exists because the EVM needs
/// to finally adopt PUSHN and get rid of stack too deep once and for all.
/// Someday we will look back and laugh about stack too deep, today is not that day.
struct FaultDisputeGameParams {
DelayedWETH weth;
GameType gameType;
Claim absolutePrestate;
IBigStepper faultVm;
uint256 maxGameDepth;
}
////////////////////////////////////////////////////////////////
// Modifiers //
////////////////////////////////////////////////////////////////
......@@ -133,6 +146,7 @@ contract Deploy is Deployer {
L1StandardBridge: mustGetAddress("L1StandardBridgeProxy"),
L2OutputOracle: mustGetAddress("L2OutputOracleProxy"),
DisputeGameFactory: mustGetAddress("DisputeGameFactoryProxy"),
DelayedWETH: mustGetAddress("DelayedWETHProxy"),
OptimismMintableERC20Factory: mustGetAddress("OptimismMintableERC20FactoryProxy"),
OptimismPortal: mustGetAddress("OptimismPortalProxy"),
OptimismPortal2: mustGetAddress("OptimismPortalProxy"),
......@@ -150,6 +164,7 @@ contract Deploy is Deployer {
L1StandardBridge: getAddress("L1StandardBridgeProxy"),
L2OutputOracle: getAddress("L2OutputOracleProxy"),
DisputeGameFactory: getAddress("DisputeGameFactoryProxy"),
DelayedWETH: getAddress("DelayedWETHProxy"),
OptimismMintableERC20Factory: getAddress("OptimismMintableERC20FactoryProxy"),
OptimismPortal: getAddress("OptimismPortalProxy"),
OptimismPortal2: getAddress("OptimismPortalProxy"),
......@@ -334,6 +349,7 @@ contract Deploy is Deployer {
setPermissionedCannonFaultGameImplementation({ _allowUpgrade: false });
transferDisputeGameFactoryOwnership();
transferDelayedWETHOwnership();
}
/// @notice Deploy all of the proxies
......@@ -352,6 +368,7 @@ contract Deploy is Deployer {
// fault proofs are not enabled, the DisputeGameFactory proxy will be unused.
deployERC1967Proxy("DisputeGameFactoryProxy");
deployERC1967Proxy("L2OutputOracleProxy");
deployERC1967Proxy("DelayedWETHProxy");
transferAddressManagerOwnership(); // to the ProxyAdmin
}
......@@ -370,6 +387,7 @@ contract Deploy is Deployer {
// Fault proofs
deployOptimismPortal2();
deployDisputeGameFactory();
deployDelayedWETH();
deployPreimageOracle();
deployMips();
}
......@@ -384,6 +402,7 @@ contract Deploy is Deployer {
initializeL1CrossDomainMessenger();
initializeL2OutputOracle();
initializeDisputeGameFactory();
initializeDelayedWETH();
// Selectively initialize either the original OptimismPortal or the new OptimismPortal2. Since this will upgrade
// the proxy, we cannot initialize both. FPAC warning can be removed once we're done with the old OptimismPortal
......@@ -675,6 +694,27 @@ contract Deploy is Deployer {
addr_ = address(factory);
}
function deployDelayedWETH() public broadcast returns (address addr_) {
console.log("Deploying DelayedWETH implementation");
DelayedWETH weth = new DelayedWETH{ salt: _implSalt() }(cfg.faultGameWithdrawalDelay());
save("DelayedWETH", address(weth));
console.log("DelayedWETH deployed at %s", address(weth));
// Override the `DelayedWETH` contract to the deployed implementation. This is necessary
// to check the `DelayedWETH` implementation alongside dependent contracts, which are
// always proxies.
Types.ContractSet memory contracts = _proxiesUnstrict();
contracts.DelayedWETH = address(weth);
ChainAssertions.checkDelayedWETH({
_contracts: contracts,
_cfg: cfg,
_isProxy: false,
_expectedOwner: address(0)
});
addr_ = address(weth);
}
/// @notice Deploy the ProtocolVersions
function deployProtocolVersions() public broadcast returns (address addr_) {
console.log("Deploying ProtocolVersions implementation");
......@@ -831,6 +871,29 @@ contract Deploy is Deployer {
ChainAssertions.checkDisputeGameFactory({ _contracts: _proxiesUnstrict(), _expectedOwner: msg.sender });
}
function initializeDelayedWETH() public broadcast {
console.log("Upgrading and initializing DelayedWETH proxy");
address delayedWETHProxy = mustGetAddress("DelayedWETHProxy");
address delayedWETH = mustGetAddress("DelayedWETH");
address superchainConfigProxy = mustGetAddress("SuperchainConfigProxy");
_upgradeAndCallViaSafe({
_proxy: payable(delayedWETHProxy),
_implementation: delayedWETH,
_innerCallData: abi.encodeCall(DelayedWETH.initialize, (msg.sender, SuperchainConfig(superchainConfigProxy)))
});
string memory version = DelayedWETH(payable(delayedWETHProxy)).version();
console.log("DelayedWETH version: %s", version);
ChainAssertions.checkDelayedWETH({
_contracts: _proxiesUnstrict(),
_cfg: cfg,
_isProxy: true,
_expectedOwner: msg.sender
});
}
/// @notice Initialize the SystemConfig
function initializeSystemConfig() public broadcast {
console.log("Upgrading and initializing SystemConfig proxy");
......@@ -1132,6 +1195,20 @@ contract Deploy is Deployer {
ChainAssertions.checkDisputeGameFactory({ _contracts: _proxies(), _expectedOwner: safe });
}
/// @notice Transfer ownership of the DelayedWETH contract to the final system owner
function transferDelayedWETHOwnership() public broadcast {
console.log("Transferring DelayedWETH ownership to Safe");
DelayedWETH weth = DelayedWETH(mustGetAddress("DelayedWETHProxy"));
address owner = weth.owner();
address safe = mustGetAddress("SystemOwnerSafe");
if (owner != safe) {
weth.transferOwnership(safe);
console.log("DelayedWETH ownership transferred to Safe at: %s", safe);
}
ChainAssertions.checkDelayedWETH({ _contracts: _proxies(), _cfg: cfg, _isProxy: true, _expectedOwner: safe });
}
/// @notice Loads the mips absolute prestate from the prestate-proof for devnets otherwise
/// from the config.
function loadMipsAbsolutePrestate() internal returns (Claim mipsAbsolutePrestate_) {
......@@ -1163,15 +1240,19 @@ contract Deploy is Deployer {
function setCannonFaultGameImplementation(bool _allowUpgrade) public broadcast {
console.log("Setting Cannon FaultDisputeGame implementation");
DisputeGameFactory factory = DisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy"));
DelayedWETH weth = DelayedWETH(mustGetAddress("DelayedWETHProxy"));
// Set the Cannon FaultDisputeGame implementation in the factory.
_setFaultGameImplementation({
_factory: factory,
_gameType: GameTypes.CANNON,
_absolutePrestate: loadMipsAbsolutePrestate(),
_faultVm: IBigStepper(mustGetAddress("Mips")),
_maxGameDepth: cfg.faultGameMaxDepth(),
_allowUpgrade: _allowUpgrade
_allowUpgrade: _allowUpgrade,
_params: FaultDisputeGameParams({
weth: weth,
gameType: GameTypes.CANNON,
absolutePrestate: loadMipsAbsolutePrestate(),
faultVm: IBigStepper(mustGetAddress("Mips")),
maxGameDepth: cfg.faultGameMaxDepth()
})
});
}
......@@ -1179,15 +1260,19 @@ contract Deploy is Deployer {
function setPermissionedCannonFaultGameImplementation(bool _allowUpgrade) public broadcast {
console.log("Setting Cannon PermissionedDisputeGame implementation");
DisputeGameFactory factory = DisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy"));
DelayedWETH weth = DelayedWETH(mustGetAddress("DelayedWETHProxy"));
// Set the Cannon FaultDisputeGame implementation in the factory.
_setFaultGameImplementation({
_factory: factory,
_gameType: GameTypes.PERMISSIONED_CANNON,
_absolutePrestate: loadMipsAbsolutePrestate(),
_faultVm: IBigStepper(mustGetAddress("Mips")),
_maxGameDepth: cfg.faultGameMaxDepth(),
_allowUpgrade: _allowUpgrade
_allowUpgrade: _allowUpgrade,
_params: FaultDisputeGameParams({
weth: weth,
gameType: GameTypes.PERMISSIONED_CANNON,
absolutePrestate: loadMipsAbsolutePrestate(),
faultVm: IBigStepper(mustGetAddress("Mips")),
maxGameDepth: cfg.faultGameMaxDepth()
})
});
}
......@@ -1195,65 +1280,68 @@ contract Deploy is Deployer {
function setAlphabetFaultGameImplementation(bool _allowUpgrade) public onlyDevnet broadcast {
console.log("Setting Alphabet FaultDisputeGame implementation");
DisputeGameFactory factory = DisputeGameFactory(mustGetAddress("DisputeGameFactoryProxy"));
DelayedWETH weth = DelayedWETH(mustGetAddress("DelayedWETHProxy"));
Claim outputAbsolutePrestate = Claim.wrap(bytes32(cfg.faultGameAbsolutePrestate()));
_setFaultGameImplementation({
_factory: factory,
_gameType: GameTypes.ALPHABET,
_absolutePrestate: outputAbsolutePrestate,
_faultVm: IBigStepper(new AlphabetVM(outputAbsolutePrestate, PreimageOracle(mustGetAddress("PreimageOracle")))),
// The max depth for the alphabet trace is always 3. Add 1 because split depth is fully inclusive.
_maxGameDepth: cfg.faultGameSplitDepth() + 3 + 1,
_allowUpgrade: _allowUpgrade
_allowUpgrade: _allowUpgrade,
_params: FaultDisputeGameParams({
weth: weth,
gameType: GameTypes.ALPHABET,
absolutePrestate: outputAbsolutePrestate,
faultVm: IBigStepper(new AlphabetVM(outputAbsolutePrestate, PreimageOracle(mustGetAddress("PreimageOracle")))),
// The max depth for the alphabet trace is always 3. Add 1 because split depth is fully inclusive.
maxGameDepth: cfg.faultGameSplitDepth() + 3 + 1
})
});
}
/// @notice Sets the implementation for the given fault game type in the `DisputeGameFactory`.
function _setFaultGameImplementation(
DisputeGameFactory _factory,
GameType _gameType,
Claim _absolutePrestate,
IBigStepper _faultVm,
uint256 _maxGameDepth,
bool _allowUpgrade
bool _allowUpgrade,
FaultDisputeGameParams memory _params
)
internal
{
if (address(_factory.gameImpls(_gameType)) != address(0) && !_allowUpgrade) {
if (address(_factory.gameImpls(_params.gameType)) != address(0) && !_allowUpgrade) {
console.log(
"[WARN] DisputeGameFactoryProxy: `FaultDisputeGame` implementation already set for game type: %s",
vm.toString(GameType.unwrap(_gameType))
vm.toString(GameType.unwrap(_params.gameType))
);
return;
}
uint32 rawGameType = GameType.unwrap(_gameType);
uint32 rawGameType = GameType.unwrap(_params.gameType);
if (rawGameType != GameTypes.PERMISSIONED_CANNON.raw()) {
_factory.setImplementation(
_gameType,
_params.gameType,
new FaultDisputeGame({
_gameType: _gameType,
_absolutePrestate: _absolutePrestate,
_gameType: _params.gameType,
_absolutePrestate: _params.absolutePrestate,
_genesisBlockNumber: cfg.faultGameGenesisBlock(),
_genesisOutputRoot: Hash.wrap(cfg.faultGameGenesisOutputRoot()),
_maxGameDepth: _maxGameDepth,
_maxGameDepth: _params.maxGameDepth,
_splitDepth: cfg.faultGameSplitDepth(),
_gameDuration: Duration.wrap(uint64(cfg.faultGameMaxDuration())),
_vm: _faultVm
_vm: _params.faultVm,
_weth: _params.weth
})
);
} else {
_factory.setImplementation(
_gameType,
_params.gameType,
new PermissionedDisputeGame({
_gameType: _gameType,
_absolutePrestate: _absolutePrestate,
_gameType: _params.gameType,
_absolutePrestate: _params.absolutePrestate,
_genesisBlockNumber: cfg.faultGameGenesisBlock(),
_genesisOutputRoot: Hash.wrap(cfg.faultGameGenesisOutputRoot()),
_maxGameDepth: _maxGameDepth,
_maxGameDepth: _params.maxGameDepth,
_splitDepth: cfg.faultGameSplitDepth(),
_gameDuration: Duration.wrap(uint64(cfg.faultGameMaxDuration())),
_vm: _faultVm,
_vm: _params.faultVm,
_weth: _params.weth,
_proposer: cfg.l2OutputOracleProposer(),
_challenger: cfg.l2OutputOracleChallenger()
})
......
......@@ -9,7 +9,7 @@ import { Chains } from "scripts/Chains.sol";
// Global constant for the `useFaultProofs` slot in the DeployConfig contract, which can be overridden in the testing
// environment.
bytes32 constant USE_FAULT_PROOFS_SLOT = bytes32(uint256(63));
bytes32 constant USE_FAULT_PROOFS_SLOT = bytes32(uint256(64));
/// @title DeployConfig
/// @notice Represents the configuration required to deploy the system. It is expected
......@@ -60,6 +60,7 @@ contract DeployConfig is Script {
uint256 public faultGameMaxDepth;
uint256 public faultGameSplitDepth;
uint256 public faultGameMaxDuration;
uint256 public faultGameWithdrawalDelay;
uint256 public preimageOracleMinProposalSize;
uint256 public preimageOracleChallengePeriod;
uint256 public preimageOracleCancunActivationTimestamp;
......@@ -136,6 +137,7 @@ contract DeployConfig is Script {
faultGameMaxDuration = stdJson.readUint(_json, "$.faultGameMaxDuration");
faultGameGenesisBlock = stdJson.readUint(_json, "$.faultGameGenesisBlock");
faultGameGenesisOutputRoot = stdJson.readBytes32(_json, "$.faultGameGenesisOutputRoot");
faultGameWithdrawalDelay = stdJson.readUint(_json, "$.faultGameWithdrawalDelay");
preimageOracleMinProposalSize = stdJson.readUint(_json, "$.preimageOracleMinProposalSize");
preimageOracleChallengePeriod = stdJson.readUint(_json, "$.preimageOracleChallengePeriod");
......
......@@ -49,7 +49,7 @@ contract FaultDisputeGameViz is Script, FaultDisputeGame_Init {
* @dev Entry point
*/
function remote(address _addr) public {
gameProxy = FaultDisputeGame(_addr);
gameProxy = FaultDisputeGame(payable(_addr));
buildGraph();
console.log("Saved graph to `./dispute_game.svg");
}
......
......@@ -8,6 +8,7 @@ library Types {
address L1StandardBridge;
address L2OutputOracle;
address DisputeGameFactory;
address DelayedWETH;
address OptimismMintableERC20Factory;
address OptimismPortal;
address OptimismPortal2;
......
......@@ -18,19 +18,22 @@ contract FPACOPS is Deploy, StdAssertions {
prankDeployment("ProxyAdmin", msg.sender);
prankDeployment("SystemOwnerSafe", msg.sender);
// Deploy the DisputeGameFactoryProxy.
// Deploy the proxies.
deployERC1967Proxy("DisputeGameFactoryProxy");
deployERC1967Proxy("DelayedWETHProxy");
// Deploy implementations.
deployDisputeGameFactory();
deployDelayedWETH();
deployPreimageOracle();
deployMips();
// Deploy the new `OptimismPortal` implementation.
deployOptimismPortal2();
// Initialize the DisputeGameFactoryProxy.
// Initialize the proxies.
initializeDisputeGameFactoryProxy();
initializeDelayedWETHProxy();
// Deploy the Cannon Fault game implementation and set it as game ID = 0.
setCannonFaultGameImplementation({ _allowUpgrade: false });
......@@ -40,6 +43,7 @@ contract FPACOPS is Deploy, StdAssertions {
// Transfer ownership of the DisputeGameFactory to the SystemOwnerSafe, and transfer the administrative rights
// of the DisputeGameFactoryProxy to the ProxyAdmin.
transferDGFOwnershipFinal({ _proxyAdmin: _proxyAdmin, _systemOwnerSafe: _systemOwnerSafe });
transferWethOwnershipFinal({ _proxyAdmin: _proxyAdmin, _systemOwnerSafe: _systemOwnerSafe });
// Run post-deployment assertions.
postDeployAssertions({ _proxyAdmin: _proxyAdmin, _systemOwnerSafe: _systemOwnerSafe });
......@@ -62,6 +66,17 @@ contract FPACOPS is Deploy, StdAssertions {
);
}
function initializeDelayedWETHProxy() internal broadcast {
console.log("Initializing DelayedWETHProxy with DelayedWETH.");
address wethProxy = mustGetAddress("DelayedWETHProxy");
address systemConfigProxy = mustGetAddress("SystemConfigProxy");
Proxy(payable(wethProxy)).upgradeToAndCall(
mustGetAddress("DelayedWETH"),
abi.encodeWithSignature("initialize(address,address)", msg.sender, systemConfigProxy)
);
}
/// @notice Transfers admin rights of the `DisputeGameFactoryProxy` to the `ProxyAdmin` and sets the
/// `DisputeGameFactory` owner to the `SystemOwnerSafe`.
function transferDGFOwnershipFinal(address _proxyAdmin, address _systemOwnerSafe) internal broadcast {
......@@ -75,6 +90,19 @@ contract FPACOPS is Deploy, StdAssertions {
prox.changeAdmin(_proxyAdmin);
}
/// @notice Transfers admin rights of the `DelayedWETHProxy` to the `ProxyAdmin` and sets the
/// `DelayedWETH` owner to the `SystemOwnerSafe`.
function transferWethOwnershipFinal(address _proxyAdmin, address _systemOwnerSafe) internal broadcast {
DelayedWETH weth = DelayedWETH(mustGetAddress("DelayedWETHProxy"));
// Transfer the ownership of the DelayedWETH to the SystemOwnerSafe.
weth.transferOwnership(_systemOwnerSafe);
// Transfer the admin rights of the DelayedWETHProxy to the ProxyAdmin.
Proxy prox = Proxy(payable(address(weth)));
prox.changeAdmin(_proxyAdmin);
}
/// @notice Checks that the deployed system is configured correctly.
function postDeployAssertions(address _proxyAdmin, address _systemOwnerSafe) internal {
Types.ContractSet memory contracts = _proxiesUnstrict();
......@@ -88,6 +116,9 @@ contract FPACOPS is Deploy, StdAssertions {
DisputeGameFactory dgfProxy = DisputeGameFactory(dgfProxyAddr);
assertEq(address(uint160(uint256(vm.load(dgfProxyAddr, Constants.PROXY_OWNER_ADDRESS)))), _proxyAdmin);
ChainAssertions.checkDisputeGameFactory(contracts, _systemOwnerSafe);
address wethProxyAddr = mustGetAddress("DelayedWETHProxy");
assertEq(address(uint160(uint256(vm.load(wethProxyAddr, Constants.PROXY_OWNER_ADDRESS)))), _proxyAdmin);
ChainAssertions.checkDelayedWETH(contracts, cfg, true, _systemOwnerSafe);
// Check the config elements in the deployed contracts.
ChainAssertions.checkOptimismPortal2(contracts, cfg, false);
......@@ -100,7 +131,7 @@ contract FPACOPS is Deploy, StdAssertions {
assertEq(address(mips.oracle()), address(oracle));
// Check the FaultDisputeGame configuration.
FaultDisputeGame gameImpl = FaultDisputeGame(address(dgfProxy.gameImpls(GameTypes.CANNON)));
FaultDisputeGame gameImpl = FaultDisputeGame(payable(address(dgfProxy.gameImpls(GameTypes.CANNON))));
assertEq(gameImpl.maxGameDepth(), cfg.faultGameMaxDepth());
assertEq(gameImpl.splitDepth(), cfg.faultGameSplitDepth());
assertEq(gameImpl.gameDuration().raw(), cfg.faultGameMaxDuration());
......@@ -110,7 +141,7 @@ contract FPACOPS is Deploy, StdAssertions {
// Check the security override yoke configuration.
PermissionedDisputeGame soyGameImpl =
PermissionedDisputeGame(address(dgfProxy.gameImpls(GameTypes.PERMISSIONED_CANNON)));
PermissionedDisputeGame(payable(address(dgfProxy.gameImpls(GameTypes.PERMISSIONED_CANNON))));
assertEq(soyGameImpl.maxGameDepth(), cfg.faultGameMaxDepth());
assertEq(soyGameImpl.splitDepth(), cfg.faultGameSplitDepth());
assertEq(soyGameImpl.gameDuration().raw(), cfg.faultGameMaxDuration());
......
......@@ -100,8 +100,12 @@
"sourceCodeHash": "0x1e5a6deded88804971fc1847c9eac65921771bff353437c0b29ed2f55513b984"
},
"src/dispute/FaultDisputeGame.sol": {
"initCodeHash": "0x73600519fd00cda111fdc811ec4e1712d599300b2fbc53c70620702653e3be3a",
"sourceCodeHash": "0x7fd6726ba22f848e6177e9413bdb2e74dacbb9ae87d57cb0c4cbd497b9a318d3"
"initCodeHash": "0x1db101f0c3613d5e3f7e4f5f73e3f4e50917aef72abd7c28571d9be6cd76e4ad",
"sourceCodeHash": "0x7bea42037f03604a2781c238426af34d46bd85a6520cb884045dd13b33139b34"
},
"src/dispute/weth/DelayedWETH.sol": {
"initCodeHash": "0x41e274b12dc48658d073dfea67ef694c5cce3963757911ee4cecc9f4c312e4bb",
"sourceCodeHash": "0xb357a0d4b815ea9528cfb6d83aaa1e62cd0352223432d4f3e23bc09ae62691b8"
},
"src/legacy/DeployerWhitelist.sol": {
"initCodeHash": "0x8de80fb23b26dd9d849f6328e56ea7c173cd9e9ce1f05c9beea559d1720deb3d",
......
[
{
"inputs": [
{
"internalType": "uint256",
"name": "_delay",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"stateMutability": "payable",
"type": "receive"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "guy",
"type": "address"
},
{
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "config",
"outputs": [
{
"internalType": "contract SuperchainConfig",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "delay",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "deposit",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_guy",
"type": "address"
},
{
"internalType": "uint256",
"name": "_wad",
"type": "uint256"
}
],
"name": "hold",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_owner",
"type": "address"
},
{
"internalType": "contract SuperchainConfig",
"name": "_config",
"type": "address"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_wad",
"type": "uint256"
}
],
"name": "recover",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "dst",
"type": "address"
},
{
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "src",
"type": "address"
},
{
"internalType": "address",
"name": "dst",
"type": "address"
},
{
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_guy",
"type": "address"
},
{
"internalType": "uint256",
"name": "_wad",
"type": "uint256"
}
],
"name": "unlock",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "version",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_wad",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_guy",
"type": "address"
},
{
"internalType": "uint256",
"name": "_wad",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "withdrawals",
"outputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "timestamp",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "src",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "guy",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "dst",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "Deposit",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "src",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "dst",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "src",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "Unwrap",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "src",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "Withdrawal",
"type": "event"
}
]
\ No newline at end of file
......@@ -40,11 +40,24 @@
"internalType": "contract IBigStepper",
"name": "_vm",
"type": "address"
},
{
"internalType": "contract IDelayedWETH",
"name": "_weth",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"stateMutability": "payable",
"type": "fallback"
},
{
"stateMutability": "payable",
"type": "receive"
},
{
"inputs": [],
"name": "absolutePrestate",
......@@ -545,6 +558,19 @@
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "weth",
"outputs": [
{
"internalType": "contract IDelayedWETH",
"name": "weth_",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
......@@ -663,6 +689,11 @@
"name": "InvalidSplitDepth",
"type": "error"
},
{
"inputs": [],
"name": "NoCreditToClaim",
"type": "error"
},
{
"inputs": [],
"name": "OutOfOrderResolution",
......
......@@ -41,6 +41,11 @@
"name": "_vm",
"type": "address"
},
{
"internalType": "contract IDelayedWETH",
"name": "_weth",
"type": "address"
},
{
"internalType": "address",
"name": "_proposer",
......@@ -55,6 +60,14 @@
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"stateMutability": "payable",
"type": "fallback"
},
{
"stateMutability": "payable",
"type": "receive"
},
{
"inputs": [],
"name": "absolutePrestate",
......@@ -555,6 +568,19 @@
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "weth",
"outputs": [
{
"internalType": "contract IDelayedWETH",
"name": "weth_",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
......@@ -678,6 +704,11 @@
"name": "InvalidSplitDepth",
"type": "error"
},
{
"inputs": [],
"name": "NoCreditToClaim",
"type": "error"
},
{
"inputs": [],
"name": "OutOfOrderResolution",
......
[
{
"stateMutability": "payable",
"type": "receive"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "guy",
"type": "address"
},
{
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "deposit",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "dst",
"type": "address"
},
{
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "src",
"type": "address"
},
{
"internalType": "address",
"name": "dst",
"type": "address"
},
{
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "src",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "guy",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "dst",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "Deposit",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "src",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "dst",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "src",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "wad",
"type": "uint256"
}
],
"name": "Withdrawal",
"type": "event"
}
]
\ No newline at end of file
......@@ -1954,7 +1954,7 @@
"newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
"previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
"reverted": false,
"slot": "0x000000000000000000000000000000000000000000000000000000000000003a"
"slot": "0x000000000000000000000000000000000000000000000000000000000000003b"
}
],
"value": 0
......@@ -1980,7 +1980,7 @@
"newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
"previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
"reverted": false,
"slot": "0x000000000000000000000000000000000000000000000000000000000000003b"
"slot": "0x000000000000000000000000000000000000000000000000000000000000003c"
}
],
"value": 0
......@@ -2441,7 +2441,7 @@
"newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
"previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
"reverted": false,
"slot": "0x000000000000000000000000000000000000000000000000000000000000003a"
"slot": "0x000000000000000000000000000000000000000000000000000000000000003b"
}
],
"value": 0
......@@ -2519,7 +2519,7 @@
"newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
"previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
"reverted": false,
"slot": "0x000000000000000000000000000000000000000000000000000000000000003b"
"slot": "0x000000000000000000000000000000000000000000000000000000000000003c"
}
],
"value": 0
......@@ -7162,7 +7162,7 @@
"newValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
"previousValue": "0x0000000000000000000000000000000000000000000000000000000000000000",
"reverted": false,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000039"
"slot": "0x000000000000000000000000000000000000000000000000000000000000003a"
}
],
"value": 0
......
[
{
"bytes": "1",
"label": "_initialized",
"offset": 0,
"slot": "0",
"type": "uint8"
},
{
"bytes": "1",
"label": "_initializing",
"offset": 1,
"slot": "0",
"type": "bool"
},
{
"bytes": "1600",
"label": "__gap",
"offset": 0,
"slot": "1",
"type": "uint256[50]"
},
{
"bytes": "20",
"label": "_owner",
"offset": 0,
"slot": "51",
"type": "address"
},
{
"bytes": "1568",
"label": "__gap",
"offset": 0,
"slot": "52",
"type": "uint256[49]"
},
{
"bytes": "32",
"label": "balanceOf",
"offset": 0,
"slot": "101",
"type": "mapping(address => uint256)"
},
{
"bytes": "32",
"label": "allowance",
"offset": 0,
"slot": "102",
"type": "mapping(address => mapping(address => uint256))"
},
{
"bytes": "32",
"label": "withdrawals",
"offset": 0,
"slot": "103",
"type": "mapping(address => mapping(address => struct IDelayedWETH.WithdrawalRequest))"
},
{
"bytes": "20",
"label": "config",
"offset": 0,
"slot": "104",
"type": "contract SuperchainConfig"
}
]
\ No newline at end of file
[
{
"bytes": "32",
"label": "balanceOf",
"offset": 0,
"slot": "0",
"type": "mapping(address => uint256)"
},
{
"bytes": "32",
"label": "allowance",
"offset": 0,
"slot": "1",
"type": "mapping(address => mapping(address => uint256))"
}
]
\ No newline at end of file
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol";
import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol";
import { IFaultDisputeGame } from "src/dispute/interfaces/IFaultDisputeGame.sol";
import { IInitializable } from "src/dispute/interfaces/IInitializable.sol";
......@@ -47,6 +48,9 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
/// @notice The game type ID
GameType internal immutable GAME_TYPE;
/// @notice WETH contract for holding ETH
IDelayedWETH internal immutable WETH;
/// @notice The global root claim's position is always at gindex 1.
Position internal constant ROOT_POSITION = Position.wrap(1);
......@@ -91,8 +95,8 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
/// @param _maxGameDepth The maximum depth of bisection.
/// @param _splitDepth The final depth of the output bisection portion of the game.
/// @param _gameDuration The duration of the game.
/// @param _vm An onchain VM that performs single instruction steps on a fault proof program
/// trace.
/// @param _vm An onchain VM that performs single instruction steps on an FPP trace.
/// @param _weth WETH contract for holding ETH.
constructor(
GameType _gameType,
Claim _absolutePrestate,
......@@ -101,7 +105,8 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
uint256 _maxGameDepth,
uint256 _splitDepth,
Duration _gameDuration,
IBigStepper _vm
IBigStepper _vm,
IDelayedWETH _weth
) {
// The split depth cannot be greater than or equal to the max game depth.
if (_splitDepth >= _maxGameDepth) revert InvalidSplitDepth();
......@@ -114,8 +119,15 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
SPLIT_DEPTH = _splitDepth;
GAME_DURATION = _gameDuration;
VM = _vm;
WETH = _weth;
}
/// @notice Receive function to allow the contract to receive ETH.
receive() external payable { }
/// @notice Fallback function to allow the contract to receive ETH.
fallback() external payable { }
////////////////////////////////////////////////////////////////
// `IFaultDisputeGame` impl //
////////////////////////////////////////////////////////////////
......@@ -292,6 +304,9 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
// Update the subgame rooted at the parent claim.
subgames[_challengeIndex].push(claimData.length - 1);
// Deposit the bond.
WETH.deposit{ value: msg.value }();
// Emit the appropriate event for the attack or defense.
emit Move(_challengeIndex, _claim, msg.sender);
}
......@@ -519,6 +534,9 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
})
);
// Deposit the bond.
WETH.deposit{ value: msg.value }();
// Set the game's starting timestamp
createdAt = Timestamp.wrap(uint64(block.timestamp));
......@@ -547,6 +565,14 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
uint256 recipientCredit = credit[_recipient];
credit[_recipient] = 0;
// Revert if the recipient has no credit to claim.
if (recipientCredit == 0) {
revert NoCreditToClaim();
}
// Try to withdraw the WETH amount so it can be used here.
WETH.withdraw(_recipient, recipientCredit);
// Transfer the credit to the recipient.
(bool success,) = _recipient.call{ value: recipientCredit }(hex"");
if (!success) revert BondTransferFailed();
......@@ -597,6 +623,11 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
genesisOutputRoot_ = GENESIS_OUTPUT_ROOT;
}
/// @notice Returns the WETH contract for holding ETH.
function weth() external view returns (IDelayedWETH weth_) {
weth_ = WETH;
}
////////////////////////////////////////////////////////////////
// HELPERS //
////////////////////////////////////////////////////////////////
......@@ -612,6 +643,9 @@ contract FaultDisputeGame is IFaultDisputeGame, Clone, ISemver {
// Increase the recipient's credit.
credit[_recipient] += bond;
// Unlock the bond.
WETH.unlock(_recipient, bond);
}
/// @notice Verifies the integrity of an execution bisection subgame's root claim. Reverts if the claim
......
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol";
import { FaultDisputeGame, IFaultDisputeGame, IBigStepper, IInitializable } from "src/dispute/FaultDisputeGame.sol";
import "src/libraries/DisputeTypes.sol";
import "src/libraries/DisputeErrors.sol";
......@@ -44,6 +45,7 @@ contract PermissionedDisputeGame is FaultDisputeGame {
uint256 _splitDepth,
Duration _gameDuration,
IBigStepper _vm,
IDelayedWETH _weth,
address _proposer,
address _challenger
)
......@@ -55,7 +57,8 @@ contract PermissionedDisputeGame is FaultDisputeGame {
_maxGameDepth,
_splitDepth,
_gameDuration,
_vm
_vm,
_weth
)
{
PROPOSER = _proposer;
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
import { IWETH } from "src/dispute/interfaces/IWETH.sol";
/// @title IDelayedWETH
/// @notice Interface for the DelayedWETH contract.
interface IDelayedWETH is IWETH {
/// @notice Represents a withdrawal request.
struct WithdrawalRequest {
uint256 amount;
uint256 timestamp;
}
/// @notice Emitted when an unwrap is started.
/// @param src The address that started the unwrap.
/// @param wad The amount of WETH that was unwrapped.
event Unwrap(address indexed src, uint256 wad);
/// @notice Returns the withdrawal delay in seconds.
/// @return The withdrawal delay in seconds.
function delay() external view returns (uint256);
/// @notice Returns a withdrawal request for the given address.
/// @param _owner The address to query the withdrawal request of.
/// @param _guy Sub-account to query the withdrawal request of.
/// @return The withdrawal request for the given address-subaccount pair.
function withdrawals(address _owner, address _guy) external view returns (uint256, uint256);
/// @notice Unlocks withdrawals for the sender's account, after a time delay.
/// @param _guy Sub-account to unlock.
/// @param _wad The amount of WETH to unlock.
function unlock(address _guy, uint256 _wad) external;
/// @notice Extension to withdrawal, must provide a sub-account to withdraw from.
/// @param _guy Sub-account to withdraw from.
/// @param _wad The amount of WETH to withdraw.
function withdraw(address _guy, uint256 _wad) external;
/// @notice Allows the owner to recover from error cases by pulling ETH out of the contract.
/// @param _wad The amount of WETH to recover.
function recover(uint256 _wad) external;
/// @notice Allows the owner to recover from error cases by pulling ETH from a specific owner.
/// @param _guy The address to recover the WETH from.
/// @param _wad The amount of WETH to recover.
function hold(address _guy, uint256 _wad) external;
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
/// @title IWETH
/// @notice Interface for WETH9.
interface IWETH {
/// @notice Emitted when an approval is made.
/// @param src The address that approved the transfer.
/// @param guy The address that was approved to transfer.
/// @param wad The amount that was approved to transfer.
event Approval(address indexed src, address indexed guy, uint256 wad);
/// @notice Emitted when a transfer is made.
/// @param src The address that transferred the WETH.
/// @param dst The address that received the WETH.
/// @param wad The amount of WETH that was transferred.
event Transfer(address indexed src, address indexed dst, uint256 wad);
/// @notice Emitted when a deposit is made.
/// @param dst The address that deposited the WETH.
/// @param wad The amount of WETH that was deposited.
event Deposit(address indexed dst, uint256 wad);
/// @notice Emitted when a withdrawal is made.
/// @param src The address that withdrew the WETH.
/// @param wad The amount of WETH that was withdrawn.
event Withdrawal(address indexed src, uint256 wad);
/// @notice Returns the name of the token.
/// @return The name of the token.
function name() external pure returns (string memory);
/// @notice Returns the symbol of the token.
/// @return The symbol of the token.
function symbol() external pure returns (string memory);
/// @notice Returns the number of decimals the token uses.
/// @return The number of decimals the token uses.
function decimals() external pure returns (uint8);
/// @notice Returns the balance of the given address.
/// @param owner The address to query the balance of.
/// @return The balance of the given address.
function balanceOf(address owner) external view returns (uint256);
/// @notice Returns the amount of WETH that the spender can transfer on behalf of the owner.
/// @param owner The address that owns the WETH.
/// @param spender The address that is approved to transfer the WETH.
/// @return The amount of WETH that the spender can transfer on behalf of the owner.
function allowance(address owner, address spender) external view returns (uint256);
/// @notice Allows WETH to be deposited by sending ether to the contract.
function deposit() external payable;
/// @notice Withdraws an amount of ETH.
/// @param wad The amount of ETH to withdraw.
function withdraw(uint256 wad) external;
/// @notice Returns the total supply of WETH.
/// @return The total supply of WETH.
function totalSupply() external view returns (uint256);
/// @notice Approves the given address to transfer the WETH on behalf of the caller.
/// @param guy The address that is approved to transfer the WETH.
/// @param wad The amount that is approved to transfer.
/// @return True if the approval was successful.
function approve(address guy, uint256 wad) external returns (bool);
/// @notice Transfers the given amount of WETH to the given address.
/// @param dst The address to transfer the WETH to.
/// @param wad The amount of WETH to transfer.
/// @return True if the transfer was successful.
function transfer(address dst, uint256 wad) external returns (bool);
/// @notice Transfers the given amount of WETH from the given address to the given address.
/// @param src The address to transfer the WETH from.
/// @param dst The address to transfer the WETH to.
/// @param wad The amount of WETH to transfer.
/// @return True if the transfer was successful.
function transferFrom(address src, address dst, uint256 wad) external returns (bool);
}
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import { ISemver } from "src/universal/ISemver.sol";
import { IDelayedWETH } from "src/dispute/interfaces/IDelayedWETH.sol";
import { IWETH } from "src/dispute/interfaces/IWETH.sol";
import { WETH98 } from "src/dispute/weth/WETH98.sol";
import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
/// @title DelayedWETH
/// @notice DelayedWETH is an extension to WETH9 that allows for delayed withdrawals. Accounts must
/// trigger an unlock function before they can withdraw WETH. Accounts must trigger unlock
/// by specifying a sub-account and an amount of WETH to unlock. Accounts can trigger the
/// unlock function at any time, but must wait a delay period before they can withdraw
/// after the unlock function is triggered. DelayedWETH is designed to be used by the
/// DisputeGame contracts where unlock will only be triggered after a dispute is resolved.
/// DelayedWETH is meant to sit behind a proxy contract and has an owner address that can
/// pull WETH from any account and can recover ETH from the contract itself. Variable and
/// function naming vaguely follows the vibe of WETH9. Not the prettiest contract in the
/// world, but it gets the job done.
contract DelayedWETH is OwnableUpgradeable, WETH98, IDelayedWETH, ISemver {
/// @notice Semantic version.
/// @custom:semver 0.2.0
string public constant version = "0.2.0";
/// @inheritdoc IDelayedWETH
mapping(address => mapping(address => WithdrawalRequest)) public withdrawals;
/// @notice Withdrawal delay in seconds.
uint256 internal immutable DELAY_SECONDS;
/// @notice Address of the SuperchainConfig contract.
SuperchainConfig public config;
/// @param _delay The delay for withdrawals in seconds.
constructor(uint256 _delay) {
DELAY_SECONDS = _delay;
initialize({ _owner: address(0), _config: SuperchainConfig(address(0)) });
}
/// @notice Initializes the contract.
/// @param _owner The address of the owner.
/// @param _config Address of the SuperchainConfig contract.
function initialize(address _owner, SuperchainConfig _config) public initializer {
__Ownable_init();
_transferOwnership(_owner);
config = _config;
}
/// @inheritdoc IDelayedWETH
function delay() external view returns (uint256) {
return DELAY_SECONDS;
}
/// @inheritdoc IDelayedWETH
function unlock(address _guy, uint256 _wad) external {
// Note that the unlock function can be called by any address, but the actual unlocking
// capability still only gives the msg.sender the ability to withdraw from the account.
// As long as the unlock and withdraw functions are called with the proper recipient
// addresses, this will be safe. Could be made safer by having external accounts execute
// withdrawals themselves but that would have added extra complexity and made DelayedWETH
// a leaky abstraction, so we chose this instead.
require(!config.paused(), "DelayedWETH: contract is paused");
WithdrawalRequest storage wd = withdrawals[msg.sender][_guy];
wd.timestamp = block.timestamp;
wd.amount += _wad;
}
/// @inheritdoc IWETH
function withdraw(uint256 _wad) public override(WETH98, IWETH) {
withdraw(msg.sender, _wad);
}
/// @inheritdoc IDelayedWETH
function withdraw(address _guy, uint256 _wad) public {
require(!config.paused(), "DelayedWETH: contract is paused");
WithdrawalRequest storage wd = withdrawals[msg.sender][_guy];
require(wd.amount >= _wad, "DelayedWETH: insufficient unlocked withdrawal");
require(wd.timestamp > 0, "DelayedWETH: withdrawal not unlocked");
require(wd.timestamp + DELAY_SECONDS <= block.timestamp, "DelayedWETH: withdrawal delay not met");
wd.amount -= _wad;
super.withdraw(_wad);
}
/// @inheritdoc IDelayedWETH
function recover(uint256 _wad) external {
require(msg.sender == owner(), "DelayedWETH: not owner");
require(address(this).balance >= _wad, "DelayedWETH: insufficient balance");
payable(msg.sender).transfer(_wad);
}
/// @inheritdoc IDelayedWETH
function hold(address _guy, uint256 _wad) external {
require(msg.sender == owner(), "DelayedWETH: not owner");
allowance[msg.sender][_guy] = _wad;
emit Approval(msg.sender, _guy, _wad);
}
}
// Copyright (C) 2015, 2016, 2017 Dapphub
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// Based on WETH9 by Dapphub.
// Modified by OP Labs.
pragma solidity 0.8.15;
import { IWETH } from "src/dispute/interfaces/IWETH.sol";
/// @title WETH98
/// @notice WETH98 is a version of WETH9 upgraded for Solidity 0.8.x.
contract WETH98 is IWETH {
string public constant name = "Wrapped Ether";
string public constant symbol = "WETH";
uint8 public constant decimals = 18;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
/// @notice Pipes to deposit.
receive() external payable {
deposit();
}
/// @inheritdoc IWETH
function deposit() public payable {
balanceOf[msg.sender] += msg.value;
emit Deposit(msg.sender, msg.value);
}
/// @inheritdoc IWETH
function withdraw(uint256 wad) public virtual {
require(balanceOf[msg.sender] >= wad);
balanceOf[msg.sender] -= wad;
payable(msg.sender).transfer(wad);
emit Withdrawal(msg.sender, wad);
}
/// @inheritdoc IWETH
function totalSupply() external view returns (uint256) {
return address(this).balance;
}
/// @inheritdoc IWETH
function approve(address guy, uint256 wad) external returns (bool) {
allowance[msg.sender][guy] = wad;
emit Approval(msg.sender, guy, wad);
return true;
}
/// @inheritdoc IWETH
function transfer(address dst, uint256 wad) external returns (bool) {
return transferFrom(msg.sender, dst, wad);
}
/// @inheritdoc IWETH
function transferFrom(address src, address dst, uint256 wad) public returns (bool) {
require(balanceOf[src] >= wad);
if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) {
require(allowance[src][msg.sender] >= wad);
allowance[src][msg.sender] -= wad;
}
balanceOf[src] -= wad;
balanceOf[dst] += wad;
emit Transfer(src, dst, wad);
return true;
}
}
......@@ -30,6 +30,9 @@ error AlreadyInitialized();
/// @notice Thrown when a supplied bond is too low to cover the cost of the interaction.
error InsufficientBond();
/// @notice Thrown when a credit claim is attempted for a value of 0.
error NoCreditToClaim();
/// @notice Thrown when the transfer of credit to a recipient account reverts.
error BondTransferFailed();
......
......@@ -334,9 +334,11 @@ contract OptimismPortal2_FinalizeWithdrawal_Test is CommonTest {
function setUp() public override {
_proposedBlockNumber = 0xFF;
game = FaultDisputeGame(
address(
disputeGameFactory.create(
optimismPortal2.respectedGameType(), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber)
payable(
address(
disputeGameFactory.create(
optimismPortal2.respectedGameType(), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber)
)
)
)
);
......
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import { console } from "forge-std/console.sol";
// Testing utilities
import { Bridge_Initializer } from "test/setup/Bridge_Initializer.sol";
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
import "src/libraries/DisputeTypes.sol";
import "src/libraries/DisputeErrors.sol";
import { Test } from "forge-std/Test.sol";
import { DisputeGameFactory, IDisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
import { IDisputeGame } from "src/dispute/interfaces/IDisputeGame.sol";
import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol";
import { Proxy } from "src/universal/Proxy.sol";
import { CommonTest } from "test/setup/CommonTest.sol";
contract DelayedWETH_Init is CommonTest {
event Approval(address indexed src, address indexed guy, uint256 wad);
event Transfer(address indexed src, address indexed dst, uint256 wad);
event Deposit(address indexed dst, uint256 wad);
event Withdrawal(address indexed src, uint256 wad);
event Unwrap(address indexed src, uint256 wad);
function setUp() public virtual override {
super.enableFaultProofs();
super.setUp();
// Transfer ownership of delayed WETH to the test contract.
vm.prank(deploy.mustGetAddress("SystemOwnerSafe"));
delayedWeth.transferOwnership(address(this));
}
}
contract DelayedWETH_Initialize_Test is DelayedWETH_Init {
/// @dev Tests that initialization is successful.
function test_initialize_succeeds() public {
assertEq(delayedWeth.owner(), address(this));
assertEq(address(delayedWeth.config()), address(superchainConfig));
}
}
contract DelayedWETH_Unlock_Test is DelayedWETH_Init {
/// @dev Tests that unlocking once is successful.
function test_unlock_once_succeeds() public {
delayedWeth.unlock(alice, 1 ether);
(uint256 amount, uint256 timestamp) = delayedWeth.withdrawals(address(this), alice);
assertEq(amount, 1 ether);
assertEq(timestamp, block.timestamp);
}
/// @dev TEsts that unlocking twice is successful and timestamp/amount is updated.
function test_unlock_twice_succeeds() public {
// Unlock once.
uint256 ts = block.timestamp;
delayedWeth.unlock(alice, 1 ether);
(uint256 amount1, uint256 timestamp1) = delayedWeth.withdrawals(address(this), alice);
assertEq(amount1, 1 ether);
assertEq(timestamp1, ts);
// Go forward in time.
vm.warp(ts + 1);
// Unlock again works.
delayedWeth.unlock(alice, 1 ether);
(uint256 amount2, uint256 timestamp2) = delayedWeth.withdrawals(address(this), alice);
assertEq(amount2, 2 ether);
assertEq(timestamp2, ts + 1);
}
/// @dev Tests that unlocking while paused fails.
function test_unlock_whilePaused_fails() public {
// Pause the contract.
address guardian = optimismPortal.GUARDIAN();
vm.prank(guardian);
superchainConfig.pause("identifier");
// Unlock fails.
vm.expectRevert("DelayedWETH: contract is paused");
delayedWeth.unlock(alice, 1 ether);
}
}
contract DelayedWETH_Withdraw_Test is DelayedWETH_Init {
/// @dev Tests that withdrawing while unlocked and delay has passed is successful.
function test_withdraw_whileUnlocked_succeeds() public {
// Deposit some WETH.
vm.prank(alice);
delayedWeth.deposit{ value: 1 ether }();
uint256 balance = address(alice).balance;
// Unlock the withdrawal.
vm.prank(alice);
delayedWeth.unlock(alice, 1 ether);
// Wait for the delay.
vm.warp(block.timestamp + delayedWeth.delay() + 1);
// Withdraw the WETH.
vm.expectEmit(true, true, false, false);
emit Withdrawal(address(alice), 1 ether);
vm.prank(alice);
delayedWeth.withdraw(alice, 1 ether);
assertEq(address(alice).balance, balance + 1 ether);
}
/// @dev Tests that withdrawing when unlock was not called fails.
function test_withdraw_whileLocked_fails() public {
// Deposit some WETH.
vm.prank(alice);
delayedWeth.deposit{ value: 1 ether }();
uint256 balance = address(alice).balance;
// Withdraw fails when unlock not called.
vm.expectRevert("DelayedWETH: withdrawal not unlocked");
vm.prank(alice);
delayedWeth.withdraw(alice, 0 ether);
assertEq(address(alice).balance, balance);
}
/// @dev Tests that withdrawing while locked and delay has not passed fails.
function test_withdraw_whileLockedNotLongEnough_fails() public {
// Deposit some WETH.
vm.prank(alice);
delayedWeth.deposit{ value: 1 ether }();
uint256 balance = address(alice).balance;
// Call unlock.
vm.prank(alice);
delayedWeth.unlock(alice, 1 ether);
// Wait for the delay, but not long enough.
vm.warp(block.timestamp + delayedWeth.delay() - 1);
// Withdraw fails when delay not met.
vm.expectRevert("DelayedWETH: withdrawal delay not met");
vm.prank(alice);
delayedWeth.withdraw(alice, 1 ether);
assertEq(address(alice).balance, balance);
}
/// @dev Tests that withdrawing more than unlocked amount fails.
function test_withdraw_tooMuch_fails() public {
// Deposit some WETH.
vm.prank(alice);
delayedWeth.deposit{ value: 1 ether }();
uint256 balance = address(alice).balance;
// Unlock the withdrawal.
vm.prank(alice);
delayedWeth.unlock(alice, 1 ether);
// Wait for the delay.
vm.warp(block.timestamp + delayedWeth.delay() + 1);
// Withdraw too much fails.
vm.expectRevert("DelayedWETH: insufficient unlocked withdrawal");
vm.prank(alice);
delayedWeth.withdraw(alice, 2 ether);
assertEq(address(alice).balance, balance);
}
/// @dev Tests that withdrawing while paused fails.
function test_withdraw_whenPaused_fails() public {
// Deposit some WETH.
vm.prank(alice);
delayedWeth.deposit{ value: 1 ether }();
// Unlock the withdrawal.
vm.prank(alice);
delayedWeth.unlock(alice, 1 ether);
// Wait for the delay.
vm.warp(block.timestamp + delayedWeth.delay() + 1);
// Pause the contract.
address guardian = optimismPortal.GUARDIAN();
vm.prank(guardian);
superchainConfig.pause("identifier");
// Withdraw fails.
vm.expectRevert("DelayedWETH: contract is paused");
vm.prank(alice);
delayedWeth.withdraw(alice, 1 ether);
}
}
contract DelayedWETH_Recover_Test is DelayedWETH_Init {
/// @dev Tests that recovering WETH succeeds.
function test_recover_succeeds() public {
delayedWeth.transferOwnership(alice);
// Give the contract some WETH to recover.
vm.deal(address(delayedWeth), 1 ether);
// Record the initial balance.
uint256 initialBalance = address(alice).balance;
// Recover the WETH.
vm.prank(alice);
delayedWeth.recover(1 ether);
// Verify the WETH was recovered.
assertEq(address(delayedWeth).balance, 0);
assertEq(address(alice).balance, initialBalance + 1 ether);
}
/// @dev Tests that recovering WETH by non-owner fails.
function test_recover_byNonOwner_fails() public {
vm.prank(alice);
vm.expectRevert("DelayedWETH: not owner");
delayedWeth.recover(1 ether);
}
/// @dev Tests that recovering more than the balance fails.
function test_recover_moreThanBalance_fails() public {
vm.deal(address(delayedWeth), 0.5 ether);
vm.expectRevert("DelayedWETH: insufficient balance");
delayedWeth.recover(1 ether);
}
}
contract DelayedWETH_Hold_Test is DelayedWETH_Init {
/// @dev Tests that holding WETH succeeds.
function test_hold_succeeds() public {
uint256 amount = 1 ether;
vm.expectEmit(true, true, true, false);
emit Approval(address(this), alice, amount);
delayedWeth.hold(alice, amount);
assertEq(delayedWeth.allowance(address(this), alice), amount);
}
/// @dev Tests that holding WETH by non-owner fails.
function test_hold_byNonOwner_fails() public {
vm.prank(alice);
vm.expectRevert("DelayedWETH: not owner");
delayedWeth.hold(bob, 1 ether);
}
}
......@@ -6,6 +6,7 @@ import { Vm } from "forge-std/Vm.sol";
import { DisputeGameFactory_Init } from "test/dispute/DisputeGameFactory.t.sol";
import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol";
import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol";
import { PreimageOracle } from "src/cannon/PreimageOracle.sol";
import "src/libraries/DisputeTypes.sol";
......@@ -57,12 +58,13 @@ contract FaultDisputeGame_Init is DisputeGameFactory_Init {
_maxGameDepth: 2 ** 3,
_splitDepth: 2 ** 2,
_gameDuration: Duration.wrap(7 days),
_vm: _vm
_vm: _vm,
_weth: delayedWeth
});
// Register the game implementation with the factory.
disputeGameFactory.setImplementation(GAME_TYPE, gameImpl);
// Create a new game.
gameProxy = FaultDisputeGame(address(disputeGameFactory.create(GAME_TYPE, rootClaim, extraData)));
gameProxy = FaultDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, rootClaim, extraData))));
// Check immutables
assertEq(gameProxy.gameType().raw(), GAME_TYPE.raw());
......@@ -130,7 +132,8 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
_maxGameDepth: 2 ** 3,
_splitDepth: _splitDepth,
_gameDuration: Duration.wrap(7 days),
_vm: alphabetVM
_vm: alphabetVM,
_weth: DelayedWETH(payable(address(0)))
});
}
......@@ -174,7 +177,8 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
Claim claim = _dummyClaim();
vm.expectRevert(abi.encodeWithSelector(UnexpectedRootClaim.selector, claim));
gameProxy = FaultDisputeGame(address(disputeGameFactory.create(GAME_TYPE, claim, abi.encode(_blockNumber))));
gameProxy =
FaultDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, claim, abi.encode(_blockNumber)))));
}
/// @dev Tests that the proxy receives ETH from the dispute game factory.
......@@ -183,9 +187,11 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
vm.deal(address(this), _value);
assertEq(address(gameProxy).balance, 0);
gameProxy =
FaultDisputeGame(address(disputeGameFactory.create{ value: _value }(GAME_TYPE, ROOT_CLAIM, abi.encode(1))));
assertEq(address(gameProxy).balance, _value);
gameProxy = FaultDisputeGame(
payable(address(disputeGameFactory.create{ value: _value }(GAME_TYPE, ROOT_CLAIM, abi.encode(1))))
);
assertEq(address(gameProxy).balance, 0);
assertEq(delayedWeth.balanceOf(address(gameProxy)), _value);
}
/// @dev Tests that the game cannot be initialized with extra data > 64 bytes long (root claim + l2 block number
......@@ -207,7 +213,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
Claim claim = _dummyClaim();
vm.expectRevert(abi.encodeWithSelector(ExtraDataTooLong.selector));
gameProxy = FaultDisputeGame(address(disputeGameFactory.create(GAME_TYPE, claim, _extraData)));
gameProxy = FaultDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, claim, _extraData))));
}
/// @dev Tests that the game is initialized with the correct data.
......@@ -571,6 +577,10 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
assertEq(address(this).balance, 0);
gameProxy.resolveClaim(1);
// Wait for the withdrawal delay.
vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
gameProxy.claimCredit(address(this));
assertEq(address(this).balance, MIN_BOND);
......@@ -597,6 +607,10 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
// Resolve to claim bond
uint256 balanceBefore = address(this).balance;
gameProxy.resolveClaim(8);
// Wait for the withdrawal delay.
vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
gameProxy.claimCredit(address(this));
assertEq(address(this).balance, balanceBefore + MIN_BOND);
......@@ -640,7 +654,8 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
// Ensure we bonded the correct amounts
uint256 bonded = (gameProxy.claimDataLen() - 1) * 1 ether;
assertEq(address(this).balance, 100 ether - bonded);
assertEq(address(gameProxy).balance, bonded);
assertEq(address(gameProxy).balance, 0);
assertEq(delayedWeth.balanceOf(address(gameProxy)), bonded);
// Resolve all claims
vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
......@@ -650,11 +665,15 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
}
gameProxy.resolve();
// Wait for the withdrawal delay.
vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
gameProxy.claimCredit(address(this));
// Ensure that bonds were paid out correctly.
assertEq(address(this).balance, 100 ether);
assertEq(address(gameProxy).balance, 0);
assertEq(delayedWeth.balanceOf(address(gameProxy)), 0);
// Ensure that the init bond for the game is 0, in case we change it in the test suite in the future.
assertEq(disputeGameFactory.initBonds(GAME_TYPE), 0);
......@@ -700,7 +719,8 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
uint256 bonded = ((gameProxy.claimDataLen() - 1) / 2) * 1 ether;
assertEq(address(this).balance, 100 ether - bonded);
assertEq(bob.balance, 100 ether - bonded);
assertEq(address(gameProxy).balance, bonded * 2);
assertEq(address(gameProxy).balance, 0);
assertEq(delayedWeth.balanceOf(address(gameProxy)), bonded * 2);
// Resolve all claims
vm.warp(block.timestamp + 3 days + 12 hours + 1 seconds);
......@@ -710,13 +730,20 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
}
gameProxy.resolve();
// Wait for the withdrawal delay.
vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
gameProxy.claimCredit(address(this));
// Bob's claim should revert since it's value is 0
vm.expectRevert(NoCreditToClaim.selector);
gameProxy.claimCredit(bob);
// Ensure that bonds were paid out correctly.
assertEq(address(this).balance, 100 ether + bonded);
assertEq(bob.balance, 100 ether - bonded);
assertEq(address(gameProxy).balance, 0);
assertEq(delayedWeth.balanceOf(address(gameProxy)), 0);
// Ensure that the init bond for the game is 0, in case we change it in the test suite in the future.
assertEq(disputeGameFactory.initBonds(GAME_TYPE), 0);
......@@ -756,9 +783,15 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
}
gameProxy.resolve();
// Wait for the withdrawal delay.
vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
gameProxy.claimCredit(address(this));
gameProxy.claimCredit(alice);
gameProxy.claimCredit(bob);
// Charlie's claim should revert since it's value is 0
vm.expectRevert(NoCreditToClaim.selector);
gameProxy.claimCredit(charlie);
// Ensure that bonds were paid out correctly.
......@@ -776,7 +809,7 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
/// @dev Static unit test asserting that credit may not be drained past allowance through reentrancy.
function test_claimCredit_claimAlreadyResolved_reverts() public {
ClaimCreditReenter reenter = new ClaimCreditReenter(gameProxy);
ClaimCreditReenter reenter = new ClaimCreditReenter(gameProxy, vm);
vm.startPrank(address(reenter));
// Give the test contract some ether to bond.
......@@ -794,8 +827,10 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
// Ensure that we bonded all the test contract's ETH
assertEq(address(reenter).balance, 0);
// Ensure the game proxy has 1 + 2 * MIN_BOND, 2*MIN_BOND from bonding and 1 unregistered.
assertEq(address(gameProxy).balance, 1 ether + MIN_BOND * 2);
// Ensure the game proxy has 1 ether in it.
assertEq(address(gameProxy).balance, 1 ether);
// Ensure the game has a balance of 2 * MIN_BOND in the delayedWeth contract.
assertEq(delayedWeth.balanceOf(address(gameProxy)), MIN_BOND * 2);
// Resolve the claim at gindex 1 and claim the reenter contract's credit.
gameProxy.resolveClaim(1);
......@@ -803,15 +838,20 @@ contract FaultDisputeGame_Test is FaultDisputeGame_Init {
// Ensure that the game registered the `reenter` contract's credit.
assertEq(gameProxy.credit(address(reenter)), MIN_BOND);
// Wait for the withdrawal delay.
vm.warp(block.timestamp + delayedWeth.delay() + 1 seconds);
// Initiate the reentrant credit claim.
reenter.claimCredit(address(reenter));
// The reenter contract should have performed 5 calls to `claimCredit`, but only received the amount bonded for
// the gindex 1 subgame.
// The reenter contract should have performed 2 calls to `claimCredit`.
// Once all the credit is claimed, all subsequent calls will revert since there is 0 credit left to claim.
// The claimant must only have received the amount bonded for the gindex 1 subgame.
// The root claim bond and the unregistered ETH should still exist in the game proxy.
assertEq(reenter.numCalls(), 5);
assertEq(reenter.numCalls(), 2);
assertEq(address(reenter).balance, MIN_BOND);
assertEq(address(gameProxy).balance, 1 ether + MIN_BOND);
assertEq(address(gameProxy).balance, 1 ether);
assertEq(delayedWeth.balanceOf(address(gameProxy)), MIN_BOND);
vm.stopPrank();
}
......@@ -1478,15 +1518,20 @@ contract FaultDispute_1v1_Actors_Test is FaultDisputeGame_Init {
}
contract ClaimCreditReenter {
Vm internal immutable vm;
FaultDisputeGame internal immutable GAME;
uint256 public numCalls;
constructor(FaultDisputeGame _gameProxy) {
constructor(FaultDisputeGame _gameProxy, Vm _vm) {
GAME = _gameProxy;
vm = _vm;
}
function claimCredit(address _recipient) public {
numCalls += 1;
if (numCalls > 1) {
vm.expectRevert(NoCreditToClaim.selector);
}
GAME.claimCredit(_recipient);
}
......
......@@ -6,6 +6,7 @@ import { Vm } from "forge-std/Vm.sol";
import { DisputeGameFactory_Init } from "test/dispute/DisputeGameFactory.t.sol";
import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
import { PermissionedDisputeGame } from "src/dispute/PermissionedDisputeGame.sol";
import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol";
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { PreimageOracle } from "src/cannon/PreimageOracle.sol";
import { PreimageKeyLib } from "src/cannon/PreimageKeyLib.sol";
......@@ -55,6 +56,9 @@ contract PermissionedDisputeGame_Init is DisputeGameFactory_Init {
AlphabetVM _vm = new AlphabetVM(absolutePrestate, new PreimageOracle(0, 0, 0));
// Use a 7 day delayed WETH to simulate withdrawals.
DelayedWETH _weth = new DelayedWETH(7 days);
// Deploy an implementation of the fault game
gameImpl = new PermissionedDisputeGame({
_gameType: GAME_TYPE,
......@@ -65,6 +69,7 @@ contract PermissionedDisputeGame_Init is DisputeGameFactory_Init {
_splitDepth: 2 ** 2,
_gameDuration: Duration.wrap(7 days),
_vm: _vm,
_weth: _weth,
_proposer: PROPOSER,
_challenger: CHALLENGER
});
......@@ -72,7 +77,8 @@ contract PermissionedDisputeGame_Init is DisputeGameFactory_Init {
disputeGameFactory.setImplementation(GAME_TYPE, gameImpl);
// Create a new game.
vm.prank(PROPOSER, PROPOSER);
gameProxy = PermissionedDisputeGame(address(disputeGameFactory.create(GAME_TYPE, rootClaim, extraData)));
gameProxy =
PermissionedDisputeGame(payable(address(disputeGameFactory.create(GAME_TYPE, rootClaim, extraData))));
// Check immutables
assertEq(gameProxy.gameType().raw(), GAME_TYPE.raw());
......
......@@ -7,6 +7,7 @@ import { FaultDisputeGame } from "src/dispute/FaultDisputeGame.sol";
import { FaultDisputeGame_Init } from "test/dispute/FaultDisputeGame.t.sol";
import "src/libraries/DisputeTypes.sol";
import "src/libraries/DisputeErrors.sol";
contract FaultDisputeGame_Solvency_Invariant is FaultDisputeGame_Init {
Claim internal constant ROOT_CLAIM = Claim.wrap(bytes32(uint256(10)));
......@@ -46,8 +47,22 @@ contract FaultDisputeGame_Solvency_Invariant is FaultDisputeGame_Init {
}
gameProxy.resolve();
gameProxy.claimCredit(address(this));
gameProxy.claimCredit(address(actor));
// Wait for the withdrawal delay.
vm.warp(block.timestamp + 7 days + 1 seconds);
if (gameProxy.credit(address(this)) == 0) {
vm.expectRevert(NoCreditToClaim.selector);
gameProxy.claimCredit(address(this));
} else {
gameProxy.claimCredit(address(this));
}
if (gameProxy.credit(address(actor)) == 0) {
vm.expectRevert(NoCreditToClaim.selector);
gameProxy.claimCredit(address(actor));
} else {
gameProxy.claimCredit(address(actor));
}
if (gameProxy.status() == GameStatus.DEFENDER_WINS) {
assertEq(address(this).balance, type(uint96).max);
......
......@@ -116,9 +116,11 @@ contract OptimismPortal2_Invariant_Harness is CommonTest {
// Create a dispute game with the output root we've proposed.
_proposedBlockNumber = 0xFF;
FaultDisputeGame game = FaultDisputeGame(
address(
disputeGameFactory.create(
optimismPortal2.respectedGameType(), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber)
payable(
address(
disputeGameFactory.create(
optimismPortal2.respectedGameType(), Claim.wrap(_outputRoot), abi.encode(_proposedBlockNumber)
)
)
)
);
......
......@@ -19,6 +19,7 @@ import { FeeVault } from "src/universal/FeeVault.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol";
import { OptimismPortal2 } from "src/L1/OptimismPortal2.sol";
import { DisputeGameFactory } from "src/dispute/DisputeGameFactory.sol";
import { DelayedWETH } from "src/dispute/weth/DelayedWETH.sol";
import { L1CrossDomainMessenger } from "src/L1/L1CrossDomainMessenger.sol";
import { DeployConfig } from "scripts/DeployConfig.s.sol";
import { Deploy } from "scripts/Deploy.s.sol";
......@@ -50,6 +51,7 @@ contract Setup {
OptimismPortal optimismPortal;
OptimismPortal2 optimismPortal2;
DisputeGameFactory disputeGameFactory;
DelayedWETH delayedWeth;
L2OutputOracle l2OutputOracle;
SystemConfig systemConfig;
L1StandardBridge l1StandardBridge;
......@@ -101,6 +103,7 @@ contract Setup {
optimismPortal = OptimismPortal(deploy.mustGetAddress("OptimismPortalProxy"));
optimismPortal2 = OptimismPortal2(deploy.mustGetAddress("OptimismPortalProxy"));
disputeGameFactory = DisputeGameFactory(deploy.mustGetAddress("DisputeGameFactoryProxy"));
delayedWeth = DelayedWETH(deploy.mustGetAddress("DelayedWETHProxy"));
l2OutputOracle = L2OutputOracle(deploy.mustGetAddress("L2OutputOracleProxy"));
systemConfig = SystemConfig(deploy.mustGetAddress("SystemConfigProxy"));
l1StandardBridge = L1StandardBridge(deploy.mustGetAddress("L1StandardBridgeProxy"));
......@@ -118,6 +121,8 @@ contract Setup {
vm.label(deploy.mustGetAddress("OptimismPortalProxy"), "OptimismPortalProxy");
vm.label(address(disputeGameFactory), "DisputeGameFactory");
vm.label(deploy.mustGetAddress("DisputeGameFactoryProxy"), "DisputeGameFactoryProxy");
vm.label(address(delayedWeth), "DelayedWETH");
vm.label(deploy.mustGetAddress("DelayedWETHProxy"), "DelayedWETHProxy");
vm.label(address(systemConfig), "SystemConfig");
vm.label(deploy.mustGetAddress("SystemConfigProxy"), "SystemConfigProxy");
vm.label(address(l1StandardBridge), "L1StandardBridge");
......
......@@ -6,6 +6,7 @@ import { Executables } from "scripts/Executables.sol";
import { CrossDomainMessenger } from "src/universal/CrossDomainMessenger.sol";
import { L2OutputOracle } from "src/L1/L2OutputOracle.sol";
import { SystemConfig } from "src/L1/SystemConfig.sol";
import { SuperchainConfig } from "src/L1/SuperchainConfig.sol";
import { ResourceMetering } from "src/L1/ResourceMetering.sol";
import { OptimismPortal } from "src/L1/OptimismPortal.sol";
import "src/L1/ProtocolVersions.sol";
......@@ -85,6 +86,22 @@ contract Initializer_Test is Bridge_Initializer {
initializedSlotVal: deploy.loadInitializedSlot("DisputeGameFactoryProxy")
})
);
// DelayedWETHImpl
contracts.push(
InitializeableContract({
target: deploy.mustGetAddress("DelayedWETH"),
initCalldata: abi.encodeCall(delayedWeth.initialize, (address(0), SuperchainConfig(address(0)))),
initializedSlotVal: deploy.loadInitializedSlot("DelayedWETH")
})
);
// DelayedWETHProxy
contracts.push(
InitializeableContract({
target: address(delayedWeth),
initCalldata: abi.encodeCall(delayedWeth.initialize, (address(0), SuperchainConfig(address(0)))),
initializedSlotVal: deploy.loadInitializedSlot("DelayedWETHProxy")
})
);
// L2OutputOracleImpl
contracts.push(
InitializeableContract({
......@@ -314,9 +331,9 @@ contract Initializer_Test is Bridge_Initializer {
/// 3. The `initialize()` function of each contract cannot be called more than once.
function test_cannotReinitialize_succeeds() public {
// Ensure that all L1, L2 `Initializable` contracts are accounted for, in addition to
// OptimismMintableERC20FactoryImpl, OptimismMintableERC20FactoryProxy, OptimismPortal2, DisputeGameFactoryImpl
// and DisputeGameFactoryProxy
assertEq(_getNumInitializable() + 3, contracts.length);
// OptimismMintableERC20FactoryImpl, OptimismMintableERC20FactoryProxy, OptimismPortal2,
// DisputeGameFactoryImpl, DisputeGameFactoryProxy, DelayedWETHImpl, DelayedWETHProxy.
assertEq(_getNumInitializable() + 5, contracts.length);
// Attempt to re-initialize all contracts within the `contracts` array.
for (uint256 i; i < contracts.length; i++) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment