@aztec/end-to-end 0.0.0-test.0 → 0.0.1-commit.21caa21

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 (174) hide show
  1. package/dest/bench/client_flows/benchmark.d.ts +61 -0
  2. package/dest/bench/client_flows/benchmark.d.ts.map +1 -0
  3. package/dest/bench/client_flows/benchmark.js +261 -0
  4. package/dest/bench/client_flows/client_flows_benchmark.d.ts +80 -0
  5. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -0
  6. package/dest/bench/client_flows/client_flows_benchmark.js +334 -0
  7. package/dest/bench/client_flows/config.d.ts +14 -0
  8. package/dest/bench/client_flows/config.d.ts.map +1 -0
  9. package/dest/bench/client_flows/config.js +106 -0
  10. package/dest/bench/client_flows/data_extractor.d.ts +2 -0
  11. package/dest/bench/client_flows/data_extractor.d.ts.map +1 -0
  12. package/dest/bench/client_flows/data_extractor.js +77 -0
  13. package/dest/bench/utils.d.ts +12 -38
  14. package/dest/bench/utils.d.ts.map +1 -1
  15. package/dest/bench/utils.js +26 -66
  16. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +21 -13
  17. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  18. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +85 -57
  19. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +19 -25
  20. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  21. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +50 -70
  22. package/dest/e2e_deploy_contract/deploy_test.d.ts +16 -8
  23. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  24. package/dest/e2e_deploy_contract/deploy_test.js +13 -19
  25. package/dest/e2e_epochs/epochs_test.d.ts +59 -18
  26. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  27. package/dest/e2e_epochs/epochs_test.js +226 -44
  28. package/dest/e2e_fees/bridging_race.notest.d.ts +2 -0
  29. package/dest/e2e_fees/bridging_race.notest.d.ts.map +1 -0
  30. package/dest/e2e_fees/bridging_race.notest.js +63 -0
  31. package/dest/e2e_fees/fees_test.d.ts +21 -10
  32. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  33. package/dest/e2e_fees/fees_test.js +103 -109
  34. package/dest/e2e_l1_publisher/write_json.d.ts +10 -0
  35. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -0
  36. package/dest/e2e_l1_publisher/write_json.js +58 -0
  37. package/dest/e2e_multi_validator/utils.d.ts +12 -0
  38. package/dest/e2e_multi_validator/utils.d.ts.map +1 -0
  39. package/dest/e2e_multi_validator/utils.js +214 -0
  40. package/dest/e2e_nested_contract/nested_contract_test.d.ts +10 -7
  41. package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
  42. package/dest/e2e_nested_contract/nested_contract_test.js +24 -20
  43. package/dest/e2e_p2p/inactivity_slash_test.d.ts +31 -0
  44. package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -0
  45. package/dest/e2e_p2p/inactivity_slash_test.js +139 -0
  46. package/dest/e2e_p2p/p2p_network.d.ts +275 -23
  47. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  48. package/dest/e2e_p2p/p2p_network.js +184 -131
  49. package/dest/e2e_p2p/shared.d.ts +43 -7
  50. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  51. package/dest/e2e_p2p/shared.js +164 -19
  52. package/dest/e2e_token_contract/token_contract_test.d.ts +12 -6
  53. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  54. package/dest/e2e_token_contract/token_contract_test.js +50 -26
  55. package/dest/fixtures/e2e_prover_test.d.ts +63 -0
  56. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -0
  57. package/dest/{e2e_prover → fixtures}/e2e_prover_test.js +104 -105
  58. package/dest/fixtures/fixtures.d.ts +6 -7
  59. package/dest/fixtures/fixtures.d.ts.map +1 -1
  60. package/dest/fixtures/fixtures.js +4 -3
  61. package/dest/fixtures/get_acvm_config.d.ts +2 -2
  62. package/dest/fixtures/get_acvm_config.d.ts.map +1 -1
  63. package/dest/fixtures/get_acvm_config.js +2 -14
  64. package/dest/fixtures/get_bb_config.d.ts +2 -2
  65. package/dest/fixtures/get_bb_config.d.ts.map +1 -1
  66. package/dest/fixtures/get_bb_config.js +10 -17
  67. package/dest/fixtures/index.d.ts +1 -1
  68. package/dest/fixtures/l1_to_l2_messaging.d.ts +9 -6
  69. package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
  70. package/dest/fixtures/l1_to_l2_messaging.js +44 -18
  71. package/dest/fixtures/logging.d.ts +1 -1
  72. package/dest/fixtures/setup_l1_contracts.d.ts +476 -5
  73. package/dest/fixtures/setup_l1_contracts.d.ts.map +1 -1
  74. package/dest/fixtures/setup_l1_contracts.js +4 -4
  75. package/dest/fixtures/setup_p2p_test.d.ts +15 -14
  76. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  77. package/dest/fixtures/setup_p2p_test.js +81 -21
  78. package/dest/fixtures/snapshot_manager.d.ts +17 -9
  79. package/dest/fixtures/snapshot_manager.d.ts.map +1 -1
  80. package/dest/fixtures/snapshot_manager.js +147 -121
  81. package/dest/fixtures/token_utils.d.ts +10 -4
  82. package/dest/fixtures/token_utils.d.ts.map +1 -1
  83. package/dest/fixtures/token_utils.js +28 -12
  84. package/dest/fixtures/utils.d.ts +524 -40
  85. package/dest/fixtures/utils.d.ts.map +1 -1
  86. package/dest/fixtures/utils.js +464 -369
  87. package/dest/fixtures/web3signer.d.ts +5 -0
  88. package/dest/fixtures/web3signer.d.ts.map +1 -0
  89. package/dest/fixtures/web3signer.js +53 -0
  90. package/dest/fixtures/with_telemetry_utils.d.ts +1 -1
  91. package/dest/index.d.ts +1 -1
  92. package/dest/quality_of_service/alert_checker.d.ts +2 -2
  93. package/dest/quality_of_service/alert_checker.d.ts.map +1 -1
  94. package/dest/shared/cross_chain_test_harness.d.ts +39 -34
  95. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  96. package/dest/shared/cross_chain_test_harness.js +104 -50
  97. package/dest/shared/gas_portal_test_harness.d.ts +29 -31
  98. package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
  99. package/dest/shared/gas_portal_test_harness.js +51 -30
  100. package/dest/shared/index.d.ts +1 -1
  101. package/dest/shared/jest_setup.d.ts +1 -1
  102. package/dest/shared/jest_setup.js +1 -1
  103. package/dest/shared/submit-transactions.d.ts +6 -4
  104. package/dest/shared/submit-transactions.d.ts.map +1 -1
  105. package/dest/shared/submit-transactions.js +8 -7
  106. package/dest/shared/uniswap_l1_l2.d.ts +14 -12
  107. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  108. package/dest/shared/uniswap_l1_l2.js +146 -116
  109. package/dest/simulators/index.d.ts +1 -1
  110. package/dest/simulators/lending_simulator.d.ts +7 -11
  111. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  112. package/dest/simulators/lending_simulator.js +15 -16
  113. package/dest/simulators/token_simulator.d.ts +6 -3
  114. package/dest/simulators/token_simulator.d.ts.map +1 -1
  115. package/dest/simulators/token_simulator.js +16 -13
  116. package/dest/spartan/setup_test_wallets.d.ts +26 -11
  117. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  118. package/dest/spartan/setup_test_wallets.js +201 -58
  119. package/dest/spartan/utils.d.ts +116 -313
  120. package/dest/spartan/utils.d.ts.map +1 -1
  121. package/dest/spartan/utils.js +434 -130
  122. package/package.json +65 -58
  123. package/src/bench/client_flows/benchmark.ts +341 -0
  124. package/src/bench/client_flows/client_flows_benchmark.ts +447 -0
  125. package/src/bench/client_flows/config.ts +61 -0
  126. package/src/bench/client_flows/data_extractor.ts +89 -0
  127. package/src/bench/utils.ts +22 -76
  128. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +80 -77
  129. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +65 -106
  130. package/src/e2e_deploy_contract/deploy_test.ts +24 -39
  131. package/src/e2e_epochs/epochs_test.ts +276 -55
  132. package/src/e2e_fees/bridging_race.notest.ts +80 -0
  133. package/src/e2e_fees/fees_test.ts +142 -138
  134. package/src/e2e_l1_publisher/write_json.ts +77 -0
  135. package/src/e2e_multi_validator/utils.ts +258 -0
  136. package/src/e2e_nested_contract/nested_contract_test.ts +29 -19
  137. package/src/e2e_p2p/inactivity_slash_test.ts +182 -0
  138. package/src/e2e_p2p/p2p_network.ts +279 -169
  139. package/src/e2e_p2p/shared.ts +247 -29
  140. package/src/e2e_token_contract/token_contract_test.ts +43 -39
  141. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  142. package/src/{e2e_prover → fixtures}/e2e_prover_test.ts +107 -152
  143. package/src/fixtures/fixtures.ts +4 -3
  144. package/src/fixtures/get_acvm_config.ts +3 -11
  145. package/src/fixtures/get_bb_config.ts +18 -13
  146. package/src/fixtures/l1_to_l2_messaging.ts +53 -23
  147. package/src/fixtures/setup_l1_contracts.ts +6 -7
  148. package/src/fixtures/setup_p2p_test.ts +126 -38
  149. package/src/fixtures/snapshot_manager.ts +187 -139
  150. package/src/fixtures/token_utils.ts +32 -15
  151. package/src/fixtures/utils.ts +580 -434
  152. package/src/fixtures/web3signer.ts +63 -0
  153. package/src/guides/up_quick_start.sh +7 -15
  154. package/src/quality_of_service/alert_checker.ts +1 -1
  155. package/src/shared/cross_chain_test_harness.ts +108 -79
  156. package/src/shared/gas_portal_test_harness.ts +59 -50
  157. package/src/shared/jest_setup.ts +1 -1
  158. package/src/shared/submit-transactions.ts +12 -8
  159. package/src/shared/uniswap_l1_l2.ts +181 -184
  160. package/src/simulators/lending_simulator.ts +14 -15
  161. package/src/simulators/token_simulator.ts +21 -13
  162. package/src/spartan/DEVELOP.md +121 -0
  163. package/src/spartan/setup_test_wallets.ts +251 -93
  164. package/src/spartan/utils.ts +490 -130
  165. package/dest/e2e_prover/e2e_prover_test.d.ts +0 -56
  166. package/dest/e2e_prover/e2e_prover_test.d.ts.map +0 -1
  167. package/dest/sample-dapp/connect.js +0 -12
  168. package/dest/sample-dapp/contracts.js +0 -10
  169. package/dest/sample-dapp/deploy.js +0 -35
  170. package/dest/sample-dapp/index.js +0 -98
  171. package/src/sample-dapp/connect.mjs +0 -16
  172. package/src/sample-dapp/contracts.mjs +0 -14
  173. package/src/sample-dapp/deploy.mjs +0 -40
  174. package/src/sample-dapp/index.mjs +0 -128
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/end-to-end",
3
- "version": "0.0.0-test.0",
3
+ "version": "0.0.1-commit.21caa21",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "inherits": [
@@ -8,10 +8,9 @@
8
8
  "./package.local.json"
9
9
  ],
