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

Naming improvements in Oracle (#2990)

* style(ctb): Rename append to propose
Please enter the commit message for your changes. Lines starting

* style(ctb): Use output root for bytes32

This is more accurate than saying 'L2 output' which is better
applied to the full unhashed data structure

* style(ctb): Rename sequencer to proposer in oracle
Co-authored-by: default avatarmergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
parent 1487cf60
---
'@eth-optimism/contracts-bedrock': patch
---
Naming improvements for functions and variables in the L2OutputOracle
......@@ -36,8 +36,8 @@ type L2OutputOracleOutputProposal struct {
// L2OutputOracleMetaData contains all meta data concerning the L2OutputOracle contract.
var L2OutputOracleMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionInterval\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_genesisL2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_historicalTotalBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sequencer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"l2Output\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l1Timestamp\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"L2OutputAppended\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"l2Output\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l1Timestamp\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"L2OutputDeleted\",\"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\":\"previousSequencer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newSequencer\",\"type\":\"address\"}],\"name\":\"SequencerChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"HISTORICAL_TOTAL_BLOCKS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_BLOCK_TIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAJOR_VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINOR_VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PATCH_VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STARTING_BLOCK_NUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STARTING_TIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUBMISSION_INTERVAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_l2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_l1Blockhash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l1BlockNumber\",\"type\":\"uint256\"}],\"name\":\"appendL2Output\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newSequencer\",\"type\":\"address\"}],\"name\":\"changeSequencer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"computeL2Timestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"internalType\":\"structL2OutputOracle.OutputProposal\",\"name\":\"_proposal\",\"type\":\"tuple\"}],\"name\":\"deleteL2Output\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"getL2Output\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"internalType\":\"structL2OutputOracle.OutputProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_genesisL2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sequencer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sequencer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
Bin: "0x6101806040523480156200001257600080fd5b5060405162001e5538038062001e558339810160408190526200003591620005d6565b6000608081905260a052600160c052428310620000cb5760405162461bcd60e51b815260206004820152604360248201527f4f7574707574204f7261636c653a20496e697469616c204c3220626c6f636b2060448201527f74696d65206d757374206265206c657373207468616e2063757272656e742074606482015262696d6560e81b608482015260a4015b60405180910390fd5b60e0889052610100869052610120859052610140849052610160839052620000f68786848462000104565b505050505050505062000648565b6000620001126001620001cd565b905080156200012b576000805461ff0019166101001790555b6040805180820182528681524260208083019182526000888152606790915292909220905181559051600190910155606684905562000169620002e0565b620001748362000348565b6200017f82620004f6565b8015620001c6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60008054610100900460ff161562000262578160ff16600114801562000206575062000204306200054860201b620011f01760201c565b155b6200025a5760405162461bcd60e51b815260206004820152602e602482015260008051602062001e1583398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000c2565b506000919050565b60005460ff808416911610620002c15760405162461bcd60e51b815260206004820152602e602482015260008051602062001e1583398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000c2565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff166200033c5760405162461bcd60e51b815260206004820152602b602482015260008051602062001e3583398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c2565b6200034662000557565b565b6033546001600160a01b03163314620003a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000c2565b6001600160a01b038116620004145760405162461bcd60e51b815260206004820152602f60248201527f4f75747075744f7261636c653a206e65772073657175656e636572206973207460448201526e6865207a65726f206164647265737360881b6064820152608401620000c2565b6033546001600160a01b03828116911614156200049a5760405162461bcd60e51b815260206004820152603360248201527f4f75747075744f7261636c653a2073657175656e6365722063616e6e6f74206260448201527f652073616d6520617320746865206f776e6572000000000000000000000000006064820152608401620000c2565b6065546040516001600160a01b038084169216907f6ec88bae255aa7e73521c3beb17e9bc7940169e669440c5531733c0d2e91110d90600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03163b151590565b600054610100900460ff16620005b35760405162461bcd60e51b815260206004820152602b602482015260008051602062001e3583398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c2565b6200034633620004f6565b80516001600160a01b0381168114620002db57600080fd5b600080600080600080600080610100898b031215620005f457600080fd5b885197506020890151965060408901519550606089015194506080890151935060a089015192506200062960c08a01620005be565b91506200063960e08a01620005be565b90509295985092959890939650565b60805160a05160c05160e0516101005161012051610140516101605161173d620006d8600039600081816101750152610f0f0152600081816101de0152610f6801526000818161025b01528181610e390152610f33015260006103fd01526000818161028f01528181610776015261108f0152600061031501526000610431015260006104da015261173d6000f3fe60806040526004361061015e5760003560e01c8063715018a6116100c0578063d1de856c11610074578063dcec334811610059578063dcec334814610493578063f2fde38b146104a8578063f786becd146104c857600080fd5b8063d1de856c14610453578063d20b1a511461047357600080fd5b8063a25ae557116100a5578063a25ae55714610377578063a4771aad146103eb578063c8b915311461041f57600080fd5b8063715018a6146103375780638da5cb5b1461034c57600080fd5b80634599c78811610117578063529933df116100fc578063529933df1461027d5780635c1bba38146102b15780636bf2606a1461030357600080fd5b80634599c788146102335780634ab65d731461024957600080fd5b806320e9fcd41161014857806320e9fcd4146101cc57806325188104146102005780632af8ded81461021357600080fd5b80622134cc14610163578063093b3d90146101aa575b600080fd5b34801561016f57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b3480156101b657600080fd5b506101ca6101c5366004611548565b6104fc565b005b3480156101d857600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b6101ca61020e3660046115be565b6107a2565b34801561021f57600080fd5b506101ca61022e366004611614565b610b4b565b34801561023f57600080fd5b5061019760665481565b34801561025557600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b34801561028957600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b3480156102bd57600080fd5b506065546102de9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a1565b34801561030f57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b34801561034357600080fd5b506101ca610da8565b34801561035857600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166102de565b34801561038357600080fd5b506103d0610392366004611636565b604080518082019091526000808252602082015250600090815260676020908152604091829020825180840190935280548352600101549082015290565b604080518251815260209283015192810192909252016101a1565b3480156103f757600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b34801561042b57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b34801561045f57600080fd5b5061019761046e366004611636565b610e35565b34801561047f57600080fd5b506101ca61048e36600461164f565b610f92565b34801561049f57600080fd5b5061019761108b565b3480156104b457600080fd5b506101ca6104c3366004611614565b6110c0565b3480156104d457600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b60335473ffffffffffffffffffffffffffffffffffffffff163314610582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6066546000908152606760209081526040918290208251808401909352805480845260019091015491830191909152825114610666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605260248201527f4f75747075744f7261636c653a20546865206f757470757420726f6f7420746f60448201527f2064656c65746520646f6573206e6f74206d6174636820746865206c6174657360648201527f74206f75747075742070726f706f73616c2e0000000000000000000000000000608482015260a401610579565b8060200151826020015114610723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f4f75747075744f7261636c653a205468652074696d657374616d7020746f206460448201527f656c65746520646f6573206e6f74206d6174636820746865206c61746573742060648201527f6f75747075742070726f706f73616c2e00000000000000000000000000000000608482015260a401610579565b606654602082015182516040517f7320566fd5256cf8923648a5d9f560f1e92f1435a1bb32ddd1fe107f224ad35990600090a4606680546000908152606760205260408120818155600101555461079b907f0000000000000000000000000000000000000000000000000000000000000000906116c4565b6066555050565b60655473ffffffffffffffffffffffffffffffffffffffff163314610849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f75747075744f7261636c653a2063616c6c6572206973206e6f74207468652060448201527f73657175656e63657200000000000000000000000000000000000000000000006064820152608401610579565b61085161108b565b8314610905576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f75747075744f7261636c653a20426c6f636b206e756d626572206d7573742060448201527f626520657175616c20746f206e65787420657870656374656420626c6f636b2060648201527f6e756d6265722e00000000000000000000000000000000000000000000000000608482015260a401610579565b4261090f84610e35565b1061099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4f75747075744f7261636c653a2043616e6e6f7420617070656e64204c32206f60448201527f757470757420696e206675747572652e000000000000000000000000000000006064820152608401610579565b83610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4f75747075744f7261636c653a2043616e6e6f74207375626d697420656d707460448201527f79204c32206f75747075742e00000000000000000000000000000000000000006064820152608401610579565b8115610ae55781814014610ae5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f75747075744f7261636c653a20426c6f636b6861736820646f6573206e6f7460448201527f206d61746368207468652068617368206174207468652065787065637465642060648201527f6865696768742e00000000000000000000000000000000000000000000000000608482015260a401610579565b6040805180820182528581524260208083018281526000888152606790925284822093518455516001909301929092556066869055915185929187917fd6703ded1701060d9ae1793db76d594790a4e775781225f79b5aa8a77987c0809190a450505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610bcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b73ffffffffffffffffffffffffffffffffffffffff8116610c6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f75747075744f7261636c653a206e65772073657175656e636572206973207460448201527f6865207a65726f206164647265737300000000000000000000000000000000006064820152608401610579565b60335473ffffffffffffffffffffffffffffffffffffffff82811691161415610d1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4f75747075744f7261636c653a2073657175656e6365722063616e6e6f74206260448201527f652073616d6520617320746865206f776e6572000000000000000000000000006064820152608401610579565b60655460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f6ec88bae255aa7e73521c3beb17e9bc7940169e669440c5531733c0d2e91110d90600090a3606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60335473ffffffffffffffffffffffffffffffffffffffff163314610e29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b610e33600061120c565b565b60007f0000000000000000000000000000000000000000000000000000000000000000821015610f0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605660248201527f4f75747075744f7261636c653a20426c6f636b206e756d626572206d7573742060448201527f62652067726561746572207468616e206f7220657175616c20746f207468652060648201527f7374617274696e6720626c6f636b206e756d6265722e00000000000000000000608482015260a401610579565b7f0000000000000000000000000000000000000000000000000000000000000000610f587f0000000000000000000000000000000000000000000000000000000000000000846116c4565b610f6291906116db565b610f8c907f0000000000000000000000000000000000000000000000000000000000000000611718565b92915050565b6000610f9e6001611283565b90508015610fd357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6040805180820182528681524260208083019182526000888152606790915292909220905181559051600190910155606684905561100f61140e565b61101883610b4b565b6110218261120c565b801561108457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006066546110bb9190611718565b905090565b60335473ffffffffffffffffffffffffffffffffffffffff163314611141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610579565b73ffffffffffffffffffffffffffffffffffffffff81166111e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610579565b6111ed8161120c565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008054610100900460ff161561133a578160ff1660011480156112a65750303b155b611332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610579565b506000919050565b60005460ff8084169116106113d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610579565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b600054610100900460ff166114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610579565b610e33600054610100900460ff1661153f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610579565b610e333361120c565b60006040828403121561155a57600080fd5b6040516040810181811067ffffffffffffffff821117156115a4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604052823581526020928301359281019290925250919050565b600080600080608085870312156115d457600080fd5b5050823594602084013594506040840135936060013592509050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461140957600080fd5b60006020828403121561162657600080fd5b61162f826115f0565b9392505050565b60006020828403121561164857600080fd5b5035919050565b6000806000806080858703121561166557600080fd5b843593506020850135925061167c604086016115f0565b915061168a606086016115f0565b905092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156116d6576116d6611695565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561171357611713611695565b500290565b6000821982111561172b5761172b611695565b50019056fea164736f6c634300080a000a496e697469616c697a61626c653a20636f6e747261637420697320616c726561496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069",
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionInterval\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_genesisL2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_historicalTotalBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_proposer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l1Timestamp\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"OutputDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l1Timestamp\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"OutputProposed\",\"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\":\"previousProposer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newProposer\",\"type\":\"address\"}],\"name\":\"ProposerChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"HISTORICAL_TOTAL_BLOCKS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_BLOCK_TIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAJOR_VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINOR_VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PATCH_VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STARTING_BLOCK_NUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STARTING_TIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUBMISSION_INTERVAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newProposer\",\"type\":\"address\"}],\"name\":\"changeProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"computeL2Timestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"internalType\":\"structL2OutputOracle.OutputProposal\",\"name\":\"_proposal\",\"type\":\"tuple\"}],\"name\":\"deleteL2Output\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"getL2Output\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"internalType\":\"structL2OutputOracle.OutputProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_genesisL2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_proposer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_l1Blockhash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l1BlockNumber\",\"type\":\"uint256\"}],\"name\":\"proposeL2Output\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
Bin: "0x6101806040523480156200001257600080fd5b5060405162001e4538038062001e458339810160408190526200003591620005ca565b6000608081905260a052600160c052428310620000cb5760405162461bcd60e51b815260206004820152604360248201527f4f7574707574204f7261636c653a20496e697469616c204c3220626c6f636b2060448201527f74696d65206d757374206265206c657373207468616e2063757272656e742074606482015262696d6560e81b608482015260a4015b60405180910390fd5b60e0889052610100869052610120859052610140849052610160839052620000f68786848462000104565b50505050505050506200063c565b6000620001126001620001cd565b905080156200012b576000805461ff0019166101001790555b6040805180820182528681524260208083019182526000888152606790915292909220905181559051600190910155606684905562000169620002e0565b620001748362000348565b6200017f82620004ea565b8015620001c6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60008054610100900460ff161562000262578160ff16600114801562000206575062000204306200053c60201b620011ec1760201c565b155b6200025a5760405162461bcd60e51b815260206004820152602e602482015260008051602062001e0583398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000c2565b506000919050565b60005460ff808416911610620002c15760405162461bcd60e51b815260206004820152602e602482015260008051602062001e0583398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000c2565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff166200033c5760405162461bcd60e51b815260206004820152602b602482015260008051602062001e2583398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c2565b620003466200054b565b565b6033546001600160a01b03163314620003a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000c2565b6001600160a01b038116620004135760405162461bcd60e51b815260206004820152602e60248201527f4f75747075744f7261636c653a206e65772070726f706f73657220697320746860448201526d65207a65726f206164647265737360901b6064820152608401620000c2565b6033546001600160a01b03828116911614156200048e5760405162461bcd60e51b815260206004820152603260248201527f4f75747075744f7261636c653a2070726f706f7365722063616e6e6f742062656044820152711039b0b6b29030b9903a34329037bbb732b960711b6064820152608401620000c2565b6065546040516001600160a01b038084169216907f3d7728dc2838bb794606bd89f5a37930830b32060f69ee929bbfc59b669024dd90600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03163b151590565b600054610100900460ff16620005a75760405162461bcd60e51b815260206004820152602b602482015260008051602062001e2583398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c2565b6200034633620004ea565b80516001600160a01b0381168114620002db57600080fd5b600080600080600080600080610100898b031215620005e857600080fd5b885197506020890151965060408901519550606089015194506080890151935060a089015192506200061d60c08a01620005b2565b91506200062d60e08a01620005b2565b90509295985092959890939650565b60805160a05160c05160e05161010051610120516101405161016051611739620006cc600039600081816101750152610f0b0152600081816101de0152610f6401526000818161022801528181610e350152610f2f015260006103cc01526000818161025c01528181610772015261108b015260006102900152600061042d015260006104d601526117396000f3fe60806040526004361061015e5760003560e01c80639aaab648116100c0578063d1de856c11610074578063dcec334811610059578063dcec33481461048f578063f2fde38b146104a4578063f786becd146104c457600080fd5b8063d1de856c1461044f578063d20b1a511461046f57600080fd5b8063a4771aad116100a5578063a4771aad146103ba578063a8e4fb90146103ee578063c8b915311461041b57600080fd5b80639aaab64814610333578063a25ae5571461034657600080fd5b8063529933df11610117578063715018a6116100fc578063715018a6146102b257806372d5fe21146102c75780638da5cb5b146102e757600080fd5b8063529933df1461024a5780636bf2606a1461027e57600080fd5b806320e9fcd41161014857806320e9fcd4146101cc5780634599c788146102005780634ab65d731461021657600080fd5b80622134cc14610163578063093b3d90146101aa575b600080fd5b34801561016f57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b3480156101b657600080fd5b506101ca6101c5366004611544565b6104f8565b005b3480156101d857600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b34801561020c57600080fd5b5061019760665481565b34801561022257600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b34801561025657600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b34801561028a57600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b3480156102be57600080fd5b506101ca61079e565b3480156102d357600080fd5b506101ca6102e23660046115de565b61082b565b3480156102f357600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a1565b6101ca610341366004611600565b610a88565b34801561035257600080fd5b5061039f610361366004611632565b604080518082019091526000808252602082015250600090815260676020908152604091829020825180840190935280548352600101549082015290565b604080518251815260209283015192810192909252016101a1565b3480156103c657600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b3480156103fa57600080fd5b5060655461030e9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561042757600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b34801561045b57600080fd5b5061019761046a366004611632565b610e31565b34801561047b57600080fd5b506101ca61048a36600461164b565b610f8e565b34801561049b57600080fd5b50610197611087565b3480156104b057600080fd5b506101ca6104bf3660046115de565b6110bc565b3480156104d057600080fd5b506101977f000000000000000000000000000000000000000000000000000000000000000081565b60335473ffffffffffffffffffffffffffffffffffffffff16331461057e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6066546000908152606760209081526040918290208251808401909352805480845260019091015491830191909152825114610662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605260248201527f4f75747075744f7261636c653a20546865206f757470757420726f6f7420746f60448201527f2064656c65746520646f6573206e6f74206d6174636820746865206c6174657360648201527f74206f75747075742070726f706f73616c2e0000000000000000000000000000608482015260a401610575565b806020015182602001511461071f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f4f75747075744f7261636c653a205468652074696d657374616d7020746f206460448201527f656c65746520646f6573206e6f74206d6174636820746865206c61746573742060648201527f6f75747075742070726f706f73616c2e00000000000000000000000000000000608482015260a401610575565b606654602082015182516040517f11e942315215fbc11bf574b22ca610d001e704d870a2307833c188d31600b5c690600090a46066805460009081526067602052604081208181556001015554610797907f0000000000000000000000000000000000000000000000000000000000000000906116c0565b6066555050565b60335473ffffffffffffffffffffffffffffffffffffffff16331461081f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610575565b6108296000611208565b565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610575565b73ffffffffffffffffffffffffffffffffffffffff811661094f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f75747075744f7261636c653a206e65772070726f706f73657220697320746860448201527f65207a65726f20616464726573730000000000000000000000000000000000006064820152608401610575565b60335473ffffffffffffffffffffffffffffffffffffffff828116911614156109fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f75747075744f7261636c653a2070726f706f7365722063616e6e6f7420626560448201527f2073616d6520617320746865206f776e657200000000000000000000000000006064820152608401610575565b60655460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f3d7728dc2838bb794606bd89f5a37930830b32060f69ee929bbfc59b669024dd90600090a3606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60655473ffffffffffffffffffffffffffffffffffffffff163314610b2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4f75747075744f7261636c653a2063616c6c6572206973206e6f74207468652060448201527f70726f706f7365720000000000000000000000000000000000000000000000006064820152608401610575565b610b37611087565b8314610beb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f75747075744f7261636c653a20426c6f636b206e756d626572206d7573742060448201527f626520657175616c20746f206e65787420657870656374656420626c6f636b2060648201527f6e756d6265722e00000000000000000000000000000000000000000000000000608482015260a401610575565b42610bf584610e31565b10610c82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4f75747075744f7261636c653a2043616e6e6f742070726f706f7365204c322060448201527f6f757470757420696e206675747572652e0000000000000000000000000000006064820152608401610575565b83610d0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4f75747075744f7261636c653a2043616e6e6f74207375626d697420656d707460448201527f79204c32206f75747075742e00000000000000000000000000000000000000006064820152608401610575565b8115610dcb5781814014610dcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f4f75747075744f7261636c653a20426c6f636b6861736820646f6573206e6f7460448201527f206d61746368207468652068617368206174207468652065787065637465642060648201527f6865696768742e00000000000000000000000000000000000000000000000000608482015260a401610575565b6040805180820182528581524260208083018281526000888152606790925284822093518455516001909301929092556066869055915185929187917fc120f5e881491e6e212befa39e36b8f57d5eca31915f2e5d60a420f418caa6df9190a450505050565b60007f0000000000000000000000000000000000000000000000000000000000000000821015610f09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605660248201527f4f75747075744f7261636c653a20426c6f636b206e756d626572206d7573742060448201527f62652067726561746572207468616e206f7220657175616c20746f207468652060648201527f7374617274696e6720626c6f636b206e756d6265722e00000000000000000000608482015260a401610575565b7f0000000000000000000000000000000000000000000000000000000000000000610f547f0000000000000000000000000000000000000000000000000000000000000000846116c0565b610f5e91906116d7565b610f88907f0000000000000000000000000000000000000000000000000000000000000000611714565b92915050565b6000610f9a600161127f565b90508015610fcf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6040805180820182528681524260208083019182526000888152606790915292909220905181559051600190910155606684905561100b61140a565b6110148361082b565b61101d82611208565b801561108057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006066546110b79190611714565b905090565b60335473ffffffffffffffffffffffffffffffffffffffff16331461113d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610575565b73ffffffffffffffffffffffffffffffffffffffff81166111e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610575565b6111e981611208565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008054610100900460ff1615611336578160ff1660011480156112a25750303b155b61132e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610575565b506000919050565b60005460ff8084169116106113cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610575565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b600054610100900460ff166114a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610575565b610829600054610100900460ff1661153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610575565b61082933611208565b60006040828403121561155657600080fd5b6040516040810181811067ffffffffffffffff821117156115a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604052823581526020928301359281019290925250919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461140557600080fd5b6000602082840312156115f057600080fd5b6115f9826115ba565b9392505050565b6000806000806080858703121561161657600080fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561164457600080fd5b5035919050565b6000806000806080858703121561166157600080fd5b8435935060208501359250611678604086016115ba565b9150611686606086016115ba565b905092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156116d2576116d2611691565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561170f5761170f611691565b500290565b6000821982111561172757611727611691565b50019056fea164736f6c634300080a000a496e697469616c697a61626c653a20636f6e747261637420697320616c726561496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069",
}
// L2OutputOracleABI is the input ABI used to generate the binding from.
......@@ -49,7 +49,7 @@ var L2OutputOracleABI = L2OutputOracleMetaData.ABI
var L2OutputOracleBin = L2OutputOracleMetaData.Bin
// DeployL2OutputOracle deploys a new Ethereum contract, binding an instance of L2OutputOracle to it.
func DeployL2OutputOracle(auth *bind.TransactOpts, backend bind.ContractBackend, _submissionInterval *big.Int, _genesisL2Output [32]byte, _historicalTotalBlocks *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _l2BlockTime *big.Int, _sequencer common.Address, _owner common.Address) (common.Address, *types.Transaction, *L2OutputOracle, error) {
func DeployL2OutputOracle(auth *bind.TransactOpts, backend bind.ContractBackend, _submissionInterval *big.Int, _genesisL2Output [32]byte, _historicalTotalBlocks *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _l2BlockTime *big.Int, _proposer common.Address, _owner common.Address) (common.Address, *types.Transaction, *L2OutputOracle, error) {
parsed, err := L2OutputOracleMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
......@@ -58,7 +58,7 @@ func DeployL2OutputOracle(auth *bind.TransactOpts, backend bind.ContractBackend,
return common.Address{}, nil, nil, errors.New("GetABI returned nil")
}
address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L2OutputOracleBin), backend, _submissionInterval, _genesisL2Output, _historicalTotalBlocks, _startingBlockNumber, _startingTimestamp, _l2BlockTime, _sequencer, _owner)
address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L2OutputOracleBin), backend, _submissionInterval, _genesisL2Output, _historicalTotalBlocks, _startingBlockNumber, _startingTimestamp, _l2BlockTime, _proposer, _owner)
if err != nil {
return common.Address{}, nil, nil, err
}
......@@ -610,12 +610,12 @@ func (_L2OutputOracle *L2OutputOracleCallerSession) Owner() (common.Address, err
return _L2OutputOracle.Contract.Owner(&_L2OutputOracle.CallOpts)
}
// Sequencer is a free data retrieval call binding the contract method 0x5c1bba38.
// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
//
// Solidity: function sequencer() view returns(address)
func (_L2OutputOracle *L2OutputOracleCaller) Sequencer(opts *bind.CallOpts) (common.Address, error) {
// Solidity: function proposer() view returns(address)
func (_L2OutputOracle *L2OutputOracleCaller) Proposer(opts *bind.CallOpts) (common.Address, error) {
var out []interface{}
err := _L2OutputOracle.contract.Call(opts, &out, "sequencer")
err := _L2OutputOracle.contract.Call(opts, &out, "proposer")
if err != nil {
return *new(common.Address), err
......@@ -627,60 +627,39 @@ func (_L2OutputOracle *L2OutputOracleCaller) Sequencer(opts *bind.CallOpts) (com
}
// Sequencer is a free data retrieval call binding the contract method 0x5c1bba38.
// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
//
// Solidity: function sequencer() view returns(address)
func (_L2OutputOracle *L2OutputOracleSession) Sequencer() (common.Address, error) {
return _L2OutputOracle.Contract.Sequencer(&_L2OutputOracle.CallOpts)
// Solidity: function proposer() view returns(address)
func (_L2OutputOracle *L2OutputOracleSession) Proposer() (common.Address, error) {
return _L2OutputOracle.Contract.Proposer(&_L2OutputOracle.CallOpts)
}
// Sequencer is a free data retrieval call binding the contract method 0x5c1bba38.
// Proposer is a free data retrieval call binding the contract method 0xa8e4fb90.
//
// Solidity: function sequencer() view returns(address)
func (_L2OutputOracle *L2OutputOracleCallerSession) Sequencer() (common.Address, error) {
return _L2OutputOracle.Contract.Sequencer(&_L2OutputOracle.CallOpts)
// Solidity: function proposer() view returns(address)
func (_L2OutputOracle *L2OutputOracleCallerSession) Proposer() (common.Address, error) {
return _L2OutputOracle.Contract.Proposer(&_L2OutputOracle.CallOpts)
}
// AppendL2Output is a paid mutator transaction binding the contract method 0x25188104.
// ChangeProposer is a paid mutator transaction binding the contract method 0x72d5fe21.
//
// Solidity: function appendL2Output(bytes32 _l2Output, uint256 _l2BlockNumber, bytes32 _l1Blockhash, uint256 _l1BlockNumber) payable returns()
func (_L2OutputOracle *L2OutputOracleTransactor) AppendL2Output(opts *bind.TransactOpts, _l2Output [32]byte, _l2BlockNumber *big.Int, _l1Blockhash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
return _L2OutputOracle.contract.Transact(opts, "appendL2Output", _l2Output, _l2BlockNumber, _l1Blockhash, _l1BlockNumber)
// Solidity: function changeProposer(address _newProposer) returns()
func (_L2OutputOracle *L2OutputOracleTransactor) ChangeProposer(opts *bind.TransactOpts, _newProposer common.Address) (*types.Transaction, error) {
return _L2OutputOracle.contract.Transact(opts, "changeProposer", _newProposer)
}
// AppendL2Output is a paid mutator transaction binding the contract method 0x25188104.
// ChangeProposer is a paid mutator transaction binding the contract method 0x72d5fe21.
//
// Solidity: function appendL2Output(bytes32 _l2Output, uint256 _l2BlockNumber, bytes32 _l1Blockhash, uint256 _l1BlockNumber) payable returns()
func (_L2OutputOracle *L2OutputOracleSession) AppendL2Output(_l2Output [32]byte, _l2BlockNumber *big.Int, _l1Blockhash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
return _L2OutputOracle.Contract.AppendL2Output(&_L2OutputOracle.TransactOpts, _l2Output, _l2BlockNumber, _l1Blockhash, _l1BlockNumber)
// Solidity: function changeProposer(address _newProposer) returns()
func (_L2OutputOracle *L2OutputOracleSession) ChangeProposer(_newProposer common.Address) (*types.Transaction, error) {
return _L2OutputOracle.Contract.ChangeProposer(&_L2OutputOracle.TransactOpts, _newProposer)
}
// AppendL2Output is a paid mutator transaction binding the contract method 0x25188104.
// ChangeProposer is a paid mutator transaction binding the contract method 0x72d5fe21.
//
// Solidity: function appendL2Output(bytes32 _l2Output, uint256 _l2BlockNumber, bytes32 _l1Blockhash, uint256 _l1BlockNumber) payable returns()
func (_L2OutputOracle *L2OutputOracleTransactorSession) AppendL2Output(_l2Output [32]byte, _l2BlockNumber *big.Int, _l1Blockhash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
return _L2OutputOracle.Contract.AppendL2Output(&_L2OutputOracle.TransactOpts, _l2Output, _l2BlockNumber, _l1Blockhash, _l1BlockNumber)
}
// ChangeSequencer is a paid mutator transaction binding the contract method 0x2af8ded8.
//
// Solidity: function changeSequencer(address _newSequencer) returns()
func (_L2OutputOracle *L2OutputOracleTransactor) ChangeSequencer(opts *bind.TransactOpts, _newSequencer common.Address) (*types.Transaction, error) {
return _L2OutputOracle.contract.Transact(opts, "changeSequencer", _newSequencer)
}
// ChangeSequencer is a paid mutator transaction binding the contract method 0x2af8ded8.
//
// Solidity: function changeSequencer(address _newSequencer) returns()
func (_L2OutputOracle *L2OutputOracleSession) ChangeSequencer(_newSequencer common.Address) (*types.Transaction, error) {
return _L2OutputOracle.Contract.ChangeSequencer(&_L2OutputOracle.TransactOpts, _newSequencer)
}
// ChangeSequencer is a paid mutator transaction binding the contract method 0x2af8ded8.
//
// Solidity: function changeSequencer(address _newSequencer) returns()
func (_L2OutputOracle *L2OutputOracleTransactorSession) ChangeSequencer(_newSequencer common.Address) (*types.Transaction, error) {
return _L2OutputOracle.Contract.ChangeSequencer(&_L2OutputOracle.TransactOpts, _newSequencer)
// Solidity: function changeProposer(address _newProposer) returns()
func (_L2OutputOracle *L2OutputOracleTransactorSession) ChangeProposer(_newProposer common.Address) (*types.Transaction, error) {
return _L2OutputOracle.Contract.ChangeProposer(&_L2OutputOracle.TransactOpts, _newProposer)
}
// DeleteL2Output is a paid mutator transaction binding the contract method 0x093b3d90.
......@@ -706,23 +685,44 @@ func (_L2OutputOracle *L2OutputOracleTransactorSession) DeleteL2Output(_proposal
// Initialize is a paid mutator transaction binding the contract method 0xd20b1a51.
//
// Solidity: function initialize(bytes32 _genesisL2Output, uint256 _startingBlockNumber, address _sequencer, address _owner) returns()
func (_L2OutputOracle *L2OutputOracleTransactor) Initialize(opts *bind.TransactOpts, _genesisL2Output [32]byte, _startingBlockNumber *big.Int, _sequencer common.Address, _owner common.Address) (*types.Transaction, error) {
return _L2OutputOracle.contract.Transact(opts, "initialize", _genesisL2Output, _startingBlockNumber, _sequencer, _owner)
// Solidity: function initialize(bytes32 _genesisL2Output, uint256 _startingBlockNumber, address _proposer, address _owner) returns()
func (_L2OutputOracle *L2OutputOracleTransactor) Initialize(opts *bind.TransactOpts, _genesisL2Output [32]byte, _startingBlockNumber *big.Int, _proposer common.Address, _owner common.Address) (*types.Transaction, error) {
return _L2OutputOracle.contract.Transact(opts, "initialize", _genesisL2Output, _startingBlockNumber, _proposer, _owner)
}
// Initialize is a paid mutator transaction binding the contract method 0xd20b1a51.
//
// Solidity: function initialize(bytes32 _genesisL2Output, uint256 _startingBlockNumber, address _sequencer, address _owner) returns()
func (_L2OutputOracle *L2OutputOracleSession) Initialize(_genesisL2Output [32]byte, _startingBlockNumber *big.Int, _sequencer common.Address, _owner common.Address) (*types.Transaction, error) {
return _L2OutputOracle.Contract.Initialize(&_L2OutputOracle.TransactOpts, _genesisL2Output, _startingBlockNumber, _sequencer, _owner)
// Solidity: function initialize(bytes32 _genesisL2Output, uint256 _startingBlockNumber, address _proposer, address _owner) returns()
func (_L2OutputOracle *L2OutputOracleSession) Initialize(_genesisL2Output [32]byte, _startingBlockNumber *big.Int, _proposer common.Address, _owner common.Address) (*types.Transaction, error) {
return _L2OutputOracle.Contract.Initialize(&_L2OutputOracle.TransactOpts, _genesisL2Output, _startingBlockNumber, _proposer, _owner)
}
// Initialize is a paid mutator transaction binding the contract method 0xd20b1a51.
//
// Solidity: function initialize(bytes32 _genesisL2Output, uint256 _startingBlockNumber, address _sequencer, address _owner) returns()
func (_L2OutputOracle *L2OutputOracleTransactorSession) Initialize(_genesisL2Output [32]byte, _startingBlockNumber *big.Int, _sequencer common.Address, _owner common.Address) (*types.Transaction, error) {
return _L2OutputOracle.Contract.Initialize(&_L2OutputOracle.TransactOpts, _genesisL2Output, _startingBlockNumber, _sequencer, _owner)
// Solidity: function initialize(bytes32 _genesisL2Output, uint256 _startingBlockNumber, address _proposer, address _owner) returns()
func (_L2OutputOracle *L2OutputOracleTransactorSession) Initialize(_genesisL2Output [32]byte, _startingBlockNumber *big.Int, _proposer common.Address, _owner common.Address) (*types.Transaction, error) {
return _L2OutputOracle.Contract.Initialize(&_L2OutputOracle.TransactOpts, _genesisL2Output, _startingBlockNumber, _proposer, _owner)
}
// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
//
// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1Blockhash, uint256 _l1BlockNumber) payable returns()
func (_L2OutputOracle *L2OutputOracleTransactor) ProposeL2Output(opts *bind.TransactOpts, _outputRoot [32]byte, _l2BlockNumber *big.Int, _l1Blockhash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
return _L2OutputOracle.contract.Transact(opts, "proposeL2Output", _outputRoot, _l2BlockNumber, _l1Blockhash, _l1BlockNumber)
}
// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
//
// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1Blockhash, uint256 _l1BlockNumber) payable returns()
func (_L2OutputOracle *L2OutputOracleSession) ProposeL2Output(_outputRoot [32]byte, _l2BlockNumber *big.Int, _l1Blockhash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
return _L2OutputOracle.Contract.ProposeL2Output(&_L2OutputOracle.TransactOpts, _outputRoot, _l2BlockNumber, _l1Blockhash, _l1BlockNumber)
}
// ProposeL2Output is a paid mutator transaction binding the contract method 0x9aaab648.
//
// Solidity: function proposeL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1Blockhash, uint256 _l1BlockNumber) payable returns()
func (_L2OutputOracle *L2OutputOracleTransactorSession) ProposeL2Output(_outputRoot [32]byte, _l2BlockNumber *big.Int, _l1Blockhash [32]byte, _l1BlockNumber *big.Int) (*types.Transaction, error) {
return _L2OutputOracle.Contract.ProposeL2Output(&_L2OutputOracle.TransactOpts, _outputRoot, _l2BlockNumber, _l1Blockhash, _l1BlockNumber)
}
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
......@@ -901,9 +901,9 @@ func (_L2OutputOracle *L2OutputOracleFilterer) ParseInitialized(log types.Log) (
return event, nil
}
// L2OutputOracleL2OutputAppendedIterator is returned from FilterL2OutputAppended and is used to iterate over the raw logs and unpacked data for L2OutputAppended events raised by the L2OutputOracle contract.
type L2OutputOracleL2OutputAppendedIterator struct {
Event *L2OutputOracleL2OutputAppended // Event containing the contract specifics and raw log
// L2OutputOracleOutputDeletedIterator is returned from FilterOutputDeleted and is used to iterate over the raw logs and unpacked data for OutputDeleted events raised by the L2OutputOracle contract.
type L2OutputOracleOutputDeletedIterator struct {
Event *L2OutputOracleOutputDeleted // 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
......@@ -917,7 +917,7 @@ type L2OutputOracleL2OutputAppendedIterator struct {
// 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 *L2OutputOracleL2OutputAppendedIterator) Next() bool {
func (it *L2OutputOracleOutputDeletedIterator) Next() bool {
// If the iterator failed, stop iterating
if it.fail != nil {
return false
......@@ -926,7 +926,7 @@ func (it *L2OutputOracleL2OutputAppendedIterator) Next() bool {
if it.done {
select {
case log := <-it.logs:
it.Event = new(L2OutputOracleL2OutputAppended)
it.Event = new(L2OutputOracleOutputDeleted)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
......@@ -941,7 +941,7 @@ func (it *L2OutputOracleL2OutputAppendedIterator) Next() bool {
// Iterator still in progress, wait for either a data or an error event
select {
case log := <-it.logs:
it.Event = new(L2OutputOracleL2OutputAppended)
it.Event = new(L2OutputOracleOutputDeleted)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
......@@ -957,33 +957,33 @@ func (it *L2OutputOracleL2OutputAppendedIterator) Next() bool {
}
// Error returns any retrieval or parsing error occurred during filtering.
func (it *L2OutputOracleL2OutputAppendedIterator) Error() error {
func (it *L2OutputOracleOutputDeletedIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *L2OutputOracleL2OutputAppendedIterator) Close() error {
func (it *L2OutputOracleOutputDeletedIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// L2OutputOracleL2OutputAppended represents a L2OutputAppended event raised by the L2OutputOracle contract.
type L2OutputOracleL2OutputAppended struct {
L2Output [32]byte
// L2OutputOracleOutputDeleted represents a OutputDeleted event raised by the L2OutputOracle contract.
type L2OutputOracleOutputDeleted struct {
OutputRoot [32]byte
L1Timestamp *big.Int
L2BlockNumber *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterL2OutputAppended is a free log retrieval operation binding the contract event 0xd6703ded1701060d9ae1793db76d594790a4e775781225f79b5aa8a77987c080.
// FilterOutputDeleted is a free log retrieval operation binding the contract event 0x11e942315215fbc11bf574b22ca610d001e704d870a2307833c188d31600b5c6.
//
// Solidity: event L2OutputAppended(bytes32 indexed l2Output, uint256 indexed l1Timestamp, uint256 indexed l2BlockNumber)
func (_L2OutputOracle *L2OutputOracleFilterer) FilterL2OutputAppended(opts *bind.FilterOpts, l2Output [][32]byte, l1Timestamp []*big.Int, l2BlockNumber []*big.Int) (*L2OutputOracleL2OutputAppendedIterator, error) {
// Solidity: event OutputDeleted(bytes32 indexed outputRoot, uint256 indexed l1Timestamp, uint256 indexed l2BlockNumber)
func (_L2OutputOracle *L2OutputOracleFilterer) FilterOutputDeleted(opts *bind.FilterOpts, outputRoot [][32]byte, l1Timestamp []*big.Int, l2BlockNumber []*big.Int) (*L2OutputOracleOutputDeletedIterator, error) {
var l2OutputRule []interface{}
for _, l2OutputItem := range l2Output {
l2OutputRule = append(l2OutputRule, l2OutputItem)
var outputRootRule []interface{}
for _, outputRootItem := range outputRoot {
outputRootRule = append(outputRootRule, outputRootItem)
}
var l1TimestampRule []interface{}
for _, l1TimestampItem := range l1Timestamp {
......@@ -994,21 +994,21 @@ func (_L2OutputOracle *L2OutputOracleFilterer) FilterL2OutputAppended(opts *bind
l2BlockNumberRule = append(l2BlockNumberRule, l2BlockNumberItem)
}
logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "L2OutputAppended", l2OutputRule, l1TimestampRule, l2BlockNumberRule)
logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "OutputDeleted", outputRootRule, l1TimestampRule, l2BlockNumberRule)
if err != nil {
return nil, err
}
return &L2OutputOracleL2OutputAppendedIterator{contract: _L2OutputOracle.contract, event: "L2OutputAppended", logs: logs, sub: sub}, nil
return &L2OutputOracleOutputDeletedIterator{contract: _L2OutputOracle.contract, event: "OutputDeleted", logs: logs, sub: sub}, nil
}
// WatchL2OutputAppended is a free log subscription operation binding the contract event 0xd6703ded1701060d9ae1793db76d594790a4e775781225f79b5aa8a77987c080.
// WatchOutputDeleted is a free log subscription operation binding the contract event 0x11e942315215fbc11bf574b22ca610d001e704d870a2307833c188d31600b5c6.
//
// Solidity: event L2OutputAppended(bytes32 indexed l2Output, uint256 indexed l1Timestamp, uint256 indexed l2BlockNumber)
func (_L2OutputOracle *L2OutputOracleFilterer) WatchL2OutputAppended(opts *bind.WatchOpts, sink chan<- *L2OutputOracleL2OutputAppended, l2Output [][32]byte, l1Timestamp []*big.Int, l2BlockNumber []*big.Int) (event.Subscription, error) {
// Solidity: event OutputDeleted(bytes32 indexed outputRoot, uint256 indexed l1Timestamp, uint256 indexed l2BlockNumber)
func (_L2OutputOracle *L2OutputOracleFilterer) WatchOutputDeleted(opts *bind.WatchOpts, sink chan<- *L2OutputOracleOutputDeleted, outputRoot [][32]byte, l1Timestamp []*big.Int, l2BlockNumber []*big.Int) (event.Subscription, error) {
var l2OutputRule []interface{}
for _, l2OutputItem := range l2Output {
l2OutputRule = append(l2OutputRule, l2OutputItem)
var outputRootRule []interface{}
for _, outputRootItem := range outputRoot {
outputRootRule = append(outputRootRule, outputRootItem)
}
var l1TimestampRule []interface{}
for _, l1TimestampItem := range l1Timestamp {
......@@ -1019,7 +1019,7 @@ func (_L2OutputOracle *L2OutputOracleFilterer) WatchL2OutputAppended(opts *bind.
l2BlockNumberRule = append(l2BlockNumberRule, l2BlockNumberItem)
}
logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "L2OutputAppended", l2OutputRule, l1TimestampRule, l2BlockNumberRule)
logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "OutputDeleted", outputRootRule, l1TimestampRule, l2BlockNumberRule)
if err != nil {
return nil, err
}
......@@ -1029,8 +1029,8 @@ func (_L2OutputOracle *L2OutputOracleFilterer) WatchL2OutputAppended(opts *bind.
select {
case log := <-logs:
// New log arrived, parse the event and forward to the user
event := new(L2OutputOracleL2OutputAppended)
if err := _L2OutputOracle.contract.UnpackLog(event, "L2OutputAppended", log); err != nil {
event := new(L2OutputOracleOutputDeleted)
if err := _L2OutputOracle.contract.UnpackLog(event, "OutputDeleted", log); err != nil {
return err
}
event.Raw = log
......@@ -1051,21 +1051,21 @@ func (_L2OutputOracle *L2OutputOracleFilterer) WatchL2OutputAppended(opts *bind.
}), nil
}
// ParseL2OutputAppended is a log parse operation binding the contract event 0xd6703ded1701060d9ae1793db76d594790a4e775781225f79b5aa8a77987c080.
// ParseOutputDeleted is a log parse operation binding the contract event 0x11e942315215fbc11bf574b22ca610d001e704d870a2307833c188d31600b5c6.
//
// Solidity: event L2OutputAppended(bytes32 indexed l2Output, uint256 indexed l1Timestamp, uint256 indexed l2BlockNumber)
func (_L2OutputOracle *L2OutputOracleFilterer) ParseL2OutputAppended(log types.Log) (*L2OutputOracleL2OutputAppended, error) {
event := new(L2OutputOracleL2OutputAppended)
if err := _L2OutputOracle.contract.UnpackLog(event, "L2OutputAppended", log); err != nil {
// Solidity: event OutputDeleted(bytes32 indexed outputRoot, uint256 indexed l1Timestamp, uint256 indexed l2BlockNumber)
func (_L2OutputOracle *L2OutputOracleFilterer) ParseOutputDeleted(log types.Log) (*L2OutputOracleOutputDeleted, error) {
event := new(L2OutputOracleOutputDeleted)
if err := _L2OutputOracle.contract.UnpackLog(event, "OutputDeleted", log); err != nil {
return nil, err
}
event.Raw = log
return event, nil
}
// L2OutputOracleL2OutputDeletedIterator is returned from FilterL2OutputDeleted and is used to iterate over the raw logs and unpacked data for L2OutputDeleted events raised by the L2OutputOracle contract.
type L2OutputOracleL2OutputDeletedIterator struct {
Event *L2OutputOracleL2OutputDeleted // Event containing the contract specifics and raw log
// L2OutputOracleOutputProposedIterator is returned from FilterOutputProposed and is used to iterate over the raw logs and unpacked data for OutputProposed events raised by the L2OutputOracle contract.
type L2OutputOracleOutputProposedIterator struct {
Event *L2OutputOracleOutputProposed // 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
......@@ -1079,7 +1079,7 @@ type L2OutputOracleL2OutputDeletedIterator struct {
// 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 *L2OutputOracleL2OutputDeletedIterator) Next() bool {
func (it *L2OutputOracleOutputProposedIterator) Next() bool {
// If the iterator failed, stop iterating
if it.fail != nil {
return false
......@@ -1088,7 +1088,7 @@ func (it *L2OutputOracleL2OutputDeletedIterator) Next() bool {
if it.done {
select {
case log := <-it.logs:
it.Event = new(L2OutputOracleL2OutputDeleted)
it.Event = new(L2OutputOracleOutputProposed)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
......@@ -1103,7 +1103,7 @@ func (it *L2OutputOracleL2OutputDeletedIterator) Next() bool {
// Iterator still in progress, wait for either a data or an error event
select {
case log := <-it.logs:
it.Event = new(L2OutputOracleL2OutputDeleted)
it.Event = new(L2OutputOracleOutputProposed)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
......@@ -1119,33 +1119,33 @@ func (it *L2OutputOracleL2OutputDeletedIterator) Next() bool {
}
// Error returns any retrieval or parsing error occurred during filtering.
func (it *L2OutputOracleL2OutputDeletedIterator) Error() error {
func (it *L2OutputOracleOutputProposedIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *L2OutputOracleL2OutputDeletedIterator) Close() error {
func (it *L2OutputOracleOutputProposedIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// L2OutputOracleL2OutputDeleted represents a L2OutputDeleted event raised by the L2OutputOracle contract.
type L2OutputOracleL2OutputDeleted struct {
L2Output [32]byte
// L2OutputOracleOutputProposed represents a OutputProposed event raised by the L2OutputOracle contract.
type L2OutputOracleOutputProposed struct {
OutputRoot [32]byte
L1Timestamp *big.Int
L2BlockNumber *big.Int
Raw types.Log // Blockchain specific contextual infos
}
// FilterL2OutputDeleted is a free log retrieval operation binding the contract event 0x7320566fd5256cf8923648a5d9f560f1e92f1435a1bb32ddd1fe107f224ad359.
// FilterOutputProposed is a free log retrieval operation binding the contract event 0xc120f5e881491e6e212befa39e36b8f57d5eca31915f2e5d60a420f418caa6df.
//
// Solidity: event L2OutputDeleted(bytes32 indexed l2Output, uint256 indexed l1Timestamp, uint256 indexed l2BlockNumber)
func (_L2OutputOracle *L2OutputOracleFilterer) FilterL2OutputDeleted(opts *bind.FilterOpts, l2Output [][32]byte, l1Timestamp []*big.Int, l2BlockNumber []*big.Int) (*L2OutputOracleL2OutputDeletedIterator, error) {
// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l1Timestamp, uint256 indexed l2BlockNumber)
func (_L2OutputOracle *L2OutputOracleFilterer) FilterOutputProposed(opts *bind.FilterOpts, outputRoot [][32]byte, l1Timestamp []*big.Int, l2BlockNumber []*big.Int) (*L2OutputOracleOutputProposedIterator, error) {
var l2OutputRule []interface{}
for _, l2OutputItem := range l2Output {
l2OutputRule = append(l2OutputRule, l2OutputItem)
var outputRootRule []interface{}
for _, outputRootItem := range outputRoot {
outputRootRule = append(outputRootRule, outputRootItem)
}
var l1TimestampRule []interface{}
for _, l1TimestampItem := range l1Timestamp {
......@@ -1156,21 +1156,21 @@ func (_L2OutputOracle *L2OutputOracleFilterer) FilterL2OutputDeleted(opts *bind.
l2BlockNumberRule = append(l2BlockNumberRule, l2BlockNumberItem)
}
logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "L2OutputDeleted", l2OutputRule, l1TimestampRule, l2BlockNumberRule)
logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "OutputProposed", outputRootRule, l1TimestampRule, l2BlockNumberRule)
if err != nil {
return nil, err
}
return &L2OutputOracleL2OutputDeletedIterator{contract: _L2OutputOracle.contract, event: "L2OutputDeleted", logs: logs, sub: sub}, nil
return &L2OutputOracleOutputProposedIterator{contract: _L2OutputOracle.contract, event: "OutputProposed", logs: logs, sub: sub}, nil
}
// WatchL2OutputDeleted is a free log subscription operation binding the contract event 0x7320566fd5256cf8923648a5d9f560f1e92f1435a1bb32ddd1fe107f224ad359.
// WatchOutputProposed is a free log subscription operation binding the contract event 0xc120f5e881491e6e212befa39e36b8f57d5eca31915f2e5d60a420f418caa6df.
//
// Solidity: event L2OutputDeleted(bytes32 indexed l2Output, uint256 indexed l1Timestamp, uint256 indexed l2BlockNumber)
func (_L2OutputOracle *L2OutputOracleFilterer) WatchL2OutputDeleted(opts *bind.WatchOpts, sink chan<- *L2OutputOracleL2OutputDeleted, l2Output [][32]byte, l1Timestamp []*big.Int, l2BlockNumber []*big.Int) (event.Subscription, error) {
// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l1Timestamp, uint256 indexed l2BlockNumber)
func (_L2OutputOracle *L2OutputOracleFilterer) WatchOutputProposed(opts *bind.WatchOpts, sink chan<- *L2OutputOracleOutputProposed, outputRoot [][32]byte, l1Timestamp []*big.Int, l2BlockNumber []*big.Int) (event.Subscription, error) {
var l2OutputRule []interface{}
for _, l2OutputItem := range l2Output {
l2OutputRule = append(l2OutputRule, l2OutputItem)
var outputRootRule []interface{}
for _, outputRootItem := range outputRoot {
outputRootRule = append(outputRootRule, outputRootItem)
}
var l1TimestampRule []interface{}
for _, l1TimestampItem := range l1Timestamp {
......@@ -1181,7 +1181,7 @@ func (_L2OutputOracle *L2OutputOracleFilterer) WatchL2OutputDeleted(opts *bind.W
l2BlockNumberRule = append(l2BlockNumberRule, l2BlockNumberItem)
}
logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "L2OutputDeleted", l2OutputRule, l1TimestampRule, l2BlockNumberRule)
logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "OutputProposed", outputRootRule, l1TimestampRule, l2BlockNumberRule)
if err != nil {
return nil, err
}
......@@ -1191,8 +1191,8 @@ func (_L2OutputOracle *L2OutputOracleFilterer) WatchL2OutputDeleted(opts *bind.W
select {
case log := <-logs:
// New log arrived, parse the event and forward to the user
event := new(L2OutputOracleL2OutputDeleted)
if err := _L2OutputOracle.contract.UnpackLog(event, "L2OutputDeleted", log); err != nil {
event := new(L2OutputOracleOutputProposed)
if err := _L2OutputOracle.contract.UnpackLog(event, "OutputProposed", log); err != nil {
return err
}
event.Raw = log
......@@ -1213,12 +1213,12 @@ func (_L2OutputOracle *L2OutputOracleFilterer) WatchL2OutputDeleted(opts *bind.W
}), nil
}
// ParseL2OutputDeleted is a log parse operation binding the contract event 0x7320566fd5256cf8923648a5d9f560f1e92f1435a1bb32ddd1fe107f224ad359.
// ParseOutputProposed is a log parse operation binding the contract event 0xc120f5e881491e6e212befa39e36b8f57d5eca31915f2e5d60a420f418caa6df.
//
// Solidity: event L2OutputDeleted(bytes32 indexed l2Output, uint256 indexed l1Timestamp, uint256 indexed l2BlockNumber)
func (_L2OutputOracle *L2OutputOracleFilterer) ParseL2OutputDeleted(log types.Log) (*L2OutputOracleL2OutputDeleted, error) {
event := new(L2OutputOracleL2OutputDeleted)
if err := _L2OutputOracle.contract.UnpackLog(event, "L2OutputDeleted", log); err != nil {
// Solidity: event OutputProposed(bytes32 indexed outputRoot, uint256 indexed l1Timestamp, uint256 indexed l2BlockNumber)
func (_L2OutputOracle *L2OutputOracleFilterer) ParseOutputProposed(log types.Log) (*L2OutputOracleOutputProposed, error) {
event := new(L2OutputOracleOutputProposed)
if err := _L2OutputOracle.contract.UnpackLog(event, "OutputProposed", log); err != nil {
return nil, err
}
event.Raw = log
......@@ -1378,9 +1378,9 @@ func (_L2OutputOracle *L2OutputOracleFilterer) ParseOwnershipTransferred(log typ
return event, nil
}
// L2OutputOracleSequencerChangedIterator is returned from FilterSequencerChanged and is used to iterate over the raw logs and unpacked data for SequencerChanged events raised by the L2OutputOracle contract.
type L2OutputOracleSequencerChangedIterator struct {
Event *L2OutputOracleSequencerChanged // Event containing the contract specifics and raw log
// L2OutputOracleProposerChangedIterator is returned from FilterProposerChanged and is used to iterate over the raw logs and unpacked data for ProposerChanged events raised by the L2OutputOracle contract.
type L2OutputOracleProposerChangedIterator struct {
Event *L2OutputOracleProposerChanged // 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
......@@ -1394,7 +1394,7 @@ type L2OutputOracleSequencerChangedIterator struct {
// 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 *L2OutputOracleSequencerChangedIterator) Next() bool {
func (it *L2OutputOracleProposerChangedIterator) Next() bool {
// If the iterator failed, stop iterating
if it.fail != nil {
return false
......@@ -1403,7 +1403,7 @@ func (it *L2OutputOracleSequencerChangedIterator) Next() bool {
if it.done {
select {
case log := <-it.logs:
it.Event = new(L2OutputOracleSequencerChanged)
it.Event = new(L2OutputOracleProposerChanged)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
......@@ -1418,7 +1418,7 @@ func (it *L2OutputOracleSequencerChangedIterator) Next() bool {
// Iterator still in progress, wait for either a data or an error event
select {
case log := <-it.logs:
it.Event = new(L2OutputOracleSequencerChanged)
it.Event = new(L2OutputOracleProposerChanged)
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
it.fail = err
return false
......@@ -1434,60 +1434,60 @@ func (it *L2OutputOracleSequencerChangedIterator) Next() bool {
}
// Error returns any retrieval or parsing error occurred during filtering.
func (it *L2OutputOracleSequencerChangedIterator) Error() error {
func (it *L2OutputOracleProposerChangedIterator) Error() error {
return it.fail
}
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *L2OutputOracleSequencerChangedIterator) Close() error {
func (it *L2OutputOracleProposerChangedIterator) Close() error {
it.sub.Unsubscribe()
return nil
}
// L2OutputOracleSequencerChanged represents a SequencerChanged event raised by the L2OutputOracle contract.
type L2OutputOracleSequencerChanged struct {
PreviousSequencer common.Address
NewSequencer common.Address
Raw types.Log // Blockchain specific contextual infos
// L2OutputOracleProposerChanged represents a ProposerChanged event raised by the L2OutputOracle contract.
type L2OutputOracleProposerChanged struct {
PreviousProposer common.Address
NewProposer common.Address
Raw types.Log // Blockchain specific contextual infos
}
// FilterSequencerChanged is a free log retrieval operation binding the contract event 0x6ec88bae255aa7e73521c3beb17e9bc7940169e669440c5531733c0d2e91110d.
// FilterProposerChanged is a free log retrieval operation binding the contract event 0x3d7728dc2838bb794606bd89f5a37930830b32060f69ee929bbfc59b669024dd.
//
// Solidity: event SequencerChanged(address indexed previousSequencer, address indexed newSequencer)
func (_L2OutputOracle *L2OutputOracleFilterer) FilterSequencerChanged(opts *bind.FilterOpts, previousSequencer []common.Address, newSequencer []common.Address) (*L2OutputOracleSequencerChangedIterator, error) {
// Solidity: event ProposerChanged(address indexed previousProposer, address indexed newProposer)
func (_L2OutputOracle *L2OutputOracleFilterer) FilterProposerChanged(opts *bind.FilterOpts, previousProposer []common.Address, newProposer []common.Address) (*L2OutputOracleProposerChangedIterator, error) {
var previousSequencerRule []interface{}
for _, previousSequencerItem := range previousSequencer {
previousSequencerRule = append(previousSequencerRule, previousSequencerItem)
var previousProposerRule []interface{}
for _, previousProposerItem := range previousProposer {
previousProposerRule = append(previousProposerRule, previousProposerItem)
}
var newSequencerRule []interface{}
for _, newSequencerItem := range newSequencer {
newSequencerRule = append(newSequencerRule, newSequencerItem)
var newProposerRule []interface{}
for _, newProposerItem := range newProposer {
newProposerRule = append(newProposerRule, newProposerItem)
}
logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "SequencerChanged", previousSequencerRule, newSequencerRule)
logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "ProposerChanged", previousProposerRule, newProposerRule)
if err != nil {
return nil, err
}
return &L2OutputOracleSequencerChangedIterator{contract: _L2OutputOracle.contract, event: "SequencerChanged", logs: logs, sub: sub}, nil
return &L2OutputOracleProposerChangedIterator{contract: _L2OutputOracle.contract, event: "ProposerChanged", logs: logs, sub: sub}, nil
}
// WatchSequencerChanged is a free log subscription operation binding the contract event 0x6ec88bae255aa7e73521c3beb17e9bc7940169e669440c5531733c0d2e91110d.
// WatchProposerChanged is a free log subscription operation binding the contract event 0x3d7728dc2838bb794606bd89f5a37930830b32060f69ee929bbfc59b669024dd.
//
// Solidity: event SequencerChanged(address indexed previousSequencer, address indexed newSequencer)
func (_L2OutputOracle *L2OutputOracleFilterer) WatchSequencerChanged(opts *bind.WatchOpts, sink chan<- *L2OutputOracleSequencerChanged, previousSequencer []common.Address, newSequencer []common.Address) (event.Subscription, error) {
// Solidity: event ProposerChanged(address indexed previousProposer, address indexed newProposer)
func (_L2OutputOracle *L2OutputOracleFilterer) WatchProposerChanged(opts *bind.WatchOpts, sink chan<- *L2OutputOracleProposerChanged, previousProposer []common.Address, newProposer []common.Address) (event.Subscription, error) {
var previousSequencerRule []interface{}
for _, previousSequencerItem := range previousSequencer {
previousSequencerRule = append(previousSequencerRule, previousSequencerItem)
var previousProposerRule []interface{}
for _, previousProposerItem := range previousProposer {
previousProposerRule = append(previousProposerRule, previousProposerItem)
}
var newSequencerRule []interface{}
for _, newSequencerItem := range newSequencer {
newSequencerRule = append(newSequencerRule, newSequencerItem)
var newProposerRule []interface{}
for _, newProposerItem := range newProposer {
newProposerRule = append(newProposerRule, newProposerItem)
}
logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "SequencerChanged", previousSequencerRule, newSequencerRule)
logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "ProposerChanged", previousProposerRule, newProposerRule)
if err != nil {
return nil, err
}
......@@ -1497,8 +1497,8 @@ func (_L2OutputOracle *L2OutputOracleFilterer) WatchSequencerChanged(opts *bind.
select {
case log := <-logs:
// New log arrived, parse the event and forward to the user
event := new(L2OutputOracleSequencerChanged)
if err := _L2OutputOracle.contract.UnpackLog(event, "SequencerChanged", log); err != nil {
event := new(L2OutputOracleProposerChanged)
if err := _L2OutputOracle.contract.UnpackLog(event, "ProposerChanged", log); err != nil {
return err
}
event.Raw = log
......@@ -1519,12 +1519,12 @@ func (_L2OutputOracle *L2OutputOracleFilterer) WatchSequencerChanged(opts *bind.
}), nil
}
// ParseSequencerChanged is a log parse operation binding the contract event 0x6ec88bae255aa7e73521c3beb17e9bc7940169e669440c5531733c0d2e91110d.
// ParseProposerChanged is a log parse operation binding the contract event 0x3d7728dc2838bb794606bd89f5a37930830b32060f69ee929bbfc59b669024dd.
//
// Solidity: event SequencerChanged(address indexed previousSequencer, address indexed newSequencer)
func (_L2OutputOracle *L2OutputOracleFilterer) ParseSequencerChanged(log types.Log) (*L2OutputOracleSequencerChanged, error) {
event := new(L2OutputOracleSequencerChanged)
if err := _L2OutputOracle.contract.UnpackLog(event, "SequencerChanged", log); err != nil {
// Solidity: event ProposerChanged(address indexed previousProposer, address indexed newProposer)
func (_L2OutputOracle *L2OutputOracleFilterer) ParseProposerChanged(log types.Log) (*L2OutputOracleProposerChanged, error) {
event := new(L2OutputOracleProposerChanged)
if err := _L2OutputOracle.contract.UnpackLog(event, "ProposerChanged", log); err != nil {
return nil, err
}
event.Raw = log
......
......@@ -185,7 +185,7 @@ func (d *Driver) CraftTx(
opts.Nonce = nonce
opts.NoSend = true
return d.l2ooContract.AppendL2Output(opts, l2OutputRoot, nextCheckpointBlock, l1Header.Hash(), l1Header.Number)
return d.l2ooContract.ProposeL2Output(opts, l2OutputRoot, nextCheckpointBlock, l1Header.Hash(), l1Header.Number)
}
// UpdateGasPrice signs an otherwise identical txn to the one provided but with
......
GasBenchMark_L1CrossDomainMessenger:test_L1MessengerSendMessage_benchmark_0() (gas: 262334)
GasBenchMark_L1CrossDomainMessenger:test_L1MessengerSendMessage_benchmark_1() (gas: 75318)
GasBenchMark_L1CrossDomainMessenger:test_L1MessengerSendMessage_benchmark_1() (gas: 75340)
GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_0() (gas: 353380)
GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_1() (gas: 116384)
GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_0() (gas: 353402)
GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_1() (gas: 116359)
GasBenchMark_L1StandardBridge_Finalize:test_finalizeETHWithdrawal_benchmark() (gas: 45413)
GasBenchMark_L2OutputOracle:test_appendL2Output_benchmark() (gas: 68673)
GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_1() (gas: 116381)
GasBenchMark_L1StandardBridge_Finalize:test_finalizeETHWithdrawal_benchmark() (gas: 45368)
GasBenchMark_L2OutputOracle:test_proposeL2Output_benchmark() (gas: 68672)
GasBenchMark_OptimismPortal:test_depositTransaction_benchmark() (gas: 75069)
GasBenchMark_OptimismPortal:test_depositTransaction_benchmark_1() (gas: 35373)
DeployerWhitelist_Test:test_owner() (gas: 7658)
DeployerWhitelist_Test:test_storageSlots() (gas: 33494)
Encoding_Test:test_encodeDepositTransaction() (gas: 64610)
GasPriceOracle_Test:test_baseFee() (gas: 8370)
GasBenchMark_OptimismPortal:test_depositTransaction_benchmark_1() (gas: 35328)
DeployerWhitelist_Test:test_owner() (gas: 7680)
DeployerWhitelist_Test:test_storageSlots() (gas: 33516)
Encoding_Test:test_encodeDepositTransaction() (gas: 64567)
GasPriceOracle_Test:test_baseFee() (gas: 8392)
GasPriceOracle_Test:test_gasPrice() (gas: 8381)
GasPriceOracle_Test:test_l1BaseFee() (gas: 10582)
GasPriceOracle_Test:test_onlyOwnerSetDecimals() (gas: 10553)
GasPriceOracle_Test:test_onlyOwnerSetDecimals() (gas: 10575)
GasPriceOracle_Test:test_onlyOwnerSetOverhead() (gas: 10599)
GasPriceOracle_Test:test_onlyOwnerSetScalar() (gas: 10640)
GasPriceOracle_Test:test_owner() (gas: 9806)
GasPriceOracle_Test:test_owner() (gas: 9762)
GasPriceOracle_Test:test_setDecimals() (gas: 36798)
GasPriceOracle_Test:test_setGasPriceReverts() (gas: 11740)
GasPriceOracle_Test:test_setL1BaseFeeReverts() (gas: 11717)
GasPriceOracle_Test:test_setL1BaseFeeReverts() (gas: 11739)
GasPriceOracle_Test:test_setOverhead() (gas: 36767)
GasPriceOracle_Test:test_setScalar() (gas: 36818)
GasPriceOracle_Test:test_storageLayout() (gas: 86683)
Hashing_Test:test_hashDepositSource() (gas: 673)
Hashing_Test:test_hashDepositTransaction() (gas: 39129)
L1BlockTest:test_basefee() (gas: 7531)
Hashing_Test:test_hashDepositTransaction() (gas: 39151)
L1BlockTest:test_basefee() (gas: 7553)
L1BlockTest:test_hash() (gas: 7575)
L1BlockTest:test_number() (gas: 7630)
L1BlockTest:test_sequenceNumber() (gas: 7695)
L1BlockTest:test_timestamp() (gas: 7662)
L1BlockTest:test_updateValues() (gas: 28216)
L1BlockTest:test_number() (gas: 7652)
L1BlockTest:test_sequenceNumber() (gas: 7630)
L1BlockTest:test_timestamp() (gas: 7684)
L1BlockTest:test_updateValues() (gas: 28238)
L1BlockNumberTest:test_fallback() (gas: 18774)
L1BlockNumberTest:test_getL1BlockNumber() (gas: 10657)
L1BlockNumberTest:test_getL1BlockNumber() (gas: 10612)
L1BlockNumberTest:test_receive() (gas: 25437)
L1CrossDomainMessenger_Test:testCannot_L1MessengerPause() (gas: 24561)
L1CrossDomainMessenger_Test:testCannot_L1MessengerPause() (gas: 24496)
L1CrossDomainMessenger_Test:testCannot_L1MessengerUnpause() (gas: 24508)
L1CrossDomainMessenger_Test:test_L1MessengerMessageVersion() (gas: 24748)
L1CrossDomainMessenger_Test:test_L1MessengerPause() (gas: 48017)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageSucceeds() (gas: 77750)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageToSystemContract() (gas: 67778)
L1CrossDomainMessenger_Test:test_L1MessengerRelayShouldRevertIfPaused() (gas: 60471)
L1CrossDomainMessenger_Test:test_L1MessengerMessageVersion() (gas: 24725)
L1CrossDomainMessenger_Test:test_L1MessengerPause() (gas: 48039)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageSucceeds() (gas: 77772)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageToSystemContract() (gas: 67800)
L1CrossDomainMessenger_Test:test_L1MessengerRelayShouldRevertIfPaused() (gas: 60449)
L1CrossDomainMessenger_Test:test_L1MessengerReplayMessageWithValue() (gas: 38127)
L1CrossDomainMessenger_Test:test_L1MessengerSendMessage() (gas: 297745)
L1CrossDomainMessenger_Test:test_L1MessengerTwiceSendMessage() (gas: 1490048)
L1CrossDomainMessenger_Test:test_L1MessengerSendMessage() (gas: 297767)
L1CrossDomainMessenger_Test:test_L1MessengerTwiceSendMessage() (gas: 1490070)
L1CrossDomainMessenger_Test:test_L1MessengerUnpause() (gas: 40889)
L1CrossDomainMessenger_Test:test_L1MessengerXDomainSenderReverts() (gas: 24249)
L1CrossDomainMessenger_Test:test_L1MessengerxDomainMessageSenderResets() (gas: 86146)
L1StandardBridge_Test:test_depositERC20() (gas: 578867)
L1StandardBridge_Test:test_depositERC20To() (gas: 581048)
L1StandardBridge_Test:test_depositETH() (gas: 372975)
L1CrossDomainMessenger_Test:test_L1MessengerxDomainMessageSenderResets() (gas: 86190)
L1StandardBridge_Test:test_depositERC20() (gas: 578889)
L1StandardBridge_Test:test_depositERC20To() (gas: 581070)
L1StandardBridge_Test:test_depositETH() (gas: 372910)
L1StandardBridge_Test:test_depositETHTo() (gas: 330097)
L1StandardBridge_Test:test_finalizeERC20Withdrawal() (gas: 490759)
L1StandardBridge_Test:test_finalizeETHWithdrawal() (gas: 64409)
L1StandardBridge_Test:test_initialize() (gas: 26336)
L1StandardBridge_Test:test_onlyEOADepositERC20() (gas: 22363)
L1StandardBridge_Test:test_onlyEOADepositETH() (gas: 40882)
L1StandardBridge_Test:test_onlyL2BridgeFinalizeERC20Withdrawal() (gas: 36271)
L1StandardBridge_Test:test_onlyPortalFinalizeERC20Withdrawal() (gas: 35600)
L1StandardBridge_Test:test_finalizeETHWithdrawal() (gas: 64431)
L1StandardBridge_Test:test_initialize() (gas: 26358)
L1StandardBridge_Test:test_onlyEOADepositERC20() (gas: 22319)
L1StandardBridge_Test:test_onlyEOADepositETH() (gas: 40838)
L1StandardBridge_Test:test_onlyL2BridgeFinalizeERC20Withdrawal() (gas: 36293)
L1StandardBridge_Test:test_onlyPortalFinalizeERC20Withdrawal() (gas: 35622)
L1StandardBridge_Test:test_receive() (gas: 519560)
L2CrossDomainMessenger_Test:testCannot_L2MessengerPause() (gas: 10800)
L2CrossDomainMessenger_Test:test_L2MessengerMessageVersion() (gas: 8477)
L2CrossDomainMessenger_Test:test_L2MessengerPause() (gas: 31772)
L2CrossDomainMessenger_Test:test_L2MessengerRelayMessageSucceeds() (gas: 57309)
L2CrossDomainMessenger_Test:test_L2MessengerRelayMessageToSystemContract() (gas: 36137)
L2CrossDomainMessenger_Test:test_L2MessengerRelayShouldRevertIfPaused() (gas: 41600)
L2CrossDomainMessenger_Test:testCannot_L2MessengerPause() (gas: 10822)
L2CrossDomainMessenger_Test:test_L2MessengerMessageVersion() (gas: 8499)
L2CrossDomainMessenger_Test:test_L2MessengerPause() (gas: 31816)
L2CrossDomainMessenger_Test:test_L2MessengerRelayMessageSucceeds() (gas: 57331)
L2CrossDomainMessenger_Test:test_L2MessengerRelayMessageToSystemContract() (gas: 36070)
L2CrossDomainMessenger_Test:test_L2MessengerRelayShouldRevertIfPaused() (gas: 41535)
L2CrossDomainMessenger_Test:test_L2MessengerSendMessage() (gas: 120536)
L2CrossDomainMessenger_Test:test_L2MessengerTwiceSendMessage() (gas: 133720)
L2CrossDomainMessenger_Test:test_L2MessengerXDomainSenderReverts() (gas: 10576)
L2CrossDomainMessenger_Test:test_L2MessengerxDomainMessageSenderResets() (gas: 54776)
L2OutputOracleTest:testCannot_AppendWithUnmatchedBlockhash() (gas: 26811)
L2OutputOracleTest:testCannot_appendEmptyOutput() (gas: 24086)
L2OutputOracleTest:testCannot_appendFutureTimetamp() (gas: 26075)
L2OutputOracleTest:testCannot_appendOnWrongFork() (gas: 26360)
L2OutputOracleTest:testCannot_appendOutputIfNotSequencer() (gas: 23477)
L2OutputOracleTest:testCannot_appendUnexpectedBlockNumber() (gas: 25984)
L2OutputOracleTest:testCannot_deleteL2Output_ifNotOwner() (gas: 24778)
L2OutputOracleTest:testCannot_deleteL2Output_withWrongRoot() (gas: 91048)
L2OutputOracleTest:testCannot_deleteL2Output_withWrongTime() (gas: 87063)
L2OutputOracleTest:test_appendWithBlockhashAndHeight() (gas: 75048)
L2OutputOracleTest:test_appendingAnotherOutput() (gas: 76839)
L2OutputOracleTest:test_changeSequencer() (gas: 55963)
L2CrossDomainMessenger_Test:test_L2MessengerXDomainSenderReverts() (gas: 10598)
L2CrossDomainMessenger_Test:test_L2MessengerxDomainMessageSenderResets() (gas: 54732)
L2OutputOracleTest:testCannot_ProposeWithUnmatchedBlockhash() (gas: 26808)
L2OutputOracleTest:testCannot_deleteL2Output_ifNotOwner() (gas: 24866)
L2OutputOracleTest:testCannot_deleteL2Output_withWrongRoot() (gas: 91136)
L2OutputOracleTest:testCannot_deleteL2Output_withWrongTime() (gas: 87085)
L2OutputOracleTest:testCannot_proposeEmptyOutput() (gas: 24107)
L2OutputOracleTest:testCannot_proposeFutureTimetamp() (gas: 26031)
L2OutputOracleTest:testCannot_proposeL2OutputIfNotProposer() (gas: 23477)
L2OutputOracleTest:testCannot_proposeOnWrongFork() (gas: 26381)
L2OutputOracleTest:testCannot_proposeUnexpectedBlockNumber() (gas: 25940)
L2OutputOracleTest:test_changeProposer() (gas: 56008)
L2OutputOracleTest:test_computeL2Timestamp() (gas: 30200)
L2OutputOracleTest:test_constructor() (gas: 48793)
L2OutputOracleTest:test_deleteL2Output() (gas: 76438)
L2OutputOracleTest:test_getL2Output() (gas: 82869)
L2OutputOracleTest:test_latestBlockNumber() (gas: 76176)
L2OutputOracleTest:test_nextBlockNumber() (gas: 15122)
L2OutputOracleTest:test_updateOwner() (gas: 34603)
L2OutputOracleTest:test_constructor() (gas: 48902)
L2OutputOracleTest:test_deleteOutput() (gas: 76562)
L2OutputOracleTest:test_getL2Output() (gas: 82893)
L2OutputOracleTest:test_latestBlockNumber() (gas: 76177)
L2OutputOracleTest:test_nextBlockNumber() (gas: 15166)
L2OutputOracleTest:test_proposeWithBlockhashAndHeight() (gas: 75025)
L2OutputOracleTest:test_proposingAnotherOutput() (gas: 76816)
L2OutputOracleTest:test_updateOwner() (gas: 34624)
L2OutputOracleUpgradeable_Test:test_cannotInitImpl() (gas: 19451)
L2OutputOracleUpgradeable_Test:test_cannotInitProxy() (gas: 24516)
L2OutputOracleUpgradeable_Test:test_initValuesOnProxy() (gas: 38865)
L2OutputOracleUpgradeable_Test:test_cannotInitProxy() (gas: 24472)
L2OutputOracleUpgradeable_Test:test_initValuesOnProxy() (gas: 38899)
L2OutputOracleUpgradeable_Test:test_upgrading() (gas: 230843)
L2StandardBridge_Test:test_ERC20BridgeFailed_whenLocalTokenIsBridge() (gas: 133459)
L2StandardBridge_Test:test_cannotWithdrawEthWithoutSendingIt() (gas: 21656)
L2StandardBridge_Test:test_finalizeDeposit() (gas: 93203)
L2StandardBridge_Test:test_finalizeDeposit_failsToCompleteOutboundTransfer() (gas: 140469)
L2StandardBridge_Test:test_initialize() (gas: 14802)
L2StandardBridge_Test:test_finalizeDeposit() (gas: 93225)
L2StandardBridge_Test:test_finalizeDeposit_failsToCompleteOutboundTransfer() (gas: 140491)
L2StandardBridge_Test:test_initialize() (gas: 14824)
L2StandardBridge_Test:test_receive() (gas: 136864)
L2StandardBridge_Test:test_withdraw() (gas: 353020)
L2StandardBridge_Test:test_withdrawTo() (gas: 353705)
L2StandardBridge_Test:test_withdraw() (gas: 353038)
L2StandardBridge_Test:test_withdrawTo() (gas: 353723)
L2StandardBridge_Test:test_withdraw_onlyEOA() (gas: 252006)
L2ToL1MessagePasserTest:test_burn() (gas: 112037)
L2ToL1MessagePasserTest:test_initiateWithdrawal_fromContract() (gas: 67892)
L2ToL1MessagePasserTest:test_burn() (gas: 112059)
L2ToL1MessagePasserTest:test_initiateWithdrawal_fromContract() (gas: 67847)
L2ToL1MessagePasserTest:test_initiateWithdrawal_fromEOA() (gas: 74831)
LegacyERC20ETH_Test:test_approve() (gas: 10796)
LegacyERC20ETH_Test:test_burn() (gas: 10681)
LegacyERC20ETH_Test:test_crossDomain() (gas: 10577)
LegacyERC20ETH_Test:test_approve() (gas: 10731)
LegacyERC20ETH_Test:test_burn() (gas: 10615)
LegacyERC20ETH_Test:test_crossDomain() (gas: 10599)
LegacyERC20ETH_Test:test_decreaseAllowance() (gas: 10731)
LegacyERC20ETH_Test:test_increaseAllowance() (gas: 10741)
LegacyERC20ETH_Test:test_metadata() (gas: 15586)
LegacyERC20ETH_Test:test_increaseAllowance() (gas: 10763)
LegacyERC20ETH_Test:test_metadata() (gas: 15608)
LegacyERC20ETH_Test:test_mint() (gas: 10627)
LegacyERC20ETH_Test:test_transfer() (gas: 10829)
LegacyERC20ETH_Test:test_transfer() (gas: 10762)
LegacyERC20ETH_Test:test_transferFrom() (gas: 13008)
OptimismMintableERC20_Test:test_bridge() (gas: 9828)
OptimismMintableERC20_Test:test_burn() (gas: 52826)
OptimismMintableERC20_Test:test_burnRevertsFromNotBridge() (gas: 13219)
OptimismMintableERC20_Test:test_bridge() (gas: 9850)
OptimismMintableERC20_Test:test_burn() (gas: 52791)
OptimismMintableERC20_Test:test_burnRevertsFromNotBridge() (gas: 13241)
OptimismMintableERC20_Test:test_erc165_supportsInterface() (gas: 7828)
OptimismMintableERC20_Test:test_l1Token() (gas: 9824)
OptimismMintableERC20_Test:test_l2Bridge() (gas: 9746)
OptimismMintableERC20_Test:test_l1Token() (gas: 9757)
OptimismMintableERC20_Test:test_l2Bridge() (gas: 9768)
OptimismMintableERC20_Test:test_mint() (gas: 65754)
OptimismMintableERC20_Test:test_mintRevertsFromNotBridge() (gas: 13243)
OptimismMintableERC20_Test:test_remoteToken() (gas: 9740)
OptimismMintableTokenFactory_Test:test_bridge() (gas: 7663)
OptimismMintableERC20_Test:test_remoteToken() (gas: 9762)
OptimismMintableTokenFactory_Test:test_bridge() (gas: 7598)
OptimismMintableTokenFactory_Test:test_createStandardL2Token() (gas: 1113150)
OptimismMintableTokenFactory_Test:test_createStandardL2TokenSameTwice() (gas: 2209211)
OptimismMintableTokenFactory_Test:test_createStandardL2TokenShouldRevertIfRemoteIsZero() (gas: 9399)
OptimismPortalUpgradeable_Test:test_cannotInitImpl() (gas: 10686)
OptimismPortalUpgradeable_Test:test_cannotInitProxy() (gas: 15728)
OptimismPortalUpgradeable_Test:test_cannotInitProxy() (gas: 15684)
OptimismPortalUpgradeable_Test:test_initValuesOnProxy() (gas: 15990)
OptimismPortalUpgradeable_Test:test_upgrading() (gas: 230843)
OptimismPortal_Test:test_OptimismPortalConstructor() (gas: 17319)
OptimismPortal_Test:test_OptimismPortalContractCreationReverts() (gas: 14238)
OptimismPortal_Test:test_OptimismPortalReceiveEth() (gas: 126614)
OptimismPortal_Test:test_cannotVerifyRecentWithdrawal() (gas: 31902)
OptimismPortal_Test:test_depositTransaction_NoValueContract() (gas: 75820)
OptimismPortal_Test:test_depositTransaction_NoValueEOA() (gas: 76099)
OptimismPortal_Test:test_OptimismPortalConstructor() (gas: 17341)
OptimismPortal_Test:test_OptimismPortalContractCreationReverts() (gas: 14215)
OptimismPortal_Test:test_OptimismPortalReceiveEth() (gas: 126636)
OptimismPortal_Test:test_cannotVerifyRecentWithdrawal() (gas: 31925)
OptimismPortal_Test:test_depositTransaction_NoValueContract() (gas: 75797)
OptimismPortal_Test:test_depositTransaction_NoValueEOA() (gas: 76121)
OptimismPortal_Test:test_depositTransaction_createWithZeroValueForContract() (gas: 75825)
OptimismPortal_Test:test_depositTransaction_createWithZeroValueForEOA() (gas: 76146)
OptimismPortal_Test:test_depositTransaction_withEthValueAndContractContractCreation() (gas: 82846)
OptimismPortal_Test:test_depositTransaction_withEthValueAndEOAContractCreation() (gas: 75007)
OptimismPortal_Test:test_depositTransaction_withEthValueFromContract() (gas: 82550)
OptimismPortal_Test:test_depositTransaction_withEthValueFromEOA() (gas: 83145)
OptimismPortal_Test:test_invalidWithdrawalProof() (gas: 45086)
OptimismPortal_Test:test_isOutputFinalized() (gas: 131886)
OptimismPortal_Test:test_simple_isOutputFinalized() (gas: 23999)
OptimismPortal_Test:test_depositTransaction_withEthValueAndEOAContractCreation() (gas: 75029)
OptimismPortal_Test:test_depositTransaction_withEthValueFromContract() (gas: 82485)
OptimismPortal_Test:test_depositTransaction_withEthValueFromEOA() (gas: 83101)
OptimismPortal_Test:test_invalidWithdrawalProof() (gas: 45176)
OptimismPortal_Test:test_isOutputFinalized() (gas: 132184)
OptimismPortal_Test:test_simple_isOutputFinalized() (gas: 23978)
Proxy_Test:test_clashingFunctionSignatures() (gas: 101427)
Proxy_Test:test_implementationKey() (gas: 20942)
Proxy_Test:test_implementationProxyCallIfNotAdmin() (gas: 30021)
Proxy_Test:test_implementationZeroAddress() (gas: 48000)
Proxy_Test:test_itDelegatesToTheImplementation() (gas: 45251)
Proxy_Test:test_ownerKey() (gas: 19091)
Proxy_Test:test_ownerProxyCallIfNotAdmin() (gas: 34711)
Proxy_Test:test_payableUpgradeToAndCall() (gas: 53865)
Proxy_Test:test_implementationZeroAddress() (gas: 48022)
Proxy_Test:test_itDelegatesToTheImplementation() (gas: 45184)
Proxy_Test:test_ownerKey() (gas: 19113)
Proxy_Test:test_ownerProxyCallIfNotAdmin() (gas: 34733)
Proxy_Test:test_payableUpgradeToAndCall() (gas: 53887)
Proxy_Test:test_revertUpgradeToAndCall() (gas: 104654)
Proxy_Test:test_upgradeToAndCall() (gas: 125305)
Proxy_Test:test_zeroAddressCaller() (gas: 14825)
Proxy_Test:test_upgradeToAndCall() (gas: 125238)
Proxy_Test:test_zeroAddressCaller() (gas: 14758)
ProxyAdmin_Test:test_chugsplashChangeProxyAdmin() (gas: 35647)
ProxyAdmin_Test:test_chugsplashGetProxyAdmin() (gas: 15689)
ProxyAdmin_Test:test_chugsplashGetProxyImplementation() (gas: 51167)
ProxyAdmin_Test:test_chugsplashUpgrade() (gas: 48972)
ProxyAdmin_Test:test_chugsplashUpgradeAndCall() (gas: 82345)
ProxyAdmin_Test:test_delegateResolvedChangeProxyAdmin() (gas: 34020)
ProxyAdmin_Test:test_delegateResolvedGetProxyAdmin() (gas: 17708)
ProxyAdmin_Test:test_chugsplashGetProxyAdmin() (gas: 15711)
ProxyAdmin_Test:test_chugsplashGetProxyImplementation() (gas: 51122)
ProxyAdmin_Test:test_chugsplashUpgrade() (gas: 48994)
ProxyAdmin_Test:test_chugsplashUpgradeAndCall() (gas: 82322)
ProxyAdmin_Test:test_delegateResolvedChangeProxyAdmin() (gas: 33976)
ProxyAdmin_Test:test_delegateResolvedGetProxyAdmin() (gas: 17685)
ProxyAdmin_Test:test_delegateResolvedGetProxyImplementation() (gas: 62016)
ProxyAdmin_Test:test_delegateResolvedUpgrade() (gas: 58466)
ProxyAdmin_Test:test_delegateResolvedUpgradeAndCall() (gas: 97926)
ProxyAdmin_Test:test_delegateResolvedUpgrade() (gas: 58422)
ProxyAdmin_Test:test_delegateResolvedUpgradeAndCall() (gas: 97948)
ProxyAdmin_Test:test_erc1967ChangeProxyAdmin() (gas: 33863)
ProxyAdmin_Test:test_erc1967GetProxyAdmin() (gas: 15672)
ProxyAdmin_Test:test_erc1967GetProxyImplementation() (gas: 52102)
ProxyAdmin_Test:test_erc1967GetProxyImplementation() (gas: 52124)
ProxyAdmin_Test:test_erc1967Upgrade() (gas: 50036)
ProxyAdmin_Test:test_erc1967UpgradeAndCall() (gas: 79019)
ProxyAdmin_Test:test_isUpgrading() (gas: 19575)
ProxyAdmin_Test:test_isUpgrading() (gas: 19530)
ProxyAdmin_Test:test_onlyOwner() (gas: 22715)
ProxyAdmin_Test:test_onlyOwnerSetAddressManager() (gas: 10600)
ProxyAdmin_Test:test_onlyOwnerSetImplementationName() (gas: 11113)
ProxyAdmin_Test:test_onlyOwnerSetAddressManager() (gas: 10622)
ProxyAdmin_Test:test_onlyOwnerSetImplementationName() (gas: 11135)
ProxyAdmin_Test:test_onlyOwnerSetProxyType() (gas: 10751)
ProxyAdmin_Test:test_owner() (gas: 9818)
ProxyAdmin_Test:test_owner() (gas: 9776)
ProxyAdmin_Test:test_proxyType() (gas: 20622)
ProxyAdmin_Test:test_setImplementationName() (gas: 39002)
ProxyAdmin_Test:test_setImplementationName() (gas: 38957)
RLPReader_Test:testReadBool() (gas: 1109)
RLPReader_Test:test_readAddress() (gas: 1347)
RLPReader_Test:test_readAddressSmall() (gas: 614)
RLPReader_Test:test_readAddressTooLarge() (gas: 3646)
RLPReader_Test:test_readAddressTooShort() (gas: 3603)
RLPReader_Test:test_readBoolInvalidValue() (gas: 3677)
RLPReader_Test:test_readBoolLargeInput() (gas: 3550)
RLPReader_Test:test_readBytes32_revertOnList() (gas: 3998)
RLPReader_Test:test_readBytes32_revertOnTooLong() (gas: 3588)
RLPReader_Test:test_readBytes_bytestring00() (gas: 1823)
RLPReader_Test:test_readAddressTooShort() (gas: 3625)
RLPReader_Test:test_readBoolInvalidValue() (gas: 3699)
RLPReader_Test:test_readBoolLargeInput() (gas: 3572)
RLPReader_Test:test_readBytes32_revertOnList() (gas: 4020)
RLPReader_Test:test_readBytes32_revertOnTooLong() (gas: 3610)
RLPReader_Test:test_readBytes_bytestring00() (gas: 1845)
RLPReader_Test:test_readBytes_bytestring01() (gas: 1846)
RLPReader_Test:test_readBytes_bytestring7f() (gas: 1844)
RLPReader_Test:test_readBytes_invalidListLength() (gas: 3812)
RLPReader_Test:test_readBytes_invalidStringLength() (gas: 3768)
RLPReader_Test:test_readBytes_revertListItem() (gas: 3922)
RLPReader_Test:test_readBytes_bytestring7f() (gas: 1779)
RLPReader_Test:test_readBytes_invalidListLength() (gas: 3834)
RLPReader_Test:test_readBytes_invalidStringLength() (gas: 3790)
RLPReader_Test:test_readBytes_revertListItem() (gas: 3944)
RLPReader_Test:test_readList_dictTest1() (gas: 23791)
RLPReader_Test:test_readList_empty() (gas: 4472)
RLPReader_Test:test_readList_incorrectLengthInArray() (gas: 4210)
RLPReader_Test:test_readList_int32Overflow() (gas: 3955)
RLPReader_Test:test_readList_int32Overflow2() (gas: 4021)
RLPReader_Test:test_readList_invalidShortList() (gas: 3855)
RLPReader_Test:test_readList_int32Overflow2() (gas: 3998)
RLPReader_Test:test_readList_invalidShortList() (gas: 3788)
RLPReader_Test:test_readList_invalidValue() (gas: 3787)
RLPReader_Test:test_readList_leadingZerosInLongLengthArray1() (gas: 4193)
RLPReader_Test:test_readList_leadingZerosInLongLengthArray2() (gas: 4177)
RLPReader_Test:test_readList_leadingZerosInLongLengthList1() (gas: 38560)
RLPReader_Test:test_readList_listOfLists() (gas: 9619)
RLPReader_Test:test_readList_listOfLists2() (gas: 12479)
RLPReader_Test:test_readList_leadingZerosInLongLengthArray1() (gas: 4215)
RLPReader_Test:test_readList_leadingZerosInLongLengthArray2() (gas: 4199)
RLPReader_Test:test_readList_leadingZerosInLongLengthList1() (gas: 38582)
RLPReader_Test:test_readList_listOfLists() (gas: 9641)
RLPReader_Test:test_readList_listOfLists2() (gas: 12456)
RLPReader_Test:test_readList_longList1() (gas: 29013)
RLPReader_Test:test_readList_longList2() (gas: 202895)
RLPReader_Test:test_readList_longStringLength() (gas: 3853)
RLPReader_Test:test_readList_multiList() (gas: 12025)
RLPReader_Test:test_readList_nonOptimalLongLengthArray1() (gas: 4200)
RLPReader_Test:test_readList_longList2() (gas: 202917)
RLPReader_Test:test_readList_longStringLength() (gas: 3787)
RLPReader_Test:test_readList_multiList() (gas: 11961)
RLPReader_Test:test_readList_nonOptimalLongLengthArray1() (gas: 4222)
RLPReader_Test:test_readList_nonOptimalLongLengthArray2() (gas: 4223)
RLPReader_Test:test_readList_notLongEnough() (gas: 3841)
RLPReader_Test:test_readList_shortListMax1() (gas: 40662)
RLPReader_Test:test_readList_stringList() (gas: 16796)
RLPReader_Test:test_readList_notLongEnough() (gas: 3863)
RLPReader_Test:test_readList_shortListMax1() (gas: 40596)
RLPReader_Test:test_readList_stringList() (gas: 16818)
RLPReader_Test:test_readString_emptyString() (gas: 1719)
RLPReader_Test:test_readString_longString() (gas: 3076)
RLPReader_Test:test_readString_longString2() (gas: 18524)
RLPReader_Test:test_readString_shortString() (gas: 2280)
RLPReader_Test:test_readString_longString() (gas: 3098)
RLPReader_Test:test_readString_longString2() (gas: 18546)
RLPReader_Test:test_readString_shortString() (gas: 2302)
RLPReader_Test:test_readString_shortString2() (gas: 2775)
RLPReader_Test:test_readUint256_mediumInt1() (gas: 1235)
RLPReader_Test:test_readUint256_mediumInt1() (gas: 1257)
RLPReader_Test:test_readUint256_mediumInt2() (gas: 1237)
RLPReader_Test:test_readUint256_mediumInt3() (gas: 1238)
RLPReader_Test:test_readUint256_smallInt() (gas: 1084)
RLPReader_Test:test_readUint256_smallInt() (gas: 1106)
RLPReader_Test:test_readUint256_smallInt2() (gas: 1151)
RLPReader_Test:test_readUint256_smallInt3() (gas: 1127)
RLPReader_Test:test_readUint256_smallInt4() (gas: 1128)
RLPReader_Test:test_readUint256_smallInt3() (gas: 1104)
RLPReader_Test:test_readUint256_smallInt4() (gas: 1150)
RLPReader_Test:test_readUint256_zero() (gas: 1258)
RLPWriter_Test:test_writeList_dictTest1() (gas: 37148)
RLPWriter_Test:test_writeList_empty() (gas: 1751)
RLPWriter_Test:test_writeList_listoflists() (gas: 10969)
RLPWriter_Test:test_writeList_dictTest1() (gas: 37170)
RLPWriter_Test:test_writeList_empty() (gas: 1773)
RLPWriter_Test:test_writeList_listoflists() (gas: 10991)
RLPWriter_Test:test_writeList_listoflists2() (gas: 16779)
RLPWriter_Test:test_writeList_longlist1() (gas: 40730)
RLPWriter_Test:test_writeList_longlist2() (gas: 283278)
RLPWriter_Test:test_writeList_multiList() (gas: 22660)
RLPWriter_Test:test_writeList_longlist2() (gas: 283255)
RLPWriter_Test:test_writeList_multiList() (gas: 22682)
RLPWriter_Test:test_writeList_shortListMax1() (gas: 36985)
RLPWriter_Test:test_writeList_stringList() (gas: 10786)
RLPWriter_Test:test_writeString_bytestring00() (gas: 1022)
RLPWriter_Test:test_writeString_bytestring01() (gas: 978)
RLPWriter_Test:test_writeString_bytestring00() (gas: 978)
RLPWriter_Test:test_writeString_bytestring01() (gas: 1000)
RLPWriter_Test:test_writeString_bytestring7f() (gas: 1002)
RLPWriter_Test:test_writeString_empty() (gas: 1704)
RLPWriter_Test:test_writeString_longstring() (gas: 17180)
RLPWriter_Test:test_writeString_longstring2() (gas: 261864)
RLPWriter_Test:test_writeString_empty() (gas: 1659)
RLPWriter_Test:test_writeString_longstring() (gas: 17135)
RLPWriter_Test:test_writeString_longstring2() (gas: 261886)
RLPWriter_Test:test_writeString_shortstring() (gas: 2544)
RLPWriter_Test:test_writeString_shortstring2() (gas: 15563)
RLPWriter_Test:test_writeUint_mediumint() (gas: 8430)
RLPWriter_Test:test_writeUint_mediumint() (gas: 8452)
RLPWriter_Test:test_writeUint_mediumint2() (gas: 8780)
RLPWriter_Test:test_writeUint_mediumint3() (gas: 9189)
RLPWriter_Test:test_writeUint_smallint() (gas: 7350)
RLPWriter_Test:test_writeUint_smallint2() (gas: 7352)
RLPWriter_Test:test_writeUint_smallint3() (gas: 7372)
RLPWriter_Test:test_writeUint_smallint4() (gas: 7351)
RLPWriter_Test:test_writeUint_smallint4() (gas: 7373)
RLPWriter_Test:test_writeUint_zero() (gas: 7798)
ResourceMetering_Test:test_initialResourceParams() (gas: 8964)
ResourceMetering_Test:test_initialResourceParams() (gas: 8986)
ResourceMetering_Test:test_updateNoGasDelta() (gas: 2008317)
ResourceMetering_Test:test_updateOneEmptyBlock() (gas: 18171)
ResourceMetering_Test:test_updateOneEmptyBlock() (gas: 18126)
ResourceMetering_Test:test_updateParamsNoChange() (gas: 13956)
ResourceMetering_Test:test_updateTenEmptyBlocks() (gas: 20571)
ResourceMetering_Test:test_updateTenEmptyBlocks() (gas: 20593)
ResourceMetering_Test:test_updateTwoEmptyBlocks() (gas: 20594)
ResourceMetering_Test:test_useMaxSucceeds() (gas: 8017087)
ResourceMetering_Test:test_useMoreThanMaxReverts() (gas: 16047)
Semver_Test:test_behindProxy() (gas: 504908)
Semver_Test:test_major() (gas: 5406)
ResourceMetering_Test:test_useMaxSucceeds() (gas: 8017109)
ResourceMetering_Test:test_useMoreThanMaxReverts() (gas: 16069)
Semver_Test:test_behindProxy() (gas: 504930)
Semver_Test:test_major() (gas: 5428)
Semver_Test:test_minor() (gas: 5430)
Semver_Test:test_patch() (gas: 5364)
SequencerFeeVault_Test:test_constructor() (gas: 7656)
SequencerFeeVault_Test:test_minWithdrawalAmount() (gas: 5407)
Semver_Test:test_patch() (gas: 5386)
SequencerFeeVault_Test:test_constructor() (gas: 7611)
SequencerFeeVault_Test:test_minWithdrawalAmount() (gas: 5429)
SequencerFeeVault_Test:test_receive() (gas: 17338)
SequencerFeeVault_Test:test_revertWithdraw() (gas: 9332)
SequencerFeeVault_Test:test_withdraw() (gas: 147582)
SequencerFeeVault_Test:test_revertWithdraw() (gas: 9267)
SequencerFeeVault_Test:test_withdraw() (gas: 147604)
......@@ -75,7 +75,7 @@
|-------------------+----------------------------------------------------------+------+--------+-------+------------------------------------------------|
| __gap | uint256[49] | 52 | 0 | 1568 | contracts/L1/L2OutputOracle.sol:L2OutputOracle |
|-------------------+----------------------------------------------------------+------+--------+-------+------------------------------------------------|
| sequencer | address | 101 | 0 | 20 | contracts/L1/L2OutputOracle.sol:L2OutputOracle |
| proposer | address | 101 | 0 | 20 | contracts/L1/L2OutputOracle.sol:L2OutputOracle |
|-------------------+----------------------------------------------------------+------+--------+-------+------------------------------------------------|
| latestBlockNumber | uint256 | 102 | 0 | 32 | contracts/L1/L2OutputOracle.sol:L2OutputOracle |
|-------------------+----------------------------------------------------------+------+--------+-------+------------------------------------------------|
......
......@@ -10,7 +10,7 @@ import { Semver } from "../universal/Semver.sol";
* @custom:proxied
* @title L2OutputOracle
* @notice The L2 state is committed to in this contract
* The payable keyword is used on appendL2Output to save gas on the msg.value check.
* The payable keyword is used on proposeL2Output to save gas on the msg.value check.
* This contract should be deployed behind an upgradable proxy
*/
// slither-disable-next-line locked-ether
......@@ -27,14 +27,14 @@ contract L2OutputOracle is OwnableUpgradeable, Semver {
}
/**
* @notice Emitted when an output is appended.
* @notice Emitted when an output is proposed.
*
* @param l2Output The output root.
* @param l1Timestamp The L1 timestamp when appended.
* @param outputRoot The output root.
* @param l1Timestamp The L1 timestamp when proposed.
* @param l2BlockNumber The L2 block number of the output root.
*/
event L2OutputAppended(
bytes32 indexed l2Output,
event OutputProposed(
bytes32 indexed outputRoot,
uint256 indexed l1Timestamp,
uint256 indexed l2BlockNumber
);
......@@ -42,23 +42,23 @@ contract L2OutputOracle is OwnableUpgradeable, Semver {
/**
* @notice Emitted when an output is deleted.
*
* @param l2Output The output root.
* @param l1Timestamp The L1 timestamp when appended.
* @param outputRoot The output root.
* @param l1Timestamp The L1 timestamp when proposed.
* @param l2BlockNumber The L2 block number of the output root.
*/
event L2OutputDeleted(
bytes32 indexed l2Output,
event OutputDeleted(
bytes32 indexed outputRoot,
uint256 indexed l1Timestamp,
uint256 indexed l2BlockNumber
);
/**
* @notice Emitted when the sequencer address is changed.
* @notice Emitted when the proposer address is changed.
*
* @param previousSequencer The previous sequencer address.
* @param newSequencer The new sequencer address.
* @param previousProposer The previous proposer address.
* @param newProposer The new proposer address.
*/
event SequencerChanged(address indexed previousSequencer, address indexed newSequencer);
event ProposerChanged(address indexed previousProposer, address indexed newProposer);
/**
* @notice The interval in L2 blocks at which checkpoints must be submitted.
......@@ -91,9 +91,9 @@ contract L2OutputOracle is OwnableUpgradeable, Semver {
uint256 public immutable L2_BLOCK_TIME;
/**
* @notice The address of the sequencer;
* @notice The address of the proposer;
*/
address public sequencer;
address public proposer;
/**
* @notice The number of the most recent L2 block recorded in this contract.
......@@ -108,10 +108,10 @@ contract L2OutputOracle is OwnableUpgradeable, Semver {
mapping(uint256 => OutputProposal) internal l2Outputs;
/**
* @notice Reverts if called by any account other than the sequencer.
* @notice Reverts if called by any account other than the proposer.
*/
modifier onlySequencer() {
require(sequencer == msg.sender, "OutputOracle: caller is not the sequencer");
modifier onlyProposer() {
require(proposer == msg.sender, "OutputOracle: caller is not the proposer");
_;
}
......@@ -124,7 +124,7 @@ contract L2OutputOracle is OwnableUpgradeable, Semver {
* @param _startingBlockNumber The number of the first L2 block.
* @param _startingTimestamp The timestamp of the first L2 block.
* @param _l2BlockTime The timestamp of the first L2 block.
* @param _sequencer The address of the sequencer.
* @param _proposer The address of the proposer.
* @param _owner The address of the owner.
*/
constructor(
......@@ -134,7 +134,7 @@ contract L2OutputOracle is OwnableUpgradeable, Semver {
uint256 _startingBlockNumber,
uint256 _startingTimestamp,
uint256 _l2BlockTime,
address _sequencer,
address _proposer,
address _owner
) Semver(0, 0, 1) {
require(
......@@ -148,7 +148,7 @@ contract L2OutputOracle is OwnableUpgradeable, Semver {
STARTING_TIMESTAMP = _startingTimestamp;
L2_BLOCK_TIME = _l2BlockTime;
initialize(_genesisL2Output, _startingBlockNumber, _sequencer, _owner);
initialize(_genesisL2Output, _startingBlockNumber, _proposer, _owner);
}
/**
......@@ -156,55 +156,55 @@ contract L2OutputOracle is OwnableUpgradeable, Semver {
*
* @param _genesisL2Output The initial L2 output of the L2 chain.
* @param _startingBlockNumber The timestamp to start L2 block at.
* @param _sequencer The address of the sequencer.
* @param _proposer The address of the proposer.
* @param _owner The address of the owner.
*/
function initialize(
bytes32 _genesisL2Output,
uint256 _startingBlockNumber,
address _sequencer,
address _proposer,
address _owner
) public initializer {
l2Outputs[_startingBlockNumber] = OutputProposal(_genesisL2Output, block.timestamp);
latestBlockNumber = _startingBlockNumber;
__Ownable_init();
changeSequencer(_sequencer);
changeProposer(_proposer);
_transferOwnership(_owner);
}
/**
* @notice Accepts an L2 outputRoot and the timestamp of the corresponding L2 block. The
* @notice Accepts an outputRoot and the timestamp of the corresponding L2 block. The
* timestamp must be equal to the current value returned by `nextTimestamp()` in order
* to be accepted. This function may only be called by the Sequencer.
* to be accepted. This function may only be called by the Proposer.
*
* @param _l2Output The L2 output of the checkpoint block.
* @param _l2BlockNumber The L2 block number that resulted in _l2Output.
* @param _outputRoot The L2 output of the checkpoint block.
* @param _l2BlockNumber The L2 block number that resulted in _outputRoot.
* @param _l1Blockhash A block hash which must be included in the current chain.
* @param _l1BlockNumber The block number with the specified block hash.
*/
function appendL2Output(
bytes32 _l2Output,
function proposeL2Output(
bytes32 _outputRoot,
uint256 _l2BlockNumber,
bytes32 _l1Blockhash,
uint256 _l1BlockNumber
) external payable onlySequencer {
) external payable onlyProposer {
require(
_l2BlockNumber == nextBlockNumber(),
"OutputOracle: Block number must be equal to next expected block number."
);
require(
computeL2Timestamp(_l2BlockNumber) < block.timestamp,
"OutputOracle: Cannot append L2 output in future."
"OutputOracle: Cannot propose L2 output in future."
);
require(_l2Output != bytes32(0), "OutputOracle: Cannot submit empty L2 output.");
require(_outputRoot != bytes32(0), "OutputOracle: Cannot submit empty L2 output.");
if (_l1Blockhash != bytes32(0)) {
// This check allows the sequencer to append an output based on a given L1 block,
// This check allows the proposer to propose an output based on a given L1 block,
// without fear that it will be reorged out.
// It will also revert if the blockheight provided is more than 256 blocks behind the
// chain tip (as the hash will return as zero). This does open the door to a griefing
// attack in which the sequencer's submission is censored until the block is no longer
// retrievable, if the sequencer is experiencing this attack it can simply leave out the
// attack in which the proposer's submission is censored until the block is no longer
// retrievable, if the proposer is experiencing this attack it can simply leave out the
// blockhash value, and delay submission until it is confident that the L1 block is
// finalized.
require(
......@@ -213,16 +213,16 @@ contract L2OutputOracle is OwnableUpgradeable, Semver {
);
}
l2Outputs[_l2BlockNumber] = OutputProposal(_l2Output, block.timestamp);
l2Outputs[_l2BlockNumber] = OutputProposal(_outputRoot, block.timestamp);
latestBlockNumber = _l2BlockNumber;
emit L2OutputAppended(_l2Output, block.timestamp, _l2BlockNumber);
emit OutputProposed(_outputRoot, block.timestamp, _l2BlockNumber);
}
/**
* @notice Deletes the most recent output. This is used to remove the most recent output in the
* event that an erreneous output is submitted. It can only be called by the contract's
* owner, not the sequencer. Longer term, this should be replaced with a more robust
* owner, not the proposer. Longer term, this should be replaced with a more robust
* mechanism which will allow deletion of proposals shown to be invalid by a fault
* proof.
*
......@@ -240,11 +240,7 @@ contract L2OutputOracle is OwnableUpgradeable, Semver {
"OutputOracle: The timestamp to delete does not match the latest output proposal."
);
emit L2OutputDeleted(
outputToDelete.outputRoot,
outputToDelete.timestamp,
latestBlockNumber
);
emit OutputDeleted(outputToDelete.outputRoot, outputToDelete.timestamp, latestBlockNumber);
delete l2Outputs[latestBlockNumber];
latestBlockNumber = latestBlockNumber - SUBMISSION_INTERVAL;
......@@ -283,13 +279,13 @@ contract L2OutputOracle is OwnableUpgradeable, Semver {
}
/**
* @notice Transfers the sequencer role to a new account (`newSequencer`).
* @notice Transfers the proposer role to a new account (`newProposer`).
* Can only be called by the current owner.
*/
function changeSequencer(address _newSequencer) public onlyOwner {
require(_newSequencer != address(0), "OutputOracle: new sequencer is the zero address");
require(_newSequencer != owner(), "OutputOracle: sequencer cannot be same as the owner");
emit SequencerChanged(sequencer, _newSequencer);
sequencer = _newSequencer;
function changeProposer(address _newProposer) public onlyOwner {
require(_newProposer != address(0), "OutputOracle: new proposer is the zero address");
require(_newProposer != owner(), "OutputOracle: proposer cannot be same as the owner");
emit ProposerChanged(proposer, _newProposer);
proposer = _newProposer;
}
}
......@@ -183,7 +183,7 @@ contract OptimismPortal is Initializable, ResourceMetering, Semver {
uint256 offset = (_l2BlockNumber - startingBlockNumber) % interval;
// Look up the checkpoint block after it.
proposal = L2_ORACLE.getL2Output(_l2BlockNumber + (interval - offset));
// False if that block is not yet appended.
// False if that block is not yet proposed.
if (proposal.outputRoot == bytes32(uint256(0))) {
return false;
}
......
......@@ -129,11 +129,11 @@ contract GasBenchMark_L2OutputOracle is L2OutputOracle_Initializer {
function setUp() public override {
super.setUp();
nextBlockNumber = oracle.nextBlockNumber();
warpToAppendTime(nextBlockNumber);
vm.startPrank(sequencer);
warpToProposeTime(nextBlockNumber);
vm.startPrank(proposer);
}
function test_appendL2Output_benchmark() external {
oracle.appendL2Output(nonZeroHash, nextBlockNumber, 0, 0);
function test_proposeL2Output_benchmark() external {
oracle.proposeL2Output(nonZeroHash, nextBlockNumber, 0, 0);
}
}
......@@ -58,7 +58,7 @@ contract L2OutputOracle_Initializer is CommonTest {
L2OutputOracle oracleImpl;
// Constructor arguments
address sequencer = 0x000000000000000000000000000000000000AbBa;
address proposer = 0x000000000000000000000000000000000000AbBa;
address owner = 0x000000000000000000000000000000000000ACDC;
uint256 submissionInterval = 1800;
uint256 l2BlockTime = 2;
......@@ -70,8 +70,8 @@ contract L2OutputOracle_Initializer is CommonTest {
// Test data
uint256 initL1Time;
// Advance the evm's time to meet the L2OutputOracle's requirements for appendL2Output
function warpToAppendTime(uint256 _nextBlockNumber) public {
// Advance the evm's time to meet the L2OutputOracle's requirements for proposeL2Output
function warpToProposeTime(uint256 _nextBlockNumber) public {
vm.warp(oracle.computeL2Timestamp(_nextBlockNumber) + 1);
}
......@@ -83,7 +83,7 @@ contract L2OutputOracle_Initializer is CommonTest {
initL1Time = startingTimestamp + 1;
vm.warp(initL1Time);
vm.roll(startingBlockNumber);
// Deploy the L2OutputOracle and transfer owernship to the sequencer
// Deploy the L2OutputOracle and transfer owernship to the proposer
oracleImpl = new L2OutputOracle(
submissionInterval,
genesisL2Output,
......@@ -91,7 +91,7 @@ contract L2OutputOracle_Initializer is CommonTest {
startingBlockNumber,
startingTimestamp,
l2BlockTime,
sequencer,
proposer,
owner
);
Proxy proxy = new Proxy(multisig);
......@@ -102,7 +102,7 @@ contract L2OutputOracle_Initializer is CommonTest {
L2OutputOracle.initialize.selector,
genesisL2Output,
startingBlockNumber,
sequencer,
proposer,
owner
)
);
......
......@@ -7,7 +7,7 @@ import { Proxy } from "../universal/Proxy.sol";
contract L2OutputOracleTest is L2OutputOracle_Initializer {
bytes32 appendedOutput1 = keccak256(abi.encode(1));
bytes32 proposedOutput1 = keccak256(abi.encode(1));
function setUp() public override {
super.setUp();
......@@ -20,7 +20,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer {
assertEq(oracle.latestBlockNumber(), startingBlockNumber);
assertEq(oracle.STARTING_BLOCK_NUMBER(), startingBlockNumber);
assertEq(oracle.STARTING_TIMESTAMP(), startingTimestamp);
assertEq(oracle.sequencer(), sequencer);
assertEq(oracle.proposer(), proposer);
assertEq(oracle.owner(), owner);
L2OutputOracle.OutputProposal memory proposal = oracle.getL2Output(startingBlockNumber);
......@@ -34,24 +34,24 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer {
// Test: latestBlockNumber() should return the correct value
function test_latestBlockNumber() external {
uint256 appendedNumber = oracle.nextBlockNumber();
uint256 proposedNumber = oracle.nextBlockNumber();
// Roll to after the block number we'll append
warpToAppendTime(appendedNumber);
vm.prank(sequencer);
oracle.appendL2Output(appendedOutput1, appendedNumber, 0, 0);
assertEq(oracle.latestBlockNumber(), appendedNumber);
// Roll to after the block number we'll propose
warpToProposeTime(proposedNumber);
vm.prank(proposer);
oracle.proposeL2Output(proposedOutput1, proposedNumber, 0, 0);
assertEq(oracle.latestBlockNumber(), proposedNumber);
}
// Test: getL2Output() should return the correct value
function test_getL2Output() external {
uint256 nextBlockNumber = oracle.nextBlockNumber();
warpToAppendTime(nextBlockNumber);
vm.prank(sequencer);
oracle.appendL2Output(appendedOutput1, nextBlockNumber, 0, 0);
warpToProposeTime(nextBlockNumber);
vm.prank(proposer);
oracle.proposeL2Output(proposedOutput1, nextBlockNumber, 0, 0);
L2OutputOracle.OutputProposal memory proposal = oracle.getL2Output(nextBlockNumber);
assertEq(proposal.outputRoot, appendedOutput1);
assertEq(proposal.outputRoot, proposedOutput1);
assertEq(proposal.timestamp, block.timestamp);
L2OutputOracle.OutputProposal memory proposal2 = oracle.getL2Output(0);
......@@ -96,26 +96,26 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer {
* Ownership tests *
*******************/
event SequencerChanged(address indexed previousSequencer, address indexed newSequencer);
event ProposerChanged(address indexed previousProposer, address indexed newProposer);
function test_changeSequencer() public {
address newSequencer = address(20);
function test_changeProposer() public {
address newProposer = address(20);
vm.expectRevert("Ownable: caller is not the owner");
oracle.changeSequencer(newSequencer);
oracle.changeProposer(newProposer);
vm.startPrank(owner);
vm.expectRevert("OutputOracle: new sequencer is the zero address");
oracle.changeSequencer(address(0));
vm.expectRevert("OutputOracle: new proposer is the zero address");
oracle.changeProposer(address(0));
vm.expectRevert("OutputOracle: sequencer cannot be same as the owner");
oracle.changeSequencer(owner);
vm.expectRevert("OutputOracle: proposer cannot be same as the owner");
oracle.changeProposer(owner);
// Double check sequencer has not changed.
assertEq(sequencer, oracle.sequencer());
// Double check proposer has not changed.
assertEq(proposer, oracle.proposer());
vm.expectEmit(true, true, true, true);
emit SequencerChanged(sequencer, newSequencer);
oracle.changeSequencer(newSequencer);
emit ProposerChanged(proposer, newProposer);
oracle.changeProposer(newProposer);
vm.stopPrank();
}
......@@ -136,89 +136,89 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer {
}
/*****************************
* Append Tests - Happy Path *
* Propose Tests - Happy Path *
*****************************/
// Test: appendL2Output succeeds when given valid input, and no block hash and number are
// Test: proposeL2Output succeeds when given valid input, and no block hash and number are
// specified.
function test_appendingAnotherOutput() public {
bytes32 appendedOutput2 = keccak256(abi.encode(2));
function test_proposingAnotherOutput() public {
bytes32 proposedOutput2 = keccak256(abi.encode(2));
uint256 nextBlockNumber = oracle.nextBlockNumber();
warpToAppendTime(nextBlockNumber);
uint256 appendedNumber = oracle.latestBlockNumber();
warpToProposeTime(nextBlockNumber);
uint256 proposedNumber = oracle.latestBlockNumber();
// Ensure the submissionInterval is enforced
assertEq(nextBlockNumber, appendedNumber + submissionInterval);
assertEq(nextBlockNumber, proposedNumber + submissionInterval);
vm.roll(nextBlockNumber + 1);
vm.prank(sequencer);
oracle.appendL2Output(appendedOutput2, nextBlockNumber, 0, 0);
vm.prank(proposer);
oracle.proposeL2Output(proposedOutput2, nextBlockNumber, 0, 0);
}
// Test: appendL2Output succeeds when given valid input, and when a block hash and number are
// Test: proposeL2Output succeeds when given valid input, and when a block hash and number are
// specified for reorg protection.
function test_appendWithBlockhashAndHeight() external {
function test_proposeWithBlockhashAndHeight() external {
// Get the number and hash of a previous block in the chain
uint256 prevL1BlockNumber = block.number - 1;
bytes32 prevL1BlockHash = blockhash(prevL1BlockNumber);
uint256 nextBlockNumber = oracle.nextBlockNumber();
warpToAppendTime(nextBlockNumber);
vm.prank(sequencer);
oracle.appendL2Output(nonZeroHash, nextBlockNumber, prevL1BlockHash, prevL1BlockNumber);
warpToProposeTime(nextBlockNumber);
vm.prank(proposer);
oracle.proposeL2Output(nonZeroHash, nextBlockNumber, prevL1BlockHash, prevL1BlockNumber);
}
/***************************
* Append Tests - Sad Path *
* Propose Tests - Sad Path *
***************************/
// Test: appendL2Output fails if called by a party that is not the sequencer.
function testCannot_appendOutputIfNotSequencer() external {
// Test: proposeL2Output fails if called by a party that is not the proposer.
function testCannot_proposeL2OutputIfNotProposer() external {
uint256 nextBlockNumber = oracle.nextBlockNumber();
warpToAppendTime(nextBlockNumber);
warpToProposeTime(nextBlockNumber);
vm.prank(address(128));
vm.expectRevert("OutputOracle: caller is not the sequencer");
oracle.appendL2Output(nonZeroHash, nextBlockNumber, 0, 0);
vm.expectRevert("OutputOracle: caller is not the proposer");
oracle.proposeL2Output(nonZeroHash, nextBlockNumber, 0, 0);
}
// Test: appendL2Output fails given a zero blockhash.
function testCannot_appendEmptyOutput() external {
bytes32 outputToAppend = bytes32(0);
// Test: proposeL2Output fails given a zero blockhash.
function testCannot_proposeEmptyOutput() external {
bytes32 outputToPropose = bytes32(0);
uint256 nextBlockNumber = oracle.nextBlockNumber();
warpToAppendTime(nextBlockNumber);
vm.prank(sequencer);
warpToProposeTime(nextBlockNumber);
vm.prank(proposer);
vm.expectRevert("OutputOracle: Cannot submit empty L2 output.");
oracle.appendL2Output(outputToAppend, nextBlockNumber, 0, 0);
oracle.proposeL2Output(outputToPropose, nextBlockNumber, 0, 0);
}
// Test: appendL2Output fails if the block number doesn't match the next expected number.
function testCannot_appendUnexpectedBlockNumber() external {
// Test: proposeL2Output fails if the block number doesn't match the next expected number.
function testCannot_proposeUnexpectedBlockNumber() external {
uint256 nextBlockNumber = oracle.nextBlockNumber();
warpToAppendTime(nextBlockNumber);
vm.prank(sequencer);
warpToProposeTime(nextBlockNumber);
vm.prank(proposer);
vm.expectRevert("OutputOracle: Block number must be equal to next expected block number.");
oracle.appendL2Output(nonZeroHash, nextBlockNumber - 1, 0, 0);
oracle.proposeL2Output(nonZeroHash, nextBlockNumber - 1, 0, 0);
}
// Test: appendL2Output fails if it would have a timestamp in the future.
function testCannot_appendFutureTimetamp() external {
// Test: proposeL2Output fails if it would have a timestamp in the future.
function testCannot_proposeFutureTimetamp() external {
uint256 nextBlockNumber = oracle.nextBlockNumber();
uint256 nextTimestamp = oracle.computeL2Timestamp(nextBlockNumber);
vm.warp(nextTimestamp);
vm.prank(sequencer);
vm.expectRevert("OutputOracle: Cannot append L2 output in future.");
oracle.appendL2Output(nonZeroHash, nextBlockNumber, 0, 0);
vm.prank(proposer);
vm.expectRevert("OutputOracle: Cannot propose L2 output in future.");
oracle.proposeL2Output(nonZeroHash, nextBlockNumber, 0, 0);
}
// Test: appendL2Output fails if a non-existent L1 block hash and number are provided for reorg
// Test: proposeL2Output fails if a non-existent L1 block hash and number are provided for reorg
// protection.
function testCannot_appendOnWrongFork() external {
function testCannot_proposeOnWrongFork() external {
uint256 nextBlockNumber = oracle.nextBlockNumber();
warpToAppendTime(nextBlockNumber);
vm.prank(sequencer);
warpToProposeTime(nextBlockNumber);
vm.prank(proposer);
vm.expectRevert("OutputOracle: Blockhash does not match the hash at the expected height.");
oracle.appendL2Output(
oracle.proposeL2Output(
nonZeroHash,
nextBlockNumber,
bytes32(uint256(0x01)),
......@@ -226,9 +226,9 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer {
);
}
// Test: appendL2Output fails when given valid input, but the block hash and number do not
// Test: proposeL2Output fails when given valid input, but the block hash and number do not
// match.
function testCannot_AppendWithUnmatchedBlockhash() external {
function testCannot_ProposeWithUnmatchedBlockhash() external {
// Move ahead to block 100 so that we can reference historical blocks
vm.roll(100);
......@@ -237,26 +237,26 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer {
bytes32 l1BlockHash = blockhash(l1BlockNumber);
uint256 nextBlockNumber = oracle.nextBlockNumber();
warpToAppendTime(nextBlockNumber);
vm.prank(sequencer);
warpToProposeTime(nextBlockNumber);
vm.prank(proposer);
// This will fail when foundry no longer returns zerod block hashes
vm.expectRevert("OutputOracle: Blockhash does not match the hash at the expected height.");
oracle.appendL2Output(nonZeroHash, nextBlockNumber, l1BlockHash, l1BlockNumber - 1);
oracle.proposeL2Output(nonZeroHash, nextBlockNumber, l1BlockHash, l1BlockNumber - 1);
}
/*****************************
* Delete Tests - Happy Path *
*****************************/
event L2OutputDeleted(
event OutputDeleted(
bytes32 indexed l2Output,
uint256 indexed l1Timestamp,
uint256 indexed l2BlockNumber
);
function test_deleteL2Output() external {
test_appendingAnotherOutput();
function test_deleteOutput() external {
test_proposingAnotherOutput();
uint256 latestBlockNumber = oracle.latestBlockNumber();
L2OutputOracle.OutputProposal memory proposalToDelete = oracle.getL2Output(
......@@ -268,7 +268,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer {
vm.prank(owner);
vm.expectEmit(true, true, false, false);
emit L2OutputDeleted(
emit OutputDeleted(
proposalToDelete.outputRoot,
proposalToDelete.timestamp,
latestBlockNumber
......@@ -298,7 +298,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer {
}
function testCannot_deleteL2Output_withWrongRoot() external {
test_appendingAnotherOutput();
test_proposingAnotherOutput();
uint256 previousBlockNumber = oracle.latestBlockNumber() - submissionInterval;
L2OutputOracle.OutputProposal memory proposalToDelete = oracle.getL2Output(
......@@ -313,7 +313,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer {
}
function testCannot_deleteL2Output_withWrongTime() external {
test_appendingAnotherOutput();
test_proposingAnotherOutput();
uint256 latestBlockNumber = oracle.latestBlockNumber();
L2OutputOracle.OutputProposal memory proposalToDelete = oracle.getL2Output(
......@@ -351,7 +351,7 @@ contract L2OutputOracleUpgradeable_Test is L2OutputOracle_Initializer {
assertEq(genesisL2Output, initOutput.outputRoot);
assertEq(initL1Time, initOutput.timestamp);
assertEq(sequencer, oracleImpl.sequencer());
assertEq(proposer, oracleImpl.proposer());
assertEq(owner, oracleImpl.owner());
}
......@@ -360,7 +360,7 @@ contract L2OutputOracleUpgradeable_Test is L2OutputOracle_Initializer {
L2OutputOracle(payable(proxy)).initialize(
genesisL2Output,
startingBlockNumber,
sequencer,
proposer,
owner
);
}
......@@ -370,7 +370,7 @@ contract L2OutputOracleUpgradeable_Test is L2OutputOracle_Initializer {
L2OutputOracle(oracleImpl).initialize(
genesisL2Output,
startingBlockNumber,
sequencer,
proposer,
owner
);
}
......
......@@ -288,8 +288,8 @@ contract OptimismPortal_Test is Portal_Initializer {
uint256 checkpoint = oracle.nextBlockNumber();
vm.roll(checkpoint);
vm.warp(oracle.computeL2Timestamp(checkpoint) + 1);
vm.prank(oracle.sequencer());
oracle.appendL2Output(keccak256(abi.encode(2)), checkpoint, 0, 0);
vm.prank(oracle.proposer());
oracle.proposeL2Output(keccak256(abi.encode(2)), checkpoint, 0, 0);
// warp to the final second of the finalization period
uint256 finalizationHorizon = block.timestamp + op.FINALIZATION_PERIOD_SECONDS();
......
[{"elements": [{"type": "contract", "name": "DepositFeed", "source_mapping": {"start": 86, "length": 1929, "filename_used": "contracts/L1/DepositFeed.sol", "filename_relative": "contracts/L1/DepositFeed.sol", "filename_absolute": "contracts/L1/DepositFeed.sol", "filename_short": "contracts/L1/DepositFeed.sol", "is_dependency": false, "lines": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67], "starting_column": 1, "ending_column": 2}}, {"type": "function", "name": "receive", "source_mapping": {"start": 826, "length": 110, "filename_used": "contracts/L1/DepositFeed.sol", "filename_relative": "contracts/L1/DepositFeed.sol", "filename_absolute": "contracts/L1/DepositFeed.sol", "filename_short": "contracts/L1/DepositFeed.sol", "is_dependency": false, "lines": [33, 34, 35], "starting_column": 5, "ending_column": 6}, "type_specific_fields": {"parent": {"type": "contract", "name": "DepositFeed", "source_mapping": {"start": 86, "length": 1929, "filename_used": "contracts/L1/DepositFeed.sol", "filename_relative": "contracts/L1/DepositFeed.sol", "filename_absolute": "contracts/L1/DepositFeed.sol", "filename_short": "contracts/L1/DepositFeed.sol", "is_dependency": false, "lines": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67], "starting_column": 1, "ending_column": 2}}, "signature": "receive()"}}, {"type": "function", "name": "depositTransaction", "source_mapping": {"start": 1367, "length": 646, "filename_used": "contracts/L1/DepositFeed.sol", "filename_relative": "contracts/L1/DepositFeed.sol", "filename_absolute": "contracts/L1/DepositFeed.sol", "filename_short": "contracts/L1/DepositFeed.sol", "is_dependency": false, "lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66], "starting_column": 5, "ending_column": 6}, "type_specific_fields": {"parent": {"type": "contract", "name": "DepositFeed", "source_mapping": {"start": 86, "length": 1929, "filename_used": "contracts/L1/DepositFeed.sol", "filename_relative": "contracts/L1/DepositFeed.sol", "filename_absolute": "contracts/L1/DepositFeed.sol", "filename_short": "contracts/L1/DepositFeed.sol", "is_dependency": false, "lines": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67], "starting_column": 1, "ending_column": 2}}, "signature": "depositTransaction(address,uint256,uint256,bool,bytes)"}}], "description": "Contract locking ether found:\n\tContract DepositFeed (contracts/L1/DepositFeed.sol#7-67) has payable functions:\n\t - DepositFeed.receive() (contracts/L1/DepositFeed.sol#33-35)\n\t - DepositFeed.depositTransaction(address,uint256,uint256,bool,bytes) (contracts/L1/DepositFeed.sol#46-66)\n\tBut does not have a function to withdraw the ether\n", "markdown": "Contract locking ether found:\n\tContract [DepositFeed](contracts/L1/DepositFeed.sol#L7-L67) has payable functions:\n\t - [DepositFeed.receive()](contracts/L1/DepositFeed.sol#L33-L35)\n\t - [DepositFeed.depositTransaction(address,uint256,uint256,bool,bytes)](contracts/L1/DepositFeed.sol#L46-L66)\n\tBut does not have a function to withdraw the ether\n", "first_markdown_element": "contracts/L1/DepositFeed.sol#L7-L67", "id": "288a726f2c33db8578a9b3b43eaabd069d963e2dbe1fb2ae508c861783d169f5", "check": "locked-ether", "impact": "Medium", "confidence": "High"}, {"elements": [{"type": "contract", "name": "DepositFeed", "source_mapping": {"start": 86, "length": 1666, "filename_used": "./contracts/L1/DepositFeed.sol", "filename_relative": "contracts/L1/DepositFeed.sol", "filename_absolute": "./contracts/contracts/L1/DepositFeed.sol", "filename_short": "contracts/L1/DepositFeed.sol", "is_dependency": false, "lines": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59], "starting_column": 1, "ending_column": 2}}, {"type": "function", "name": "depositTransaction", "source_mapping": {"start": 1102, "length": 648, "filename_used": "./contracts/contracts/L1/DepositFeed.sol", "filename_relative": "contracts/L1/DepositFeed.sol", "filename_absolute": "./contracts/contracts/L1/DepositFeed.sol", "filename_short": "contracts/L1/DepositFeed.sol", "is_dependency": false, "lines": [38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58], "starting_column": 5, "ending_column": 6}, "type_specific_fields": {"parent": {"type": "contract", "name": "DepositFeed", "source_mapping": {"start": 86, "length": 1666, "filename_used": "./contracts/contracts/L1/DepositFeed.sol", "filename_relative": "contracts/L1/DepositFeed.sol", "filename_absolute": "./contracts/contracts/L1/DepositFeed.sol", "filename_short": "contracts/L1/DepositFeed.sol", "is_dependency": false, "lines": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59], "starting_column": 1, "ending_column": 2}}, "signature": "depositTransaction(address,uint256,uint256,bool,bytes)"}}], "description": "Contract locking ether found:\n\tContract DepositFeed (contracts/L1/DepositFeed.sol#7-59) has payable functions:\n\t - DepositFeed.depositTransaction(address,uint256,uint256,bool,bytes) (contracts/L1/DepositFeed.sol#38-58)\n\tBut does not have a function to withdraw the ether\n", "markdown": "Contract locking ether found:\n\tContract [DepositFeed](contracts/L1/DepositFeed.sol#L7-L59) has payable functions:\n\t - [DepositFeed.depositTransaction(address,uint256,uint256,bool,bytes)](contracts/L1/DepositFeed.sol#L38-L58)\n\tBut does not have a function to withdraw the ether\n", "first_markdown_element": "contracts/L1/DepositFeed.sol#L7-L59", "id": "be013b000d4c176d4d893619bdca725d93e4761e4b2e22fa77a64144e53abb26", "check": "locked-ether", "impact": "Medium", "confidence": "High"}, {"elements": [{"type": "function", "name": "appendL2Output", "source_mapping": {"start": 1769, "length": 422, "filename_used": "./contracts/L1/MockL2OutputOracle.sol", "filename_relative": "contracts/L1/MockL2OutputOracle.sol", "filename_absolute": "./contracts/L1/MockL2OutputOracle.sol", "filename_short": "contracts/L1/MockL2OutputOracle.sol", "is_dependency": false, "lines": [45, 46, 47, 48, 49, 50, 51], "starting_column": 5, "ending_column": 6}, "type_specific_fields": {"parent": {"type": "contract", "name": "MockL2OutputOracle", "source_mapping": {"start": 95, "length": 2773, "filename_used": "./contracts/L1/MockL2OutputOracle.sol", "filename_relative": "contracts/L1/MockL2OutputOracle.sol", "filename_absolute": "./contracts/L1/MockL2OutputOracle.sol", "filename_short": "contracts/L1/MockL2OutputOracle.sol", "is_dependency": false, "lines": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69], "starting_column": 1, "ending_column": 2}}, "signature": "appendL2Output(bytes32,uint256)"}}, {"type": "node", "name": "require(bool,string)(_timestamp == nextTimestamp(),Timestamp not equal to next expected timestamp)", "source_mapping": {"start": 2010, "length": 88, "filename_used": "./contracts/L1/MockL2OutputOracle.sol", "filename_relative": "contracts/L1/MockL2OutputOracle.sol", "filename_absolute": "./contracts/L1/MockL2OutputOracle.sol", "filename_short": "contracts/L1/MockL2OutputOracle.sol", "is_dependency": false, "lines": [48], "starting_column": 9, "ending_column": 97}, "type_specific_fields": {"parent": {"type": "function", "name": "appendL2Output", "source_mapping": {"start": 1769, "length": 422, "filename_used": "./contracts/L1/MockL2OutputOracle.sol", "filename_relative": "contracts/L1/MockL2OutputOracle.sol", "filename_absolute": "./contracts/L1/MockL2OutputOracle.sol", "filename_short": "contracts/L1/MockL2OutputOracle.sol", "is_dependency": false, "lines": [45, 46, 47, 48, 49, 50, 51], "starting_column": 5, "ending_column": 6}, "type_specific_fields": {"parent": {"type": "contract", "name": "MockL2OutputOracle", "source_mapping": {"start": 95, "length": 2773, "filename_used": "./contracts/L1/MockL2OutputOracle.sol", "filename_relative": "contracts/L1/MockL2OutputOracle.sol", "filename_absolute": "./contracts/L1/MockL2OutputOracle.sol", "filename_short": "contracts/L1/MockL2OutputOracle.sol", "is_dependency": false, "lines": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69], "starting_column": 1, "ending_column": 2}}, "signature": "appendL2Output(bytes32,uint256)"}}}}], "description": "MockL2OutputOracle.appendL2Output(bytes32,uint256) (contracts/L1/MockL2OutputOracle.sol#45-51) uses a dangerous strict equality:\n\t- require(bool,string)(_timestamp == nextTimestamp(),Timestamp not equal to next expected timestamp) (contracts/L1/MockL2OutputOracle.sol#48)\n", "markdown": "[MockL2OutputOracle.appendL2Output(bytes32,uint256)](contracts/L1/MockL2OutputOracle.sol#L45-L51) uses a dangerous strict equality:\n\t- [require(bool,string)(_timestamp == nextTimestamp(),Timestamp not equal to next expected timestamp)](contracts/L1/MockL2OutputOracle.sol#L48)\n", "first_markdown_element": "contracts/L1/MockL2OutputOracle.sol#L45-L51", "id": "74ee9955ede80e105221045625f8b4f963a0ca8422674891166ad65bdcdba57a", "check": "incorrect-equality", "impact": "Medium", "confidence": "High"}, {"elements": [{"type": "function", "name": "slitherConstructorConstantVariables", "source_mapping": {"start": 86, "length": 1666, "filename_used": "./contracts/L1/DepositFeed.sol", "filename_relative": "contracts/L1/DepositFeed.sol", "filename_absolute": "./contracts/L1/DepositFeed.sol", "filename_short": "contracts/L1/DepositFeed.sol", "is_dependency": false, "lines": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59], "starting_column": 1, "ending_column": 2}, "type_specific_fields": {"parent": {"type": "contract", "name": "DepositFeed", "source_mapping": {"start": 86, "length": 1666, "filename_used": "./contracts/L1/DepositFeed.sol", "filename_relative": "contracts/L1/DepositFeed.sol", "filename_absolute": "./contracts/L1/DepositFeed.sol", "filename_short": "contracts/L1/DepositFeed.sol", "is_dependency": false, "lines": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59], "starting_column": 1, "ending_column": 2}}, "signature": "slitherConstructorConstantVariables()"}}, {"type": "node", "name": "OFFSET = uint160(0x1111000000000000000000000000000000001111)", "source_mapping": {"start": 284, "length": 85, "filename_used": "./contracts/L1/DepositFeed.sol", "filename_relative": "contracts/L1/DepositFeed.sol", "filename_absolute": "./contracts/L1/DepositFeed.sol", "filename_short": "contracts/L1/DepositFeed.sol", "is_dependency": false, "lines": [14], "starting_column": 5, "ending_column": 90}, "type_specific_fields": {"parent": {"type": "function", "name": "slitherConstructorConstantVariables", "source_mapping": {"start": 86, "length": 1666, "filename_used": "./contracts/L1/DepositFeed.sol", "filename_relative": "contracts/L1/DepositFeed.sol", "filename_absolute": "./contracts/L1/DepositFeed.sol", "filename_short": "contracts/L1/DepositFeed.sol", "is_dependency": false, "lines": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59], "starting_column": 1, "ending_column": 2}, "type_specific_fields": {"parent": {"type": "contract", "name": "DepositFeed", "source_mapping": {"start": 86, "length": 1666, "filename_used": "./contracts/L1/DepositFeed.sol", "filename_relative": "contracts/L1/DepositFeed.sol", "filename_absolute": "./contracts/L1/DepositFeed.sol", "filename_short": "contracts/L1/DepositFeed.sol", "is_dependency": false, "lines": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59], "starting_column": 1, "ending_column": 2}}, "signature": "slitherConstructorConstantVariables()"}}}}], "description": "DepositFeed.slitherConstructorConstantVariables() (contracts/L1/DepositFeed.sol#7-59) uses literals with too many digits:\n\t- OFFSET = uint160(0x1111000000000000000000000000000000001111) (contracts/L1/DepositFeed.sol#14)\n", "markdown": "[DepositFeed.slitherConstructorConstantVariables()](contracts/L1/DepositFeed.sol#L7-L59) uses literals with too many digits:\n\t- [OFFSET = uint160(0x1111000000000000000000000000000000001111)](contracts/L1/DepositFeed.sol#L14)\n", "first_markdown_element": "contracts/L1/DepositFeed.sol#L7-L59", "id": "14adc89c437b961183112ca2328ae0e07b627d12995c5555d2c2fca5d4dbe1aa", "check": "too-many-digits", "impact": "Informational", "confidence": "Medium"}]
[
{
"elements": [
{
"type": "contract",
"name": "DepositFeed",
"source_mapping": {
"start": 86,
"length": 1929,
"filename_used": "contracts/L1/DepositFeed.sol",
"filename_relative": "contracts/L1/DepositFeed.sol",
"filename_absolute": "contracts/L1/DepositFeed.sol",
"filename_short": "contracts/L1/DepositFeed.sol",
"is_dependency": false,
"lines": [
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
59, 60, 61, 62, 63, 64, 65, 66, 67
],
"starting_column": 1,
"ending_column": 2
}
},
{
"type": "function",
"name": "receive",
"source_mapping": {
"start": 826,
"length": 110,
"filename_used": "contracts/L1/DepositFeed.sol",
"filename_relative": "contracts/L1/DepositFeed.sol",
"filename_absolute": "contracts/L1/DepositFeed.sol",
"filename_short": "contracts/L1/DepositFeed.sol",
"is_dependency": false,
"lines": [33, 34, 35],
"starting_column": 5,
"ending_column": 6
},
"type_specific_fields": {
"parent": {
"type": "contract",
"name": "DepositFeed",
"source_mapping": {
"start": 86,
"length": 1929,
"filename_used": "contracts/L1/DepositFeed.sol",
"filename_relative": "contracts/L1/DepositFeed.sol",
"filename_absolute": "contracts/L1/DepositFeed.sol",
"filename_short": "contracts/L1/DepositFeed.sol",
"is_dependency": false,
"lines": [
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67
],
"starting_column": 1,
"ending_column": 2
}
},
"signature": "receive()"
}
},
{
"type": "function",
"name": "depositTransaction",
"source_mapping": {
"start": 1367,
"length": 646,
"filename_used": "contracts/L1/DepositFeed.sol",
"filename_relative": "contracts/L1/DepositFeed.sol",
"filename_absolute": "contracts/L1/DepositFeed.sol",
"filename_short": "contracts/L1/DepositFeed.sol",
"is_dependency": false,
"lines": [
46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
63, 64, 65, 66
],
"starting_column": 5,
"ending_column": 6
},
"type_specific_fields": {
"parent": {
"type": "contract",
"name": "DepositFeed",
"source_mapping": {
"start": 86,
"length": 1929,
"filename_used": "contracts/L1/DepositFeed.sol",
"filename_relative": "contracts/L1/DepositFeed.sol",
"filename_absolute": "contracts/L1/DepositFeed.sol",
"filename_short": "contracts/L1/DepositFeed.sol",
"is_dependency": false,
"lines": [
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67
],
"starting_column": 1,
"ending_column": 2
}
},
"signature": "depositTransaction(address,uint256,uint256,bool,bytes)"
}
}
],
"description": "Contract locking ether found:\n\tContract DepositFeed (contracts/L1/DepositFeed.sol#7-67) has payable functions:\n\t - DepositFeed.receive() (contracts/L1/DepositFeed.sol#33-35)\n\t - DepositFeed.depositTransaction(address,uint256,uint256,bool,bytes) (contracts/L1/DepositFeed.sol#46-66)\n\tBut does not have a function to withdraw the ether\n",
"markdown": "Contract locking ether found:\n\tContract [DepositFeed](contracts/L1/DepositFeed.sol#L7-L67) has payable functions:\n\t - [DepositFeed.receive()](contracts/L1/DepositFeed.sol#L33-L35)\n\t - [DepositFeed.depositTransaction(address,uint256,uint256,bool,bytes)](contracts/L1/DepositFeed.sol#L46-L66)\n\tBut does not have a function to withdraw the ether\n",
"first_markdown_element": "contracts/L1/DepositFeed.sol#L7-L67",
"id": "288a726f2c33db8578a9b3b43eaabd069d963e2dbe1fb2ae508c861783d169f5",
"check": "locked-ether",
"impact": "Medium",
"confidence": "High"
},
{
"elements": [
{
"type": "contract",
"name": "DepositFeed",
"source_mapping": {
"start": 86,
"length": 1666,
"filename_used": "./contracts/L1/DepositFeed.sol",
"filename_relative": "contracts/L1/DepositFeed.sol",
"filename_absolute": "./contracts/contracts/L1/DepositFeed.sol",
"filename_short": "contracts/L1/DepositFeed.sol",
"is_dependency": false,
"lines": [
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
59
],
"starting_column": 1,
"ending_column": 2
}
},
{
"type": "function",
"name": "depositTransaction",
"source_mapping": {
"start": 1102,
"length": 648,
"filename_used": "./contracts/contracts/L1/DepositFeed.sol",
"filename_relative": "contracts/L1/DepositFeed.sol",
"filename_absolute": "./contracts/contracts/L1/DepositFeed.sol",
"filename_short": "contracts/L1/DepositFeed.sol",
"is_dependency": false,
"lines": [
38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
55, 56, 57, 58
],
"starting_column": 5,
"ending_column": 6
},
"type_specific_fields": {
"parent": {
"type": "contract",
"name": "DepositFeed",
"source_mapping": {
"start": 86,
"length": 1666,
"filename_used": "./contracts/contracts/L1/DepositFeed.sol",
"filename_relative": "contracts/L1/DepositFeed.sol",
"filename_absolute": "./contracts/contracts/L1/DepositFeed.sol",
"filename_short": "contracts/L1/DepositFeed.sol",
"is_dependency": false,
"lines": [
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59
],
"starting_column": 1,
"ending_column": 2
}
},
"signature": "depositTransaction(address,uint256,uint256,bool,bytes)"
}
}
],
"description": "Contract locking ether found:\n\tContract DepositFeed (contracts/L1/DepositFeed.sol#7-59) has payable functions:\n\t - DepositFeed.depositTransaction(address,uint256,uint256,bool,bytes) (contracts/L1/DepositFeed.sol#38-58)\n\tBut does not have a function to withdraw the ether\n",
"markdown": "Contract locking ether found:\n\tContract [DepositFeed](contracts/L1/DepositFeed.sol#L7-L59) has payable functions:\n\t - [DepositFeed.depositTransaction(address,uint256,uint256,bool,bytes)](contracts/L1/DepositFeed.sol#L38-L58)\n\tBut does not have a function to withdraw the ether\n",
"first_markdown_element": "contracts/L1/DepositFeed.sol#L7-L59",
"id": "be013b000d4c176d4d893619bdca725d93e4761e4b2e22fa77a64144e53abb26",
"check": "locked-ether",
"impact": "Medium",
"confidence": "High"
},
{
"elements": [
{
"type": "function",
"name": "proposeL2Output",
"source_mapping": {
"start": 1769,
"length": 422,
"filename_used": "./contracts/L1/MockL2OutputOracle.sol",
"filename_relative": "contracts/L1/MockL2OutputOracle.sol",
"filename_absolute": "./contracts/L1/MockL2OutputOracle.sol",
"filename_short": "contracts/L1/MockL2OutputOracle.sol",
"is_dependency": false,
"lines": [45, 46, 47, 48, 49, 50, 51],
"starting_column": 5,
"ending_column": 6
},
"type_specific_fields": {
"parent": {
"type": "contract",
"name": "MockL2OutputOracle",
"source_mapping": {
"start": 95,
"length": 2773,
"filename_used": "./contracts/L1/MockL2OutputOracle.sol",
"filename_relative": "contracts/L1/MockL2OutputOracle.sol",
"filename_absolute": "./contracts/L1/MockL2OutputOracle.sol",
"filename_short": "contracts/L1/MockL2OutputOracle.sol",
"is_dependency": false,
"lines": [
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69
],
"starting_column": 1,
"ending_column": 2
}
},
"signature": "proposeL2Output(bytes32,uint256)"
}
},
{
"type": "node",
"name": "require(bool,string)(_timestamp == nextTimestamp(),Timestamp not equal to next expected timestamp)",
"source_mapping": {
"start": 2010,
"length": 88,
"filename_used": "./contracts/L1/MockL2OutputOracle.sol",
"filename_relative": "contracts/L1/MockL2OutputOracle.sol",
"filename_absolute": "./contracts/L1/MockL2OutputOracle.sol",
"filename_short": "contracts/L1/MockL2OutputOracle.sol",
"is_dependency": false,
"lines": [48],
"starting_column": 9,
"ending_column": 97
},
"type_specific_fields": {
"parent": {
"type": "function",
"name": "proposeL2Output",
"source_mapping": {
"start": 1769,
"length": 422,
"filename_used": "./contracts/L1/MockL2OutputOracle.sol",
"filename_relative": "contracts/L1/MockL2OutputOracle.sol",
"filename_absolute": "./contracts/L1/MockL2OutputOracle.sol",
"filename_short": "contracts/L1/MockL2OutputOracle.sol",
"is_dependency": false,
"lines": [45, 46, 47, 48, 49, 50, 51],
"starting_column": 5,
"ending_column": 6
},
"type_specific_fields": {
"parent": {
"type": "contract",
"name": "MockL2OutputOracle",
"source_mapping": {
"start": 95,
"length": 2773,
"filename_used": "./contracts/L1/MockL2OutputOracle.sol",
"filename_relative": "contracts/L1/MockL2OutputOracle.sol",
"filename_absolute": "./contracts/L1/MockL2OutputOracle.sol",
"filename_short": "contracts/L1/MockL2OutputOracle.sol",
"is_dependency": false,
"lines": [
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
68, 69
],
"starting_column": 1,
"ending_column": 2
}
},
"signature": "proposeL2Output(bytes32,uint256)"
}
}
}
}
],
"description": "MockL2OutputOracle.proposeL2Output(bytes32,uint256) (contracts/L1/MockL2OutputOracle.sol#45-51) uses a dangerous strict equality:\n\t- require(bool,string)(_timestamp == nextTimestamp(),Timestamp not equal to next expected timestamp) (contracts/L1/MockL2OutputOracle.sol#48)\n",
"markdown": "[MockL2OutputOracle.proposeL2Output(bytes32,uint256)](contracts/L1/MockL2OutputOracle.sol#L45-L51) uses a dangerous strict equality:\n\t- [require(bool,string)(_timestamp == nextTimestamp(),Timestamp not equal to next expected timestamp)](contracts/L1/MockL2OutputOracle.sol#L48)\n",
"first_markdown_element": "contracts/L1/MockL2OutputOracle.sol#L45-L51",
"id": "74ee9955ede80e105221045625f8b4f963a0ca8422674891166ad65bdcdba57a",
"check": "incorrect-equality",
"impact": "Medium",
"confidence": "High"
},
{
"elements": [
{
"type": "function",
"name": "slitherConstructorConstantVariables",
"source_mapping": {
"start": 86,
"length": 1666,
"filename_used": "./contracts/L1/DepositFeed.sol",
"filename_relative": "contracts/L1/DepositFeed.sol",
"filename_absolute": "./contracts/L1/DepositFeed.sol",
"filename_short": "contracts/L1/DepositFeed.sol",
"is_dependency": false,
"lines": [
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
59
],
"starting_column": 1,
"ending_column": 2
},
"type_specific_fields": {
"parent": {
"type": "contract",
"name": "DepositFeed",
"source_mapping": {
"start": 86,
"length": 1666,
"filename_used": "./contracts/L1/DepositFeed.sol",
"filename_relative": "contracts/L1/DepositFeed.sol",
"filename_absolute": "./contracts/L1/DepositFeed.sol",
"filename_short": "contracts/L1/DepositFeed.sol",
"is_dependency": false,
"lines": [
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59
],
"starting_column": 1,
"ending_column": 2
}
},
"signature": "slitherConstructorConstantVariables()"
}
},
{
"type": "node",
"name": "OFFSET = uint160(0x1111000000000000000000000000000000001111)",
"source_mapping": {
"start": 284,
"length": 85,
"filename_used": "./contracts/L1/DepositFeed.sol",
"filename_relative": "contracts/L1/DepositFeed.sol",
"filename_absolute": "./contracts/L1/DepositFeed.sol",
"filename_short": "contracts/L1/DepositFeed.sol",
"is_dependency": false,
"lines": [14],
"starting_column": 5,
"ending_column": 90
},
"type_specific_fields": {
"parent": {
"type": "function",
"name": "slitherConstructorConstantVariables",
"source_mapping": {
"start": 86,
"length": 1666,
"filename_used": "./contracts/L1/DepositFeed.sol",
"filename_relative": "contracts/L1/DepositFeed.sol",
"filename_absolute": "./contracts/L1/DepositFeed.sol",
"filename_short": "contracts/L1/DepositFeed.sol",
"is_dependency": false,
"lines": [
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59
],
"starting_column": 1,
"ending_column": 2
},
"type_specific_fields": {
"parent": {
"type": "contract",
"name": "DepositFeed",
"source_mapping": {
"start": 86,
"length": 1666,
"filename_used": "./contracts/L1/DepositFeed.sol",
"filename_relative": "contracts/L1/DepositFeed.sol",
"filename_absolute": "./contracts/L1/DepositFeed.sol",
"filename_short": "contracts/L1/DepositFeed.sol",
"is_dependency": false,
"lines": [
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
53, 54, 55, 56, 57, 58, 59
],
"starting_column": 1,
"ending_column": 2
}
},
"signature": "slitherConstructorConstantVariables()"
}
}
}
}
],
"description": "DepositFeed.slitherConstructorConstantVariables() (contracts/L1/DepositFeed.sol#7-59) uses literals with too many digits:\n\t- OFFSET = uint160(0x1111000000000000000000000000000000001111) (contracts/L1/DepositFeed.sol#14)\n",
"markdown": "[DepositFeed.slitherConstructorConstantVariables()](contracts/L1/DepositFeed.sol#L7-L59) uses literals with too many digits:\n\t- [OFFSET = uint160(0x1111000000000000000000000000000000001111)](contracts/L1/DepositFeed.sol#L14)\n",
"first_markdown_element": "contracts/L1/DepositFeed.sol#L7-L59",
"id": "14adc89c437b961183112ca2328ae0e07b627d12995c5555d2c2fca5d4dbe1aa",
"check": "too-many-digits",
"impact": "Informational",
"confidence": "Medium"
}
]
......@@ -33,9 +33,7 @@ const getTargetOutput = async (
withdrawalTimestamp: number
) => {
const submissionInterval = (await oracle.SUBMISSION_INTERVAL()).toNumber()
const startingTimestamp = (
await oracle.STARTING_TIMESTAMP()
).toNumber()
const startingTimestamp = (await oracle.STARTING_TIMESTAMP()).toNumber()
const nextTimestamp = (await oracle.nextTimestamp()).toNumber()
let targetOutputTimestamp
if (withdrawalTimestamp < nextTimestamp) {
......
......@@ -43,7 +43,7 @@ described [below](#l2-output-commitment-construction).
If there is no newly finalized output, the service continues querying until it receives one. It then submits this
output, and the appropriate timestamp, to the [L2 Output Root](#l2-output-root-smart-contract) contract's
`appendL2Output()` function. The timestamp MUST be the next multiple of the `SUBMISSION_INTERVAL` value.
`proposeL2Output()` function. The timestamp MUST be the next multiple of the `SUBMISSION_INTERVAL` value.
The proposer may also delete the most recent output root by calling the `deleteL2Output()` function.
The function can be called repeatedly if it is necessary to roll back the state further.
......@@ -102,13 +102,13 @@ The L2 Output Oracle contract implements the following interface:
* @notice Accepts an L2 outputRoot and the timestamp of the corresponding L2 block. The
* timestamp must be equal to the current value returned by `nextTimestamp()` in order to be
* accepted.
* This function may only be called by the Sequencer.
* This function may only be called by the Proposer.
* @param _l2Output The L2 output of the checkpoint block.
* @param _l2BlockNumber The L2 block number that resulted in _l2Output.
* @param _l1Blockhash A block hash which must be included in the current chain.
* @param _l1BlockNumber The block number with the specified block hash.
*/
function appendL2Output(
function proposeL2Output(
bytes32 _l2Output,
uint256 _l2BlockNumber,
bytes32 _l1Blockhash,
......@@ -133,7 +133,7 @@ function nextBlockNumber() public view returns (uint256) {
### L1 Reorgs
If the L1 has a reorg after an output has been generated and submitted, the L2 state and correct output may change
leading to a faulty proposal. This is mitigated against by allowing the sequencer to submit an
leading to a faulty proposal. This is mitigated against by allowing the proposer to submit an
L1 block number and hash to the Output Oracle when appending a new output; in the event of a reorg, the block hash
will not match that of the block with that number and the call will revert.
......
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