wative 1.2.8 → 1.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/assets.d.ts.map +1 -1
- package/lib/index.esm.js +1 -1
- package/lib/index.umd.js +1 -1
- package/lib/tools.d.ts.map +1 -1
- package/lib/wallet-cli.esm.js +1 -1
- package/lib/wallet-cli.umd.js +1 -1
- package/lib/web3.d.ts +6 -2
- package/lib/web3.d.ts.map +1 -1
- package/package.json +21 -22
- package/src/account.ts +0 -864
- package/src/assets.ts +0 -399
- package/src/chain.ts +0 -28
- package/src/config.ts +0 -2074
- package/src/daemon-watcher.js +0 -181
- package/src/home_page.ts +0 -36
- package/src/index.d.ts +0 -12
- package/src/index.ts +0 -53
- package/src/network.ts +0 -819
- package/src/ssh/client.ts +0 -389
- package/src/ssh/config_manager.ts +0 -304
- package/src/ssh/index.ts +0 -66
- package/src/ssh/service_manager.ts +0 -685
- package/src/ssh/types.ts +0 -50
- package/src/ssh/utils.ts +0 -89
- package/src/ssh/wative_server.ts +0 -534
- package/src/tools.ts +0 -923
- package/src/tx_gas_utils.ts +0 -119
- package/src/utils.ts +0 -916
- package/src/wallet-cli.ts +0 -39
- package/src/wative.ts +0 -633
- package/src/web3.ts +0 -415
package/src/network.ts
DELETED
|
@@ -1,819 +0,0 @@
|
|
|
1
|
-
import * as fs from "fs";
|
|
2
|
-
const chalk = require('chalk')
|
|
3
|
-
import * as path from "path";
|
|
4
|
-
import inquirer from 'inquirer';
|
|
5
|
-
import { BigNumber } from 'bignumber.js';
|
|
6
|
-
import { DEFAULT_NETWORK } from "./config";
|
|
7
|
-
import {
|
|
8
|
-
getChainId,
|
|
9
|
-
getRpcUrl,
|
|
10
|
-
inputSomething,
|
|
11
|
-
selectSomething,
|
|
12
|
-
getMulticallAddress,
|
|
13
|
-
getSymbol,
|
|
14
|
-
getColor,
|
|
15
|
-
Result,
|
|
16
|
-
formatAddr,
|
|
17
|
-
checkFileExistence,
|
|
18
|
-
selectCheckboxSomething
|
|
19
|
-
} from "./utils";
|
|
20
|
-
import {
|
|
21
|
-
getAccountInfo,
|
|
22
|
-
saveAccountInfo
|
|
23
|
-
} from "./account";
|
|
24
|
-
import { deleteTokenBalance, getAccountBalanceInEvm, getAccountBalanceInSolana } from "./web3";
|
|
25
|
-
import { getChainType, getNativeTokenDecimals } from "./chain";
|
|
26
|
-
import { addToken } from "./assets";
|
|
27
|
-
|
|
28
|
-
export const createNetwork = async (keystore_path: string) => {
|
|
29
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
30
|
-
|
|
31
|
-
if (fs.existsSync(network_path)) {
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const networks = {
|
|
36
|
-
networks: DEFAULT_NETWORK,
|
|
37
|
-
currentNetwork: "Ethereum Mainnet",
|
|
38
|
-
accounts: []
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
fs.writeFileSync(network_path, JSON.stringify(networks, null, 2));
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export const selectOrEditNetwork = async (keystore_path: string, selected_network: any) => {
|
|
45
|
-
let options: any[] = [
|
|
46
|
-
'> Edit'
|
|
47
|
-
];
|
|
48
|
-
|
|
49
|
-
if (selected_network.name !== "Ethereum Mainnet" && selected_network.name !== "Solana Mainnet") {
|
|
50
|
-
options.push('> Remove');
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
options.push(new inquirer.Separator('----------------------------------'));
|
|
54
|
-
options.push('> Back');
|
|
55
|
-
|
|
56
|
-
const selected_network_info = await selectSomething(options);
|
|
57
|
-
|
|
58
|
-
switch (selected_network_info) {
|
|
59
|
-
case '> Edit': {
|
|
60
|
-
await updateNetwork(keystore_path, selected_network);
|
|
61
|
-
break;
|
|
62
|
-
}
|
|
63
|
-
case '> Remove': {
|
|
64
|
-
await removeNetwork(keystore_path, selected_network);
|
|
65
|
-
break;
|
|
66
|
-
}
|
|
67
|
-
case '> Back': {
|
|
68
|
-
break;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export const updateNetwork = async (keystore_path: string, default_network: any) => {
|
|
74
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
75
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
76
|
-
|
|
77
|
-
let exist_chain_name_list: string[] = [];
|
|
78
|
-
for (let i = 0; i < networks.networks.length; i++) {
|
|
79
|
-
const network = networks.networks[i];
|
|
80
|
-
exist_chain_name_list.push(network.name);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
let rpc_url: string = default_network.rpcUrl,
|
|
84
|
-
chain_id: string = default_network.chainId.toString(),
|
|
85
|
-
symbol: string = default_network.nativeCurrency.symbol,
|
|
86
|
-
chain_name: string = default_network.name,
|
|
87
|
-
multicall_address: string | null = default_network.multicallAddress,
|
|
88
|
-
color: string | null = default_network.color;
|
|
89
|
-
if (default_network.name === "Ethereum Mainnet" || default_network.name === "Solana Mainnet") {
|
|
90
|
-
rpc_url = await getRpcUrl(default_network.chainId.toString(), `Rpc Url (default: ${default_network.rpcUrl})`, true);
|
|
91
|
-
} else {
|
|
92
|
-
chain_name = await inputSomething(`Chain Name (default: ${default_network.name})`);
|
|
93
|
-
if (chain_name && chain_name !== default_network.name && exist_chain_name_list.includes(chain_name)) {
|
|
94
|
-
console.log(
|
|
95
|
-
chalk.red('Chain Name already exists')
|
|
96
|
-
);
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
chain_id = await getChainId(`Chain Id (default: ${default_network.chainId})`, true);
|
|
101
|
-
rpc_url = await getRpcUrl(chain_id || default_network.chainId, `RPC Url (default: ${default_network.rpcUrl})`, true);
|
|
102
|
-
symbol = await getSymbol(`Symbol (default: ${default_network.nativeCurrency.symbol})`);
|
|
103
|
-
multicall_address = await getMulticallAddress(
|
|
104
|
-
default_network.multicallAddress ?
|
|
105
|
-
`Multicall Address (Optional) (default: ${default_network.multicallAddress})` :
|
|
106
|
-
'Multicall Address (Optional)'
|
|
107
|
-
);
|
|
108
|
-
color = await getColor(
|
|
109
|
-
default_network.color ?
|
|
110
|
-
`Color (Optional): (default: ${default_network.color})` :
|
|
111
|
-
'Color (Optional)'
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
rpc_url = rpc_url || default_network.rpcUrl;
|
|
116
|
-
chain_id = chain_id || default_network.chainId.toString();
|
|
117
|
-
symbol = symbol || default_network.nativeCurrency.symbol;
|
|
118
|
-
chain_name = chain_name || default_network.name;
|
|
119
|
-
multicall_address = multicall_address || default_network.multicallAddress;
|
|
120
|
-
color = color || default_network.color;
|
|
121
|
-
|
|
122
|
-
let decimals = getNativeTokenDecimals(chain_id.toString());
|
|
123
|
-
let network: any = {
|
|
124
|
-
name: chain_name || default_network.name,
|
|
125
|
-
chainId: Number(chain_id) || default_network.chainId,
|
|
126
|
-
rpcUrl: rpc_url || default_network.rpcUrl,
|
|
127
|
-
nativeCurrency: {
|
|
128
|
-
name: symbol || default_network.nativeCurrency.symbol,
|
|
129
|
-
symbol: symbol || default_network.nativeCurrency.symbol,
|
|
130
|
-
decimals: decimals || default_network.nativeCurrency.decimals
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
if (multicall_address || default_network.multicallAddress) {
|
|
134
|
-
network["multicallAddress"] = multicall_address || default_network.multicallAddress;
|
|
135
|
-
}
|
|
136
|
-
if (color || default_network.color) {
|
|
137
|
-
network["color"] = color || default_network.color;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
for (let i = 0; i < networks.networks.length; i++) {
|
|
141
|
-
if (networks.networks[i].name === default_network.name) {
|
|
142
|
-
networks.networks[i] = network;
|
|
143
|
-
break;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
fs.writeFileSync(network_path, JSON.stringify(networks, null, 2));
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
export const removeNetwork = async (keystore_path: string, default_network: any) => {
|
|
151
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
152
|
-
let networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
153
|
-
|
|
154
|
-
for (let i = 0; i < networks.networks.length; i++) {
|
|
155
|
-
if (networks.networks[i].name === default_network.name) {
|
|
156
|
-
networks.networks.splice(i, 1);
|
|
157
|
-
break;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
if (default_network.name === networks.currentNetwork) {
|
|
162
|
-
networks.currentNetwork = "Ethereum Mainnet";
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
fs.writeFileSync(network_path, JSON.stringify(networks, null, 2));
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
export const addNetwork = async (keystore_path: string) => {
|
|
169
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
170
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
171
|
-
|
|
172
|
-
let exist_chain_name_list: string[] = [];
|
|
173
|
-
for (let i = 0; i < networks.networks.length; i++) {
|
|
174
|
-
const network = networks.networks[i];
|
|
175
|
-
exist_chain_name_list.push(network.name);
|
|
176
|
-
}
|
|
177
|
-
console.log(
|
|
178
|
-
chalk.green('Please input someting about network')
|
|
179
|
-
);
|
|
180
|
-
const chain_name = await inputSomething('Chain Name');
|
|
181
|
-
if (exist_chain_name_list.includes(chain_name)) {
|
|
182
|
-
console.log(
|
|
183
|
-
chalk.red('Chain Name already exists')
|
|
184
|
-
);
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const chain_id = await getChainId('Chain Id');
|
|
189
|
-
if (!chain_id) {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const rpc_url = await getRpcUrl(chain_id, 'RPC Url');
|
|
194
|
-
if (!rpc_url) {
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
const symbol = await getSymbol('Symbol');
|
|
199
|
-
if (!symbol) {
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
const multicall_address = await getMulticallAddress('Multicall Address (Optional)');
|
|
203
|
-
const color = await getColor('Color (Optional)');
|
|
204
|
-
|
|
205
|
-
let decimals = getNativeTokenDecimals(chain_id.toString());
|
|
206
|
-
let network: any = {
|
|
207
|
-
name: chain_name,
|
|
208
|
-
chainId: Number(chain_id),
|
|
209
|
-
rpcUrl: rpc_url,
|
|
210
|
-
nativeCurrency: {
|
|
211
|
-
name: symbol,
|
|
212
|
-
symbol: symbol,
|
|
213
|
-
decimals: decimals
|
|
214
|
-
}
|
|
215
|
-
};
|
|
216
|
-
if (multicall_address) {
|
|
217
|
-
network["multicallAddress"] = multicall_address;
|
|
218
|
-
}
|
|
219
|
-
if (color) {
|
|
220
|
-
network["color"] = color;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
networks.networks.push(network);
|
|
224
|
-
fs.writeFileSync(network_path, JSON.stringify(networks, null, 2));
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
export const showAvailableNetworks = async (keystore_path: string) => {
|
|
228
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
229
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
230
|
-
|
|
231
|
-
let evm_ids: number[] = [], solana_ids: number[] = [];
|
|
232
|
-
|
|
233
|
-
for (let i = 0; i < networks.networks.length; i++) {
|
|
234
|
-
const network = networks.networks[i];
|
|
235
|
-
|
|
236
|
-
if (getChainType(network.chainId.toString()) === "solana") {
|
|
237
|
-
solana_ids.push(i);
|
|
238
|
-
} else {
|
|
239
|
-
evm_ids.push(i);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
let options: any = [
|
|
244
|
-
'> Back',
|
|
245
|
-
'+ Add Network',
|
|
246
|
-
new inquirer.Separator(`----Networks(evm)----`)
|
|
247
|
-
];
|
|
248
|
-
|
|
249
|
-
for (let i = 0; i < evm_ids.length; i++) {
|
|
250
|
-
const evm_id = evm_ids[i];
|
|
251
|
-
let network: any = networks.networks[evm_id];
|
|
252
|
-
|
|
253
|
-
let select_key = `${i + 1}.${network.name}`;
|
|
254
|
-
if (i === 0) {
|
|
255
|
-
select_key += ' 🔒';
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
options.push(select_key);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
options.push(new inquirer.Separator(`----Networks(solana)----`));
|
|
262
|
-
|
|
263
|
-
for (let i = 0; i < solana_ids.length; i++) {
|
|
264
|
-
const solana_id = solana_ids[i];
|
|
265
|
-
let network: any = networks.networks[solana_id];
|
|
266
|
-
|
|
267
|
-
let select_key = `${i + 1}.${network.name}`;
|
|
268
|
-
if (i === 0) {
|
|
269
|
-
select_key += ' 🔒';
|
|
270
|
-
}
|
|
271
|
-
options.push(select_key);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
const selected_option = await selectSomething(options);
|
|
275
|
-
if (selected_option === '> Back') {
|
|
276
|
-
return;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
if (selected_option === '+ Add Network') {
|
|
280
|
-
await addNetwork(keystore_path);
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
let option_id = options.indexOf(selected_option);
|
|
286
|
-
let select_network: any;
|
|
287
|
-
if (option_id < evm_ids.length + 3) {
|
|
288
|
-
select_network = networks.networks[evm_ids[option_id - 3]];
|
|
289
|
-
} else {
|
|
290
|
-
select_network = networks.networks[solana_ids[option_id - evm_ids.length - 4]];
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
await selectOrEditNetwork(keystore_path, select_network);
|
|
294
|
-
await showAvailableNetworks(keystore_path);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
export const showDataview = async (keystore_path: string) => {
|
|
298
|
-
let options: any = [
|
|
299
|
-
'> Enhanced Balance Display',
|
|
300
|
-
new inquirer.Separator('----------------------------------'),
|
|
301
|
-
'> Back',
|
|
302
|
-
];
|
|
303
|
-
|
|
304
|
-
const selected_option = await selectSomething(options);
|
|
305
|
-
switch (selected_option) {
|
|
306
|
-
case '> Enhanced Balance Display': {
|
|
307
|
-
await enhancedBalanceDisplay(keystore_path);
|
|
308
|
-
break;
|
|
309
|
-
}
|
|
310
|
-
case '> Back': {
|
|
311
|
-
return;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
await showDataview(keystore_path);
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
export const updateStatus = async (keystore_path: string) => {
|
|
319
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
320
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
321
|
-
|
|
322
|
-
if (!("status" in networks)) {
|
|
323
|
-
networks.status = {
|
|
324
|
-
fullAddr: false,
|
|
325
|
-
gasToken: false,
|
|
326
|
-
extendedToken: false
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
let options = [
|
|
331
|
-
`> Show Full Address [${networks.status.fullAddr ? "ON" : "OFF"}]`,
|
|
332
|
-
`> Show Gas Token [${networks.status.gasToken ? "ON" : "OFF"}]`,
|
|
333
|
-
`> Show Extended Token[${networks.status.extendedToken ? "ON" : "OFF"}]`,
|
|
334
|
-
new inquirer.Separator('----------------------------------'),
|
|
335
|
-
'> Back',
|
|
336
|
-
];
|
|
337
|
-
|
|
338
|
-
const selected_option = await selectSomething(options);
|
|
339
|
-
|
|
340
|
-
if (selected_option === '> Back') {
|
|
341
|
-
return;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
if (selected_option.includes('Full Address')) {
|
|
345
|
-
networks.status.fullAddr = await selectFlag();
|
|
346
|
-
} else if (selected_option.includes('Gas Token')) {
|
|
347
|
-
networks.status.gasToken = await selectFlag();
|
|
348
|
-
} else if (selected_option.includes('Extended Token')) {
|
|
349
|
-
networks.status.extendedToken = await selectFlag();
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
fs.writeFileSync(network_path, JSON.stringify(networks, null, 2));
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
export const selectFlag = async () => {
|
|
356
|
-
let options = [
|
|
357
|
-
'> On',
|
|
358
|
-
'> Off'
|
|
359
|
-
];
|
|
360
|
-
|
|
361
|
-
const selected_option = await selectSomething(options);
|
|
362
|
-
switch (selected_option) {
|
|
363
|
-
case '> On': {
|
|
364
|
-
return true;
|
|
365
|
-
}
|
|
366
|
-
case '> Off': {
|
|
367
|
-
return false;
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
export const getShowTokenList = (keystore_path: string, chain_name: string) => {
|
|
373
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
374
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
375
|
-
|
|
376
|
-
let showTokensMap = networks.showTokens;
|
|
377
|
-
if (chain_name in showTokensMap) {
|
|
378
|
-
return showTokensMap[chain_name];
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
return [];
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
export const showTokenList = async (keystore_path: string) => {
|
|
385
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
386
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
387
|
-
|
|
388
|
-
let network_settings_map: any = {};
|
|
389
|
-
for (let network_info of networks.networks) {
|
|
390
|
-
network_settings_map[network_info.chainId.toString()] = network_info.name;
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
const assets_path = path.resolve(keystore_path, 'assets.json');
|
|
394
|
-
if (!checkFileExistence(assets_path)) {
|
|
395
|
-
console.log(
|
|
396
|
-
chalk.red("No asset here yet")
|
|
397
|
-
);
|
|
398
|
-
return;
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
const assets = JSON.parse(fs.readFileSync(assets_path, 'utf8'));
|
|
402
|
-
|
|
403
|
-
let options: any = [];
|
|
404
|
-
let default_options: any = [];
|
|
405
|
-
let option_info_map: any = {};
|
|
406
|
-
for (let chain_id in assets) {
|
|
407
|
-
option_info_map[options.length] = {
|
|
408
|
-
name: network_settings_map[chain_id],
|
|
409
|
-
address: null
|
|
410
|
-
};
|
|
411
|
-
options.push(new inquirer.Separator(`----- Networks (${network_settings_map[chain_id]}) -------`));
|
|
412
|
-
let show_token_list: any = getShowTokenList(keystore_path, network_settings_map[chain_id]);
|
|
413
|
-
let token_list_len = assets[chain_id].length;
|
|
414
|
-
for (let i = 0; i < token_list_len; i++) {
|
|
415
|
-
let token_info = assets[chain_id][i];
|
|
416
|
-
if (show_token_list.includes(token_info.address)) {
|
|
417
|
-
default_options.push(`${i + 1}.${token_info.symbol.padEnd(6)} CA: ${chalk.green(`${formatAddr(token_info.address).padEnd(45)}`)
|
|
418
|
-
} Decimals: ${token_info.display_decimals ? token_info.display_decimals : "4"}`);
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
option_info_map[options.length] = {
|
|
422
|
-
name: network_settings_map[chain_id],
|
|
423
|
-
address: token_info.address
|
|
424
|
-
};
|
|
425
|
-
options.push(`${i + 1}.${token_info.symbol.padEnd(6)} CA: ${chalk.green(`${formatAddr(token_info.address).padEnd(45)}`)
|
|
426
|
-
} Decimals: ${token_info.display_decimals ? token_info.display_decimals : "4"}`);
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
let selected_option = await selectCheckboxSomething(options, "Choose Tokens", default_options);
|
|
431
|
-
let show_token_list_map: any = {};
|
|
432
|
-
for (let i = 0; i < selected_option.length; i++) {
|
|
433
|
-
let _option = selected_option[i];
|
|
434
|
-
let option_index = options.indexOf(_option);
|
|
435
|
-
let option_info = option_info_map[option_index];
|
|
436
|
-
if (option_info.name in show_token_list_map) {
|
|
437
|
-
show_token_list_map[option_info.name].push(option_info.address);
|
|
438
|
-
} else {
|
|
439
|
-
show_token_list_map[option_info.name] = [option_info.address];
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
networks.showTokens = show_token_list_map;
|
|
444
|
-
fs.writeFileSync(network_path, JSON.stringify(networks, null, 2));
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
export const enhancedBalanceDisplay = async (keystore_path: string) => {
|
|
448
|
-
const options = [
|
|
449
|
-
'> Status',
|
|
450
|
-
'> Token List',
|
|
451
|
-
'> Add Token',
|
|
452
|
-
new inquirer.Separator('----------------------------------'),
|
|
453
|
-
'> Back',
|
|
454
|
-
];
|
|
455
|
-
|
|
456
|
-
const selected_option = await selectSomething(options);
|
|
457
|
-
|
|
458
|
-
switch (selected_option) {
|
|
459
|
-
case '> Status': {
|
|
460
|
-
await updateStatus(keystore_path);
|
|
461
|
-
break;
|
|
462
|
-
}
|
|
463
|
-
case '> Token List': {
|
|
464
|
-
await showTokenList(keystore_path);
|
|
465
|
-
break;
|
|
466
|
-
}
|
|
467
|
-
case '> Add Token': {
|
|
468
|
-
await addToken(keystore_path);
|
|
469
|
-
break;
|
|
470
|
-
}
|
|
471
|
-
case '> Back': {
|
|
472
|
-
return;
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
await enhancedBalanceDisplay(keystore_path);
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
export const showNetwork = async (keystore_path: string) => {
|
|
480
|
-
let network_info_list = [
|
|
481
|
-
'> Networks',
|
|
482
|
-
'> Dataview',
|
|
483
|
-
new inquirer.Separator('----------------------------------'),
|
|
484
|
-
'> Back'
|
|
485
|
-
];
|
|
486
|
-
|
|
487
|
-
const selected_network_info = await selectSomething(network_info_list);
|
|
488
|
-
|
|
489
|
-
switch (selected_network_info) {
|
|
490
|
-
case '> Networks': {
|
|
491
|
-
await showAvailableNetworks(keystore_path);
|
|
492
|
-
break;
|
|
493
|
-
}
|
|
494
|
-
case '> Dataview': {
|
|
495
|
-
await showDataview(keystore_path);
|
|
496
|
-
break;
|
|
497
|
-
}
|
|
498
|
-
case '> Back': {
|
|
499
|
-
return;
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
await showNetwork(keystore_path);
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
export const selectDefaultNetwork = async (keystore_path: string) => {
|
|
507
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
508
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
509
|
-
const network_name_list = networks.networks.map((network: { name: string; }) => {
|
|
510
|
-
return `> ${network.name}`
|
|
511
|
-
});
|
|
512
|
-
const selected_network_name = await selectSomething(network_name_list, 'Please select a default network');
|
|
513
|
-
return selected_network_name.slice(2,);
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
export const getNetworkTypeByName = (keystore_path: string, network_name: string) => {
|
|
517
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
518
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
519
|
-
|
|
520
|
-
for (let i = 0; i < networks.networks.length; i++) {
|
|
521
|
-
const network = networks.networks[i];
|
|
522
|
-
if (network.name === network_name) {
|
|
523
|
-
return getChainType(network.chainId.toString());
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
return "unknown";
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
export const getNetworkInfoByName = (keystore_path: string, network_name: string) => {
|
|
531
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
532
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
533
|
-
|
|
534
|
-
for (let i = 0; i < networks.networks.length; i++) {
|
|
535
|
-
const network = networks.networks[i];
|
|
536
|
-
if (network.name === network_name) {
|
|
537
|
-
return network;
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
return null;
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
export const getAccountAddress = (keystore_path: string, keystore_slug: string, account_id: number) => {
|
|
545
|
-
const account_info = getAccountInfo(keystore_path, keystore_slug);
|
|
546
|
-
|
|
547
|
-
if (account_info.account_type === "PK") {
|
|
548
|
-
return account_info.data[account_id].ciphertexts.address;
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
let default_network = account_info.default_network;
|
|
552
|
-
let network_type = getNetworkTypeByName(keystore_path, default_network);
|
|
553
|
-
|
|
554
|
-
if (network_type === "solana") {
|
|
555
|
-
return account_info.data[account_id].ciphertexts.solana.address;
|
|
556
|
-
} else if (network_type === "evm") {
|
|
557
|
-
return account_info.data[account_id].ciphertexts.evm.address;
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
return null;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
export const getPKAccountAddress = (keystore_path: string, keystore_slug: string) => {
|
|
564
|
-
const account_info = getAccountInfo(keystore_path, keystore_slug);
|
|
565
|
-
return account_info.ciphertexts.address;
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
export const switchPPNetwork = async (keystore_path: string, keystore_slug: string, account_id: number) => {
|
|
569
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
570
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
571
|
-
const network_list = networks.networks;
|
|
572
|
-
const network_len = network_list.length;
|
|
573
|
-
|
|
574
|
-
let account_info = getAccountInfo(keystore_path, keystore_slug);
|
|
575
|
-
let options_switch_network = [
|
|
576
|
-
'> Back',
|
|
577
|
-
new inquirer.Separator('----------------------------------')
|
|
578
|
-
];
|
|
579
|
-
|
|
580
|
-
let default_network = account_info.data[account_id].default_network;
|
|
581
|
-
if (!default_network || default_network === "") {
|
|
582
|
-
options_switch_network.push("● Same as the account setting");
|
|
583
|
-
} else {
|
|
584
|
-
options_switch_network.push(`○ Same as the account setting`);
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
for (let i = 0; i < network_len; i++) {
|
|
588
|
-
const network = network_list[i];
|
|
589
|
-
let account_address: string;
|
|
590
|
-
if (getChainType(network.chainId.toString())) {
|
|
591
|
-
account_address = account_info.data[account_id].ciphertexts.solana.address;
|
|
592
|
-
} else {
|
|
593
|
-
account_address = account_info.data[account_id].ciphertexts.evm.address;
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
if (network.name === default_network) {
|
|
597
|
-
options_switch_network.push(`● ${account_address} [${network.name}]`);
|
|
598
|
-
} else {
|
|
599
|
-
options_switch_network.push(`○ ${account_address} [${network.name}]`);
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
const selected_network = await selectSomething(options_switch_network);
|
|
604
|
-
|
|
605
|
-
if (selected_network === '> Back') {
|
|
606
|
-
return;
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
let selected_network_id = options_switch_network.indexOf(selected_network);
|
|
610
|
-
if (selected_network_id === 2) {
|
|
611
|
-
delete account_info.data[account_id].default_network;
|
|
612
|
-
} else {
|
|
613
|
-
account_info.data[account_id].default_network = network_list[selected_network_id - 3].name;
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
saveAccountInfo(keystore_path, keystore_slug, account_info);
|
|
617
|
-
|
|
618
|
-
let new_default_network = account_info.default_network;
|
|
619
|
-
if ("default_network" in account_info.data[account_id] && account_info.data[account_id].default_network !== "") {
|
|
620
|
-
new_default_network = account_info.data[account_id].default_network;
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
let new_network = getNetworkInfoByName(keystore_path, new_default_network);
|
|
624
|
-
console.log(
|
|
625
|
-
chalk.green(` Address No: #${account_id}\n Network: ${new_default_network}\n ${new_network.nativeCurrency.symbol} Balance: 0`)
|
|
626
|
-
);
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
export const showAllAccounts = async (keystore_path: string, keystore_slug: string, account_index: number) => {
|
|
630
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
631
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
632
|
-
const network_list = networks.networks;
|
|
633
|
-
const network_len = network_list.length;
|
|
634
|
-
|
|
635
|
-
let account_info = getAccountInfo(keystore_path, keystore_slug);
|
|
636
|
-
let default_network = account_info.default_network;
|
|
637
|
-
|
|
638
|
-
const network_type = getNetworkTypeByName(keystore_path, default_network);
|
|
639
|
-
|
|
640
|
-
for (let i = 0; i < network_len; i++) {
|
|
641
|
-
|
|
642
|
-
const network = network_list[i];
|
|
643
|
-
const this_network_type = getNetworkTypeByName(keystore_path, network.name);
|
|
644
|
-
if (account_info.account_type === "PK" && network_type !== this_network_type) {
|
|
645
|
-
continue;
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
let account_address: string;
|
|
649
|
-
if (account_info.account_type === "PK") {
|
|
650
|
-
account_address = account_info.data[account_index].ciphertexts.address;
|
|
651
|
-
} else {
|
|
652
|
-
if (this_network_type === "evm") {
|
|
653
|
-
account_address = account_info.data[account_index].ciphertexts.evm.address;
|
|
654
|
-
} else {
|
|
655
|
-
account_address = account_info.data[account_index].ciphertexts.solana.address;
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
if (network.name === default_network) {
|
|
660
|
-
console.log(`● ${account_address} [${network.name}]`);
|
|
661
|
-
} else {
|
|
662
|
-
console.log(`○ ${account_address} [${network.name}]`);
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
export const switchNetworkByAccountName = async (keystore_path: string, keystore_slug: string, is_keystore_slug: boolean) => {
|
|
668
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
669
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
670
|
-
const network_list = networks.networks;
|
|
671
|
-
const network_len = network_list.length;
|
|
672
|
-
|
|
673
|
-
let account_info = getAccountInfo(keystore_path, keystore_slug);
|
|
674
|
-
let options_switch_network = [
|
|
675
|
-
'> Back',
|
|
676
|
-
new inquirer.Separator('----------------------------------'),
|
|
677
|
-
];
|
|
678
|
-
|
|
679
|
-
let default_network = account_info.default_network;
|
|
680
|
-
|
|
681
|
-
let account_address = "";
|
|
682
|
-
if (!is_keystore_slug) {
|
|
683
|
-
account_address = account_info.ciphertexts.address;
|
|
684
|
-
}
|
|
685
|
-
let option_network_name_list: string[] = [];
|
|
686
|
-
const network_type = getNetworkTypeByName(keystore_path, default_network);
|
|
687
|
-
|
|
688
|
-
for (let i = 0; i < network_len; i++) {
|
|
689
|
-
const network = network_list[i];
|
|
690
|
-
|
|
691
|
-
const this_network_type = getNetworkTypeByName(keystore_path, network.name);
|
|
692
|
-
if (account_info.account_type === "PK" && network_type !== this_network_type) {
|
|
693
|
-
continue;
|
|
694
|
-
}
|
|
695
|
-
if (network.name === default_network) {
|
|
696
|
-
if (is_keystore_slug) {
|
|
697
|
-
options_switch_network.push(`● ${network.name}`);
|
|
698
|
-
} else {
|
|
699
|
-
options_switch_network.push(`● ${account_address} [${network.name}]`);
|
|
700
|
-
}
|
|
701
|
-
} else {
|
|
702
|
-
if (is_keystore_slug) {
|
|
703
|
-
options_switch_network.push(`○ ${network.name}`);
|
|
704
|
-
} else {
|
|
705
|
-
options_switch_network.push(`○ ${account_address} [${network.name}]`);
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
option_network_name_list.push(network.name);
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
const selected_network = await selectSomething(options_switch_network);
|
|
712
|
-
if (selected_network === '> Back') {
|
|
713
|
-
return;
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
let selected_network_id = options_switch_network.indexOf(selected_network);
|
|
717
|
-
account_info.default_network = option_network_name_list[selected_network_id - 2];
|
|
718
|
-
saveAccountInfo(keystore_path, keystore_slug, account_info);
|
|
719
|
-
|
|
720
|
-
if (!is_keystore_slug) {
|
|
721
|
-
let new_default_network = account_info.default_network;
|
|
722
|
-
let new_network = getNetworkInfoByName(keystore_path, new_default_network);
|
|
723
|
-
console.log(
|
|
724
|
-
chalk.green(` Address No: #0\n Network: ${new_default_network}\n ${new_network.nativeCurrency.symbol} Balance: 0`)
|
|
725
|
-
);
|
|
726
|
-
}
|
|
727
|
-
}
|
|
728
|
-
|
|
729
|
-
export const accountBalanceLog = async (keystore_slug: string, account_id: number, keystore_path: string, default_network: string) => {
|
|
730
|
-
const account_info = getAccountInfo(keystore_path, keystore_slug);
|
|
731
|
-
|
|
732
|
-
let account_address: string;
|
|
733
|
-
if (account_info.account_type === "PK") {
|
|
734
|
-
account_address = getAccountAddress(keystore_path, keystore_slug, account_id);
|
|
735
|
-
} else {
|
|
736
|
-
account_address = getPKAccountAddress(keystore_path, keystore_slug);
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
const balance_result = await getAccountBalance(account_address, keystore_path, default_network);
|
|
740
|
-
if (balance_result.status) {
|
|
741
|
-
console.log(
|
|
742
|
-
chalk.green(` Address No: #${account_id}\n Network: ${default_network}\n ${balance_result.output}`)
|
|
743
|
-
);
|
|
744
|
-
} else {
|
|
745
|
-
console.log(
|
|
746
|
-
chalk.green(` Address No: #${account_id}\n Network: ${default_network}\n ${balance_result.output}`)
|
|
747
|
-
);
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
export const getAccountBalance = async (account: string, keystore_path: string, default_network: string) => {
|
|
752
|
-
const network_info = getNetworkInfoByName(keystore_path, default_network);
|
|
753
|
-
|
|
754
|
-
const rpc_url = network_info.rpcUrl;
|
|
755
|
-
const decimals = network_info.nativeCurrency.decimals;
|
|
756
|
-
|
|
757
|
-
let result: Result;
|
|
758
|
-
if (getChainType(network_info.chainId.toString()) === "solana") {
|
|
759
|
-
result = await getAccountBalanceInSolana(account, rpc_url);
|
|
760
|
-
} else {
|
|
761
|
-
result = await getAccountBalanceInEvm(account, rpc_url);
|
|
762
|
-
}
|
|
763
|
-
|
|
764
|
-
if (result.status) {
|
|
765
|
-
let balance = new BigNumber(result.output.toString());
|
|
766
|
-
result.output = balance.dividedBy(Math.pow(10, decimals)).toFixed(4, BigNumber.ROUND_FLOOR);
|
|
767
|
-
}
|
|
768
|
-
|
|
769
|
-
deleteTokenBalance(
|
|
770
|
-
network_info.chainId.toString(),
|
|
771
|
-
[
|
|
772
|
-
account
|
|
773
|
-
],
|
|
774
|
-
[
|
|
775
|
-
"0"
|
|
776
|
-
]
|
|
777
|
-
);
|
|
778
|
-
return result;
|
|
779
|
-
}
|
|
780
|
-
|
|
781
|
-
export const getDefaultNetworkByAddress = (keystore_path: string, keystore_slug: string, account_address: string) => {
|
|
782
|
-
const account_info = getAccountInfo(keystore_path, keystore_slug);
|
|
783
|
-
if (account_info.account_type === "PK") {
|
|
784
|
-
return account_info.default_network;
|
|
785
|
-
}
|
|
786
|
-
for (let i = 0; i < account_info.data.length; i++) {
|
|
787
|
-
if (
|
|
788
|
-
account_info.data[i].ciphertexts.solana.address === account_address ||
|
|
789
|
-
account_info.data[i].ciphertexts.evm.address === account_address
|
|
790
|
-
) {
|
|
791
|
-
if ("default_network" in account_info.data[i]) {
|
|
792
|
-
return account_info.data[i].default_network;
|
|
793
|
-
} else {
|
|
794
|
-
return account_info.default_network;
|
|
795
|
-
}
|
|
796
|
-
}
|
|
797
|
-
}
|
|
798
|
-
return null;
|
|
799
|
-
}
|
|
800
|
-
|
|
801
|
-
export const getEvmNetworks = (keystore_path: string) => {
|
|
802
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
803
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
804
|
-
const network_list = networks.networks;
|
|
805
|
-
const network_len = network_list.length;
|
|
806
|
-
let result: any = [];
|
|
807
|
-
for (let i = 0; i < network_len; i++) {
|
|
808
|
-
if (getChainType(network_list[i].chainId.toString()) === "evm") {
|
|
809
|
-
result.push(network_list[i].name);
|
|
810
|
-
}
|
|
811
|
-
}
|
|
812
|
-
return result;
|
|
813
|
-
}
|
|
814
|
-
|
|
815
|
-
export const getStatus = (keystore_path: string) => {
|
|
816
|
-
const network_path = path.resolve(keystore_path, 'network.json');
|
|
817
|
-
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
818
|
-
return networks.status;
|
|
819
|
-
}
|