@aztec/ethereum 0.0.1-commit.9b94fc1 → 0.0.1-commit.9ee6fcc6

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 (205) hide show
  1. package/dest/client.d.ts +10 -2
  2. package/dest/client.d.ts.map +1 -1
  3. package/dest/client.js +13 -3
  4. package/dest/config.d.ts +21 -68
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +61 -380
  7. package/dest/contracts/empire_base.d.ts +4 -1
  8. package/dest/contracts/empire_base.d.ts.map +1 -1
  9. package/dest/contracts/empire_slashing_proposer.d.ts +4 -1
  10. package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
  11. package/dest/contracts/empire_slashing_proposer.js +31 -15
  12. package/dest/contracts/fee_asset_handler.d.ts +6 -5
  13. package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
  14. package/dest/contracts/fee_asset_handler.js +11 -9
  15. package/dest/contracts/fee_asset_price_oracle.d.ts +101 -0
  16. package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
  17. package/dest/contracts/fee_asset_price_oracle.js +651 -0
  18. package/dest/contracts/governance.d.ts +3 -1
  19. package/dest/contracts/governance.d.ts.map +1 -1
  20. package/dest/contracts/governance.js +14 -4
  21. package/dest/contracts/governance_proposer.d.ts +4 -1
  22. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  23. package/dest/contracts/governance_proposer.js +404 -9
  24. package/dest/contracts/inbox.d.ts +24 -3
  25. package/dest/contracts/inbox.d.ts.map +1 -1
  26. package/dest/contracts/inbox.js +36 -1
  27. package/dest/contracts/index.d.ts +4 -1
  28. package/dest/contracts/index.d.ts.map +1 -1
  29. package/dest/contracts/index.js +3 -0
  30. package/dest/contracts/log.d.ts +13 -0
  31. package/dest/contracts/log.d.ts.map +1 -0
  32. package/dest/contracts/log.js +1 -0
  33. package/dest/contracts/multicall.d.ts +51 -2
  34. package/dest/contracts/multicall.d.ts.map +1 -1
  35. package/dest/contracts/multicall.js +87 -1
  36. package/dest/contracts/outbox.d.ts +41 -0
  37. package/dest/contracts/outbox.d.ts.map +1 -0
  38. package/dest/contracts/outbox.js +86 -0
  39. package/dest/contracts/registry.d.ts +3 -1
  40. package/dest/contracts/registry.d.ts.map +1 -1
  41. package/dest/contracts/registry.js +30 -1
  42. package/dest/contracts/rollup.d.ts +191 -97
  43. package/dest/contracts/rollup.d.ts.map +1 -1
  44. package/dest/contracts/rollup.js +762 -149
  45. package/dest/contracts/tally_slashing_proposer.d.ts +3 -2
  46. package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
  47. package/dest/contracts/tally_slashing_proposer.js +8 -1
  48. package/dest/deploy_aztec_l1_contracts.d.ts +259 -0
  49. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -0
  50. package/dest/deploy_aztec_l1_contracts.js +413 -0
  51. package/dest/deploy_l1_contract.d.ts +68 -0
  52. package/dest/deploy_l1_contract.d.ts.map +1 -0
  53. package/dest/deploy_l1_contract.js +312 -0
  54. package/dest/forwarder_proxy.d.ts +32 -0
  55. package/dest/forwarder_proxy.d.ts.map +1 -0
  56. package/dest/forwarder_proxy.js +93 -0
  57. package/dest/generated/l1-contracts-defaults.d.ts +30 -0
  58. package/dest/generated/l1-contracts-defaults.d.ts.map +1 -0
  59. package/dest/generated/l1-contracts-defaults.js +30 -0
  60. package/dest/l1_artifacts.d.ts +5975 -1575
  61. package/dest/l1_artifacts.d.ts.map +1 -1
  62. package/dest/l1_contract_addresses.d.ts +1 -1
  63. package/dest/l1_contract_addresses.d.ts.map +1 -1
  64. package/dest/l1_contract_addresses.js +3 -3
  65. package/dest/l1_reader.d.ts +5 -1
  66. package/dest/l1_reader.d.ts.map +1 -1
  67. package/dest/l1_reader.js +12 -1
  68. package/dest/l1_tx_utils/config.d.ts +9 -3
  69. package/dest/l1_tx_utils/config.d.ts.map +1 -1
  70. package/dest/l1_tx_utils/config.js +31 -4
  71. package/dest/l1_tx_utils/constants.d.ts +8 -2
  72. package/dest/l1_tx_utils/constants.d.ts.map +1 -1
  73. package/dest/l1_tx_utils/constants.js +27 -2
  74. package/dest/l1_tx_utils/factory.d.ts +18 -10
  75. package/dest/l1_tx_utils/factory.d.ts.map +1 -1
  76. package/dest/l1_tx_utils/factory.js +17 -7
  77. package/dest/l1_tx_utils/fee-strategies/index.d.ts +10 -0
  78. package/dest/l1_tx_utils/fee-strategies/index.d.ts.map +1 -0
  79. package/dest/l1_tx_utils/fee-strategies/index.js +12 -0
  80. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts +8 -0
  81. package/dest/l1_tx_utils/fee-strategies/p75_competitive.d.ts.map +1 -0
  82. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +129 -0
  83. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts +23 -0
  84. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.d.ts.map +1 -0
  85. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +191 -0
  86. package/dest/l1_tx_utils/fee-strategies/types.d.ts +51 -0
  87. package/dest/l1_tx_utils/fee-strategies/types.d.ts.map +1 -0
  88. package/dest/l1_tx_utils/fee-strategies/types.js +3 -0
  89. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +41 -0
  90. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -0
  91. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +42 -0
  92. package/dest/l1_tx_utils/index-blobs.d.ts +3 -0
  93. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -0
  94. package/dest/l1_tx_utils/index-blobs.js +2 -0
  95. package/dest/l1_tx_utils/index.d.ts +4 -1
  96. package/dest/l1_tx_utils/index.d.ts.map +1 -1
  97. package/dest/l1_tx_utils/index.js +3 -0
  98. package/dest/l1_tx_utils/interfaces.d.ts +2 -2
  99. package/dest/l1_tx_utils/interfaces.d.ts.map +1 -1
  100. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts +233 -0
  101. package/dest/l1_tx_utils/l1_fee_analyzer.d.ts.map +1 -0
  102. package/dest/l1_tx_utils/l1_fee_analyzer.js +506 -0
  103. package/dest/l1_tx_utils/l1_tx_utils.d.ts +18 -7
  104. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  105. package/dest/l1_tx_utils/l1_tx_utils.js +75 -46
  106. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +4 -15
  107. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
  108. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +61 -164
  109. package/dest/l1_tx_utils/tx_delayer.d.ts +56 -0
  110. package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
  111. package/dest/{test → l1_tx_utils}/tx_delayer.js +65 -36
  112. package/dest/publisher_manager.d.ts +21 -6
  113. package/dest/publisher_manager.d.ts.map +1 -1
  114. package/dest/publisher_manager.js +81 -7
  115. package/dest/queries.d.ts +2 -2
  116. package/dest/queries.d.ts.map +1 -1
  117. package/dest/queries.js +12 -4
  118. package/dest/test/chain_monitor.d.ts +35 -14
  119. package/dest/test/chain_monitor.d.ts.map +1 -1
  120. package/dest/test/chain_monitor.js +40 -11
  121. package/dest/test/eth_cheat_codes.d.ts +18 -4
  122. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  123. package/dest/test/eth_cheat_codes.js +10 -6
  124. package/dest/test/index.d.ts +1 -3
  125. package/dest/test/index.d.ts.map +1 -1
  126. package/dest/test/index.js +0 -2
  127. package/dest/test/rollup_cheat_codes.d.ts +9 -6
  128. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  129. package/dest/test/rollup_cheat_codes.js +32 -6
  130. package/dest/test/start_anvil.d.ts +24 -2
  131. package/dest/test/start_anvil.d.ts.map +1 -1
  132. package/dest/test/start_anvil.js +143 -29
  133. package/dest/test/upgrade_utils.js +2 -2
  134. package/dest/types.d.ts +57 -2
  135. package/dest/types.d.ts.map +1 -1
  136. package/dest/utils.d.ts +16 -3
  137. package/dest/utils.d.ts.map +1 -1
  138. package/dest/utils.js +80 -12
  139. package/package.json +33 -16
  140. package/src/client.ts +10 -2
  141. package/src/config.ts +77 -459
  142. package/src/contracts/README.md +157 -0
  143. package/src/contracts/empire_base.ts +3 -1
  144. package/src/contracts/empire_slashing_proposer.ts +28 -28
  145. package/src/contracts/fee_asset_handler.ts +10 -7
  146. package/src/contracts/fee_asset_price_oracle.ts +280 -0
  147. package/src/contracts/governance.ts +13 -4
  148. package/src/contracts/governance_proposer.ts +16 -2
  149. package/src/contracts/inbox.ts +55 -3
  150. package/src/contracts/index.ts +3 -0
  151. package/src/contracts/log.ts +13 -0
  152. package/src/contracts/multicall.ts +70 -3
  153. package/src/contracts/outbox.ts +98 -0
  154. package/src/contracts/registry.ts +31 -1
  155. package/src/contracts/rollup.ts +445 -118
  156. package/src/contracts/tally_slashing_proposer.ts +7 -1
  157. package/src/deploy_aztec_l1_contracts.ts +650 -0
  158. package/src/deploy_l1_contract.ts +362 -0
  159. package/src/forwarder_proxy.ts +108 -0
  160. package/src/generated/l1-contracts-defaults.ts +32 -0
  161. package/src/l1_contract_addresses.ts +22 -20
  162. package/src/l1_reader.ts +21 -1
  163. package/src/l1_tx_utils/config.ts +44 -6
  164. package/src/l1_tx_utils/constants.ts +13 -2
  165. package/src/l1_tx_utils/factory.ts +31 -31
  166. package/src/l1_tx_utils/fee-strategies/index.ts +22 -0
  167. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +163 -0
  168. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +245 -0
  169. package/src/l1_tx_utils/fee-strategies/types.ts +56 -0
  170. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +108 -0
  171. package/src/l1_tx_utils/index-blobs.ts +2 -0
  172. package/src/l1_tx_utils/index.ts +3 -0
  173. package/src/l1_tx_utils/interfaces.ts +1 -1
  174. package/src/l1_tx_utils/l1_fee_analyzer.ts +803 -0
  175. package/src/l1_tx_utils/l1_tx_utils.ts +84 -36
  176. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +75 -210
  177. package/src/{test → l1_tx_utils}/tx_delayer.ts +82 -52
  178. package/src/publisher_manager.ts +107 -10
  179. package/src/queries.ts +11 -3
  180. package/src/test/chain_monitor.ts +77 -18
  181. package/src/test/eth_cheat_codes.ts +8 -6
  182. package/src/test/index.ts +0 -2
  183. package/src/test/rollup_cheat_codes.ts +32 -9
  184. package/src/test/start_anvil.ts +178 -28
  185. package/src/test/upgrade_utils.ts +2 -2
  186. package/src/types.ts +62 -0
  187. package/src/utils.ts +100 -15
  188. package/dest/deploy_l1_contracts.d.ts +0 -673
  189. package/dest/deploy_l1_contracts.d.ts.map +0 -1
  190. package/dest/deploy_l1_contracts.js +0 -1491
  191. package/dest/index.d.ts +0 -18
  192. package/dest/index.d.ts.map +0 -1
  193. package/dest/index.js +0 -17
  194. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
  195. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
  196. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
  197. package/dest/test/delayed_tx_utils.d.ts +0 -13
  198. package/dest/test/delayed_tx_utils.d.ts.map +0 -1
  199. package/dest/test/delayed_tx_utils.js +0 -28
  200. package/dest/test/tx_delayer.d.ts +0 -36
  201. package/dest/test/tx_delayer.d.ts.map +0 -1
  202. package/src/deploy_l1_contracts.ts +0 -1869
  203. package/src/index.ts +0 -17
  204. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
  205. package/src/test/delayed_tx_utils.ts +0 -52
