diff --git a/e2e/app/admin/bridgespec.go b/e2e/app/admin/bridgespec.go index b8df34caf..76bace8b6 100644 --- a/e2e/app/admin/bridgespec.go +++ b/e2e/app/admin/bridgespec.go @@ -82,7 +82,7 @@ func (s BridgeSpec) Verify() error { func EnsureBridgeSpec(ctx context.Context, def app.Definition, cfg Config, specOverride *NetworkBridgeSpec) error { s := setup(def, cfg) - l1Chain, ok := s.network.EthereumChain() + l1Chain, ok := s.testnet.EthereumChain() if !ok { return errors.New("no ethereum chain") } @@ -120,12 +120,12 @@ func EnsureBridgeSpec(ctx context.Context, def app.Definition, cfg Config, specO // ensureNativeBridgeSpec ensures that the live native bridge contract is configured as per the local spec. func ensureNativeBridgeSpec(ctx context.Context, s shared, c chain, specOverride *BridgeSpec) error { - local := bridgeSpec[s.network.ID].Native + local := bridgeSpec[s.testnet.Network].Native if specOverride != nil { local = *specOverride } - ethCl, err := ethclient.Dial(c.Name, c.rpc) + ethCl, err := ethclient.Dial(c.Name, c.RPCEndpoint) if err != nil { return errors.Wrap(err, "dial eth client") } @@ -152,17 +152,17 @@ func ensureNativeBridgeSpec(ctx context.Context, s shared, c chain, specOverride // ensureL1BridgeSpec ensures that the live L1 bridge contract is configured as per the local spec. func ensureL1BridgeSpec(ctx context.Context, s shared, c chain, specOverride *BridgeSpec) error { - local := bridgeSpec[s.network.ID].L1 + local := bridgeSpec[s.testnet.Network].L1 if specOverride != nil { local = *specOverride } - ethCl, err := ethclient.Dial(c.Name, c.rpc) + ethCl, err := ethclient.Dial(c.Name, c.RPCEndpoint) if err != nil { return errors.Wrap(err, "dial eth client") } - addrs, err := contracts.GetAddresses(ctx, s.network.ID) + addrs, err := contracts.GetAddresses(ctx, s.testnet.Network) if err != nil { return errors.Wrap(err, "get addrs") } diff --git a/e2e/app/admin/common.go b/e2e/app/admin/common.go index 3860d03f7..1a4c27143 100644 --- a/e2e/app/admin/common.go +++ b/e2e/app/admin/common.go @@ -9,6 +9,7 @@ import ( "github.com/omni-network/omni/e2e/app" "github.com/omni-network/omni/e2e/app/eoa" fbproxy "github.com/omni-network/omni/e2e/fbproxy/app" + "github.com/omni-network/omni/e2e/types" "github.com/omni-network/omni/lib/anvil" "github.com/omni-network/omni/lib/contracts" "github.com/omni-network/omni/lib/errors" @@ -33,16 +34,18 @@ type shared struct { upgrader common.Address deployer common.Address endpoints xchain.RPCEndpoints - network netconf.Network + testnet types.Testnet cfg Config fireAPIKey string fireKeyPath string } -// chain contains chain specific resources, exteding netconf.Chain with an rpc endpoint. +// chain contains chain specific resources, extending EVMChain with the PortalAddress and an RPCEndpoint endpoint. +// Netconf.Chain cannot be used since we don't know the DeployHeight. type chain struct { - netconf.Chain - rpc string + types.EVMChain + PortalAddress common.Address + RPCEndpoint string } // setup returns common resources for all admin operations. @@ -52,7 +55,6 @@ func setup(def app.Definition, cfg Config) shared { upgrader := eoa.MustAddress(netID, eoa.RoleUpgrader) deployer := eoa.MustAddress(netID, eoa.RoleDeployer) endpoints := app.ExternalEndpoints(def) - network := app.NetworkFromDef(def) // addrs set lazily in setupChain @@ -61,7 +63,7 @@ func setup(def app.Definition, cfg Config) shared { upgrader: upgrader, deployer: deployer, endpoints: endpoints, - network: network, + testnet: def.Testnet, cfg: cfg, fireAPIKey: def.Cfg.FireAPIKey, fireKeyPath: def.Cfg.FireKeyPath, @@ -71,34 +73,33 @@ func setup(def app.Definition, cfg Config) shared { // setupChain returns chain specific resources. // starts and fbproxy for non-devnet chains. func setupChain(ctx context.Context, s shared, name string) (chain, error) { - c, ok := s.network.ChainByName(name) + c, ok := s.testnet.EVMChainByName(name) if !ok { return chain{}, errors.New("chain not found", "chain", name) } - rpc, err := s.endpoints.ByNameOrID(c.Name, c.ID) + rpc, err := s.endpoints.ByNameOrID(c.Name, c.ChainID) if err != nil { return chain{}, errors.Wrap(err, "rpc endpoint") } - // add portal address if not already set - if c.PortalAddress == (common.Address{}) { - addrs, err := contracts.GetAddresses(ctx, s.network.ID) - if err != nil { - return chain{}, errors.Wrap(err, "get addresses") - } - - c.PortalAddress = addrs.Portal + addrs, err := contracts.GetAddresses(ctx, s.testnet.Network) + if err != nil { + return chain{}, errors.Wrap(err, "get addresses") } if s.fireAPIKey != "" || s.fireKeyPath != "" { - rpc, err = startFBProxy(ctx, s.network.ID, rpc, s.fireAPIKey, s.fireKeyPath) + rpc, err = startFBProxy(ctx, s.testnet.Network, rpc, s.fireAPIKey, s.fireKeyPath) if err != nil { return chain{}, errors.Wrap(err, "start fb proxy") } } - return chain{Chain: c, rpc: rpc}, nil + return chain{ + EVMChain: c, + PortalAddress: addrs.Portal, + RPCEndpoint: rpc, + }, nil } type runOpts struct { @@ -125,7 +126,7 @@ func (s shared) run( o(&opts) } - names, err := maybeAll(s.network, s.cfg.Chain, opts.exclude) + names, err := maybeAll(s.testnet.EVMChains(), s.cfg.Chain, opts.exclude) if err != nil { return err } @@ -145,24 +146,24 @@ func (s shared) run( } // maybeAll returns all chains if chain is empty, otherwise returns chain. -func maybeAll(network netconf.Network, chain string, exclude []string) ([]string, error) { +func maybeAll(chains []types.EVMChain, chain string, exclude []string) ([]string, error) { excluded := make(map[string]bool) for _, e := range exclude { excluded[e] = true } if chain == "" { - var chains []string + var resp []string - for _, c := range network.EVMChains() { + for _, c := range chains { if excluded[c.Name] { continue } - chains = append(chains, c.Name) + resp = append(resp, c.Name) } - return chains, nil + return resp, nil } if excluded[chain] { @@ -177,7 +178,7 @@ func (s shared) runForge(ctx context.Context, rpc string, input []byte, senders return runForge(ctx, rpc, input, s.cfg.Broadcast, senders...) } -// runForge runs an Admin forge script against an rpc, returning the ouptut. +// runForge runs an Admin forge script against an RPCEndpoint, returning the ouptut. // if the senders are known anvil accounts, it will sign with private keys directly. // otherwise, it will use the unlocked flag. func runForge(ctx context.Context, rpc string, input []byte, broadcast bool, senders ...common.Address, @@ -200,8 +201,8 @@ func runForge(ctx context.Context, rpc string, input []byte, broadcast bool, sen args := []string{ "script", script, - "--slow", // wait for each tx to succed before sending the next - "--rpc-url", rpc, // rpc endpoint, fb proxy for non-devnet + "--slow", // wait for each tx to succed before sending the next + "--RPCEndpoint-url", rpc, // RPCEndpoint endpoint, fb proxy for non-devnet "--sig", hexutil.Encode(input), // Admin.sol calldata } @@ -222,7 +223,7 @@ func runForge(ctx context.Context, rpc string, input []byte, broadcast bool, sen return execCmd(ctx, dir, "forge", args...) } -// startFBProxy starts a fireblocks proxy to rpc, returns the listen address. The proxy stops when ctx is done. +// startFBProxy starts a fireblocks proxy to RPCEndpoint, returns the listen address. The proxy stops when ctx is done. func startFBProxy(ctx context.Context, netID netconf.ID, baseRPC string, fireAPIKey string, fireKeyPath string, ) (string, error) { cfg := fbproxy.Config{ diff --git a/e2e/app/admin/pausebridge.go b/e2e/app/admin/pausebridge.go index 0df1eccc3..6245309e3 100644 --- a/e2e/app/admin/pausebridge.go +++ b/e2e/app/admin/pausebridge.go @@ -18,7 +18,7 @@ func pauseBridge(ctx context.Context, s shared, c chain, addr common.Address, ac return errors.Wrap(err, "pack calldata", "chain", c.Name) } - out, err := s.runForge(ctx, c.rpc, calldata, s.manager) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.manager) if err != nil { return errors.Wrap(err, "run forge", "out", out, "chain", c.Name) } @@ -37,7 +37,7 @@ func unpauseBridge(ctx context.Context, s shared, c chain, addr common.Address, return errors.Wrap(err, "pack calldata", "chain", c.Name) } - out, err := s.runForge(ctx, c.rpc, calldata, s.manager) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.manager) if err != nil { return errors.Wrap(err, "run forge", "out", out, "chain", c.Name) } diff --git a/e2e/app/admin/pauseportal.go b/e2e/app/admin/pauseportal.go index b260d922b..3eeb89b94 100644 --- a/e2e/app/admin/pauseportal.go +++ b/e2e/app/admin/pauseportal.go @@ -16,7 +16,7 @@ func pausePortal(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata", "chain", c.Name) } - out, err := s.runForge(ctx, c.rpc, calldata, s.manager) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.manager) if err != nil { return errors.Wrap(err, "run forge", "out", out, "chain", c.Name) } @@ -35,7 +35,7 @@ func unpausePortal(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata", "chain", c.Name) } - out, err := s.runForge(ctx, c.rpc, calldata, s.manager) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.manager) if err != nil { return errors.Wrap(err, "run forge", "out", out, "chain", c.Name) } diff --git a/e2e/app/admin/pausexcall.go b/e2e/app/admin/pausexcall.go index 6ee290f7d..8fd3315db 100644 --- a/e2e/app/admin/pausexcall.go +++ b/e2e/app/admin/pausexcall.go @@ -17,7 +17,7 @@ func pauseXCall(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata", "chain", c.Name) } - out, err := s.runForge(ctx, c.rpc, calldata, s.manager) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.manager) if err != nil { return errors.Wrap(err, "run forge", "out", out, "chain", c.Name) } @@ -29,19 +29,19 @@ func pauseXCall(ctx context.Context, s shared, c chain) error { // pauseXCallTo pauses xcalls to a chain, on a chain. func pauseXCallTo(ctx context.Context, s shared, c chain, toID uint64) error { - to, ok := s.network.Chain(toID) + to, ok := s.testnet.EVMChainByID(toID) if !ok { return errors.New("chain id not in network", "chain", toID) } log.Info(ctx, "Pausing xcall...", "chain", c.Name, "to", to.Name, "addr", c.PortalAddress) - calldata, err := adminABI.Pack("pauseXCallTo", s.manager, c.PortalAddress, to.ID) + calldata, err := adminABI.Pack("pauseXCallTo", s.manager, c.PortalAddress, to.ChainID) if err != nil { return errors.Wrap(err, "pack calldata", "chain", c.Name) } - out, err := s.runForge(ctx, c.rpc, calldata, s.manager) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.manager) if err != nil { return errors.Wrap(err, "run forge", "out", out, "chain", c.Name) } @@ -60,7 +60,7 @@ func unpauseXCall(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata", "chain", c.Name) } - out, err := s.runForge(ctx, c.rpc, calldata, s.manager) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.manager) if err != nil { return errors.Wrap(err, "run forge", "out", out, "chain", c.Name) } @@ -72,19 +72,19 @@ func unpauseXCall(ctx context.Context, s shared, c chain) error { // pauseXCallTo pauses xcalls to a chain, on a chain. func unpauseXCallTo(ctx context.Context, s shared, c chain, toID uint64) error { - to, ok := s.network.Chain(toID) + to, ok := s.testnet.EVMChainByID(toID) if !ok { return errors.New("chain id not in network", "chain", toID) } log.Info(ctx, "Unpausing xcall...", "chain", c.Name, "to", to.Name, "addr", c.PortalAddress) - calldata, err := adminABI.Pack("unpauseXCallTo", s.manager, c.PortalAddress, to.ID) + calldata, err := adminABI.Pack("unpauseXCallTo", s.manager, c.PortalAddress, to.ChainID) if err != nil { return errors.Wrap(err, "pack calldata", "chain", c.Name) } - out, err := s.runForge(ctx, c.rpc, calldata, s.manager) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.manager) if err != nil { return errors.Wrap(err, "run forge", "out", out, "chain", c.Name) } diff --git a/e2e/app/admin/pausexsubmit.go b/e2e/app/admin/pausexsubmit.go index 2c118896f..fee650ff6 100644 --- a/e2e/app/admin/pausexsubmit.go +++ b/e2e/app/admin/pausexsubmit.go @@ -17,7 +17,7 @@ func pauseXSubmit(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata", "chain", c.Name) } - out, err := s.runForge(ctx, c.rpc, calldata, s.manager) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.manager) if err != nil { return errors.Wrap(err, "run forge", "out", out, "chain", c.Name) } @@ -29,19 +29,19 @@ func pauseXSubmit(ctx context.Context, s shared, c chain) error { // pauseXSubmitFrom pauses xsubmits from a chain, on a chain. func pauseXSubmitFrom(ctx context.Context, s shared, c chain, fromID uint64) error { - from, ok := s.network.Chain(fromID) + from, ok := s.testnet.EVMChainByID(fromID) if !ok { return errors.New("chain id not in network", "chain", fromID) } log.Info(ctx, "Pausing xsubmit...", "chain", c.Name, "from", from.Name, "addr", c.PortalAddress) - calldata, err := adminABI.Pack("pauseXSubmitFrom", s.manager, c.PortalAddress, from.ID) + calldata, err := adminABI.Pack("pauseXSubmitFrom", s.manager, c.PortalAddress, from.ChainID) if err != nil { return errors.Wrap(err, "pack calldata", "chain", c.Name) } - out, err := s.runForge(ctx, c.rpc, calldata, s.manager) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.manager) if err != nil { return errors.Wrap(err, "run forge", "out", out, "chain", c.Name) } @@ -60,7 +60,7 @@ func unpauseXSubmit(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata", "chain", c.Name) } - out, err := s.runForge(ctx, c.rpc, calldata, s.manager) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.manager) if err != nil { return errors.Wrap(err, "run forge", "out", out, "chain", c.Name) } @@ -72,19 +72,19 @@ func unpauseXSubmit(ctx context.Context, s shared, c chain) error { // pauseXSubmitFrom pauses xsubmits from a chain, on a chain. func unpauseXSubmitFrom(ctx context.Context, s shared, c chain, fromID uint64) error { - from, ok := s.network.Chain(fromID) + from, ok := s.testnet.EVMChainByID(fromID) if !ok { return errors.New("chain id not in network", "chain", fromID) } log.Info(ctx, "Unpausing xsubmit...", "chain", c.Name, "from", from.Name, "addr", c.PortalAddress) - calldata, err := adminABI.Pack("unpauseXSubmitFrom", s.manager, c.PortalAddress, from.ID) + calldata, err := adminABI.Pack("unpauseXSubmitFrom", s.manager, c.PortalAddress, from.ChainID) if err != nil { return errors.Wrap(err, "pack calldata", "chain", c.Name) } - out, err := s.runForge(ctx, c.rpc, calldata, s.manager) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.manager) if err != nil { return errors.Wrap(err, "run forge", "out", out, "chain", c.Name) } diff --git a/e2e/app/admin/portalspec.go b/e2e/app/admin/portalspec.go index 8abdd62ad..1257aab35 100644 --- a/e2e/app/admin/portalspec.go +++ b/e2e/app/admin/portalspec.go @@ -6,12 +6,14 @@ import ( "github.com/omni-network/omni/contracts/bindings" "github.com/omni-network/omni/e2e/app" + "github.com/omni-network/omni/e2e/types" "github.com/omni-network/omni/lib/errors" "github.com/omni-network/omni/lib/ethclient" "github.com/omni-network/omni/lib/log" "github.com/omni-network/omni/lib/netconf" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" ) // portalSpec defines portal specs per network, with chain specific overrides. @@ -96,7 +98,7 @@ func DefaultPortalSpec() PortalSpec { // EnsurePortalSpec ensures that live portal contracts are configured as per the local spec. func EnsurePortalSpec(ctx context.Context, def app.Definition, cfg Config, localSpecOverride *PortalSpec) error { return setup(def, cfg).run(ctx, func(ctx context.Context, s shared, c chain) error { - local, err := localPortalSpec(s.network.ID, c.ID) + local, err := localPortalSpec(s.testnet.Network, c.ChainID) if err != nil { return errors.Wrap(err, "get local portal spec", "chain", c.Name) } @@ -105,12 +107,12 @@ func EnsurePortalSpec(ctx context.Context, def app.Definition, cfg Config, local local = *localSpecOverride } - ethCl, err := ethclient.Dial(c.Name, c.rpc) + ethCl, err := ethclient.Dial(c.Name, c.RPCEndpoint) if err != nil { return errors.Wrap(err, "dial eth client", "chain", c.Name) } - live, err := livePortalSpec(ctx, s.network, c.Chain, ethCl) + live, err := livePortalSpec(ctx, s.testnet.EVMChains(), c.EVMChain, c.PortalAddress, ethCl) if err != nil { return errors.Wrap(err, "get live portal spec", "chain", c.Name) } @@ -262,15 +264,13 @@ func localPortalSpec(network netconf.ID, chainID uint64) (PortalSpec, error) { } // livePortalSpec returns the live, on-chain portal spec for a chain. -func livePortalSpec(ctx context.Context, network netconf.Network, c netconf.Chain, ethCl ethclient.Client) (PortalSpec, error) { - chains := network.EVMChains() - - portal, err := bindings.NewOmniPortal(c.PortalAddress, ethCl) +func livePortalSpec(ctx context.Context, chains []types.EVMChain, c types.EVMChain, portalAddr common.Address, ethCl ethclient.Client) (PortalSpec, error) { + portal, err := bindings.NewOmniPortal(portalAddr, ethCl) if err != nil { return PortalSpec{}, errors.Wrap(err, "new portal contract", "chain", c.Name) } - log.Info(ctx, "Fetching portal spec", "chain", c.Name, "address", c.PortalAddress) + log.Info(ctx, "Fetching portal spec", "chain", c.Name, "address", portalAddr) paused, err := portal.IsPaused1(&bind.CallOpts{Context: ctx}) if err != nil { @@ -306,22 +306,22 @@ func livePortalSpec(ctx context.Context, network netconf.Network, c netconf.Chai var xSubmitPausedFrom []uint64 for _, chain := range chains { - isXSubmitPausedFrom, err := portal.IsPaused0(&bind.CallOpts{Context: ctx}, actionXSubmit, chain.ID) + isXSubmitPausedFrom, err := portal.IsPaused0(&bind.CallOpts{Context: ctx}, actionXSubmit, chain.ChainID) if err != nil { return PortalSpec{}, errors.Wrap(err, "is xsubmit paused from", "chain", c.Name, "from", chain.Name) } - isXCallPausedTo, err := portal.IsPaused0(&bind.CallOpts{Context: ctx}, actionXCall, chain.ID) + isXCallPausedTo, err := portal.IsPaused0(&bind.CallOpts{Context: ctx}, actionXCall, chain.ChainID) if err != nil { return PortalSpec{}, errors.Wrap(err, "is xcall paused to", "chain", c.Name, "to", chain.Name) } if isXCallPausedTo { - xCallPausedTo = append(xCallPausedTo, chain.ID) + xCallPausedTo = append(xCallPausedTo, chain.ChainID) } if isXSubmitPausedFrom { - xSubmitPausedFrom = append(xSubmitPausedFrom, chain.ID) + xSubmitPausedFrom = append(xSubmitPausedFrom, chain.ChainID) } } diff --git a/e2e/app/admin/test.go b/e2e/app/admin/test.go index 5fc761502..a7b77809a 100644 --- a/e2e/app/admin/test.go +++ b/e2e/app/admin/test.go @@ -8,11 +8,11 @@ import ( "github.com/omni-network/omni/contracts/bindings" "github.com/omni-network/omni/e2e/app" + "github.com/omni-network/omni/e2e/types" "github.com/omni-network/omni/halo/genutil/evm/predeploys" "github.com/omni-network/omni/lib/contracts" "github.com/omni-network/omni/lib/errors" "github.com/omni-network/omni/lib/log" - "github.com/omni-network/omni/lib/netconf" "github.com/ethereum/go-ethereum/common" @@ -28,21 +28,19 @@ func Test(ctx context.Context, def app.Definition) error { log.Info(ctx, "Running contract admin tests.") - network := app.NetworkFromDef(def) - - if err := testEnsurePortalSpec(ctx, def, network); err != nil { + if err := testEnsurePortalSpec(ctx, def); err != nil { return err } - if err := testEnsureBridgeSpec(ctx, def, network); err != nil { + if err := testEnsureBridgeSpec(ctx, def); err != nil { return err } - if err := testUpgradePortal(ctx, def, network); err != nil { + if err := testUpgradePortal(ctx, def); err != nil { return err } - if err := tesUpgradeFeeOracleV1(ctx, def, network); err != nil { + if err := tesUpgradeFeeOracleV1(ctx, def); err != nil { return err } @@ -50,7 +48,7 @@ func Test(ctx context.Context, def app.Definition) error { return err } - if err := testUpgradeGasPump(ctx, def, network); err != nil { + if err := testUpgradeGasPump(ctx, def); err != nil { return err } @@ -76,16 +74,16 @@ func Test(ctx context.Context, def app.Definition) error { } // noCheck always returns nil. Use for upgrade actions, where only check is if upgrade succeeds. -func noCheck(context.Context, app.Definition, netconf.Chain) error { return nil } +func noCheck(context.Context, app.Definition, types.EVMChain) error { return nil } // testUpgradePortal tests UpgradePortal command. -func testUpgradePortal(ctx context.Context, def app.Definition, network netconf.Network) error { - err := forOne(ctx, def, randChain(network), UpgradePortal, noCheck) +func testUpgradePortal(ctx context.Context, def app.Definition) error { + err := forOne(ctx, def, randChain(def.Testnet.EVMChains()), UpgradePortal, noCheck) if err != nil { return errors.Wrap(err, "upgrade portal") } - err = forAll(ctx, def, network, UpgradePortal, noCheck) + err = forAll(ctx, def, UpgradePortal, noCheck) if err != nil { return errors.Wrap(err, "upgrade all portals") } @@ -93,13 +91,13 @@ func testUpgradePortal(ctx context.Context, def app.Definition, network netconf. return nil } -func tesUpgradeFeeOracleV1(ctx context.Context, def app.Definition, network netconf.Network) error { - err := forOne(ctx, def, randChain(network), UpgradeFeeOracleV1, noCheck) +func tesUpgradeFeeOracleV1(ctx context.Context, def app.Definition) error { + err := forOne(ctx, def, randChain(def.Testnet.EVMChains()), UpgradeFeeOracleV1, noCheck) if err != nil { return errors.Wrap(err, "upgrade feeoracle") } - err = forAll(ctx, def, network, UpgradeFeeOracleV1, noCheck) + err = forAll(ctx, def, UpgradeFeeOracleV1, noCheck) if err != nil { return errors.Wrap(err, "upgrade all feeoracles") } @@ -116,15 +114,11 @@ func testUpgradeGasStation(ctx context.Context, def app.Definition) error { return nil } -func testUpgradeGasPump(ctx context.Context, def app.Definition, network netconf.Network) error { +func testUpgradeGasPump(ctx context.Context, def app.Definition) error { // cannot UpgradeGasPump on omni evm - c := randChain(network) - for { - if c.Name != omniEVMName { - break - } - - c = randChain(network) + c := randChain(def.Testnet.EVMChains()) + for c.Name == omniEVMName { + c = randChain(def.Testnet.EVMChains()) } err := forOne(ctx, def, c, UpgradeGasPump, noCheck) @@ -132,7 +126,7 @@ func testUpgradeGasPump(ctx context.Context, def app.Definition, network netconf return errors.Wrap(err, "upgrade gas pump") } - err = forAll(ctx, def, network, UpgradeGasPump, noCheck) + err = forAll(ctx, def, UpgradeGasPump, noCheck) if err != nil { return errors.Wrap(err, "upgrade all gas pumps") } @@ -176,22 +170,23 @@ func testUpgradeBridgeL1(ctx context.Context, def app.Definition) error { return nil } -func testEnsurePortalSpec(ctx context.Context, def app.Definition, network netconf.Network) error { - expected := randPortalSpec(network) +func testEnsurePortalSpec(ctx context.Context, def app.Definition) error { + chains := def.Testnet.EVMChains() + expected := randPortalSpec(chains) ensurePortalSpec := func(ctx context.Context, def app.Definition, cfg Config) error { return EnsurePortalSpec(ctx, def, cfg, expected) } - err := forOne(ctx, def, randChain(network), ensurePortalSpec, checkPortalSpec(network, expected)) + err := forOne(ctx, def, randChain(chains), ensurePortalSpec, checkPortalSpec(chains, expected)) if err != nil { return errors.Wrap(err, "ensure portal spec") } // new random expected values - *expected = *randPortalSpec(network) + *expected = *randPortalSpec(def.Testnet.EVMChains()) - err = forAll(ctx, def, network, ensurePortalSpec, checkPortalSpec(network, expected)) + err = forAll(ctx, def, ensurePortalSpec, checkPortalSpec(chains, expected)) if err != nil { return errors.Wrap(err, "ensure all portal specs") } @@ -199,28 +194,28 @@ func testEnsurePortalSpec(ctx context.Context, def app.Definition, network netco return nil } -func testEnsureBridgeSpec(ctx context.Context, def app.Definition, network netconf.Network) error { - addrs, err := contracts.GetAddresses(ctx, network.ID) +func testEnsureBridgeSpec(ctx context.Context, def app.Definition) error { + addrs, err := contracts.GetAddresses(ctx, def.Testnet.Network) if err != nil { return errors.Wrap(err, "get addrs") } - omniEVM, ok := network.OmniEVMChain() + omniEVM, ok := def.Testnet.OmniEVMChain() if !ok { return errors.New("no omni evm chain") } - omniBackend, err := def.Backends().Backend(omniEVM.ID) + omniBackend, err := def.Backends().Backend(omniEVM.ChainID) if err != nil { return errors.Wrap(err, "backend", "chain", omniEVM.Name) } - l1, ok := network.EthereumChain() + l1, ok := def.Testnet.EthereumChain() if !ok { return errors.New("no ethereum chain") } - l1Backend, err := def.Backends().Backend(l1.ID) + l1Backend, err := def.Backends().Backend(l1.ChainID) if err != nil { return errors.Wrap(err, "backend", "chain", l1.Name) } @@ -289,9 +284,9 @@ func ensureBridgeSpec( func forOne( ctx context.Context, def app.Definition, - chain netconf.Chain, + chain types.EVMChain, action func(context.Context, app.Definition, Config) error, - check func(context.Context, app.Definition, netconf.Chain) error, + check func(context.Context, app.Definition, types.EVMChain) error, ) error { if err := action(ctx, def, Config{Broadcast: true, Chain: chain.Name}); err != nil { return errors.Wrap(err, "act", "chain", chain.Name) @@ -308,15 +303,14 @@ func forOne( func forAll( ctx context.Context, def app.Definition, - network netconf.Network, action func(context.Context, app.Definition, Config) error, - check func(context.Context, app.Definition, netconf.Chain) error, + check func(context.Context, app.Definition, types.EVMChain) error, ) error { if err := action(ctx, def, Config{Broadcast: true}); err != nil { return errors.Wrap(err, "act") } - for _, chain := range network.EVMChains() { + for _, chain := range def.Testnet.EVMChains() { if err := check(ctx, def, chain); err != nil { return errors.Wrap(err, "check", "chain", chain.Name) } @@ -325,14 +319,19 @@ func forAll( return nil } -func checkPortalSpec(network netconf.Network, expected *PortalSpec) func(context.Context, app.Definition, netconf.Chain) error { - return func(ctx context.Context, def app.Definition, chain netconf.Chain) error { - backend, err := def.Backends().Backend(chain.ID) +func checkPortalSpec(chains []types.EVMChain, expected *PortalSpec) func(context.Context, app.Definition, types.EVMChain) error { + return func(ctx context.Context, def app.Definition, chain types.EVMChain) error { + backend, err := def.Backends().Backend(chain.ChainID) if err != nil { return errors.Wrap(err, "backend", "chain", chain.Name) } - live, err := livePortalSpec(ctx, network, chain, backend) + addrs, err := contracts.GetAddresses(ctx, def.Testnet.Network) + if err != nil { + return errors.Wrap(err, "get addrs") + } + + live, err := livePortalSpec(ctx, chains, chain, addrs.Portal, backend) if err != nil { return errors.Wrap(err, "live portal spec", "chain", chain.Name) } @@ -360,7 +359,7 @@ func checkPortalSpec(network netconf.Network, expected *PortalSpec) func(context } } -func randPortalSpec(network netconf.Network) *PortalSpec { +func randPortalSpec(chains []types.EVMChain) *PortalSpec { pauseAll := randBool() if pauseAll { return &PortalSpec{PauseAll: true} @@ -372,11 +371,11 @@ func randPortalSpec(network netconf.Network) *PortalSpec { } if !spec.PauseXCall { - spec.PauseXCallTo = randChainIDs(network) + spec.PauseXCallTo = randChainIDs(chains) } if !spec.PauseXSubmit { - spec.PauseXSubmitFrom = randChainIDs(network) + spec.PauseXSubmitFrom = randChainIDs(chains) } return spec @@ -398,14 +397,11 @@ func sortUint64(ns []uint64) { sort.Slice(ns, func(i, j int) bool { return ns[i] < ns[j] }) } -func randChain(network netconf.Network) netconf.Chain { - chains := network.EVMChains() +func randChain(chains []types.EVMChain) types.EVMChain { return chains[rand.Intn(len(chains))] } -func randChains(network netconf.Network) []netconf.Chain { - chains := network.EVMChains() - +func randChains(chains []types.EVMChain) []types.EVMChain { n := rand.Intn(len(chains)) if n == 0 { return nil @@ -418,12 +414,12 @@ func randChains(network netconf.Network) []netconf.Chain { return chains[:n] } -func randChainIDs(network netconf.Network) []uint64 { - chains := randChains(network) +func randChainIDs(chains []types.EVMChain) []uint64 { + chains = randChains(chains) chainIDs := make([]uint64, len(chains)) for i, chain := range chains { - chainIDs[i] = chain.ID + chainIDs[i] = chain.ChainID } return chainIDs diff --git a/e2e/app/admin/upgrade.go b/e2e/app/admin/upgrade.go index 503c92724..562d3489a 100644 --- a/e2e/app/admin/upgrade.go +++ b/e2e/app/admin/upgrade.go @@ -80,7 +80,7 @@ func UpgradeBridgeNative(ctx context.Context, def app.Definition, cfg Config) er func UpgradeBridgeL1(ctx context.Context, def app.Definition, cfg Config) error { s := setup(def, cfg) - l1, ok := s.network.EthereumChain() + l1, ok := s.testnet.EthereumChain() if !ok { return errors.New("no l1 eth chain") } @@ -114,7 +114,7 @@ func upgradePortal(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata") } - out, err := s.runForge(ctx, c.rpc, calldata, s.upgrader, s.deployer) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.upgrader, s.deployer) if err != nil { return errors.Wrap(err, "run forge", "out", out) } @@ -128,9 +128,9 @@ func upgradeFeeOracleV1(ctx context.Context, s shared, c chain) error { // FeeOracleV1 contracts were not deployed via Create3 // The address must be read from the portal - client, err := ethclient.Dial(c.Name, c.rpc) + client, err := ethclient.Dial(c.Name, c.RPCEndpoint) if err != nil { - return errors.Wrap(err, "dial rpc") + return errors.Wrap(err, "dial RPCEndpoint") } portal, err := bindings.NewOmniPortal(c.PortalAddress, client) @@ -151,7 +151,7 @@ func upgradeFeeOracleV1(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata") } - out, err := s.runForge(ctx, c.rpc, calldata, s.upgrader, s.deployer) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.upgrader, s.deployer) if err != nil { return errors.Wrap(err, "run forge", "out", out) } @@ -162,7 +162,7 @@ func upgradeFeeOracleV1(ctx context.Context, s shared, c chain) error { } func upgradeGasStation(ctx context.Context, s shared, c chain) error { - addrs, err := contracts.GetAddresses(ctx, s.network.ID) + addrs, err := contracts.GetAddresses(ctx, s.testnet.Network) if err != nil { return errors.Wrap(err, "get addrs") } @@ -175,7 +175,7 @@ func upgradeGasStation(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata") } - out, err := s.runForge(ctx, c.rpc, calldata, s.upgrader, s.deployer) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.upgrader, s.deployer) if err != nil { return errors.Wrap(err, "run forge", "out", out) } @@ -186,7 +186,7 @@ func upgradeGasStation(ctx context.Context, s shared, c chain) error { } func upgradeGasPump(ctx context.Context, s shared, c chain) error { - addrs, err := contracts.GetAddresses(ctx, s.network.ID) + addrs, err := contracts.GetAddresses(ctx, s.testnet.Network) if err != nil { return errors.Wrap(err, "get addrs") } @@ -199,7 +199,7 @@ func upgradeGasPump(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata") } - out, err := s.runForge(ctx, c.rpc, calldata, s.upgrader, s.deployer) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.upgrader, s.deployer) if err != nil { return errors.Wrap(err, "run forge", "out", out) } @@ -218,7 +218,7 @@ func ugpradeSlashing(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata") } - out, err := s.runForge(ctx, c.rpc, calldata, s.upgrader, s.deployer) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.upgrader, s.deployer) if err != nil { return errors.Wrap(err, "run forge", "out", out) } @@ -237,7 +237,7 @@ func upgradeStaking(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata") } - out, err := s.runForge(ctx, c.rpc, calldata, s.upgrader, s.deployer) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.upgrader, s.deployer) if err != nil { return errors.Wrap(err, "run forge", "out", out) } @@ -256,7 +256,7 @@ func upgradeBridgeNative(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata") } - out, err := s.runForge(ctx, c.rpc, calldata, s.upgrader, s.deployer) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.upgrader, s.deployer) if err != nil { return errors.Wrap(err, "run forge", "out", out) } @@ -267,7 +267,7 @@ func upgradeBridgeNative(ctx context.Context, s shared, c chain) error { } func upgradeBridgeL1(ctx context.Context, s shared, c chain) error { - addrs, err := contracts.GetAddresses(ctx, s.network.ID) + addrs, err := contracts.GetAddresses(ctx, s.testnet.Network) if err != nil { return errors.Wrap(err, "get addrs") } @@ -280,7 +280,7 @@ func upgradeBridgeL1(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata") } - out, err := s.runForge(ctx, c.rpc, calldata, s.upgrader, s.deployer) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.upgrader, s.deployer) if err != nil { return errors.Wrap(err, "run forge", "out", out) } @@ -299,7 +299,7 @@ func upgradePortalRegistry(ctx context.Context, s shared, c chain) error { return errors.Wrap(err, "pack calldata") } - out, err := s.runForge(ctx, c.rpc, calldata, s.upgrader, s.deployer) + out, err := s.runForge(ctx, c.RPCEndpoint, calldata, s.upgrader, s.deployer) if err != nil { return errors.Wrap(err, "run forge", "out", out) } diff --git a/e2e/app/definition.go b/e2e/app/definition.go index 3cae67d86..195ba4bfc 100644 --- a/e2e/app/definition.go +++ b/e2e/app/definition.go @@ -90,6 +90,7 @@ func (d Definition) Netman() netman.Manager { } // DeployInfos returns the deploy information of the OmniPortal and OmniAVS contracts. +// Note this panics if not called after netman.DeployPortals. func (d Definition) DeployInfos() types.DeployInfos { resp := make(types.DeployInfos) @@ -513,6 +514,7 @@ func ExternalEndpoints(def Definition) xchain.RPCEndpoints { } // NetworkFromDef returns the network configuration from the definition. +// Note that this panics if not called after netman.DeployPortals. func NetworkFromDef(def Definition) netconf.Network { var chains []netconf.Chain diff --git a/e2e/app/erc20faucet.go b/e2e/app/erc20faucet.go index 06cf0d7a0..60c870ac9 100644 --- a/e2e/app/erc20faucet.go +++ b/e2e/app/erc20faucet.go @@ -44,17 +44,16 @@ func RunERC20Faucet(ctx context.Context, def Definition, cfg RunERC20FaucetConfi return errors.Wrap(err, "get addrs") } - network := NetworkFromDef(def) account := common.HexToAddress(cfg.AddrToFund) amt := new(big.Int).Mul(umath.NewBigInt(cfg.Amount), big.NewInt(params.Ether)) funder := omnitoken.InitialSupplyRecipient(networkID) - chain, ok := network.EthereumChain() + chain, ok := def.Testnet.EthereumChain() if !ok { return errors.New("no ethereum chain") } - backend, err := def.Backends().Backend(chain.ID) + backend, err := def.Backends().Backend(chain.ChainID) if err != nil { return errors.Wrap(err, "backend") } diff --git a/e2e/app/fund.go b/e2e/app/fund.go index fc4c21166..abc2f52d1 100644 --- a/e2e/app/fund.go +++ b/e2e/app/fund.go @@ -62,18 +62,18 @@ func fundAnvilAccounts(ctx context.Context, def Definition) error { // FundAccounts funds the EOAs and contracts that need funding to their target balance. func FundAccounts(ctx context.Context, def Definition, dryRun bool) error { - network := NetworkFromDef(def) - accounts := eoa.AllAccounts(network.ID) + network := def.Testnet.Network + accounts := eoa.AllAccounts(network) - log.Info(ctx, "Checking accounts to fund", "network", network.ID, "count", len(accounts)) + log.Info(ctx, "Checking accounts to fund", "network", network, "count", len(accounts)) - for _, chain := range network.EVMChains() { - backend, err := def.Backends().Backend(chain.ID) + for _, chain := range def.Testnet.EVMChains() { + backend, err := def.Backends().Backend(chain.ChainID) if err != nil { return errors.Wrap(err, "backend") } - funder := eoa.MustAddress(network.ID, eoa.RoleFunder) + funder := eoa.MustAddress(network, eoa.RoleFunder) funderBal, err := backend.BalanceAt(ctx, funder, nil) if err != nil { return err @@ -101,7 +101,7 @@ func FundAccounts(ctx context.Context, def Definition, dryRun bool) error { continue } - thresholds, ok := eoa.GetFundThresholds(network.ID, account.Role) + thresholds, ok := eoa.GetFundThresholds(network, account.Role) if !ok { log.Warn(accCtx, "Skipping account without fund thresholds", nil) continue @@ -122,7 +122,7 @@ func FundAccounts(ctx context.Context, def Definition, dryRun bool) error { } } - toFund, err := contracts.ToFund(ctx, network.ID) + toFund, err := contracts.ToFund(ctx, network) if err != nil { return errors.Wrap(err, "get contracts to fund") } @@ -134,10 +134,10 @@ func FundAccounts(ctx context.Context, def Definition, dryRun bool) error { "address", contract.Address, ) - isOmniEVM := chain.ID == network.ID.Static().OmniExecutionChainID + isOmniEVM := chain.ChainID == def.Testnet.Network.Static().OmniExecutionChainID if contract.OnlyOmniEVM && !isOmniEVM { - log.Info(ctrCtx, "Skipping non-OmniEVM chain", "chain", chain.ID) + log.Info(ctrCtx, "Skipping non-OmniEVM chain", "chain", chain.ChainID) continue } diff --git a/e2e/app/gaspump.go b/e2e/app/gaspump.go index dcdaa7b2e..95caef3f7 100644 --- a/e2e/app/gaspump.go +++ b/e2e/app/gaspump.go @@ -39,19 +39,18 @@ func DeployGasApp(ctx context.Context, def Definition) error { // deployGasPumps deploys OmniGasPump contracts to all chains except Omni's EVM. func deployGasPumps(ctx context.Context, def Definition) error { - network := NetworkFromDef(def) - omniEVM, ok := network.OmniEVMChain() + omniEVM, ok := def.Testnet.OmniEVMChain() if !ok { return errors.New("no omni evm chain") } - for _, chain := range network.EVMChains() { + for _, chain := range def.Testnet.EVMChains() { // GasPump not deployed on OmniEVM - if chain.ID == omniEVM.ID { + if chain.ChainID == omniEVM.ChainID { continue } - backend, err := def.Backends().Backend(chain.ID) + backend, err := def.Backends().Backend(chain.ChainID) if err != nil { return errors.Wrap(err, "backend", "chain", chain.Name) } @@ -69,30 +68,29 @@ func deployGasPumps(ctx context.Context, def Definition) error { // deployGasStation deploys OmniGasStation contract to Omni's EVM. func deployGasStation(ctx context.Context, def Definition) error { - network := NetworkFromDef(def) - omniEVM, ok := network.OmniEVMChain() + omniEVM, ok := def.Testnet.OmniEVMChain() if !ok { return errors.New("no omni evm chain") } - backend, err := def.Backends().Backend(omniEVM.ID) + backend, err := def.Backends().Backend(omniEVM.ChainID) if err != nil { return errors.Wrap(err, "backend") } - addrs, err := contracts.GetAddresses(ctx, network.ID) + addrs, err := contracts.GetAddresses(ctx, def.Testnet.Network) if err != nil { return errors.Wrap(err, "get addrs") } - gasPumps := make([]bindings.OmniGasStationGasPump, 0, len(network.EVMChains())-1) - for _, chain := range network.EVMChains() { - if chain.ID == omniEVM.ID { + gasPumps := make([]bindings.OmniGasStationGasPump, 0, len(def.Testnet.EVMChains())-1) + for _, chain := range def.Testnet.EVMChains() { + if chain.ChainID == omniEVM.ChainID { continue } gasPumps = append(gasPumps, bindings.OmniGasStationGasPump{ - ChainID: chain.ID, + ChainID: chain.ChainID, Addr: addrs.GasPump, }) } @@ -112,20 +110,19 @@ func deployGasStation(ctx context.Context, def Definition) error { // TODO: handle funding / monitoring properly. // consider joining with e2e/app/eoa, or introduce something similar for contracts. func fundGasStation(ctx context.Context, def Definition) error { - network := NetworkFromDef(def) - omniEVM, ok := network.OmniEVMChain() + omniEVM, ok := def.Testnet.OmniEVMChain() if !ok { return errors.New("no omni evm chain") } - backend, err := def.Backends().Backend(omniEVM.ID) + backend, err := def.Backends().Backend(omniEVM.ChainID) if err != nil { return errors.Wrap(err, "backend") } - funder := eoa.MustAddress(network.ID, eoa.RoleFunder) + funder := eoa.MustAddress(def.Testnet.Network, eoa.RoleFunder) - addrs, err := contracts.GetAddresses(ctx, network.ID) + addrs, err := contracts.GetAddresses(ctx, def.Testnet.Network) if err != nil { return errors.Wrap(err, "get addrs") } @@ -182,14 +179,13 @@ var ( // TODO(corver): Move this to actual tests package. func testGasPumps(ctx context.Context, def Definition) error { networkID := def.Testnet.Network - network := NetworkFromDef(def) addrs, err := contracts.GetAddresses(ctx, networkID) if err != nil { return errors.Wrap(err, "get addrs") } - omniEVM, ok := network.OmniEVMChain() + omniEVM, ok := def.Testnet.OmniEVMChain() if !ok { return errors.New("no omni evm chain") } @@ -202,12 +198,12 @@ func testGasPumps(ctx context.Context, def Definition) error { // just need an account with funds on ephemeral network chains payor := anvil.DevAccount7() - for _, chain := range network.EVMChains() { - if chain.ID == omniEVM.ID { + for _, chain := range def.Testnet.EVMChains() { + if chain.ChainID == omniEVM.ChainID { continue } - backend, err := def.Backends().Backend(chain.ID) + backend, err := def.Backends().Backend(chain.ChainID) if err != nil { return errors.Wrap(err, "backend", "chain", chain.Name) } diff --git a/e2e/app/monitor.go b/e2e/app/monitor.go index 6df9086c6..c07d5d418 100644 --- a/e2e/app/monitor.go +++ b/e2e/app/monitor.go @@ -18,7 +18,7 @@ import ( ) func LogMetrics(ctx context.Context, def Definition) error { - extNetwork := NetworkFromDef(def) + extNetwork := NetworkFromDef(def) // Safe to call NetworkFromDef since this after netman.DeployContracts archiveNode, ok := def.Testnet.ArchiveNode() if !ok { return errors.New("monitor must use archive node, no archive node found") @@ -43,7 +43,7 @@ func StartMonitoringReceipts(ctx context.Context, def Definition) func() error { return func() error { return errors.Wrap(err, "getting client") } } - network := NetworkFromDef(def) + network := NetworkFromDef(def) // Safe to call NetworkFromDef since this after netman.DeployContracts cProvider := cprovider.NewABCIProvider(client, def.Testnet.Network, netconf.ChainVersionNamer(def.Testnet.Network)) xProvider := xprovider.New(network, def.Backends().RPCClients(), cProvider) cChainID := def.Testnet.Network.Static().OmniConsensusChainIDUint64() diff --git a/e2e/app/run.go b/e2e/app/run.go index 53ab4f6a7..e63e3051a 100644 --- a/e2e/app/run.go +++ b/e2e/app/run.go @@ -118,7 +118,7 @@ func Deploy(ctx context.Context, def Definition, cfg DeployConfig) (*pingpong.XD return nil, nil //nolint:nilnil // No ping pong, no XDapp to return. } - pp, err := pingpong.Deploy(ctx, NetworkFromDef(def), def.Backends()) + pp, err := pingpong.Deploy(ctx, NetworkFromDef(def), def.Backends()) // Safe to call NetworkFromDef since this after netman.DeployContracts if err != nil { return nil, errors.Wrap(err, "deploy pingpong") } @@ -230,7 +230,7 @@ func E2ETest(ctx context.Context, def Definition, cfg E2ETestConfig) error { return errors.Wrap(err, "stop adding portals") } - network := NetworkFromDef(def) + network := NetworkFromDef(def) // Safe to call NetworkFromDef since this after netman.DeployContracts if err := WaitAllSubmissions(ctx, network, def.Netman().Portals(), sum(msgBatches)); err != nil { return err } @@ -307,11 +307,10 @@ func toPortalValidators(validators map[*e2e.Node]int64) ([]bindings.Validator, e } func logRPCs(ctx context.Context, def Definition) { - network := NetworkFromDef(def) endpoints := ExternalEndpoints(def) - for _, chain := range network.EVMChains() { - rpc, _ := endpoints.ByNameOrID(chain.Name, chain.ID) - log.Info(ctx, "EVM Chain RPC available", "chain_id", chain.ID, + for _, chain := range def.Testnet.EVMChains() { + rpc, _ := endpoints.ByNameOrID(chain.Name, chain.ChainID) + log.Info(ctx, "EVM Chain RPC available", "chain_id", chain.ChainID, "chain_name", chain.Name, "url", rpc) } } diff --git a/e2e/app/tokenbridge.go b/e2e/app/tokenbridge.go index 12ddb60dc..5e4ece494 100644 --- a/e2e/app/tokenbridge.go +++ b/e2e/app/tokenbridge.go @@ -23,15 +23,13 @@ import ( // setupTokenBridge deploys the OmniBridgeL1 & OmniToken contracts (if necessary), and configures the OmniBridgeNative predeploy. func setupTokenBridge(ctx context.Context, def Definition) error { networkID := def.Testnet.Network - network := NetworkFromDef(def) - - l1, ok := network.EthereumChain() + l1, ok := def.Testnet.EthereumChain() if !ok { log.Warn(ctx, "Skipping token bridge setup", errors.New("no ethereum L1 chain")) return nil } - omniEVM, ok := network.OmniEVMChain() + omniEVM, ok := def.Testnet.OmniEVMChain() if !ok { return errors.New("no omni evm chain") } @@ -43,12 +41,12 @@ func setupTokenBridge(ctx context.Context, def Definition) error { return errors.Wrap(err, "get addrs") } - l1Backend, err := def.Backends().Backend(l1.ID) + l1Backend, err := def.Backends().Backend(l1.ChainID) if err != nil { return errors.Wrap(err, "backend") } - omniBackend, err := def.Backends().Backend(omniEVM.ID) + omniBackend, err := def.Backends().Backend(omniEVM.ChainID) if err != nil { return errors.Wrap(err, "omni backend") } @@ -91,7 +89,7 @@ func setupTokenBridge(ctx context.Context, def Definition) error { return errors.Wrap(err, "bind opts") } - tx, err := nativeBridge.Setup(txOpts, l1.ID, addrs.Portal, l1BridgeAddr) + tx, err := nativeBridge.Setup(txOpts, l1.ChainID, addrs.Portal, l1BridgeAddr) if err != nil { return errors.Wrap(err, "setup bridge native") } @@ -146,14 +144,12 @@ var ToL1BridgeTests = []BridgeTest{ // TODO(corver): Move this to actual tests package. func testBridge(ctx context.Context, def Definition) error { networkID := def.Testnet.Network - network := NetworkFromDef(def) - if !networkID.IsEphemeral() { log.Warn(ctx, "Skipping bridge test", errors.New("only ephemeral networks")) return nil } - if _, ok := network.EthereumChain(); !ok { + if _, ok := def.Testnet.EthereumChain(); !ok { log.Warn(ctx, "Skipping bridge test ", errors.New("no ethereum L1 chain")) return nil } @@ -176,9 +172,8 @@ func testBridge(ctx context.Context, def Definition) error { // bridgeToNative bridges tokens from L1 to OmniEVM. func bridgeToNative(ctx context.Context, def Definition, toBridge []BridgeTest) error { networkID := def.Testnet.Network - network := NetworkFromDef(def) - l1, ok := network.EthereumChain() + l1, ok := def.Testnet.EthereumChain() if !ok { return errors.New("no ethereum L1 chain") } @@ -191,7 +186,7 @@ func bridgeToNative(ctx context.Context, def Definition, toBridge []BridgeTest) return errors.Wrap(err, "get addrs") } - txOpts, backend, err := def.Backends().BindOpts(ctx, l1.ID, payor) + txOpts, backend, err := def.Backends().BindOpts(ctx, l1.ChainID, payor) if err != nil { return errors.Wrap(err, "bind opts") } @@ -252,13 +247,12 @@ func waitNativeBridges(ctx context.Context, def Definition, bridges []BridgeTest ctx, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() - network := NetworkFromDef(def) - omniEVM, ok := network.OmniEVMChain() + omniEVM, ok := def.Testnet.OmniEVMChain() if !ok { return errors.New("no omni evm") } - backend, err := def.Backends().Backend(omniEVM.ID) + backend, err := def.Backends().Backend(omniEVM.ChainID) if err != nil { return errors.Wrap(err, "backend") } @@ -294,14 +288,12 @@ func waitNativeBridges(ctx context.Context, def Definition, bridges []BridgeTest // bridgeToL1 bridges tokens from OmniEVM to L1. func bridgeToL1(ctx context.Context, def Definition, toBridge []BridgeTest) error { - network := NetworkFromDef(def) - - omniEVM, ok := network.OmniEVMChain() + omniEVM, ok := def.Testnet.OmniEVMChain() if !ok { return errors.New("no omni evm chain") } - backend, err := def.Backends().Backend(omniEVM.ID) + backend, err := def.Backends().Backend(omniEVM.ChainID) if err != nil { return errors.Wrap(err, "omni backend") } diff --git a/e2e/app/valupdates.go b/e2e/app/valupdates.go index d648b92c6..c02c05829 100644 --- a/e2e/app/valupdates.go +++ b/e2e/app/valupdates.go @@ -35,10 +35,9 @@ func FundValidatorsForTesting(ctx context.Context, def Definition) error { log.Info(ctx, "Funding validators for testing", "count", len(def.Testnet.Nodes)) - network := NetworkFromDef(def) - omniEVM, _ := network.OmniEVMChain() - funder := eoa.MustAddress(network.ID, eoa.RoleTester) // Fund validators using tester eoa - _, fundBackend, err := def.Backends().BindOpts(ctx, omniEVM.ID, funder) + omniEVM, _ := def.Testnet.OmniEVMChain() + funder := eoa.MustAddress(def.Testnet.Network, eoa.RoleTester) // Fund validators using tester eoa + _, fundBackend, err := def.Backends().BindOpts(ctx, omniEVM.ChainID, funder) if err != nil { return errors.Wrap(err, "bind opts") } @@ -125,10 +124,9 @@ func StartValidatorUpdates(ctx context.Context, def Definition) func() error { }) // Create a backend to trigger deposits from - network := NetworkFromDef(def) endpoints := ExternalEndpoints(def) - omniEVM, _ := network.OmniEVMChain() - rpc, err := endpoints.ByNameOrID(omniEVM.Name, omniEVM.ID) + omniEVM, _ := def.Testnet.OmniEVMChain() + rpc, err := endpoints.ByNameOrID(omniEVM.Name, omniEVM.ChainID) if err != nil { returnErr(errors.Wrap(err, "get rpc")) return @@ -138,7 +136,7 @@ func StartValidatorUpdates(ctx context.Context, def Definition) func() error { returnErr(errors.Wrap(err, "dial")) return } - valBackend, err := ethbackend.NewBackend(omniEVM.Name, omniEVM.ID, omniEVM.BlockPeriod, ethCl, privkeys...) + valBackend, err := ethbackend.NewBackend(omniEVM.Name, omniEVM.ChainID, omniEVM.BlockPeriod, ethCl, privkeys...) if err != nil { returnErr(errors.Wrap(err, "new backend")) return diff --git a/e2e/types/testnet.go b/e2e/types/testnet.go index decf40ca0..d0faf50f5 100644 --- a/e2e/types/testnet.go +++ b/e2e/types/testnet.go @@ -129,10 +129,38 @@ func (t Testnet) HasPerturbations() bool { return t.Testnet.HasPerturbations() } +func (t Testnet) EVMChainByID(id uint64) (EVMChain, bool) { + for _, c := range t.EVMChains() { + if c.ChainID == id { + return c, true + } + } + + return EVMChain{}, false +} + +func (t Testnet) EVMChainByName(name string) (EVMChain, bool) { + for _, c := range t.EVMChains() { + if c.Name == name { + return c, true + } + } + + return EVMChain{}, false +} + func (t Testnet) HasOmniEVM() bool { return len(t.OmniEVMs) > 0 } +func (t Testnet) OmniEVMChain() (EVMChain, bool) { + if len(t.OmniEVMs) == 0 { + return EVMChain{}, false + } + + return t.OmniEVMs[0].Chain, true +} + // EVMChains returns all EVM chains in the network. func (t Testnet) EVMChains() []EVMChain { var chains []EVMChain @@ -153,6 +181,16 @@ func (t Testnet) EVMChains() []EVMChain { return chains } +func (t Testnet) EthereumChain() (EVMChain, bool) { + for _, c := range t.EVMChains() { + if netconf.IsEthereumChain(t.Network, c.ChainID) { + return c, true + } + } + + return EVMChain{}, false +} + // EVMChain represents a EVM chain in a omni network. type EVMChain struct { evmchain.Metadata