Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion op-e2e/actions/interop/dsl/emitter.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package dsl

import (
"github.com/ethereum-optimism/optimism/op-e2e/actions/helpers"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/emit"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/contracts/bindings/emit"
"github.com/ethereum-optimism/optimism/op-service/eth"
"github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/require"
Expand Down
2 changes: 1 addition & 1 deletion op-e2e/actions/interop/dsl/inbox.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/ethereum/go-ethereum/crypto"

"github.com/ethereum-optimism/optimism/op-e2e/actions/helpers"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/inbox"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/contracts/bindings/inbox"
"github.com/ethereum-optimism/optimism/op-service/eth"
"github.com/ethereum-optimism/optimism/op-service/predeploys"
stypes "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types"
Expand Down
2 changes: 1 addition & 1 deletion op-e2e/actions/interop/dsl/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package dsl

import (
"github.com/ethereum-optimism/optimism/op-e2e/actions/helpers"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/inbox"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/contracts/bindings/inbox"
"github.com/ethereum-optimism/optimism/op-service/predeploys"
"github.com/ethereum/go-ethereum/core/types"
"github.com/stretchr/testify/require"
Expand Down
2 changes: 1 addition & 1 deletion op-e2e/actions/interop/dsl/transactions.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (

"github.com/ethereum-optimism/optimism/op-e2e/actions/helpers"
"github.com/ethereum-optimism/optimism/op-e2e/bindingspreview"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/inbox"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/contracts/bindings/inbox"
stypes "github.com/ethereum-optimism/optimism/op-supervisor/supervisor/types"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
Expand Down
4 changes: 2 additions & 2 deletions op-e2e/actions/interop/emitter_contract_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ import (
"github.com/ethereum-optimism/optimism/op-chain-ops/devkeys"
"github.com/ethereum-optimism/optimism/op-e2e/actions/helpers"
"github.com/ethereum-optimism/optimism/op-e2e/actions/interop/dsl"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/emit"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/inbox"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/contracts/bindings/emit"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/contracts/bindings/inbox"
"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
"github.com/ethereum-optimism/optimism/op-node/rollup/event"
"github.com/ethereum-optimism/optimism/op-service/eth"
Expand Down
2 changes: 1 addition & 1 deletion op-e2e/actions/interop/interop_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (

"github.com/ethereum-optimism/optimism/op-e2e/actions/helpers"
"github.com/ethereum-optimism/optimism/op-e2e/actions/interop/dsl"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/interop/contracts/bindings/emit"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/contracts/bindings/emit"
"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
"github.com/ethereum-optimism/optimism/op-node/rollup/event"
"github.com/ethereum-optimism/optimism/op-node/rollup/interop/managed"
Expand Down
11 changes: 11 additions & 0 deletions op-e2e/actions/proofs/helpers/matrix.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,3 +135,14 @@ var (
func NewForkMatrix(forks ...*Hardfork) ForkMatrix {
return append(ForkMatrix{}, forks...)
}

func FaultProofForks() ForkMatrix {
var forks ForkMatrix
for _, hf := range Hardforks {
if hf == Regolith || hf == Canyon || hf == Delta {
continue
}
forks = append(forks, hf)
}
return forks
}
114 changes: 105 additions & 9 deletions op-e2e/actions/proofs/precompile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ package proofs
import (
"context"
"encoding/binary"
"slices"
"strings"
"sync"
"testing"
"time"

actionsHelpers "github.com/ethereum-optimism/optimism/op-e2e/actions/helpers"
"github.com/ethereum-optimism/optimism/op-e2e/actions/proofs/helpers"
"github.com/ethereum-optimism/optimism/op-e2e/e2eutils/contracts/bindings/invoker"
preimage "github.com/ethereum-optimism/optimism/op-preimage"
"github.com/ethereum-optimism/optimism/op-program/client/l1"
hostcommon "github.com/ethereum-optimism/optimism/op-program/host/common"
Expand All @@ -24,29 +24,25 @@ import (
"github.com/stretchr/testify/require"
)

func Test_OPProgramAction_Precompiles(gt *testing.T) {
func Test_OPProgramAction_PrecompileHint(gt *testing.T) {
matrix := helpers.NewMatrix[any]()
defer matrix.Run(gt)
// Remove forks unsupported by the fault proof
forks := slices.DeleteFunc(helpers.Hardforks, func(hf *helpers.Hardfork) bool {
return hf == helpers.Regolith || hf == helpers.Canyon || hf == helpers.Delta
})

for _, test := range PrecompileTestFixtures {
testCase := test
matrix.AddTestCase(
test.Name,
nil,
forks,
helpers.FaultProofForks(),
func(t *testing.T, testCfg *helpers.TestCfg[any]) {
runPrecompileTest(t, testCase, testCfg)
runPrecompileHintTest(t, testCase, testCfg)
},
helpers.ExpectNoError(),
)
}
}

func runPrecompileTest(gt *testing.T, testCase PrecompileTestFixture, testCfg *helpers.TestCfg[any]) {
func runPrecompileHintTest(gt *testing.T, testCase PrecompileTestFixture, testCfg *helpers.TestCfg[any]) {
t := actionsHelpers.NewDefaultTesting(gt)
env := helpers.NewL2FaultProofEnv(t, testCfg, helpers.NewTestParams(), helpers.NewBatcherCfg())

Expand Down Expand Up @@ -155,3 +151,103 @@ func (p *precompileHintCounter) GetCount() int {
defer p.RWMutex.RUnlock()
return p.count
}

func Test_ProgramAction_Precompiles(gt *testing.T) {
matrix := helpers.NewMatrix[PrecompileTestFixture]()
defer matrix.Run(gt)
for _, test := range PrecompileTestFixtures {
testCase := test
matrix.AddTestCase(
testCase.Name,
testCase,
helpers.FaultProofForks(),
runPrecompileTest,
helpers.ExpectNoError(),
)
}
}

func runPrecompileTest(gt *testing.T, testCfg *helpers.TestCfg[PrecompileTestFixture]) {
t := actionsHelpers.NewDefaultTesting(gt)
env := helpers.NewL2FaultProofEnv(t, testCfg, helpers.NewTestParams(), helpers.NewBatcherCfg())
testCase := testCfg.Custom

// deploy invoker contract
env.Alice.L2.ActResetTxOpts(t)
env.Alice.L2.ActSetTxCalldata(common.FromHex(invoker.InvokerMetaData.Bin))(t)
env.Alice.L2.ActMakeTx(t)
env.Sequencer.ActL2StartBlock(t)
env.Engine.ActL2IncludeTx(env.Alice.Address())(t)
env.Sequencer.ActL2EndBlock(t)
env.Alice.L2.ActCheckReceiptStatusOfLastTx(true)(t)

invokerContract := env.Alice.L2.LastTxReceipt(t).ContractAddress
require.NotZero(t, invokerContract, "invoker contract address is zero")
abi, err := invoker.InvokerMetaData.GetAbi()
require.NoError(t, err)
invokeCalldata, err := abi.Pack("invokePrecompile", testCase.Address, testCase.Input)
require.NoError(t, err)

// call precompile via invoker
env.Alice.L2.ActResetTxOpts(t)
env.Alice.L2.ActSetTxToAddr(&invokerContract)(t)
env.Alice.L2.ActSetTxCalldata(invokeCalldata)(t)
env.Alice.L2.ActMakeTx(t)
env.Sequencer.ActL2StartBlock(t)
env.Engine.ActL2IncludeTx(env.Alice.Address())(t)
env.Sequencer.ActL2EndBlock(t)
env.Alice.L2.ActCheckReceiptStatusOfLastTx(true)(t)

receipt := env.Alice.L2.LastTxReceipt(t)
receiptBlockTime := env.Engine.L2Chain().GetBlockByHash(receipt.BlockHash).Time()
rules := env.Engine.L2Chain().Config().Rules(receipt.BlockNumber, true, receiptBlockTime)
expectedResult := make([]byte, 0)
precompile, ok := vm.ActivePrecompiledContracts(rules)[testCase.Address]
if ok {
expectedResult, err = precompile.Run(testCase.Input)
require.NoError(t, err)
}

// sanity check Invoker precompile call
require.Equal(t, receipt.Status, uint64(1), "transaction should succeed")
require.Len(t, receipt.Logs, 1)
require.Equal(t, receipt.Logs[0].Address, invokerContract)
require.Len(t, receipt.Logs[0].Topics, 2)
precompileAddress := receipt.Logs[0].Topics[1]
var out struct{ Result []byte }
err = abi.UnpackIntoInterface(&out, "PrecompileInvoked", receipt.Logs[0].Data)
precompileResult := out.Result
require.NoError(t, err)
require.Equal(t, common.HexToAddress(precompileAddress.Hex()), testCase.Address)
require.Equal(t, expectedResult, precompileResult)

// instruct the batcher to submit the Invoker precompile tx to l1, and include the transaction.
env.Batcher.ActSubmitAll(t)
env.Miner.ActL1StartBlock(12)(t)
env.Miner.ActL1IncludeTxByHash(env.Batcher.LastSubmitted.Hash())(t)
env.Miner.ActL1EndBlock(t)

// Finalize the block with the batch on L1.
env.Miner.ActL1SafeNext(t)
env.Miner.ActL1FinalizeNext(t)

// Instruct the sequencer to derive the L2 chain from the data on L1 that the batcher just posted.
env.Sequencer.ActL1HeadSignal(t)
env.Sequencer.ActL2PipelineFull(t)

l1Head := env.Miner.L1Chain().CurrentBlock()
l2SafeHead := env.Engine.L2Chain().CurrentSafeBlock()

require.Equal(t, uint64(1), l1Head.Number.Uint64())
// Ensure the block is marked as safe before we attempt to fault prove it.
require.Equal(t, uint64(2), l2SafeHead.Number.Uint64())

defaultParam := helpers.WithPreInteropDefaults(t, l2SafeHead.Number.Uint64(), env.Sequencer.L2Verifier, env.Engine)
fixtureInputParams := []helpers.FixtureInputParam{defaultParam, helpers.WithL1Head(l1Head.Hash())}
var fixtureInputs helpers.FixtureInputs
for _, apply := range fixtureInputParams {
apply(&fixtureInputs)
}

env.RunFaultProofProgram(t, l2SafeHead.Number.Uint64(), helpers.ExpectNoError(), fixtureInputParams...)
}
Loading