@aztec/cli 0.0.0-test.0

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 (218) hide show
  1. package/README.md +449 -0
  2. package/dest/cmds/contracts/index.d.ts +4 -0
  3. package/dest/cmds/contracts/index.d.ts.map +1 -0
  4. package/dest/cmds/contracts/index.js +12 -0
  5. package/dest/cmds/contracts/inspect_contract.d.ts +3 -0
  6. package/dest/cmds/contracts/inspect_contract.d.ts.map +1 -0
  7. package/dest/cmds/contracts/inspect_contract.js +37 -0
  8. package/dest/cmds/contracts/parse_parameter_struct.d.ts +3 -0
  9. package/dest/cmds/contracts/parse_parameter_struct.d.ts.map +1 -0
  10. package/dest/cmds/contracts/parse_parameter_struct.js +13 -0
  11. package/dest/cmds/devnet/bootstrap_network.d.ts +3 -0
  12. package/dest/cmds/devnet/bootstrap_network.d.ts.map +1 -0
  13. package/dest/cmds/devnet/bootstrap_network.js +196 -0
  14. package/dest/cmds/devnet/faucet.d.ts +4 -0
  15. package/dest/cmds/devnet/faucet.d.ts.map +1 -0
  16. package/dest/cmds/devnet/faucet.js +26 -0
  17. package/dest/cmds/devnet/index.d.ts +4 -0
  18. package/dest/cmds/devnet/index.d.ts.map +1 -0
  19. package/dest/cmds/devnet/index.js +14 -0
  20. package/dest/cmds/infrastructure/index.d.ts +4 -0
  21. package/dest/cmds/infrastructure/index.d.ts.map +1 -0
  22. package/dest/cmds/infrastructure/index.js +24 -0
  23. package/dest/cmds/infrastructure/sequencers.d.ts +13 -0
  24. package/dest/cmds/infrastructure/sequencers.d.ts.map +1 -0
  25. package/dest/cmds/infrastructure/sequencers.js +93 -0
  26. package/dest/cmds/infrastructure/setup_l2_contract.d.ts +3 -0
  27. package/dest/cmds/infrastructure/setup_l2_contract.d.ts.map +1 -0
  28. package/dest/cmds/infrastructure/setup_l2_contract.js +43 -0
  29. package/dest/cmds/l1/advance_epoch.d.ts +3 -0
  30. package/dest/cmds/l1/advance_epoch.d.ts.map +1 -0
  31. package/dest/cmds/l1/advance_epoch.js +10 -0
  32. package/dest/cmds/l1/assume_proven_through.d.ts +3 -0
  33. package/dest/cmds/l1/assume_proven_through.d.ts.map +1 -0
  34. package/dest/cmds/l1/assume_proven_through.js +12 -0
  35. package/dest/cmds/l1/bridge_erc20.d.ts +4 -0
  36. package/dest/cmds/l1/bridge_erc20.d.ts.map +1 -0
  37. package/dest/cmds/l1/bridge_erc20.js +31 -0
  38. package/dest/cmds/l1/create_l1_account.d.ts +3 -0
  39. package/dest/cmds/l1/create_l1_account.d.ts.map +1 -0
  40. package/dest/cmds/l1/create_l1_account.js +15 -0
  41. package/dest/cmds/l1/deploy_l1_contracts.d.ts +4 -0
  42. package/dest/cmds/l1/deploy_l1_contracts.d.ts.map +1 -0
  43. package/dest/cmds/l1/deploy_l1_contracts.js +29 -0
  44. package/dest/cmds/l1/deploy_l1_verifier.d.ts +5 -0
  45. package/dest/cmds/l1/deploy_l1_verifier.d.ts.map +1 -0
  46. package/dest/cmds/l1/deploy_l1_verifier.js +54 -0
  47. package/dest/cmds/l1/deploy_new_rollup.d.ts +4 -0
  48. package/dest/cmds/l1/deploy_new_rollup.d.ts.map +1 -0
  49. package/dest/cmds/l1/deploy_new_rollup.js +19 -0
  50. package/dest/cmds/l1/get_l1_addresses.d.ts +4 -0
  51. package/dest/cmds/l1/get_l1_addresses.d.ts.map +1 -0
  52. package/dest/cmds/l1/get_l1_addresses.js +18 -0
  53. package/dest/cmds/l1/get_l1_balance.d.ts +4 -0
  54. package/dest/cmds/l1/get_l1_balance.d.ts.map +1 -0
  55. package/dest/cmds/l1/get_l1_balance.js +33 -0
  56. package/dest/cmds/l1/governance_utils.d.ts +50 -0
  57. package/dest/cmds/l1/governance_utils.d.ts.map +1 -0
  58. package/dest/cmds/l1/governance_utils.js +85 -0
  59. package/dest/cmds/l1/index.d.ts +4 -0
  60. package/dest/cmds/l1/index.d.ts.map +1 -0
  61. package/dest/cmds/l1/index.js +208 -0
  62. package/dest/cmds/l1/prover_stats.d.ts +14 -0
  63. package/dest/cmds/l1/prover_stats.d.ts.map +1 -0
  64. package/dest/cmds/l1/prover_stats.js +145 -0
  65. package/dest/cmds/l1/update_l1_validators.d.ts +30 -0
  66. package/dest/cmds/l1/update_l1_validators.d.ts.map +1 -0
  67. package/dest/cmds/l1/update_l1_validators.js +186 -0
  68. package/dest/cmds/misc/compute_selector.d.ts +3 -0
  69. package/dest/cmds/misc/compute_selector.d.ts.map +1 -0
  70. package/dest/cmds/misc/compute_selector.js +5 -0
  71. package/dest/cmds/misc/example_contracts.d.ts +3 -0
  72. package/dest/cmds/misc/example_contracts.d.ts.map +1 -0
  73. package/dest/cmds/misc/example_contracts.js +6 -0
  74. package/dest/cmds/misc/generate_bootnode_enr.d.ts +3 -0
  75. package/dest/cmds/misc/generate_bootnode_enr.d.ts.map +1 -0
  76. package/dest/cmds/misc/generate_bootnode_enr.js +5 -0
  77. package/dest/cmds/misc/generate_p2p_private_key.d.ts +3 -0
  78. package/dest/cmds/misc/generate_p2p_private_key.d.ts.map +1 -0
  79. package/dest/cmds/misc/generate_p2p_private_key.js +7 -0
  80. package/dest/cmds/misc/generate_secret_and_hash.d.ts +3 -0
  81. package/dest/cmds/misc/generate_secret_and_hash.d.ts.map +1 -0
  82. package/dest/cmds/misc/generate_secret_and_hash.js +11 -0
  83. package/dest/cmds/misc/generate_secret_key.d.ts +5 -0
  84. package/dest/cmds/misc/generate_secret_key.d.ts.map +1 -0
  85. package/dest/cmds/misc/generate_secret_key.js +6 -0
  86. package/dest/cmds/misc/index.d.ts +4 -0
  87. package/dest/cmds/misc/index.d.ts.map +1 -0
  88. package/dest/cmds/misc/index.js +44 -0
  89. package/dest/cmds/misc/setup_contracts.d.ts +7 -0
  90. package/dest/cmds/misc/setup_contracts.d.ts.map +1 -0
  91. package/dest/cmds/misc/setup_contracts.js +27 -0
  92. package/dest/cmds/misc/update/common.d.ts +17 -0
  93. package/dest/cmds/misc/update/common.d.ts.map +1 -0
  94. package/dest/cmds/misc/update/common.js +3 -0
  95. package/dest/cmds/misc/update/github.d.ts +4 -0
  96. package/dest/cmds/misc/update/github.d.ts.map +1 -0
  97. package/dest/cmds/misc/update/github.js +3 -0
  98. package/dest/cmds/misc/update/noir.d.ts +10 -0
  99. package/dest/cmds/misc/update/noir.d.ts.map +1 -0
  100. package/dest/cmds/misc/update/noir.js +45 -0
  101. package/dest/cmds/misc/update/npm.d.ts +34 -0
  102. package/dest/cmds/misc/update/npm.d.ts.map +1 -0
  103. package/dest/cmds/misc/update/npm.js +127 -0
  104. package/dest/cmds/misc/update/utils.d.ts +14 -0
  105. package/dest/cmds/misc/update/utils.d.ts.map +1 -0
  106. package/dest/cmds/misc/update/utils.js +38 -0
  107. package/dest/cmds/misc/update.d.ts +3 -0
  108. package/dest/cmds/misc/update.d.ts.map +1 -0
  109. package/dest/cmds/misc/update.js +52 -0
  110. package/dest/cmds/pxe/add_contract.d.ts +5 -0
  111. package/dest/cmds/pxe/add_contract.d.ts.map +1 -0
  112. package/dest/cmds/pxe/add_contract.js +29 -0
  113. package/dest/cmds/pxe/block_number.d.ts +3 -0
  114. package/dest/cmds/pxe/block_number.d.ts.map +1 -0
  115. package/dest/cmds/pxe/block_number.js +10 -0
  116. package/dest/cmds/pxe/get_account.d.ts +4 -0
  117. package/dest/cmds/pxe/get_account.d.ts.map +1 -0
  118. package/dest/cmds/pxe/get_account.js +10 -0
  119. package/dest/cmds/pxe/get_accounts.d.ts +3 -0
  120. package/dest/cmds/pxe/get_accounts.d.ts.map +1 -0
  121. package/dest/cmds/pxe/get_accounts.js +25 -0
  122. package/dest/cmds/pxe/get_block.d.ts +3 -0
  123. package/dest/cmds/pxe/get_block.d.ts.map +1 -0
  124. package/dest/cmds/pxe/get_block.js +9 -0
  125. package/dest/cmds/pxe/get_contract_data.d.ts +4 -0
  126. package/dest/cmds/pxe/get_contract_data.d.ts.map +1 -0
  127. package/dest/cmds/pxe/get_contract_data.js +31 -0
  128. package/dest/cmds/pxe/get_current_base_fee.d.ts +3 -0
  129. package/dest/cmds/pxe/get_current_base_fee.d.ts.map +1 -0
  130. package/dest/cmds/pxe/get_current_base_fee.js +7 -0
  131. package/dest/cmds/pxe/get_l1_to_l2_message_witness.d.ts +4 -0
  132. package/dest/cmds/pxe/get_l1_to_l2_message_witness.d.ts.map +1 -0
  133. package/dest/cmds/pxe/get_l1_to_l2_message_witness.js +11 -0
  134. package/dest/cmds/pxe/get_logs.d.ts +4 -0
  135. package/dest/cmds/pxe/get_logs.d.ts.map +1 -0
  136. package/dest/cmds/pxe/get_logs.js +51 -0
  137. package/dest/cmds/pxe/get_node_info.d.ts +3 -0
  138. package/dest/cmds/pxe/get_node_info.d.ts.map +1 -0
  139. package/dest/cmds/pxe/get_node_info.js +61 -0
  140. package/dest/cmds/pxe/get_pxe_info.d.ts +3 -0
  141. package/dest/cmds/pxe/get_pxe_info.d.ts.map +1 -0
  142. package/dest/cmds/pxe/get_pxe_info.js +11 -0
  143. package/dest/cmds/pxe/index.d.ts +4 -0
  144. package/dest/cmds/pxe/index.d.ts.map +1 -0
  145. package/dest/cmds/pxe/index.js +55 -0
  146. package/dest/utils/aztec.d.ts +68 -0
  147. package/dest/utils/aztec.d.ts.map +1 -0
  148. package/dest/utils/aztec.js +174 -0
  149. package/dest/utils/commands.d.ts +143 -0
  150. package/dest/utils/commands.d.ts.map +1 -0
  151. package/dest/utils/commands.js +303 -0
  152. package/dest/utils/encoding.d.ts +15 -0
  153. package/dest/utils/encoding.d.ts.map +1 -0
  154. package/dest/utils/encoding.js +103 -0
  155. package/dest/utils/github.d.ts +4 -0
  156. package/dest/utils/github.d.ts.map +1 -0
  157. package/dest/utils/github.js +3 -0
  158. package/dest/utils/index.d.ts +5 -0
  159. package/dest/utils/index.d.ts.map +1 -0
  160. package/dest/utils/index.js +4 -0
  161. package/dest/utils/inspect.d.ts +17 -0
  162. package/dest/utils/inspect.d.ts.map +1 -0
  163. package/dest/utils/inspect.js +177 -0
  164. package/package.json +125 -0
  165. package/src/cmds/contracts/index.ts +34 -0
  166. package/src/cmds/contracts/inspect_contract.ts +51 -0
  167. package/src/cmds/contracts/parse_parameter_struct.ts +27 -0
  168. package/src/cmds/devnet/bootstrap_network.ts +318 -0
  169. package/src/cmds/devnet/faucet.ts +33 -0
  170. package/src/cmds/devnet/index.ts +60 -0
  171. package/src/cmds/infrastructure/index.ts +55 -0
  172. package/src/cmds/infrastructure/sequencers.ts +103 -0
  173. package/src/cmds/infrastructure/setup_l2_contract.ts +47 -0
  174. package/src/cmds/l1/advance_epoch.ts +12 -0
  175. package/src/cmds/l1/assume_proven_through.ts +19 -0
  176. package/src/cmds/l1/bridge_erc20.ts +52 -0
  177. package/src/cmds/l1/create_l1_account.ts +17 -0
  178. package/src/cmds/l1/deploy_l1_contracts.ts +65 -0
  179. package/src/cmds/l1/deploy_l1_verifier.ts +105 -0
  180. package/src/cmds/l1/deploy_new_rollup.ts +58 -0
  181. package/src/cmds/l1/get_l1_addresses.ts +30 -0
  182. package/src/cmds/l1/get_l1_balance.ts +44 -0
  183. package/src/cmds/l1/governance_utils.ts +187 -0
  184. package/src/cmds/l1/index.ts +558 -0
  185. package/src/cmds/l1/prover_stats.ts +202 -0
  186. package/src/cmds/l1/update_l1_validators.ts +238 -0
  187. package/src/cmds/misc/compute_selector.ts +7 -0
  188. package/src/cmds/misc/example_contracts.ts +12 -0
  189. package/src/cmds/misc/generate_bootnode_enr.ts +12 -0
  190. package/src/cmds/misc/generate_p2p_private_key.ts +10 -0
  191. package/src/cmds/misc/generate_secret_and_hash.ts +15 -0
  192. package/src/cmds/misc/generate_secret_key.ts +5 -0
  193. package/src/cmds/misc/index.ts +92 -0
  194. package/src/cmds/misc/setup_contracts.ts +40 -0
  195. package/src/cmds/misc/update/common.ts +16 -0
  196. package/src/cmds/misc/update/github.ts +3 -0
  197. package/src/cmds/misc/update/noir.ts +57 -0
  198. package/src/cmds/misc/update/npm.ts +154 -0
  199. package/src/cmds/misc/update/utils.ts +50 -0
  200. package/src/cmds/misc/update.ts +78 -0
  201. package/src/cmds/pxe/add_contract.ts +41 -0
  202. package/src/cmds/pxe/block_number.ts +9 -0
  203. package/src/cmds/pxe/get_account.ts +16 -0
  204. package/src/cmds/pxe/get_accounts.ts +35 -0
  205. package/src/cmds/pxe/get_block.ts +10 -0
  206. package/src/cmds/pxe/get_contract_data.ts +51 -0
  207. package/src/cmds/pxe/get_current_base_fee.ts +9 -0
  208. package/src/cmds/pxe/get_l1_to_l2_message_witness.ts +25 -0
  209. package/src/cmds/pxe/get_logs.ts +66 -0
  210. package/src/cmds/pxe/get_node_info.ts +71 -0
  211. package/src/cmds/pxe/get_pxe_info.ts +13 -0
  212. package/src/cmds/pxe/index.ts +170 -0
  213. package/src/utils/aztec.ts +250 -0
  214. package/src/utils/commands.ts +384 -0
  215. package/src/utils/encoding.ts +117 -0
  216. package/src/utils/github.ts +3 -0
  217. package/src/utils/index.ts +4 -0
  218. package/src/utils/inspect.ts +208 -0
