@aztec-labs/ethereum 6.0.0-rc.3 → 6.0.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 (114) hide show
  1. package/dest/blob_tx.d.ts +24 -0
  2. package/dest/blob_tx.d.ts.map +1 -0
  3. package/dest/blob_tx.js +94 -0
  4. package/dest/bn254/hash_to_point.d.ts +32 -0
  5. package/dest/bn254/hash_to_point.d.ts.map +1 -0
  6. package/dest/bn254/hash_to_point.js +80 -0
  7. package/dest/bn254/index.d.ts +3 -0
  8. package/dest/bn254/index.d.ts.map +1 -0
  9. package/dest/bn254/index.js +2 -0
  10. package/dest/bn254/proof_of_possession_gas.d.ts +29 -0
  11. package/dest/bn254/proof_of_possession_gas.d.ts.map +1 -0
  12. package/dest/bn254/proof_of_possession_gas.js +24 -0
  13. package/dest/client.d.ts +1 -1
  14. package/dest/client.d.ts.map +1 -1
  15. package/dest/client.js +5 -3
  16. package/dest/contracts/errors.d.ts +10 -3
  17. package/dest/contracts/errors.d.ts.map +1 -1
  18. package/dest/contracts/errors.js +10 -4
  19. package/dest/contracts/inbox.d.ts +1 -1
  20. package/dest/contracts/inbox.d.ts.map +1 -1
  21. package/dest/contracts/inbox.js +2 -0
  22. package/dest/contracts/log.d.ts +7 -1
  23. package/dest/contracts/log.d.ts.map +1 -1
  24. package/dest/contracts/log.js +6 -0
  25. package/dest/contracts/rollup.d.ts +32 -4
  26. package/dest/contracts/rollup.d.ts.map +1 -1
  27. package/dest/contracts/rollup.js +63 -7
  28. package/dest/deploy_aztec_l1_contracts.d.ts +16 -1
  29. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
  30. package/dest/deploy_aztec_l1_contracts.js +201 -65
  31. package/dest/foundry_binary.d.ts +1 -1
  32. package/dest/foundry_binary.d.ts.map +1 -1
  33. package/dest/foundry_binary.js +2 -1
  34. package/dest/l1_tx_utils/amsterdam.d.ts +1 -1
  35. package/dest/l1_tx_utils/amsterdam.d.ts.map +1 -1
  36. package/dest/l1_tx_utils/amsterdam.js +4 -1
  37. package/dest/l1_tx_utils/constants.d.ts +2 -1
  38. package/dest/l1_tx_utils/constants.d.ts.map +1 -1
  39. package/dest/l1_tx_utils/constants.js +3 -0
  40. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +1 -1
  41. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -1
  42. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +6 -1
  43. package/dest/l1_tx_utils/index.d.ts +2 -1
  44. package/dest/l1_tx_utils/index.d.ts.map +1 -1
  45. package/dest/l1_tx_utils/index.js +1 -0
  46. package/dest/l1_tx_utils/l1_tx_utils.d.ts +21 -1
  47. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  48. package/dest/l1_tx_utils/l1_tx_utils.js +71 -5
  49. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +8 -1
  50. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
  51. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +1 -1
  52. package/dest/l1_tx_utils/send_cost.d.ts +15 -0
  53. package/dest/l1_tx_utils/send_cost.d.ts.map +1 -0
  54. package/dest/l1_tx_utils/send_cost.js +10 -0
  55. package/dest/l1_tx_utils/signer.d.ts +2 -2
  56. package/dest/l1_tx_utils/signer.d.ts.map +1 -1
  57. package/dest/l1_tx_utils/signer.js +2 -2
  58. package/dest/l1_tx_utils/tx_delayer.d.ts +1 -1
  59. package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -1
  60. package/dest/l1_tx_utils/tx_delayer.js +8 -26
  61. package/dest/publisher_manager.d.ts +127 -13
  62. package/dest/publisher_manager.d.ts.map +1 -1
  63. package/dest/publisher_manager.js +320 -79
  64. package/dest/test/anvil_hardfork.d.ts +42 -0
  65. package/dest/test/anvil_hardfork.d.ts.map +1 -0
  66. package/dest/test/anvil_hardfork.js +107 -0
  67. package/dest/test/eth_cheat_codes.d.ts +30 -5
  68. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  69. package/dest/test/eth_cheat_codes.js +283 -101
  70. package/dest/test/index.d.ts +3 -1
  71. package/dest/test/index.d.ts.map +1 -1
  72. package/dest/test/index.js +2 -0
  73. package/dest/test/l1_hardfork.d.ts +43 -0
  74. package/dest/test/l1_hardfork.d.ts.map +1 -0
  75. package/dest/test/l1_hardfork.js +51 -0
  76. package/dest/test/recording_rpc_server.d.ts +1 -1
  77. package/dest/test/recording_rpc_server.d.ts.map +1 -1
  78. package/dest/test/recording_rpc_server.js +1 -0
  79. package/dest/test/rollup_cheat_codes.d.ts +1 -1
  80. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  81. package/dest/test/rollup_cheat_codes.js +7 -7
  82. package/dest/test/start_anvil.d.ts +14 -2
  83. package/dest/test/start_anvil.d.ts.map +1 -1
  84. package/dest/test/start_anvil.js +28 -11
  85. package/package.json +13 -11
  86. package/src/blob_tx.ts +118 -0
  87. package/src/bn254/hash_to_point.ts +95 -0
  88. package/src/bn254/index.ts +2 -0
  89. package/src/bn254/proof_of_possession_gas.ts +54 -0
  90. package/src/client.ts +6 -3
  91. package/src/contracts/errors.ts +12 -4
  92. package/src/contracts/inbox.ts +4 -0
  93. package/src/contracts/log.ts +12 -0
  94. package/src/contracts/rollup.ts +63 -6
  95. package/src/deploy_aztec_l1_contracts.ts +238 -63
  96. package/src/foundry_binary.ts +2 -1
  97. package/src/l1_tx_utils/amsterdam.ts +4 -1
  98. package/src/l1_tx_utils/constants.ts +4 -0
  99. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +11 -1
  100. package/src/l1_tx_utils/index.ts +1 -0
  101. package/src/l1_tx_utils/l1_tx_utils.ts +72 -5
  102. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +1 -1
  103. package/src/l1_tx_utils/send_cost.ts +21 -0
  104. package/src/l1_tx_utils/signer.ts +3 -2
  105. package/src/l1_tx_utils/tx_delayer.ts +8 -37
  106. package/src/publisher_manager.ts +458 -83
  107. package/src/test/anvil_hardfork.ts +95 -0
  108. package/src/test/eth_cheat_codes.ts +306 -81
  109. package/src/test/fixtures/sepolia_blob_tx.json +10 -0
  110. package/src/test/index.ts +2 -0
  111. package/src/test/l1_hardfork.ts +71 -0
  112. package/src/test/recording_rpc_server.ts +1 -0
  113. package/src/test/rollup_cheat_codes.ts +9 -9
  114. package/src/test/start_anvil.ts +41 -13