10
10
  "scripts": {
11
- "build": "yarn clean && tsc -b",
12
- "build:dev": "tsc -b --watch",
11
+ "build": "yarn clean && tsgo -b",
12
+ "build:dev": "tsgo -b --watch",
13
13
  "clean": "rm -rf ./dest .tsbuildinfo",
14
- "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
15
14
  "test:with-alerts": "./scripts/test-with-alerts.sh",
16
15
  "test:e2e": "LOG_LEVEL=${LOG_LEVEL:-verbose} NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --testTimeout=300000 --forceExit",
17
16
  "test:e2e-docker": "./scripts/run_test.sh simple",
@@ -26,89 +25,95 @@
26
25
  "formatting": "run -T prettier --check ./src && run -T eslint ./src"
27
26
  },
28
27
  "dependencies": {
29
- "@aztec/accounts": "0.0.0-test.0",
30
- "@aztec/archiver": "0.0.0-test.0",
31
- "@aztec/aztec": "0.0.0-test.0",
32
- "@aztec/aztec-node": "0.0.0-test.0",
33
- "@aztec/aztec.js": "0.0.0-test.0",
34
- "@aztec/bb-prover": "0.0.0-test.0",
35
- "@aztec/blob-lib": "0.0.0-test.0",
36
- "@aztec/blob-sink": "0.0.0-test.0",
37
- "@aztec/bot": "0.0.0-test.0",
38
- "@aztec/constants": "0.0.0-test.0",
39
- "@aztec/entrypoints": "0.0.0-test.0",
40
- "@aztec/epoch-cache": "0.0.0-test.0",
41
- "@aztec/ethereum": "0.0.0-test.0",
42
- "@aztec/foundation": "0.0.0-test.0",
43
- "@aztec/kv-store": "0.0.0-test.0",
44
- "@aztec/l1-artifacts": "0.0.0-test.0",
45
- "@aztec/merkle-tree": "0.0.0-test.0",
46
- "@aztec/noir-contracts.js": "0.0.0-test.0",
47
- "@aztec/noir-protocol-circuits-types": "0.0.0-test.0",
48
- "@aztec/p2p": "0.0.0-test.0",
49
- "@aztec/protocol-contracts": "0.0.0-test.0",
50
- "@aztec/prover-client": "0.0.0-test.0",
51
- "@aztec/prover-node": "0.0.0-test.0",
52
- "@aztec/pxe": "0.0.0-test.0",
53
- "@aztec/sequencer-client": "0.0.0-test.0",
54
- "@aztec/simulator": "0.0.0-test.0",
55
- "@aztec/stdlib": "0.0.0-test.0",
56
- "@aztec/telemetry-client": "0.0.0-test.0",
57
- "@aztec/validator-client": "0.0.0-test.0",
58
- "@aztec/world-state": "0.0.0-test.0",
28
+ "@aztec/accounts": "0.0.1-commit.21caa21",
29
+ "@aztec/archiver": "0.0.1-commit.21caa21",
30
+ "@aztec/aztec": "0.0.1-commit.21caa21",
31
+ "@aztec/aztec-node": "0.0.1-commit.21caa21",
32
+ "@aztec/aztec.js": "0.0.1-commit.21caa21",
33
+ "@aztec/bb-prover": "0.0.1-commit.21caa21",
34
+ "@aztec/bb.js": "0.0.1-commit.21caa21",
35
+ "@aztec/blob-lib": "0.0.1-commit.21caa21",
36
+ "@aztec/blob-sink": "0.0.1-commit.21caa21",
37
+ "@aztec/bot": "0.0.1-commit.21caa21",
38
+ "@aztec/cli": "0.0.1-commit.21caa21",
39
+ "@aztec/constants": "0.0.1-commit.21caa21",
40
+ "@aztec/entrypoints": "0.0.1-commit.21caa21",
41
+ "@aztec/epoch-cache": "0.0.1-commit.21caa21",
42
+ "@aztec/ethereum": "0.0.1-commit.21caa21",
43
+ "@aztec/foundation": "0.0.1-commit.21caa21",
44
+ "@aztec/kv-store": "0.0.1-commit.21caa21",
45
+ "@aztec/l1-artifacts": "0.0.1-commit.21caa21",
46
+ "@aztec/merkle-tree": "0.0.1-commit.21caa21",
47
+ "@aztec/node-keystore": "0.0.1-commit.21caa21",
48
+ "@aztec/noir-contracts.js": "0.0.1-commit.21caa21",
49
+ "@aztec/noir-noirc_abi": "0.0.1-commit.21caa21",
50
+ "@aztec/noir-protocol-circuits-types": "0.0.1-commit.21caa21",
51
+ "@aztec/noir-test-contracts.js": "0.0.1-commit.21caa21",
52
+ "@aztec/p2p": "0.0.1-commit.21caa21",
53
+ "@aztec/protocol-contracts": "0.0.1-commit.21caa21",
54
+ "@aztec/prover-client": "0.0.1-commit.21caa21",
55
+ "@aztec/prover-node": "0.0.1-commit.21caa21",
56
+ "@aztec/pxe": "0.0.1-commit.21caa21",
57
+ "@aztec/sequencer-client": "0.0.1-commit.21caa21",
58
+ "@aztec/simulator": "0.0.1-commit.21caa21",
59
+ "@aztec/slasher": "0.0.1-commit.21caa21",
60
+ "@aztec/stdlib": "0.0.1-commit.21caa21",
61
+ "@aztec/telemetry-client": "0.0.1-commit.21caa21",
62
+ "@aztec/test-wallet": "0.0.1-commit.21caa21",
63
+ "@aztec/validator-client": "0.0.1-commit.21caa21",
64
+ "@aztec/world-state": "0.0.1-commit.21caa21",
59
65
  "@iarna/toml": "^2.2.5",
60
- "@jest/globals": "^29.5.0",
61
- "@noble/curves": "^1.0.0",
66
+ "@jest/globals": "^30.0.0",
67
+ "@noble/curves": "=1.0.0",
62
68
  "@swc/core": "^1.4.11",
63
69
  "@swc/jest": "^0.2.36",
64
70
  "@types/fs-extra": "^11.0.2",
65
- "@types/jest": "^29.5.0",
66
- "@types/koa": "^2.13.9",
71
+ "@types/jest": "^30.0.0",
72
+ "@types/koa": "^2.15.0",
67
73
  "@types/koa-static": "^4.0.2",
68
- "@types/levelup": "^5.1.2",
69
74
  "@types/lodash.every": "^4.6.7",
70
- "@types/memdown": "^3.0.3",
71
- "@types/node": "^18.7.23",
75
+ "@types/node": "^22.15.17",
72
76
  "@viem/anvil": "^0.0.9",
73
77
  "buffer": "^6.0.3",
74
- "crypto-browserify": "^3.12.0",
78
+ "crypto-browserify": "^3.12.1",
75
79
  "fs-extra": "^11.2.0",
76
80
  "get-port": "^7.1.0",
77
81
  "glob": "^10.3.10",
78
- "jest": "^29.5.0",
79
- "jest-extended": "^4.0.2",
80
- "jest-mock-extended": "^3.0.5",
81
- "koa": "^2.14.2",
82
+ "jest": "^30.0.0",
83
+ "jest-extended": "^6.0.0",
84
+ "jest-mock-extended": "^4.0.0",
85
+ "koa": "^2.16.1",
82
86
  "koa-static": "^5.0.0",
83
- "levelup": "^5.1.1",
84
87
  "lodash.chunk": "^4.2.0",
85
88
  "lodash.compact": "^3.0.1",
86
89
  "lodash.every": "^4.6.0",
87
90
  "lodash.omit": "^4.5.0",
88
- "memdown": "^6.1.1",
91
+ "msgpackr": "^1.11.2",
89
92
  "process": "^0.11.10",
93
+ "snappy": "^7.2.2",
90
94
  "stream-browserify": "^3.0.0",
91
95
  "string-argv": "^0.3.2",
92
- "ts-loader": "^9.4.4",
96
+ "ts-loader": "^9.5.4",
93
97
  "ts-node": "^10.9.1",
94
98
  "tslib": "^2.4.0",
95
- "typescript": "^5.0.4",
99
+ "typescript": "^5.3.3",
96
100
  "util": "^0.12.5",
97
- "viem": "2.22.8",
101
+ "viem": "npm:@aztec/viem@2.38.2",
98
102
  "zod": "^3.23.8"
99
103
  },
