From 6413a3eb6d71f3caf4d8c777337363df3fb3331d Mon Sep 17 00:00:00 2001 From: Danyal Prout Date: Tue, 30 Apr 2024 14:07:52 -0500 Subject: [PATCH] use linear regression for l1 gas used --- go.mod | 2 +- go.sum | 4 +- op-e2e/Makefile | 1 - op-e2e/actions/fjord_fork_test.go | 15 +++---- op-e2e/fastlz_test.go | 45 ++++--------------- .../derive/fjord_upgrade_transactions.go | 2 +- packages/contracts-bedrock/semver-lock.json | 4 +- .../src/L2/GasPriceOracle.sol | 16 +++++-- .../test/L2/GasPriceOracle.t.sol | 4 +- 9 files changed, 36 insertions(+), 57 deletions(-) diff --git a/go.mod b/go.mod index cb09ad83892e5..9f31d359d2672 100644 --- a/go.mod +++ b/go.mod @@ -252,7 +252,7 @@ require ( rsc.io/tmplfunc v0.0.3 // indirect ) -replace github.com/ethereum/go-ethereum v1.13.11 => github.com/base-org/op-geth v0.0.0-20240430004555-57f391c1492c +replace github.com/ethereum/go-ethereum v1.13.11 => github.com/base-org/op-geth v0.0.0-20240430172712-f66b9be65c17 //replace github.com/ethereum/go-ethereum v1.13.9 => ../op-geth diff --git a/go.sum b/go.sum index 3fb5886524956..7c20531c3aac6 100644 --- a/go.sum +++ b/go.sum @@ -50,8 +50,8 @@ github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJ github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/base-org/op-geth v0.0.0-20240430004555-57f391c1492c h1:U0aDbLq0uyOjZ7+QEiXDYO5qy4FzxkxvTeIbp8v8Zww= -github.com/base-org/op-geth v0.0.0-20240430004555-57f391c1492c/go.mod h1:K23yb9efVf9DdUOv/vl/Ux57Tng00rLaFqWYlFF45CA= +github.com/base-org/op-geth v0.0.0-20240430172712-f66b9be65c17 h1:l1OZ6XdUvvQcWF2IRniE5aqhsahJLLlRCMPheb+tM+Y= +github.com/base-org/op-geth v0.0.0-20240430172712-f66b9be65c17/go.mod h1:K23yb9efVf9DdUOv/vl/Ux57Tng00rLaFqWYlFF45CA= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= diff --git a/op-e2e/Makefile b/op-e2e/Makefile index 5702ae3b97723..8e14e316e2f19 100644 --- a/op-e2e/Makefile +++ b/op-e2e/Makefile @@ -66,5 +66,4 @@ clean: .PHONY: clean fuzz: - go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzFastLZ ./ go test -run NOTAREALTEST -v -fuzztime 10s -fuzz FuzzFjordCostFunction ./ diff --git a/op-e2e/actions/fjord_fork_test.go b/op-e2e/actions/fjord_fork_test.go index 25e335841c4ea..5a56cf2cdda97 100644 --- a/op-e2e/actions/fjord_fork_test.go +++ b/op-e2e/actions/fjord_fork_test.go @@ -23,12 +23,9 @@ import ( ) var ( - fjordGasPriceOracleCodeHash = common.HexToHash("0x17563a1e2f4faeee2c47abda44d74d8c91438c26f2f1ba774ef4e3c41cc45f3b") + fjordGasPriceOracleCodeHash = common.HexToHash("0x58e192326ee67ed52b7add91e4640024cbd1b21528a0ff1e1d21b7ca54e3ee62") // https://basescan.org/tx/0x8debb2fe54200183fb8baa3c6dbd8e6ec2e4f7a4add87416cd60336b8326d16a txHex = "02f875822105819b8405709fb884057d460082e97f94273ca93a52b817294830ed7572aa591ccfa647fd80881249c58b0021fb3fc080a05bb08ccfd68f83392e446dac64d88a2d28e7072c06502dfabc4a77e77b5c7913a05878d53dd4ebba4f6367e572d524dffcabeec3abb1d8725ee3ac5dc32e1852e3" - - costFastlzCoef int64 = 836_500 - costIntercept int64 = -42_585_600 ) func TestFjordNetworkUpgradeTransactions(gt *testing.T) { @@ -112,9 +109,9 @@ func TestFjordNetworkUpgradeTransactions(gt *testing.T) { l1GasUsed, err := gasPriceOracle.GetL1GasUsed(&bind.CallOpts{}, txData) require.NoError(t, err) + require.Equal(gt, uint64(1_888), l1GasUsed.Uint64()) fastLzSize := types.FlzCompressLen(txData) - require.Equal(gt, l1GasUsed.Uint64(), uint64(fastLzSize+68)*16) // Check that GetL1Fee takes into account fast LZ used, err := gasPriceOracle.GetL1Fee(&bind.CallOpts{}, txData) @@ -137,13 +134,13 @@ func TestFjordNetworkUpgradeTransactions(gt *testing.T) { // l1BaseFeeScaled = l1BaseFeeScalar * l1BaseFee * 16 // l1BlobFeeScaled = l1BlobFeeScalar * l1BlobBaseFee // l1FeeScaled = l1BaseFeeScaled + l1BlobFeeScaled -// ((intercept + fastlzCoef*max(fastlzLength, 71)) * l1FeeScaled) / 1e6 +// ((intercept + fastlzCoef*max(fastlzLength, 100)) * l1FeeScaled) / 1e6 func fjordL1Cost( t require.TestingT, gasPriceOracle *bindings.GasPriceOracleCaller, fastLzLength int64, ) *big.Int { - fastLzLength = max(fastLzLength, 71) + fastLzLength = max(fastLzLength, types.MinTransactionSize.Int64()) baseFeeScalar, err := gasPriceOracle.BaseFeeScalar(nil) require.NoError(t, err) @@ -158,8 +155,8 @@ func fjordL1Cost( feeScaled = new(big.Int).Mul(feeScaled, l1BaseFee) feeScaled = new(big.Int).Add(feeScaled, new(big.Int).Mul(new(big.Int).SetUint64(uint64(blobBaseFeeScalar)), blobBaseFee)) - cost := new(big.Int).Mul(new(big.Int).SetInt64(costFastlzCoef), new(big.Int).SetInt64(fastLzLength+68)) - cost = new(big.Int).Add(cost, new(big.Int).SetInt64(costIntercept)) + cost := new(big.Int).Mul(types.L1CostFastlzCoef, new(big.Int).SetInt64(fastLzLength+68)) + cost = new(big.Int).Add(cost, types.L1CostIntercept) require.True(t, cost.Sign() >= 0) cost = new(big.Int).Mul(cost, feeScaled) diff --git a/op-e2e/fastlz_test.go b/op-e2e/fastlz_test.go index 946b1c43d92f3..9394abaa874e4 100644 --- a/op-e2e/fastlz_test.go +++ b/op-e2e/fastlz_test.go @@ -10,13 +10,10 @@ import ( "github.com/ethereum-optimism/optimism/op-bindings/bindings" "github.com/ethereum-optimism/optimism/op-bindings/predeploys" - "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" - "github.com/ethereum-optimism/optimism/op-e2e/config" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient/simulated" "github.com/ethereum/go-ethereum/params" "github.com/stretchr/testify/require" ) @@ -48,31 +45,6 @@ func (sg *testStateGetter) GetState(addr common.Address, slot common.Hash) commo return buf } -func FuzzFastLZ(f *testing.F) { - l2Allocs := config.L2Allocs(genesis.L2AllocsFjord) - backend := simulated.NewBackend(l2Allocs.Accounts) - defer backend.Close() - - gpoCaller, err := bindings.NewGasPriceOracleCaller(predeploys.GasPriceOracleAddr, backend.Client()) - require.NoError(f, err) - - isFjord, err := gpoCaller.IsFjord(&bind.CallOpts{}) - require.NoError(f, err) - require.True(f, isFjord) - - f.Fuzz(func(t *testing.T, fuzzedData []byte) { - gpoValue, err := gpoCaller.GetL1GasUsed(&bind.CallOpts{}, fuzzedData) - require.NoError(t, err) - - gpoWithoutPadding := gpoValue.Div(gpoValue, big.NewInt(16)) - gpoWithoutPadding.Sub(gpoWithoutPadding, big.NewInt(68)) - - gethValue := types.FlzCompressLen(fuzzedData) - - require.Equal(t, uint64(gethValue), gpoWithoutPadding.Uint64()) - }) -} - func FuzzFjordCostFunction(f *testing.F) { cfg := DefaultSystemConfig(f) s := hexutil.Uint64(0) @@ -154,23 +126,24 @@ func FuzzFjordCostFunction(f *testing.F) { return } - gpoValue, err := gpoCaller.GetL1Fee(&bind.CallOpts{}, fuzzedData) + l1FeeSolidity, err := gpoCaller.GetL1Fee(&bind.CallOpts{}, fuzzedData) require.NoError(t, err) // remove the adjustment - gpoValue.Mul(gpoValue, big.NewInt(1e12)) - gpoValue.Div(gpoValue, feeScaled) + l1FeeSolidity.Mul(l1FeeSolidity, big.NewInt(1e12)) + l1FeeSolidity.Div(l1FeeSolidity, feeScaled) totat := new(big.Int).Mul(big.NewInt(68), big.NewInt(836_500)) - gpoValue.Sub(gpoValue, totat) + l1FeeSolidity.Sub(l1FeeSolidity, totat) - gpoValue.Mul(gpoValue, feeScaled) - gpoValue.Div(gpoValue, big.NewInt(1e12)) + l1FeeSolidity.Mul(l1FeeSolidity, feeScaled) + l1FeeSolidity.Div(l1FeeSolidity, big.NewInt(1e12)) costData := types.NewRollupCostData(fuzzedData) - gethValue := costFunc(costData, zeroTime) + l1FeeGeth := costFunc(costData, zeroTime) - require.Equal(t, gethValue.Uint64(), gpoValue.Uint64(), fmt.Sprintf("fuzzedData: %x", common.Bytes2Hex(fuzzedData))) + require.Equal(t, l1FeeGeth.Uint64(), l1FeeSolidity.Uint64(), fmt.Sprintf("fuzzedData: %x", common.Bytes2Hex(fuzzedData))) }) + } diff --git a/op-node/rollup/derive/fjord_upgrade_transactions.go b/op-node/rollup/derive/fjord_upgrade_transactions.go index a2f532c116f3f..31f16282e209e 100644 --- a/op-node/rollup/derive/fjord_upgrade_transactions.go +++ b/op-node/rollup/derive/fjord_upgrade_transactions.go @@ -15,7 +15,7 @@ var ( // Gas Price Oracle Parameters deployFjordGasPriceOracleSource = UpgradeDepositSource{Intent: "Fjord: Gas Price Oracle Deployment"} GasPriceOracleFjordDeployerAddress = common.HexToAddress("0x4210000000000000000000000000000000000002") - gasPriceOracleFjordDeploymentBytecode = common.FromHex("0x608060405234801561001057600080fd5b50611930806100206000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80636ef25c3a116100b2578063de26c4a111610081578063f45e65d811610066578063f45e65d81461025b578063f820614014610263578063fe173b971461020d57600080fd5b8063de26c4a114610235578063f1c7a58b1461024857600080fd5b80636ef25c3a1461020d5780638e98b10614610213578063960e3a231461021b578063c59859181461022d57600080fd5b806349948e0e11610109578063519b4bd3116100ee578063519b4bd31461019f57806354fd4d50146101a757806368d5dca6146101f057600080fd5b806349948e0e1461016f5780634ef6e2241461018257600080fd5b80630c18c1621461013b57806322b90ab3146101565780632e0f262514610160578063313ce56714610168575b600080fd5b61014361026b565b6040519081526020015b60405180910390f35b61015e61038c565b005b610143600681565b6006610143565b61014361017d3660046113a5565b6105af565b60005461018f9060ff1681565b604051901515815260200161014d565b610143610600565b6101e36040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b60405161014d9190611474565b6101f8610661565b60405163ffffffff909116815260200161014d565b48610143565b61015e6106e6565b60005461018f90610100900460ff1681565b6101f861097a565b6101436102433660046113a5565b6109db565b6101436102563660046114e7565b610abf565b610143610b8f565b610143610c82565b6000805460ff1615610304576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f47617350726963654f7261636c653a206f76657268656164282920697320646560448201527f707265636174656400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103879190611500565b905090565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663e591b2826040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040f9190611519565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e2073657420697345636f746f6e6520666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a4016102fb565b60005460ff1615610582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a2045636f746f6e6520616c72656164792060448201527f616374697665000000000000000000000000000000000000000000000000000060648201526084016102fb565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60008054610100900460ff16156105e3576105dd6105cc83610ce3565b516105d890604461157e565b611008565b92915050565b60005460ff16156105f7576105dd826110ee565b6105dd82611192565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16635cf249696040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166368d5dca66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103879190611596565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663e591b2826040518163ffffffff1660e01b8152600401602060405180830381865afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190611519565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e20736574206973466a6f726420666c61670060648201526084016102fb565b60005460ff166108b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f47617350726963654f7261636c653a20466a6f72642063616e206f6e6c79206260448201527f65206163746976617465642061667465722045636f746f6e650000000000000060648201526084016102fb565b600054610100900460ff161561094c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f47617350726963654f7261636c653a20466a6f726420616c726561647920616360448201527f746976650000000000000000000000000000000000000000000000000000000060648201526084016102fb565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663c59859186040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c2573d6000803e3d6000fd5b60008054610100900460ff1615610a0c576109f582610ce3565b51610a0190604461157e565b6105dd9060106115bc565b6000610a17836112e6565b60005490915060ff1615610a2b5792915050565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aae9190611500565b610ab8908261157e565b9392505050565b60008054610100900460ff16610b57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f47617350726963654f7261636c653a206765744c314665655570706572426f7560448201527f6e64206f6e6c7920737570706f72747320466a6f72640000000000000000000060648201526084016102fb565b6000610b6460ff846115f9565b610b6e908461157e565b610b7990601061157e565b610b8490604461157e565b9050610ab881611008565b6000805460ff1615610c23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a207363616c61722829206973206465707260448201527f656361746564000000000000000000000000000000000000000000000000000060648201526084016102fb565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663f82061406040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b6060610e7a565b818153600101919050565b600082840393505b83811015610ab85782810151828201511860001a1590930292600101610cfd565b825b60208210610d6a578251610d35601f83610cea565b52602092909201917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090910190602101610d20565b8115610ab8578251610d7f6001840383610cea565b520160010192915050565b60006001830392505b6101078210610dcb57610dbd8360ff16610db860fd610db88760081c60e00189610cea565b610cea565b935061010682039150610d93565b60078210610df857610df18360ff16610db860078503610db88760081c60e00189610cea565b9050610ab8565b610e118360ff16610db88560081c8560051b0187610cea565b949350505050565b610e72828203610e56610e4684600081518060001a8160011a60081b178160021a60101b17915050919050565b639e3779b90260131c611fff1690565b8060021b6040510182815160e01c1860e01b8151188152505050565b600101919050565b6180003860405139618000604051016020830180600d8551820103826002015b81811015610fad576000805b50508051604051600082901a600183901a60081b1760029290921a60101b91909117639e3779b9810260111c617ffc16909101805160e081811c878603811890911b90911890915284019081830390848410610f025750610f3d565b600184019350611fff8211610f37578251600081901a600182901a60081b1760029190911a60101b178103610f375750610f3d565b50610ea6565b838310610f4b575050610fad565b60018303925085831115610f6957610f668787888603610d1e565b96505b610f7d600985016003850160038501610cf5565b9150610f8a878284610d8a565b965050610fa284610f9d86848601610e19565b610e19565b915050809350610e9a565b5050610fbf8383848851850103610d1e565b925050506040519150618000820180820391508183526020830160005b83811015610ff4578281015182820152602001610fdc565b506000920191825250602001604052919050565b600080611013610c82565b61101b610661565b63ffffffff1661102b91906115bc565b611033610600565b61103b61097a565b611046906010611634565b63ffffffff1661105691906115bc565b611060919061157e565b9050600061107184620cc3946115bc565b61109b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd763200611660565b90506110ab6064620f42406116d4565b8112156110c3576110c06064620f42406116d4565b90505b6110cf600660026115bc565b6110da90600a6118b0565b6110e483836115bc565b610e1191906115f9565b6000806110fa836112e6565b90506000611106610600565b61110e61097a565b611119906010611634565b63ffffffff1661112991906115bc565b90506000611135610c82565b61113d610661565b63ffffffff1661114d91906115bc565b9050600061115b828461157e565b61116590856115bc565b90506111736006600a6118b0565b61117e9060106115bc565b61118890826115f9565b9695505050505050565b60008061119e836112e6565b9050600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa158015611201573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112259190611500565b61122d610600565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa15801561128c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b09190611500565b6112ba908561157e565b6112c491906115bc565b6112ce91906115bc565b90506112dc6006600a6118b0565b610e1190826115f9565b80516000908190815b8181101561136957848181518110611309576113096118bc565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166000036113495761134260048461157e565b9250611357565b61135460108461157e565b92505b80611361816118eb565b9150506112ef565b50610e118261044061157e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156113b757600080fd5b813567ffffffffffffffff808211156113cf57600080fd5b818401915084601f8301126113e357600080fd5b8135818111156113f5576113f5611376565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561143b5761143b611376565b8160405282815287602084870101111561145457600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b818110156114a157858101830151858201604001528201611485565b818111156114b3576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156114f957600080fd5b5035919050565b60006020828403121561151257600080fd5b5051919050565b60006020828403121561152b57600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ab857600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156115915761159161154f565b500190565b6000602082840312156115a857600080fd5b815163ffffffff81168114610ab857600080fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115f4576115f461154f565b500290565b60008261162f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600063ffffffff808316818516818304811182151516156116575761165761154f565b02949350505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561169a5761169a61154f565b827f80000000000000000000000000000000000000000000000000000000000000000384128116156116ce576116ce61154f565b50500190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156117155761171561154f565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156117505761175061154f565b6000871292508782058712848416161561176c5761176c61154f565b878505871281841616156117825761178261154f565b505050929093029392505050565b600181815b808511156117e957817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156117cf576117cf61154f565b808516156117dc57918102915b93841c9390800290611795565b509250929050565b600082611800575060016105dd565b8161180d575060006105dd565b8160018114611823576002811461182d57611849565b60019150506105dd565b60ff84111561183e5761183e61154f565b50506001821b6105dd565b5060208310610133831016604e8410600b841016171561186c575081810a6105dd565b6118768383611790565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156118a8576118a861154f565b029392505050565b6000610ab883836117f1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361191c5761191c61154f565b506001019056fea164736f6c634300080f000a") + gasPriceOracleFjordDeploymentBytecode = common.FromHex("0x608060405234801561001057600080fd5b50611951806100206000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80636ef25c3a116100b2578063de26c4a111610081578063f45e65d811610066578063f45e65d81461025b578063f820614014610263578063fe173b971461020d57600080fd5b8063de26c4a114610235578063f1c7a58b1461024857600080fd5b80636ef25c3a1461020d5780638e98b10614610213578063960e3a231461021b578063c59859181461022d57600080fd5b806349948e0e11610109578063519b4bd3116100ee578063519b4bd31461019f57806354fd4d50146101a757806368d5dca6146101f057600080fd5b806349948e0e1461016f5780634ef6e2241461018257600080fd5b80630c18c1621461013b57806322b90ab3146101565780632e0f262514610160578063313ce56714610168575b600080fd5b61014361026b565b6040519081526020015b60405180910390f35b61015e61038c565b005b610143600681565b6006610143565b61014361017d3660046113c6565b6105af565b60005461018f9060ff1681565b604051901515815260200161014d565b610143610600565b6101e36040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b60405161014d9190611495565b6101f8610661565b60405163ffffffff909116815260200161014d565b48610143565b61015e6106e6565b60005461018f90610100900460ff1681565b6101f861097a565b6101436102433660046113c6565b6109db565b610143610256366004611508565b610ad5565b610143610ba5565b610143610c98565b6000805460ff1615610304576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f47617350726963654f7261636c653a206f76657268656164282920697320646560448201527f707265636174656400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103879190611521565b905090565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663e591b2826040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040f919061153a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e2073657420697345636f746f6e6520666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a4016102fb565b60005460ff1615610582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a2045636f746f6e6520616c72656164792060448201527f616374697665000000000000000000000000000000000000000000000000000060648201526084016102fb565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60008054610100900460ff16156105e3576105dd6105cc83610cf9565b516105d890604461159f565b61101e565b92915050565b60005460ff16156105f7576105dd826110b0565b6105dd82611154565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16635cf249696040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166368d5dca66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038791906115b7565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663e591b2826040518163ffffffff1660e01b8152600401602060405180830381865afa158015610745573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610769919061153a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e20736574206973466a6f726420666c61670060648201526084016102fb565b60005460ff166108b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f47617350726963654f7261636c653a20466a6f72642063616e206f6e6c79206260448201527f65206163746976617465642061667465722045636f746f6e650000000000000060648201526084016102fb565b600054610100900460ff161561094c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f47617350726963654f7261636c653a20466a6f726420616c726561647920616360448201527f746976650000000000000000000000000000000000000000000000000000000060648201526084016102fb565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663c59859186040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c2573d6000803e3d6000fd5b60008054610100900460ff1615610a2257620f4240610a0d6109fc84610cf9565b51610a0890604461159f565b6112a8565b610a189060106115dd565b6105dd919061161a565b6000610a2d83611307565b60005490915060ff1615610a415792915050565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac49190611521565b610ace908261159f565b9392505050565b60008054610100900460ff16610b6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f47617350726963654f7261636c653a206765744c314665655570706572426f7560448201527f6e64206f6e6c7920737570706f72747320466a6f72640000000000000000000060648201526084016102fb565b6000610b7a60ff8461161a565b610b84908461159f565b610b8f90601061159f565b610b9a90604461159f565b9050610ace8161101e565b6000805460ff1615610c39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a207363616c61722829206973206465707260448201527f656361746564000000000000000000000000000000000000000000000000000060648201526084016102fb565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663f82061406040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b6060610e90565b818153600101919050565b600082840393505b83811015610ace5782810151828201511860001a1590930292600101610d13565b825b60208210610d80578251610d4b601f83610d00565b52602092909201917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090910190602101610d36565b8115610ace578251610d956001840383610d00565b520160010192915050565b60006001830392505b6101078210610de157610dd38360ff16610dce60fd610dce8760081c60e00189610d00565b610d00565b935061010682039150610da9565b60078210610e0e57610e078360ff16610dce60078503610dce8760081c60e00189610d00565b9050610ace565b610e278360ff16610dce8560081c8560051b0187610d00565b949350505050565b610e88828203610e6c610e5c84600081518060001a8160011a60081b178160021a60101b17915050919050565b639e3779b90260131c611fff1690565b8060021b6040510182815160e01c1860e01b8151188152505050565b600101919050565b6180003860405139618000604051016020830180600d8551820103826002015b81811015610fc3576000805b50508051604051600082901a600183901a60081b1760029290921a60101b91909117639e3779b9810260111c617ffc16909101805160e081811c878603811890911b90911890915284019081830390848410610f185750610f53565b600184019350611fff8211610f4d578251600081901a600182901a60081b1760029190911a60101b178103610f4d5750610f53565b50610ebc565b838310610f61575050610fc3565b60018303925085831115610f7f57610f7c8787888603610d34565b96505b610f93600985016003850160038501610d0b565b9150610fa0878284610da0565b965050610fb884610fb386848601610e2f565b610e2f565b915050809350610eb0565b5050610fd58383848851850103610d34565b925050506040519150618000820180820391508183526020830160005b8381101561100a578281015182820152602001610ff2565b506000920191825250602001604052919050565b60008061102a836112a8565b90506000611036610c98565b61103e610661565b63ffffffff1661104e91906115dd565b611056610600565b61105e61097a565b611069906010611655565b63ffffffff1661107991906115dd565b611083919061159f565b9050611091600660026115dd565b61109c90600a6117a1565b6110a682846115dd565b610e27919061161a565b6000806110bc83611307565b905060006110c8610600565b6110d061097a565b6110db906010611655565b63ffffffff166110eb91906115dd565b905060006110f7610c98565b6110ff610661565b63ffffffff1661110f91906115dd565b9050600061111d828461159f565b61112790856115dd565b90506111356006600a6117a1565b6111409060106115dd565b61114a908261161a565b9695505050505050565b60008061116083611307565b9050600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e79190611521565b6111ef610600565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa15801561124e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112729190611521565b61127c908561159f565b61128691906115dd565b61129091906115dd565b905061129e6006600a6117a1565b610e27908261161a565b6000806112b883620cc3946115dd565b6112e2907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7632006117ad565b90506112f26064620f4240611821565b8112156105dd57610ace6064620f4240611821565b80516000908190815b8181101561138a5784818151811061132a5761132a6118dd565b01602001517fff000000000000000000000000000000000000000000000000000000000000001660000361136a5761136360048461159f565b9250611378565b61137560108461159f565b92505b806113828161190c565b915050611310565b50610e278261044061159f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156113d857600080fd5b813567ffffffffffffffff808211156113f057600080fd5b818401915084601f83011261140457600080fd5b81358181111561141657611416611397565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561145c5761145c611397565b8160405282815287602084870101111561147557600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b818110156114c2578581018301518582016040015282016114a6565b818111156114d4576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60006020828403121561151a57600080fd5b5035919050565b60006020828403121561153357600080fd5b5051919050565b60006020828403121561154c57600080fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610ace57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156115b2576115b2611570565b500190565b6000602082840312156115c957600080fd5b815163ffffffff81168114610ace57600080fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561161557611615611570565b500290565b600082611650577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600063ffffffff8083168185168183048111821515161561167857611678611570565b02949350505050565b600181815b808511156116da57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156116c0576116c0611570565b808516156116cd57918102915b93841c9390800290611686565b509250929050565b6000826116f1575060016105dd565b816116fe575060006105dd565b8160018114611714576002811461171e5761173a565b60019150506105dd565b60ff84111561172f5761172f611570565b50506001821b6105dd565b5060208310610133831016604e8410600b841016171561175d575081810a6105dd565b6117678383611681565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561179957611799611570565b029392505050565b6000610ace83836116e2565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038413811516156117e7576117e7611570565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561181b5761181b611570565b50500190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561186257611862611570565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561189d5761189d611570565b600087129250878205871284841616156118b9576118b9611570565b878505871281841616156118cf576118cf611570565b505050929093029392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361193d5761193d611570565b506001019056fea164736f6c634300080f000a") // Update GasPricePriceOracle Proxy Parameters updateFjordGasPriceOracleSource = UpgradeDepositSource{Intent: "Fjord: Gas Price Oracle Proxy Update"} diff --git a/packages/contracts-bedrock/semver-lock.json b/packages/contracts-bedrock/semver-lock.json index ba64b55d80191..72e5145fe687e 100644 --- a/packages/contracts-bedrock/semver-lock.json +++ b/packages/contracts-bedrock/semver-lock.json @@ -60,8 +60,8 @@ "sourceCodeHash": "0x864d244dd0b01cb01e5f50425bedce46e72005bdb8bead198ac885481547f41d" }, "src/L2/GasPriceOracle.sol": { - "initCodeHash": "0x5234d40f5e9dcc0904650dc732ef35275682ec5272dd9e844539a70d982836df", - "sourceCodeHash": "0xf434f19901d60931dc9262aa838c1d4ced50ff34bd263be50b318aa1b834c5e2" + "initCodeHash": "0x235382db0c03d93628b6609dc9aed5cf60b7f6945d88d13d59049e30b16423d0", + "sourceCodeHash": "0x5794b836406ff3b340b2208c8555077861732c9eab048e05ffed7416d20ac992" }, "src/L2/L1Block.sol": { "initCodeHash": "0xda6828a2a6e02d9fde7d5d9947f51b207f31abf5dbb538dd968cd491164e2115", diff --git a/packages/contracts-bedrock/src/L2/GasPriceOracle.sol b/packages/contracts-bedrock/src/L2/GasPriceOracle.sol index dc89a9407f829..6335a96094924 100644 --- a/packages/contracts-bedrock/src/L2/GasPriceOracle.sol +++ b/packages/contracts-bedrock/src/L2/GasPriceOracle.sol @@ -159,7 +159,8 @@ contract GasPriceOracle is ISemver { if (isFjord) { // Add 68 to the size to account for unsigned tx // Assume the compressed data is mostly non-zero, and would pay 16 gas per calldata byte - return (LibZip.flzCompress(_data).length + 68) * 16; + // Divide by 1e6 due to the scaling factor of the linear regression + return _fjordLinearRegression(LibZip.flzCompress(_data).length + 68) * 16 / 1e6; } uint256 l1GasUsed = _getCalldataGas(_data); if (isEcotone) { @@ -206,14 +207,23 @@ contract GasPriceOracle is ISemver { } /// @notice Fjord L1 cost based on the compressed and original tx size. - /// @param _fastLzSize fastlz compressed tx size. + /// @param _fastLzSize estimated compressed tx size. /// @return Fjord L1 fee that should be paid for the tx function _fjordL1Cost(uint256 _fastLzSize) internal view returns (uint256) { + // Apply the linear regression to estimate the Brotli 10 size + uint256 estimatedSize = _fjordLinearRegression(_fastLzSize); uint256 feeScaled = baseFeeScalar() * 16 * l1BaseFee() + blobBaseFeeScalar() * blobBaseFee(); + return estimatedSize * feeScaled / (10 ** (DECIMALS * 2)); + } + + /// @notice Takes the fastLz size compression and returns the estimated Brotli + /// @param _fastLzSize fastlz compressed tx size. + /// @return Number of bytes in the compressed transaction + function _fjordLinearRegression(uint256 _fastLzSize) internal pure returns (uint256) { int256 estimatedSize = COST_INTERCEPT + int256(COST_FASTLZ_COEF * _fastLzSize); if (estimatedSize < int256(MIN_TRANSACTION_SIZE) * 1e6) { estimatedSize = int256(MIN_TRANSACTION_SIZE) * 1e6; } - return uint256(estimatedSize) * feeScaled / (10 ** (DECIMALS * 2)); + return uint256(estimatedSize); } } diff --git a/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol b/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol index e3789ee23f490..08815d1c877eb 100644 --- a/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol +++ b/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol @@ -289,7 +289,7 @@ contract GasPriceOracleFjordActive_Test is GasPriceOracle_Test { function test_getL1FeeMinimumBound_succeeds() external view { bytes memory data = hex"0000010203"; // fastlzSize: 74, inc signature uint256 gas = gasPriceOracle.getL1GasUsed(data); - assertEq(gas, 1184); // 74 * 16 + assertEq(gas, 1600); // 100 * 16 uint256 price = gasPriceOracle.getL1Fee(data); // linearRegression = -42.5856 + 74 * 0.8365 = 19.3154 // under the minTxSize of 71, so output is ignored @@ -307,7 +307,7 @@ contract GasPriceOracleFjordActive_Test is GasPriceOracle_Test { hex"dba6d6d796e4f80be94f8a9151d685607826e7ba25177b40cb127ea9f1438470"; uint256 gas = gasPriceOracle.getL1GasUsed(data); - assertEq(gas, 3760); // 235 * 16 + assertEq(gas, 2463); // 235 * 16 uint256 price = gasPriceOracle.getL1Fee(data); // linearRegression = -42.5856 + 235 * 0.8365 = 153.9919 // 153_991_900 * (20 * 16 * 2 * 1e6 + 3 * 1e6 * 15) / 1e12