@cartesi/cli 2.0.0-alpha.4 → 2.0.0-alpha.40
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/dist/index.js +720 -1
- package/dist/index.js.map +846 -0
- package/package.json +61 -101
- package/LICENSE +0 -202
- package/bin/dev.cmd +0 -3
- package/bin/dev.js +0 -25
- package/bin/run.cmd +0 -3
- package/bin/run.js +0 -8
- package/dist/baseCommand.d.ts +0 -22
- package/dist/baseCommand.d.ts.map +0 -1
- package/dist/baseCommand.js +0 -92
- package/dist/builder/directory.d.ts +0 -3
- package/dist/builder/directory.d.ts.map +0 -1
- package/dist/builder/directory.js +0 -37
- package/dist/builder/docker.d.ts +0 -10
- package/dist/builder/docker.d.ts.map +0 -1
- package/dist/builder/docker.js +0 -112
- package/dist/builder/empty.d.ts +0 -3
- package/dist/builder/empty.d.ts.map +0 -1
- package/dist/builder/empty.js +0 -21
- package/dist/builder/index.d.ts +0 -6
- package/dist/builder/index.d.ts.map +0 -1
- package/dist/builder/index.js +0 -5
- package/dist/builder/none.d.ts +0 -3
- package/dist/builder/none.d.ts.map +0 -1
- package/dist/builder/none.js +0 -11
- package/dist/builder/tar.d.ts +0 -3
- package/dist/builder/tar.d.ts.map +0 -1
- package/dist/builder/tar.js +0 -30
- package/dist/commands/address-book.d.ts +0 -9
- package/dist/commands/address-book.d.ts.map +0 -1
- package/dist/commands/address-book.js +0 -40
- package/dist/commands/build.d.ts +0 -12
- package/dist/commands/build.d.ts.map +0 -1
- package/dist/commands/build.js +0 -73
- package/dist/commands/clean.d.ts +0 -8
- package/dist/commands/clean.d.ts.map +0 -1
- package/dist/commands/clean.js +0 -11
- package/dist/commands/create.d.ts +0 -16
- package/dist/commands/create.d.ts.map +0 -1
- package/dist/commands/create.js +0 -66
- package/dist/commands/deploy/build.d.ts +0 -15
- package/dist/commands/deploy/build.d.ts.map +0 -1
- package/dist/commands/deploy/build.js +0 -62
- package/dist/commands/deploy/index.d.ts +0 -12
- package/dist/commands/deploy/index.d.ts.map +0 -1
- package/dist/commands/deploy/index.js +0 -78
- package/dist/commands/doctor.d.ts +0 -13
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -106
- package/dist/commands/hash.d.ts +0 -10
- package/dist/commands/hash.d.ts.map +0 -1
- package/dist/commands/hash.js +0 -22
- package/dist/commands/run.d.ts +0 -22
- package/dist/commands/run.d.ts.map +0 -1
- package/dist/commands/run.js +0 -200
- package/dist/commands/send/erc20.d.ts +0 -14
- package/dist/commands/send/erc20.d.ts.map +0 -1
- package/dist/commands/send/erc20.js +0 -70
- package/dist/commands/send/erc721.d.ts +0 -14
- package/dist/commands/send/erc721.d.ts.map +0 -1
- package/dist/commands/send/erc721.js +0 -73
- package/dist/commands/send/ether.d.ts +0 -13
- package/dist/commands/send/ether.d.ts.map +0 -1
- package/dist/commands/send/ether.js +0 -32
- package/dist/commands/send/generic.d.ts +0 -15
- package/dist/commands/send/generic.d.ts.map +0 -1
- package/dist/commands/send/generic.js +0 -119
- package/dist/commands/send/index.d.ts +0 -28
- package/dist/commands/send/index.d.ts.map +0 -1
- package/dist/commands/send/index.js +0 -102
- package/dist/commands/shell.d.ts +0 -15
- package/dist/commands/shell.d.ts.map +0 -1
- package/dist/commands/shell.js +0 -65
- package/dist/config.d.ts +0 -102
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -367
- package/dist/contracts.d.ts +0 -4317
- package/dist/contracts.d.ts.map +0 -1
- package/dist/contracts.js +0 -1799
- package/dist/exec/cartesi-machine.d.ts +0 -9
- package/dist/exec/cartesi-machine.d.ts.map +0 -1
- package/dist/exec/cartesi-machine.js +0 -20
- package/dist/exec/crane.d.ts +0 -15
- package/dist/exec/crane.d.ts.map +0 -1
- package/dist/exec/crane.js +0 -17
- package/dist/exec/genext2fs.d.ts +0 -28
- package/dist/exec/genext2fs.d.ts.map +0 -1
- package/dist/exec/genext2fs.js +0 -44
- package/dist/exec/index.d.ts +0 -5
- package/dist/exec/index.d.ts.map +0 -1
- package/dist/exec/index.js +0 -4
- package/dist/exec/mksquashfs.d.ts +0 -21
- package/dist/exec/mksquashfs.d.ts.map +0 -1
- package/dist/exec/mksquashfs.js +0 -45
- package/dist/exec/util.d.ts +0 -36
- package/dist/exec/util.d.ts.map +0 -1
- package/dist/exec/util.js +0 -80
- package/dist/flags.d.ts +0 -17
- package/dist/flags.d.ts.map +0 -1
- package/dist/flags.js +0 -28
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/machine.d.ts +0 -6
- package/dist/machine.d.ts.map +0 -1
- package/dist/machine.js +0 -80
- package/dist/node/DockerfileDeploy.txt +0 -4
- package/dist/node/default.env +0 -27
- package/dist/node/docker-compose-anvil.yaml +0 -50
- package/dist/node/docker-compose-bundler.yaml +0 -57
- package/dist/node/docker-compose-database.yaml +0 -10
- package/dist/node/docker-compose-envfile.yaml +0 -4
- package/dist/node/docker-compose-espresso.yaml +0 -127
- package/dist/node/docker-compose-explorer.yaml +0 -88
- package/dist/node/docker-compose-host.yaml +0 -30
- package/dist/node/docker-compose-paymaster.yaml +0 -33
- package/dist/node/docker-compose-prompt.yaml +0 -17
- package/dist/node/docker-compose-proxy.yaml +0 -48
- package/dist/node/docker-compose-snapshot-volume.yaml +0 -8
- package/dist/node/docker-compose-validator-cpus.yaml +0 -6
- package/dist/node/docker-compose-validator-memory.yaml +0 -6
- package/dist/node/docker-compose-validator.yaml +0 -59
- package/dist/prompts.d.ts +0 -62
- package/dist/prompts.d.ts.map +0 -1
- package/dist/prompts.js +0 -158
- package/dist/types/docker.d.ts +0 -22
- package/dist/types/docker.d.ts.map +0 -1
- package/dist/types/docker.js +0 -1
- package/dist/wallet.d.ts +0 -24
- package/dist/wallet.d.ts.map +0 -1
- package/dist/wallet.js +0 -204
- package/oclif.manifest.json +0 -883
package/dist/prompts.js
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import confirm from "@inquirer/confirm";
|
|
2
|
-
import input from "@inquirer/input";
|
|
3
|
-
import select from "@inquirer/select";
|
|
4
|
-
import chalk from "chalk";
|
|
5
|
-
import { encodeAbiParameters, formatUnits, getAddress, isAddress, isHex, parseAbiParameters, parseUnits, stringToHex, } from "viem";
|
|
6
|
-
export const addressInput = async (config) => {
|
|
7
|
-
const address = await input({
|
|
8
|
-
...config,
|
|
9
|
-
validate: (value) => isAddress(value) || "Enter a valid address",
|
|
10
|
-
});
|
|
11
|
-
return getAddress(address);
|
|
12
|
-
};
|
|
13
|
-
export const hexInput = async (config) => {
|
|
14
|
-
const value = await input({
|
|
15
|
-
...config,
|
|
16
|
-
validate: (value) => isHex(value) || "Enter a valid hex value",
|
|
17
|
-
});
|
|
18
|
-
return value;
|
|
19
|
-
};
|
|
20
|
-
export const bigintInput = async (config) => {
|
|
21
|
-
const defaultValue = config.default != undefined
|
|
22
|
-
? formatUnits(config.default, config.decimals)
|
|
23
|
-
: undefined;
|
|
24
|
-
const value = await input({
|
|
25
|
-
...config,
|
|
26
|
-
default: defaultValue,
|
|
27
|
-
});
|
|
28
|
-
return parseUnits(value, config.decimals);
|
|
29
|
-
};
|
|
30
|
-
/**
|
|
31
|
-
* Prompt for a bytes input, by choosing from different encoding options.
|
|
32
|
-
* @param config inquirer config
|
|
33
|
-
* @returns bytes as hex string
|
|
34
|
-
*/
|
|
35
|
-
export const bytesInput = async (config) => {
|
|
36
|
-
const encoding = await select({
|
|
37
|
-
...config,
|
|
38
|
-
choices: [
|
|
39
|
-
{
|
|
40
|
-
value: "string",
|
|
41
|
-
name: "String encoding",
|
|
42
|
-
description: "Convert UTF-8 string to bytes",
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
value: "hex",
|
|
46
|
-
name: "Hex string encoding",
|
|
47
|
-
description: "Convert a hex string to bytes (must start with 0x)",
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
value: "abi",
|
|
51
|
-
name: "ABI encoding",
|
|
52
|
-
description: "Input as ABI encoding parameters https://abitype.dev/api/human.html#parseabiparameters",
|
|
53
|
-
},
|
|
54
|
-
],
|
|
55
|
-
});
|
|
56
|
-
switch (encoding) {
|
|
57
|
-
case "hex": {
|
|
58
|
-
const valueHex = await hexInput({
|
|
59
|
-
...config,
|
|
60
|
-
default: "0x",
|
|
61
|
-
message: `${config.message} (as hex-string)`,
|
|
62
|
-
});
|
|
63
|
-
return valueHex;
|
|
64
|
-
}
|
|
65
|
-
case "string": {
|
|
66
|
-
const valueString = await input({
|
|
67
|
-
...config,
|
|
68
|
-
message: `${config.message} (as string)`,
|
|
69
|
-
});
|
|
70
|
-
return stringToHex(valueString);
|
|
71
|
-
}
|
|
72
|
-
case "abi":
|
|
73
|
-
return await abiParamsInput(config);
|
|
74
|
-
default:
|
|
75
|
-
throw new Error(`Unsupported encoding ${encoding}`);
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
/**
|
|
79
|
-
* Prompt for ABI encoded parameters.
|
|
80
|
-
* @param config inquirer config
|
|
81
|
-
* @returns ABI encoded parameters as hex string
|
|
82
|
-
*/
|
|
83
|
-
export const abiParamsInput = async (config) => {
|
|
84
|
-
const encoding = await input({
|
|
85
|
-
message: `${config.message} (as ABI encoded https://abitype.dev/api/human.html#parseabiparameters )`,
|
|
86
|
-
validate: (value) => {
|
|
87
|
-
try {
|
|
88
|
-
parseAbiParameters(value);
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
catch (e) {
|
|
92
|
-
return "Invalid ABI parameters";
|
|
93
|
-
}
|
|
94
|
-
},
|
|
95
|
-
});
|
|
96
|
-
const abiParameters = parseAbiParameters(encoding);
|
|
97
|
-
const values = [];
|
|
98
|
-
for (const param of abiParameters) {
|
|
99
|
-
const message = `${config.message} -> ${param.type} ${param.name ?? ""}`;
|
|
100
|
-
switch (param.type) {
|
|
101
|
-
case "string":
|
|
102
|
-
values.push(await input({ message }));
|
|
103
|
-
break;
|
|
104
|
-
case "bool":
|
|
105
|
-
values.push(await confirm({ message }));
|
|
106
|
-
break;
|
|
107
|
-
case "uint":
|
|
108
|
-
case "uint8":
|
|
109
|
-
case "uint16":
|
|
110
|
-
case "uint32":
|
|
111
|
-
case "uint64":
|
|
112
|
-
case "uint128":
|
|
113
|
-
case "uint256":
|
|
114
|
-
values.push(await input({
|
|
115
|
-
message,
|
|
116
|
-
validate: (value) => {
|
|
117
|
-
try {
|
|
118
|
-
BigInt(value);
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
catch (e) {
|
|
122
|
-
return "Invalid number";
|
|
123
|
-
}
|
|
124
|
-
},
|
|
125
|
-
}));
|
|
126
|
-
break;
|
|
127
|
-
case "bytes":
|
|
128
|
-
values.push(await bytesInput({ message }));
|
|
129
|
-
break;
|
|
130
|
-
case "address":
|
|
131
|
-
values.push(await input({
|
|
132
|
-
message,
|
|
133
|
-
validate: (value) => isAddress(value) || "Invalid address",
|
|
134
|
-
}));
|
|
135
|
-
break;
|
|
136
|
-
default:
|
|
137
|
-
throw new Error(`Unsupported type ${param.type}`);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
return encodeAbiParameters(abiParameters, values);
|
|
141
|
-
};
|
|
142
|
-
export const selectAuto = (config, context) => {
|
|
143
|
-
const choices = config.choices;
|
|
144
|
-
const list = config.discardDisabled
|
|
145
|
-
? choices.filter((c) => c.type !== "separator" && !c.disabled)
|
|
146
|
-
: choices;
|
|
147
|
-
if (list.length === 1) {
|
|
148
|
-
const choice = list[0];
|
|
149
|
-
if (choice.type !== "separator") {
|
|
150
|
-
const output = context?.output || process.stdout;
|
|
151
|
-
const prefix = chalk.green("?");
|
|
152
|
-
const message = chalk.bold(config.message);
|
|
153
|
-
output.write(`${prefix} ${message} ${chalk.cyan(choice.name || choice.value)}\n`);
|
|
154
|
-
return new Promise((resolve) => resolve(choice.value));
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
return select(config, context);
|
|
158
|
-
};
|
package/dist/types/docker.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export type ServiceStatus = {
|
|
2
|
-
ID: string;
|
|
3
|
-
Name: string;
|
|
4
|
-
Image: string;
|
|
5
|
-
Command: string;
|
|
6
|
-
Project: string;
|
|
7
|
-
Service: string;
|
|
8
|
-
Created: number;
|
|
9
|
-
State: string;
|
|
10
|
-
Status: string;
|
|
11
|
-
Health: string;
|
|
12
|
-
ExitCode: number;
|
|
13
|
-
Publishers: ServicePublisher[];
|
|
14
|
-
};
|
|
15
|
-
export type ServicePublisher = {
|
|
16
|
-
URL: string;
|
|
17
|
-
TargetPort: number;
|
|
18
|
-
PublishedPort: number;
|
|
19
|
-
Protocol: string;
|
|
20
|
-
};
|
|
21
|
-
export type PsResponse = ServiceStatus;
|
|
22
|
-
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/types/docker.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,gBAAgB,EAAE,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC"}
|
package/dist/types/docker.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/wallet.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Address, Chain, Hex, PublicClient, WalletClient } from "viem";
|
|
2
|
-
export type SupportedChainsOptions = {
|
|
3
|
-
includeDevnet?: boolean;
|
|
4
|
-
includeMainnets?: boolean;
|
|
5
|
-
includeTestnets?: boolean;
|
|
6
|
-
};
|
|
7
|
-
export declare const supportedChains: (options?: SupportedChainsOptions) => Chain[];
|
|
8
|
-
export declare const DEFAULT_DEVNET_MNEMONIC = "test test test test test test test test test test test junk";
|
|
9
|
-
export type WalletType = "mnemonic" | "private-key";
|
|
10
|
-
export interface EthereumPromptOptions {
|
|
11
|
-
chain?: Chain;
|
|
12
|
-
rpcUrl?: string;
|
|
13
|
-
mnemonicPassphrase?: string;
|
|
14
|
-
mnemonicIndex?: number;
|
|
15
|
-
privateKey?: Hex;
|
|
16
|
-
}
|
|
17
|
-
export type TransactionPrompt = (walletClient: WalletClient, publicClient: PublicClient) => Promise<Address>;
|
|
18
|
-
declare const createClients: (options: EthereumPromptOptions) => Promise<{
|
|
19
|
-
chain: Chain;
|
|
20
|
-
publicClient: PublicClient;
|
|
21
|
-
walletClient: WalletClient;
|
|
22
|
-
}>;
|
|
23
|
-
export default createClients;
|
|
24
|
-
//# sourceMappingURL=wallet.d.ts.map
|
package/dist/wallet.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"AAEA,OAAO,EAEH,OAAO,EACP,KAAK,EACL,GAAG,EAEH,YAAY,EAEZ,YAAY,EAKf,MAAM,MAAM,CAAC;AAiBd,MAAM,MAAM,sBAAsB,GAAG;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,eAAe,aAAc,sBAAsB,KAAG,KAAK,EAoBvE,CAAC;AAEF,eAAO,MAAM,uBAAuB,gEAC6B,CAAC;AAElE,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,aAAa,CAAC;AAepD,MAAM,WAAW,qBAAqB;IAClC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,GAAG,CAAC;CACpB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAC5B,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,KACzB,OAAO,CAAC,OAAO,CAAC,CAAC;AAkLtB,QAAA,MAAM,aAAa,YACN,qBAAqB,KAC/B,OAAO,CAAC;IACP,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;CAC9B,CAuBA,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
package/dist/wallet.js
DELETED
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import input from "@inquirer/input";
|
|
2
|
-
import chalk from "chalk";
|
|
3
|
-
import { formatUnits, http, createPublicClient as viemCreatePublicClient, createWalletClient as viemCreateWalletClient, } from "viem";
|
|
4
|
-
import { mnemonicToAccount, privateKeyToAccount } from "viem/accounts";
|
|
5
|
-
import { arbitrum, arbitrumSepolia, base, baseSepolia, foundry, mainnet, optimism, optimismSepolia, sepolia, } from "viem/chains";
|
|
6
|
-
import { hexInput, selectAuto } from "./prompts.js";
|
|
7
|
-
export const supportedChains = (options) => {
|
|
8
|
-
options = options || {
|
|
9
|
-
includeDevnet: false, // default is not to show devnet
|
|
10
|
-
includeMainnets: true,
|
|
11
|
-
includeTestnets: true,
|
|
12
|
-
};
|
|
13
|
-
options.includeTestnets = options.includeTestnets ?? true; // default is true if not specified
|
|
14
|
-
options.includeMainnets = options.includeMainnets ?? true; // default is true if not specified
|
|
15
|
-
const chains = [];
|
|
16
|
-
if (options.includeDevnet) {
|
|
17
|
-
chains.push(foundry);
|
|
18
|
-
}
|
|
19
|
-
if (options.includeTestnets) {
|
|
20
|
-
chains.push(arbitrumSepolia, baseSepolia, optimismSepolia, sepolia);
|
|
21
|
-
}
|
|
22
|
-
if (options.includeMainnets) {
|
|
23
|
-
chains.push(arbitrum, base, mainnet, optimism);
|
|
24
|
-
}
|
|
25
|
-
return chains;
|
|
26
|
-
};
|
|
27
|
-
export const DEFAULT_DEVNET_MNEMONIC = "test test test test test test test test test test test junk";
|
|
28
|
-
const walletChoices = (chain) => {
|
|
29
|
-
const dev = chain.id === foundry.id;
|
|
30
|
-
return [
|
|
31
|
-
{
|
|
32
|
-
name: `Mnemonic${dev ? "" : chalk.red(" (UNSAFE)")}`,
|
|
33
|
-
value: "mnemonic",
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
name: `Private Key${dev ? "" : chalk.red(" (UNSAFE)")}`,
|
|
37
|
-
value: "private-key",
|
|
38
|
-
},
|
|
39
|
-
];
|
|
40
|
-
};
|
|
41
|
-
const selectChain = async (options) => {
|
|
42
|
-
// if development mode, include foundry as an option
|
|
43
|
-
const chains = supportedChains({ includeDevnet: true });
|
|
44
|
-
if (options.chain) {
|
|
45
|
-
const chain = options.chain;
|
|
46
|
-
if (chains.findIndex((c) => c.id === chain.id) >= 0) {
|
|
47
|
-
return options.chain;
|
|
48
|
-
}
|
|
49
|
-
throw new Error(`Unsupported chainId ${options.chain.id}`);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
// allow user to select from list
|
|
53
|
-
const choices = chains.map((chain) => ({
|
|
54
|
-
name: chain.name,
|
|
55
|
-
value: chain,
|
|
56
|
-
}));
|
|
57
|
-
return await selectAuto({
|
|
58
|
-
message: "Chain",
|
|
59
|
-
choices,
|
|
60
|
-
pageSize: choices.length,
|
|
61
|
-
discardDisabled: true,
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
const selectTransport = async (options, chain) => {
|
|
66
|
-
// use user provided url (in args) or try to use default one from chain, or ask for one
|
|
67
|
-
if (options.rpcUrl) {
|
|
68
|
-
return http(options.rpcUrl);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
const url = await input({
|
|
72
|
-
message: "RPC URL",
|
|
73
|
-
default: chain.rpcUrls.default.http[0],
|
|
74
|
-
});
|
|
75
|
-
return http(url);
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
const createPublicClient = async (chain, transport) => {
|
|
79
|
-
const publicClient = viemCreatePublicClient({ transport, chain });
|
|
80
|
-
// check if chainId matches
|
|
81
|
-
const chainId = await publicClient.getChainId();
|
|
82
|
-
if (chainId !== chain.id) {
|
|
83
|
-
throw new Error(`Chain of provided RPC URL (${chainId}) does not match selected chain (${chain.id}))`);
|
|
84
|
-
}
|
|
85
|
-
return publicClient;
|
|
86
|
-
};
|
|
87
|
-
/**
|
|
88
|
-
* Format the balance of an account for display
|
|
89
|
-
* @param account account to format the balance for
|
|
90
|
-
* @param publicClient client to query the balance
|
|
91
|
-
* @returns formatted balance string
|
|
92
|
-
*/
|
|
93
|
-
const addressBalanceLabel = async (address, publicClient) => {
|
|
94
|
-
const chain = publicClient.chain;
|
|
95
|
-
if (chain) {
|
|
96
|
-
// query balance using provider
|
|
97
|
-
const balance = await publicClient.getBalance({ address });
|
|
98
|
-
// format balance
|
|
99
|
-
const symbol = chain.nativeCurrency.symbol;
|
|
100
|
-
const balanceStr = formatUnits(balance, chain.nativeCurrency.decimals);
|
|
101
|
-
let balanceLabel = chalk.bold(`${balanceStr} ${symbol}`);
|
|
102
|
-
// display in red if balance is zero
|
|
103
|
-
if (balance === 0n) {
|
|
104
|
-
balanceLabel = chalk.red(balanceLabel);
|
|
105
|
-
}
|
|
106
|
-
return `${address} ${balanceLabel}`;
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
return address;
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
const createWalletClient = async (options, chain, publicClient, publicTransport) => {
|
|
113
|
-
if (options.privateKey) {
|
|
114
|
-
// private key specified
|
|
115
|
-
const account = privateKeyToAccount(options.privateKey);
|
|
116
|
-
return viemCreateWalletClient({
|
|
117
|
-
account,
|
|
118
|
-
transport: publicTransport,
|
|
119
|
-
chain,
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
else if (options.mnemonicPassphrase) {
|
|
123
|
-
// mnemonic specified
|
|
124
|
-
const account = mnemonicToAccount(options.mnemonicPassphrase, {
|
|
125
|
-
addressIndex: options.mnemonicIndex,
|
|
126
|
-
});
|
|
127
|
-
// create wallet client
|
|
128
|
-
return viemCreateWalletClient({
|
|
129
|
-
account,
|
|
130
|
-
transport: publicTransport,
|
|
131
|
-
chain,
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
const wallets = walletChoices(chain);
|
|
136
|
-
const wallet = await selectAuto({
|
|
137
|
-
message: "Wallet",
|
|
138
|
-
choices: wallets,
|
|
139
|
-
discardDisabled: true,
|
|
140
|
-
});
|
|
141
|
-
if (wallet === "mnemonic") {
|
|
142
|
-
// use the publicClient transport
|
|
143
|
-
const mnemonic = await input({
|
|
144
|
-
message: "Mnemonic",
|
|
145
|
-
default: chain.id === 31337 ? DEFAULT_DEVNET_MNEMONIC : undefined,
|
|
146
|
-
});
|
|
147
|
-
// select account from mnemonic
|
|
148
|
-
if (options.mnemonicIndex) {
|
|
149
|
-
return viemCreateWalletClient({
|
|
150
|
-
transport: publicTransport,
|
|
151
|
-
chain,
|
|
152
|
-
account: mnemonicToAccount(mnemonic, {
|
|
153
|
-
addressIndex: options.mnemonicIndex,
|
|
154
|
-
}),
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
const choices = await Promise.all([...Array(10)].map(async (_, addressIndex) => {
|
|
159
|
-
const account = mnemonicToAccount(mnemonic, {
|
|
160
|
-
addressIndex,
|
|
161
|
-
});
|
|
162
|
-
const name = await addressBalanceLabel(account.address, publicClient);
|
|
163
|
-
return { name, value: account };
|
|
164
|
-
}));
|
|
165
|
-
const account = await selectAuto({
|
|
166
|
-
message: "Account",
|
|
167
|
-
choices,
|
|
168
|
-
pageSize: choices.length,
|
|
169
|
-
});
|
|
170
|
-
return viemCreateWalletClient({
|
|
171
|
-
transport: publicTransport,
|
|
172
|
-
chain,
|
|
173
|
-
account,
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
else if (wallet === "private-key") {
|
|
178
|
-
const privateKey = await hexInput({ message: "Private Key" });
|
|
179
|
-
const account = privateKeyToAccount(privateKey);
|
|
180
|
-
return viemCreateWalletClient({
|
|
181
|
-
transport: publicTransport,
|
|
182
|
-
chain,
|
|
183
|
-
account,
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
throw new Error(`Unsupported wallet ${wallet}`);
|
|
187
|
-
}
|
|
188
|
-
};
|
|
189
|
-
const createClients = async (options) => {
|
|
190
|
-
// select chain
|
|
191
|
-
const chain = await selectChain(options);
|
|
192
|
-
// select RPC URL
|
|
193
|
-
const transport = await selectTransport(options, chain);
|
|
194
|
-
// create public client
|
|
195
|
-
const publicClient = await createPublicClient(chain, transport);
|
|
196
|
-
// create wallet client
|
|
197
|
-
const walletClient = await createWalletClient(options, chain, publicClient, transport);
|
|
198
|
-
return {
|
|
199
|
-
chain,
|
|
200
|
-
publicClient,
|
|
201
|
-
walletClient,
|
|
202
|
-
};
|
|
203
|
-
};
|
|
204
|
-
export default createClients;
|