@@ -0,0 +1,56 @@
1
+ import { type Logger, type LoggerBindings } from '@aztec/foundation/log';
2
+ import type { DateProvider } from '@aztec/foundation/timer';
3
+ import { type Client, type Hex } from 'viem';
4
+ import type { ViemClient } from '../types.js';
5
+ export declare function waitUntilBlock<T extends Client>(client: T, blockNumber: number | bigint, logger?: Logger, timeout?: number): Promise<boolean>;
6
+ export declare function waitUntilL1Timestamp<T extends Client>(client: T, timestamp: number | bigint, logger?: Logger, timeout?: number): Promise<boolean>;
7
+ /** Manages tx delaying for testing, intercepting sendRawTransaction calls to delay or cancel them. */
8
+ export declare class Delayer {
9
+ dateProvider: DateProvider;
10
+ private logger;
11
+ maxInclusionTimeIntoSlot: number | undefined;
12
+ ethereumSlotDuration: bigint;
13
+ nextWait: {
14
+ l1Timestamp: bigint;
15
+ } | {
16
+ l1BlockNumber: bigint;
17
+ } | {
18
+ indefinitely: true;
19
+ } | undefined;
20
+ sentTxHashes: Hex[];
21
+ cancelledTxs: Hex[];
22
+ constructor(dateProvider: DateProvider, opts: {
23
+ ethereumSlotDuration: bigint | number;
24
+ }, bindings: LoggerBindings);
25
+ /** Returns the logger instance used by this delayer. */
26
+ getLogger(): Logger;
27
+ /** Returns the hashes of all effectively sent txs. */
28
+ getSentTxHashes(): `0x${string}`[];
29
+ /** Returns the raw hex for all cancelled txs. */
30
+ getCancelledTxs(): Hex[];
31
+ /** Delays the next tx to be sent so it lands on the given L1 block number. */
32
+ pauseNextTxUntilBlock(l1BlockNumber: number | bigint): void;
33
+ /** Delays the next tx to be sent so it lands on the given timestamp. */
34
+ pauseNextTxUntilTimestamp(l1Timestamp: number | bigint): void;
35
+ /** Delays the next tx to be sent indefinitely. */
36
+ cancelNextTx(): void;
37
+ /**
38
+ * Sets max inclusion time into slot. If more than this many seconds have passed
39
+ * since the last L1 block was mined, then any tx will not be mined in the current
40
+ * L1 slot but will be deferred for the next one.
41
+ */
42
+ setMaxInclusionTimeIntoSlot(seconds: number | undefined): void;
43
+ }
44
+ /**
45
+ * Creates a new Delayer instance. Exposed so callers can create a single shared delayer
46
+ * and pass it to multiple `wrapClientWithDelayer` calls.
47
+ */
48
+ export declare function createDelayer(dateProvider: DateProvider, opts: {
49
+ ethereumSlotDuration: bigint | number;
50
+ }, bindings: LoggerBindings): Delayer;
51
+ /**
52
+ * Wraps a viem client with tx delaying logic. Returns the wrapped client.
53
+ * The delayer intercepts sendRawTransaction calls and delays them based on the delayer's state.
54
+ */
55
+ export declare function wrapClientWithDelayer<T extends ViemClient>(client: T, delayer: Delayer): T;
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfZGVsYXllci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2wxX3R4X3V0aWxzL3R4X2RlbGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzVELE9BQU8sRUFDTCxLQUFLLE1BQU0sRUFDWCxLQUFLLEdBQUcsRUFVVCxNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sS0FBSyxFQUE0QixVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJeEUsd0JBQWdCLGNBQWMsQ0FBQyxDQUFDLFNBQVMsTUFBTSxFQUM3QyxNQUFNLEVBQUUsQ0FBQyxFQUNULFdBQVcsRUFBRSxNQUFNLEdBQUcsTUFBTSxFQUM1QixNQUFNLENBQUMsRUFBRSxNQUFNLEVBQ2YsT0FBTyxDQUFDLEVBQUUsTUFBTSxvQkFpQmpCO0FBRUQsd0JBQWdCLG9CQUFvQixDQUFDLENBQUMsU0FBUyxNQUFNLEVBQ25ELE1BQU0sRUFBRSxDQUFDLEVBQ1QsU0FBUyxFQUFFLE1BQU0sR0FBRyxNQUFNLEVBQzFCLE1BQU0sQ0FBQyxFQUFFLE1BQU0sRUFDZixPQUFPLENBQUMsRUFBRSxNQUFNLG9CQXdCakI7QUFFRCxzR0FBc0c7QUFDdEcscUJBQWEsT0FBTztJQVVULFlBQVksRUFBRSxZQUFZO0lBVG5DLE9BQU8sQ0FBQyxNQUFNLENBQVM7SUFFaEIsd0JBQXdCLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBYTtJQUN6RCxvQkFBb0IsRUFBRSxNQUFNLENBQUM7SUFDN0IsUUFBUSxFQUFFO1FBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEdBQUc7UUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFBO0tBQUUsR0FBRztRQUFFLFlBQVksRUFBRSxJQUFJLENBQUE7S0FBRSxHQUFHLFNBQVMsQ0FBYTtJQUMvRyxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQU07SUFDekIsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFNO0lBRWhDLFlBQ1MsWUFBWSxFQUFFLFlBQVksRUFDakMsSUFBSSxFQUFFO1FBQUUsb0JBQW9CLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQTtLQUFFLEVBQy9DLFFBQVEsRUFBRSxjQUFjLEVBSXpCO0lBRUQsd0RBQXdEO0lBQ3hELFNBQVMsSUFBSSxNQUFNLENBRWxCO0lBRUQsc0RBQXNEO0lBQ3RELGVBQWUsb0JBRWQ7SUFFRCxpREFBaUQ7SUFDakQsZUFBZSxJQUFJLEdBQUcsRUFBRSxDQUV2QjtJQUVELDhFQUE4RTtJQUM5RSxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsTUFBTSxHQUFHLE1BQU0sUUFFbkQ7SUFFRCx3RUFBd0U7SUFDeEUseUJBQXlCLENBQUMsV0FBVyxFQUFFLE1BQU0sR0FBRyxNQUFNLFFBRXJEO0lBRUQsa0RBQWtEO0lBQ2xELFlBQVksU0FFWDtJQUVEOzs7O09BSUc7SUFDSCwyQkFBMkIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLFNBQVMsUUFFdEQ7Q0FDRjtBQUVEOzs7R0FHRztBQUNILHdCQUFnQixhQUFhLENBQzNCLFlBQVksRUFBRSxZQUFZLEVBQzFCLElBQUksRUFBRTtJQUFFLG9CQUFvQixFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUE7Q0FBRSxFQUMvQyxRQUFRLEVBQUUsY0FBYyxHQUN2QixPQUFPLENBRVQ7QUFhRDs7O0dBR0c7QUFDSCx3QkFBZ0IscUJBQXFCLENBQUMsQ0FBQyxTQUFTLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQWtIMUYifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx_delayer.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/tx_delayer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAEvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,EACL,KAAK,MAAM,EACX,KAAK,GAAG,EAUT,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EAA4B,UAAU,EAAE,MAAM,aAAa,CAAC;AAIxE,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAC7C,MAAM,EAAE,CAAC,EACT,WAAW,EAAE,MAAM,GAAG,MAAM,EAC5B,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,oBAiBjB;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EACnD,MAAM,EAAE,CAAC,EACT,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,oBAwBjB;AAED,sGAAsG;AACtG,qBAAa,OAAO;IAUT,YAAY,EAAE,YAAY;IATnC,OAAO,CAAC,MAAM,CAAS;IAEhB,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAa;IACzD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,YAAY,EAAE,IAAI,CAAA;KAAE,GAAG,SAAS,CAAa;IAC/G,YAAY,EAAE,GAAG,EAAE,CAAM;IACzB,YAAY,EAAE,GAAG,EAAE,CAAM;IAEhC,YACS,YAAY,EAAE,YAAY,EACjC,IAAI,EAAE;QAAE,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,EAC/C,QAAQ,EAAE,cAAc,EAIzB;IAED,wDAAwD;IACxD,SAAS,IAAI,MAAM,CAElB;IAED,sDAAsD;IACtD,eAAe,oBAEd;IAED,iDAAiD;IACjD,eAAe,IAAI,GAAG,EAAE,CAEvB;IAED,8EAA8E;IAC9E,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,QAEnD;IAED,wEAAwE;IACxE,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,QAErD;IAED,kDAAkD;IAClD,YAAY,SAEX;IAED;;;;OAIG;IACH,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,QAEtD;CACF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE;IAAE,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAC/C,QAAQ,EAAE,cAAc,GACvB,OAAO,CAET;AAaD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,CAkH1F"}
@@ -2,8 +2,8 @@ import { omit } from '@aztec/foundation/collection';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
3
  import { retryUntil } from '@aztec/foundation/retry';
