wative 1.0.1
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/README.md +11 -0
- package/bin/wative-cli.js +2 -0
- package/lib/index.esm.js +1 -0
- package/lib/index.umd.js +1 -0
- package/package.json +59 -0
- package/rollup.config.js +30 -0
- package/src/account.ts +558 -0
- package/src/assets.ts +221 -0
- package/src/chain.ts +28 -0
- package/src/config.ts +2074 -0
- package/src/home_page.ts +36 -0
- package/src/index.d.ts +1 -0
- package/src/index.ts +35 -0
- package/src/network.ts +559 -0
- package/src/tools.ts +742 -0
- package/src/tx_gas_utils.ts +119 -0
- package/src/utils.ts +381 -0
- package/src/web3.ts +268 -0
package/src/home_page.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { inputSomething, selectSomething } from "./utils";
|
|
2
|
+
import { showAvailableNetworks, showNetwork } from "./network";
|
|
3
|
+
import { accountSetting } from "./account";
|
|
4
|
+
import { showTools } from "./tools";
|
|
5
|
+
const { WativeCore } = require("wative-core");
|
|
6
|
+
|
|
7
|
+
export const showHomePage = async (keystore_path: string, wative_core: typeof WativeCore) => {
|
|
8
|
+
const home_page_list = [
|
|
9
|
+
'> System & Settings',
|
|
10
|
+
'> Accounts',
|
|
11
|
+
'> Tools',
|
|
12
|
+
'> Exit'
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
const selected_home_page = await selectSomething(home_page_list);
|
|
16
|
+
|
|
17
|
+
switch (selected_home_page) {
|
|
18
|
+
case '> System & Settings': {
|
|
19
|
+
await showNetwork(keystore_path);
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
case '> Accounts': {
|
|
23
|
+
await accountSetting(keystore_path, wative_core);
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
case '> Tools': {
|
|
27
|
+
await showTools(keystore_path, wative_core);
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
case '> Exit': {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
await showHomePage(keystore_path, wative_core);
|
|
36
|
+
}
|
package/src/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
declare module 'wative-core';
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { showIntroduction, getKeystorePath } from "./utils";
|
|
4
|
+
import { createNetwork } from "./network";
|
|
5
|
+
import { showHomePage } from "./home_page";
|
|
6
|
+
|
|
7
|
+
const { WativeCore } = require("wative-core");
|
|
8
|
+
const packageJson = require('../package.json');
|
|
9
|
+
const Event = require('events');
|
|
10
|
+
Event.EventEmitter.defaultMaxListeners = 0;
|
|
11
|
+
|
|
12
|
+
const main = async () => {
|
|
13
|
+
console.log("version:", packageJson.version);
|
|
14
|
+
|
|
15
|
+
showIntroduction();
|
|
16
|
+
|
|
17
|
+
const keystore_path = await getKeystorePath();
|
|
18
|
+
await createNetwork(keystore_path);
|
|
19
|
+
|
|
20
|
+
const network_path = path.resolve(keystore_path, 'network.json');
|
|
21
|
+
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
22
|
+
const wative_core = new WativeCore(keystore_path, networks.accounts);
|
|
23
|
+
await showHomePage(keystore_path, wative_core);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
process.on('unhandledRejection', (reason, p) => {
|
|
27
|
+
console.log('Unhandled Rejection at:', p, 'reason:', reason);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
main()
|
|
31
|
+
.then(() => process.exit(0))
|
|
32
|
+
.catch((error: any) => {
|
|
33
|
+
console.log(error.message);
|
|
34
|
+
process.exit(1)
|
|
35
|
+
})
|
package/src/network.ts
ADDED
|
@@ -0,0 +1,559 @@
|
|
|
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
|
+
getAccountChainType
|
|
17
|
+
} from "./utils";
|
|
18
|
+
import {
|
|
19
|
+
getAccountInfo,
|
|
20
|
+
saveAccountInfo
|
|
21
|
+
} from "./account";
|
|
22
|
+
import { getAccountBalanceInEvm, getAccountBalanceInSolana } from "./web3";
|
|
23
|
+
import { getChainType, getNativeTokenDecimals } from "./chain";
|
|
24
|
+
|
|
25
|
+
export const createNetwork = async (keystore_path: string) => {
|
|
26
|
+
const network_path = path.resolve(keystore_path, 'network.json');
|
|
27
|
+
|
|
28
|
+
if (fs.existsSync(network_path)) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const networks = {
|
|
33
|
+
networks: DEFAULT_NETWORK,
|
|
34
|
+
currentNetwork: "Ethereum Mainnet",
|
|
35
|
+
accounts: []
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
fs.writeFileSync(network_path, JSON.stringify(networks, null, 2));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const selectOrEditNetwork = async (keystore_path: string, selected_network: any) => {
|
|
42
|
+
let options: string[] = [
|
|
43
|
+
"> Edit"
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
if (selected_network.name !== "Ethereum Mainnet" && selected_network.name !== "Solana Mainnet") {
|
|
47
|
+
options.push("> Remove");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
options.push("> Back");
|
|
51
|
+
|
|
52
|
+
const selected_network_info = await selectSomething(options);
|
|
53
|
+
|
|
54
|
+
switch (selected_network_info) {
|
|
55
|
+
case "> Edit": {
|
|
56
|
+
await updateNetwork(keystore_path, selected_network);
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case "> Remove": {
|
|
60
|
+
await removeNetwork(keystore_path, selected_network);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "> Back": {
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export const updateNetwork = async (keystore_path: string, default_network: any) => {
|
|
70
|
+
const network_path = path.resolve(keystore_path, 'network.json');
|
|
71
|
+
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
72
|
+
|
|
73
|
+
let exist_chain_name_list: string[] = [];
|
|
74
|
+
for (let i = 0; i < networks.networks.length; i++) {
|
|
75
|
+
const network = networks.networks[i];
|
|
76
|
+
exist_chain_name_list.push(network.name);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
let rpc_url: string = default_network.rpcUrl,
|
|
80
|
+
chain_id: string = default_network.chainId.toString(),
|
|
81
|
+
symbol: string = default_network.nativeCurrency.symbol,
|
|
82
|
+
chain_name: string = default_network.name,
|
|
83
|
+
multicall_address: string | null = default_network.multicallAddress,
|
|
84
|
+
color: string | null = default_network.color;
|
|
85
|
+
if (default_network.name === "Ethereum Mainnet" || default_network.name === "Solana Mainnet") {
|
|
86
|
+
rpc_url = await getRpcUrl(default_network.chainId.toString(), `Rpc Url (default: ${default_network.rpcUrl})`, true);
|
|
87
|
+
} else {
|
|
88
|
+
chain_name = await inputSomething(`Chain Name (default: ${default_network.name})`);
|
|
89
|
+
if (chain_name && chain_name !== default_network.name && exist_chain_name_list.includes(chain_name)) {
|
|
90
|
+
console.log(
|
|
91
|
+
chalk.red('Chain Name already exists')
|
|
92
|
+
);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
chain_id = await getChainId(`Chain Id (default: ${default_network.chainId})`, true);
|
|
97
|
+
rpc_url = await getRpcUrl(chain_id || default_network.chainId, `RPC Url (default: ${default_network.rpcUrl})`, true);
|
|
98
|
+
symbol = await getSymbol(`Symbol (default: ${default_network.nativeCurrency.symbol})`);
|
|
99
|
+
multicall_address = await getMulticallAddress(
|
|
100
|
+
default_network.multicallAddress ?
|
|
101
|
+
`Multicall Address (Optional) (default: ${default_network.multicallAddress})` :
|
|
102
|
+
'Multicall Address (Optional)'
|
|
103
|
+
);
|
|
104
|
+
color = await getColor(
|
|
105
|
+
default_network.color ?
|
|
106
|
+
`Color (Optional): (default: ${default_network.color})` :
|
|
107
|
+
'Color (Optional)'
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
let decimals = getNativeTokenDecimals(chain_id);
|
|
112
|
+
let network: any = {
|
|
113
|
+
name: chain_name || default_network.name,
|
|
114
|
+
chainId: Number(chain_id) || default_network.chainId,
|
|
115
|
+
rpcUrl: rpc_url || default_network.rpcUrl,
|
|
116
|
+
nativeCurrency: {
|
|
117
|
+
name: symbol || default_network.nativeCurrency.symbol,
|
|
118
|
+
symbol: symbol || default_network.nativeCurrency.symbol,
|
|
119
|
+
decimals: decimals || default_network.nativeCurrency.decimals
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
if (multicall_address || default_network.multicallAddress) {
|
|
123
|
+
network["multicallAddress"] = multicall_address || default_network.multicallAddress;
|
|
124
|
+
}
|
|
125
|
+
if (color || default_network.color) {
|
|
126
|
+
network["color"] = color || default_network.color;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
for (let i = 0; i < networks.networks.length; i++) {
|
|
130
|
+
if (networks.networks[i].name === default_network.name) {
|
|
131
|
+
networks.networks[i] = network;
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
fs.writeFileSync(network_path, JSON.stringify(networks, null, 2));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export const removeNetwork = async (keystore_path: string, default_network: any) => {
|
|
140
|
+
const network_path = path.resolve(keystore_path, 'network.json');
|
|
141
|
+
let networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
142
|
+
|
|
143
|
+
for (let i = 0; i < networks.networks.length; i++) {
|
|
144
|
+
if (networks.networks[i].name === default_network.name) {
|
|
145
|
+
networks.networks.splice(i, 1);
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (default_network.name === networks.currentNetwork) {
|
|
151
|
+
networks.currentNetwork = "Ethereum Mainnet";
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
fs.writeFileSync(network_path, JSON.stringify(networks, null, 2));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export const addNetwork = async (keystore_path: string) => {
|
|
158
|
+
const network_path = path.resolve(keystore_path, 'network.json');
|
|
159
|
+
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
160
|
+
|
|
161
|
+
let exist_chain_name_list: string[] = [];
|
|
162
|
+
for (let i = 0; i < networks.networks.length; i++) {
|
|
163
|
+
const network = networks.networks[i];
|
|
164
|
+
exist_chain_name_list.push(network.name);
|
|
165
|
+
}
|
|
166
|
+
console.log(
|
|
167
|
+
chalk.green('Please input someting about network')
|
|
168
|
+
);
|
|
169
|
+
const chain_name = await inputSomething('Chain Name');
|
|
170
|
+
if (exist_chain_name_list.includes(chain_name)) {
|
|
171
|
+
console.log(
|
|
172
|
+
chalk.red('Chain Name already exists')
|
|
173
|
+
);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const chain_id = await getChainId('Chain Id');
|
|
178
|
+
if (!chain_id) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const rpc_url = await getRpcUrl(chain_id, 'RPC Url');
|
|
183
|
+
if (!rpc_url) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const symbol = await getSymbol('Symbol');
|
|
188
|
+
if (!symbol) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const multicall_address = await getMulticallAddress('Multicall Address (Optional)');
|
|
192
|
+
const color = await getColor('Color (Optional)');
|
|
193
|
+
|
|
194
|
+
let decimals = getNativeTokenDecimals(chain_id);
|
|
195
|
+
let network: any = {
|
|
196
|
+
name: chain_name,
|
|
197
|
+
chainId: Number(chain_id),
|
|
198
|
+
rpcUrl: rpc_url,
|
|
199
|
+
nativeCurrency: {
|
|
200
|
+
name: symbol,
|
|
201
|
+
symbol: symbol,
|
|
202
|
+
decimals: decimals
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
if (multicall_address) {
|
|
206
|
+
network["multicallAddress"] = multicall_address;
|
|
207
|
+
}
|
|
208
|
+
if (color) {
|
|
209
|
+
network["color"] = color;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
networks.networks.push(network);
|
|
213
|
+
fs.writeFileSync(network_path, JSON.stringify(networks, null, 2));
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export const showAvailableNetworks = async (keystore_path: string) => {
|
|
217
|
+
const network_path = path.resolve(keystore_path, 'network.json');
|
|
218
|
+
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
219
|
+
|
|
220
|
+
let evm_ids: number[] = [], solana_ids: number[] = [];
|
|
221
|
+
|
|
222
|
+
for (let i = 0; i < networks.networks.length; i++) {
|
|
223
|
+
const network = networks.networks[i];
|
|
224
|
+
|
|
225
|
+
if (getChainType(network.chainId.toString()) === "solana") {
|
|
226
|
+
solana_ids.push(i);
|
|
227
|
+
} else {
|
|
228
|
+
evm_ids.push(i);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
let options: any = ["> Back", new inquirer.Separator(`----Networks(evm)----`)];
|
|
233
|
+
|
|
234
|
+
for (let i = 0; i < evm_ids.length; i++) {
|
|
235
|
+
const evm_id = evm_ids[i];
|
|
236
|
+
let network: any = networks.networks[evm_id];
|
|
237
|
+
|
|
238
|
+
let select_key = `${i + 1}.${network.name}`;
|
|
239
|
+
if (i === 0) {
|
|
240
|
+
select_key += ' 🔒';
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
options.push(select_key);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
options.push(new inquirer.Separator(`----Networks(solana)----`));
|
|
247
|
+
|
|
248
|
+
for (let i = 0; i < solana_ids.length; i++) {
|
|
249
|
+
const solana_id = solana_ids[i];
|
|
250
|
+
let network: any = networks.networks[solana_id];
|
|
251
|
+
|
|
252
|
+
let select_key = `${i + 1}.${network.name}`;
|
|
253
|
+
if (i === 0) {
|
|
254
|
+
select_key += ' 🔒';
|
|
255
|
+
}
|
|
256
|
+
options.push(select_key);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const selected_option = await selectSomething(options);
|
|
260
|
+
if (selected_option === "> Back") {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
let option_id = options.indexOf(selected_option);
|
|
265
|
+
let select_network: any;
|
|
266
|
+
if (option_id < evm_ids.length + 2) {
|
|
267
|
+
select_network = networks.networks[evm_ids[option_id - 2]];
|
|
268
|
+
} else {
|
|
269
|
+
select_network = networks.networks[solana_ids[option_id - evm_ids.length - 3]];
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
await selectOrEditNetwork(keystore_path, select_network);
|
|
273
|
+
await showAvailableNetworks(keystore_path);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export const showNetwork = async (keystore_path: string) => {
|
|
277
|
+
let network_info_list = [
|
|
278
|
+
"> Available Networks",
|
|
279
|
+
"> Add Network",
|
|
280
|
+
"> Back"
|
|
281
|
+
];
|
|
282
|
+
|
|
283
|
+
const selected_network_info = await selectSomething(network_info_list);
|
|
284
|
+
|
|
285
|
+
switch (selected_network_info) {
|
|
286
|
+
case "> Available Networks": {
|
|
287
|
+
await showAvailableNetworks(keystore_path);
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
case "> Add Network": {
|
|
291
|
+
await addNetwork(keystore_path);
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
case "> Back": {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
await showNetwork(keystore_path);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
export const selectDefaultNetwork = async (keystore_path: string) => {
|
|
303
|
+
const network_path = path.resolve(keystore_path, 'network.json');
|
|
304
|
+
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
305
|
+
const network_name_list = networks.networks.map((network: { name: string; }) => {
|
|
306
|
+
return `> ${network.name}`
|
|
307
|
+
});
|
|
308
|
+
const selected_network_name = await selectSomething(network_name_list, 'Please select a default network');
|
|
309
|
+
return selected_network_name.slice(2,);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
export const getNetworkTypeByName = (keystore_path: string, network_name: string) => {
|
|
313
|
+
const network_path = path.resolve(keystore_path, 'network.json');
|
|
314
|
+
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
315
|
+
|
|
316
|
+
for (let i = 0; i < networks.networks.length; i++) {
|
|
317
|
+
const network = networks.networks[i];
|
|
318
|
+
if (network.name === network_name) {
|
|
319
|
+
return getChainType(network.chainId.toString());
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
return "unknown";
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export const getNetworkInfoByName = (keystore_path: string, network_name: string) => {
|
|
327
|
+
const network_path = path.resolve(keystore_path, 'network.json');
|
|
328
|
+
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
329
|
+
|
|
330
|
+
for (let i = 0; i < networks.networks.length; i++) {
|
|
331
|
+
const network = networks.networks[i];
|
|
332
|
+
if (network.name === network_name) {
|
|
333
|
+
return network;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
export const getAccountAddress = (keystore_path: string, account_label: string, account_id: number) => {
|
|
341
|
+
const account_info = getAccountInfo(keystore_path, account_label);
|
|
342
|
+
|
|
343
|
+
let default_network = account_info.default_network;
|
|
344
|
+
if (account_info.data[account_id].default_network && account_info.data[account_id].default_network !== "") {
|
|
345
|
+
default_network = account_info.data[account_id].default_network;
|
|
346
|
+
}
|
|
347
|
+
let network_type = getNetworkTypeByName(keystore_path, default_network);
|
|
348
|
+
|
|
349
|
+
if (network_type === "solana") {
|
|
350
|
+
return account_info.data[account_id].ciphertexts.solana.address;
|
|
351
|
+
} else if (network_type === "evm") {
|
|
352
|
+
return account_info.data[account_id].ciphertexts.evm.address;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
return null;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
export const getPKAccountAddress = (keystore_path: string, account_label: string) => {
|
|
359
|
+
const account_info = getAccountInfo(keystore_path, account_label);
|
|
360
|
+
return account_info.ciphertexts.address;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
export const switchPPNetwork = async (keystore_path: string, account_label: string, account_id: number) => {
|
|
364
|
+
const network_path = path.resolve(keystore_path, 'network.json');
|
|
365
|
+
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
366
|
+
const network_list = networks.networks;
|
|
367
|
+
const network_len = network_list.length;
|
|
368
|
+
|
|
369
|
+
let account_info = getAccountInfo(keystore_path, account_label);
|
|
370
|
+
let options_switch_network = [
|
|
371
|
+
"> Back"
|
|
372
|
+
];
|
|
373
|
+
|
|
374
|
+
let default_network = account_info.data[account_id].default_network;
|
|
375
|
+
if (!default_network || default_network === "") {
|
|
376
|
+
options_switch_network.push("● Same as the account setting");
|
|
377
|
+
} else {
|
|
378
|
+
options_switch_network.push(`○ Same as the account setting`);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
for (let i = 0; i < network_len; i++) {
|
|
382
|
+
const network = network_list[i];
|
|
383
|
+
let account_address: string;
|
|
384
|
+
if (getChainType(network.chainId.toString())) {
|
|
385
|
+
account_address = account_info.data[account_id].ciphertexts.solana.address;
|
|
386
|
+
} else {
|
|
387
|
+
account_address = account_info.data[account_id].ciphertexts.evm.address;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
if (network.name === default_network) {
|
|
391
|
+
options_switch_network.push(`● ${account_address} [${network.name}]`);
|
|
392
|
+
} else {
|
|
393
|
+
options_switch_network.push(`○ ${account_address} [${network.name}]`);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
const selected_network = await selectSomething(options_switch_network);
|
|
398
|
+
|
|
399
|
+
if (selected_network === "> Back") {
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
let selected_network_id = options_switch_network.indexOf(selected_network);
|
|
404
|
+
if (selected_network_id === 1) {
|
|
405
|
+
delete account_info.data[account_id].default_network;
|
|
406
|
+
} else {
|
|
407
|
+
account_info.data[account_id].default_network = network_list[selected_network_id - 2].name;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
saveAccountInfo(keystore_path, account_label, account_info);
|
|
411
|
+
|
|
412
|
+
let new_default_network = account_info.default_network;
|
|
413
|
+
if ("default_network" in account_info.data[account_id] && account_info.data[account_id].default_network !== "") {
|
|
414
|
+
new_default_network = account_info.data[account_id].default_network;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
let new_network = getNetworkInfoByName(keystore_path, new_default_network);
|
|
418
|
+
console.log(
|
|
419
|
+
chalk.green(` Address No: #${account_id}\n Network: ${new_default_network}\n ${new_network.nativeCurrency.symbol} Balance: 0`)
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
export const switchNetworkByAccountLabel = async (keystore_path: string, account_label: string, is_account_label: boolean) => {
|
|
424
|
+
const network_path = path.resolve(keystore_path, 'network.json');
|
|
425
|
+
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
426
|
+
const network_list = networks.networks;
|
|
427
|
+
const network_len = network_list.length;
|
|
428
|
+
|
|
429
|
+
let account_info = getAccountInfo(keystore_path, account_label);
|
|
430
|
+
let options_switch_network = [
|
|
431
|
+
"> Back"
|
|
432
|
+
];
|
|
433
|
+
|
|
434
|
+
let default_network = account_info.default_network;
|
|
435
|
+
|
|
436
|
+
let account_address = "";
|
|
437
|
+
if (!is_account_label) {
|
|
438
|
+
account_address = account_info.ciphertexts.address;
|
|
439
|
+
}
|
|
440
|
+
let option_network_name_list: string[] = [];
|
|
441
|
+
const network_type = getNetworkTypeByName(keystore_path, default_network);
|
|
442
|
+
|
|
443
|
+
for (let i = 0; i < network_len; i++) {
|
|
444
|
+
const network = network_list[i];
|
|
445
|
+
|
|
446
|
+
const this_network_type = getNetworkTypeByName(keystore_path, network.name);
|
|
447
|
+
if (account_info.account_type === "PK" && network_type !== this_network_type) {
|
|
448
|
+
continue;
|
|
449
|
+
}
|
|
450
|
+
if (network.name === default_network) {
|
|
451
|
+
if (is_account_label) {
|
|
452
|
+
options_switch_network.push(`● ${network.name}`);
|
|
453
|
+
} else {
|
|
454
|
+
options_switch_network.push(`● ${account_address} [${network.name}]`);
|
|
455
|
+
}
|
|
456
|
+
} else {
|
|
457
|
+
if (is_account_label) {
|
|
458
|
+
options_switch_network.push(`○ ${network.name}`);
|
|
459
|
+
} else {
|
|
460
|
+
options_switch_network.push(`○ ${account_address} [${network.name}]`);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
option_network_name_list.push(network.name);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
const selected_network = await selectSomething(options_switch_network);
|
|
467
|
+
if (selected_network === "> Back") {
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
let selected_network_id = options_switch_network.indexOf(selected_network);
|
|
472
|
+
account_info.default_network = option_network_name_list[selected_network_id - 1];
|
|
473
|
+
saveAccountInfo(keystore_path, account_label, account_info);
|
|
474
|
+
|
|
475
|
+
if (!is_account_label) {
|
|
476
|
+
let new_default_network = account_info.default_network;
|
|
477
|
+
let new_network = getNetworkInfoByName(keystore_path, new_default_network);
|
|
478
|
+
console.log(
|
|
479
|
+
chalk.green(` Address No: #0\n Network: ${new_default_network}\n ${new_network.nativeCurrency.symbol} Balance: 0`)
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
export const accountBalanceLog = async (account_label: string, account_id: number, keystore_path: string, default_network: string) => {
|
|
485
|
+
const account_info = getAccountInfo(keystore_path, account_label);
|
|
486
|
+
|
|
487
|
+
let account_address: string;
|
|
488
|
+
if (account_info.account_type === "PK") {
|
|
489
|
+
account_address = getAccountAddress(keystore_path, account_label, account_id);
|
|
490
|
+
} else {
|
|
491
|
+
account_address = getPKAccountAddress(keystore_path, account_label);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
const balance_result = await getAccountBalance(account_address, keystore_path, default_network);
|
|
495
|
+
if (balance_result.status) {
|
|
496
|
+
console.log(
|
|
497
|
+
chalk.green(` Address No: #${account_id}\n Network: ${default_network}\n ${balance_result.output}`)
|
|
498
|
+
);
|
|
499
|
+
} else {
|
|
500
|
+
console.log(
|
|
501
|
+
chalk.green(` Address No: #${account_id}\n Network: ${default_network}\n ${balance_result.output}`)
|
|
502
|
+
);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
export const getAccountBalance = async (account: string, keystore_path: string, default_network: string) => {
|
|
507
|
+
const network_info = getNetworkInfoByName(keystore_path, default_network);
|
|
508
|
+
|
|
509
|
+
const rpc_url = network_info.rpcUrl;
|
|
510
|
+
const decimals = network_info.nativeCurrency.decimals;
|
|
511
|
+
|
|
512
|
+
let result: Result;
|
|
513
|
+
if (getChainType(network_info.chainId.toString()) === "solana") {
|
|
514
|
+
result = await getAccountBalanceInSolana(account, rpc_url);
|
|
515
|
+
} else {
|
|
516
|
+
result = await getAccountBalanceInEvm(account, rpc_url);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
if (result.status) {
|
|
520
|
+
let balance = new BigNumber(result.output.toString());
|
|
521
|
+
result.output = balance.dividedBy(Math.pow(10, decimals)).toFixed(4, BigNumber.ROUND_FLOOR);
|
|
522
|
+
}
|
|
523
|
+
return result;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
export const getDefaultNetworkByAddress = (keystore_path: string, account_label: string, account_address: string) => {
|
|
527
|
+
const account_info = getAccountInfo(keystore_path, account_label);
|
|
528
|
+
if (account_info.account_type === "PK") {
|
|
529
|
+
return account_info.default_network;
|
|
530
|
+
}
|
|
531
|
+
for (let i = 0; i < account_info.data.length; i++) {
|
|
532
|
+
if (
|
|
533
|
+
account_info.data[i].ciphertexts.solana.address === account_address ||
|
|
534
|
+
account_info.data[i].ciphertexts.evm.address === account_address
|
|
535
|
+
) {
|
|
536
|
+
if ("default_network" in account_info.data[i]) {
|
|
537
|
+
return account_info.data[i].default_network;
|
|
538
|
+
} else {
|
|
539
|
+
return account_info.default_network;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
return null;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
export const getEvmNetworks = (keystore_path: string) => {
|
|
547
|
+
const network_path = path.resolve(keystore_path, 'network.json');
|
|
548
|
+
const networks = JSON.parse(fs.readFileSync(network_path, 'utf8'));
|
|
549
|
+
const network_list = networks.networks;
|
|
550
|
+
const network_len = network_list.length;
|
|
551
|
+
let result: any = [];
|
|
552
|
+
for (let i = 0; i < network_len; i++) {
|
|
553
|
+
if (getChainType(network_list[i].chainId.toString()) === "evm") {
|
|
554
|
+
result.push(network_list[i].name);
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
return result;
|
|
558
|
+
}
|
|
559
|
+
|