Skip to content

Commit 025f735

Browse files
committed
feat: method to get network by name, tests
1 parent a2cb094 commit 025f735

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

network.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77

88
package etherscan
99

10+
import (
11+
"fmt"
12+
"strings"
13+
)
14+
1015
var (
1116
// EthMainnet Ethereum mainnet for production
1217
EthMainnet Network = Network{"Ethereum", "main", "https://api.etherscan.io/api?"}
@@ -28,8 +33,37 @@ var (
2833
BscMainnet Network = Network{"Binance", "main", "https://api.bscscan.com/api?"}
2934
// BscTestnet Bsc testnet for development
3035
BscTestnet Network = Network{"Binance test", "test", "https://api-testnet.bscscan.com/api?"}
36+
37+
networks = map[string]*Network{
38+
"ethmainnet": &EthMainnet,
39+
"ethereum": &EthMainnet,
40+
"eth": &EthMainnet,
41+
"ethropsten": &EthRopsten,
42+
"ropsten": &EthRopsten,
43+
"ethkovan": &EthKovan,
44+
"ethrinkby": &EthRinkby,
45+
"ethgoerli": &EthGoerli,
46+
"ethtobalaba": &EthTobalaba,
47+
"maticmainnet": &MaticMainnet,
48+
"polygon": &MaticMainnet,
49+
"matic": &MaticMainnet,
50+
"matictestnet": &MaticTestnet,
51+
"mumbai": &MaticTestnet,
52+
"bscmainnet": &BscMainnet,
53+
"binance": &BscMainnet,
54+
"bsctestnet": &BscTestnet,
55+
}
56+
57+
networkNames []string
3158
)
3259

60+
func init() {
61+
for name, _ := range networks {
62+
networkNames = append(networkNames, name)
63+
}
64+
65+
}
66+
3367
// Network is ethereum network type (mainnet, ropsten, etc)
3468
type Network struct {
3569
Name string // Name of the network or chain
@@ -41,3 +75,15 @@ type Network struct {
4175
func (n Network) Domain() (sub string) {
4276
return n.baseURL
4377
}
78+
79+
func ParseNetworkName(network string) (Network, error) {
80+
if x, ok := networks[network]; ok {
81+
return *x, nil
82+
}
83+
// Case insensitive parse, do a separate lookup to prevent unnecessary cost of lowercasing a string if we don't need to.
84+
if x, ok := networks[strings.ToLower(network)]; ok {
85+
return *x, nil
86+
}
87+
return Network{}, fmt.Errorf("%s is not a valid ETHNetworkType, try one of [%s]", network, strings.Join(networkNames, ", "))
88+
89+
}

network_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package etherscan
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func TestParseNetworkName(t *testing.T) {
9+
tests := []struct {
10+
name string
11+
want Network
12+
wantErr bool
13+
}{
14+
{"ethmainnet", EthMainnet, false},
15+
{"eth main net", Network{}, true},
16+
{"ethereum", EthMainnet, false},
17+
{"eth", EthMainnet, false},
18+
{"ethropsten", EthRopsten, false},
19+
{"ropsten", EthRopsten, false},
20+
{"ethkovan", EthKovan, false},
21+
{"ethrinkby", EthRinkby, false},
22+
{"ethgoerli", EthGoerli, false},
23+
{"ethtobalaba", EthTobalaba, false},
24+
{"maticmainnet", MaticMainnet, false},
25+
{"polygon", MaticMainnet, false},
26+
{"matic", MaticMainnet, false},
27+
{"matictestnet", MaticTestnet, false},
28+
{"mumbai", MaticTestnet, false},
29+
{"bscmainnet", BscMainnet, false},
30+
{"binance", BscMainnet, false},
31+
{"bsctestnet", BscTestnet, false},
32+
}
33+
for _, tt := range tests {
34+
t.Run(tt.name, func(t *testing.T) {
35+
got, err := ParseNetworkName(tt.name)
36+
if (err != nil) != tt.wantErr {
37+
t.Errorf("ParseNetworkName() error = %v, wantErr %v", err, tt.wantErr)
38+
return
39+
}
40+
if !reflect.DeepEqual(got, tt.want) {
41+
t.Errorf("ParseNetworkName() got = %v, want %v", got, tt.want)
42+
}
43+
})
44+
}
45+
}

0 commit comments

Comments
 (0)