@@ -0,0 +1,43 @@
1
+ declare const KNOWN_L1_HARDFORKS: readonly ["osaka", "amsterdam"];
2
+ /** An L1 hardfork that test anvils can be started on. */
3
+ export type L1Hardfork = (typeof KNOWN_L1_HARDFORKS)[number];
4
+ /**
5
+ * Returns the L1 hardfork that test anvils start on, read from `$ANVIL_HARDFORK`, or undefined when it is unset.
6
+ * Throws on a name outside the known forks, so a typo fails at once instead of after anvil's spawn retries.
7
+ */
8
+ export declare function getL1Hardfork(): L1Hardfork | undefined;
9
+ /**
10
+ * Returns whether this test run starts its anvils on Amsterdam. This is the intended fork, not an observation:
11
+ * a test whose chain changes fork mid-run must ask the chain (`isAmsterdamBlock`) instead.
12
+ */
13
+ export declare function isAmsterdamTestRun(): boolean;
14
+ /**
15
+ * Returns a describe block name with the L1 hardfork from `$ANVIL_HARDFORK` appended, e.g. `Registry (amsterdam)`, so
16
+ * test output and reports show which fork a run used. Returns the name unchanged when `$ANVIL_HARDFORK` is unset.
17
+ */
18
+ export declare function describeNameOnL1Fork(name: string): string;
19
+ type DescribeBlock = (name: string, fn: () => void) => void;
20
+ /**
21
+ * A `describe` that also tags its test file for CI test-command generation, and appends the L1 hardfork to the block's
22
+ * name when `$ANVIL_HARDFORK` is set.
23
+ */
24
+ export type TaggedDescribe = DescribeBlock & {
25
+ skip: DescribeBlock;
26
+ only: DescribeBlock;
27
+ };
28
+ /**
29
+ * Jest's `describe`, marking the test file to also run on every other L1 hardfork on every CI run. It has no runtime
30
+ * effect beyond `describe`: it exists so CI's test command generation (`yarn-project/scripts/echo_test_cmd.sh`)
31
+ * can grep for it and emit one extra command per fork with `ANVIL_HARDFORK` set. So it must appear in the test file
32
+ * itself, uncommented, not in a shared helper. A file marked with it needs no `describeWithAnvil`.
33
+ */
34
+ export declare const describeAcrossL1Forks: TaggedDescribe;
35
+ /**
36
+ * Jest's `describe`, marking a test file that starts anvil so that the full CI sweep (`CI_FULL=1` or
37
+ * `HARDFORK_SWEEP=1`) also runs it on every other L1 hardfork. It has no runtime effect beyond `describe`: it exists
38
+ * so CI's test command generation (`yarn-project/scripts/echo_test_cmd.sh`) can grep for it, so it must appear in
39
+ * the test file itself, uncommented. End-to-end tests need no marker: the sweep covers every simple e2e test.
40
+ */
41
+ export declare const describeWithAnvil: TaggedDescribe;
42
+ export {};
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfaGFyZGZvcmsuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2wxX2hhcmRmb3JrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLFFBQUEsTUFBTSxrQkFBa0IsaUNBQWtDLENBQUM7QUFFM0QseURBQXlEO0FBQ3pELE1BQU0sTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7QUFFN0Q7OztHQUdHO0FBQ0gsd0JBQWdCLGFBQWEsSUFBSSxVQUFVLEdBQUcsU0FBUyxDQVN0RDtBQUVEOzs7R0FHRztBQUNILHdCQUFnQixrQkFBa0IsSUFBSSxPQUFPLENBRTVDO0FBRUQ7OztHQUdHO0FBQ0gsd0JBQWdCLG9CQUFvQixDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUd6RDtBQUVELEtBQUssYUFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxJQUFJLEtBQUssSUFBSSxDQUFDO0FBRTVEOzs7R0FHRztBQUNILE1BQU0sTUFBTSxjQUFjLEdBQUcsYUFBYSxHQUFHO0lBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQztJQUFDLElBQUksRUFBRSxhQUFhLENBQUE7Q0FBRSxDQUFDO0FBVzFGOzs7OztHQUtHO0FBQ0gsZUFBTyxNQUFNLHFCQUFxQixFQUFFLGNBQWlDLENBQUM7QUFFdEU7Ozs7O0dBS0c7QUFDSCxlQUFPLE1BQU0saUJBQWlCLEVBQUUsY0FBaUMsQ0FBQyJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l1_hardfork.d.ts","sourceRoot":"","sources":["../../src/test/l1_hardfork.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,kBAAkB,iCAAkC,CAAC;AAE3D,yDAAyD;AACzD,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D;;;GAGG;AACH,wBAAgB,aAAa,IAAI,UAAU,GAAG,SAAS,CAStD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED,KAAK,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAW1F;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAAiC,CAAC;AAEtE;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,cAAiC,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { getEnv } from '@aztec-labs/foundation/config/env';
2
+ const KNOWN_L1_HARDFORKS = [
3
+ 'osaka',
4
+ 'amsterdam'
5
+ ];
6
+ /**
7
+ * Returns the L1 hardfork that test anvils start on, read from `$ANVIL_HARDFORK`, or undefined when it is unset.
8
+ * Throws on a name outside the known forks, so a typo fails at once instead of after anvil's spawn retries.
9
+ */ export function getL1Hardfork() {
10
+ const value = getEnv().ANVIL_HARDFORK?.trim().toLowerCase();
11
+ if (!value) {
12
+ return undefined;
13
+ }
14
+ if (!KNOWN_L1_HARDFORKS.includes(value)) {
15
+ throw new Error(`Unknown ANVIL_HARDFORK '${value}', expected one of: ${KNOWN_L1_HARDFORKS.join(', ')}`);
16
+ }
17
+ return value;
18
+ }
19
+ /**
20
+ * Returns whether this test run starts its anvils on Amsterdam. This is the intended fork, not an observation:
21
+ * a test whose chain changes fork mid-run must ask the chain (`isAmsterdamBlock`) instead.
22
+ */ export function isAmsterdamTestRun() {
23
+ return getL1Hardfork() === 'amsterdam';
24
+ }
25
+ /**
26
+ * Returns a describe block name with the L1 hardfork from `$ANVIL_HARDFORK` appended, e.g. `Registry (amsterdam)`, so
27
+ * test output and reports show which fork a run used. Returns the name unchanged when `$ANVIL_HARDFORK` is unset.
28
+ */ export function describeNameOnL1Fork(name) {
29
+ const hardfork = getL1Hardfork();
30
+ return hardfork ? `${name} (${hardfork})` : name;
31
+ }
32
+ function taggedDescribe() {
33
+ // Jest's global `describe` is read at call time, so importing this module outside Jest stays safe.
34
+ const tagged = (name, fn)=>describe(describeNameOnL1Fork(name), fn);
35
+ tagged.skip = (name, fn)=>describe.skip(describeNameOnL1Fork(name), fn);
36
+ // eslint-disable-next-line no-only-tests/no-only-tests
37
+ tagged.only = (name, fn)=>describe.only(describeNameOnL1Fork(name), fn);
38
+ return tagged;
39
+ }
40
+ /**
41
+ * Jest's `describe`, marking the test file to also run on every other L1 hardfork on every CI run. It has no runtime
42
+ * effect beyond `describe`: it exists so CI's test command generation (`yarn-project/scripts/echo_test_cmd.sh`)
43
+ * can grep for it and emit one extra command per fork with `ANVIL_HARDFORK` set. So it must appear in the test file
44
+ * itself, uncommented, not in a shared helper. A file marked with it needs no `describeWithAnvil`.
45
+ */ export const describeAcrossL1Forks = taggedDescribe();
46
+ /**
47
+ * Jest's `describe`, marking a test file that starts anvil so that the full CI sweep (`CI_FULL=1` or
48
+ * `HARDFORK_SWEEP=1`) also runs it on every other L1 hardfork. It has no runtime effect beyond `describe`: it exists
49
+ * so CI's test command generation (`yarn-project/scripts/echo_test_cmd.sh`) can grep for it, so it must appear in
50
+ * the test file itself, uncommented. End-to-end tests need no marker: the sweep covers every simple e2e test.
51
+ */ export const describeWithAnvil = taggedDescribe();
@@ -15,4 +15,4 @@ export type RecordingRpcServer = {
15
15
  export declare function startRecordingRpcServer(opts?: {
16
16
  forwardTo?: string;
17
17
  }): Promise<RecordingRpcServer>;
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nX3JwY19zZXJ2ZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3JlY29yZGluZ19ycGNfc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLGdGQUFnRjtBQUNoRixNQUFNLE1BQU0sa0JBQWtCLEdBQUc7SUFDL0IsaUNBQWlDO0lBQ2pDLEdBQUcsRUFBRSxNQUFNLENBQUM7SUFDWiwwRUFBMEU7SUFDMUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLHdCQUF3QjtJQUN4QixLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDNUIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCx3QkFBc0IsdUJBQXVCLENBQUMsSUFBSSxHQUFFO0lBQUUsU0FBUyxDQUFDLEVBQUUsTUFBTSxDQUFBO0NBQU8sR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FtRDVHIn0=
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nX3JwY19zZXJ2ZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3JlY29yZGluZ19ycGNfc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLGdGQUFnRjtBQUNoRixNQUFNLE1BQU0sa0JBQWtCLEdBQUc7SUFDL0IsaUNBQWlDO0lBQ2pDLEdBQUcsRUFBRSxNQUFNLENBQUM7SUFDWiwwRUFBMEU7SUFDMUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLHdCQUF3QjtJQUN4QixLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDNUIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCx3QkFBc0IsdUJBQXVCLENBQUMsSUFBSSxHQUFFO0lBQUUsU0FBUyxDQUFDLEVBQUUsTUFBTSxDQUFBO0NBQU8sR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FtRDVHIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"recording_rpc_server.d.ts","sourceRoot":"","sources":["../../src/test/recording_rpc_server.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,wBAAwB;IACxB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmD5G"}
1
+ {"version":3,"file":"recording_rpc_server.d.ts","sourceRoot":"","sources":["../../src/test/recording_rpc_server.ts"],"names":[],"mappings":"AAGA,gFAAgF;AAChF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,wBAAwB;IACxB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmD5G"}
@@ -1,3 +1,4 @@
1
+ import { Buffer } from 'buffer';
1
2
  import { createServer } from 'node:http';
2
3
  /**
3
4
  * Starts a JSON-RPC server that records the method of every request it receives, so tests can assert on what a
@@ -156,4 +156,4 @@ export declare class RollupCheatCodes {
156
156
  */
157
157
  clearProvingCostCooldown(): Promise<void>;
158
158
  }
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbHVwX2NoZWF0X2NvZGVzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9yb2xsdXBfY2hlYXRfY29kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSxLQUFLLFNBQVMsRUFBMEQsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4SCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3RGLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUlqRyxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQ0wsS0FBSyxxQkFBcUIsRUFDMUIsS0FBSyxHQUFHLEVBT1QsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsOENBQThDO0FBQzlDLHFCQUFhLGdCQUFnQjtJQU96QixPQUFPLENBQUMsYUFBYTtJQU52QixPQUFPLENBQUMsTUFBTSxDQUFtQjtJQUNqQyxPQUFPLENBQUMsTUFBTSxDQUE0RDtJQUUxRSxPQUFPLENBQUMsTUFBTSxDQUF1QztJQUVyRCxZQUNVLGFBQWEsRUFBRSxhQUFhLEVBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLEVBV3REO0lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FDWCxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQ2pCLFNBQVMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLEVBQ3JELFlBQVksRUFBRSxZQUFZLEdBQ3pCLGdCQUFnQixDQUdsQjtJQUVELCtC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
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbHVwX2NoZWF0X2NvZGVzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9yb2xsdXBfY2hlYXRfY29kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSxLQUFLLFNBQVMsRUFBMEQsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4SCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3RGLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUlqRyxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVqRSxPQUFPLEVBQ0wsS0FBSyxxQkFBcUIsRUFDMUIsS0FBSyxHQUFHLEVBT1QsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsOENBQThDO0FBQzlDLHFCQUFhLGdCQUFnQjtJQU96QixPQUFPLENBQUMsYUFBYTtJQU52QixPQUFPLENBQUMsTUFBTSxDQUFtQjtJQUNqQyxPQUFPLENBQUMsTUFBTSxDQUE0RDtJQUUxRSxPQUFPLENBQUMsTUFBTSxDQUF1QztJQUVyRCxZQUNVLGFBQWEsRUFBRSxhQUFhLEVBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLEVBV3REO0lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FDWCxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQ2pCLFNBQVMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLEVBQ3JELFlBQVksRUFBRSxZQUFZLEdBQ3pCLGdCQUFnQixDQUdsQjtJQUVELCtC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
@@ -1 +1 @@
1
- {"version":3,"file":"rollup_cheat_codes.d.ts","sourceRoot":"","sources":["../../src/test/rollup_cheat_codes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rollup_cheat_codes.d.ts","sourceRoot":"","sources":["../../src/test/rollup_cheat_codes.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { CheckpointNumber, EpochNumber, SlotNumber } from '@aztec-labs/foundatio
4
4
  import { EthAddress } from '@aztec-labs/foundation/eth-address';
5
5
  import { createLogger } from '@aztec-labs/foundation/log';
6
6
  import { retryUntil } from '@aztec-labs/foundation/retry';
7
+ import { Buffer } from 'buffer';
7
8
  import { createPublicClient, fallback, getContract, hexToBigInt, http, keccak256 } from 'viem';
8
9
  import { EthCheatCodes } from './eth_cheat_codes.js';
9
10
  /** Cheat codes for the L1 rollup contract. */ export class RollupCheatCodes {
@@ -242,13 +243,12 @@ import { EthCheatCodes } from './eth_cheat_codes.js';
242
243
  return pending > 0 && pending < checkpoint ? pending : undefined;
243
244
  }, `rollup checkpoint in (0, ${checkpoint})`, opts.timeout ?? 60, opts.interval ?? 1);
244
245
  }
245
- insertOutbox(epoch, numCheckpointsInEpoch, outHash) {
246
- return this.ethCheatCodes.execWithPausedAnvil(async ()=>{
247
- const outboxAddress = await this.rollup.read.getOutbox();
248
- const epochRootSlot = OutboxContract.getEpochRootStorageSlot(epoch, numCheckpointsInEpoch);
249
- await this.ethCheatCodes.store(EthAddress.fromString(outboxAddress), epochRootSlot, outHash);
250
- this.logger.warn(`Advanced outbox to epoch ${epoch} numCheckpointsInEpoch ${numCheckpointsInEpoch} with out hash ${outHash}`);
251
- });
246
+ async insertOutbox(epoch, numCheckpointsInEpoch, outHash) {
247
+ // A single blind write, so unlike markAsProven it needs no pause to stay atomic against blocks being mined.
248
+ const outboxAddress = await this.rollup.read.getOutbox();
249
+ const epochRootSlot = OutboxContract.getEpochRootStorageSlot(epoch, numCheckpointsInEpoch);
250
+ await this.ethCheatCodes.store(EthAddress.fromString(outboxAddress), epochRootSlot, outHash);
251
+ this.logger.warn(`Advanced outbox to epoch ${epoch} numCheckpointsInEpoch ${numCheckpointsInEpoch} with out hash ${outHash}`);
252
252
  }
253
253
  /**
254
254
  * Executes an action impersonated as the owner of the Rollup contract.
@@ -16,7 +16,10 @@ export declare function startAnvil(opts?: {
16
16
  captureMethodCalls?: boolean;
17
17
  accounts?: number;
18
18
  chainId?: number;
19
- /** The hardfork to use (e.g. 'cancun', 'latest'). */
19
+ /**
20
+ * The hardfork to start on (e.g. 'osaka', 'amsterdam'). Defaults to `$ANVIL_HARDFORK`, else 'osaka'. Anvil's
21
+ * own default moves with each foundry release, so it is never relied on.
22
+ */
20
23
  hardfork?: string;
21
24
  /**
22
25
  * Number of slots per epoch used by anvil to compute the 'finalized' and 'safe' block tags.
@@ -31,10 +34,19 @@ export declare function startAnvil(opts?: {
31
34
  * the wall clock and the L1 chain when computing L1 slot timestamps.
32
35
  */
33
36
  dateProvider?: TestDateProvider;
37
+ /** Plain JSON state file to start from (`--load-state`), i.e. the gunzipped output of `anvil_dumpState`. */
38
+ loadState?: string;
39
+ /**
40
+ * Number of historical states anvil keeps (`--prune-history`). Each kept state is a full snapshot in a state dump
41
+ * with history, so this bounds how long a dump and reload take.
42
+ */
43
+ pruneHistory?: number;
34
44
  }): Promise<{
35
45
  anvil: Anvil;
36
46
  methodCalls?: string[];
37
47
  rpcUrl: string;
38
48
  stop: () => Promise<void>;
39
49
  }>;
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnRfYW52aWwuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3N0YXJ0X2FudmlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLckUsOEVBQThFO0FBQzlFLE1BQU0sV0FBVyxLQUFLO0lBQ3BCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLE1BQU0sQ0FBQztJQUN0QyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3ZCO0FBdUNEOztHQUVHO0FBQ0gsd0JBQXNCLFVBQVUsQ0FDOUIsSUFBSSxHQUFFO0lBQ0osSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2QsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUNkLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQzdCLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNsQixPQUFPLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDakIscURBQXFEO0lBQ3JELFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNsQjs7Ozs7T0FLRztJQUNILGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUN4Qjs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLEVBQUUsZ0JBQWdCLENBQUM7Q0FDNUIsR0FDTCxPQUFPLENBQUM7SUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO0lBQUMsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQUMsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0NBQUUsQ0FBQyxDQThKOUYifQ==
50
+ /** Advances the test clock from mined-block output without rewinding it when Anvil replays a reorg. */
51
+ export declare function syncDateProviderFromAnvilOutput(text: string, dateProvider: TestDateProvider): void;
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnRfYW52aWwuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3N0YXJ0X2FudmlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFPckUsOEVBQThFO0FBQzlFLE1BQU0sV0FBVyxLQUFLO0lBQ3BCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLE1BQU0sQ0FBQztJQUN0QyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3ZCO0FBdUNEOztHQUVHO0FBQ0gsd0JBQXNCLFVBQVUsQ0FDOUIsSUFBSSxHQUFFO0lBQ0osSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2QsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUNkLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQzdCLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNsQixPQUFPLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDakI7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2xCOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3hCOzs7O09BSUc7SUFDSCxZQUFZLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQztJQUNoQyw0R0FBNEc7SUFDNUcsU0FBUyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ25COzs7T0FHRztJQUNILFlBQVksQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUNsQixHQUNMLE9BQU8sQ0FBQztJQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7SUFBQyxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFBQyxJQUFJLEVBQUUsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7Q0FBRSxDQUFDLENBeUs5RjtBQUVELHVHQUF1RztBQUN2Ryx3QkFBZ0IsK0JBQStCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEdBQUcsSUFBSSxDQWNsRyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"start_anvil.d.ts","sourceRoot":"","sources":["../../src/test/start_anvil.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAKrE,8EAA8E;AAC9E,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC;IACtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAuCD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,IAAI,GAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,gBAAgB,CAAC;CAC5B,GACL,OAAO,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CA8J9F"}
1
+ {"version":3,"file":"start_anvil.d.ts","sourceRoot":"","sources":["../../src/test/start_anvil.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAOrE,8EAA8E;AAC9E,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC;IACtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAuCD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,IAAI,GAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,4GAA4G;IAC5G,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,OAAO,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAyK9F;AAED,uGAAuG;AACvG,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAclG"}
@@ -1,7 +1,10 @@
1
+ import { getEnv } from '@aztec-labs/foundation/config/env';
1
2
  import { createLogger } from '@aztec-labs/foundation/log';
2
3
  import { makeBackoff, retry } from '@aztec-labs/foundation/retry';
3
4
  import { spawn } from 'child_process';
4
5
  import { resolveFoundryBinary } from '../foundry_binary.js';
6
+ import { resetAnvilMiningState } from './eth_cheat_codes.js';
7
+ import { getL1Hardfork } from './l1_hardfork.js';
5
8
  // Watchdog wrapper: instead of spawning anvil directly, we spawn a small bash supervisor that runs
6
9
  // anvil as a background child and polls its own parent (this node process). If the parent dies for
7
10
  // ANY reason — including SIGKILL / crash / OOM, where node's own exit handlers never run — the poll
@@ -44,11 +47,14 @@ const ANVIL_STARTUP_TIMEOUT_MS = 30_000;
44
47
  const logger = opts.log ? createLogger('ethereum:anvil') : undefined;
45
48
  const methodCalls = opts.captureMethodCalls ? [] : undefined;
46
49
  let detectedPort;
50
+ // Resolved before the retry loop so an unknown $ANVIL_HARDFORK fails at once rather than after every spawn attempt.
51
+ const hardfork = opts.hardfork ?? getL1Hardfork() ?? 'osaka';
47
52
  const anvil = await retry(async ()=>{
48
53
  // `--port 0` lets anvil bind an OS-assigned ephemeral port; the actual port is read back from
49
54
  // its "Listening on host:port" stdout below, so independent suites can spawn their own anvil
50
55
  // in parallel without fighting over a fixed port.
51
- const port = opts.port ?? (process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT) : 8545);
56
+ const { ANVIL_PORT } = getEnv();
57
+ const port = opts.port ?? (ANVIL_PORT ? parseInt(ANVIL_PORT) : 8545);
52
58
  const args = [
53
59
  '--host',
54
60
  '127.0.0.1',
@@ -56,18 +62,23 @@ const ANVIL_STARTUP_TIMEOUT_MS = 30_000;
56
62
  String(port),
57
63
  '--accounts',
58
64
  String(opts.accounts ?? 20),
65
+ // Above the 50M Amsterdam per-tx cap (AMSTERDAM_MAX_L1_TX_LIMIT), so a bundle sized up to that cap fits a block.
59
66
  '--gas-limit',
60
- String(45_000_000),
67
+ String(60_000_000),
61
68
  '--chain-id',
62
69
  String(opts.chainId ?? 31337)
63
70
  ];
64
71
  if (opts.l1BlockTime !== undefined) {
65
72
  args.push('--block-time', String(opts.l1BlockTime));
66
73
  }
67
- if (opts.hardfork !== undefined) {
68
- args.push('--hardfork', opts.hardfork);
69
- }
74
+ args.push('--hardfork', hardfork);
70
75
  args.push('--slots-in-an-epoch', String(opts.slotsInAnEpoch ?? 1));
76
+ if (opts.pruneHistory !== undefined) {
77
+ args.push('--prune-history', String(opts.pruneHistory));
78
+ }
79
+ if (opts.loadState !== undefined) {
80
+ args.push('--load-state', opts.loadState);
81
+ }
71
82
  // Spawn the watchdog (see ANVIL_WATCHDOG). It launches anvil with these args and reaps it if we
72
83
  // die; `$0` is 'bash' and `$@` is the anvil argv.
73
84
  // `detached` puts the watchdog and anvil in their own process group so teardown can signal both
@@ -85,7 +96,7 @@ const ANVIL_STARTUP_TIMEOUT_MS = 30_000;
85
96
  ],
86
97
  detached: true,
87
98
  env: {
88
- ...process.env,
99
+ ...getEnv(),
89
100
  ANVIL_BIN: anvilBinary,
90
101
  RAYON_NUM_THREADS: '1'
91
102
  }
@@ -170,12 +181,14 @@ const ANVIL_STARTUP_TIMEOUT_MS = 30_000;
170
181
  let status = 'listening';
171
182
  anvil.once('close', ()=>{
172
183
  status = 'idle';
184
+ resetAnvilMiningState(port);
173
185
  });
174
186
  let stopping;
175
187
  const stop = async ()=>{
176
188
  if (status === 'idle') {
177
189
  return;
178
190
  }
191
+ resetAnvilMiningState(port);
179
192
  await (stopping ??= killChild(anvil));
180
193
  };
181
194
  const anvilObj = {
@@ -193,16 +206,20 @@ const ANVIL_STARTUP_TIMEOUT_MS = 30_000;
193
206
  rpcUrl: `http://127.0.0.1:${port}`
194
207
  };
195
208
  }
