@cartesi/cli 2.0.0-alpha.0 → 2.0.0-alpha.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.
Files changed (153) hide show
  1. package/dist/base.d.ts +18 -0
  2. package/dist/base.d.ts.map +1 -0
  3. package/dist/base.js +103 -0
  4. package/dist/builder/directory.d.ts.map +1 -1
  5. package/dist/builder/docker.d.ts.map +1 -1
  6. package/dist/builder/docker.js +10 -1
  7. package/dist/builder/empty.d.ts.map +1 -1
  8. package/dist/builder/none.d.ts.map +1 -1
  9. package/dist/builder/tar.d.ts.map +1 -1
  10. package/dist/commands/address-book.d.ts +4 -8
  11. package/dist/commands/address-book.d.ts.map +1 -1
  12. package/dist/commands/address-book.js +15 -14
  13. package/dist/commands/build.d.ts +5 -11
  14. package/dist/commands/build.d.ts.map +1 -1
  15. package/dist/commands/build.js +16 -28
  16. package/dist/commands/clean.d.ts +2 -7
  17. package/dist/commands/clean.d.ts.map +1 -1
  18. package/dist/commands/clean.js +9 -10
  19. package/dist/commands/create.d.ts +2 -15
  20. package/dist/commands/create.d.ts.map +1 -1
  21. package/dist/commands/create.js +7 -64
  22. package/dist/commands/deploy/build.d.ts +2 -14
  23. package/dist/commands/deploy/build.d.ts.map +1 -1
  24. package/dist/commands/deploy/build.js +8 -61
  25. package/dist/commands/deploy.d.ts +3 -0
  26. package/dist/commands/deploy.d.ts.map +1 -0
  27. package/dist/commands/deploy.js +12 -0
  28. package/dist/commands/doctor.d.ts +2 -12
  29. package/dist/commands/doctor.d.ts.map +1 -1
  30. package/dist/commands/doctor.js +96 -91
  31. package/dist/commands/hash.d.ts +4 -9
  32. package/dist/commands/hash.d.ts.map +1 -1
  33. package/dist/commands/hash.js +14 -14
  34. package/dist/commands/rollups/create.d.ts +7 -0
  35. package/dist/commands/rollups/create.d.ts.map +1 -0
  36. package/dist/commands/rollups/create.js +36 -0
  37. package/dist/commands/rollups/deploy.d.ts +16 -0
  38. package/dist/commands/rollups/deploy.d.ts.map +1 -0
  39. package/dist/commands/rollups/deploy.js +237 -0
  40. package/dist/commands/rollups/logs.d.ts +11 -0
  41. package/dist/commands/rollups/logs.d.ts.map +1 -0
  42. package/dist/commands/rollups/logs.js +32 -0
  43. package/dist/commands/rollups/start.d.ts +14 -0
  44. package/dist/commands/rollups/start.d.ts.map +1 -0
  45. package/dist/commands/rollups/start.js +211 -0
  46. package/dist/commands/rollups/status.d.ts +7 -0
  47. package/dist/commands/rollups/status.d.ts.map +1 -0
  48. package/dist/commands/rollups/status.js +46 -0
  49. package/dist/commands/rollups/stop.d.ts +5 -0
  50. package/dist/commands/rollups/stop.d.ts.map +1 -0
  51. package/dist/commands/rollups/stop.js +26 -0
  52. package/dist/commands/rollups.d.ts +6 -0
  53. package/dist/commands/rollups.d.ts.map +1 -0
  54. package/dist/commands/rollups.js +21 -0
  55. package/dist/commands/run.d.ts +2 -20
  56. package/dist/commands/run.d.ts.map +1 -1
  57. package/dist/commands/run.js +9 -190
  58. package/dist/commands/send/erc20.d.ts +11 -13
  59. package/dist/commands/send/erc20.d.ts.map +1 -1
  60. package/dist/commands/send/erc20.js +57 -52
  61. package/dist/commands/send/erc721.d.ts +11 -13
  62. package/dist/commands/send/erc721.d.ts.map +1 -1
  63. package/dist/commands/send/erc721.js +51 -46
  64. package/dist/commands/send/ether.d.ts +11 -12
  65. package/dist/commands/send/ether.d.ts.map +1 -1
  66. package/dist/commands/send/ether.js +25 -21
  67. package/dist/commands/send/generic.d.ts +12 -14
  68. package/dist/commands/send/generic.d.ts.map +1 -1
  69. package/dist/commands/send/generic.js +92 -97
  70. package/dist/commands/send.d.ts +21 -0
  71. package/dist/commands/send.d.ts.map +1 -0
  72. package/dist/commands/send.js +67 -0
  73. package/dist/commands/shell.d.ts +6 -14
  74. package/dist/commands/shell.d.ts.map +1 -1
  75. package/dist/commands/shell.js +21 -43
  76. package/dist/compose/rollups/default.env +34 -0
  77. package/dist/compose/rollups/docker-compose-anvil.yaml +17 -0
  78. package/dist/{node → compose/rollups}/docker-compose-bundler.yaml +12 -26
  79. package/dist/{node → compose/rollups}/docker-compose-database.yaml +4 -2
  80. package/dist/compose/rollups/docker-compose-espresso.yaml +68 -0
  81. package/dist/compose/rollups/docker-compose-explorer.yaml +57 -0
  82. package/dist/compose/rollups/docker-compose-graphql.yaml +23 -0
  83. package/dist/compose/rollups/docker-compose-node-cpus.yaml +6 -0
  84. package/dist/compose/rollups/docker-compose-node-memory.yaml +6 -0
  85. package/dist/compose/rollups/docker-compose-node.yaml +26 -0
  86. package/dist/compose/rollups/docker-compose-paymaster.yaml +18 -0
  87. package/dist/compose/rollups/docker-compose-proxy.yaml +24 -0
  88. package/dist/compose/rollups/proxy/anvil.yaml +17 -0
  89. package/dist/compose/rollups/proxy/bundler.yaml +17 -0
  90. package/dist/compose/rollups/proxy/espresso.yaml +17 -0
  91. package/dist/compose/rollups/proxy/explorer-api.yaml +17 -0
  92. package/dist/compose/rollups/proxy/explorer.yaml +10 -0
  93. package/dist/compose/rollups/proxy/graphql.yaml +10 -0
  94. package/dist/compose/rollups/proxy/paymaster.yaml +17 -0
  95. package/dist/compose/rollups/proxy/rollups-node.yaml +17 -0
  96. package/dist/config.d.ts +2 -1
  97. package/dist/config.d.ts.map +1 -1
  98. package/dist/config.js +7 -17
  99. package/dist/contracts.d.ts +1695 -1636
  100. package/dist/contracts.d.ts.map +1 -1
  101. package/dist/contracts.js +632 -592
  102. package/dist/exec/cartesi-machine.d.ts.map +1 -1
  103. package/dist/exec/crane.d.ts +1 -1
  104. package/dist/exec/crane.d.ts.map +1 -1
  105. package/dist/exec/genext2fs.d.ts.map +1 -1
  106. package/dist/exec/mksquashfs.d.ts.map +1 -1
  107. package/dist/exec/rollups.d.ts +16 -0
  108. package/dist/exec/rollups.d.ts.map +1 -0
  109. package/dist/exec/rollups.js +39 -0
  110. package/dist/exec/util.d.ts +1 -1
  111. package/dist/exec/util.d.ts.map +1 -1
  112. package/dist/exec/util.js +2 -0
  113. package/dist/index.d.ts +2 -1
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +53 -1
  116. package/dist/machine.d.ts.map +1 -1
  117. package/dist/prompts.d.ts.map +1 -1
  118. package/dist/template.d.ts +3 -0
  119. package/dist/template.d.ts.map +1 -0
  120. package/dist/template.js +16 -0
  121. package/dist/wallet.d.ts.map +1 -1
  122. package/dist/wallet.js +47 -6
  123. package/package.json +30 -47
  124. package/bin/dev.cmd +0 -3
  125. package/bin/dev.js +0 -25
  126. package/bin/run.cmd +0 -3
  127. package/bin/run.js +0 -8
  128. package/dist/baseCommand.d.ts +0 -22
  129. package/dist/baseCommand.d.ts.map +0 -1
  130. package/dist/baseCommand.js +0 -92
  131. package/dist/commands/deploy/index.d.ts +0 -12
  132. package/dist/commands/deploy/index.d.ts.map +0 -1
  133. package/dist/commands/deploy/index.js +0 -78
  134. package/dist/commands/send/index.d.ts +0 -28
  135. package/dist/commands/send/index.d.ts.map +0 -1
  136. package/dist/commands/send/index.js +0 -102
  137. package/dist/flags.d.ts +0 -17
  138. package/dist/flags.d.ts.map +0 -1
  139. package/dist/flags.js +0 -28
  140. package/dist/node/DockerfileDeploy.txt +0 -4
  141. package/dist/node/default.env +0 -27
  142. package/dist/node/docker-compose-anvil.yaml +0 -50
  143. package/dist/node/docker-compose-envfile.yaml +0 -4
  144. package/dist/node/docker-compose-explorer.yaml +0 -88
  145. package/dist/node/docker-compose-host.yaml +0 -30
  146. package/dist/node/docker-compose-paymaster.yaml +0 -33
  147. package/dist/node/docker-compose-prompt.yaml +0 -17
  148. package/dist/node/docker-compose-proxy.yaml +0 -48
  149. package/dist/node/docker-compose-snapshot-volume.yaml +0 -8
  150. package/dist/node/docker-compose-validator-cpus.yaml +0 -6
  151. package/dist/node/docker-compose-validator-memory.yaml +0 -6
  152. package/dist/node/docker-compose-validator.yaml +0 -59
  153. package/oclif.manifest.json +0 -876