4
4
  import { inspect } from 'util';
5
- import { keccak256, parseTransaction, publicActions, serializeTransaction, walletActions } from 'viem';
6
- import { isExtendedClient } from '../types.js';
5
+ import { keccak256, parseTransaction, publicActions, recoverTransactionAddress, serializeTransaction, walletActions } from 'viem';
6
+ const MAX_WAIT_TIME_SECONDS = 180;
7
7
  export function waitUntilBlock(client, blockNumber, logger, timeout) {
8
8
  const publicClient = 'getBlockNumber' in client && typeof client.getBlockNumber === 'function' ? client : client.extend(publicActions);
9
9
  return retryUntil(async ()=>{
@@ -12,7 +12,7 @@ export function waitUntilBlock(client, blockNumber, logger, timeout) {
12
12
  });
13
13
  logger?.debug(`Block number is ${currentBlockNumber} (waiting until ${blockNumber})`);
14
14
  return currentBlockNumber >= BigInt(blockNumber);
15
- }, `Wait until L1 block ${blockNumber}`, timeout ?? 120, 0.1);
15
+ }, `Wait until L1 block ${blockNumber}`, timeout ?? MAX_WAIT_TIME_SECONDS, 0.1);
16
16
  }
17
17
  export function waitUntilL1Timestamp(client, timestamp, logger, timeout) {
18
18
  const publicClient = 'getBlockNumber' in client && typeof client.getBlockNumber === 'function' ? client : client.extend(publicActions);
@@ -32,61 +32,80 @@ export function waitUntilL1Timestamp(client, timestamp, logger, timeout) {
32
32
  const currentTs = currentBlock.timestamp;
33
33
  logger?.debug(`Block timstamp is ${currentTs} (waiting until ${timestamp})`);
34
34
  return currentTs >= BigInt(timestamp);
35
- }, `Wait until L1 timestamp ${timestamp}`, timeout ?? 120, 0.1);
35
+ }, `Wait until L1 timestamp ${timestamp}`, timeout ?? MAX_WAIT_TIME_SECONDS, 0.1);
36
36
  }