196
- /** Extracts block time from anvil stdout and syncs the dateProvider. */ function syncDateProviderFromAnvilOutput(text, dateProvider) {
209
+ /** Advances the test clock from mined-block output without rewinding it when Anvil replays a reorg. */ export function syncDateProviderFromAnvilOutput(text, dateProvider) {
197
210
  // Anvil logs mined blocks as:
198
211
  // Block Time: "Fri, 20 Mar 2026 02:10:46 +0000"
199
- const match = text.match(/Block Time:\s*"([^"]+)"/);
200
- if (match) {
212
+ const currentTimeMs = dateProvider.now();
213
+ let newestTimeMs = currentTimeMs;
214
+ for (const match of text.matchAll(/Block Time:\s*"([^"]+)"/g)){
201
215
  const blockTimeMs = new Date(match[1]).getTime();
202
- if (!isNaN(blockTimeMs)) {
203
- dateProvider.setTime(blockTimeMs);
216
+ if (!Number.isNaN(blockTimeMs)) {
217
+ newestTimeMs = Math.max(newestTimeMs, blockTimeMs);
204
218
  }
205
219
  }
220
+ if (newestTimeMs > currentTimeMs) {
221
+ dateProvider.setTime(newestTimeMs);
222
+ }
206
223
  }
207
224
  /**
208
225
  * Send SIGTERM to the watchdog, wait up to 5 s, then SIGKILL the whole process group. The watchdog's
package/package.json CHANGED
@@ -1,9 +1,11 @@
1
1
  {
2
2
  "name": "@aztec-labs/ethereum",
3
- "version": "6.0.0-rc.3",
3
+ "version": "6.0.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./account": "./dest/account.js",
7
+ "./blob-tx": "./dest/blob_tx.js",
8
+ "./bn254": "./dest/bn254/index.js",
7
9
  "./chain": "./dest/chain.js",
8
10
  "./client": "./dest/client.js",
9
11
  "./config": "./dest/config.js",
@@ -41,23 +43,22 @@
41
43
  "build": "yarn clean && ../scripts/tsc.sh",
42
44
  "build:dev": "../scripts/tsc.sh --watch",
43
45
  "clean": "rm -rf ./dest .tsbuildinfo",
44
- "start:dev": "concurrently -k \"../scripts/tsc.sh --watch\" \"nodemon --watch dest --exec yarn start\"",
45
- "start": "node ./dest/index.js",
46
- "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}",
47
- "proposer-address": "node ./dest/cli/forwarder_address.js"
46
+ "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}"
48
47
  },
49
48
  "inherits": [
50
49
  "../package.common.json"
51
50
  ],
52
51
  "dependencies": {
53
- "@aztec-foundation/l1-artifacts": "6.0.0-rc.6",
54
- "@aztec-labs/blob-lib": "6.0.0-rc.3",
55
- "@aztec-labs/foundation": "6.0.0-rc.3",
52
+ "@aztec-foundation/l1-artifacts": "6.0.0",
53
+ "@aztec-labs/blob-lib": "6.0.0",
54
+ "@aztec-labs/foundation": "6.0.0",
55
+ "@iarna/toml": "^2.2.5",
56
+ "buffer": "^6.0.3",
56
57
  "dotenv": "^16.0.3",
57
58
  "lodash.chunk": "^4.2.0",
58
59
  "lodash.pickby": "^4.5.0",
59
60
  "tslib": "^2.4.0",
60
- "viem": "npm:@aztec/viem@2.38.3",
61
+ "viem": "2.57.1",
61
62
  "zod": "~4.4.3"
62
63
  },
63
64
  "devDependencies": {
@@ -77,7 +78,8 @@
77
78
  "files": [
78
79
  "dest",
79
80
  "src",
80
- "!*.test.*"
81
+ "!*.test.*",
82
+ "!src/bn254/fixtures"
81
83
  ],
82
84
  "types": "./dest/types.d.ts",
83
85
  "jest": {
@@ -118,6 +120,6 @@
118
120
  ]
119
121
  },
120
122
  "engines": {
121
- "node": ">=20.10"
123
+ "node": ">=20.16"
122
124
  }
123
125
  }
package/src/blob_tx.ts ADDED
@@ -0,0 +1,118 @@
1
+ import {
2
+ type Address,
3
+ type ByteArray,
4
+ type Hex,
5
+ type TransactionSerializable,
6
+ type TransactionSerializableEIP4844,
7
+ type TransactionSerialized,
8
+ blobsToCommitments,
9
+ bytesToHex,
10
+ concatHex,
11
+ fromRlp,
12
+ getTransactionType,
13
+ hexToBytes,
14
+ keccak256,
15
+ parseTransaction,
16
+ recoverTransactionAddress,
17
+ serializeTransaction,
18
+ toRlp,
19
+ } from 'viem';
20
+
21
+ /**
22
+ * Chains whose execution layer runs Fusaka, which only accepts blob txs in the EIP-7594 network wrapper
23
+ * (wrapper version 1, with cell proofs). Other chains (e.g. anvil) keep the EIP-4844 wrapper. Since foundry 1.8.5, anvil
24
+ * accepts both wrappers on every hardfork, so it gets the EIP-4844 wrapper only because chains are opted in by id here.
25
+ */
26
+ const EIP7594_CHAIN_IDS = new Set([
27
+ 1, // mainnet
28
+ 11_155_111, // sepolia
29
+ 560_048, // hoodi
30
+ ]);
31
+
32
+ /** Number of cell proofs per blob in an EIP-7594 network wrapper. */
33
+ const CELLS_PER_EXT_BLOB = 128;
34
+
35
+ type KzgWithCellProofs = {
36
+ blobToKzgCommitment(blob: ByteArray): ByteArray;
37
+ computeCellsAndKzgProofs(blob: ByteArray): [ByteArray[], ByteArray[]];
38
+ };
39
+
40
+ type TransactionSignature = Parameters<typeof serializeTransaction>[1];
41
+
42
+ /** Returns whether blob txs sent to the given chain must use the EIP-7594 network wrapper. */
43
+ export function usesEip7594BlobWrapper(chainId: number | undefined): boolean {
44
+ return chainId !== undefined && EIP7594_CHAIN_IDS.has(chainId);
45
+ }
46
+
47
+ /**
48
+ * Serializes a signed tx for broadcasting. Behaves like viem's `serializeTransaction`, except that blob txs
49
+ * for chains that require it are wrapped in the EIP-7594 network wrapper, which viem v2 does not support:
50
+ * `0x03 || rlp([tx_payload_body, wrapper_version, blobs, commitments, cell_proofs])`.
51
+ */
52
+ export function serializeSignedTransaction(tx: TransactionSerializable, signature: TransactionSignature): Hex {
53
+ if (getTransactionType(tx) !== 'eip4844' || !tx.blobs || !usesEip7594BlobWrapper(tx.chainId)) {
54
+ return serializeTransaction(tx, signature);
55
+ }
56
+
57
+ const kzg = tx.kzg as Partial<KzgWithCellProofs> | undefined;
58
+ if (!kzg?.blobToKzgCommitment || !kzg.computeCellsAndKzgProofs) {
59
+ throw new Error('Serializing an EIP-7594 blob tx requires a kzg instance with computeCellsAndKzgProofs');
60
+ }
61
+
62
+ const envelope = serializeTransaction(
63
+ { ...tx, type: 'eip4844', sidecars: false } as TransactionSerializableEIP4844,
64
+ signature,
65
+ );
66
+ const payloadBody = fromRlp(`0x${envelope.slice(4)}`, 'hex');
67
+
68
+ const blobs = tx.blobs.map(blob => (typeof blob === 'string' ? blob : bytesToHex(blob)));
69
+ const commitments = blobsToCommitments({ blobs, kzg: kzg as KzgWithCellProofs, to: 'hex' });
70
+ const cellProofs = blobs.flatMap(blob => {
71
+ const [, proofs] = kzg.computeCellsAndKzgProofs!(hexToBytes(blob));
72
+ if (proofs.length !== CELLS_PER_EXT_BLOB) {
73
+ throw new Error(`Expected ${CELLS_PER_EXT_BLOB} cell proofs per blob but got ${proofs.length}`);
74
+ }
75
+ return proofs.map(proof => bytesToHex(proof));
76
+ });
77
+
78
+ return concatHex(['0x03', toRlp([payloadBody, '0x01', blobs, commitments, cellProofs])]);
79
+ }
80
+
81
+ /**
82
+ * Parses a signed serialized tx like viem's `parseTransaction`, also accepting blob txs in the EIP-7594 network
83
+ * wrapper. The network wrapper of such txs is dropped, so the result carries no blobs or sidecars.
84
+ */
85
+ export function parseSignedTransaction(serializedTransaction: Hex) {
86
+ return parseTransaction(stripEip7594BlobWrapper(serializedTransaction));
87
+ }
88
+
89
+ /**
90
+ * Computes the hash of a signed serialized tx. For blob txs, this is the hash of the tx payload without the network
91
+ * wrapper, i.e. without blobs, commitments, and proofs.
92
+ */
93
+ export function computeSignedTransactionHash(serializedTransaction: Hex): Hex {
94
+ if (!serializedTransaction.startsWith('0x03')) {
95
+ return keccak256(serializedTransaction);
96
+ }
97
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
98
+ const { blobs, sidecars, ...rest } = parseSignedTransaction(serializedTransaction);
99
+ return keccak256(serializeTransaction({ ...rest, type: 'eip4844' } as TransactionSerializableEIP4844));
100
+ }
101
+
102
+ /** Recovers the sender of a signed serialized tx, also accepting blob txs in the EIP-7594 network wrapper. */
103
+ export function recoverSignedTransactionAddress(serializedTransaction: Hex): Promise<Address> {
104
+ return recoverTransactionAddress({
105
+ serializedTransaction: stripEip7594BlobWrapper(serializedTransaction) as TransactionSerialized,
106
+ });
107
+ }
108
+
109
+ function stripEip7594BlobWrapper(serializedTransaction: Hex): Hex {
110
+ if (!serializedTransaction.startsWith('0x03')) {
111
+ return serializedTransaction;
112
+ }
113
+ const decoded = fromRlp(`0x${serializedTransaction.slice(4)}`, 'hex');
114
+ if (Array.isArray(decoded) && decoded.length === 5 && Array.isArray(decoded[0]) && decoded[1] === '0x01') {
115
+ return concatHex(['0x03', toRlp(decoded[0])]);
116
+ }
117
+ return serializedTransaction;
118
+ }
@@ -0,0 +1,95 @@
1
+ import { toBigIntBE, toBufferBE } from '@aztec-labs/foundation/bigint-buffer';
2
+ import { keccak256 } from '@aztec-labs/foundation/crypto/keccak';
3
+ import { bn254 } from '@noble/curves/bn254';
4
+ import { Buffer } from 'buffer';
5
+
6
+ /** `BN254Lib.STAKING_DOMAIN_SEPARATOR`: `bytes32("AZTEC_BLS_POP_BN254_V1")`, left-aligned and zero-padded. */
7
+ export const BN254_STAKING_DOMAIN_SEPARATOR: Buffer = Buffer.concat([
8
+ Buffer.from('AZTEC_BLS_POP_BN254_V1', 'utf8'),
9
+ Buffer.alloc(32 - 'AZTEC_BLS_POP_BN254_V1'.length),
10
+ ]);
11
+
12
+ const Fp = bn254.fields.Fp;
13
+ const BASE_FIELD_ORDER = Fp.ORDER;
14
+ const SQRT_EXPONENT = (BASE_FIELD_ORDER + 1n) / 4n;
15
+ const UINT256_MAX = (1n << 256n) - 1n;
16
+
17
+ /** Result of {@link bn254HashToPoint}, with the work the L1 loop performs to reach it. */
18
+ export type Bn254HashToPointResult = {
19
+ /** The G1 point in affine coordinates. */
20
+ point: { x: bigint; y: bigint };
21
+ /** Loop attempts, each one a keccak over `(domain, message, attempt)`. */
22
+ attempts: number;
23
+ /** Attempts whose candidate was below the base field order and so reached the modexp square root. */
24
+ sqrtCalls: number;
25
+ };
26
+
27
+ /**
28
+ * Port of `BN254Lib.hashToPoint` from the L1 contracts. It must stay bit-for-bit identical to the Solidity
29
+ * implementation, including its rejection-sampling loop and root choice, since the result is what a proof of
30
+ * possession signs and the attempt count drives the L1 verification gas.
31
+ */
32
+ export function bn254HashToPoint(domain: Buffer, message: Buffer): Bn254HashToPointResult {
33
+ if (domain.length !== 32) {
34
+ throw new Error(`Domain must be 32 bytes, got ${domain.length}`);
35
+ }
36
+ let attempts = 0;
37
+ let sqrtCalls = 0;
38
+ while (true) {
39
+ const x = toBigIntBE(keccak256(abiEncodeHashInput(domain, message, BigInt(attempts))));
40
+ attempts++;
41
+
42
+ if (x >= BASE_FIELD_ORDER) {
43
+ continue;
44
+ }
45
+
46
+ const yy = Fp.add(Fp.mul(Fp.mul(x, x), x), 3n);
47
+ sqrtCalls++;
48
+ const y = Fp.pow(yy, SQRT_EXPONENT);
49
+ if (Fp.mul(y, y) !== yy) {
50
+ continue;
51
+ }
52
+
53
+ let y0 = y;
54
+ let y1 = BASE_FIELD_ORDER - y;
55
+ if (y0 > y1) {
56
+ [y0, y1] = [y1, y0];
57
+ }
58
+ const b = toBigIntBE(keccak256(abiEncodeHashInput(domain, message, UINT256_MAX)));
59
+ return { point: { x, y: (b & 1n) === 0n ? y0 : y1 }, attempts, sqrtCalls };
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Port of `BN254Lib.g1ToDigestPoint`, which GSE exposes as `getRegistrationDigest`: the point a BLS key signs to
65
+ * prove possession of the key, derived from the affine G1 public key.
66
+ */
67
+ export function computeBn254RegistrationDigest(publicKeyG1: { x: bigint; y: bigint }): Bn254HashToPointResult {
68
+ return bn254HashToPoint(
69
+ BN254_STAKING_DOMAIN_SEPARATOR,
70
+ Buffer.concat([toUint256(publicKeyG1.x), toUint256(publicKeyG1.y)]),
71
+ );
72
+ }
73
+
74
+ /** Computes the registration digest of the G1 public key of a BN254 BLS private key. */
75
+ export function computeBn254RegistrationDigestForPrivateKey(privateKeyHex: string): Bn254HashToPointResult {
76
+ const sk = BigInt(privateKeyHex) % bn254.fields.Fr.ORDER;
77
+ const publicKey = bn254.G1.ProjectivePoint.BASE.multiply(sk).toAffine();
78
+ return computeBn254RegistrationDigest(publicKey);
79
+ }
80
+
81
+ /** Solidity `abi.encode(bytes32 domain, bytes message, uint256 counter)`. */
82
+ function abiEncodeHashInput(domain: Buffer, message: Buffer, counter: bigint): Buffer {
83
+ const paddedMessageLength = Math.ceil(message.length / 32) * 32;
84
+ const out = Buffer.alloc(128 + paddedMessageLength);
85
+ domain.copy(out, 0);
86
+ toUint256(96n).copy(out, 32);
87
+ toUint256(counter).copy(out, 64);
88
+ toUint256(BigInt(message.length)).copy(out, 96);
89
+ message.copy(out, 128);
90
+ return out;
91
+ }
92
+
93
+ function toUint256(value: bigint): Buffer {
94
+ return toBufferBE(value, 32);
95
+ }
@@ -0,0 +1,2 @@
1
+ export * from './hash_to_point.js';
2
+ export * from './proof_of_possession_gas.js';