100
104
  "devDependencies": {
101
105
  "0x": "^5.7.0",
102
- "@jest/globals": "^29.5.0",
103
- "@types/jest": "^29.5.0",
106
+ "@jest/globals": "^30.0.0",
107
+ "@types/jest": "^30.0.0",
104
108
  "@types/js-yaml": "^4.0.9",
105
109
  "@types/lodash.chunk": "^4.2.9",
110
+ "@typescript/native-preview": "7.0.0-dev.20251126.1",
106
111
  "concurrently": "^7.6.0",
107
- "jest": "^29.5.0",
108
- "jest-extended": "^4.0.2",
112
+ "jest": "^30.0.0",
113
+ "jest-extended": "^6.0.0",
109
114
  "js-yaml": "^4.1.0",
110
115
  "ts-node": "^10.9.1",
111
- "typescript": "^5.0.4"
116
+ "typescript": "^5.3.3"
112
117
  },
113
118
  "files": [
114
119
  "dest",
@@ -117,11 +122,12 @@
117
122
  ],
118
123
  "types": "./dest/index.d.ts",
119
124
  "engines": {
120
- "node": ">=18"
125
+ "node": ">=20.10"
121
126
  },
122
127
  "jest": {
123
128
  "slowTestThreshold": 300,
124
129
  "setupFilesAfterEnv": [
130
+ "../../foundation/src/jest/setupAfterEnv.mjs",
125
131
  "jest-extended/all",
126
132
  "./shared/jest_setup.ts"
127
133
  ],
@@ -155,6 +161,7 @@
155
161
  "testTimeout": 120000,
156
162
  "setupFiles": [
157
163
  "../../foundation/src/jest/setup.mjs"
158
- ]
164
+ ],
165
+ "testEnvironment": "../../foundation/src/jest/env.mjs"
159
166
  }