37
- class DelayerImpl {
37
+ /** Manages tx delaying for testing, intercepting sendRawTransaction calls to delay or cancel them. */ export class Delayer {
38
38
  dateProvider;
39
39
  logger;
40
- constructor(dateProvider, opts){
40
+ maxInclusionTimeIntoSlot;
41
+ ethereumSlotDuration;
42
+ nextWait;
43
+ sentTxHashes;
44
+ cancelledTxs;
45
+ constructor(dateProvider, opts, bindings){
41
46
  this.dateProvider = dateProvider;
42
- this.logger = createLogger('ethereum:tx_delayer');
43
47
  this.maxInclusionTimeIntoSlot = undefined;
44
48
  this.nextWait = undefined;
45
49
  this.sentTxHashes = [];
46
50
  this.cancelledTxs = [];
47
51
  this.ethereumSlotDuration = BigInt(opts.ethereumSlotDuration);
52
+ this.logger = createLogger('ethereum:tx_delayer', bindings);
48
53
  }
49
- maxInclusionTimeIntoSlot;
50
- ethereumSlotDuration;
51
- nextWait;
52
- sentTxHashes;
53
- cancelledTxs;
54
- getSentTxHashes() {
54
+ /** Returns the logger instance used by this delayer. */ getLogger() {
55
+ return this.logger;
56
+ }
57
+ /** Returns the hashes of all effectively sent txs. */ getSentTxHashes() {
55
58
  return this.sentTxHashes;
56
59
  }
57
- getCancelledTxs() {
60
+ /** Returns the raw hex for all cancelled txs. */ getCancelledTxs() {
58
61
  return this.cancelledTxs;
59
62
  }
60
- pauseNextTxUntilBlock(l1BlockNumber) {
63
+ /** Delays the next tx to be sent so it lands on the given L1 block number. */ pauseNextTxUntilBlock(l1BlockNumber) {
61
64
  this.nextWait = {
62
65
  l1BlockNumber: BigInt(l1BlockNumber)
63
66
  };
64
67
  }
65
- pauseNextTxUntilTimestamp(l1Timestamp) {
68
+ /** Delays the next tx to be sent so it lands on the given timestamp. */ pauseNextTxUntilTimestamp(l1Timestamp) {
66
69
  this.nextWait = {
67
70
  l1Timestamp: BigInt(l1Timestamp)
68
71
  };
69
72
  }
70
- cancelNextTx() {
73
+ /** Delays the next tx to be sent indefinitely. */ cancelNextTx() {
71
74
  this.nextWait = {
72
75
  indefinitely: true
73
76
  };
74
77
  }
75
- setMaxInclusionTimeIntoSlot(seconds) {
78
+ /**
79
+ * Sets max inclusion time into slot. If more than this many seconds have passed
80
+ * since the last L1 block was mined, then any tx will not be mined in the current
81
+ * L1 slot but will be deferred for the next one.
82
+ */ setMaxInclusionTimeIntoSlot(seconds) {
76
83
  this.maxInclusionTimeIntoSlot = seconds;
77
84
  }
78
85
  }
79
86
  /**
80
- * Returns a new client (without modifying the one passed in) with an injected tx delayer.
81
- * The delayer can be used to hold off the next tx to be sent until a given block number.
82
- * TODO(#10824): This doesn't play along well with blob txs for some reason.
83
- */ export function withDelayer(client, dateProvider, opts) {
84
- if (!isExtendedClient(client)) {
85
- throw new Error('withDelayer has to be instantiated with a wallet viem client.');
87
+ * Creates a new Delayer instance. Exposed so callers can create a single shared delayer
88
+ * and pass it to multiple `wrapClientWithDelayer` calls.
89
+ */ export function createDelayer(dateProvider, opts, bindings) {
90
+ return new Delayer(dateProvider, opts, bindings);
91
+ }
92
+ /** Tries to recover the sender address from a serialized signed transaction. */ async function tryRecoverSender(serializedTransaction) {
93
+ try {
94
+ return await recoverTransactionAddress({
95
+ serializedTransaction: serializedTransaction
96
+ });
97
+ } catch {
98
+ return undefined;
86
99
  }
87
- const logger = createLogger('ethereum:tx_delayer');
88
- const delayer = new DelayerImpl(dateProvider, opts);
89
- const extended = client// Tweak sendRawTransaction so it uses the delay defined in the delayer.
100
+ }
101
+ /**
102
+ * Wraps a viem client with tx delaying logic. Returns the wrapped client.
103
+ * The delayer intercepts sendRawTransaction calls and delays them based on the delayer's state.
104
+ */ export function wrapClientWithDelayer(client, delayer) {
105
+ const logger = delayer.getLogger();
106
+ // Cast to ExtendedViemWalletClient for the extend chain since it has sendRawTransaction.
107
+ // The sendRawTransaction override is applied to all clients regardless of type.
108
+ const withRawTx = client// Tweak sendRawTransaction so it uses the delay defined in the delayer.
90
109
  // Note that this will only work with local accounts (ie accounts for which we have the private key).
91
110
  // Transactions signed by the node will not be delayed since they use sendTransaction directly,
92
111
  // but we do not use them in our codebase at all.
@@ -96,6 +115,7 @@ class DelayerImpl {
96
115
  let txHash;
97
116
  const { serializedTransaction } = args[0];
98
117
  const publicClient = client;
118
+ const sender = await tryRecoverSender(serializedTransaction);
99
119
  if (delayer.nextWait !== undefined) {
100
120
  // Check if we have been instructed to delay the next tx.
101
121
  const waitUntil = delayer.nextWait;
@@ -104,13 +124,16 @@ class DelayerImpl {
104
124
  txHash = computeTxHash(serializedTransaction);
105
125
  // Cancel tx outright if instructed
106
126
  if ('indefinitely' in waitUntil && waitUntil.indefinitely) {
107
- logger.info(`Cancelling tx ${txHash}`);
127
+ logger.info(`Cancelling tx ${txHash}`, {
128
+ sender
129
+ });
108
130
  delayer.cancelledTxs.push(serializedTransaction);
109
131
  return Promise.resolve(txHash);
110
132
  }
111
133
  // Or wait until the desired block number or timestamp
112
134
  wait = 'l1BlockNumber' in waitUntil ? waitUntilBlock(publicClient, waitUntil.l1BlockNumber - 1n, logger) : 'l1Timestamp' in waitUntil ? waitUntilL1Timestamp(publicClient, waitUntil.l1Timestamp - delayer.ethereumSlotDuration, logger) : undefined;
113
135
  logger.info(`Delaying tx ${txHash} until ${inspect(waitUntil)}`, {
136
+ sender,
114
137
  argsLen: args.length,
115
138
  ...omit(parseTransaction(serializedTransaction), 'data', 'sidecars')
116
139
  });
@@ -123,6 +146,7 @@ class DelayerImpl {
123
146
  const now = delayer.dateProvider.now();
124
147
  txHash = computeTxHash(serializedTransaction);
125
148
  const logData = {
149
+ sender,
126
150
  ...omit(parseTransaction(serializedTransaction), 'data', 'sidecars'),
127
151
  lastBlockTimestamp,
128
152
  now,
@@ -149,29 +173,34 @@ class DelayerImpl {
149
173
  computedTxHash: txHash
150
174
  });
151
175
  }
152
- logger.info(`Sent previously delayed tx ${clientTxHash}`);
176
+ logger.info(`Sent previously delayed tx ${clientTxHash}`, {
177
+ sender
178
+ });
153
179
  delayer.sentTxHashes.push(clientTxHash);
154
180
  }).catch((err)=>logger.error(`Error sending tx after delay`, err));
155
181
  return Promise.resolve(txHash);
156
182
  } else {
157
183
  const txHash = await client.sendRawTransaction(...args);
158
- logger.verbose(`Sent tx immediately ${txHash}`);
184
+ logger.debug(`Sent tx immediately ${txHash}`, {
185
+ sender
186
+ });
159
187
  delayer.sentTxHashes.push(txHash);
160
188
  return txHash;
161
189
  }
162
190
  }
163
- }))// Re-extend with sendTransaction so it uses the modified sendRawTransaction.
191
+ }));
192
+ // Only re-bind wallet actions (sendTransaction, writeContract, deployContract) for wallet clients.
193
+ // This is needed for tests that use wallet actions directly rather than sendRawTransaction.
194
+ const isWalletClient = 'account' in client && client.account !== undefined;
195
+ const extended = isWalletClient ? withRawTx// Re-extend with sendTransaction so it uses the modified sendRawTransaction.
164
196
  .extend((client)=>({
165
197
  sendTransaction: walletActions(client).sendTransaction
166
198
  }))// And with the actions that depend on the modified sendTransaction
167
199
  .extend((client)=>({
168
200
  writeContract: walletActions(client).writeContract,
169
201
  deployContract: walletActions(client).deployContract
170
- }));
171
- return {
172
- client: extended,
173
- delayer
174
- };
202
+ })) : withRawTx;
203
+ return extended;
175
204
  }
