diff --git a/go.work.sum b/go.work.sum index 1fcb088af4..44c7fdc0c8 100644 --- a/go.work.sum +++ b/go.work.sum @@ -3,6 +3,7 @@ github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1: github.com/aws/aws-sdk-go v1.42.6/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/ethereum-optimism/op-geth v0.0.0-20220902195842-db3b8fd50260/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= @@ -21,6 +22,7 @@ github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47e github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/libp2p/go-libp2p-blankhost v0.4.0/go.mod h1:Ugc8dxkVEpcRxUhxDFYITLmu60bN9RabRquN+ZETjEo= github.com/libp2p/go-libp2p-swarm v0.11.0/go.mod h1:sumjVYrC84gPSZOFKL8hNcnN6HZvJSwJ8ymaXeko4Lk= +github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/zeroconf/v2 v2.2.0/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lucas-clemente/quic-go v0.28.0/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0= github.com/lucas-clemente/quic-go v0.28.1/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0= diff --git a/optimism/devnet.go b/optimism/devnet.go index adcdcf3937..3220827ea7 100644 --- a/optimism/devnet.go +++ b/optimism/devnet.go @@ -527,6 +527,10 @@ func StartSequencerDevnet(ctx context.Context, d *Devnet, params *SequencerDevne if err := WaitBlock(ctx, d.L2Client(0), expHeight); err != nil { return err } + + d.InitBindingsL1(0) + d.InitBindingsL2(0) + return nil } diff --git a/simulators/optimism/l1ops/deposit_tests.go b/simulators/optimism/l1ops/deposit_tests.go index 9336a42700..bacaca334f 100644 --- a/simulators/optimism/l1ops/deposit_tests.go +++ b/simulators/optimism/l1ops/deposit_tests.go @@ -1,16 +1,19 @@ package main import ( + "math/big" + "time" + "github.com/ethereum-optimism/optimism/op-bindings/bindings" "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" "github.com/ethereum/go-ethereum/params" "github.com/ethereum/hive/hivesim" "github.com/ethereum/hive/optimism" "github.com/stretchr/testify/require" - "math/big" - "time" ) func simplePortalDepositTest(t *hivesim.T, env *optimism.TestEnv) { @@ -33,6 +36,41 @@ func simplePortalDepositTest(t *hivesim.T, env *optimism.TestEnv) { require.Equal(t, mintAmount, diff, "did not get expected balance change after mint") } +func contractPortalDepositTest(t *hivesim.T, env *optimism.TestEnv) { + l1 := env.Devnet.L1Client(0) + l2 := env.Devnet.L2Client(0) + l1Vault := env.Devnet.L1Vault + l2Vault := env.Devnet.L2Vault + depositor := l1Vault.CreateAccount(env.TimeoutCtx(time.Minute), l1, big.NewInt(params.Ether)) + l2Vault.InsertKey(l1Vault.FindKey(depositor)) + + l2Opts := l2Vault.KeyedTransactor(depositor) + l2Opts.Value = big.NewInt(0) + l2Opts.NoSend = true + + _, deployTx, _, err := bindings.DeployERC20(l2Opts, l2, "TEST", "OP") + require.NoError(t, err) + + l1Opts := l1Vault.KeyedTransactor(depositor) + l1Opts.Value = big.NewInt(0.1 * params.Ether) + + portal := env.Devnet.Bindings.BindingsL1.OptimismPortal + tx, err := portal.DepositTransaction(l1Opts, common.Address{}, common.Big0, 1_000_000, true, deployTx.Data()) + require.NoError(t, err) + receipt := awaitDeposit(t, env, tx, l1, l2) + require.NotEqual(t, common.Address{}, receipt.ContractAddress) + + opts := &bind.CallOpts{} + l2Contract, err := bindings.NewERC20(receipt.ContractAddress, l2) + require.NoError(t, err) + name, err := l2Contract.Name(opts) + require.NoError(t, err) + require.Equal(t, "TEST", name) + sym, err := l2Contract.Symbol(opts) + require.NoError(t, err) + require.Equal(t, "OP", sym) +} + func doDeposit(t *hivesim.T, env *optimism.TestEnv, depositor common.Address, mintAmount *big.Int) { depositContract, err := bindings.NewOptimismPortal( env.Devnet.Deployments.DeploymentsL1.OptimismPortalProxy, @@ -57,3 +95,15 @@ func doDeposit(t *hivesim.T, env *optimism.TestEnv, depositor common.Address, mi require.NoError(t, err) require.Equal(t, receipt.Status, types.ReceiptStatusSuccessful) } + +func awaitDeposit(t *hivesim.T, env *optimism.TestEnv, tx *types.Transaction, l1, l2 *ethclient.Client) *types.Receipt { + receipt, err := optimism.WaitReceipt(env.TimeoutCtx(time.Minute), l1, tx.Hash()) + require.NoError(t, err) + reconstructedDep, err := derive.UnmarshalDepositLogEvent(receipt.Logs[0]) + require.NoError(t, err, "could not reconstruct L2 deposit") + tx = types.NewTx(reconstructedDep) + receipt, err = optimism.WaitReceipt(env.TimeoutCtx(45*time.Second), l2, tx.Hash()) + require.NoError(t, err) + require.Equal(t, receipt.Status, types.ReceiptStatusSuccessful) + return receipt +} diff --git a/simulators/optimism/l1ops/main.go b/simulators/optimism/l1ops/main.go index ea409b9d6e..74f66645eb 100644 --- a/simulators/optimism/l1ops/main.go +++ b/simulators/optimism/l1ops/main.go @@ -2,24 +2,17 @@ package main import ( "context" + "time" + "github.com/ethereum/hive/hivesim" "github.com/ethereum/hive/optimism" "github.com/stretchr/testify/require" - "time" ) -var depositTests = []*optimism.TestSpec{ - { - Name: "deposit simple tx through the portal", - Run: simplePortalDepositTest, - }, -} - -var withdrawalTests = []*optimism.TestSpec{ - { - Name: "simple withdrawal", - Run: simpleWithdrawalTest, - }, +var tests = []*optimism.TestSpec{ + {Name: "deposit simple tx through the portal", Run: simplePortalDepositTest}, + {Name: "deposit contract creation through the portal", Run: contractPortalDepositTest}, + {Name: "simple withdrawal", Run: simpleWithdrawalTest}, } func main() { @@ -31,14 +24,9 @@ Tests deposits, withdrawals, and other L1-related operations against a running n } suite.Add(&hivesim.TestSpec{ - Name: "deposits", - Description: "Tests deposits.", - Run: runAllTests(depositTests), - }) - suite.Add(&hivesim.TestSpec{ - Name: "withdrawals", - Description: "Tests withdrawals.", - Run: runAllTests(withdrawalTests), + Name: "l1ops", + Description: "Tests L1 operations.", + Run: runAllTests(tests), }) sim := hivesim.New()