@@ -3,56 +3,151 @@ const typeforce = require('typeforce')
3
3
4
4
const networks = require ( './networks' )
5
5
6
+ /**
7
+ * @param network
8
+ * @returns {string } the name of the network. Returns undefined if network is not a value
9
+ * of `networks`
10
+ */
11
+ function getNetworkName ( network ) {
12
+ return Object . keys ( networks ) . find ( n => networks [ n ] === network )
13
+ }
14
+
15
+ /**
16
+ * @param network
17
+ * @returns {Object } the mainnet corresponding to a testnet
18
+ */
19
+ function getMainnet ( network ) {
20
+ switch ( network ) {
21
+ case networks . bitcoin :
22
+ case networks . testnet :
23
+ return networks . bitcoin
24
+
25
+ case networks . bitcoincash :
26
+ case networks . bitcoincashTestnet :
27
+ return networks . bitcoincash
28
+
29
+ case networks . bitcoingold :
30
+ // FIXME(https://github.com/BitGo/bitgo-utxo-lib/issues/50): define bitcoingoldTest
31
+ return networks . bitcoingold
32
+
33
+ case networks . bitcoinsv :
34
+ case networks . bitcoinsvTestnet :
35
+ return networks . bitcoinsv
36
+
37
+ case networks . dash :
38
+ case networks . dashTest :
39
+ return networks . dash
40
+
41
+ case networks . litecoin :
42
+ case networks . litecoinTest :
43
+ return networks . litecoin
44
+
45
+ case networks . zcash :
46
+ case networks . zcashTest :
47
+ return networks . zcash
48
+ }
49
+ throw new TypeError ( `invalid network` )
50
+ }
51
+
52
+ /**
53
+ * @param network
54
+ * @returns {boolean } true iff network is a mainnet
55
+ */
56
+ function isMainnet ( network ) {
57
+ return getMainnet ( network ) === network
58
+ }
59
+
60
+ /**
61
+ * @param network
62
+ * @returns {boolean } true iff network is a testnet
63
+ */
64
+ function isTestnet ( network ) {
65
+ return getMainnet ( network ) !== network
66
+ }
67
+
68
+ const networksArray = Object . keys ( networks ) . map ( name => networks [ name ] )
69
+ const mainnets = networksArray . filter ( isMainnet )
70
+ const testnets = networksArray . filter ( isTestnet )
71
+ const mainnetTestnetPairs = new Map (
72
+ mainnets . map ( m => [ m , testnets . filter ( t => getMainnet ( t ) === m ) ] )
73
+ )
74
+
75
+ /**
76
+ * @param network
77
+ * @returns {Object|undefined } - The testnet corresponding to a mainnet.
78
+ * Returns undefined if a network has no testnet.
79
+ */
80
+ function getTestnet ( network ) {
81
+ if ( isTestnet ( network ) ) {
82
+ return network
83
+ }
84
+ const testnets = mainnetTestnetPairs . get ( network )
85
+ if ( testnets === undefined ) {
86
+ throw new Error ( `invalid argument` )
87
+ }
88
+ if ( testnets . length === 0 ) {
89
+ return
90
+ }
91
+ if ( testnets . length === 1 ) {
92
+ return testnets [ 0 ]
93
+ }
94
+ throw new Error ( `more than one testnet for ${ getNetworkName ( network ) } ` )
95
+ }
96
+
97
+ /**
98
+ * @param network
99
+ * @returns {boolean } true iff network bitcoin or testnet
100
+ */
6
101
function isBitcoin ( network ) {
7
- return typeforce . value ( networks . bitcoin . coin ) ( network . coin )
102
+ return getMainnet ( network ) === networks . bitcoin
8
103
}
9
104
10
105
/**
11
106
* @param network
12
107
* @returns {boolean } true iff network is bitcoincash or bitcoincashTestnet
13
108
*/
14
109
function isBitcoinCash ( network ) {
15
- return typeforce . value ( networks . bitcoincash . coin ) ( network . coin )
110
+ return getMainnet ( network ) === networks . bitcoincash
16
111
}
17
112
18
113
/**
19
114
* @param network
20
115
* @returns {boolean } true iff network is bitcoingold
21
116
*/
22
117
function isBitcoinGold ( network ) {
23
- return typeforce . value ( networks . bitcoingold . coin ) ( network . coin )
118
+ return getMainnet ( network ) === networks . bitcoingold
24
119
}
25
120
26
121
/**
27
122
* @param network
28
123
* @returns {boolean } true iff network is bitcoinsv or bitcoinsvTestnet
29
124
*/
30
125
function isBitcoinSV ( network ) {
31
- return typeforce . value ( networks . bitcoinsv . coin ) ( network . coin )
126
+ return getMainnet ( network ) === networks . bitcoinsv
32
127
}
33
128
34
129
/**
35
130
* @param network
36
131
* @returns {boolean } true iff network is dash or dashTest
37
132
*/
38
133
function isDash ( network ) {
39
- return typeforce . value ( networks . dash . coin ) ( network . coin )
134
+ return getMainnet ( network ) === networks . dash
40
135
}
41
136
42
137
/**
43
138
* @param network
44
139
* @returns {boolean } true iff network is litecoin or litecoinTest
45
140
*/
46
141
function isLitecoin ( network ) {
47
- return typeforce . value ( networks . litecoin . coin ) ( network . coin )
142
+ return getMainnet ( network ) === networks . litecoin
48
143
}
49
144
50
145
/**
51
146
* @param network
52
147
* @returns {boolean } true iff network is zcash or zcashTest
53
148
*/
54
149
function isZcash ( network ) {
55
- return typeforce . value ( networks . zcash . coin ) ( network . coin )
150
+ return getMainnet ( network ) === networks . zcash
56
151
}
57
152
58
153
/**
@@ -78,6 +173,8 @@ module.exports = {
78
173
LTC : networks . litecoin . coin ,
79
174
ZEC : networks . zcash . coin ,
80
175
176
+ getNetworkName,
177
+
81
178
getMainnet,
82
179
isMainnet,
83
180
getTestnet,
@@ -96,4 +193,5 @@ module.exports = {
96
193
* @deprecated : use isValidNetwork
97
194
*/
98
195
isValidCoin : isValidNetwork
196
+
99
197
}
0 commit comments