176
205
  /**
177
206
  * Compute the tx hash given the serialized tx. Note that if this is a blob tx, we need to
@@ -1,15 +1,30 @@
1
+ import { type LoggerBindings } from '@aztec/foundation/log';
1
2
  import { L1TxUtils } from './l1_tx_utils/index.js';
2
3
  export type PublisherFilter<UtilsType extends L1TxUtils> = (utils: UtilsType) => boolean;
4
+ /** Config accepted by PublisherManager. */
5
+ type PublisherManagerConfig = {
6
+ publisherAllowInvalidStates?: boolean;
7
+ publisherFundingThreshold?: bigint;
8
+ publisherFundingAmount?: bigint;
9
+ };
3
10
  export declare class PublisherManager<UtilsType extends L1TxUtils = L1TxUtils> {
4
11
  private publishers;
5
12
  private log;
6
13
  private config;
7
- constructor(publishers: UtilsType[], config: {
8
- publisherAllowInvalidStates?: boolean;
14
+ private static readonly FUNDING_CHECK_INTERVAL_MS;
15
+ private funder?;
16
+ private fundingPromise?;
17
+ constructor(publishers: UtilsType[], config: PublisherManagerConfig, opts?: {
18
+ bindings?: LoggerBindings;
19
+ funder?: UtilsType;
9
20
  });
10
- /** Loads the state of all publishers and resumes monitoring any pending txs */
11
- loadState(): Promise<void>;
21
+ /** Loads the state of all publishers and the funder, and starts periodic funding checks. */
22
+ start(): Promise<void>;
23
+ /** Stops the funding loop and interrupts all publishers. */
24
+ stop(): Promise<void>;
12
25
  getAvailablePublisher(filter?: PublisherFilter<UtilsType>): Promise<UtilsType>;
13
- interrupt(): void;
26
+ private triggerFundingIfNeeded;
27
+ private fundPublishers;
14
28
  }
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaGVyX21hbmFnZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wdWJsaXNoZXJfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsU0FBUyxFQUFnQixNQUFNLHdCQUF3QixDQUFDO0FBd0JqRSxNQUFNLE1BQU0sZUFBZSxDQUFDLFNBQVMsU0FBUyxTQUFTLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxLQUFLLE9BQU8sQ0FBQztBQUV6RixxQkFBYSxnQkFBZ0IsQ0FBQyxTQUFTLFNBQVMsU0FBUyxHQUFHLFNBQVM7SUFLakUsT0FBTyxDQUFDLFVBQVU7SUFKcEIsT0FBTyxDQUFDLEdBQUcsQ0FBcUM7SUFDaEQsT0FBTyxDQUFDLE1BQU0sQ0FBNEM7SUFFMUQsWUFDVSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQy9CLE1BQU0sRUFBRTtRQUFFLDJCQUEyQixDQUFDLEVBQUUsT0FBTyxDQUFBO0tBQUUsRUFLbEQ7SUFFRCwrRUFBK0U7SUFDbEUsU0FBUyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFdEM7SUFRWSxxQkFBcUIsQ0FBQyxNQUFNLEdBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBYyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0ErQ3RHO0lBRU0sU0FBUyxTQUVmO0NBQ0YifQ==
29
+ export {};
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGlzaGVyX21hbmFnZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wdWJsaXNoZXJfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWUsS0FBSyxjQUFjLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFJdkYsT0FBTyxFQUFFLFNBQVMsRUFBZ0IsTUFBTSx3QkFBd0IsQ0FBQztBQXdCakUsTUFBTSxNQUFNLGVBQWUsQ0FBQyxTQUFTLFNBQVMsU0FBUyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsS0FBSyxPQUFPLENBQUM7QUFFekYsMkNBQTJDO0FBQzNDLEtBQUssc0JBQXNCLEdBQUc7SUFDNUIsMkJBQTJCLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDdEMseUJBQXlCLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDbkMsc0JBQXNCLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDakMsQ0FBQztBQUVGLHFCQUFhLGdCQUFnQixDQUFDLFNBQVMsU0FBUyxTQUFTLEdBQUcsU0FBUztJQVFqRSxPQUFPLENBQUMsVUFBVTtJQVBwQixPQUFPLENBQUMsR0FBRyxDQUFTO0lBQ3BCLE9BQU8sQ0FBQyxNQUFNLENBQXlCO0lBQ3ZDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFpQjtJQUNsRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQVk7SUFDM0IsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFpQjtJQUV4QyxZQUNVLFVBQVUsRUFBRSxTQUFTLEVBQUUsRUFDL0IsTUFBTSxFQUFFLHNCQUFzQixFQUM5QixJQUFJLENBQUMsRUFBRTtRQUFFLFFBQVEsQ0FBQyxFQUFFLGNBQWMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQTtLQUFFLEVBcUJ6RDtJQUVELDRGQUE0RjtJQUMvRSxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQWtCbEM7SUFFRCw0REFBNEQ7SUFDL0MsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FJakM7SUFRWSxxQkFBcUIsQ0FBQyxNQUFNLEdBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBYyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0ErQ3RHO1lBR2Esc0JBQXNCO1lBcUN0QixjQUFjO0NBVTdCIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"publisher_manager.d.ts","sourceRoot":"","sources":["../src/publisher_manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAgB,MAAM,wBAAwB,CAAC;AAwBjE,MAAM,MAAM,eAAe,CAAC,SAAS,SAAS,SAAS,IAAI,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC;AAEzF,qBAAa,gBAAgB,CAAC,SAAS,SAAS,SAAS,GAAG,SAAS;IAKjE,OAAO,CAAC,UAAU;IAJpB,OAAO,CAAC,GAAG,CAAqC;IAChD,OAAO,CAAC,MAAM,CAA4C;IAE1D,YACU,UAAU,EAAE,SAAS,EAAE,EAC/B,MAAM,EAAE;QAAE,2BAA2B,CAAC,EAAE,OAAO,CAAA;KAAE,EAKlD;IAED,+EAA+E;IAClE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtC;IAQY,qBAAqB,CAAC,MAAM,GAAE,eAAe,CAAC,SAAS,CAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CA+CtG;IAEM,SAAS,SAEf;CACF"}
1
+ {"version":3,"file":"publisher_manager.d.ts","sourceRoot":"","sources":["../src/publisher_manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAIvF,OAAO,EAAE,SAAS,EAAgB,MAAM,wBAAwB,CAAC;AAwBjE,MAAM,MAAM,eAAe,CAAC,SAAS,SAAS,SAAS,IAAI,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC;AAEzF,2CAA2C;AAC3C,KAAK,sBAAsB,GAAG;IAC5B,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,qBAAa,gBAAgB,CAAC,SAAS,SAAS,SAAS,GAAG,SAAS;IAQjE,OAAO,CAAC,UAAU;IAPpB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAiB;IAClE,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAiB;IAExC,YACU,UAAU,EAAE,SAAS,EAAE,EAC/B,MAAM,EAAE,sBAAsB,EAC9B,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,cAAc,CAAC;QAAC,MAAM,CAAC,EAAE,SAAS,CAAA;KAAE,EAqBzD;IAED,4FAA4F;IAC/E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBlC;IAED,4DAA4D;IAC/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAIjC;IAQY,qBAAqB,CAAC,MAAM,GAAE,eAAe,CAAC,SAAS,CAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CA+CtG;YAGa,sBAAsB;YAqCtB,cAAc;CAU7B"}
@@ -1,5 +1,7 @@
1
1
  import { pick } from '@aztec/foundation/collection';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
+ import { RunningPromise } from '@aztec/foundation/running-promise';
4
+ import { Multicall3 } from './contracts/multicall.js';
3
5
  import { TxUtilsState } from './l1_tx_utils/index.js';
4
6
  // Defines the order in which we prioritise publishers based on their state (first is better)
5
7
  const sortOrder = [
@@ -25,15 +27,43 @@ export class PublisherManager {
25
27
  publishers;
26
28
  log;
27
29
  config;
28
- constructor(publishers, config){
30
+ static FUNDING_CHECK_INTERVAL_MS = 2 * 60 * 1000;
31
+ funder;
32
+ fundingPromise;
33
+ constructor(publishers, config, opts){
29
34
  this.publishers = publishers;
30
- this.log = createLogger('publisher:manager');
35
+ this.funder = opts?.funder;
36
+ this.log = createLogger('publisher:manager', opts?.bindings);
31
37
  this.log.info(`PublisherManager initialized with ${publishers.length} publishers.`);
32
38
  this.publishers = publishers;
33
- this.config = pick(config, 'publisherAllowInvalidStates');
39
+ this.config = pick(config, 'publisherAllowInvalidStates', 'publisherFundingThreshold', 'publisherFundingAmount');
40
+ const hasThreshold = this.config.publisherFundingThreshold !== undefined;
41
+ const hasAmount = this.config.publisherFundingAmount !== undefined;
42
+ if (hasThreshold !== hasAmount) {
43
+ this.log.warn(`Incomplete funding config: both publisherFundingThreshold and publisherFundingAmount must be set`);
44
+ }
45
+ if (this.funder) {
46
+ const funderAddress = this.funder.getSenderAddress();
47
+ if (publishers.some((p)=>p.getSenderAddress().equals(funderAddress))) {
48
+ this.log.error(`Funding account ${funderAddress} is also a publisher, disabling funding to avoid self-funding`);
49
+ this.funder = undefined;
50
+ }
51
+ }
52
+ }
53
+ /** Loads the state of all publishers and the funder, and starts periodic funding checks. */ async start() {
54
+ await Promise.all([
55
+ ...this.publishers.map((pub)=>pub.loadStateAndResumeMonitoring()),
56
+ this.funder?.loadStateAndResumeMonitoring()
57
+ ]);
58
+ if (this.funder && this.config.publisherFundingThreshold !== undefined && this.config.publisherFundingAmount !== undefined) {
59
+ this.fundingPromise = new RunningPromise(()=>this.triggerFundingIfNeeded(), this.log, PublisherManager.FUNDING_CHECK_INTERVAL_MS);
60
+ this.fundingPromise.start();
61
+ }
34
62
  }
35
- /** Loads the state of all publishers and resumes monitoring any pending txs */ async loadState() {
36
- await Promise.all(this.publishers.map((pub)=>pub.loadStateAndResumeMonitoring()));
63
+ /** Stops the funding loop and interrupts all publishers. */ async stop() {
64
+ await this.fundingPromise?.stop();
65
+ this.publishers.forEach((pub)=>pub.interrupt());
66
+ this.funder?.interrupt();
37
67
  }
38
68
  // Finds and prioritises available publishers based on
39
69
  // 1. Validity as per the provided filter function
@@ -82,7 +112,51 @@ export class PublisherManager {
82
112
  });
83
113
  return sortedPublishers[0].publisher;
84
114
  }
85
- interrupt() {
86
- this.publishers.forEach((pub)=>pub.interrupt());
115
+ /** Check all publisher balances and fund those below threshold. */ async triggerFundingIfNeeded() {
116
+ const { funder, config } = this;
117
+ if (!funder || config.publisherFundingThreshold === undefined || config.publisherFundingAmount === undefined) {
118
+ return;
119
+ }
120
+ const allBalances = await Promise.all(this.publishers.map(async (pub)=>({
121
+ balance: await pub.getSenderBalance(),
122
+ publisher: pub
123
+ })));
124
+ const lowBalance = allBalances.filter((p)=>p.balance < config.publisherFundingThreshold);
125
+ if (lowBalance.length === 0) {
126
+ return;
127
+ }
128
+ const fundingAmount = config.publisherFundingAmount;
129
+ const funderBalance = await funder.getSenderBalance();
130
+ if (funderBalance < 10n * fundingAmount) {
131
+ this.log.warn(`Funding account balance is low`, {
132
+ funderBalance,
133
+ threshold: 10n * fundingAmount
134
+ });
135
+ }
136
+ const affordableCount = Number(funderBalance / fundingAmount);
137
+ if (affordableCount === 0) {
138
+ this.log.error(`Funding account balance too low to fund any publisher`, {
139
+ funderBalance,
140
+ fundingAmount
141
+ });
142
+ return;
143
+ }
144
+ if (affordableCount < lowBalance.length) {
145
+ this.log.warn(`Funder can only afford ${affordableCount}/${lowBalance.length} publishers`, {
146
+ funderBalance,
147
+ fundingAmount
148
+ });
149
+ }
150
+ const toFund = lowBalance.slice(0, affordableCount).map((p)=>p.publisher);
151
+ await this.fundPublishers(toFund);
152
+ }
153
+ /** Fund publishers via a single Multicall3 aggregate3Value transaction. */ async fundPublishers(publishers) {
154
+ const fundingAmount = this.config.publisherFundingAmount;
155
+ const calls = publishers.map((pub)=>({
156
+ to: pub.getSenderAddress().toString(),
157
+ value: fundingAmount
158
+ }));
159
+ await Multicall3.forwardValue(calls, this.funder, this.log);
160
+ this.log.info(`Funded ${publishers.length} publishers`);
87
161
  }
88
162
  }
package/dest/queries.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { EthAddress } from '@aztec/foundation/eth-address';
2
- import type { L1ContractsConfig } from './config.js';
2
+ import { type L1ContractsConfig } from './config.js';
3
3
  import type { ViemPublicClient } from './types.js';
4
4
  /** Reads the L1ContractsConfig from L1 contracts. */
5
5
  export declare function getL1ContractsConfig(publicClient: ViemPublicClient, addresses: {
@@ -11,4 +11,4 @@ export declare function getL1ContractsConfig(publicClient: ViemPublicClient, add
11
11
  rollupVersion: number;
12
12
  genesisArchiveTreeRoot: `0x${string}`;
13
13
  }>;
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcmllcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3F1ZXJpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTNELE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSXJELE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRW5ELHFEQUFxRDtBQUNyRCx3QkFBc0Isb0JBQW9CLENBQ3hDLFlBQVksRUFBRSxnQkFBZ0IsRUFDOUIsU0FBUyxFQUFFO0lBQUUsaUJBQWlCLEVBQUUsVUFBVSxDQUFDO0lBQUMsYUFBYSxDQUFDLEVBQUUsVUFBVSxDQUFBO0NBQUUsR0FDdkUsT0FBTyxDQUNSLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxHQUFHO0lBQ2hELFlBQVksRUFBRSxNQUFNLENBQUM7SUFDckIsYUFBYSxFQUFFLE1BQU0sQ0FBQztJQUN0QixhQUFhLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLHNCQUFzQixFQUFFLEtBQUssTUFBTSxFQUFFLENBQUM7Q0FDdkMsQ0FDRixDQWdHQSJ9
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcmllcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3F1ZXJpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTNELE9BQU8sRUFBNEIsS0FBSyxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUsvRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVuRCxxREFBcUQ7QUFDckQsd0JBQXNCLG9CQUFvQixDQUN4QyxZQUFZLEVBQUUsZ0JBQWdCLEVBQzlCLFNBQVMsRUFBRTtJQUFFLGlCQUFpQixFQUFFLFVBQVUsQ0FBQztJQUFDLGFBQWEsQ0FBQyxFQUFFLFVBQVUsQ0FBQTtDQUFFLEdBQ3ZFLE9BQU8sQ0FDUixJQUFJLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsR0FBRztJQUNoRCxZQUFZLEVBQUUsTUFBTSxDQUFDO0lBQ3JCLGFBQWEsRUFBRSxNQUFNLENBQUM7SUFDdEIsYUFBYSxFQUFFLE1BQU0sQ0FBQztJQUN0QixzQkFBc0IsRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO0NBQ3ZDLENBQ0YsQ0F1R0EifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,qDAAqD;AACrD,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,gBAAgB,EAC9B,SAAS,EAAE;IAAE,iBAAiB,EAAE,UAAU,CAAC;IAAC,aAAa,CAAC,EAAE,UAAU,CAAA;CAAE,GACvE,OAAO,CACR,IAAI,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,GAAG;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,KAAK,MAAM,EAAE,CAAC;CACvC,CACF,CAgGA"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAA4B,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAK/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,qDAAqD;AACrD,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,gBAAgB,EAC9B,SAAS,EAAE;IAAE,iBAAiB,EAAE,UAAU,CAAC;IAAC,aAAa,CAAC,EAAE,UAAU,CAAA;CAAE,GACvE,OAAO,CACR,IAAI,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,GAAG;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,KAAK,MAAM,EAAE,CAAC;CACvC,CACF,CAuGA"}
package/dest/queries.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { EthAddress } from '@aztec/foundation/eth-address';
2
+ import { DefaultL1ContractsConfig } from './config.js';
2
3
  import { ReadOnlyGovernanceContract } from './contracts/governance.js';
3
4
  import { GovernanceProposerContract } from './contracts/governance_proposer.js';
5
+ import { InboxContract } from './contracts/inbox.js';
4
6
  import { RollupContract } from './contracts/rollup.js';
5
7
  /** Reads the L1ContractsConfig from L1 contracts. */ export async function getL1ContractsConfig(publicClient, addresses) {
6
8
  const governance = new ReadOnlyGovernanceContract(addresses.governanceAddress.toString(), publicClient);
@@ -10,7 +12,9 @@ import { RollupContract } from './contracts/rollup.js';
10
12
  const rollup = new RollupContract(publicClient, rollupAddress.toString());
11
13
  const slasherProposer = await rollup.getSlashingProposer();
12
14
  const slasher = await rollup.getSlasherContract();
13
- const [l1StartBlock, l1GenesisTime, aztecEpochDuration, aztecSlotDuration, aztecProofSubmissionEpochs, aztecTargetCommitteeSize, lagInEpochsForValidatorSet, lagInEpochsForRandao, activationThreshold, ejectionThreshold, localEjectionThreshold, governanceProposerQuorum, governanceProposerRoundSize, slashingQuorum, slashingRoundSize, slashingLifetimeInRounds, slashingExecutionDelayInRounds, slashingOffsetInRounds, slashingAmounts, slashingVetoer, slashingDisableDuration, manaTarget, provingCostPerMana, rollupVersion, genesisArchiveTreeRoot, exitDelay] = await Promise.all([
15
+ const rollupAddresses = await rollup.getRollupAddresses();
16
+ const inboxContract = new InboxContract(publicClient, rollupAddresses.inboxAddress.toString());
17
+ const [l1StartBlock, l1GenesisTime, aztecEpochDuration, aztecSlotDuration, aztecProofSubmissionEpochs, aztecTargetCommitteeSize, lagInEpochsForValidatorSet, lagInEpochsForRandao, inboxLag, activationThreshold, ejectionThreshold, localEjectionThreshold, governanceProposerQuorum, governanceProposerRoundSize, slashingQuorum, slashingRoundSize, slashingLifetimeInRounds, slashingExecutionDelayInRounds, slashingOffsetInRounds, slashingAmounts, slashingVetoer, slashingDisableDuration, manaTarget, provingCostPerMana, rollupVersion, genesisArchiveTreeRoot, exitDelay] = await Promise.all([
14
18
  rollup.getL1StartBlock(),
15
19
  rollup.getL1GenesisTime(),
16
20
  rollup.getEpochDuration(),
@@ -19,6 +23,7 @@ import { RollupContract } from './contracts/rollup.js';
19
23
  rollup.getTargetCommitteeSize(),
20
24
  rollup.getLagInEpochsForValidatorSet(),
21
25
  rollup.getLagInEpochsForRandao(),
26
+ inboxContract.getLag(),
22
27
  rollup.getActivationThreshold(),
23
28
  rollup.getEjectionThreshold(),
24
29
  rollup.getLocalEjectionThreshold(),
@@ -51,13 +56,15 @@ import { RollupContract } from './contracts/rollup.js';
51
56
  aztecTargetCommitteeSize: Number(aztecTargetCommitteeSize),
52
57
  lagInEpochsForValidatorSet: Number(lagInEpochsForValidatorSet),
53
58
  lagInEpochsForRandao: Number(lagInEpochsForRandao),
59
+ inboxLag: Number(inboxLag),
54
60
  governanceProposerQuorum: Number(governanceProposerQuorum),
55
61
  governanceProposerRoundSize: Number(governanceProposerRoundSize),
62
+ governanceVotingDuration: DefaultL1ContractsConfig.governanceVotingDuration,
56
63
  activationThreshold,
57
64
  ejectionThreshold,
58
65
  localEjectionThreshold,
59
66
  slashingQuorum: Number(slashingQuorum),
60
- slashingRoundSizeInEpochs: Number(slashingRoundSize / aztecEpochDuration),
67
+ slashingRoundSizeInEpochs: Number(Number(slashingRoundSize) / aztecEpochDuration),
61
68
  slashingLifetimeInRounds: Number(slashingLifetimeInRounds),
62
69
  slashingExecutionDelayInRounds: Number(slashingExecutionDelayInRounds),
63
70
  slashingVetoer,
@@ -65,12 +72,13 @@ import { RollupContract } from './contracts/rollup.js';
65
72
  manaTarget,
66
73
  provingCostPerMana: provingCostPerMana,
67
74
  rollupVersion: Number(rollupVersion),
68
- genesisArchiveTreeRoot,
75
+ genesisArchiveTreeRoot: genesisArchiveTreeRoot.toString(),
69
76
  exitDelaySeconds: Number(exitDelay),
70
77
  slasherFlavor: slasherProposer?.type ?? 'tally',
71
78
  slashingOffsetInRounds: Number(slashingOffsetInRounds),
72
79
  slashAmountSmall: slashingAmounts[0],
73
80
  slashAmountMedium: slashingAmounts[1],
74
- slashAmountLarge: slashingAmounts[2]
81
+ slashAmountLarge: slashingAmounts[2],
82
+ initialEthPerFeeAsset: DefaultL1ContractsConfig.initialEthPerFeeAsset
75
83
  };
76
84
  }
@@ -1,21 +1,37 @@
1
- import { type RollupContract } from '@aztec/ethereum/contracts';
2
- import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
1
+ import type { ManaMinFeeComponents, RollupContract } from '@aztec/ethereum/contracts';
2
+ import { InboxContract } from '@aztec/ethereum/contracts';
3
+ import { CheckpointNumber, EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
3
4
  import { EthAddress } from '@aztec/foundation/eth-address';
4
5
  import { DateProvider } from '@aztec/foundation/timer';
5
6
  import { EventEmitter } from 'events';
7
+ /** L2 fee data reported by the chain monitor. */
8
+ export type L2FeeData = ManaMinFeeComponents & {
9
+ /** Total minimum fee per mana in Fee Juice (sum of sequencerCost + proverCost + congestionCost). */
10
+ minFeePerMana: bigint;
11
+ /** L1 base fee observed by the oracle. */
12
+ l1BaseFee: bigint;
13
+ /** L1 blob fee observed by the oracle. */
14
+ l1BlobFee: bigint;
15
+ /** ETH per fee asset exchange rate (1e12 precision). */
16
+ ethPerFeeAsset: bigint;
17
+ /** Mana target per checkpoint. */
18
+ manaTarget: bigint;
19
+ };
6
20
  export type ChainMonitorEventMap = {
7
21
  'l1-block': [{
8
22
  l1BlockNumber: number;
9
23
  timestamp: bigint;
10
24
  }];
11
- checkpoint: [{
12
- checkpointNumber: number;
13
- l1BlockNumber: number;
14
- l2SlotNumber: SlotNumber;
15
- timestamp: bigint;
16
- }];
25
+ checkpoint: [
26
+ {
27
+ checkpointNumber: CheckpointNumber;
28
+ l1BlockNumber: number;
29
+ l2SlotNumber: SlotNumber;
30
+ timestamp: bigint;
31
+ }
32
+ ];
17
33
  'checkpoint-proven': [{
18
- provenCheckpointNumber: number;
34
+ provenCheckpointNumber: CheckpointNumber;
19
35
  l1BlockNumber: number;
20
36
  timestamp: bigint;
21
37
  }];
@@ -32,6 +48,7 @@ export type ChainMonitorEventMap = {
32
48
  l2SlotNumber: SlotNumber;
33
49
  timestamp: bigint;
34
50
  }];
51
+ 'l2-fees': [L2FeeData];
35
52
  };
36
53
  /** Utility class that polls the chain on quick intervals and logs new L1 blocks, L2 blocks, and L2 proofs. */
37
54
  export declare class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
@@ -46,9 +63,9 @@ export declare class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
46
63
  /** Current L1 block number */
47
64
  l1BlockNumber: number;
48
65
  /** Current checkpoint number */
49
- checkpointNumber: number;
66
+ checkpointNumber: CheckpointNumber;
50
67
  /** Current proven checkpoint number */
51
- provenCheckpointNumber: number;
68
+ provenCheckpointNumber: CheckpointNumber;
52
69
  /** L1 timestamp for the current checkpoint */
53
70
  checkpointTimestamp: bigint;
54
71
  /** L1 timestamp for the proven checkpoint */
@@ -59,15 +76,19 @@ export declare class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
59
76
  l2EpochNumber: EpochNumber;
60
77
  /** Current L2 slot number */
61
78
  l2SlotNumber: SlotNumber;
79
+ /** Current L2 fee data (components of the minimum fee per mana). */
80
+ l2FeeData: L2FeeData;
62
81
  constructor(rollup: RollupContract, dateProvider?: DateProvider, logger?: import("@aztec/foundation/log").Logger, intervalMs?: number);
63
82
  start(): this;
64
83
  stop(): Promise<void>;
65
- private getInbox;
84
+ protected getInbox(): Promise<InboxContract>;
66
85
  protected safeRun(): void;
67
86
  run(force?: boolean): Promise<this>;
68
87
  waitUntilL2Slot(slot: SlotNumber): Promise<void>;
69
88
  waitUntilL1Block(block: number | bigint): Promise<void>;
70
89
  waitUntilL1Timestamp(timestamp: number | bigint): Promise<void>;
71
- waitUntilCheckpoint(checkpointNumber: number | bigint): Promise<void>;
90
+ waitUntilCheckpoint(checkpointNumber: CheckpointNumber): Promise<void>;
91
+ private fetchFeeData;
92
+ private hasFeeDataChanged;
72
93
  }
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5fbW9uaXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvY2hhaW5fbW9uaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLEtBQUssY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFJdEMsTUFBTSxNQUFNLG9CQUFvQixHQUFHO0lBQ2pDLFVBQVUsRUFBRSxDQUFDO1FBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQztRQUFDLFNBQVMsRUFBRSxNQUFNLENBQUE7S0FBRSxDQUFDLENBQUM7SUFDM0QsVUFBVSxFQUFFLENBQUM7UUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUM7UUFBQyxhQUFhLEVBQUUsTUFBTSxDQUFDO1FBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQztRQUFDLFNBQVMsRUFBRSxNQUFNLENBQUE7S0FBRSxDQUFDLENBQUM7SUFDL0csbUJBQW1CLEVBQUUsQ0FBQztRQUFFLHNCQUFzQixFQUFFLE1BQU0sQ0FBQztRQUFDLGFBQWEsRUFBRSxNQUFNLENBQUM7UUFBQyxTQUFTLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FBQyxDQUFDO0lBQ3BHLGFBQWEsRUFBRSxDQUFDO1FBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQztRQUFDLGFBQWEsRUFBRSxNQUFNLENBQUE7S0FBRSxDQUFDLENBQUM7SUFDcEUsVUFBVSxFQUFFLENBQUM7UUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDO1FBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQztRQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FBRyxTQUFTLENBQUE7S0FBRSxDQUFDLENBQUM7SUFDckcsU0FBUyxFQUFFLENBQUM7UUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDO1FBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBQUMsQ0FBQztDQUM5RCxDQUFDO0FBRUYsOEdBQThHO0FBQzlHLHFCQUFhLFlBQWEsU0FBUSxZQUFZLENBQUMsb0JBQW9CLENBQUM7SUF5QmhFLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQUN2QixPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVk7SUFDN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNO0lBQ3ZCLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVTtJQTNCN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQWE7SUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBNEI7SUFDekMsT0FBTyxDQUFDLE1BQU0sQ0FBNkI7SUFFM0MsT0FBTyxDQUFDLE9BQU8sQ0FBaUM7SUFFaEQsOEJBQThCO0lBQ3ZCLGFBQWEsRUFBRyxNQUFNLENBQUM7SUFDOUIsZ0NBQWdDO0lBQ3pCLGdCQUFnQixFQUFHLE1BQU0sQ0FBQztJQUNqQyx1Q0FBdUM7SUFDaEMsc0JBQXNCLEVBQUcsTUFBTSxDQUFDO0lBQ3ZDLDhDQUE4QztJQUN2QyxtQkFBbUIsRUFBRyxNQUFNLENBQUM7SUFDcEMsNkNBQTZDO0lBQ3RDLHlCQUF5QixFQUFHLE1BQU0sQ0FBQztJQUMxQyx3REFBd0Q7SUFDakQsZUFBZSxFQUFFLE1BQU0sQ0FBSztJQUNuQyw4QkFBOEI7SUFDdkIsYUFBYSxFQUFHLFdBQVcsQ0FBQztJQUNuQyw2QkFBNkI7SUFDdEIsWUFBWSxFQUFHLFVBQVUsQ0FBQztJQUVqQyxZQUNtQixNQUFNLEVBQUUsY0FBYyxFQUN0QixZQUFZLEdBQUUsWUFBaUMsRUFDL0MsTUFBTSx5Q0FBOEMsRUFDcEQsVUFBVSxTQUFNLEVBSWxDO0lBRUQsS0FBSyxTQU1KO0lBRUssSUFBSSxrQkFXVDtZQUVhLFFBQVE7SUFRdEIsU0FBUyxDQUFDLE9BQU8sU0FZaEI7SUFFSyxHQUFHLENBQUMsS0FBSyxVQUFRLGlCQWdGdEI7SUFFTSxlQUFlLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBYXREO0lBRU0sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWM3RDtJQUVNLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxNQUFNLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FjckU7SUFFTSxtQkFBbUIsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FjM0U7Q0FDRiJ9
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW5fbW9uaXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3QvY2hhaW5fbW9uaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFJdEMsaURBQWlEO0FBQ2pELE1BQU0sTUFBTSxTQUFTLEdBQUcsb0JBQW9CLEdBQUc7SUFDN0Msb0dBQW9HO0lBQ3BHLGFBQWEsRUFBRSxNQUFNLENBQUM7SUFDdEIsMENBQTBDO0lBQzFDLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsMENBQTBDO0lBQzFDLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsd0RBQXdEO0lBQ3hELGNBQWMsRUFBRSxNQUFNLENBQUM7SUFDdkIsa0NBQWtDO0lBQ2xDLFVBQVUsRUFBRSxNQUFNLENBQUM7Q0FDcEIsQ0FBQztBQUVGLE1BQU0sTUFBTSxvQkFBb0IsR0FBRztJQUNqQyxVQUFVLEVBQUUsQ0FBQztRQUFFLGFBQWEsRUFBRSxNQUFNLENBQUM7UUFBQyxTQUFTLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FBQyxDQUFDO0lBQzNELFVBQVUsRUFBRTtRQUNWO1lBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7WUFBQyxhQUFhLEVBQUUsTUFBTSxDQUFDO1lBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQztZQUFDLFNBQVMs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
@@ -1 +1 @@
1
- {"version":3,"file":"chain_monitor.d.ts","sourceRoot":"","sources":["../../src/test/chain_monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,UAAU,EAAE,CAAC;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/G,mBAAmB,EAAE,CAAC;QAAE,sBAAsB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpG,aAAa,EAAE,CAAC;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,UAAU,EAAE,CAAC;QAAE,aAAa,EAAE,WAAW,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,UAAU,EAAE,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IACrG,SAAS,EAAE,CAAC;QAAE,YAAY,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D,CAAC;AAEF,8GAA8G;AAC9G,qBAAa,YAAa,SAAQ,YAAY,CAAC,oBAAoB,CAAC;IAyBhE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IA3B7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,MAAM,CAA6B;IAE3C,OAAO,CAAC,OAAO,CAAiC;IAEhD,8BAA8B;IACvB,aAAa,EAAG,MAAM,CAAC;IAC9B,gCAAgC;IACzB,gBAAgB,EAAG,MAAM,CAAC;IACjC,uCAAuC;IAChC,sBAAsB,EAAG,MAAM,CAAC;IACvC,8CAA8C;IACvC,mBAAmB,EAAG,MAAM,CAAC;IACpC,6CAA6C;IACtC,yBAAyB,EAAG,MAAM,CAAC;IAC1C,wDAAwD;IACjD,eAAe,EAAE,MAAM,CAAK;IACnC,8BAA8B;IACvB,aAAa,EAAG,WAAW,CAAC;IACnC,6BAA6B;IACtB,YAAY,EAAG,UAAU,CAAC;IAEjC,YACmB,MAAM,EAAE,cAAc,EACtB,YAAY,GAAE,YAAiC,EAC/C,MAAM,yCAA8C,EACpD,UAAU,SAAM,EAIlC;IAED,KAAK,SAMJ;IAEK,IAAI,kBAWT;YAEa,QAAQ;IAQtB,SAAS,CAAC,OAAO,SAYhB;IAEK,GAAG,CAAC,KAAK,UAAQ,iBAgFtB;IAEM,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAatD;IAEM,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc7D;IAEM,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcrE;IAEM,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc3E;CACF"}
1
+ {"version":3,"file":"chain_monitor.d.ts","sourceRoot":"","sources":["../../src/test/chain_monitor.ts"],"names":[],"mappings":"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"}