github.com/smartcontractkit/chainlink-testing-framework/libs@v0.0.0-20240227141906-ec710b4eb1a3/networks/known_networks_test.go (about)

     1  package networks
     2  
     3  import (
     4  	"encoding/base64"
     5  	"fmt"
     6  	"os"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/smartcontractkit/chainlink-testing-framework/libs/blockchain"
    12  	"github.com/smartcontractkit/chainlink-testing-framework/libs/config"
    13  	"github.com/smartcontractkit/chainlink-testing-framework/libs/logging"
    14  )
    15  
    16  func TestMain(m *testing.M) {
    17  	logging.Init()
    18  	os.Exit(m.Run())
    19  }
    20  
    21  func TestMustGetSelectedNetworkConfig_MissingSelectedNetwork(t *testing.T) {
    22  	require.Panics(t, func() {
    23  		MustGetSelectedNetworkConfig(&config.NetworkConfig{})
    24  	})
    25  }
    26  
    27  func TestMustGetSelectedNetworkConfig_Missing_RpcHttpUrls(t *testing.T) {
    28  	networkName := "arbitrum_goerli"
    29  	testTOML := `
    30  	selected_networks = ["arbitrum_goerli"]
    31  	
    32  	[RpcWsUrls]
    33  	arbitrum_goerli = ["wss://devnet-1.mt/ABC/rpc/"]
    34  
    35  	[WalletKeys]
    36  	arbitrum_goerli = ["1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"]
    37  	`
    38  
    39  	l := logging.GetTestLogger(t)
    40  	networkCfg := config.NetworkConfig{}
    41  	err := config.BytesToAnyTomlStruct(l, "test", "", &networkCfg, []byte(testTOML))
    42  
    43  	require.NoError(t, err, "error reading network config")
    44  
    45  	require.PanicsWithError(t, fmt.Sprintf("no rpc http urls found in config for '%s' network", networkName), func() {
    46  		MustGetSelectedNetworkConfig(&networkCfg)
    47  	})
    48  }
    49  
    50  func TestMustGetSelectedNetworkConfig_Missing_RpcWsUrls(t *testing.T) {
    51  	networkName := "arbitrum_goerli"
    52  	testTOML := `
    53  	selected_networks = ["arbitrum_goerli"]
    54  
    55  	[RpcHttpUrls]
    56  	arbitrum_goerli = ["https://devnet-1.mt/ABC/rpc/"]
    57  
    58  	[WalletKeys]
    59  	arbitrum_goerli = ["1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"]
    60  	`
    61  
    62  	l := logging.GetTestLogger(t)
    63  	networkCfg := config.NetworkConfig{}
    64  	err := config.BytesToAnyTomlStruct(l, "test", "", &networkCfg, []byte(testTOML))
    65  	require.NoError(t, err, "error reading network config")
    66  
    67  	require.PanicsWithError(t, fmt.Sprintf("no rpc ws urls found in config for '%s' network", networkName), func() {
    68  		MustGetSelectedNetworkConfig(&networkCfg)
    69  	})
    70  }
    71  
    72  func TestMustGetSelectedNetworkConfig_Missing_WalletKeys(t *testing.T) {
    73  	networkName := "arbitrum_goerli"
    74  	testTOML := `
    75  	selected_networks = ["arbitrum_goerli"]
    76  
    77  	[RpcHttpUrls]
    78  	arbitrum_goerli = ["https://devnet-1.mt/ABC/rpc/"]
    79  
    80  	[RpcWsUrls]
    81  	arbitrum_goerli = ["wss://devnet-1.mt/ABC/rpc/"]
    82  	`
    83  
    84  	l := logging.GetTestLogger(t)
    85  	networkCfg := config.NetworkConfig{}
    86  	err := config.BytesToAnyTomlStruct(l, "test", "", &networkCfg, []byte(testTOML))
    87  	require.NoError(t, err, "error reading network config")
    88  
    89  	require.PanicsWithError(t, fmt.Sprintf("no wallet keys found in config for '%s' network", networkName), func() {
    90  		MustGetSelectedNetworkConfig(&networkCfg)
    91  	})
    92  }
    93  
    94  func TestMustGetSelectedNetworkConfig_DefaultUrlsFromEnv(t *testing.T) {
    95  	networkConfigTOML := `
    96  	[RpcHttpUrls]
    97  	arbitrum_goerli = ["https://devnet-1.mt/ABC/rpc/"]
    98  
    99  	[RpcWsUrls]
   100  	arbitrum_goerli = ["wss://devnet-1.mt/ABC/rpc/"]
   101  	`
   102  	encoded := base64.StdEncoding.EncodeToString([]byte(networkConfigTOML))
   103  	err := os.Setenv("BASE64_NETWORK_CONFIG", encoded)
   104  	require.NoError(t, err, "error setting env var")
   105  
   106  	testTOML := `
   107  	selected_networks = ["arbitrum_goerli"]
   108  
   109  	[WalletKeys]
   110  	arbitrum_goerli = ["1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"]
   111  	`
   112  
   113  	l := logging.GetTestLogger(t)
   114  	networkCfg := config.NetworkConfig{}
   115  	err = config.BytesToAnyTomlStruct(l, "test", "", &networkCfg, []byte(testTOML))
   116  	require.NoError(t, err, "error reading network config")
   117  
   118  	networkCfg.UpperCaseNetworkNames()
   119  
   120  	err = networkCfg.Default()
   121  	require.NoError(t, err, "error reading default network config")
   122  
   123  	err = networkCfg.Validate()
   124  	require.NoError(t, err, "error validating network config")
   125  
   126  	networks := MustGetSelectedNetworkConfig(&networkCfg)
   127  	require.Len(t, networks, 1, "should have 1 network")
   128  	require.Equal(t, "Arbitrum Goerli", networks[0].Name, "first network should be arbitrum")
   129  	require.Equal(t, []string{"wss://devnet-1.mt/ABC/rpc/"}, networks[0].URLs, "should have default ws url for arbitrum")
   130  	require.Equal(t, []string{"https://devnet-1.mt/ABC/rpc/"}, networks[0].HTTPURLs, "should have default http url for arbitrum")
   131  	require.Equal(t, []string{"1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"}, networks[0].PrivateKeys, "should have correct wallet key for arbitrum")
   132  }
   133  
   134  func TestMustGetSelectedNetworkConfig_MultipleNetworks(t *testing.T) {
   135  	testTOML := `
   136  	selected_networks = ["arbitrum_goerli", "optimism_goerli"]
   137  
   138  	[RpcHttpUrls]
   139  	arbitrum_goerli = ["https://devnet-1.mt/ABC/rpc/"]
   140  	optimism_goerli = ["https://devnet-1.mt/ABC/rpc/"]
   141  
   142  	[RpcWsUrls]
   143  	arbitrum_goerli = ["wss://devnet-1.mt/ABC/rpc/"]
   144  	optimism_goerli = ["wss://devnet-1.mt/ABC/rpc/"]
   145  
   146  	[WalletKeys]
   147  	arbitrum_goerli = ["1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"]
   148  	optimism_goerli = ["1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"]
   149  	`
   150  
   151  	l := logging.GetTestLogger(t)
   152  	networkCfg := config.NetworkConfig{}
   153  	err := config.BytesToAnyTomlStruct(l, "test", "", &networkCfg, []byte(testTOML))
   154  	require.NoError(t, err, "error reading network config")
   155  
   156  	networks := MustGetSelectedNetworkConfig(&networkCfg)
   157  	require.Len(t, networks, 2)
   158  	require.Equal(t, "Arbitrum Goerli", networks[0].Name)
   159  	require.Equal(t, "Optimism Goerli", networks[1].Name)
   160  }
   161  
   162  func TestMustGetSelectedNetworkConfig_DefaultUrlsFromSecret_OverrideOne(t *testing.T) {
   163  	networkConfigTOML := `
   164  	[RpcHttpUrls]
   165  	arbitrum_goerli = ["https://devnet-1.mt/ABC/rpc/"]
   166  	optimism_goerli = ["https://devnet-1.mt/ABC/rpc/"]
   167  
   168  	[RpcWsUrls]
   169  	arbitrum_goerli = ["wss://devnet-1.mt/ABC/rpc/"]
   170  	optimism_goerli = ["wss://devnet-1.mt/ABC/rpc/"]
   171  	`
   172  	encoded := base64.StdEncoding.EncodeToString([]byte(networkConfigTOML))
   173  	err := os.Setenv("BASE64_NETWORK_CONFIG", encoded)
   174  	require.NoError(t, err, "error setting env var")
   175  
   176  	testTOML := `
   177  	selected_networks = ["arbitrum_goerli", "optimism_goerli"]
   178  
   179  	[RpcHttpUrls]
   180  	arbitrum_goerli = ["https://devnet-2.mt/ABC/rpc/"]
   181  
   182  	[WalletKeys]
   183  	arbitrum_goerli = ["1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"]
   184  	optimism_goerli = ["1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"]
   185  	`
   186  
   187  	l := logging.GetTestLogger(t)
   188  	networkCfg := config.NetworkConfig{}
   189  	err = config.BytesToAnyTomlStruct(l, "test", "", &networkCfg, []byte(testTOML))
   190  	require.NoError(t, err, "error reading network config")
   191  
   192  	networkCfg.UpperCaseNetworkNames()
   193  	err = networkCfg.Default()
   194  	require.NoError(t, err, "error reading default network config")
   195  
   196  	networks := MustGetSelectedNetworkConfig(&networkCfg)
   197  	require.Len(t, networks, 2, "should have 2 networks")
   198  	require.Equal(t, "Arbitrum Goerli", networks[0].Name, "first network should be arbitrum")
   199  	require.Equal(t, []string{"wss://devnet-1.mt/ABC/rpc/"}, networks[0].URLs, "should have default ws url for arbitrum")
   200  	require.Equal(t, []string{"https://devnet-2.mt/ABC/rpc/"}, networks[0].HTTPURLs, "should have overridden http url for arbitrum")
   201  	require.Equal(t, []string{"1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"}, networks[0].PrivateKeys, "should have correct wallet key for arbitrum")
   202  
   203  	require.Equal(t, "Optimism Goerli", networks[1].Name, "first network should be optimism")
   204  	require.Equal(t, []string{"wss://devnet-1.mt/ABC/rpc/"}, networks[1].URLs, "should have default ws url for optimism")
   205  	require.Equal(t, []string{"https://devnet-1.mt/ABC/rpc/"}, networks[1].HTTPURLs, "should have default http url for optimism")
   206  	require.Equal(t, []string{"1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"}, networks[1].PrivateKeys, "should have correct wallet key for optimism")
   207  }
   208  
   209  func TestNewEVMNetwork(t *testing.T) {
   210  	// Set up a mock mapping and revert it after test
   211  	originalMappedNetworks := MappedNetworks
   212  	MappedNetworks = map[string]blockchain.EVMNetwork{
   213  		"VALID_KEY": {
   214  			HTTPURLs: []string{"default_http"},
   215  			URLs:     []string{"default_ws"},
   216  		},
   217  	}
   218  	defer func() {
   219  		MappedNetworks = originalMappedNetworks
   220  	}()
   221  
   222  	t.Run("valid networkKey", func(t *testing.T) {
   223  		network := MappedNetworks["VALID_KEY"]
   224  		err := NewEVMNetwork(&network, nil, nil, nil)
   225  		require.NoError(t, err)
   226  		require.Equal(t, MappedNetworks["VALID_KEY"].HTTPURLs, network.HTTPURLs)
   227  		require.Equal(t, MappedNetworks["VALID_KEY"].URLs, network.URLs)
   228  	})
   229  
   230  	t.Run("overwriting default values", func(t *testing.T) {
   231  		walletKeys := []string{"1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"}
   232  		httpUrls := []string{"http://newurl.com"}
   233  		wsUrls := []string{"ws://newwsurl.com"}
   234  		network := MappedNetworks["VALID_KEY"]
   235  		err := NewEVMNetwork(&network, walletKeys, httpUrls, wsUrls)
   236  		require.NoError(t, err)
   237  		require.Equal(t, httpUrls, network.HTTPURLs)
   238  		require.Equal(t, wsUrls, network.URLs)
   239  		require.Equal(t, walletKeys, network.PrivateKeys)
   240  	})
   241  }
   242  
   243  func TestVariousNetworkConfig(t *testing.T) {
   244  	newNetwork := blockchain.EVMNetwork{
   245  		Name:                      "new_test_network",
   246  		ChainID:                   100009,
   247  		Simulated:                 true,
   248  		ChainlinkTransactionLimit: 5000,
   249  		MinimumConfirmations:      1,
   250  		GasEstimationBuffer:       10000,
   251  		ClientImplementation:      blockchain.EthereumClientImplementation,
   252  		HTTPURLs: []string{
   253  			"http://localhost:8545",
   254  		},
   255  		URLs: []string{
   256  			"ws://localhost:8546",
   257  		},
   258  		SupportsEIP1559: true,
   259  		DefaultGasLimit: 6000000,
   260  		PrivateKeys: []string{
   261  			"ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80",
   262  		},
   263  	}
   264  	forkedNetwork := newNetwork
   265  	forkedNetwork.HTTPURLs = nil
   266  	forkedNetwork.URLs = nil
   267  	forkedNetwork.PrivateKeys = nil
   268  	t.Cleanup(func() {
   269  		ArbitrumGoerli.URLs = []string{}
   270  		ArbitrumGoerli.HTTPURLs = []string{}
   271  		ArbitrumGoerli.PrivateKeys = []string{}
   272  		OptimismGoerli.URLs = []string{}
   273  		OptimismGoerli.HTTPURLs = []string{}
   274  		OptimismGoerli.PrivateKeys = []string{}
   275  	})
   276  	ArbitrumGoerli.URLs = []string{"wss://devnet-1.mt/ABC/rpc/"}
   277  	ArbitrumGoerli.HTTPURLs = []string{"https://devnet-1.mt/ABC/rpc/"}
   278  	ArbitrumGoerli.PrivateKeys = []string{"1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"}
   279  	OptimismGoerli.URLs = []string{"wss://devnet-1.mt/ABC/rpc/"}
   280  	OptimismGoerli.HTTPURLs = []string{"https://devnet-1.mt/ABC/rpc/"}
   281  	OptimismGoerli.PrivateKeys = []string{"1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"}
   282  
   283  	testcases := []struct {
   284  		name                 string
   285  		networkConfigTOML    string
   286  		overrideTOML         string
   287  		isNetworkConfigError bool
   288  		isEVMNetworkError    bool
   289  		expNetworks          []blockchain.EVMNetwork
   290  	}{
   291  		{
   292  			name: "case insensitive network key to EVMNetworks",
   293  			networkConfigTOML: `
   294  selected_networks = ["NEW_NETWORK"]
   295  
   296  [EVMNetworks.new_Network]
   297  evm_name = "new_test_network"
   298  evm_chain_id = 100009
   299  evm_urls = ["ws://localhost:8546"]
   300  evm_http_urls = ["http://localhost:8545"]
   301  client_implementation = "Ethereum"
   302  evm_keys = ["ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"]
   303  evm_simulated = true
   304  evm_chainlink_transaction_limit = 5000
   305  evm_minimum_confirmations = 1
   306  evm_gas_estimation_buffer = 10000
   307  evm_supports_eip1559 = true
   308  evm_default_gas_limit = 6000000
   309  `,
   310  			expNetworks: []blockchain.EVMNetwork{newNetwork},
   311  		},
   312  		{
   313  			name: "case insensitive network key fo fork config",
   314  			networkConfigTOML: `
   315  selected_networks = ["KROMA_SEPOLIA"]
   316  
   317  [ForkConfigs.kroma_SEPOLIA]
   318  url = "ws://localhost:8546"
   319  block_number = 100
   320  `,
   321  			expNetworks: []blockchain.EVMNetwork{KromaSepolia},
   322  		},
   323  		{
   324  			name: "override with new ForkConfigs and new EVMNetworks",
   325  			networkConfigTOML: `
   326  selected_networks = ["KROMA_SEPOLIA","NEW_NETWORK"]
   327  
   328  [ForkConfigs.KROMA_SEPOLIA]
   329  url = "ws://localhost:8546"
   330  block_number = 100
   331  `,
   332  			overrideTOML: `
   333  [EVMNetworks.new_network]
   334  evm_name = "new_test_network"
   335  evm_chain_id = 100009
   336  evm_simulated = true
   337  client_implementation = "Ethereum"
   338  evm_chainlink_transaction_limit = 5000
   339  evm_minimum_confirmations = 1
   340  evm_gas_estimation_buffer = 10000
   341  evm_supports_eip1559 = true
   342  evm_default_gas_limit = 6000000
   343  
   344  [ForkConfigs.new_network]
   345  url = "ws://localhost:8546"
   346  block_number = 100
   347  `,
   348  			expNetworks: []blockchain.EVMNetwork{KromaSepolia, forkedNetwork},
   349  		},
   350  		{
   351  			name: "forked network for existing network",
   352  			networkConfigTOML: `
   353  selected_networks = ["KROMA_SEPOLIA"]
   354  
   355  [ForkConfigs.KROMA_SEPOLIA]
   356  url = "ws://localhost:8546"
   357  block_number = 100
   358  `,
   359  			expNetworks: []blockchain.EVMNetwork{KromaSepolia},
   360  		},
   361  
   362  		{
   363  			name: "forked network for new network",
   364  			networkConfigTOML: `
   365  selected_networks = ["new_network"]
   366  
   367  [EVMNetworks.new_network]
   368  evm_name = "new_test_network"
   369  evm_chain_id = 100009
   370  evm_simulated = true
   371  client_implementation = "Ethereum"
   372  evm_chainlink_transaction_limit = 5000
   373  evm_minimum_confirmations = 1
   374  evm_gas_estimation_buffer = 10000
   375  evm_supports_eip1559 = true
   376  evm_default_gas_limit = 6000000
   377  
   378  [ForkConfigs.new_network]
   379  url = "ws://localhost:8546"
   380  block_number = 100
   381  `,
   382  			expNetworks: []blockchain.EVMNetwork{forkedNetwork},
   383  		},
   384  		{
   385  			name: "existing network and new network together in one config",
   386  			networkConfigTOML: `
   387  selected_networks = ["new_network","arbitrum_goerli", "optimism_goerli"]
   388  
   389  [EVMNetworks.new_network]
   390  evm_name = "new_test_network"
   391  evm_chain_id = 100009
   392  evm_urls = ["ws://localhost:8546"]
   393  evm_http_urls = ["http://localhost:8545"]
   394  client_implementation = "Ethereum"
   395  evm_keys = ["ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"]
   396  evm_simulated = true
   397  evm_chainlink_transaction_limit = 5000
   398  evm_minimum_confirmations = 1
   399  evm_gas_estimation_buffer = 10000
   400  evm_supports_eip1559 = true
   401  evm_default_gas_limit = 6000000
   402  
   403  [RpcHttpUrls]
   404  arbitrum_goerli = ["https://devnet-1.mt/ABC/rpc/"]
   405  optimism_goerli = ["https://devnet-1.mt/ABC/rpc/"]
   406  
   407  [RpcWsUrls]
   408  arbitrum_goerli = ["wss://devnet-1.mt/ABC/rpc/"]
   409  optimism_goerli = ["wss://devnet-1.mt/ABC/rpc/"]
   410  
   411  [WalletKeys]
   412  arbitrum_goerli = ["1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"]
   413  optimism_goerli = ["1810868fc221b9f50b5b3e0186d8a5f343f892e51ce12a9e818f936ec0b651ed"]
   414  		`,
   415  			expNetworks: []blockchain.EVMNetwork{
   416  				newNetwork, ArbitrumGoerli, OptimismGoerli,
   417  			},
   418  		},
   419  		{
   420  			name: "new network with empty chain id",
   421  			networkConfigTOML: `
   422  selected_networks = ["new_network"]
   423  
   424  [EVMNetworks.new_network]
   425  evm_name = "new_test_network"
   426  evm_urls = ["ws://localhost:8546"]
   427  evm_http_urls = ["http://localhost:8545"]
   428  evm_keys = ["ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"]
   429  evm_simulated = true
   430  evm_chainlink_transaction_limit = 5000
   431  client_implementation = "Ethereum"
   432  evm_minimum_confirmations = 1
   433  evm_gas_estimation_buffer = 10000
   434  evm_supports_eip1559 = true
   435  evm_default_gas_limit = 6000000
   436  		`,
   437  			isNetworkConfigError: true,
   438  		},
   439  		{
   440  			name: "new network with empty client implementation",
   441  			networkConfigTOML: `
   442  selected_networks = ["new_network"]
   443  
   444  [EVMNetworks.new_network]
   445  evm_name = "new_test_network"
   446  evm_chain_id = 100009
   447  evm_urls = ["ws://localhost:8546"]
   448  evm_http_urls = ["http://localhost:8545"]
   449  evm_keys = ["ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"]
   450  evm_simulated = true
   451  evm_chainlink_transaction_limit = 5000
   452  evm_minimum_confirmations = 1
   453  evm_gas_estimation_buffer = 10000
   454  evm_supports_eip1559 = true
   455  evm_default_gas_limit = 6000000
   456  		`,
   457  			isNetworkConfigError: true,
   458  		},
   459  		{
   460  			name: "new network without rpc urls",
   461  			networkConfigTOML: `
   462  selected_networks = ["new_network"]
   463  
   464  [EVMNetworks.new_network]
   465  evm_name = "new_test_network"
   466  evm_chain_id = 100009
   467  evm_keys = ["ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"]
   468  evm_simulated = true
   469  evm_chainlink_transaction_limit = 5000
   470  evm_minimum_confirmations = 1
   471  evm_gas_estimation_buffer = 10000
   472  client_implementation = "Ethereum"
   473  evm_supports_eip1559 = true
   474  evm_default_gas_limit = 6000000
   475  `,
   476  			isNetworkConfigError: true,
   477  		},
   478  		{
   479  			name: "new network with rpc urls and wallet keys both in EVMNetworks and Rpc<Http/Ws>Urls and WalletKeys",
   480  			networkConfigTOML: `
   481  selected_networks = ["new_network"]
   482  
   483  [EVMNetworks.new_network]
   484  evm_name = "new_test_network"
   485  evm_chain_id = 100009
   486  evm_urls = ["ws://localhost:8546"]
   487  evm_http_urls = ["http://localhost:8545"]
   488  evm_keys = ["ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"]
   489  evm_simulated = true
   490  evm_chainlink_transaction_limit = 5000
   491  evm_minimum_confirmations = 1
   492  evm_gas_estimation_buffer = 10000
   493  client_implementation = "Ethereum"
   494  evm_supports_eip1559 = true
   495  evm_default_gas_limit = 6000000
   496  
   497  [RpcHttpUrls]
   498  new_network = ["http://localhost:iamnotvalid"]
   499  [RpcWsUrls]
   500  new_network = ["ws://localhost:iamnotvalid"]
   501  [WalletKeys]
   502  new_network = ["something random"]
   503  `,
   504  			expNetworks: []blockchain.EVMNetwork{newNetwork},
   505  		},
   506  		{
   507  			name: "new network with rpc urls and wallet keys in EVMNetworks",
   508  			networkConfigTOML: `
   509  selected_networks = ["new_network"]
   510  
   511  [EVMNetworks.new_network]
   512  evm_name = "new_test_network"
   513  evm_chain_id = 100009
   514  evm_urls = ["ws://localhost:8546"]
   515  evm_http_urls = ["http://localhost:8545"]
   516  evm_keys = ["ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"]
   517  evm_simulated = true
   518  evm_chainlink_transaction_limit = 5000
   519  evm_minimum_confirmations = 1
   520  evm_gas_estimation_buffer = 10000
   521  client_implementation = "Ethereum"
   522  evm_supports_eip1559 = true
   523  evm_default_gas_limit = 6000000
   524  `,
   525  			expNetworks: []blockchain.EVMNetwork{newNetwork},
   526  		},
   527  		{
   528  			name: "new network with rpc urls in EVMNetworks and wallet keys in WalletKeys NetworkConfig",
   529  			networkConfigTOML: `
   530  selected_networks = ["new_network"]
   531  
   532  [EVMNetworks.new_network]
   533  evm_name = "new_test_network"
   534  evm_chain_id = 100009
   535  evm_urls = ["ws://localhost:8546"]
   536  evm_http_urls = ["http://localhost:8545"]
   537  evm_simulated = true
   538  evm_chainlink_transaction_limit = 5000
   539  evm_minimum_confirmations = 1
   540  evm_gas_estimation_buffer = 10000
   541  client_implementation = "Ethereum"
   542  evm_supports_eip1559 = true
   543  evm_default_gas_limit = 6000000
   544  
   545  [WalletKeys]
   546  new_network = ["ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"]
   547  `,
   548  			expNetworks: []blockchain.EVMNetwork{newNetwork},
   549  		},
   550  		{
   551  			name: "new network with rpc urls and wallet keys in NetworkConfig",
   552  			networkConfigTOML: `
   553  selected_networks = ["new_network"]
   554  
   555  [EVMNetworks.new_network]
   556  evm_name = "new_test_network"
   557  evm_chain_id = 100009
   558  evm_simulated = true
   559  evm_chainlink_transaction_limit = 5000
   560  evm_minimum_confirmations = 1
   561  evm_gas_estimation_buffer = 10000
   562  client_implementation = "Ethereum"
   563  evm_supports_eip1559 = true
   564  evm_default_gas_limit = 6000000
   565  
   566  [RpcHttpUrls]
   567  new_network = ["http://localhost:8545"]
   568  [RpcWsUrls]
   569  new_network = ["ws://localhost:8546"]
   570  [WalletKeys]
   571  new_network = ["ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"]
   572  `,
   573  			expNetworks: []blockchain.EVMNetwork{newNetwork},
   574  		},
   575  	}
   576  	for _, tc := range testcases {
   577  		tc := tc
   578  		t.Run(tc.name, func(t *testing.T) {
   579  			encoded := base64.StdEncoding.EncodeToString([]byte(tc.networkConfigTOML))
   580  			err := os.Setenv("BASE64_NETWORK_CONFIG", encoded)
   581  			require.NoError(t, err, "error setting env var")
   582  
   583  			networkCfg := &config.NetworkConfig{}
   584  			if tc.overrideTOML != "" {
   585  				l := logging.GetTestLogger(t)
   586  				err = config.BytesToAnyTomlStruct(l, "test", "", &networkCfg, []byte(tc.overrideTOML))
   587  				require.NoError(t, err, "error reading network config")
   588  			}
   589  			networkCfg.UpperCaseNetworkNames()
   590  			err = networkCfg.Default()
   591  			require.NoError(t, err, "error setting default network config")
   592  			err = networkCfg.Validate()
   593  			if tc.isNetworkConfigError {
   594  				require.Error(t, err, "expected network config error")
   595  				return
   596  			}
   597  			require.NoError(t, err, "error validating network config")
   598  			actualNets, err := SetNetworks(*networkCfg)
   599  			if tc.isEVMNetworkError {
   600  				t.Log(err)
   601  				require.Error(t, err, "expected evmNetwork set up error")
   602  				return
   603  			}
   604  			require.NoError(t, err, "unexpected error")
   605  			require.Equal(t, tc.expNetworks, actualNets, "unexpected networks")
   606  		})
   607  	}
   608  }