package/package.json ADDED
@@ -0,0 +1,125 @@
1
+ {
2
+ "name": "@aztec/cli",
3
+ "version": "0.0.0-test.0",
4
+ "type": "module",
5
+ "exports": {
6
+ "./contracts": "./dest/cmds/contracts/index.js",
7
+ "./devnet": "./dest/cmds/devnet/index.js",
8
+ "./infrastructure": "./dest/cmds/infrastructure/index.js",
9
+ "./l1": "./dest/cmds/l1/index.js",
10
+ "./pxe": "./dest/cmds/pxe/index.js",
11
+ "./cli-utils": "./dest/utils/index.js",
12
+ "./misc": "./dest/cmds/misc/index.js",
13
+ "./setup-contracts": "./dest/cmds/misc/setup_contracts.js",
14
+ "./utils": "./dest/utils/index.js",
15
+ "./inspect": "./dest/utils/inspect.js"
16
+ },
17
+ "typedocOptions": {
18
+ "entryPoints": [
19
+ "./dest/builder/index.js"
20
+ ],
21
+ "name": "Aztec CLI",
22
+ "tsconfig": "./tsconfig.json"
23
+ },
24
+ "scripts": {
25
+ "build": "yarn clean && tsc -b",
26
+ "build:dev": "tsc -b --watch",
27
+ "clean": "rm -rf ./dest .tsbuildinfo",
28
+ "formatting": "run -T prettier --check ./src && run -T eslint ./src",
29
+ "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
30
+ "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}"
31
+ },
32
+ "inherits": [
33
+ "../package.common.json"
34
+ ],
35
+ "jest": {
36
+ "preset": "ts-jest/presets/default-esm",
37
+ "moduleNameMapper": {
38
+ "^(\\.{1,2}/.*)\\.[cm]?js$": "$1"
39
+ },
40
+ "testRegex": "./src/.*\\.test\\.(js|mjs|ts)$",
41
+ "rootDir": "./src",
42
+ "extensionsToTreatAsEsm": [
43
+ ".ts"
44
+ ],
45
+ "transform": {
46
+ "^.+\\.tsx?$": [
47
+ "@swc/jest",
48
+ {
49
+ "jsc": {
50
+ "parser": {
51
+ "syntax": "typescript",
52
+ "decorators": true
53
+ },
54
+ "transform": {
55
+ "decoratorVersion": "2022-03"
56
+ }
57
+ }
58
+ }
59
+ ]
60
+ },
61
+ "reporters": [
62
+ "default"
63
+ ],
64
+ "testTimeout": 120000,
65
+ "setupFiles": [
66
+ "../../foundation/src/jest/setup.mjs"
67
+ ]
68
+ },
69
+ "dependencies": {
70
+ "@aztec/archiver": "0.0.0-test.0",
71
+ "@aztec/aztec.js": "0.0.0-test.0",
72
+ "@aztec/constants": "0.0.0-test.0",
73
+ "@aztec/foundation": "0.0.0-test.0",
74
+ "@aztec/l1-artifacts": "0.0.0-test.0",
75
+ "@aztec/p2p": "0.0.0-test.0",
76
+ "@aztec/stdlib": "0.0.0-test.0",
77
+ "@aztec/world-state": "0.0.0-test.0",
78
+ "@iarna/toml": "^2.2.5",
79
+ "@libp2p/peer-id-factory": "^3.0.4",
80
+ "commander": "^12.1.0",
81
+ "lodash.chunk": "^4.2.0",
82
+ "lodash.groupby": "^4.6.0",
83
+ "semver": "^7.5.4",
84
+ "source-map-support": "^0.5.21",
85
+ "tslib": "^2.4.0",
86
+ "viem": "2.22.8"
87
+ },
88
+ "devDependencies": {
89
+ "@aztec/accounts": "0.0.0-test.0",
90
+ "@aztec/ethereum": "0.0.0-test.0",
91
+ "@aztec/protocol-contracts": "0.0.0-test.0",
92
+ "@jest/globals": "^29.5.0",
93
+ "@types/jest": "^29.5.0",
94
+ "@types/lodash.chunk": "^4.2.9",
95
+ "@types/lodash.groupby": "^4.6.9",
96
+ "@types/lodash.startcase": "^4.4.7",
97
+ "@types/node": "^18.7.23",
98
+ "@types/semver": "^7.5.2",
99
+ "@types/source-map-support": "^0.5.10",
100
+ "jest": "^29.5.0",
101
+ "jest-mock-extended": "^3.0.5",
102
+ "ts-jest": "^29.1.0",
103
+ "ts-node": "^10.9.1",
104
+ "typescript": "^5.0.4"
105
+ },
106
+ "peerDependencies": {
107
+ "@aztec/accounts": "0.0.0-test.0",
108
+ "@aztec/bb-prover": "0.0.0-test.0",
109
+ "@aztec/ethereum": "0.0.0-test.0",
110
+ "@aztec/l1-artifacts": "0.0.0-test.0",
111
+ "@aztec/noir-contracts.js": "0.0.0-test.0",
112
+ "@aztec/noir-protocol-circuits-types": "0.0.0-test.0",
113
+ "@aztec/protocol-contracts": "0.0.0-test.0",
114
+ "@aztec/stdlib": "0.0.0-test.0"
115
+ },
116
+ "files": [
117
+ "dest",
118
+ "src",
119
+ "!*.test.*"
120
+ ],
121
+ "types": "./dest/index.d.ts",
122
+ "engines": {
123
+ "node": ">=18"
124
+ }
125
+ }
@@ -0,0 +1,34 @@
1
+ import type { LogFn, Logger } from '@aztec/foundation/log';
2
+
3
+ import type { Command } from 'commander';
4
+
5
+ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger) {
6
+ program
7
+ .command('inspect-contract')
8
+ .description('Shows list of external callable functions for a contract')
9
+ .argument(
10
+ '<contractArtifactFile>',
11
+ `A compiled Noir contract's artifact in JSON format or name of a contract artifact exported by @aztec/noir-contracts.js`,
12
+ )
13
+ .action(async (contractArtifactFile: string) => {
14
+ const { inspectContract } = await import('./inspect_contract.js');
15
+ await inspectContract(contractArtifactFile, debugLogger, log);
16
+ });
17
+
18
+ // Helper for users to decode hex strings into structs if needed.
19
+ program
20
+ .command('parse-parameter-struct')
21
+ .description("Helper for parsing an encoded string into a contract's parameter struct.")
22
+ .argument('<encodedString>', 'The encoded hex string')
23
+ .requiredOption(
24
+ '-c, --contract-artifact <fileLocation>',
25
+ "A compiled Aztec.nr contract's ABI in JSON format or name of a contract ABI exported by @aztec/noir-contracts.js",
26
+ )
27
+ .requiredOption('-p, --parameter <parameterName>', 'The name of the struct parameter to decode into')
28
+ .action(async (encodedString, options) => {
29
+ const { parseParameterStruct } = await import('./parse_parameter_struct.js');
30
+ await parseParameterStruct(encodedString, options.contractArtifact, options.parameter, log);
31
+ });
32
+
33
+ return program;
34
+ }
@@ -0,0 +1,51 @@
1
+ import { sha256 } from '@aztec/foundation/crypto';
2
+ import type { LogFn, Logger } from '@aztec/foundation/log';
3
+ import {
4
+ type FunctionArtifact,
5
+ FunctionSelector,
6
+ decodeFunctionSignature,
7
+ decodeFunctionSignatureWithParameterNames,
8
+ } from '@aztec/stdlib/abi';
9
+ import { getContractClassFromArtifact } from '@aztec/stdlib/contract';
10
+
11
+ import { getContractArtifact } from '../../utils/aztec.js';
12
+
13
+ export async function inspectContract(contractArtifactFile: string, debugLogger: Logger, log: LogFn) {
14
+ const contractArtifact = await getContractArtifact(contractArtifactFile, log);
15
+ const contractFns = contractArtifact.functions;
16
+ if (contractFns.length === 0) {
17
+ log(`No functions found for contract ${contractArtifact.name}`);
18
+ }
19
+ const contractClass = await getContractClassFromArtifact(contractArtifact);
20
+ const bytecodeLengthInFields = 1 + Math.ceil(contractClass.packedBytecode.length / 31);
21
+
22
+ log(`Contract class details:`);
23
+ log(`\tidentifier: ${contractClass.id.toString()}`);
24
+ log(`\tartifact hash: ${contractClass.artifactHash.toString()}`);
25
+ log(`\tprivate function tree root: ${contractClass.privateFunctionsRoot.toString()}`);
26
+ log(`\tpublic bytecode commitment: ${contractClass.publicBytecodeCommitment.toString()}`);
27
+ log(`\tpublic bytecode length: ${contractClass.packedBytecode.length} bytes (${bytecodeLengthInFields} fields)`);
28
+
29
+ const externalFunctions = contractFns.filter(f => !f.isInternal);
30
+ if (externalFunctions.length > 0) {
31
+ log(`\nExternal functions:`);
32
+ await Promise.all(externalFunctions.map(f => logFunction(f, log)));
33
+ }
34
+
35
+ const internalFunctions = contractFns.filter(f => f.isInternal);
36
+ if (internalFunctions.length > 0) {
37
+ log(`\nInternal functions:`);
38
+ await Promise.all(internalFunctions.map(f => logFunction(f, log)));
39
+ }
40
+ }
41
+
42
+ async function logFunction(fn: FunctionArtifact, log: LogFn) {
43
+ const signatureWithParameterNames = decodeFunctionSignatureWithParameterNames(fn.name, fn.parameters);
44
+ const signature = decodeFunctionSignature(fn.name, fn.parameters);
45
+ const selector = await FunctionSelector.fromSignature(signature);
46
+ const bytecodeSize = fn.bytecode.length;
47
+ const bytecodeHash = sha256(fn.bytecode).toString('hex');
48
+ log(
49
+ `${fn.functionType} ${signatureWithParameterNames} \n\tfunction signature: ${signature}\n\tselector: ${selector}\n\tbytecode: ${bytecodeSize} bytes (sha256 ${bytecodeHash})`,
50
+ );
51
+ }
@@ -0,0 +1,27 @@
1
+ import { jsonStringify } from '@aztec/foundation/json-rpc';
2
+ import type { LogFn } from '@aztec/foundation/log';
3
+ import type { StructType } from '@aztec/stdlib/abi';
4
+
5
+ import { getContractArtifact } from '../../utils/aztec.js';
6
+ import { parseStructString } from '../../utils/encoding.js';
7
+
8
+ export async function parseParameterStruct(
9
+ encodedString: string,
10
+ contractArtifactPath: string,
11
+ parameterName: string,
12
+ log: LogFn,
13
+ ) {
14
+ const contractArtifact = await getContractArtifact(contractArtifactPath, log);
15
+ const parameterAbitype = contractArtifact.functions
16
+ .map(({ parameters }) => parameters)
17
+ .flat()
18
+ .find(({ name, type }) => name === parameterName && type.kind === 'struct');
19
+
20
+ if (!parameterAbitype) {
21
+ log(`No struct parameter found with name ${parameterName}`);
22
+ return;
23
+ }
24
+
25
+ const data = parseStructString(encodedString, parameterAbitype.type as StructType);
26
+ log(`\nStruct Data: \n${jsonStringify(data, true)}\n`);
27
+ }
@@ -0,0 +1,318 @@
1
+ import { getDeployedTestAccountsWallets } from '@aztec/accounts/testing';
2
+ import {
3
+ AztecAddress,
4
+ BatchCall,
5
+ EthAddress,
6
+ Fr,
7
+ L1FeeJuicePortalManager,
8
+ type PXE,
9
+ type WaitOpts,
10
+ type Wallet,
11
+ createCompatibleClient,
12
+ retryUntil,
13
+ } from '@aztec/aztec.js';
14
+ import { FEE_FUNDING_FOR_TESTER_ACCOUNT } from '@aztec/constants';
15
+ import {
16
+ type ContractArtifacts,
17
+ type L1Clients,
18
+ createEthereumChain,
19
+ createL1Clients,
20
+ deployL1Contract,
21
+ } from '@aztec/ethereum';
22
+ import type { LogFn, Logger } from '@aztec/foundation/log';
23
+
24
+ import { getContract } from 'viem';
25
+ import { mnemonicToAccount, privateKeyToAccount } from 'viem/accounts';
26
+
27
+ type ContractDeploymentInfo = {
28
+ address: AztecAddress;
29
+ initHash: Fr;
30
+ salt: Fr;
31
+ };
32
+
33
+ const waitOpts: WaitOpts = {
34
+ timeout: 120,
35
+ provenTimeout: 4800,
36
+ interval: 1,
37
+ };
38
+
39
+ export async function bootstrapNetwork(
40
+ pxeUrl: string,
41
+ l1Urls: string[],
42
+ l1ChainId: string,
43
+ l1PrivateKey: `0x${string}` | undefined,
44
+ l1Mnemonic: string,
45
+ addressIndex: number,
46
+ json: boolean,
47
+ log: LogFn,
48
+ debugLog: Logger,
49
+ ) {
50
+ const pxe = await createCompatibleClient(pxeUrl, debugLog);
51
+
52
+ const [wallet] = await getDeployedTestAccountsWallets(pxe);
53
+
54
+ const l1Clients = createL1Clients(
55
+ l1Urls,
56
+ l1PrivateKey
57
+ ? privateKeyToAccount(l1PrivateKey)
58
+ : // We need to use a different account that the main "deployer" account because the "deployer" account creates transactions that send blobs.
59
+ // Note that this account needs to be funded on L1 !
60
+ mnemonicToAccount(l1Mnemonic, { addressIndex }),
61
+ createEthereumChain(l1Urls, +l1ChainId).chainInfo,
62
+ );
63
+
64
+ const { erc20Address, portalAddress } = await deployERC20(l1Clients);
65
+
66
+ const { token, bridge } = await deployToken(wallet, portalAddress);
67
+
68
+ await initPortal(pxe, l1Clients, erc20Address, portalAddress, bridge.address);
69
+
70
+ const fpcAdmin = wallet.getAddress();
71
+ const fpc = await deployFPC(wallet, token.address, fpcAdmin);
72
+
73
+ const counter = await deployCounter(wallet);
74
+
75
+ await fundFPC(counter.address, wallet, l1Clients, fpc.address, debugLog);
76
+
77
+ if (json) {
78
+ log(
79
+ JSON.stringify(
80
+ {
81
+ devCoinL1: erc20Address.toString(),
82
+ devCoinPortalL1: portalAddress.toString(),
83
+ devCoin: {
84
+ address: token.address.toString(),
85
+ initHash: token.initHash.toString(),
86
+ salt: token.salt.toString(),
87
+ },
88
+ devCoinBridge: {
89
+ address: bridge.address.toString(),
90
+ initHash: bridge.initHash.toString(),
91
+ salt: bridge.salt.toString(),
92
+ },
93
+ devCoinFpc: {
94
+ address: fpc.address.toString(),
95
+ initHash: fpc.initHash.toString(),
96
+ salt: fpc.salt.toString(),
97
+ },
98
+ counter: {
99
+ address: counter.address.toString(),
100
+ initHash: counter.initHash.toString(),
101
+ salt: counter.salt.toString(),
102
+ },
103
+ },
104
+ null,
105
+ 2,
106
+ ),
107
+ );
108
+ } else {
109
+ log(`DevCoin L1: ${erc20Address}`);
110
+ log(`DevCoin L1 Portal: ${portalAddress}`);
111
+ log(`DevCoin L2: ${token.address}`);
112
+ log(`DevCoin L2 init hash: ${token.initHash}`);
113
+ log(`DevCoin L2 salt: ${token.salt}`);
114
+ log(`DevCoin L2 Bridge: ${bridge.address}`);
115
+ log(`DevCoin L2 Bridge init hash: ${bridge.initHash}`);
116
+ log(`DevCoin L2 Bridge salt: ${bridge.salt}`);
117
+ log(`DevCoin FPC: ${fpc.address}`);
118
+ log(`DevCoin FPC init hash: ${fpc.initHash}`);
119
+ log(`DevCoin FPC salt: ${fpc.salt}`);
120
+ log(`Counter: ${counter.address}`);
121
+ log(`Counter init hash: ${counter.initHash}`);
122
+ log(`Counter salt: ${counter.salt}`);
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Step 1. Deploy the L1 contracts, but don't initialize
128
+ */
129
+ async function deployERC20({ walletClient, publicClient }: L1Clients) {
130
+ const { TestERC20Abi, TestERC20Bytecode, TokenPortalAbi, TokenPortalBytecode } = await import('@aztec/l1-artifacts');
131
+
132
+ const erc20: ContractArtifacts = {
133
+ contractAbi: TestERC20Abi,
134
+ contractBytecode: TestERC20Bytecode,
135
+ };
136
+ const portal: ContractArtifacts = {
137
+ contractAbi: TokenPortalAbi,
138
+ contractBytecode: TokenPortalBytecode,
139
+ };
140
+
141
+ const { address: erc20Address } = await deployL1Contract(
142
+ walletClient,
143
+ publicClient,
144
+ erc20.contractAbi,
145
+ erc20.contractBytecode,
146
+ ['DevCoin', 'DEV', walletClient.account.address],
147
+ );
148
+ const { address: portalAddress } = await deployL1Contract(
149
+ walletClient,
150
+ publicClient,
151
+ portal.contractAbi,
152
+ portal.contractBytecode,
153
+ );
154
+
155
+ return {
156
+ erc20Address,
157
+ portalAddress,
158
+ };
159
+ }
160
+
161
+ /**
162
+ * Step 2. Deploy the L2 contracts
163
+ */
164
+ async function deployToken(
165
+ wallet: Wallet,
166
+ l1Portal: EthAddress,
167
+ ): Promise<{ token: ContractDeploymentInfo; bridge: ContractDeploymentInfo }> {
168
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
169
+ // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment
170
+ const { TokenContract } = await import('@aztec/noir-contracts.js/Token');
171
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
172
+ // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment
173
+ const { TokenBridgeContract } = await import('@aztec/noir-contracts.js/TokenBridge');
174
+ const devCoin = await TokenContract.deploy(wallet, wallet.getAddress(), 'DevCoin', 'DEV', 18)
175
+ .send({ universalDeploy: true })
176
+ .deployed(waitOpts);
177
+ const bridge = await TokenBridgeContract.deploy(wallet, devCoin.address, l1Portal)
178
+ .send({ universalDeploy: true })
179
+ .deployed(waitOpts);
180
+
181
+ await new BatchCall(wallet, [
182
+ await devCoin.methods.set_minter(bridge.address, true).request(),
183
+ await devCoin.methods.set_admin(bridge.address).request(),
184
+ ])
185
+ .send()
186
+ .wait(waitOpts);
187
+
188
+ return {
189
+ token: {
190
+ address: devCoin.address,
191
+ initHash: devCoin.instance.initializationHash,
192
+ salt: devCoin.instance.salt,
193
+ },
194
+ bridge: {
195
+ address: bridge.address,
196
+ initHash: bridge.instance.initializationHash,
197
+ salt: bridge.instance.salt,
198
+ },
199
+ };
200
+ }
201
+
202
+ /**
203
+ * Step 3. Initialize DevCoin's L1 portal
204
+ */
205
+ async function initPortal(
206
+ pxe: PXE,
207
+ { walletClient, publicClient }: L1Clients,
208
+ erc20: EthAddress,
209
+ portal: EthAddress,
210
+ bridge: AztecAddress,
211
+ ) {
212
+ const { TokenPortalAbi } = await import('@aztec/l1-artifacts');
213
+ const {
214
+ l1ContractAddresses: { registryAddress },
215
+ } = await pxe.getNodeInfo();
216
+
217
+ const contract = getContract({
218
+ abi: TokenPortalAbi,
219
+ address: portal.toString(),
220
+ client: walletClient,
221
+ });
222
+
223
+ const hash = await contract.write.initialize([registryAddress.toString(), erc20.toString(), bridge.toString()]);
224
+
225
+ await publicClient.waitForTransactionReceipt({ hash });
226
+ }
227
+
228
+ async function deployFPC(
229
+ wallet: Wallet,
230
+ tokenAddress: AztecAddress,
231
+ admin: AztecAddress,
232
+ ): Promise<ContractDeploymentInfo> {
233
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
234
+ // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment
235
+ const { FPCContract } = await import('@aztec/noir-contracts.js/FPC');
236
+ const fpc = await FPCContract.deploy(wallet, tokenAddress, admin).send({ universalDeploy: true }).deployed(waitOpts);
237
+ const info: ContractDeploymentInfo = {
238
+ address: fpc.address,
239
+ initHash: fpc.instance.initializationHash,
240
+ salt: fpc.instance.salt,
241
+ };
242
+ return info;
243
+ }
244
+
245
+ async function deployCounter(wallet: Wallet): Promise<ContractDeploymentInfo> {
246
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
247
+ // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment
248
+ const { CounterContract } = await import('@aztec/noir-contracts.js/Counter');
249
+ const counter = await CounterContract.deploy(wallet, 1, wallet.getAddress())
250
+ .send({ universalDeploy: true })
251
+ .deployed(waitOpts);
252
+ const info: ContractDeploymentInfo = {
253
+ address: counter.address,
254
+ initHash: counter.instance.initializationHash,
255
+ salt: counter.instance.salt,
256
+ };
257
+ return info;
258
+ }
259
+
260
+ // NOTE: Disabling for now in order to get devnet running
261
+ async function fundFPC(
262
+ counterAddress: AztecAddress,
263
+ wallet: Wallet,
264
+ l1Clients: L1Clients,
265
+ fpcAddress: AztecAddress,
266
+ debugLog: Logger,
267
+ ) {
268
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
269
+ // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment
270
+ const { FeeJuiceContract } = await import('@aztec/noir-contracts.js/FeeJuice');
271
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
272
+ // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment
273
+ const { CounterContract } = await import('@aztec/noir-contracts.js/Counter');
274
+ const {
275
+ protocolContractAddresses: { feeJuice },
276
+ } = await wallet.getPXEInfo();
277
+
278
+ const feeJuiceContract = await FeeJuiceContract.at(feeJuice, wallet);
279
+
280
+ const feeJuicePortal = await L1FeeJuicePortalManager.new(
281
+ wallet,
282
+ l1Clients.publicClient,
283
+ l1Clients.walletClient,
284
+ debugLog,
285
+ );
286
+
287
+ const amount = FEE_FUNDING_FOR_TESTER_ACCOUNT;
288
+ const { claimAmount, claimSecret, messageLeafIndex, messageHash } = await feeJuicePortal.bridgeTokensPublic(
289
+ fpcAddress,
290
+ amount,
291
+ true,
292
+ );
293
+
294
+ await retryUntil(
295
+ async () => await wallet.isL1ToL2MessageSynced(Fr.fromHexString(messageHash)),
296
+ 'message sync',
297
+ 600,
298
+ 1,
299
+ );
300
+
301
+ const counter = await CounterContract.at(counterAddress, wallet);
302
+
303
+ debugLog.info('Incrementing Counter');
304
+
305
+ // TODO (alexg) remove this once sequencer builds blocks continuously
306
+ // advance the chain
307
+ await counter.methods.increment(wallet.getAddress(), wallet.getAddress()).send().wait(waitOpts);
308
+ await counter.methods.increment(wallet.getAddress(), wallet.getAddress()).send().wait(waitOpts);
309
+
310
+ debugLog.info('Claiming FPC');
311
+
312
+ await feeJuiceContract.methods
313
+ .claim(fpcAddress, claimAmount, claimSecret, messageLeafIndex)
314
+ .send()
315
+ .wait({ ...waitOpts, proven: true });
316
+
317
+ debugLog.info('Finished claiming FPC');
318
+ }
@@ -0,0 +1,33 @@
1
+ import type { EthAddress } from '@aztec/foundation/eth-address';
2
+ import type { LogFn } from '@aztec/foundation/log';
3
+
4
+ import { prettyPrintJSON } from '../../utils/commands.js';
5
+
6
+ export async function dripFaucet(
7
+ faucetUrl: string,
8
+ asset: string,
9
+ account: EthAddress,
10
+ json: boolean,
11
+ log: LogFn,
12
+ ): Promise<void> {
13
+ const url = new URL(`/drip/${account.toString()}`, faucetUrl);
14
+ url.searchParams.set('asset', asset);
15
+ const res = await fetch(url);
16
+ if (res.status === 200) {
17
+ if (json) {
18
+ log(prettyPrintJSON({ ok: true }));
19
+ } else {
20
+ log(`Dripped ${asset} for ${account.toString()}`);
21
+ }
22
+ } else {
23
+ if (json) {
24
+ log(prettyPrintJSON({ ok: false }));
25
+ } else if (res.status === 429) {
26
+ log(`Rate limited when dripping ${asset} for ${account.toString()}`);
27
+ } else {
28
+ log(`Failed to drip ${asset} for ${account.toString()}`);
29
+ }
30
+
31
+ process.exit(1);
32
+ }
33
+ }
@@ -0,0 +1,60 @@
1
+ import type { LogFn, Logger } from '@aztec/foundation/log';
2
+
3
+ import type { Command } from 'commander';
4
+
5
+ import { ETHEREUM_HOSTS, l1ChainIdOption, parseEthereumAddress, pxeOption } from '../../utils/commands.js';
6
+
7
+ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger) {
8
+ program
9
+ .command('bootstrap-network')
10
+ .description('Bootstrap a new network')
11
+ .addOption(pxeOption)
12
+ .addOption(l1ChainIdOption)
13
+ .requiredOption<string[]>(
14
+ '--l1-rpc-urls <string>',
15
+ 'List of Ethereum host URLs. Chain identifiers localhost and testnet can be used (comma separated)',
16
+ (arg: string) => arg.split(','),
17
+ [ETHEREUM_HOSTS],
18
+ )
19
+ .option('--l1-private-key <string>', 'The private key to use for deployment', process.env.PRIVATE_KEY)
20
+ .option(
21
+ '-m, --mnemonic <string>',
22
+ 'The mnemonic to use in deployment',
23
+ 'test test test test test test test test test test test junk',
24
+ )
25
+ .option(
26
+ '-ai, --address-index <number>',
27
+ 'The address index to use when calculating an address',
28
+ arg => BigInt(arg),
29
+ 0n,
30
+ )
31
+ .option('--json', 'Output the result as JSON')
32
+ .action(async options => {
33
+ const { bootstrapNetwork } = await import('./bootstrap_network.js');
34
+ await bootstrapNetwork(
35
+ options[pxeOption.attributeName()],
36
+ options.l1RpcUrls,
37
+ options[l1ChainIdOption.attributeName()],
38
+ options.l1PrivateKey,
39
+ options.mnemonic,
40
+ options.addressIndex,
41
+ options.json,
42
+ log,
43
+ debugLogger,
44
+ );
45
+ });
46
+
47
+ program
48
+ .command('drip-faucet')
49
+ .description('Drip the faucet')
50
+ .requiredOption('-u, --faucet-url <string>', 'Url of the faucet', 'http://localhost:8082')
51
+ .requiredOption('-t, --token <string>', 'The asset to drip', 'eth')
52
+ .requiredOption('-a, --address <string>', 'The Ethereum address to drip to', parseEthereumAddress)
53
+ .option('--json', 'Output the result as JSON')
54
+ .action(async options => {
55
+ const { dripFaucet } = await import('./faucet.js');
56
+ await dripFaucet(options.faucetUrl, options.token, options.address, options.json, log);
57
+ });
58
+
59
+ return program;
60
+ }