@@ -1,50 +1,60 @@
1
+ import { Command } from "@commander-js/extra-typings";
1
2
  import input from "@inquirer/input";
2
- import { erc20Abi, isAddress, parseEther, } from "viem";
3
+ import ora from "ora";
4
+ import { erc20Abi, getAddress, isAddress, parseEther, } from "viem";
3
5
  import { erc20PortalAbi, erc20PortalAddress } from "../../contracts.js";
4
- import * as CustomFlags from "../../flags.js";
5
- import { SendBaseCommand } from "./index.js";
6
- class SendERC20 extends SendBaseCommand {
7
- async readToken(publicClient, address) {
8
- const args = { abi: erc20Abi, address };
9
- const symbol = await publicClient.readContract({
10
- ...args,
11
- functionName: "symbol",
12
- });
13
- const name = await publicClient.readContract({
14
- ...args,
15
- functionName: "name",
16
- });
17
- const decimals = await publicClient.readContract({
18
- ...args,
19
- functionName: "decimals",
20
- });
21
- return {
22
- name,
23
- symbol,
24
- decimals,
25
- };
6
+ import { connect, getInputApplicationAddress, } from "../send.js";
7
+ const readToken = async (publicClient, address) => {
8
+ const args = { abi: erc20Abi, address };
9
+ const symbol = await publicClient.readContract({
10
+ ...args,
11
+ functionName: "symbol",
12
+ });
13
+ const name = await publicClient.readContract({
14
+ ...args,
15
+ functionName: "name",
16
+ });
17
+ const decimals = await publicClient.readContract({
18
+ ...args,
19
+ functionName: "decimals",
20
+ });
21
+ return {
22
+ name,
23
+ symbol,
24
+ decimals,
25
+ };
26
+ };
27
+ const ercValidator = (publicClient) => async (value) => {
28
+ if (!isAddress(value)) {
29
+ return "Invalid address";
26
30
  }
27
- async send(publicClient, walletClient) {
31
+ try {
32
+ await readToken(publicClient, value);
33
+ }
34
+ catch (e) {
35
+ return "Invalid token";
36
+ }
37
+ return true;
38
+ };
39
+ export const createErc20Command = () => {
40
+ return new Command("erc20")
41
+ .description("Sends ERC-20 deposits to the application, optionally in interactive mode.")
42
+ .configureHelp({ showGlobalOptions: true })
43
+ .option("--token <address>", "token address")
44
+ .option("--amount <number>", "amount to send")
45
+ .action(async (options, command) => {
46
+ const sendOptions = command.optsWithGlobals();
47
+ // connect to RPC provider
48
+ const { publicClient, walletClient } = await connect(sendOptions);
28
49
  // get dapp address from local node, or ask
29
- const applicationAddress = await super.getApplicationAddress();
30
- const ercValidator = async (value) => {
31
- if (!isAddress(value)) {
32
- return "Invalid address";
33
- }
34
- try {
35
- await this.readToken(publicClient, value);
36
- }
37
- catch (e) {
38
- return "Invalid token";
39
- }
40
- return true;
41
- };
42
- const tokenAddress = this.flags.token ||
43
- (await input({
50
+ const applicationAddress = await getInputApplicationAddress(sendOptions.dapp);
51
+ const tokenAddress = options.token && isAddress(options.token)
52
+ ? getAddress(options.token)
53
+ : (await input({
44
54
  message: "Token address",
45
- validate: ercValidator,
55
+ validate: ercValidator(publicClient),
46
56
  }));
47
- const amount = this.flags.amount || (await input({ message: "Amount" }));
57
+ const amount = options.amount || (await input({ message: "Amount" }));
48
58
  const { request } = await publicClient.simulateContract({
49
59
  address: erc20PortalAddress,
50
60
  abi: erc20PortalAbi,
@@ -52,19 +62,14 @@ class SendERC20 extends SendBaseCommand {
52
62
  args: [
53
63
  tokenAddress,
54
64
  applicationAddress,
55
- parseEther(amount),
65
+ parseEther(amount), // XXX: we need to use the token decimals here!
56
66
  "0x",
57
67
  ],
58
68
  account: walletClient.account,
59
69
  });
60
- return walletClient.writeContract(request);
61
- }
62
- }
63
- SendERC20.summary = "Send ERC-20 deposit to the application.";
64
- SendERC20.description = "Sends ERC-20 deposits to the application, optionally in interactive mode.";
65
- SendERC20.flags = {
66
- token: CustomFlags.address({ description: "token address" }),
67
- amount: CustomFlags.number({ description: "amount" }),
70
+ const hash = await walletClient.writeContract(request);
71
+ const progress = ora("Sending input...").start();
72
+ await publicClient.waitForTransactionReceipt({ hash });
73
+ progress.succeed(`Input sent: ${hash}`);
74
+ });
68
75
  };
69
- SendERC20.examples = ["<%= config.bin %> <%= command.id %>"];
70
- export default SendERC20;
@@ -1,14 +1,12 @@
1
- import { Address, PublicClient, WalletClient } from "viem";
2
- import { SendBaseCommand } from "./index.js";
3
- export default class SendERC721 extends SendBaseCommand<typeof SendERC721> {
4
- static summary: string;
5
- static description: string;
6
- static flags: {
7
- token: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<`0x${string}` | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
8
- tokenId: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<bigint | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
- };
10
- static examples: string[];
11
- private readToken;
12
- send(publicClient: PublicClient, walletClient: WalletClient): Promise<Address>;
13
- }
1
+ import { Command } from "@commander-js/extra-typings";
2
+ export declare const createErc721Command: () => Command<[], {
3
+ token?: string | undefined;
4
+ tokenId?: string | undefined;
5
+ }, {
6
+ chainId: number;
7
+ rpcUrl?: string | undefined;
8
+ mnemonic?: string | undefined;
9
+ mnemonicIndex: number;
10
+ dapp?: `0x${string}` | undefined;
11
+ }>;
14
12
  //# sourceMappingURL=erc721.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"erc721.d.ts","sourceRoot":"","sources":["../../../src/commands/send/erc721.ts"],"names":[],"mappings":"AACA,OAAO,EACH,OAAO,EAGP,YAAY,EACZ,YAAY,EACf,MAAM,MAAM,CAAC;AAId,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAO7C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,eAAe,CAAC,OAAO,UAAU,CAAC;IACtE,MAAM,CAAC,OAAO,SAA8C;IAE5D,MAAM,CAAC,WAAW,SAC+D;IAEjF,MAAM,CAAC,KAAK;;;MAGV;IAEF,MAAM,CAAC,QAAQ,WAA2C;YAE5C,SAAS;IAmBV,IAAI,CACb,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,GAC3B,OAAO,CAAC,OAAO,CAAC;CAkDtB"}
1
+ {"version":3,"file":"erc721.d.ts","sourceRoot":"","sources":["../../../src/commands/send/erc721.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAiDtD,eAAO,MAAM,mBAAmB;;;;;;;;;EAuD/B,CAAC"}
@@ -1,45 +1,55 @@
1
+ import { Command } from "@commander-js/extra-typings";
1
2
  import input from "@inquirer/input";
2
- import { erc721Abi, isAddress, } from "viem";
3
+ import ora from "ora";
4
+ import { erc721Abi, getAddress, isAddress } from "viem";
3
5
  import { erc721PortalAbi, erc721PortalAddress } from "../../contracts.js";
4
- import * as CustomFlags from "../../flags.js";
5
- import { SendBaseCommand } from "./index.js";
6
- class SendERC721 extends SendBaseCommand {
7
- async readToken(publicClient, address) {
8
- const args = { abi: erc721Abi, address };
9
- const symbol = await publicClient.readContract({
10
- ...args,
11
- functionName: "symbol",
12
- });
13
- const name = await publicClient.readContract({
14
- ...args,
15
- functionName: "name",
16
- });
17
- return {
18
- name,
19
- symbol,
20
- };
6
+ import { connect, getInputApplicationAddress, } from "../send.js";
7
+ const readToken = async (publicClient, address) => {
8
+ const args = { abi: erc721Abi, address };
9
+ const symbol = await publicClient.readContract({
10
+ ...args,
11
+ functionName: "symbol",
12
+ });
13
+ const name = await publicClient.readContract({
14
+ ...args,
15
+ functionName: "name",
16
+ });
17
+ return {
18
+ name,
19
+ symbol,
20
+ };
21
+ };
22
+ const ercValidator = (publicClient) => async (value) => {
23
+ if (!isAddress(value)) {
24
+ return "Invalid address";
25
+ }
26
+ try {
27
+ await readToken(publicClient, value);
21
28
  }
22
- async send(publicClient, walletClient) {
29
+ catch (e) {
30
+ return "Invalid token";
31
+ }
32
+ return true;
33
+ };
34
+ export const createErc721Command = () => {
35
+ return new Command("erc721")
36
+ .description("Sends ERC-721 deposits to the application, optionally in interactive mode.")
37
+ .configureHelp({ showGlobalOptions: true })
38
+ .option("--token <address>", "token address")
39
+ .option("--token-id <number>", "token ID")
40
+ .action(async (options, command) => {
41
+ const sendOptions = command.optsWithGlobals();
42
+ // connect to RPC provider
43
+ const { publicClient, walletClient } = await connect(sendOptions);
23
44
  // get dapp address from local node, or ask
24
- const applicationAddress = await super.getApplicationAddress();
25
- const ercValidator = async (value) => {
26
- if (!isAddress(value)) {
27
- return "Invalid address";
28
- }
29
- try {
30
- await this.readToken(publicClient, value);
31
- }
32
- catch (e) {
33
- return "Invalid token";
34
- }
35
- return true;
36
- };
37
- const token = this.flags.token ||
38
- (await input({
45
+ const applicationAddress = await getInputApplicationAddress(sendOptions.dapp);
46
+ const token = options.token && isAddress(options.token)
47
+ ? getAddress(options.token)
48
+ : (await input({
39
49
  message: "Token address",
40
- validate: ercValidator,
50
+ validate: ercValidator(publicClient),
41
51
  }));
42
- const tokenId = this.flags.tokenId ||
52
+ const tokenId = options.tokenId ||
43
53
  (await input({
44
54
  message: "Token ID",
45
55
  validate: (value) => {
@@ -60,14 +70,9 @@ class SendERC721 extends SendBaseCommand {
60
70
  account: walletClient.account,
61
71
  });
62
72
  // XXX: add support for baseLayerData and execLayerData
63
- return walletClient.writeContract(request);
64
- }
65
- }
66
- SendERC721.summary = "Send ERC-721 deposit to the application.";
67
- SendERC721.description = "Sends ERC-721 deposits to the application, optionally in interactive mode.";
68
- SendERC721.flags = {
69
- token: CustomFlags.address({ description: "token address" }),
70
- tokenId: CustomFlags.bigint({ description: "token ID" }),
73
+ const hash = await walletClient.writeContract(request);
74
+ const progress = ora("Sending input...").start();
75
+ await publicClient.waitForTransactionReceipt({ hash });
76
+ progress.succeed(`Input sent: ${hash}`);
77
+ });
71
78
  };
72
- SendERC721.examples = ["<%= config.bin %> <%= command.id %>"];
73
- export default SendERC721;
@@ -1,13 +1,12 @@
1
- import { Address, PublicClient, WalletClient } from "viem";
2
- import { SendBaseCommand } from "./index.js";
3
- export default class SendEther extends SendBaseCommand<typeof SendEther> {
4
- static summary: string;
5
- static description: string;
6
- static flags: {
7
- amount: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<`${number}` | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
8
- execLayerData: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<`0x${string}`, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
- };
10
- static examples: string[];
11
- send(publicClient: PublicClient, walletClient: WalletClient): Promise<Address>;
12
- }
1
+ import { Command } from "@commander-js/extra-typings";
2
+ export declare const createEtherCommand: () => Command<[], {
3
+ amount?: string | undefined;
4
+ execLayerData: string;
5
+ }, {
6
+ chainId: number;
7
+ rpcUrl?: string | undefined;
8
+ mnemonic?: string | undefined;
9
+ mnemonicIndex: number;
10
+ dapp?: `0x${string}` | undefined;
11
+ }>;
13
12
  //# sourceMappingURL=ether.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ether.d.ts","sourceRoot":"","sources":["../../../src/commands/send/ether.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAc,YAAY,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAIvE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,eAAe,CAAC,OAAO,SAAS,CAAC;IACpE,MAAM,CAAC,OAAO,SAA4C;IAE1D,MAAM,CAAC,WAAW,SAC6D;IAE/E,MAAM,CAAC,KAAK;;;MAMV;IAEF,MAAM,CAAC,QAAQ,WAA2C;IAE7C,IAAI,CACb,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,GAC3B,OAAO,CAAC,OAAO,CAAC;CAkBtB"}
1
+ {"version":3,"file":"ether.d.ts","sourceRoot":"","sources":["../../../src/commands/send/ether.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAWtD,eAAO,MAAM,kBAAkB;;;;;;;;;EAuC9B,CAAC"}
@@ -1,32 +1,36 @@
1
+ import { Command } from "@commander-js/extra-typings";
1
2
  import input from "@inquirer/input";
2
- import { parseEther } from "viem";
3
+ import ora from "ora";
4
+ import { isHex, parseEther } from "viem";
3
5
  import { etherPortalAbi, etherPortalAddress } from "../../contracts.js";
4
- import * as CustomFlags from "../../flags.js";
5
- import { SendBaseCommand } from "./index.js";
6
- class SendEther extends SendBaseCommand {
7
- async send(publicClient, walletClient) {
6
+ import { connect, getInputApplicationAddress, } from "../send.js";
7
+ export const createEtherCommand = () => {
8
+ return new Command("ether")
9
+ .description("Sends ether deposits to the application, optionally in interactive mode.")
10
+ .configureHelp({ showGlobalOptions: true })
11
+ .option("--amount <number>", "amount, in ETH units")
12
+ .option("--exec-layer-data <hex>", "exec layer data", "0x")
13
+ .action(async (options, command) => {
14
+ const sendOptions = command.optsWithGlobals();
15
+ // connect to RPC provider
16
+ const { publicClient, walletClient } = await connect(sendOptions);
8
17
  // get dapp address from local node, or ask
9
- const applicationAddress = await super.getApplicationAddress();
10
- const amount = this.flags.amount || (await input({ message: "Amount" }));
18
+ const applicationAddress = await getInputApplicationAddress(sendOptions.dapp);
19
+ const amount = options.amount || (await input({ message: "Amount" }));
11
20
  const { request } = await publicClient.simulateContract({
12
21
  address: etherPortalAddress,
13
22
  abi: etherPortalAbi,
14
23
  functionName: "depositEther",
15
- args: [applicationAddress, this.flags.execLayerData],
24
+ args: [
25
+ applicationAddress,
26
+ isHex(options.execLayerData) ? options.execLayerData : "0x", // XXX: validate before this
27
+ ],
16
28
  value: parseEther(amount),
17
29
  account: walletClient.account,
18
30
  });
19
- return walletClient.writeContract(request);
20
- }
21
- }
22
- SendEther.summary = "Send ether deposit to the application.";
23
- SendEther.description = "Sends ether deposits to the application, optionally in interactive mode.";
24
- SendEther.flags = {
25
- amount: CustomFlags.number({ description: "amount, in ETH units" }),
26
- execLayerData: CustomFlags.hex({
27
- description: "exec layer data",
28
- default: "0x",
29
- }),
31
+ const hash = await walletClient.writeContract(request);
32
+ const progress = ora("Sending input...").start();
33
+ await publicClient.waitForTransactionReceipt({ hash });
34
+ progress.succeed(`Input sent: ${hash}`);
35
+ });
30
36
  };
31
- SendEther.examples = ["<%= config.bin %> <%= command.id %>"];
32
- export default SendEther;
@@ -1,15 +1,13 @@
1
- import { Address, PublicClient, WalletClient } from "viem";
2
- import { SendBaseCommand } from "./index.js";
3
- export default class SendGeneric extends SendBaseCommand<typeof SendGeneric> {
4
- static summary: string;
5
- static description: string;
6
- static examples: string[];
7
- static flags: {
8
- input: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
- "input-encoding": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
- "input-abi-params": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
11
- };
12
- protected getInput(): Promise<`0x${string}` | undefined>;
13
- send(publicClient: PublicClient, walletClient: WalletClient): Promise<Address>;
14
- }
1
+ import { Command } from "@commander-js/extra-typings";
2
+ export declare const createGenericCommand: () => Command<[], {
3
+ input?: string | undefined;
4
+ inputEncoding?: "string" | "hex" | "abi" | undefined;
5
+ inputAbiParams?: string | undefined;
6
+ }, {
7
+ chainId: number;
8
+ rpcUrl?: string | undefined;
9
+ mnemonic?: string | undefined;
10
+ mnemonicIndex: number;
11
+ dapp?: `0x${string}` | undefined;
12
+ }>;
15
13
  //# sourceMappingURL=generic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generic.d.ts","sourceRoot":"","sources":["../../../src/commands/send/generic.ts"],"names":[],"mappings":"AACA,OAAO,EACH,OAAO,EACP,YAAY,EACZ,YAAY,EAOf,MAAM,MAAM,CAAC;AAId,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,eAAe,CAAC,OAAO,WAAW,CAAC;IACxE,MAAM,CAAC,OAAO,SAA4C;IAE1D,MAAM,CAAC,WAAW,SAC8D;IAEhF,MAAM,CAAC,QAAQ,WAA2C;IAE1D,MAAM,CAAC,KAAK;;;;MAgBV;cAEc,QAAQ,IAAI,OAAO,CAAC,KAAK,MAAM,EAAE,GAAG,SAAS,CAAC;IA8EjD,IAAI,CACb,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,GAC3B,OAAO,CAAC,OAAO,CAAC;CAgBtB"}
1
+ {"version":3,"file":"generic.d.ts","sourceRoot":"","sources":["../../../src/commands/send/generic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,6BAA6B,CAAC;AAoG9D,eAAO,MAAM,oBAAoB;;;;;;;;;;EAyChC,CAAC"}
@@ -1,93 +1,104 @@
1
- import { Flags } from "@oclif/core";
1
+ import { Command, Option } from "@commander-js/extra-typings";
2
+ import ora from "ora";
2
3
  import { encodeAbiParameters, getAddress, isAddress, isHex, parseAbiParameters, stringToHex, } from "viem";
3
4
  import { inputBoxAbi, inputBoxAddress } from "../../contracts.js";
4
5
  import { bytesInput } from "../../prompts.js";
5
- import { SendBaseCommand } from "./index.js";
6
- class SendGeneric extends SendBaseCommand {
7
- async getInput() {
8
- const input = this.flags.input;
9
- const encoding = this.flags["input-encoding"];
10
- if (input) {
11
- if (encoding === "hex") {
12
- // validate if is a hex value
13
- if (!isHex(input)) {
14
- throw new Error("input encoded as hex must start with 0x");
15
- }
16
- return input;
6
+ import { connect, getInputApplicationAddress, } from "../send.js";
7
+ const getInput = async (options) => {
8
+ const input = options.input;
9
+ const encoding = options.inputEncoding;
10
+ if (input) {
11
+ if (encoding === "hex") {
12
+ // validate if is a hex value
13
+ if (!isHex(input)) {
14
+ throw new Error("input encoded as hex must start with 0x");
17
15
  }
18
- else if (encoding === "string") {
19
- // encode UTF-8 string as hex
20
- return stringToHex(input);
16
+ return input;
17
+ }
18
+ else if (encoding === "string") {
19
+ // encode UTF-8 string as hex
20
+ return stringToHex(input);
21
+ }
22
+ else if (encoding === "abi") {
23
+ const abiParams = options.inputAbiParams;
24
+ if (!abiParams) {
25
+ throw new Error("Undefined input-abi-params");
21
26
  }
22
- else if (encoding === "abi") {
23
- const abiParams = this.flags["input-abi-params"];
24
- if (!abiParams) {
25
- throw new Error("Undefined input-abi-params");
27
+ const abiParameters = parseAbiParameters(abiParams);
28
+ // TODO: decode values
29
+ const values = input.split(",").map((v, index) => {
30
+ if (index >= abiParameters.length) {
31
+ throw new Error(`Too many values, expected ${abiParameters.length} values based on --input-abi-params '${abiParams}', parsing value at index ${index} from input '${input}'`);
26
32
  }
27
- const abiParameters = parseAbiParameters(abiParams);
28
- // TODO: decode values
29
- const values = input.split(",").map((v, index) => {
30
- if (index >= abiParameters.length) {
31
- throw new Error(`Too many values, expected ${abiParameters.length} values based on --input-abi-params '${abiParams}', parsing value at index ${index} from input '${input}'`);
32
- }
33
- const param = abiParameters[index];
34
- switch (param.type) {
35
- case "string":
33
+ const param = abiParameters[index];
34
+ switch (param.type) {
35
+ case "string":
36
+ return v;
37
+ case "bool":
38
+ if (v === "true")
39
+ return true;
40
+ if (v === "false")
41
+ return false;
42
+ throw new Error(`Invalid boolean value: ${v}`);
43
+ case "uint":
44
+ case "uint8":
45
+ case "uint16":
46
+ case "uint32":
47
+ case "uint64":
48
+ case "uint128":
49
+ case "uint256":
50
+ try {
51
+ return BigInt(v);
52
+ }
53
+ catch (e) {
54
+ throw new Error(`Invalid uint value: ${v}`);
55
+ }
56
+ case "bytes":
57
+ if (isHex(v)) {
36
58
  return v;
37
- case "bool":
38
- if (v === "true")
39
- return true;
40
- if (v === "false")
41
- return false;
42
- throw new Error(`Invalid boolean value: ${v}`);
43
- case "uint":
44
- case "uint8":
45
- case "uint16":
46
- case "uint32":
47
- case "uint64":
48
- case "uint128":
49
- case "uint256":
50
- try {
51
- return BigInt(v);
52
- }
53
- catch (e) {
54
- throw new Error(`Invalid uint value: ${v}`);
55
- }
56
- case "bytes":
57
- if (isHex(v)) {
58
- return v;
59
- }
60
- throw new Error(`Invalid bytes value: ${v}`);
61
- case "address":
62
- if (isAddress(v)) {
63
- return getAddress(v);
64
- }
65
- throw new Error(`Invalid address value: ${v}`);
66
- default:
67
- throw new Error(`Unsupported type ${param.type}`);
68
- }
69
- });
70
- if (values.length !== abiParameters.length) {
71
- throw new Error(`Not enough values, expected ${abiParameters.length} values based on --input-abi-params '${abiParams}', parsed ${values.length} values from input '${input}'`);
59
+ }
60
+ throw new Error(`Invalid bytes value: ${v}`);
61
+ case "address":
62
+ if (isAddress(v)) {
63
+ return getAddress(v);
64
+ }
65
+ throw new Error(`Invalid address value: ${v}`);
66
+ default:
67
+ throw new Error(`Unsupported type ${param.type}`);
72
68
  }
73
- return encodeAbiParameters(abiParameters, values);
69
+ });
70
+ if (values.length !== abiParameters.length) {
71
+ throw new Error(`Not enough values, expected ${abiParameters.length} values based on --input-abi-params '${abiParams}', parsed ${values.length} values from input '${input}'`);
72
+ }
73
+ return encodeAbiParameters(abiParameters, values);
74
+ }
75
+ else {
76
+ if (isHex(input)) {
77
+ return input;
74
78
  }
75
79
  else {
76
- if (isHex(input)) {
77
- return input;
78
- }
79
- else {
80
- // encode UTF-8 string as hex
81
- return stringToHex(input);
82
- }
80
+ // encode UTF-8 string as hex
81
+ return stringToHex(input);
83
82
  }
84
83
  }
85
- return undefined;
86
84
  }
87
- async send(publicClient, walletClient) {
85
+ return undefined;
86
+ };
87
+ export const createGenericCommand = () => {
88
+ return new Command("generic")
89
+ .description("Sends generics inputs to the application, optionally in interactive mode.")
90
+ .configureHelp({ showGlobalOptions: true })
91
+ .option("--input <input>", "input payload")
92
+ .addOption(new Option("--input-encoding <input-encoding>", "input encoding").choices(["hex", "string", "abi"]))
93
+ .option("--input-abi-params <input-abi-params>", "input abi params")
94
+ .action(async (options, command) => {
95
+ const sendOptions = command.optsWithGlobals();
96
+ // connect to RPC provider
97
+ const { publicClient, walletClient } = await connect(sendOptions);
88
98
  // get dapp address from local node, or ask
89
- const applicationAddress = await super.getApplicationAddress();
90
- const payload = (await this.getInput()) || (await bytesInput({ message: "Input" }));
99
+ const applicationAddress = await getInputApplicationAddress(sendOptions.dapp);
100
+ const payload = (await getInput(options)) ||
101
+ (await bytesInput({ message: "Input" }));
91
102
  const { request } = await publicClient.simulateContract({
92
103
  address: inputBoxAddress,
93
104
  abi: inputBoxAbi,
@@ -95,25 +106,9 @@ class SendGeneric extends SendBaseCommand {
95
106
  args: [applicationAddress, payload],
96
107
  account: walletClient.account,
97
108
  });
98
- return walletClient.writeContract(request);
99
- }
100
- }
101
- SendGeneric.summary = "Send generic input to the application.";
102
- SendGeneric.description = "Sends generics inputs to the application, optionally in interactive mode.";
103
- SendGeneric.examples = ["<%= config.bin %> <%= command.id %>"];
104
- SendGeneric.flags = {
105
- input: Flags.string({
106
- description: "input payload",
107
- summary: "see input-encoding for definition on how input is parsed",
108
- }),
109
- "input-encoding": Flags.string({
110
- description: "input encoding",
111
- summary: "if input-encoding is undefined, the input is parsed as a hex-string if it starts with 0x or else is parsed as a UTF-8 encoding",
112
- options: ["hex", "string", "abi"],
113
- }),
114
- "input-abi-params": Flags.string({
115
- description: "input abi params",
116
- summary: "ABI params definition for input, following human-readable format specified at https://abitype.dev/api/human.html#parseabiparameters",
117
- }),
109
+ const hash = await walletClient.writeContract(request);
110
+ const progress = ora("Sending input...").start();
111
+ await publicClient.waitForTransactionReceipt({ hash });
112
+ progress.succeed(`Input sent: ${hash}`);
113
+ });
118
114
  };
119
- export default SendGeneric;
@@ -0,0 +1,21 @@
1
+ import { Command } from "@commander-js/extra-typings";
2
+ import { Address, PublicClient, WalletClient } from "viem";
3
+ export declare const connect: (options: {
4
+ chainId?: number;
5
+ rpcUrl?: string;
6
+ mnemonic?: string;
7
+ mnemonicIndex: number;
8
+ }) => Promise<{
9
+ publicClient: PublicClient;
10
+ walletClient: WalletClient;
11
+ }>;
12
+ export declare const getInputApplicationAddress: (dapp?: string) => Promise<Address>;
13
+ export declare const createSendCommand: () => Command<[], {
14
+ chainId: number;
15
+ rpcUrl?: string | undefined;
16
+ mnemonic?: string | undefined;
17
+ mnemonicIndex: number;
18
+ dapp?: `0x${string}` | undefined;
19
+ }, {}>;
20
+ export type SendCommandOpts = ReturnType<ReturnType<typeof createSendCommand>["opts"]>;
21
+ //# sourceMappingURL=send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAGtD,OAAO,EAAE,OAAO,EAAa,YAAY,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAStE,eAAO,MAAM,OAAO,GAAI,SAAS;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACzB,KAAG,OAAO,CAAC;IACR,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;CAC9B,CAYA,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACnC,OAAO,MAAM,KACd,OAAO,CAAC,OAAO,CAiBjB,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;MA6C7B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,UAAU,CACpC,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAC/C,CAAC"}