160
167
  }
@@ -0,0 +1,341 @@
1
+ import {
2
+ ContractFunctionInteraction,
3
+ DeployMethod,
4
+ type DeployOptions,
5
+ type ProfileInteractionOptions,
6
+ } from '@aztec/aztec.js/contracts';
7
+ import type { Logger } from '@aztec/aztec.js/log';
8
+ import { createLogger } from '@aztec/foundation/log';
9
+ import { type PrivateExecutionStep, serializePrivateExecutionSteps } from '@aztec/stdlib/kernel';
10
+ import type { ProvingStats, ProvingTimings, SimulationStats, SimulationTimings } from '@aztec/stdlib/tx';
11
+
12
+ import assert from 'node:assert';
13
+ import { mkdir, writeFile } from 'node:fs/promises';
14
+ import { join } from 'node:path';
15
+
16
+ import type { GithubActionBenchmarkResult } from '../utils.js';
17
+
18
+ const logger = createLogger('bench:profile_capture');
19
+
20
+ const logLevel = ['silent', 'fatal', 'error', 'warn', 'info', 'verbose', 'debug', 'trace'] as const;
21
+ type LogLevel = (typeof logLevel)[number];
22
+
23
+ export type Log = {
24
+ type: LogLevel;
25
+ timestamp: number;
26
+ prefix: string;
27
+ message: string;
28
+ data: any;
29
+ };
30
+
31
+ const GATE_TYPES = [
32
+ 'ecc_op',
33
+ 'busread',
34
+ 'lookup',
35
+ 'pub_inputs',
36
+ 'arithmetic',
37
+ 'delta_range',
38
+ 'elliptic',
39
+ 'memory',
40
+ 'nnf',
41
+ 'poseidon2_external',
42
+ 'poseidon2_internal',
43
+ 'overflow',
44
+ ] as const;
45
+
46
+ type GateType = (typeof GATE_TYPES)[number];
47
+
48
+ type StructuredTrace = {
49
+ [k in GateType]: number;
50
+ };
51
+
52
+ export class ProxyLogger {
53
+ private static instance: ProxyLogger;
54
+ private logs: Log[] = [];
55
+
56
+ private constructor() {}
57
+
58
+ static create() {
59
+ ProxyLogger.instance = new ProxyLogger();
60
+ }
61
+
62
+ static getInstance() {
63
+ return ProxyLogger.instance;
64
+ }
65
+
66
+ createLogger(prefix: string): Logger {
67
+ return new Proxy(createLogger(prefix), {
68
+ get: (target: Logger, prop: keyof Logger) => {
69
+ if (logLevel.includes(prop as (typeof logLevel)[number])) {
70
+ return function (this: Logger, ...data: Parameters<Logger[LogLevel]>) {
71
+ const loggingFn = prop as LogLevel;
72
+ const args = [loggingFn, prefix, ...data] as Parameters<ProxyLogger['handleLog']>;
73
+ ProxyLogger.getInstance().handleLog(...args);
74
+ target[loggingFn].call(this, ...[data[0], data[1]]);
75
+ };
76
+ } else {
77
+ return target[prop];
78
+ }
79
+ },
80
+ });
81
+ }
82
+
83
+ private handleLog(type: (typeof logLevel)[number], prefix: string, message: string, data: any) {
84
+ this.logs.unshift({ type, prefix, message, data, timestamp: Date.now() });
85
+ }
86
+
87
+ public flushLogs() {
88
+ this.logs = [];
89
+ }
90
+
91
+ public getLogs() {
92
+ return this.logs;
93
+ }
94
+ }
95
+
96
+ export type ProverType = 'wasm' | 'native';
97
+
98
+ type CallRecording = {
99
+ // Number of times the function has been called
100
+ calls: number;
101
+ // Maximum time taken by the function (in ms)
102
+ max: number;
103
+ // Minimum time taken by the function (in ms)
104
+ min: number;
105
+ // Average time taken by the function (in ms)
106
+ avg: number;
107
+ // Total time spent in the function, computed as sum of all calls (in ms)
108
+ total: number;
109
+ };
110
+
111
+ type Step = Pick<PrivateExecutionStep, 'functionName' | 'gateCount'> & {
112
+ time: number;
113
+ accGateCount?: number;
114
+ oracles: Record<string, CallRecording>;
115
+ };
116
+
117
+ type ClientFlowBenchmark = {
118
+ name: string;
119
+ timings: Omit<ProvingTimings & SimulationTimings, 'perFunction'> & { witgen: number };
120
+ maxMemory: number;
121
+ rpc: Record<string, CallRecording>;
122
+ proverType: ProverType;
123
+ minimumTrace: StructuredTrace;
124
+ totalGateCount: number;
125
+ steps: Step[];
126
+ error: string | undefined;
127
+ };
128
+
129
+ function getMinimumTrace(logs: Log[]): StructuredTrace {
130
+ const LOG_MESSAGE_CANDIDATE_PADDING = 5;
131
+ const minimumMessage = 'Minimum required block sizes for structured trace';
132
+ const minimumMessageIndex = logs.findIndex(log => log.message.includes(minimumMessage));
133
+ const candidateLogs = logs.slice(
134
+ minimumMessageIndex - GATE_TYPES.length,
135
+ minimumMessageIndex + LOG_MESSAGE_CANDIDATE_PADDING,
136
+ );
137
+
138
+ const traceLogs = candidateLogs
139
+ .filter(log => GATE_TYPES.some(type => log.message.includes(type)))
140
+ .map(log => log.message.split(/\t|\n/))
141
+ .flat()
142
+ .map(log => log.replace(/\(mem: .*\)/, '').trim())
143
+ .filter(Boolean);
144
+
145
+ const traceSizes = traceLogs.map(log => {
146
+ const [gateType, gateSizeStr] = log
147
+ .replace(/\n.*\)$/, '')
148
+ .replace(/bb - /, '')
149
+ .split(':')
150
+ .map(s => s.trim());
151
+ const gateSize = parseInt(gateSizeStr);
152
+ assert(GATE_TYPES.includes(gateType as GateType), `Gate type ${gateType} is not recognized`);
153
+ return { [gateType]: gateSize };
154
+ });
155
+
156
+ assert(traceSizes.length === GATE_TYPES.length, 'Decoded trace sizes do not match expected amount of gate types');
157
+ return traceSizes.reduce((acc, curr) => ({ ...acc, ...curr }), {}) as StructuredTrace;
158
+ }
159
+
160
+ function getMaxMemory(logs: Log[]): number {
161
+ const candidateLogs = logs.slice(0, 100).filter(log => /\(mem: .*MiB\)/.test(log.message));
162
+ const usage = candidateLogs.map(log => {
163
+ const memStr = log ? log.message.slice(log.message.indexOf('(mem: ') + 6, log.message.indexOf('MiB') - 3) : '';
164
+ return memStr ? parseInt(memStr) : 0;
165
+ });
166
+ return Math.max(...usage);
167
+ }
168
+
169
+ export function generateBenchmark(
170
+ flow: string,
171
+ logs: Log[],
172
+ stats: ProvingStats | SimulationStats,
173
+ privateExecutionSteps: PrivateExecutionStep[],
174
+ proverType: ProverType,
175
+ error: string | undefined,
176
+ ): ClientFlowBenchmark {
177
+ let maxMemory = 0;
178
+ let minimumTrace: StructuredTrace;
179
+ try {
180
+ minimumTrace = getMinimumTrace(logs);
181
+ maxMemory = getMaxMemory(logs);
182
+ } catch {
183
+ logger.warn(`Failed obtain minimum trace and max memory for ${flow}. Did you run with REAL_PROOFS=1?`);
184
+ }
185
+
186
+ const steps = privateExecutionSteps.reduce<Step[]>((acc, step, i) => {
187
+ const previousAccGateCount = i === 0 ? 0 : acc[i - 1].accGateCount!;
188
+ return [
189
+ ...acc,
190
+ {
191
+ functionName: step.functionName,
192
+ gateCount: step.gateCount,
193
+ accGateCount: previousAccGateCount + step.gateCount!,
194
+ time: step.timings.witgen,
195
+ oracles: Object.entries(step.timings.oracles ?? {}).reduce(
196
+ (acc, [oracleName, oracleData]) => {
197
+ const total = oracleData.times.reduce((sum, time) => sum + time, 0);
198
+ const calls = oracleData.times.length;
199
+ acc[oracleName] = {
200
+ calls,
201
+ max: Math.max(...oracleData.times),
202
+ min: Math.min(...oracleData.times),
203
+ total,
204
+ avg: total / calls,
205
+ };
206
+ return acc;
207
+ },
208
+ {} as Record<string, CallRecording>,
209
+ ),
210
+ },
211
+ ];
212
+ }, []);
213
+ const timings = stats.timings;
214
+ const totalGateCount = steps[steps.length - 1].accGateCount;
215
+ return {
216
+ name: flow,
217
+ timings: {
218
+ total: timings.total,
219
+ sync: timings.sync!,
220
+ proving: (timings as ProvingTimings).proving,
221
+ unaccounted: timings.unaccounted,
222
+ witgen: timings.perFunction.reduce((acc, fn) => acc + fn.time, 0),
223
+ },
224
+ rpc: Object.entries(stats.nodeRPCCalls ?? {}).reduce(
225
+ (acc, [RPCName, RPCCalls]) => {
226
+ const total = RPCCalls.times.reduce((sum, time) => sum + time, 0);
227
+ const calls = RPCCalls.times.length;
228
+ acc[RPCName] = {
229
+ calls,
230
+ max: Math.max(...RPCCalls.times),
231
+ min: Math.min(...RPCCalls.times),
232
+ total,
233
+ avg: total / calls,
234
+ };
235
+ return acc;
236
+ },
237
+ {} as Record<string, CallRecording>,
238
+ ),
239
+ maxMemory,
240
+ proverType,
241
+ minimumTrace: minimumTrace!,
242
+ totalGateCount: totalGateCount!,
243
+ steps,
244
+ error,
245
+ };
246
+ }
247
+
248
+ export function convertProfileToGHBenchmark(benchmark: ClientFlowBenchmark): GithubActionBenchmarkResult[] {
249
+ const totalRPCCalls = Object.values(benchmark.rpc).reduce((acc, call) => acc + call.calls, 0);
250
+ const benches = [
251
+ {
252
+ name: `${benchmark.name}/witgen`,
253
+ value: benchmark.timings.witgen,
254
+ unit: 'ms',
255
+ },
256
+
257
+ {
258
+ name: `${benchmark.name}/total`,
259
+ value: benchmark.timings.total,
260
+ unit: 'ms',
261
+ },
262
+ {
263
+ name: `${benchmark.name}/sync`,
264
+ value: benchmark.timings.sync!,
265
+ unit: 'ms',
266
+ },
267
+ {
268
+ name: `${benchmark.name}/unaccounted`,
269
+ value: benchmark.timings.unaccounted,
270
+ unit: 'ms',
271
+ },
272
+
273
+ {
274
+ name: `${benchmark.name}/total_gate_count`,
275
+ value: benchmark.totalGateCount,
276
+ unit: 'gates',
277
+ },
278
+ {
279
+ name: `${benchmark.name}/rpc`,
280
+ value: totalRPCCalls,
281
+ unit: 'calls',
282
+ },
283
+ ];
284
+ if (benchmark.timings.proving) {
285
+ benches.push({
286
+ name: `${benchmark.name}/proving`,
287
+ value: benchmark.timings.proving,
288
+ unit: 'ms',
289
+ });
290
+ }
291
+ if (benchmark.maxMemory) {
292
+ benches.push({
293
+ name: `${benchmark.name}/max_memory`,
294
+ value: benchmark.maxMemory,
295
+ unit: 'MiB',
296
+ });
297
+ }
298
+ return benches;
299
+ }
300
+
301
+ export async function captureProfile(
302
+ label: string,
303
+ interaction: ContractFunctionInteraction | DeployMethod,
304
+ opts: Omit<ProfileInteractionOptions & DeployOptions, 'profileMode'>,
305
+ expectedSteps?: number,
306
+ ) {
307
+ // Make sure the proxy logger starts from a clean slate
308
+ ProxyLogger.getInstance().flushLogs();
309
+ const result = await interaction.profile({ ...opts, profileMode: 'full', skipProofGeneration: false });
310
+ const logs = ProxyLogger.getInstance().getLogs();
311
+ if (expectedSteps !== undefined && result.executionSteps.length !== expectedSteps) {
312
+ throw new Error(`Expected ${expectedSteps} execution steps, got ${result.executionSteps.length}`);
313
+ }
314
+ const benchmark = generateBenchmark(label, logs, result.stats, result.executionSteps, 'wasm', undefined);
315
+
316
+ const ivcFolder = process.env.CAPTURE_IVC_FOLDER;
317
+ if (ivcFolder) {
318
+ logger.info(`Capturing chonk execution profile for ${label}`);
319
+
320
+ const resultsDirectory = join(ivcFolder, label);
321
+ logger.info(`Writing private execution steps to ${resultsDirectory}`);
322
+ await mkdir(resultsDirectory, { recursive: true });
323
+ // Write the chonk files read by the prover.
324
+ const ivcInputsPath = join(resultsDirectory, 'ivc-inputs.msgpack');
325
+ await writeFile(ivcInputsPath, serializePrivateExecutionSteps(result.executionSteps));
326
+ await writeFile(join(resultsDirectory, 'logs.json'), JSON.stringify(logs, null, 2));
327
+ await writeFile(join(resultsDirectory, 'benchmark.json'), JSON.stringify(benchmark, null, 2));
328
+ logger.info(`Wrote private execution steps to ${resultsDirectory}`);
329
+ }
330
+
331
+ const benchOutput = process.env.BENCH_OUTPUT;
332
+ if (benchOutput) {
333
+ await mkdir(benchOutput, { recursive: true });
334
+ const ghBenchmark = convertProfileToGHBenchmark(benchmark);
335
+ const benchFile = join(benchOutput, `${label}.bench.json`);
336
+ await writeFile(benchFile, JSON.stringify(ghBenchmark));
337
+ logger.info(`Wrote benchmark to ${benchFile}`);
338
+ }
339
+
340
+ return result;
341
+ }