diff --git a/go.mod b/go.mod index 7e582724fa192..789e145b6fefe 100644 --- a/go.mod +++ b/go.mod @@ -308,7 +308,7 @@ require ( lukechampine.com/blake3 v1.3.0 // indirect ) -replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101603.2-0.20251014161648-ded9c88e417b +replace github.com/ethereum/go-ethereum => github.com/ethereum-optimism/op-geth v1.101603.2-0.20251016091451-5c6d276814f2 // replace github.com/ethereum/go-ethereum => ../op-geth diff --git a/go.sum b/go.sum index 908b8bc83cc57..58101d0357309 100644 --- a/go.sum +++ b/go.sum @@ -238,8 +238,8 @@ github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.4-0.20251001155152-4eb15ccedf7e h1:iy1vBIzACYUyOVyoADUwvAiq2eOPC0yVsDUdolPwQjk= github.com/ethereum-optimism/go-ethereum-hdwallet v0.1.4-0.20251001155152-4eb15ccedf7e/go.mod h1:DYj7+vYJ4cIB7zera9mv4LcAynCL5u4YVfoeUu6Wa+w= -github.com/ethereum-optimism/op-geth v1.101603.2-0.20251014161648-ded9c88e417b h1:5FhpB8a0wXp/11jd6OnUIX3Blwy2Wh9aa+z+AA9amUM= -github.com/ethereum-optimism/op-geth v1.101603.2-0.20251014161648-ded9c88e417b/go.mod h1:Ct2QjqZ2UKgvvgKLLYzoh/DBicJZB8DXsv45DgEjcco= +github.com/ethereum-optimism/op-geth v1.101603.2-0.20251016091451-5c6d276814f2 h1:fvYTR+KOcvSDd/gJuh+ALG/Fx7Y0xU3ZaDkgT/kqVi0= +github.com/ethereum-optimism/op-geth v1.101603.2-0.20251016091451-5c6d276814f2/go.mod h1:Ct2QjqZ2UKgvvgKLLYzoh/DBicJZB8DXsv45DgEjcco= github.com/ethereum-optimism/superchain-registry/validation v0.0.0-20251009180028-9b4658b9b7af h1:WWz0gJM/boaUImtJnROecPirAerKCLpAU4m6Tx0ArOg= github.com/ethereum-optimism/superchain-registry/validation v0.0.0-20251009180028-9b4658b9b7af/go.mod h1:NZ816PzLU1TLv1RdAvYAb6KWOj4Zm5aInT0YpDVml2Y= github.com/ethereum/c-kzg-4844/v2 v2.1.0 h1:gQropX9YFBhl3g4HYhwE70zq3IHFRgbbNPw0Shwzf5w= diff --git a/op-acceptance-tests/tests/isthmus/operator_fee/operator_fee_test.go b/op-acceptance-tests/tests/isthmus/operator_fee/operator_fee_test.go index e9a3f192b16a9..856aebeba4872 100644 --- a/op-acceptance-tests/tests/isthmus/operator_fee/operator_fee_test.go +++ b/op-acceptance-tests/tests/isthmus/operator_fee/operator_fee_test.go @@ -1,65 +1,18 @@ package operatorfee import ( - "math/big" "testing" "github.com/ethereum-optimism/optimism/op-devstack/devtest" "github.com/ethereum-optimism/optimism/op-devstack/dsl" "github.com/ethereum-optimism/optimism/op-devstack/presets" "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-service/eth" ) func TestOperatorFee(gt *testing.T) { t := devtest.SerialT(gt) sys := presets.NewMinimal(t) - require := t.Require() - err := dsl.RequiresL2Fork(t.Ctx(), sys, 0, rollup.Isthmus) - require.NoError(err, "Isthmus fork must be active for this test") - - fundAmount := eth.OneTenthEther - alice := sys.FunderL2.NewFundedEOA(fundAmount) - - alice.WaitForBalance(fundAmount) - bob := sys.Wallet.NewEOA(sys.L2EL) - - operatorFee := dsl.NewOperatorFee(t, sys.L2Chain, sys.L1EL) - - operatorFee.CheckCompatibility() - systemOwner := operatorFee.GetSystemOwner() - sys.FunderL1.FundAtLeast(systemOwner, fundAmount) - - // First, ensure L2 is synced with current L1 state before starting tests - t.Log("Ensuring L2 is synced with current L1 state...") - operatorFee.WaitForL2SyncWithCurrentL1State() - - testCases := []struct { - name string - scalar uint32 - constant uint64 - }{ - {"ZeroFees", 0, 0}, - {"NonZeroFees", 300, 400}, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t devtest.T) { - operatorFee.SetOperatorFee(tc.scalar, tc.constant) - operatorFee.WaitForL2Sync(tc.scalar, tc.constant) - operatorFee.VerifyL2Config(tc.scalar, tc.constant) - - result := operatorFee.ValidateTransactionFees(alice, bob, big.NewInt(1000), tc.scalar, tc.constant) - - t.Log("Test completed successfully:", - "testCase", tc.name, - "gasUsed", result.TransactionReceipt.GasUsed, - "actualTotalFee", result.ActualTotalFee.String(), - "expectedOperatorFee", result.ExpectedOperatorFee.String(), - "vaultBalanceIncrease", result.VaultBalanceIncrease.String()) - }) - } - - operatorFee.RestoreOriginalConfig() + t.Require().NoError(err, "Isthmus fork must be active for this test") + dsl.RunOperatorFeeTest(t, sys.L2Chain, sys.L1EL, sys.FunderL1, sys.FunderL2) } diff --git a/op-acceptance-tests/tests/jovian/operator_fee_test.go b/op-acceptance-tests/tests/jovian/operator_fee_test.go new file mode 100644 index 0000000000000..e2e9e046a4b7f --- /dev/null +++ b/op-acceptance-tests/tests/jovian/operator_fee_test.go @@ -0,0 +1,18 @@ +package jovian + +import ( + "testing" + + "github.com/ethereum-optimism/optimism/op-devstack/devtest" + "github.com/ethereum-optimism/optimism/op-devstack/dsl" + "github.com/ethereum-optimism/optimism/op-devstack/presets" + "github.com/ethereum-optimism/optimism/op-node/rollup" +) + +func TestOperatorFee(gt *testing.T) { + t := devtest.SerialT(gt) + sys := presets.NewMinimal(t) + err := dsl.RequiresL2Fork(t.Ctx(), sys, 0, rollup.Jovian) + t.Require().NoError(err, "Jovian fork must be active for this test") + dsl.RunOperatorFeeTest(t, sys.L2Chain, sys.L1EL, sys.FunderL1, sys.FunderL2) +} diff --git a/op-devstack/dsl/bridge.go b/op-devstack/dsl/bridge.go index 8f59070d7d56f..238abcffb546e 100644 --- a/op-devstack/dsl/bridge.go +++ b/op-devstack/dsl/bridge.go @@ -149,11 +149,15 @@ func (b *StandardBridge) UsesSuperRoots() bool { } type Deposit struct { + bridge *StandardBridge l1Receipt *types.Receipt } func (d Deposit) GasCost() eth.ETH { - return gasCost(d.l1Receipt) + if d.bridge == nil { + panic("bridge reference not set on deposit") + } + return d.bridge.gasCost(d.l1Receipt, d.bridge.l1Client) } func (b *StandardBridge) Deposit(amount eth.ETH, from *EOA) Deposit { @@ -175,6 +179,7 @@ func (b *StandardBridge) Deposit(amount eth.ETH, from *EOA) Deposit { }, 60*time.Second, 500*time.Millisecond, "L2 Deposit never found") b.require.Equal(types.ReceiptStatusSuccessful, l2DepositReceipt.Status) return Deposit{ + bridge: b, l1Receipt: l1DepositReceipt, } } @@ -220,6 +225,7 @@ func (b *StandardBridge) ERC20Deposit(l1TokenAddr common.Address, l2TokenAddr co b.require.Equal(types.ReceiptStatusSuccessful, l2DepositReceipt.Status, "L2 ERC20 deposit should succeed") return &Deposit{ + bridge: b, l1Receipt: depositReceipt, } } @@ -345,17 +351,17 @@ type Withdrawal struct { } func (w *Withdrawal) InitiateGasCost() eth.ETH { - return gasCost(w.initReceipt) + return w.bridge.gasCost(w.initReceipt, w.bridge.l2Client) } func (w *Withdrawal) ProveGasCost() eth.ETH { w.require.NotNil(w.proveReceipt, "Must have proven withdrawal before calculating gas cost") - return gasCost(w.proveReceipt) + return w.bridge.gasCost(w.proveReceipt, w.bridge.l1Client) } func (w *Withdrawal) FinalizeGasCost() eth.ETH { w.require.NotNil(w.finalizeReceipt, "Must have finalized withdrawal before calculating gas cost") - return gasCost(w.finalizeReceipt) + return w.bridge.gasCost(w.finalizeReceipt, w.bridge.l1Client) } func (w *Withdrawal) InitiateBlockHash() common.Hash { @@ -563,18 +569,47 @@ func (w *Withdrawal) WaitForDisputeGameResolved() { }, 60*time.Second, 100*time.Millisecond, "wait for dispute game resolved") } -func gasCost(rcpt *types.Receipt) eth.ETH { +func (b *StandardBridge) gasCost(rcpt *types.Receipt, client apis.EthClient) eth.ETH { + var blockTimestamp *uint64 + if hasOperatorFee(rcpt) { + b.require.NotNil(client, "client is required to resolve operator fee timestamp") + blockTimestamp = b.receiptTimestamp(rcpt, client) + } + return gasCost(rcpt, b.rollupCfg, blockTimestamp) +} + +func hasOperatorFee(rcpt *types.Receipt) bool { + return rcpt.OperatorFeeConstant != nil && rcpt.OperatorFeeScalar != nil +} + +func (b *StandardBridge) receiptTimestamp(rcpt *types.Receipt, client apis.EthClient) *uint64 { + b.require.NotNil(rcpt.BlockNumber, "receipt missing block number") + blockInfo, err := client.InfoByNumber(b.ctx, rcpt.BlockNumber.Uint64()) + b.require.NoError(err, "failed to fetch block info for receipt") + ts := blockInfo.Time() + return &ts +} + +func gasCost(rcpt *types.Receipt, rollupCfg *rollup.Config, blockTimestamp *uint64) eth.ETH { cost := eth.WeiBig(new(big.Int).Mul(new(big.Int).SetUint64(rcpt.GasUsed), rcpt.EffectiveGasPrice)) if rcpt.L1Fee != nil { cost = cost.Add(eth.WeiBig(rcpt.L1Fee)) } - if rcpt.OperatorFeeConstant != nil && rcpt.OperatorFeeScalar != nil { - // https://github.com/ethereum-optimism/op-geth/blob/6005dd53e1b50fe5a3f59764e3e2056a639eff2f/core/types/rollup_cost.go#L244-L247 - // Also see: https://specs.optimism.io/protocol/isthmus/exec-engine.html#operator-operatorCost + if hasOperatorFee(rcpt) { + if rollupCfg == nil { + panic("rollup config is required to compute operator fee") + } + if blockTimestamp == nil { + panic("block timestamp is required to compute operator fee") + } operatorCost := new(big.Int).SetUint64(rcpt.GasUsed) operatorCost.Mul(operatorCost, new(big.Int).SetUint64(*rcpt.OperatorFeeScalar)) - operatorCost = operatorCost.Div(operatorCost, big.NewInt(1_000_000)) - operatorCost = operatorCost.Add(operatorCost, new(big.Int).SetUint64(*rcpt.OperatorFeeConstant)) + if rollupCfg.IsOperatorFeeFix(*blockTimestamp) { + operatorCost.Mul(operatorCost, big.NewInt(100)) + } else { + operatorCost.Div(operatorCost, big.NewInt(1_000_000)) + } + operatorCost.Add(operatorCost, new(big.Int).SetUint64(*rcpt.OperatorFeeConstant)) cost = cost.Add(eth.WeiBig(operatorCost)) } return cost diff --git a/op-devstack/dsl/l2_network.go b/op-devstack/dsl/l2_network.go index fa0572da12670..bdba587724a22 100644 --- a/op-devstack/dsl/l2_network.go +++ b/op-devstack/dsl/l2_network.go @@ -192,6 +192,10 @@ func (n *L2Network) IsActivated(timestamp uint64) bool { return head.Number >= blockNum } +func (n *L2Network) IsForkActive(forkName rollup.ForkName, timestamp uint64) bool { + return n.Escape().RollupConfig().IsForkActive(forkName, timestamp) +} + // LatestBlockBeforeTimestamp finds the latest block before fork activation func (n *L2Network) LatestBlockBeforeTimestamp(t devtest.T, timestamp uint64) eth.BlockRef { require := t.Require() diff --git a/op-devstack/dsl/operator_fee.go b/op-devstack/dsl/operator_fee.go index e9232b15af3cd..71559ddc70007 100644 --- a/op-devstack/dsl/operator_fee.go +++ b/op-devstack/dsl/operator_fee.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum-optimism/optimism/op-chain-ops/devkeys" "github.com/ethereum-optimism/optimism/op-devstack/devtest" "github.com/ethereum-optimism/optimism/op-devstack/stack/match" + "github.com/ethereum-optimism/optimism/op-node/rollup" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/predeploys" "github.com/ethereum-optimism/optimism/op-service/txintent/bindings" @@ -17,10 +18,11 @@ import ( type OperatorFee struct { commonImpl - l1Client *L1ELNode - l2Network *L2Network - systemConfig bindings.SystemConfig - l1Block bindings.L1Block + l1Client *L1ELNode + l2Network *L2Network + systemConfig bindings.SystemConfig + l1Block bindings.L1Block + gasPriceOracle bindings.GasPriceOracle originalScalar uint32 originalConstant uint64 @@ -44,6 +46,11 @@ func NewOperatorFee(t devtest.T, l2Network *L2Network, l1EL *L1ELNode) *Operator bindings.WithTo(predeploys.L1BlockAddr), bindings.WithTest(t)) + gasPriceOracle := bindings.NewBindings[bindings.GasPriceOracle]( + bindings.WithClient(l2Network.inner.L2ELNode(match.FirstL2EL).EthClient()), + bindings.WithTo(predeploys.GasPriceOracleAddr), + bindings.WithTest(t)) + originalScalar, err := contractio.Read(systemConfig.OperatorFeeScalar(), t.Ctx()) t.Require().NoError(err) originalConstant, err := contractio.Read(systemConfig.OperatorFeeConstant(), t.Ctx()) @@ -55,6 +62,7 @@ func NewOperatorFee(t devtest.T, l2Network *L2Network, l1EL *L1ELNode) *Operator l2Network: l2Network, systemConfig: systemConfig, l1Block: l1Block, + gasPriceOracle: gasPriceOracle, originalScalar: originalScalar, originalConstant: originalConstant, } @@ -131,6 +139,11 @@ func (of *OperatorFee) ValidateTransactionFees(from *EOA, to *EOA, amount *big.I of.require.NoError(err) of.require.Equal(types.ReceiptStatusSuccessful, receipt.Status) + blockHash := receipt.BlockHash + blockRef, err := from.el.stackEL().EthClient().BlockRefByHash(of.ctx, blockHash) + of.require.NoError(err) + isJovian := of.l2Network.IsForkActive(rollup.Jovian, blockRef.Time) + vaultAfter, err := from.el.stackEL().EthClient().BalanceAt(of.ctx, predeploys.OperatorFeeVaultAddr, nil) of.require.NoError(err) @@ -140,8 +153,19 @@ func (of *OperatorFee) ValidateTransactionFees(from *EOA, to *EOA, amount *big.I if expectedScalar == 0 && expectedConstant == 0 { expectedOperatorFee = big.NewInt(0) } else { + isJovianinGPO, err := contractio.Read(of.gasPriceOracle.IsJovian(), of.ctx) + of.require.NoError(err) + operatorFee := new(big.Int).Mul(big.NewInt(int64(receipt.GasUsed)), big.NewInt(int64(expectedScalar))) - operatorFee.Div(operatorFee, big.NewInt(1000000)) + if isJovian { + of.require.Equal(isJovianinGPO, true) + // Jovian formula: (gasUsed * operatorFeeScalar * 100) + operatorFeeConstant + operatorFee.Mul(operatorFee, big.NewInt(100)) + } else { + of.require.Equal(isJovianinGPO, false) + // Isthmus formula: (gasUsed * operatorFeeScalar / 1e6) + operatorFeeConstant + operatorFee.Div(operatorFee, big.NewInt(1000000)) + } operatorFee.Add(operatorFee, big.NewInt(int64(expectedConstant))) expectedOperatorFee = operatorFee } @@ -156,6 +180,14 @@ func (of *OperatorFee) ValidateTransactionFees(from *EOA, to *EOA, amount *big.I actualTotalFee.Add(actualTotalFee, receipt.L1Fee) } + if expectedScalar != 0 || expectedConstant != 0 { + of.require.NotNil(receipt.OperatorFeeScalar) + of.require.NotNil(receipt.OperatorFeeConstant) + + of.require.Equal(expectedScalar, uint32(*receipt.OperatorFeeScalar)) + of.require.Equal(expectedConstant, *receipt.OperatorFeeConstant) + } + return OperatorFeeValidationResult{ TransactionReceipt: receipt, ExpectedOperatorFee: expectedOperatorFee, @@ -167,3 +199,47 @@ func (of *OperatorFee) ValidateTransactionFees(from *EOA, to *EOA, amount *big.I func (of *OperatorFee) RestoreOriginalConfig() { of.SetOperatorFee(of.originalScalar, of.originalConstant) } + +func RunOperatorFeeTest(t devtest.T, l2Chain *L2Network, l1EL *L1ELNode, funderL1, funderL2 *Funder) { + fundAmount := eth.OneTenthEther + alice := funderL2.NewFundedEOA(fundAmount) + alice.WaitForBalance(fundAmount) + bob := funderL2.NewFundedEOA(eth.ZeroWei) + + operatorFee := NewOperatorFee(t, l2Chain, l1EL) + operatorFee.CheckCompatibility() + systemOwner := operatorFee.GetSystemOwner() + funderL1.FundAtLeast(systemOwner, fundAmount) + + // First, ensure L2 is synced with current L1 state before starting tests + t.Log("Ensuring L2 is synced with current L1 state...") + operatorFee.WaitForL2SyncWithCurrentL1State() + + testCases := []struct { + name string + scalar uint32 + constant uint64 + }{ + {"ZeroFees", 0, 0}, + {"NonZeroFees", 300, 400}, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t devtest.T) { + operatorFee.SetOperatorFee(tc.scalar, tc.constant) + operatorFee.WaitForL2Sync(tc.scalar, tc.constant) + operatorFee.VerifyL2Config(tc.scalar, tc.constant) + + result := operatorFee.ValidateTransactionFees(alice, bob, big.NewInt(1000), tc.scalar, tc.constant) + + t.Log("Test completed successfully:", + "testCase", tc.name, + "gasUsed", result.TransactionReceipt.GasUsed, + "actualTotalFee", result.ActualTotalFee.String(), + "expectedOperatorFee", result.ExpectedOperatorFee.String(), + "vaultBalanceIncrease", result.VaultBalanceIncrease.String()) + }) + } + + operatorFee.RestoreOriginalConfig() +} diff --git a/op-e2e/actions/proofs/operator_fee_test.go b/op-e2e/actions/proofs/operator_fee_test.go index 157f55929ba1d..b024be821a9eb 100644 --- a/op-e2e/actions/proofs/operator_fee_test.go +++ b/op-e2e/actions/proofs/operator_fee_test.go @@ -41,7 +41,7 @@ func Test_ProgramAction_OperatorFeeConsistency(gt *testing.T) { // The deployed bytecode below is from the contract above testStorageUpdateContractCode := common.FromHex("0x6080604052348015600e575f80fd5b50600436106026575f3560e01c806360fe47b114602a575b5f80fd5b60406004803603810190603c9190607d565b6042565b005b805f8190555050565b5f80fd5b5f819050919050565b605f81604f565b81146068575f80fd5b50565b5f813590506077816058565b92915050565b5f60208284031215608f57608e604b565b5b5f609a84828501606b565b9150509291505056fea26469706673582212201712a1e6e9c5e2ba1f8f7403f5d6e00090c6fa2b70c632beea4be8009331bd2064736f6c63430008190033") - runIsthmusDerivationTest := func(gt *testing.T, testCfg *helpers.TestCfg[testCase]) { + runJovianDerivationTest := func(gt *testing.T, testCfg *helpers.TestCfg[testCase]) { t := actionsHelpers.NewDefaultTesting(gt) deployConfigOverrides := func(dp *genesis.DeployConfig) {} @@ -297,8 +297,23 @@ func Test_ProgramAction_OperatorFeeConsistency(gt *testing.T) { require.Equal(t, testOperatorFeeConstant, *receipt.OperatorFeeConstant) // Check that the operator fee sent to the vault is correct - require.Equal(t, - new(big.Int).Add( + // Determine which formula to use based on whether Jovian is active + var expectedOperatorFee *big.Int + if env.Sd.RollupCfg.IsJovian(l2UnsafeHead.Time) { + // Jovian formula: (gasUsed * operatorFeeScalar * 100) + operatorFeeConstant + expectedOperatorFee = new(big.Int).Add( + new(big.Int).Mul( + new(big.Int).Mul( + new(big.Int).SetUint64(receipt.GasUsed), + new(big.Int).SetUint64(uint64(testOperatorFeeScalar)), + ), + new(big.Int).SetUint64(100), + ), + new(big.Int).SetUint64(testOperatorFeeConstant), + ) + } else { + // Isthmus formula: (gasUsed * operatorFeeScalar / 1e6) + operatorFeeConstant + expectedOperatorFee = new(big.Int).Add( new(big.Int).Div( new(big.Int).Mul( new(big.Int).SetUint64(receipt.GasUsed), @@ -307,7 +322,11 @@ func Test_ProgramAction_OperatorFeeConsistency(gt *testing.T) { new(big.Int).SetUint64(1e6), ), new(big.Int).SetUint64(testOperatorFeeConstant), - ), + ) + } + + require.Equal(t, + expectedOperatorFee, new(big.Int).Sub(operatorFeeVaultFinalBalance, operatorFeeVaultInitialBalance), ) } @@ -373,11 +392,11 @@ func Test_ProgramAction_OperatorFeeConsistency(gt *testing.T) { } matrix := helpers.NewMatrix[testCase]() - matrix.AddDefaultTestCasesWithName("NormalTx", NormalTx, helpers.NewForkMatrix(helpers.Isthmus), runIsthmusDerivationTest) - matrix.AddDefaultTestCasesWithName("DepositTx", DepositTx, helpers.NewForkMatrix(helpers.Isthmus), runIsthmusDerivationTest) - matrix.AddDefaultTestCasesWithName("StateRefund", StateRefund, helpers.NewForkMatrix(helpers.Isthmus), runIsthmusDerivationTest) - matrix.AddDefaultTestCasesWithName("NotEnoughFundsInBatchMissingOpFee", NotEnoughFundsInBatchMissingOpFee, helpers.NewForkMatrix(helpers.Holocene, helpers.Isthmus), runIsthmusDerivationTest) - matrix.AddDefaultTestCasesWithName("IsthmusTransitionBlock", IsthmusTransitionBlock, helpers.NewForkMatrix(helpers.Holocene), runIsthmusDerivationTest) + matrix.AddDefaultTestCasesWithName("NormalTx", NormalTx, helpers.NewForkMatrix(helpers.Isthmus, helpers.Jovian), runJovianDerivationTest) + matrix.AddDefaultTestCasesWithName("DepositTx", DepositTx, helpers.NewForkMatrix(helpers.Isthmus, helpers.Jovian), runJovianDerivationTest) + matrix.AddDefaultTestCasesWithName("StateRefund", StateRefund, helpers.NewForkMatrix(helpers.Isthmus, helpers.Jovian), runJovianDerivationTest) + matrix.AddDefaultTestCasesWithName("NotEnoughFundsInBatchMissingOpFee", NotEnoughFundsInBatchMissingOpFee, helpers.NewForkMatrix(helpers.Holocene, helpers.Isthmus, helpers.Jovian), runJovianDerivationTest) + matrix.AddDefaultTestCasesWithName("IsthmusTransitionBlock", IsthmusTransitionBlock, helpers.NewForkMatrix(helpers.Holocene), runJovianDerivationTest) matrix.Run(gt) } diff --git a/op-e2e/bindings/gaspriceoracle.go b/op-e2e/bindings/gaspriceoracle.go index c50bf674be9e0..0e0ba67a4c861 100644 --- a/op-e2e/bindings/gaspriceoracle.go +++ b/op-e2e/bindings/gaspriceoracle.go @@ -26,12 +26,13 @@ var ( _ = common.Big1 _ = types.BloomLookup _ = event.NewSubscription + _ = abi.ConvertType ) // GasPriceOracleMetaData contains all meta data concerning the GasPriceOracle contract. var GasPriceOracleMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"DECIMALS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseFeeScalar\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blobBaseFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blobBaseFeeScalar\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"getL1Fee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_unsignedTxSize\",\"type\":\"uint256\"}],\"name\":\"getL1FeeUpperBound\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"getL1GasUsed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasUsed\",\"type\":\"uint256\"}],\"name\":\"getOperatorFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isEcotone\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isFjord\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isIsthmus\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1BaseFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"overhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"scalar\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"setEcotone\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"setFjord\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"setIsthmus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b50611c08806100206000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806368d5dca6116100d8578063c59859181161008c578063f45e65d811610066578063f45e65d8146102ca578063f8206140146102d2578063fe173b971461026957600080fd5b8063c59859181461029c578063de26c4a1146102a4578063f1c7a58b146102b757600080fd5b80638e98b106116100bd5780638e98b1061461026f578063960e3a2314610277578063b54501bc1461028957600080fd5b806368d5dca61461024c5780636ef25c3a1461026957600080fd5b8063313ce5671161012f5780634ef6e224116101145780634ef6e224146101de578063519b4bd3146101fb57806354fd4d501461020357600080fd5b8063313ce567146101c457806349948e0e146101cb57600080fd5b8063275aedd211610160578063275aedd2146101a1578063291b0383146101b45780632e0f2625146101bc57600080fd5b80630c18c1621461017c57806322b90ab314610197575b600080fd5b6101846102da565b6040519081526020015b60405180910390f35b61019f6103fb565b005b6101846101af36600461165a565b610584565b61019f6106db565b610184600681565b6006610184565b6101846101d93660046116a2565b610903565b6000546101eb9060ff1681565b604051901515815260200161018e565b61018461093a565b61023f6040518060400160405280600c81526020017f312e332e312d626574612e35000000000000000000000000000000000000000081525081565b60405161018e9190611771565b61025461099b565b60405163ffffffff909116815260200161018e565b48610184565b61019f610a20565b6000546101eb90610100900460ff1681565b6000546101eb9062010000900460ff1681565b610254610c1a565b6101846102b23660046116a2565b610c7b565b6101846102c536600461165a565b610d75565b610184610e51565b610184610f44565b6000805460ff1615610373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f47617350726963654f7261636c653a206f76657268656164282920697320646560448201527f707265636174656400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f691906117e4565b905090565b3373deaddeaddeaddeaddeaddeaddeaddeaddead0001146104c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e2073657420697345636f746f6e6520666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a40161036a565b60005460ff1615610557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a2045636f746f6e6520616c72656164792060448201527f6163746976650000000000000000000000000000000000000000000000000000606482015260840161036a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000805462010000900460ff1661059d57506000919050565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166316d3bc7f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062091906117fd565b67ffffffffffffffff16620f424073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16634d5d9a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b19190611827565b6106c19063ffffffff168561187c565b6106cb91906118b9565b6106d591906118f4565b92915050565b3373deaddeaddeaddeaddeaddeaddeaddeaddead0001146107a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e20736574206973497374686d757320666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a40161036a565b600054610100900460ff1661083b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f47617350726963654f7261636c653a20497374686d75732063616e206f6e6c7960448201527f2062652061637469766174656420616674657220466a6f726400000000000000606482015260840161036a565b60005462010000900460ff16156108d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a20497374686d757320616c72656164792060448201527f6163746976650000000000000000000000000000000000000000000000000000606482015260840161036a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055565b60008054610100900460ff161561091d576106d582610fa5565b60005460ff1615610931576106d582610fc4565b6106d582611068565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16635cf249696040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d2573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166368d5dca66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f69190611827565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e20736574206973466a6f726420666c616700606482015260840161036a565b60005460ff16610b55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f47617350726963654f7261636c653a20466a6f72642063616e206f6e6c79206260448201527f65206163746976617465642061667465722045636f746f6e6500000000000000606482015260840161036a565b600054610100900460ff1615610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f47617350726963654f7261636c653a20466a6f726420616c726561647920616360448201527f7469766500000000000000000000000000000000000000000000000000000000606482015260840161036a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663c59859186040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109fc573d6000803e3d6000fd5b60008054610100900460ff1615610cc257620f4240610cad610c9c846111bc565b51610ca89060446118f4565b6114d9565b610cb890601061187c565b6106d591906118b9565b6000610ccd83611538565b60005490915060ff1615610ce15792915050565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6491906117e4565b610d6e90826118f4565b9392505050565b60008054610100900460ff16610e0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f47617350726963654f7261636c653a206765744c314665655570706572426f7560448201527f6e64206f6e6c7920737570706f72747320466a6f726400000000000000000000606482015260840161036a565b6000610e1a8360446118f4565b90506000610e2960ff836118b9565b610e3390836118f4565b610e3e9060106118f4565b9050610e49816115c8565b949350505050565b6000805460ff1615610ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a207363616c61722829206973206465707260448201527f6563617465640000000000000000000000000000000000000000000000000000606482015260840161036a565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d2573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663f82061406040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103d2573d6000803e3d6000fd5b60006106d5610fb3836111bc565b51610fbf9060446118f4565b6115c8565b600080610fd083611538565b90506000610fdc61093a565b610fe4610c1a565b610fef90601061190c565b63ffffffff16610fff919061187c565b9050600061100b610f44565b61101361099b565b63ffffffff16611023919061187c565b9050600061103182846118f4565b61103b908561187c565b90506110496006600a611a58565b61105490601061187c565b61105e90826118b9565b9695505050505050565b60008061107483611538565b9050600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb91906117e4565b61110361093a565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611162573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118691906117e4565b61119090856118f4565b61119a919061187c565b6111a4919061187c565b90506111b26006600a611a58565b610e4990826118b9565b606061134b565b818153600101919050565b600082840393505b83811015610d6e5782810151828201511860001a15909302926001016111d6565b825b6020821061124357825161120e601f836111c3565b52602092909201917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101906021016111f9565b8115610d6e57825161125860018403836111c3565b520160010192915050565b60006001830392505b61010782106112a4576112968360ff1661129160fd6112918760081c60e001896111c3565b6111c3565b93506101068203915061126c565b600782106112d1576112ca8360ff16611291600785036112918760081c60e001896111c3565b9050610d6e565b610e498360ff166112918560081c8560051b01876111c3565b61134382820361132761131784600081518060001a8160011a60081b178160021a60101b17915050919050565b639e3779b90260131c611fff1690565b8060021b6040510182815160e01c1860e01b8151188152505050565b600101919050565b6180003860405139618000604051016020830180600d8551820103826002015b8181101561147e576000805b50508051604051600082901a600183901a60081b1760029290921a60101b91909117639e3779b9810260111c617ffc16909101805160e081811c878603811890911b909118909152840190818303908484106113d3575061140e565b600184019350611fff8211611408578251600081901a600182901a60081b1760029190911a60101b178103611408575061140e565b50611377565b83831061141c57505061147e565b6001830392508583111561143a5761143787878886036111f7565b96505b61144e6009850160038501600385016111ce565b915061145b878284611263565b9650506114738461146e868486016112ea565b6112ea565b91505080935061136b565b505061149083838488518501036111f7565b925050506040519150618000820180820391508183526020830160005b838110156114c55782810151828201526020016114ad565b506000920191825250602001604052919050565b6000806114e983620cc39461187c565b611513907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd763200611a64565b90506115236064620f4240611ad8565b8112156106d557610d6e6064620f4240611ad8565b80516000908190815b818110156115bb5784818151811061155b5761155b611b94565b01602001517fff000000000000000000000000000000000000000000000000000000000000001660000361159b576115946004846118f4565b92506115a9565b6115a66010846118f4565b92505b806115b381611bc3565b915050611541565b50610e49826104406118f4565b6000806115d4836114d9565b905060006115e0610f44565b6115e861099b565b63ffffffff166115f8919061187c565b61160061093a565b611608610c1a565b61161390601061190c565b63ffffffff16611623919061187c565b61162d91906118f4565b905061163b6006600261187c565b61164690600a611a58565b611650828461187c565b610e4991906118b9565b60006020828403121561166c57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156116b457600080fd5b813567ffffffffffffffff808211156116cc57600080fd5b818401915084601f8301126116e057600080fd5b8135818111156116f2576116f2611673565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561173857611738611673565b8160405282815287602084870101111561175157600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b8181101561179e57858101830151858201604001528201611782565b818111156117b0576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000602082840312156117f657600080fd5b5051919050565b60006020828403121561180f57600080fd5b815167ffffffffffffffff81168114610d6e57600080fd5b60006020828403121561183957600080fd5b815163ffffffff81168114610d6e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156118b4576118b461184d565b500290565b6000826118ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600082198211156119075761190761184d565b500190565b600063ffffffff8083168185168183048111821515161561192f5761192f61184d565b02949350505050565b600181815b8085111561199157817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156119775761197761184d565b8085161561198457918102915b93841c939080029061193d565b509250929050565b6000826119a8575060016106d5565b816119b5575060006106d5565b81600181146119cb57600281146119d5576119f1565b60019150506106d5565b60ff8411156119e6576119e661184d565b50506001821b6106d5565b5060208310610133831016604e8410600b8410161715611a14575081810a6106d5565b611a1e8383611938565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611a5057611a5061184d565b029392505050565b6000610d6e8383611999565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615611a9e57611a9e61184d565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615611ad257611ad261184d565b50500190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615611b1957611b1961184d565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615611b5457611b5461184d565b60008712925087820587128484161615611b7057611b7061184d565b87850587128184161615611b8657611b8661184d565b505050929093029392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611bf457611bf461184d565b506001019056fea164736f6c634300080f000a", + ABI: "[{\"type\":\"function\",\"name\":\"DECIMALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"baseFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"baseFeeScalar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blobBaseFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"blobBaseFeeScalar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"gasPrice\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL1Fee\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL1FeeUpperBound\",\"inputs\":[{\"name\":\"_unsignedTxSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL1GasUsed\",\"inputs\":[{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorFee\",\"inputs\":[{\"name\":\"_gasUsed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isEcotone\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isFjord\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isIsthmus\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isJovian\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"l1BaseFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"overhead\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"scalar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setEcotone\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFjord\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setIsthmus\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setJovian\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"}]", + Bin: "0x608060405234801561001057600080fd5b50611ec4806100206000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806368d5dca6116100e3578063c59859181161008c578063f45e65d811610066578063f45e65d8146102fc578063f820614014610304578063fe173b971461029357600080fd5b8063c5985918146102ce578063de26c4a1146102d6578063f1c7a58b146102e957600080fd5b8063960e3a23116100bd578063960e3a23146102a1578063b3d72079146102b3578063b54501bc146102bb57600080fd5b806368d5dca6146102765780636ef25c3a146102935780638e98b1061461029957600080fd5b80632e0f2625116101455780634ef6e2241161011f5780634ef6e22414610218578063519b4bd31461022557806354fd4d501461022d57600080fd5b80632e0f2625146101f6578063313ce567146101fe57806349948e0e1461020557600080fd5b806322b90ab31161017657806322b90ab3146101d1578063275aedd2146101db578063291b0383146101ee57600080fd5b80630c18c16214610192578063105d0b81146101ad575b600080fd5b61019a61030c565b6040519081526020015b60405180910390f35b6000546101c1906301000000900460ff1681565b60405190151581526020016101a4565b6101d961042d565b005b61019a6101e9366004611916565b6105b6565b6101d9610792565b61019a600681565b600661019a565b61019a61021336600461195e565b6109ba565b6000546101c19060ff1681565b61019a6109f7565b6102696040518060400160405280600581526020017f312e352e3000000000000000000000000000000000000000000000000000000081525081565b6040516101a49190611a2d565b61027e610a58565b60405163ffffffff90911681526020016101a4565b4861019a565b6101d9610add565b6000546101c190610100900460ff1681565b6101d9610cd7565b6000546101c19062010000900460ff1681565b61027e610ede565b61019a6102e436600461195e565b610f3f565b61019a6102f7366004611916565b611039565b61019a61110d565b61019a611200565b6000805460ff16156103a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f47617350726963654f7261636c653a206f76657268656164282920697320646560448201527f707265636174656400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610404573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104289190611aa0565b905090565b3373deaddeaddeaddeaddeaddeaddeaddeaddead0001146104f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e2073657420697345636f746f6e6520666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a40161039c565b60005460ff1615610589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a2045636f746f6e6520616c72656164792060448201527f6163746976650000000000000000000000000000000000000000000000000000606482015260840161039c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000805462010000900460ff166105cf57506000919050565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16634d5d9a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106549190611ab9565b63ffffffff169050600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166316d3bc7f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e19190611adf565b67ffffffffffffffff169050600060039054906101000a900460ff16156107535761074b82850285810484148615177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011761073e906064611b38565b8281019081106000031790565b949350505050565b61074b620f424083860286810485148715177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011761073e9190611b75565b3373deaddeaddeaddeaddeaddeaddeaddeaddead00011461085b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e20736574206973497374686d757320666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a40161039c565b600054610100900460ff166108f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f47617350726963654f7261636c653a20497374686d75732063616e206f6e6c7960448201527f2062652061637469766174656420616674657220466a6f726400000000000000606482015260840161039c565b60005462010000900460ff161561098b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a20497374686d757320616c72656164792060448201527f6163746976650000000000000000000000000000000000000000000000000000606482015260840161039c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055565b60008054610100900460ff16156109da576109d482611261565b92915050565b60005460ff16156109ee576109d482611280565b6109d482611324565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16635cf249696040518163ffffffff1660e01b8152600401602060405180830381865afa158015610404573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166368d5dca66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104289190611ab9565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610b80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e20736574206973466a6f726420666c616700606482015260840161039c565b60005460ff16610c12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f47617350726963654f7261636c653a20466a6f72642063616e206f6e6c79206260448201527f65206163746976617465642061667465722045636f746f6e6500000000000000606482015260840161039c565b600054610100900460ff1615610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f47617350726963654f7261636c653a20466a6f726420616c726561647920616360448201527f7469766500000000000000000000000000000000000000000000000000000000606482015260840161039c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610d7c57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e207365742069734a6f7669616e20666c6167606482015260840161039c565b60005462010000900460ff16610e14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f47617350726963654f7261636c653a204a6f7669616e2063616e206f6e6c792060448201527f62652061637469766174656420616674657220497374686d7573000000000000606482015260840161039c565b6000546301000000900460ff1615610eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f47617350726963654f7261636c653a204a6f7669616e20616c7265616479206160448201527f6374697665000000000000000000000000000000000000000000000000000000606482015260840161039c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff166301000000179055565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663c59859186040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab9573d6000803e3d6000fd5b60008054610100900460ff1615610f8657620f4240610f71610f6084611478565b51610f6c906044611bb0565b611795565b610f7c906010611b38565b6109d49190611b75565b6000610f91836117f4565b60005490915060ff1615610fa55792915050565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110289190611aa0565b6110329082611bb0565b9392505050565b60008054610100900460ff166110d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f47617350726963654f7261636c653a206765744c314665655570706572426f7560448201527f6e64206f6e6c7920737570706f72747320466a6f726400000000000000000000606482015260840161039c565b60006110de836044611bb0565b905060006110ed60ff83611b75565b6110f79083611bb0565b611102906010611bb0565b905061074b81611884565b6000805460ff16156111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a207363616c61722829206973206465707260448201527f6563617465640000000000000000000000000000000000000000000000000000606482015260840161039c565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa158015610404573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663f82061406040518163ffffffff1660e01b8152600401602060405180830381865afa158015610404573d6000803e3d6000fd5b60006109d461126f83611478565b5161127b906044611bb0565b611884565b60008061128c836117f4565b905060006112986109f7565b6112a0610ede565b6112ab906010611bc8565b63ffffffff166112bb9190611b38565b905060006112c7611200565b6112cf610a58565b63ffffffff166112df9190611b38565b905060006112ed8284611bb0565b6112f79085611b38565b90506113056006600a611d14565b611310906010611b38565b61131a9082611b75565b9695505050505050565b600080611330836117f4565b9050600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa158015611393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b79190611aa0565b6113bf6109f7565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa15801561141e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114429190611aa0565b61144c9085611bb0565b6114569190611b38565b6114609190611b38565b905061146e6006600a611d14565b61074b9082611b75565b6060611607565b818153600101919050565b600082840393505b838110156110325782810151828201511860001a1590930292600101611492565b825b602082106114ff5782516114ca601f8361147f565b52602092909201917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101906021016114b5565b8115611032578251611514600184038361147f565b520160010192915050565b60006001830392505b6101078210611560576115528360ff1661154d60fd61154d8760081c60e0018961147f565b61147f565b935061010682039150611528565b6007821061158d576115868360ff1661154d6007850361154d8760081c60e0018961147f565b9050611032565b61074b8360ff1661154d8560081c8560051b018761147f565b6115ff8282036115e36115d384600081518060001a8160011a60081b178160021a60101b17915050919050565b639e3779b90260131c611fff1690565b8060021b6040510182815160e01c1860e01b8151188152505050565b600101919050565b6180003860405139618000604051016020830180600d8551820103826002015b8181101561173a576000805b50508051604051600082901a600183901a60081b1760029290921a60101b91909117639e3779b9810260111c617ffc16909101805160e081811c878603811890911b9091189091528401908183039084841061168f57506116ca565b600184019350611fff82116116c4578251600081901a600182901a60081b1760029190911a60101b1781036116c457506116ca565b50611633565b8383106116d857505061173a565b600183039250858311156116f6576116f387878886036114b3565b96505b61170a60098501600385016003850161148a565b915061171787828461151f565b96505061172f8461172a868486016115a6565b6115a6565b915050809350611627565b505061174c83838488518501036114b3565b925050506040519150618000820180820391508183526020830160005b83811015611781578281015182820152602001611769565b506000920191825250602001604052919050565b6000806117a583620cc394611b38565b6117cf907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd763200611d20565b90506117df6064620f4240611d94565b8112156109d4576110326064620f4240611d94565b80516000908190815b818110156118775784818151811061181757611817611e50565b01602001517fff000000000000000000000000000000000000000000000000000000000000001660000361185757611850600484611bb0565b9250611865565b611862601084611bb0565b92505b8061186f81611e7f565b9150506117fd565b5061074b82610440611bb0565b60008061189083611795565b9050600061189c611200565b6118a4610a58565b63ffffffff166118b49190611b38565b6118bc6109f7565b6118c4610ede565b6118cf906010611bc8565b63ffffffff166118df9190611b38565b6118e99190611bb0565b90506118f760066002611b38565b61190290600a611d14565b61190c8284611b38565b61074b9190611b75565b60006020828403121561192857600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561197057600080fd5b813567ffffffffffffffff8082111561198857600080fd5b818401915084601f83011261199c57600080fd5b8135818111156119ae576119ae61192f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156119f4576119f461192f565b81604052828152876020848701011115611a0d57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b81811015611a5a57858101830151858201604001528201611a3e565b81811115611a6c576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215611ab257600080fd5b5051919050565b600060208284031215611acb57600080fd5b815163ffffffff8116811461103257600080fd5b600060208284031215611af157600080fd5b815167ffffffffffffffff8116811461103257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611b7057611b70611b09565b500290565b600082611bab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115611bc357611bc3611b09565b500190565b600063ffffffff80831681851681830481118215151615611beb57611beb611b09565b02949350505050565b600181815b80851115611c4d57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611c3357611c33611b09565b80851615611c4057918102915b93841c9390800290611bf9565b509250929050565b600082611c64575060016109d4565b81611c71575060006109d4565b8160018114611c875760028114611c9157611cad565b60019150506109d4565b60ff841115611ca257611ca2611b09565b50506001821b6109d4565b5060208310610133831016604e8410600b8410161715611cd0575081810a6109d4565b611cda8383611bf4565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611d0c57611d0c611b09565b029392505050565b60006110328383611c55565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615611d5a57611d5a611b09565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615611d8e57611d8e611b09565b50500190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615611dd557611dd5611b09565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615611e1057611e10611b09565b60008712925087820587128484161615611e2c57611e2c611b09565b87850587128184161615611e4257611e42611b09565b505050929093029392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611eb057611eb0611b09565b506001019056fea164736f6c634300080f000a", } // GasPriceOracleABI is the input ABI used to generate the binding from. @@ -156,11 +157,11 @@ func NewGasPriceOracleFilterer(address common.Address, filterer bind.ContractFil // bindGasPriceOracle binds a generic wrapper to an already deployed contract. func bindGasPriceOracle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(GasPriceOracleABI)) + parsed, err := GasPriceOracleMetaData.GetAbi() if err != nil { return nil, err } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil } // Call invokes the (constant) contract method with params as input values and @@ -635,6 +636,37 @@ func (_GasPriceOracle *GasPriceOracleCallerSession) IsIsthmus() (bool, error) { return _GasPriceOracle.Contract.IsIsthmus(&_GasPriceOracle.CallOpts) } +// IsJovian is a free data retrieval call binding the contract method 0x105d0b81. +// +// Solidity: function isJovian() view returns(bool) +func (_GasPriceOracle *GasPriceOracleCaller) IsJovian(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _GasPriceOracle.contract.Call(opts, &out, "isJovian") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsJovian is a free data retrieval call binding the contract method 0x105d0b81. +// +// Solidity: function isJovian() view returns(bool) +func (_GasPriceOracle *GasPriceOracleSession) IsJovian() (bool, error) { + return _GasPriceOracle.Contract.IsJovian(&_GasPriceOracle.CallOpts) +} + +// IsJovian is a free data retrieval call binding the contract method 0x105d0b81. +// +// Solidity: function isJovian() view returns(bool) +func (_GasPriceOracle *GasPriceOracleCallerSession) IsJovian() (bool, error) { + return _GasPriceOracle.Contract.IsJovian(&_GasPriceOracle.CallOpts) +} + // L1BaseFee is a free data retrieval call binding the contract method 0x519b4bd3. // // Solidity: function l1BaseFee() view returns(uint256) @@ -821,3 +853,24 @@ func (_GasPriceOracle *GasPriceOracleSession) SetIsthmus() (*types.Transaction, func (_GasPriceOracle *GasPriceOracleTransactorSession) SetIsthmus() (*types.Transaction, error) { return _GasPriceOracle.Contract.SetIsthmus(&_GasPriceOracle.TransactOpts) } + +// SetJovian is a paid mutator transaction binding the contract method 0xb3d72079. +// +// Solidity: function setJovian() returns() +func (_GasPriceOracle *GasPriceOracleTransactor) SetJovian(opts *bind.TransactOpts) (*types.Transaction, error) { + return _GasPriceOracle.contract.Transact(opts, "setJovian") +} + +// SetJovian is a paid mutator transaction binding the contract method 0xb3d72079. +// +// Solidity: function setJovian() returns() +func (_GasPriceOracle *GasPriceOracleSession) SetJovian() (*types.Transaction, error) { + return _GasPriceOracle.Contract.SetJovian(&_GasPriceOracle.TransactOpts) +} + +// SetJovian is a paid mutator transaction binding the contract method 0xb3d72079. +// +// Solidity: function setJovian() returns() +func (_GasPriceOracle *GasPriceOracleTransactorSession) SetJovian() (*types.Transaction, error) { + return _GasPriceOracle.Contract.SetJovian(&_GasPriceOracle.TransactOpts) +} diff --git a/op-e2e/system/e2esys/setup.go b/op-e2e/system/e2esys/setup.go index 68fbc23c0c14b..0843fdf4ca365 100644 --- a/op-e2e/system/e2esys/setup.go +++ b/op-e2e/system/e2esys/setup.go @@ -617,9 +617,6 @@ func (cfg SystemConfig) Start(t *testing.T, startOpts ...StartOption) (*System, c = sys.TimeTravelClock } - // sanity-check the deploy config - require.Nil(t, cfg.DeployConfig.L2GenesisJovianTimeOffset, "Jovian is not supported in op-e2e tests yet") - if err := cfg.DeployConfig.Check(testlog.Logger(t, log.LevelInfo)); err != nil { return nil, err } diff --git a/op-e2e/system/fees/fees_test.go b/op-e2e/system/fees/fees_test.go index 80f5febc19ebe..c3a243fe48b1d 100644 --- a/op-e2e/system/fees/fees_test.go +++ b/op-e2e/system/fees/fees_test.go @@ -91,6 +91,16 @@ func TestFees(t *testing.T) { testFees(t, cfg) }) + + t.Run("jovian", func(t *testing.T) { + op_e2e.InitParallel(t) + cfg := e2esys.JovianSystemConfig(t, new(hexutil.Uint64)) + cfg.DeployConfig.L1GenesisBlockBaseFeePerGas = (*hexutil.Big)(big.NewInt(7)) + cfg.DeployConfig.GasPriceOracleOperatorFeeScalar = 1439103868 + cfg.DeployConfig.GasPriceOracleOperatorFeeConstant = 12564178266093314607 + + testFees(t, cfg) + }) } func testFees(t *testing.T, cfg e2esys.SystemConfig) { @@ -244,6 +254,10 @@ func testFees(t *testing.T, cfg e2esys.SystemConfig) { require.NoError(t, err) require.Equal(t, sys.RollupConfig.IsIsthmus(header.Time), gpoIsthmus, "GPO and chain must have same isthmus view") + gpoJovian, err := gpoContract.IsJovian(nil) + require.NoError(t, err) + require.Equal(t, sys.RollupConfig.IsJovian(header.Time), gpoJovian, "GPO and chain must have same jovian view") + gpoL1Fee, err := gpoContract.GetL1Fee(&bind.CallOpts{}, bytes) require.Nil(t, err) @@ -277,18 +291,26 @@ func testFees(t *testing.T, cfg e2esys.SystemConfig) { new(big.Float).SetInt(receipt.L1Fee), "fee field in receipt matches gas used times scalar times base fee") } - expectedOperatorFee := new(big.Int).Add( - new(big.Int).Div( - new(big.Int).Mul( - gasUsed, - new(big.Int).SetUint64(uint64(cfg.DeployConfig.GasPriceOracleOperatorFeeScalar)), - ), - new(big.Int).SetUint64(uint64(1e6)), - ), - new(big.Int).SetUint64(cfg.DeployConfig.GasPriceOracleOperatorFeeConstant), - ) - if sys.RollupConfig.IsIsthmus(header.Time) { + baseOperatorFee := new(big.Int).Mul( + gasUsed, + new(big.Int).SetUint64(uint64(cfg.DeployConfig.GasPriceOracleOperatorFeeScalar)), + ) + + scaledOperatorFee := new(big.Int) + if sys.RollupConfig.IsJovian(header.Time) { + // For Jovian, multiply by 100. + scaledOperatorFee.Mul(baseOperatorFee, new(big.Int).SetUint64(uint64(100))) + } else { + // For Isthmus, divide by 1e6. + scaledOperatorFee.Div(baseOperatorFee, new(big.Int).SetUint64(uint64(1e6))) + } + + expectedOperatorFee := new(big.Int).Add( + scaledOperatorFee, + new(big.Int).SetUint64(cfg.DeployConfig.GasPriceOracleOperatorFeeConstant), + ) + require.True(t, expectedOperatorFee.Cmp(operatorFee.ToBig()) == 0, "operator fee is correct", ) diff --git a/op-node/rollup/derive/attributes.go b/op-node/rollup/derive/attributes.go index 7d9fedef07a5d..59f6d2dbb2fb7 100644 --- a/op-node/rollup/derive/attributes.go +++ b/op-node/rollup/derive/attributes.go @@ -145,8 +145,8 @@ func (ba *FetchingAttributesBuilder) PreparePayloadAttributes(ctx context.Contex upgradeTxs = append(upgradeTxs, isthmus...) } - if ba.rollupCfg.IsJovianActivationBlock(nextL2Time) && ba.rollupCfg.IsDAFootprintBlockLimit(nextL2Time) { - jovian, err := DAFootprintNetworkUpgradeTransactions() + if ba.rollupCfg.IsJovianActivationBlock(nextL2Time) { + jovian, err := JovianNetworkUpgradeTransactions(ba.rollupCfg.IsDAFootprintBlockLimit(nextL2Time), ba.rollupCfg.IsOperatorFeeFix(nextL2Time)) if err != nil { return nil, NewCriticalError(fmt.Errorf("failed to build jovian network upgrade txs: %w", err)) } diff --git a/op-node/rollup/derive/jovian_upgrade_transactions.go b/op-node/rollup/derive/jovian_upgrade_transactions.go index 564b8ea7f705c..5adc79f0cd94d 100644 --- a/op-node/rollup/derive/jovian_upgrade_transactions.go +++ b/op-node/rollup/derive/jovian_upgrade_transactions.go @@ -18,8 +18,22 @@ var ( L1BlockJovianDeployerAddress = common.HexToAddress("0x4210000000000000000000000000000000000006") jovianL1BlockAddress = crypto.CreateAddress(L1BlockJovianDeployerAddress, 0) - // Bytecode generated from commit 41614ab527df1cf74f9820f60d8f588ade769679 - l1BlockJovianDeploymentBytecode = common.FromHex("0x608060405234801561001057600080fd5b50610723806100206000396000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c806364ca23ef116100e3578063c59859181161008c578063e81b2c6d11610066578063e81b2c6d146103f0578063f8206140146103f9578063fe3d57101461040257600080fd5b8063c598591814610375578063d844471514610395578063e591b282146103ce57600080fd5b80638b239f73116100bd5780638b239f73146103435780639e8c49661461034c578063b80777ea1461035557600080fd5b806364ca23ef146102ff57806368d5dca6146103135780638381f58a1461032f57600080fd5b80634397dfef1161014557806354fd4d501161011f57806354fd4d501461027b578063550fcdc9146102bd5780635cf24969146102f657600080fd5b80634397dfef1461021a578063440a5e20146102425780634d5d9a2a1461024a57600080fd5b806316d3bc7f1161017657806316d3bc7f146101d657806321326849146102035780633db6be2b1461021257600080fd5b8063015d8eb91461019d578063098999be146101b257806309bd5a60146101ba575b600080fd5b6101b06101ab366004610631565b610433565b005b6101b0610572565b6101c360025481565b6040519081526020015b60405180910390f35b6008546101ea9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101cd565b604051600081526020016101cd565b6101b0610585565b6040805173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee815260126020820152016101cd565b6101b061058f565b6008546102669068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016101cd565b60408051808201909152600581527f312e372e3000000000000000000000000000000000000000000000000000000060208201525b6040516101cd91906106a3565b60408051808201909152600381527f455448000000000000000000000000000000000000000000000000000000000060208201526102b0565b6101c360015481565b6003546101ea9067ffffffffffffffff1681565b6003546102669068010000000000000000900463ffffffff1681565b6000546101ea9067ffffffffffffffff1681565b6101c360055481565b6101c360065481565b6000546101ea9068010000000000000000900467ffffffffffffffff1681565b600354610266906c01000000000000000000000000900463ffffffff1681565b60408051808201909152600581527f457468657200000000000000000000000000000000000000000000000000000060208201526102b0565b60405173deaddeaddeaddeaddeaddeaddeaddeaddead000181526020016101cd565b6101c360045481565b6101c360075481565b600854610420906c01000000000000000000000000900461ffff1681565b60405161ffff90911681526020016101cd565b3373deaddeaddeaddeaddeaddeaddeaddeaddead0001146104da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4c31426c6f636b3a206f6e6c7920746865206465706f7369746f72206163636f60448201527f756e742063616e20736574204c3120626c6f636b2076616c7565730000000000606482015260840160405180910390fd5b6000805467ffffffffffffffff98891668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116998916999099179890981790975560019490945560029290925560038054919094167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009190911617909255600491909155600555600655565b61057a610593565b60a43560a01c600855565b61058d6105ea565b565b61058d5b73deaddeaddeaddeaddeaddeaddeaddeaddead00013381146105bd57633cc50b456000526004601cfd5b60043560801c60035560143560801c60005560243560015560443560075560643560025560843560045550565b6105f2610593565b6dffff00000000000000000000000060b03560901c1660a43560a01c17600855565b803567ffffffffffffffff8116811461062c57600080fd5b919050565b600080600080600080600080610100898b03121561064e57600080fd5b61065789610614565b975061066560208a01610614565b9650604089013595506060890135945061068160808a01610614565b979a969950949793969560a0850135955060c08501359460e001359350915050565b600060208083528351808285015260005b818110156106d0578581018301518582016040015282016106b4565b818111156106e2576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea164736f6c634300080f000a") + // Bytecode generated from commit b3299e0ddb55442e6496512084d16c439ea2da77 + l1BlockJovianDeploymentBytecode = common.FromHex("0x608060405234801561001057600080fd5b50610715806100206000396000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c806364ca23ef116100e3578063c59859181161008c578063e81b2c6d11610066578063e81b2c6d146103f0578063f8206140146103f9578063fe3d57101461040257600080fd5b8063c598591814610375578063d844471514610395578063e591b282146103ce57600080fd5b80638b239f73116100bd5780638b239f73146103435780639e8c49661461034c578063b80777ea1461035557600080fd5b806364ca23ef146102ff57806368d5dca6146103135780638381f58a1461032f57600080fd5b80634397dfef1161014557806354fd4d501161011f57806354fd4d501461027b578063550fcdc9146102bd5780635cf24969146102f657600080fd5b80634397dfef1461021a578063440a5e20146102425780634d5d9a2a1461024a57600080fd5b806316d3bc7f1161017657806316d3bc7f146101d657806321326849146102035780633db6be2b1461021257600080fd5b8063015d8eb91461019d578063098999be146101b257806309bd5a60146101ba575b600080fd5b6101b06101ab366004610623565b610433565b005b6101b0610572565b6101c360025481565b6040519081526020015b60405180910390f35b6008546101ea9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101cd565b604051600081526020016101cd565b6101b0610585565b6040805173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee815260126020820152016101cd565b6101b06105af565b6008546102669068010000000000000000900463ffffffff1681565b60405163ffffffff90911681526020016101cd565b60408051808201909152600581527f312e372e3000000000000000000000000000000000000000000000000000000060208201525b6040516101cd9190610695565b60408051808201909152600381527f455448000000000000000000000000000000000000000000000000000000000060208201526102b0565b6101c360015481565b6003546101ea9067ffffffffffffffff1681565b6003546102669068010000000000000000900463ffffffff1681565b6000546101ea9067ffffffffffffffff1681565b6101c360055481565b6101c360065481565b6000546101ea9068010000000000000000900467ffffffffffffffff1681565b600354610266906c01000000000000000000000000900463ffffffff1681565b60408051808201909152600581527f457468657200000000000000000000000000000000000000000000000000000060208201526102b0565b60405173deaddeaddeaddeaddeaddeaddeaddeaddead000181526020016101cd565b6101c360045481565b6101c360075481565b600854610420906c01000000000000000000000000900461ffff1681565b60405161ffff90911681526020016101cd565b3373deaddeaddeaddeaddeaddeaddeaddeaddead0001146104da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4c31426c6f636b3a206f6e6c7920746865206465706f7369746f72206163636f60448201527f756e742063616e20736574204c3120626c6f636b2076616c7565730000000000606482015260840160405180910390fd5b6000805467ffffffffffffffff98891668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116998916999099179890981790975560019490945560029290925560038054919094167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009190911617909255600491909155600555600655565b61057a6105af565b60a43560a01c600855565b61058d6105af565b6dffff00000000000000000000000060b03560901c1660a43560a01c17600855565b73deaddeaddeaddeaddeaddeaddeaddeaddead00013381146105d957633cc50b456000526004601cfd5b60043560801c60035560143560801c60005560243560015560443560075560643560025560843560045550565b803567ffffffffffffffff8116811461061e57600080fd5b919050565b600080600080600080600080610100898b03121561064057600080fd5b61064989610606565b975061065760208a01610606565b9650604089013595506060890135945061067360808a01610606565b979a969950949793969560a0850135955060c08501359460e001359350915050565b600060208083528351808285015260005b818110156106c2578581018301518582016040015282016106a6565b818111156106d4576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01692909201604001939250505056fea164736f6c634300080f000a") + + // Gas Price Oracle Parameters + deployJovianGasPriceOracleSource = UpgradeDepositSource{Intent: "Jovian: Gas Price Oracle Deployment"} + updateJovianGasPriceOracleSource = UpgradeDepositSource{Intent: "Jovian: Gas Price Oracle Proxy Update"} + GasPriceOracleJovianDeployerAddress = common.HexToAddress("0x4210000000000000000000000000000000000007") + jovianGasPriceOracleAddress = crypto.CreateAddress(GasPriceOracleJovianDeployerAddress, 0) + + // Bytecodes + // GPO from commit b3299e0ddb55442e6496512084d16c439ea2da77 + gasPriceOracleJovianDeploymentBytecode = common.FromHex("0x608060405234801561001057600080fd5b50611ec4806100206000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806368d5dca6116100e3578063c59859181161008c578063f45e65d811610066578063f45e65d8146102fc578063f820614014610304578063fe173b971461029357600080fd5b8063c5985918146102ce578063de26c4a1146102d6578063f1c7a58b146102e957600080fd5b8063960e3a23116100bd578063960e3a23146102a1578063b3d72079146102b3578063b54501bc146102bb57600080fd5b806368d5dca6146102765780636ef25c3a146102935780638e98b1061461029957600080fd5b80632e0f2625116101455780634ef6e2241161011f5780634ef6e22414610218578063519b4bd31461022557806354fd4d501461022d57600080fd5b80632e0f2625146101f6578063313ce567146101fe57806349948e0e1461020557600080fd5b806322b90ab31161017657806322b90ab3146101d1578063275aedd2146101db578063291b0383146101ee57600080fd5b80630c18c16214610192578063105d0b81146101ad575b600080fd5b61019a61030c565b6040519081526020015b60405180910390f35b6000546101c1906301000000900460ff1681565b60405190151581526020016101a4565b6101d961042d565b005b61019a6101e9366004611916565b6105b6565b6101d9610792565b61019a600681565b600661019a565b61019a61021336600461195e565b6109ba565b6000546101c19060ff1681565b61019a6109f7565b6102696040518060400160405280600581526020017f312e352e3000000000000000000000000000000000000000000000000000000081525081565b6040516101a49190611a2d565b61027e610a58565b60405163ffffffff90911681526020016101a4565b4861019a565b6101d9610add565b6000546101c190610100900460ff1681565b6101d9610cd7565b6000546101c19062010000900460ff1681565b61027e610ede565b61019a6102e436600461195e565b610f3f565b61019a6102f7366004611916565b611039565b61019a61110d565b61019a611200565b6000805460ff16156103a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f47617350726963654f7261636c653a206f76657268656164282920697320646560448201527f707265636174656400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610404573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104289190611aa0565b905090565b3373deaddeaddeaddeaddeaddeaddeaddeaddead0001146104f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e2073657420697345636f746f6e6520666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a40161039c565b60005460ff1615610589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a2045636f746f6e6520616c72656164792060448201527f6163746976650000000000000000000000000000000000000000000000000000606482015260840161039c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000805462010000900460ff166105cf57506000919050565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16634d5d9a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106549190611ab9565b63ffffffff169050600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166316d3bc7f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e19190611adf565b67ffffffffffffffff169050600060039054906101000a900460ff16156107535761074b82850285810484148615177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011761073e906064611b38565b8281019081106000031790565b949350505050565b61074b620f424083860286810485148715177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011761073e9190611b75565b3373deaddeaddeaddeaddeaddeaddeaddeaddead00011461085b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e20736574206973497374686d757320666c6160648201527f6700000000000000000000000000000000000000000000000000000000000000608482015260a40161039c565b600054610100900460ff166108f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f47617350726963654f7261636c653a20497374686d75732063616e206f6e6c7960448201527f2062652061637469766174656420616674657220466a6f726400000000000000606482015260840161039c565b60005462010000900460ff161561098b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a20497374686d757320616c72656164792060448201527f6163746976650000000000000000000000000000000000000000000000000000606482015260840161039c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff1662010000179055565b60008054610100900460ff16156109da576109d482611261565b92915050565b60005460ff16156109ee576109d482611280565b6109d482611324565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16635cf249696040518163ffffffff1660e01b8152600401602060405180830381865afa158015610404573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff166368d5dca66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104289190611ab9565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610b80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e20736574206973466a6f726420666c616700606482015260840161039c565b60005460ff16610c12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f47617350726963654f7261636c653a20466a6f72642063616e206f6e6c79206260448201527f65206163746976617465642061667465722045636f746f6e6500000000000000606482015260840161039c565b600054610100900460ff1615610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f47617350726963654f7261636c653a20466a6f726420616c726561647920616360448201527f7469766500000000000000000000000000000000000000000000000000000000606482015260840161039c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b3373deaddeaddeaddeaddeaddeaddeaddeaddead000114610d7c57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f47617350726963654f7261636c653a206f6e6c7920746865206465706f73697460448201527f6f72206163636f756e742063616e207365742069734a6f7669616e20666c6167606482015260840161039c565b60005462010000900460ff16610e14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f47617350726963654f7261636c653a204a6f7669616e2063616e206f6e6c792060448201527f62652061637469766174656420616674657220497374686d7573000000000000606482015260840161039c565b6000546301000000900460ff1615610eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f47617350726963654f7261636c653a204a6f7669616e20616c7265616479206160448201527f6374697665000000000000000000000000000000000000000000000000000000606482015260840161039c565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff166301000000179055565b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663c59859186040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab9573d6000803e3d6000fd5b60008054610100900460ff1615610f8657620f4240610f71610f6084611478565b51610f6c906044611bb0565b611795565b610f7c906010611b38565b6109d49190611b75565b6000610f91836117f4565b60005490915060ff1615610fa55792915050565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110289190611aa0565b6110329082611bb0565b9392505050565b60008054610100900460ff166110d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f47617350726963654f7261636c653a206765744c314665655570706572426f7560448201527f6e64206f6e6c7920737570706f72747320466a6f726400000000000000000000606482015260840161039c565b60006110de836044611bb0565b905060006110ed60ff83611b75565b6110f79083611bb0565b611102906010611bb0565b905061074b81611884565b6000805460ff16156111a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f47617350726963654f7261636c653a207363616c61722829206973206465707260448201527f6563617465640000000000000000000000000000000000000000000000000000606482015260840161039c565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa158015610404573d6000803e3d6000fd5b600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff1663f82061406040518163ffffffff1660e01b8152600401602060405180830381865afa158015610404573d6000803e3d6000fd5b60006109d461126f83611478565b5161127b906044611bb0565b611884565b60008061128c836117f4565b905060006112986109f7565b6112a0610ede565b6112ab906010611bc8565b63ffffffff166112bb9190611b38565b905060006112c7611200565b6112cf610a58565b63ffffffff166112df9190611b38565b905060006112ed8284611bb0565b6112f79085611b38565b90506113056006600a611d14565b611310906010611b38565b61131a9082611b75565b9695505050505050565b600080611330836117f4565b9050600073420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16639e8c49666040518163ffffffff1660e01b8152600401602060405180830381865afa158015611393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b79190611aa0565b6113bf6109f7565b73420000000000000000000000000000000000001573ffffffffffffffffffffffffffffffffffffffff16638b239f736040518163ffffffff1660e01b8152600401602060405180830381865afa15801561141e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114429190611aa0565b61144c9085611bb0565b6114569190611b38565b6114609190611b38565b905061146e6006600a611d14565b61074b9082611b75565b6060611607565b818153600101919050565b600082840393505b838110156110325782810151828201511860001a1590930292600101611492565b825b602082106114ff5782516114ca601f8361147f565b52602092909201917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101906021016114b5565b8115611032578251611514600184038361147f565b520160010192915050565b60006001830392505b6101078210611560576115528360ff1661154d60fd61154d8760081c60e0018961147f565b61147f565b935061010682039150611528565b6007821061158d576115868360ff1661154d6007850361154d8760081c60e0018961147f565b9050611032565b61074b8360ff1661154d8560081c8560051b018761147f565b6115ff8282036115e36115d384600081518060001a8160011a60081b178160021a60101b17915050919050565b639e3779b90260131c611fff1690565b8060021b6040510182815160e01c1860e01b8151188152505050565b600101919050565b6180003860405139618000604051016020830180600d8551820103826002015b8181101561173a576000805b50508051604051600082901a600183901a60081b1760029290921a60101b91909117639e3779b9810260111c617ffc16909101805160e081811c878603811890911b9091189091528401908183039084841061168f57506116ca565b600184019350611fff82116116c4578251600081901a600182901a60081b1760029190911a60101b1781036116c457506116ca565b50611633565b8383106116d857505061173a565b600183039250858311156116f6576116f387878886036114b3565b96505b61170a60098501600385016003850161148a565b915061171787828461151f565b96505061172f8461172a868486016115a6565b6115a6565b915050809350611627565b505061174c83838488518501036114b3565b925050506040519150618000820180820391508183526020830160005b83811015611781578281015182820152602001611769565b506000920191825250602001604052919050565b6000806117a583620cc394611b38565b6117cf907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd763200611d20565b90506117df6064620f4240611d94565b8112156109d4576110326064620f4240611d94565b80516000908190815b818110156118775784818151811061181757611817611e50565b01602001517fff000000000000000000000000000000000000000000000000000000000000001660000361185757611850600484611bb0565b9250611865565b611862601084611bb0565b92505b8061186f81611e7f565b9150506117fd565b5061074b82610440611bb0565b60008061189083611795565b9050600061189c611200565b6118a4610a58565b63ffffffff166118b49190611b38565b6118bc6109f7565b6118c4610ede565b6118cf906010611bc8565b63ffffffff166118df9190611b38565b6118e99190611bb0565b90506118f760066002611b38565b61190290600a611d14565b61190c8284611b38565b61074b9190611b75565b60006020828403121561192857600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561197057600080fd5b813567ffffffffffffffff8082111561198857600080fd5b818401915084601f83011261199c57600080fd5b8135818111156119ae576119ae61192f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156119f4576119f461192f565b81604052828152876020848701011115611a0d57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b81811015611a5a57858101830151858201604001528201611a3e565b81811115611a6c576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b600060208284031215611ab257600080fd5b5051919050565b600060208284031215611acb57600080fd5b815163ffffffff8116811461103257600080fd5b600060208284031215611af157600080fd5b815167ffffffffffffffff8116811461103257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611b7057611b70611b09565b500290565b600082611bab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115611bc357611bc3611b09565b500190565b600063ffffffff80831681851681830481118215151615611beb57611beb611b09565b02949350505050565b600181815b80851115611c4d57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611c3357611c33611b09565b80851615611c4057918102915b93841c9390800290611bf9565b509250929050565b600082611c64575060016109d4565b81611c71575060006109d4565b8160018114611c875760028114611c9157611cad565b60019150506109d4565b60ff841115611ca257611ca2611b09565b50506001821b6109d4565b5060208310610133831016604e8410600b8410161715611cd0575081810a6109d4565b611cda8383611bf4565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611d0c57611d0c611b09565b029392505050565b60006110328383611c55565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615611d5a57611d5a611b09565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615611d8e57611d8e611b09565b50500190565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615611dd557611dd5611b09565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615611e1057611e10611b09565b60008712925087820587128484161615611e2c57611e2c611b09565b87850587128184161615611e4257611e42611b09565b505050929093029392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611eb057611eb0611b09565b506001019056fea164736f6c634300080f000a") + + // Enable Jovian Parameters + enableJovianSource = UpgradeDepositSource{Intent: "Jovian: Gas Price Oracle Set Jovian"} + enableJovianInput = crypto.Keccak256([]byte("setJovian()"))[:4] ) func DAFootprintNetworkUpgradeTransactions() ([]hexutil.Bytes, error) { @@ -29,7 +43,7 @@ func DAFootprintNetworkUpgradeTransactions() ([]hexutil.Bytes, error) { To: nil, Mint: big.NewInt(0), Value: big.NewInt(0), - Gas: 450_371, + Gas: 447_315, IsSystemTransaction: false, Data: l1BlockJovianDeploymentBytecode, }).MarshalBinary() @@ -53,3 +67,85 @@ func DAFootprintNetworkUpgradeTransactions() ([]hexutil.Bytes, error) { return []hexutil.Bytes{deployL1Block, updateL1BlockProxy}, nil } + +func OperatorFeeFixUpgradeTransactions() ([]hexutil.Bytes, error) { + upgradeTxns := make([]hexutil.Bytes, 0, 8) + + // Deploy Gas Price Oracle transaction + deployGasPriceOracle, err := types.NewTx(&types.DepositTx{ + SourceHash: deployJovianGasPriceOracleSource.SourceHash(), + From: GasPriceOracleJovianDeployerAddress, + To: nil, + Mint: big.NewInt(0), + Value: big.NewInt(0), + Gas: 1_625_000, + IsSystemTransaction: false, + Data: gasPriceOracleJovianDeploymentBytecode, + }).MarshalBinary() + + if err != nil { + return nil, err + } + + upgradeTxns = append(upgradeTxns, deployGasPriceOracle) + + // Deploy Gas Price Oracle Proxy upgrade transaction + updateGasPriceOracleProxy, err := types.NewTx(&types.DepositTx{ + SourceHash: updateJovianGasPriceOracleSource.SourceHash(), + From: common.Address{}, + To: &predeploys.GasPriceOracleAddr, + Mint: big.NewInt(0), + Value: big.NewInt(0), + Gas: 50_000, + IsSystemTransaction: false, + Data: upgradeToCalldata(jovianGasPriceOracleAddress), + }).MarshalBinary() + + if err != nil { + return nil, err + } + + upgradeTxns = append(upgradeTxns, updateGasPriceOracleProxy) + + // Enable Jovian transaction + enableJovian, err := types.NewTx(&types.DepositTx{ + SourceHash: enableJovianSource.SourceHash(), + From: L1InfoDepositerAddress, + To: &predeploys.GasPriceOracleAddr, + Mint: big.NewInt(0), + Value: big.NewInt(0), + Gas: 90_000, + IsSystemTransaction: false, + Data: enableJovianInput, + }).MarshalBinary() + + if err != nil { + return nil, err + } + + upgradeTxns = append(upgradeTxns, enableJovian) + + return upgradeTxns, nil +} + +func JovianNetworkUpgradeTransactions(IsDAFootprintBlockLimit, IsOperatorFeeFix bool) ([]hexutil.Bytes, error) { + upgradeTxs := make([]hexutil.Bytes, 0) + + if IsDAFootprintBlockLimit { + txs, err := DAFootprintNetworkUpgradeTransactions() + if err != nil { + return nil, err + } + upgradeTxs = append(upgradeTxs, txs...) + } + + if IsOperatorFeeFix { + txs, err := OperatorFeeFixUpgradeTransactions() + if err != nil { + return nil, err + } + upgradeTxs = append(upgradeTxs, txs...) + } + + return upgradeTxs, nil +} diff --git a/op-node/rollup/derive/jovian_upgrade_transactions_test.go b/op-node/rollup/derive/jovian_upgrade_transactions_test.go new file mode 100644 index 0000000000000..b9f73ee804a24 --- /dev/null +++ b/op-node/rollup/derive/jovian_upgrade_transactions_test.go @@ -0,0 +1,53 @@ +package derive + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/stretchr/testify/require" +) + +func TestJovianNetworkTransactions(t *testing.T) { + upgradeTxns, err := JovianNetworkUpgradeTransactions(true, true) + require.NoError(t, err) + require.Len(t, upgradeTxns, 5) + + deployL1BlockSender, deployL1Block := toDepositTxn(t, upgradeTxns[0]) + require.Equal(t, deployL1BlockSender, common.HexToAddress("0x4210000000000000000000000000000000000006")) + require.Equal(t, deployJovianL1BlockSource.SourceHash(), deployL1Block.SourceHash()) + require.Nil(t, deployL1Block.To()) + require.Equal(t, uint64(447_315), deployL1Block.Gas()) + require.Equal(t, l1BlockJovianDeploymentBytecode, deployL1Block.Data()) + + updateL1BlockProxySender, updateL1BlockProxy := toDepositTxn(t, upgradeTxns[1]) + require.Equal(t, updateL1BlockProxySender, common.Address{}) + require.Equal(t, updateJovianL1BlockProxySource.SourceHash(), updateL1BlockProxy.SourceHash()) + require.NotNil(t, updateL1BlockProxy.To()) + require.Equal(t, *updateL1BlockProxy.To(), common.HexToAddress("0x4200000000000000000000000000000000000015")) + require.Equal(t, uint64(50_000), updateL1BlockProxy.Gas()) + require.Equal(t, "0x3659cfe60000000000000000000000003ba4007f5c922fbb33c454b41ea7a1f11e83df2c", hexutil.Encode(updateL1BlockProxy.Data())) + + deployGasPriceOracleSender, deployGasPriceOracle := toDepositTxn(t, upgradeTxns[2]) + require.Equal(t, deployGasPriceOracleSender, common.HexToAddress("0x4210000000000000000000000000000000000007")) + require.Equal(t, deployJovianGasPriceOracleSource.SourceHash(), deployGasPriceOracle.SourceHash()) + require.Nil(t, deployGasPriceOracle.To()) + require.Equal(t, uint64(1_625_000), deployGasPriceOracle.Gas()) + require.Equal(t, gasPriceOracleJovianDeploymentBytecode, deployGasPriceOracle.Data()) + + updateGasPriceOracleSender, updateGasPriceOracle := toDepositTxn(t, upgradeTxns[3]) + require.Equal(t, updateGasPriceOracleSender, common.Address{}) + require.Equal(t, updateJovianGasPriceOracleSource.SourceHash(), updateGasPriceOracle.SourceHash()) + require.NotNil(t, updateGasPriceOracle.To()) + require.Equal(t, *updateGasPriceOracle.To(), common.HexToAddress("0x420000000000000000000000000000000000000F")) + require.Equal(t, uint64(50_000), updateGasPriceOracle.Gas()) + require.Equal(t, "0x3659cfe60000000000000000000000004f1db3c6abd250ba86e0928471a8f7db3afd88f1", hexutil.Encode(updateGasPriceOracle.Data())) + + gpoSetJovianSender, gpoSetJovian := toDepositTxn(t, upgradeTxns[4]) + require.Equal(t, gpoSetJovianSender, common.HexToAddress("0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001")) + require.Equal(t, enableJovianSource.SourceHash(), gpoSetJovian.SourceHash()) + require.NotNil(t, gpoSetJovian.To()) + require.Equal(t, *gpoSetJovian.To(), common.HexToAddress("0x420000000000000000000000000000000000000F")) + require.Equal(t, uint64(90_000), gpoSetJovian.Gas()) + require.Equal(t, "0xb3d72079", hexutil.Encode(gpoSetJovian.Data())) +} diff --git a/op-node/rollup/derive/l1_block_info.go b/op-node/rollup/derive/l1_block_info.go index 25d79b1668c88..33d19dfd4854a 100644 --- a/op-node/rollup/derive/l1_block_info.go +++ b/op-node/rollup/derive/l1_block_info.go @@ -448,7 +448,7 @@ func isIsthmusButNotFirstBlock(rollupCfg *rollup.Config, l2Timestamp uint64) boo // isJovianButNotFirstBlock returns whether the specified block is subject to the Jovian upgrade, // but is not the activation block itself. func isJovianButNotFirstBlock(rollupCfg *rollup.Config, l2Timestamp uint64) bool { - return rollupCfg.IsDAFootprintBlockLimit(l2Timestamp) && !rollupCfg.IsJovianActivationBlock(l2Timestamp) + return rollupCfg.IsJovian(l2Timestamp) && !rollupCfg.IsJovianActivationBlock(l2Timestamp) } // L1BlockInfoFromBytes is the inverse of L1InfoDeposit, to see where the L2 chain is derived from diff --git a/op-node/rollup/sequencing/sequencer.go b/op-node/rollup/sequencing/sequencer.go index ca32311094700..c536c5bc8b276 100644 --- a/op-node/rollup/sequencing/sequencer.go +++ b/op-node/rollup/sequencing/sequencer.go @@ -571,6 +571,12 @@ func (d *Sequencer) startBuildingBlock() { d.log.Info("Sequencing Isthmus upgrade block") } + // For the Jovian activation block we must not include any sequencer transactions. + if d.rollupCfg.IsJovianActivationBlock(uint64(attrs.Timestamp)) { + attrs.NoTxPool = true + d.log.Info("Sequencing Jovian upgrade block") + } + // For the Interop activation block we must not include any sequencer transactions. if d.rollupCfg.IsInteropActivationBlock(uint64(attrs.Timestamp)) { attrs.NoTxPool = true diff --git a/op-service/txinclude/txbudget.go b/op-service/txinclude/txbudget.go index 50f11900fbc19..4582b90853afa 100644 --- a/op-service/txinclude/txbudget.go +++ b/op-service/txinclude/txbudget.go @@ -96,7 +96,9 @@ func (b *TxBudget) AfterIncluded(budgetedCost eth.ETH, tx *IncludedTx) { // operatorCost if receipt.OperatorFeeScalar != nil { // https://github.com/ethereum-optimism/op-geth/blob/6005dd53e1b50fe5a3f59764e3e2056a639eff2f/core/types/rollup_cost.go#L244-L247 - // Also see: https://specs.optimism.io/protocol/isthmus/exec-engine.html#operator-operatorCost + // Also see: https://specs.optimism.io/protocol/isthmus/exec-engine.html#operator-fee + // TODO(17817): This currently uses the Isthmus formula (divide by 1e6). Need to update to handle both + // Isthmus and Jovian formulas based on fork activation. Jovian formula multiplies by 100 instead. operatorCost := new(big.Int).SetUint64(receipt.GasUsed) operatorCost.Mul(operatorCost, new(big.Int).SetUint64(*receipt.OperatorFeeScalar)) operatorCost = operatorCost.Div(operatorCost, oneMillion) diff --git a/op-service/txintent/bindings/GasPriceOracle.go b/op-service/txintent/bindings/GasPriceOracle.go index 8f08620451b92..a2ca874516463 100644 --- a/op-service/txintent/bindings/GasPriceOracle.go +++ b/op-service/txintent/bindings/GasPriceOracle.go @@ -13,6 +13,8 @@ type GasPriceOracle struct { L1BaseFee func() TypedCall[*eth.ETH] `sol:"l1BaseFee"` BlobBaseFee func() TypedCall[*eth.ETH] `sol:"blobBaseFee"` IsFjord func() TypedCall[bool] `sol:"isFjord"` + IsIsthmus func() TypedCall[bool] `sol:"isIsthmus"` + IsJovian func() TypedCall[bool] `sol:"isJovian"` GetL1Fee func(data []byte) TypedCall[eth.ETH] `sol:"getL1Fee"` GetL1GasUsed func(data []byte) TypedCall[uint64] `sol:"getL1GasUsed"` GetL1FeeUpperBound func(unsignedTxSize *big.Int) TypedCall[eth.ETH] `sol:"getL1FeeUpperBound"` diff --git a/packages/contracts-bedrock/interfaces/L2/IGasPriceOracle.sol b/packages/contracts-bedrock/interfaces/L2/IGasPriceOracle.sol index 8e1b4255a079c..4112af3fc8b51 100644 --- a/packages/contracts-bedrock/interfaces/L2/IGasPriceOracle.sol +++ b/packages/contracts-bedrock/interfaces/L2/IGasPriceOracle.sol @@ -16,12 +16,14 @@ interface IGasPriceOracle { function isEcotone() external view returns (bool); function isFjord() external view returns (bool); function isIsthmus() external view returns (bool); + function isJovian() external view returns (bool); function l1BaseFee() external view returns (uint256); function overhead() external view returns (uint256); function scalar() external view returns (uint256); function setEcotone() external; function setFjord() external; function setIsthmus() external; + function setJovian() external; function version() external view returns (string memory); function __constructor__() external; diff --git a/packages/contracts-bedrock/scripts/L2Genesis.s.sol b/packages/contracts-bedrock/scripts/L2Genesis.s.sol index de75c6b99cf1e..5708dfe33c7a1 100644 --- a/packages/contracts-bedrock/scripts/L2Genesis.s.sol +++ b/packages/contracts-bedrock/scripts/L2Genesis.s.sol @@ -154,11 +154,13 @@ contract L2Genesis is Script { return; } - if (forkEquals(_fork, Fork.INTEROP)) { + activateJovian(); + + if (forkEquals(_fork, Fork.JOVIAN)) { return; } - if (forkEquals(_fork, Fork.JOVIAN)) { + if (forkEquals(_fork, Fork.INTEROP)) { return; } } @@ -571,6 +573,11 @@ contract L2Genesis is Script { IGasPriceOracle(Predeploys.GAS_PRICE_ORACLE).setIsthmus(); } + function activateJovian() internal { + vm.prank(IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).DEPOSITOR_ACCOUNT()); + IGasPriceOracle(Predeploys.GAS_PRICE_ORACLE).setJovian(); + } + /// @notice Sets the bytecode in state function _setImplementationCode(address _addr) internal returns (address) { string memory cname = Predeploys.getName(_addr); diff --git a/packages/contracts-bedrock/snapshots/abi/GasPriceOracle.json b/packages/contracts-bedrock/snapshots/abi/GasPriceOracle.json index 36efa6c5768f4..26d8dcd183412 100644 --- a/packages/contracts-bedrock/snapshots/abi/GasPriceOracle.json +++ b/packages/contracts-bedrock/snapshots/abi/GasPriceOracle.json @@ -205,6 +205,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "isJovian", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "l1BaseFee", @@ -265,6 +278,13 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "setJovian", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "version", diff --git a/packages/contracts-bedrock/snapshots/semver-lock.json b/packages/contracts-bedrock/snapshots/semver-lock.json index 0316ab9250b5c..2d976ab1862a8 100644 --- a/packages/contracts-bedrock/snapshots/semver-lock.json +++ b/packages/contracts-bedrock/snapshots/semver-lock.json @@ -60,8 +60,8 @@ "sourceCodeHash": "0x6d137fef431d75a8bf818444915fc39c8b1d93434a9af9971d96fb3170bc72b7" }, "src/L2/GasPriceOracle.sol:GasPriceOracle": { - "initCodeHash": "0x38ef70b2783dd45ad807afcf57972c7df4abaaeb5d16d17cdb451b9e931a9cbb", - "sourceCodeHash": "0x4351fe2ac1106c8c220b8cfe7839bc107c24d8084deb21259ac954f5a362725d" + "initCodeHash": "0xedc721584d43025c515186d4d5879d2b8e4abaf3a69181b99b6bf90c684df442", + "sourceCodeHash": "0x0074761fc0f893a2418b4e1197c7f29ee59f407df31b99c420bf2fd82d14d583" }, "src/L2/L1Block.sol:L1Block": { "initCodeHash": "0x1f054ff228ecad7f51772dd25084469192f7a33c522b87cd46ec5558d3c46aec", diff --git a/packages/contracts-bedrock/snapshots/storageLayout/GasPriceOracle.json b/packages/contracts-bedrock/snapshots/storageLayout/GasPriceOracle.json index 8e4127173dc23..c1eed282c46aa 100644 --- a/packages/contracts-bedrock/snapshots/storageLayout/GasPriceOracle.json +++ b/packages/contracts-bedrock/snapshots/storageLayout/GasPriceOracle.json @@ -19,5 +19,12 @@ "offset": 2, "slot": "0", "type": "bool" + }, + { + "bytes": "1", + "label": "isJovian", + "offset": 3, + "slot": "0", + "type": "bool" } ] \ No newline at end of file diff --git a/packages/contracts-bedrock/src/L2/GasPriceOracle.sol b/packages/contracts-bedrock/src/L2/GasPriceOracle.sol index 5af0b0e9de0f3..75814f65cd91f 100644 --- a/packages/contracts-bedrock/src/L2/GasPriceOracle.sol +++ b/packages/contracts-bedrock/src/L2/GasPriceOracle.sol @@ -30,8 +30,8 @@ contract GasPriceOracle is ISemver { uint256 public constant DECIMALS = 6; /// @notice Semantic version. - /// @custom:semver 1.4.0 - string public constant version = "1.4.0"; + /// @custom:semver 1.5.0 + string public constant version = "1.5.0"; /// @notice This is the intercept value for the linear regression used to estimate the final size of the /// compressed transaction. @@ -54,6 +54,9 @@ contract GasPriceOracle is ISemver { /// @notice Indicates whether the network has gone through the Isthmus upgrade. bool public isIsthmus; + /// @notice Indicates whether the network has gone through the Jovian upgrade. + bool public isJovian; + /// @notice Computes the L1 portion of the fee based on the size of the rlp encoded input /// transaction, the current L1 base fee, and the various dynamic parameters. /// @param _data Unsigned fully RLP-encoded transaction to get the L1 fee for. @@ -115,6 +118,17 @@ contract GasPriceOracle is ISemver { isIsthmus = true; } + /// @notice Set chain to be Jovian chain (callable by depositor account) + function setJovian() external { + require( + msg.sender == Constants.DEPOSITOR_ACCOUNT, + "GasPriceOracle: only the depositor account can set isJovian flag" + ); + require(isIsthmus, "GasPriceOracle: Jovian can only be activated after Isthmus"); + require(isJovian == false, "GasPriceOracle: Jovian already active"); + isJovian = true; + } + /// @notice Retrieves the current gas price (base fee). /// @return Current L2 gas price (base fee). function gasPrice() public view returns (uint256) { @@ -194,15 +208,26 @@ contract GasPriceOracle is ISemver { return l1GasUsed + IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).l1FeeOverhead(); } + /// @notice Calculates the operator fee for a given gas usage. + /// @dev Formula varies based on fork activation: + /// - Pre-Isthmus: Returns 0 (no operator fee) + /// - Isthmus (pre-Jovian): operatorFee = (gasUsed * operatorFeeScalar / 1e6) + operatorFeeConstant + /// - Jovian and after: operatorFee = (gasUsed * operatorFeeScalar * 100) + operatorFeeConstant + /// @param _gasUsed The amount of gas used by the transaction + /// @return The calculated operator fee function getOperatorFee(uint256 _gasUsed) public view returns (uint256) { if (!isIsthmus) { return 0; } - return Arithmetic.saturatingAdd( - Arithmetic.saturatingMul(_gasUsed, IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).operatorFeeScalar()) / 1e6, - IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).operatorFeeConstant() - ); + uint256 operatorScalar = IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).operatorFeeScalar(); + uint256 operatorConstant = IL1Block(Predeploys.L1_BLOCK_ATTRIBUTES).operatorFeeConstant(); + + if (isJovian) { + return Arithmetic.saturatingAdd(Arithmetic.saturatingMul(_gasUsed, operatorScalar) * 100, operatorConstant); + } else { + return Arithmetic.saturatingAdd(Arithmetic.saturatingMul(_gasUsed, operatorScalar) / 1e6, operatorConstant); + } } /// @notice Computation of the L1 portion of the fee for Bedrock. diff --git a/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol b/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol index 95053e369da11..11b9918c9cf7b 100644 --- a/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol +++ b/packages/contracts-bedrock/test/L2/GasPriceOracle.t.sol @@ -116,6 +116,13 @@ contract GasPriceOracleBedrock_Test is GasPriceOracle_Test { gasPriceOracle.setFjord(); } + /// @dev Tests that Jovian activation requires Isthmus to be active first. + function test_setJovian_requiresIsthmus_reverts() external { + vm.prank(depositor); + vm.expectRevert("GasPriceOracle: Jovian can only be activated after Isthmus"); + gasPriceOracle.setJovian(); + } + /// @dev Tests that `getL1Fee` returns the expected value when both fjord and ecotone are not active function test_getL1Fee_whenFjordAndEcotoneNotActive_succeeds() external { vm.store(address(gasPriceOracle), bytes32(uint256(0)), bytes32(0)); @@ -382,7 +389,7 @@ contract GasPriceOracleIsthmus_Test is GasPriceOracle_Test { require(success, "GasPriceOracleIsthmus_Test: Function call failed"); } - /// @dev Tests that `operatorFee` is set correctly. + /// @dev Tests that `operatorFee` is set correctly using the Isthmus formula (divide by 1e6). function test_getOperatorFee_succeeds() external view { assertEq(gasPriceOracle.getOperatorFee(10), 10 * operatorFeeScalar / 1e6 + operatorFeeConstant); } @@ -392,4 +399,88 @@ contract GasPriceOracleIsthmus_Test is GasPriceOracle_Test { vm.expectRevert("GasPriceOracle: only the depositor account can set isIsthmus flag"); gasPriceOracle.setIsthmus(); } + + /// @dev Tests that Jovian cannot be activated yet (since it's not activated by default). + function test_setJovian_notActivated_succeeds() external { + assertEq(gasPriceOracle.isJovian(), false); + + // Activate Jovian + vm.prank(depositor); + gasPriceOracle.setJovian(); + + assertEq(gasPriceOracle.isJovian(), true); + } +} + +contract GasPriceOracleJovian_Test is GasPriceOracle_Test { + /// @dev Sets up the test suite with Isthmus parameters configured. + function setUp() public virtual override { + l2Fork = Fork.ISTHMUS; + super.setUp(); + + // Configure Isthmus state on the L1 block. + bytes memory calldataPacked = Encoding.encodeSetL1BlockValuesIsthmus( + baseFeeScalar, + blobBaseFeeScalar, + sequenceNumber, + timestamp, + number, + baseFee, + blobBaseFee, + hash, + batcherHash, + operatorFeeScalar, + operatorFeeConstant + ); + + vm.prank(depositor); + (bool success,) = address(l1Block).call(calldataPacked); + require(success, "GasPriceOracleJovian_Test: L1Block setup failed"); + + assertEq(gasPriceOracle.isIsthmus(), true, "Isthmus should be active before enabling Jovian"); + assertEq(gasPriceOracle.isJovian(), false, "Jovian starts active"); + } + + function _activateJovian() internal { + vm.prank(depositor); + gasPriceOracle.setJovian(); + assertEq(gasPriceOracle.isJovian(), true, "Jovian activation failed"); + } + + /// @dev Tests that `operatorFee` is set correctly using the new Jovian formula (multiply by 100). + function test_getOperatorFee_succeeds() external { + _activateJovian(); + assertEq(gasPriceOracle.getOperatorFee(10), 10 * operatorFeeScalar * 100 + operatorFeeConstant); + } + + /// @dev Tests that `setJovian` is only callable by the depositor. + function test_setJovian_wrongCaller_reverts() external { + vm.expectRevert("GasPriceOracle: only the depositor account can set isJovian flag"); + gasPriceOracle.setJovian(); + } + + /// @dev Tests that `setJovian` cannot be activated twice. + function test_setJovian_alreadyActive_reverts() external { + _activateJovian(); + vm.prank(depositor); + vm.expectRevert("GasPriceOracle: Jovian already active"); + gasPriceOracle.setJovian(); + } + + /// @dev Tests the transition from Isthmus formula to Jovian formula. + function test_formulaTransition_succeeds() external { + // Check Isthmus formula (divide by 1e6) + uint256 isthmusFee = gasPriceOracle.getOperatorFee(10); + assertEq(isthmusFee, 10 * operatorFeeScalar / 1e6 + operatorFeeConstant); + + // Activate Jovian + _activateJovian(); + + // Check Jovian formula (multiply by 100) + uint256 jovianFee = gasPriceOracle.getOperatorFee(10); + assertEq(jovianFee, 10 * operatorFeeScalar * 100 + operatorFeeConstant); + + // Verify the fee increased significantly + assertGt(jovianFee, isthmusFee); + } }