@aztec/ethereum 0.0.1-commit.2ed92850 → 0.0.1-commit.2f68f620

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 (166) hide show
  1. package/dest/client.d.ts +25 -3
  2. package/dest/client.d.ts.map +1 -1
  3. package/dest/client.js +60 -8
  4. package/dest/config.d.ts +8 -6
  5. package/dest/config.d.ts.map +1 -1
  6. package/dest/config.js +15 -11
  7. package/dest/contracts/chain_state_override.d.ts +78 -0
  8. package/dest/contracts/chain_state_override.d.ts.map +1 -0
  9. package/dest/contracts/chain_state_override.js +137 -0
  10. package/dest/contracts/fee_asset_handler.d.ts +1 -1
  11. package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
  12. package/dest/contracts/fee_asset_handler.js +2 -0
  13. package/dest/contracts/fee_asset_price_oracle.d.ts +105 -0
  14. package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
  15. package/dest/contracts/fee_asset_price_oracle.js +656 -0
  16. package/dest/contracts/governance.d.ts +108 -33
  17. package/dest/contracts/governance.d.ts.map +1 -1
  18. package/dest/contracts/governance.js +198 -15
  19. package/dest/contracts/governance_proposer.d.ts +33 -1
  20. package/dest/contracts/governance_proposer.d.ts.map +1 -1
  21. package/dest/contracts/governance_proposer.js +57 -3
  22. package/dest/contracts/inbox.d.ts +3 -3
  23. package/dest/contracts/inbox.d.ts.map +1 -1
  24. package/dest/contracts/inbox.js +12 -7
  25. package/dest/contracts/index.d.ts +4 -3
  26. package/dest/contracts/index.d.ts.map +1 -1
  27. package/dest/contracts/index.js +3 -2
  28. package/dest/contracts/multicall.d.ts +127 -12
  29. package/dest/contracts/multicall.d.ts.map +1 -1
  30. package/dest/contracts/multicall.js +201 -93
  31. package/dest/contracts/outbox.d.ts +27 -4
  32. package/dest/contracts/outbox.d.ts.map +1 -1
  33. package/dest/contracts/outbox.js +34 -7
  34. package/dest/contracts/registry.d.ts +3 -1
  35. package/dest/contracts/registry.d.ts.map +1 -1
  36. package/dest/contracts/registry.js +30 -1
  37. package/dest/contracts/rollup.d.ts +5259 -29
  38. package/dest/contracts/rollup.d.ts.map +1 -1
  39. package/dest/contracts/rollup.js +392 -71
  40. package/dest/contracts/{tally_slashing_proposer.d.ts → slashing_proposer.d.ts} +3 -4
  41. package/dest/contracts/slashing_proposer.d.ts.map +1 -0
  42. package/dest/contracts/{tally_slashing_proposer.js → slashing_proposer.js} +18 -13
  43. package/dest/deploy_aztec_l1_contracts.d.ts +8 -11
  44. package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
  45. package/dest/deploy_aztec_l1_contracts.js +46 -34
  46. package/dest/deploy_l1_contract.js +3 -3
  47. package/dest/generated/l1-contracts-defaults.d.ts +2 -2
  48. package/dest/generated/l1-contracts-defaults.js +2 -2
  49. package/dest/l1_artifacts.d.ts +14259 -15724
  50. package/dest/l1_artifacts.d.ts.map +1 -1
  51. package/dest/l1_artifacts.js +9 -24
  52. package/dest/l1_contract_addresses.d.ts +61 -65
  53. package/dest/l1_contract_addresses.d.ts.map +1 -1
  54. package/dest/l1_contract_addresses.js +101 -82
  55. package/dest/l1_reader.d.ts +5 -5
  56. package/dest/l1_reader.d.ts.map +1 -1
  57. package/dest/l1_reader.js +9 -7
  58. package/dest/l1_tx_utils/config.d.ts +7 -1
  59. package/dest/l1_tx_utils/config.d.ts.map +1 -1
  60. package/dest/l1_tx_utils/config.js +14 -1
  61. package/dest/l1_tx_utils/constants.d.ts +1 -1
  62. package/dest/l1_tx_utils/constants.js +2 -2
  63. package/dest/l1_tx_utils/factory.d.ts +18 -10
  64. package/dest/l1_tx_utils/factory.d.ts.map +1 -1
  65. package/dest/l1_tx_utils/factory.js +17 -7
  66. package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +1 -1
  67. package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +1 -1
  68. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +15 -15
  69. package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -1
  70. package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +9 -15
  71. package/dest/l1_tx_utils/index-blobs.d.ts +3 -3
  72. package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -1
  73. package/dest/l1_tx_utils/index-blobs.js +2 -2
  74. package/dest/l1_tx_utils/index.d.ts +2 -1
  75. package/dest/l1_tx_utils/index.d.ts.map +1 -1
  76. package/dest/l1_tx_utils/index.js +1 -0
  77. package/dest/l1_tx_utils/l1_tx_utils.d.ts +26 -7
  78. package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
  79. package/dest/l1_tx_utils/l1_tx_utils.js +101 -66
  80. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +1 -1
  81. package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -1
  82. package/dest/l1_tx_utils/readonly_l1_tx_utils.js +13 -8
  83. package/dest/l1_tx_utils/tx_delayer.d.ts +58 -0
  84. package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
  85. package/dest/{test → l1_tx_utils}/tx_delayer.js +67 -37
  86. package/dest/publisher_manager.d.ts +21 -6
  87. package/dest/publisher_manager.d.ts.map +1 -1
  88. package/dest/publisher_manager.js +81 -7
  89. package/dest/queries.d.ts +13 -2
  90. package/dest/queries.d.ts.map +1 -1
  91. package/dest/queries.js +62 -3
  92. package/dest/test/chain_monitor.d.ts +23 -3
  93. package/dest/test/chain_monitor.d.ts.map +1 -1
  94. package/dest/test/chain_monitor.js +38 -2
  95. package/dest/test/eth_cheat_codes.d.ts +12 -4
  96. package/dest/test/eth_cheat_codes.d.ts.map +1 -1
  97. package/dest/test/eth_cheat_codes.js +17 -4
  98. package/dest/test/index.d.ts +1 -3
  99. package/dest/test/index.d.ts.map +1 -1
  100. package/dest/test/index.js +0 -2
  101. package/dest/test/rollup_cheat_codes.d.ts +33 -3
  102. package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
  103. package/dest/test/rollup_cheat_codes.js +68 -7
  104. package/dest/test/start_anvil.d.ts +23 -3
  105. package/dest/test/start_anvil.d.ts.map +1 -1
  106. package/dest/test/start_anvil.js +143 -29
  107. package/dest/test/upgrade_utils.js +2 -2
  108. package/dest/utils.d.ts +10 -2
  109. package/dest/utils.d.ts.map +1 -1
  110. package/dest/utils.js +94 -16
  111. package/package.json +6 -8
  112. package/src/client.ts +66 -2
  113. package/src/config.ts +24 -15
  114. package/src/contracts/chain_state_override.ts +200 -0
  115. package/src/contracts/fee_asset_handler.ts +2 -0
  116. package/src/contracts/fee_asset_price_oracle.ts +285 -0
  117. package/src/contracts/governance.ts +271 -12
  118. package/src/contracts/governance_proposer.ts +58 -2
  119. package/src/contracts/inbox.ts +13 -5
  120. package/src/contracts/index.ts +3 -2
  121. package/src/contracts/multicall.ts +243 -102
  122. package/src/contracts/outbox.ts +42 -8
  123. package/src/contracts/registry.ts +31 -1
  124. package/src/contracts/rollup.ts +443 -73
  125. package/src/contracts/{tally_slashing_proposer.ts → slashing_proposer.ts} +16 -14
  126. package/src/deploy_aztec_l1_contracts.ts +69 -42
  127. package/src/deploy_l1_contract.ts +3 -3
  128. package/src/generated/l1-contracts-defaults.ts +2 -2
  129. package/src/l1_artifacts.ts +12 -35
  130. package/src/l1_contract_addresses.ts +120 -94
  131. package/src/l1_reader.ts +17 -10
  132. package/src/l1_tx_utils/config.ts +20 -0
  133. package/src/l1_tx_utils/constants.ts +2 -2
  134. package/src/l1_tx_utils/factory.ts +31 -31
  135. package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +1 -1
  136. package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +1 -1
  137. package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +43 -54
  138. package/src/l1_tx_utils/index-blobs.ts +2 -2
  139. package/src/l1_tx_utils/index.ts +1 -0
  140. package/src/l1_tx_utils/l1_tx_utils.ts +99 -48
  141. package/src/l1_tx_utils/readonly_l1_tx_utils.ts +13 -8
  142. package/src/{test → l1_tx_utils}/tx_delayer.ts +93 -56
  143. package/src/publisher_manager.ts +107 -10
  144. package/src/queries.ts +70 -4
  145. package/src/test/chain_monitor.ts +65 -3
  146. package/src/test/eth_cheat_codes.ts +16 -4
  147. package/src/test/index.ts +0 -2
  148. package/src/test/rollup_cheat_codes.ts +73 -6
  149. package/src/test/start_anvil.ts +177 -29
  150. package/src/test/upgrade_utils.ts +2 -2
  151. package/src/utils.ts +98 -18
  152. package/dest/contracts/empire_slashing_proposer.d.ts +0 -67
  153. package/dest/contracts/empire_slashing_proposer.d.ts.map +0 -1
  154. package/dest/contracts/empire_slashing_proposer.js +0 -209
  155. package/dest/contracts/tally_slashing_proposer.d.ts.map +0 -1
  156. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
  157. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
  158. package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
  159. package/dest/test/delayed_tx_utils.d.ts +0 -13
  160. package/dest/test/delayed_tx_utils.d.ts.map +0 -1
  161. package/dest/test/delayed_tx_utils.js +0 -28
  162. package/dest/test/tx_delayer.d.ts +0 -36
  163. package/dest/test/tx_delayer.d.ts.map +0 -1
  164. package/src/contracts/empire_slashing_proposer.ts +0 -270
  165. package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
  166. package/src/test/delayed_tx_utils.ts +0 -52
@@ -35,8 +35,8 @@ export declare class InboxContract {
35
35
  }): Promise<InboxContractState>;
36
36
  /** Fetches MessageSent events within the given block range. */
37
37
  getMessageSentEvents(fromBlock: bigint, toBlock: bigint): Promise<MessageSentLog[]>;
38
- /** Fetches MessageSent events for a specific message hash within the given block range. */
39
- getMessageSentEventByHash(hash: Hex, fromBlock: bigint, toBlock: bigint): Promise<MessageSentLog[]>;
38
+ /** Fetches MessageSent events for a specific message hash around a specific block. */
39
+ getMessageSentEventByHash(msgHash: Hex, aroundL1BlockNumber: bigint): Promise<MessageSentLog>;
40
40
  private mapMessageSentLog;
41
41
  }
42
42
  export type InboxContractState = {
@@ -44,4 +44,4 @@ export type InboxContractState = {
44
44
  messagesRollingHash: Buffer16;
45
45
  treeInProgress: bigint;
46
46
  };
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5ib3guZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdHMvaW5ib3gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFFBQVEsRUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXhELE9BQU8sRUFBRSxLQUFLLFFBQVEsRUFBRSxLQUFLLHFCQUFxQixFQUFFLEtBQUssR0FBRyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBR3hGLE9BQU8sS0FBSyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEYsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUczQywyQ0FBMkM7QUFDM0MsTUFBTSxNQUFNLGVBQWUsR0FBRztJQUM1QixLQUFLLEVBQUUsTUFBTSxDQUFDO0lBQ2QsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUNULGdCQUFnQixFQUFFLGdCQUFnQixDQUFDO0lBQ25DLFdBQVcsRUFBRSxRQUFRLENBQUM7Q0FDdkIsQ0FBQztBQUVGLHVDQUF1QztBQUN2QyxNQUFNLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUV6RCxxQkFBYSxhQUFhO2FBa0JOLE1BQU0sRUFBRSxVQUFVO0lBakJwQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBcUQ7SUFFM0UsTUFBTSxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixFQUFFLGdDQUFnQyxpQkFNeEY7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxjQUFjLGlCQUkxQztJQUVELFlBQ2tCLE1BQU0sRUFBRSxVQUFVLEVBQ2xDLE9BQU8sRUFBRSxHQUFHLEdBQUcsVUFBVSxFQU0xQjtJQUVELElBQVcsT0FBTyxrQkFFakI7SUFFTSxXQUFXLElBQUkscUJBQXFCLENBQUMsT0FBTyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBRXZFO0lBRVksTUFBTSxDQUFDLElBQUksR0FBRTtRQUFFLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQztRQUFDLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUc3RjtJQUVZLFFBQVEsQ0FBQyxJQUFJLEdBQUU7UUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUM7UUFBQyxXQUFXLENBQUMsRUFBRSxNQUFNLENBQUE7S0FBTyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQVEzRztJQUVELCtEQUErRDtJQUN6RCxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBS3hGO0lBRUQsMkZBQTJGO0lBQ3JGLHlCQUF5QixDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUd4RztJQUVELE9BQU8sQ0FBQyxpQkFBaUI7Q0FrQjFCO0FBRUQsTUFBTSxNQUFNLGtCQUFrQixHQUFHO0lBQy9CLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztJQUM5QixtQkFBbUIsRUFBRSxRQUFRLENBQUM7SUFDOUIsY0FBYyxFQUFFLE1BQU0sQ0FBQztDQUN4QixDQUFDIn0=
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5ib3guZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdHMvaW5ib3gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFFBQVEsRUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXhELE9BQU8sRUFBRSxLQUFLLFFBQVEsRUFBRSxLQUFLLHFCQUFxQixFQUFFLEtBQUssR0FBRyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBR3hGLE9BQU8sS0FBSyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEYsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUczQywyQ0FBMkM7QUFDM0MsTUFBTSxNQUFNLGVBQWUsR0FBRztJQUM1QixLQUFLLEVBQUUsTUFBTSxDQUFDO0lBQ2QsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUNULGdCQUFnQixFQUFFLGdCQUFnQixDQUFDO0lBQ25DLFdBQVcsRUFBRSxRQUFRLENBQUM7Q0FDdkIsQ0FBQztBQUVGLHVDQUF1QztBQUN2QyxNQUFNLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUV6RCxxQkFBYSxhQUFhO2FBa0JOLE1BQU0sRUFBRSxVQUFVO0lBakJwQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBcUQ7SUFFM0UsTUFBTSxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixFQUFFLGdDQUFnQyxpQkFNeEY7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxjQUFjLGlCQUkxQztJQUVELFlBQ2tCLE1BQU0sRUFBRSxVQUFVLEVBQ2xDLE9BQU8sRUFBRSxHQUFHLEdBQUcsVUFBVSxFQU0xQjtJQUVELElBQVcsT0FBTyxrQkFFakI7SUFFTSxXQUFXLElBQUkscUJBQXFCLENBQUMsT0FBTyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBRXZFO0lBRVksTUFBTSxDQUFDLElBQUksR0FBRTtRQUFFLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQztRQUFDLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUc3RjtJQUVZLFFBQVEsQ0FBQyxJQUFJLEdBQUU7UUFBRSxRQUFRLENBQUMsRUFBRSxRQUFRLENBQUM7UUFBQyxXQUFXLENBQUMsRUFBRSxNQUFNLENBQUE7S0FBTyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQVEzRztJQUVELCtEQUErRDtJQUN6RCxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBS3hGO0lBRUQsc0ZBQXNGO0lBQ2hGLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FVbEc7SUFFRCxPQUFPLENBQUMsaUJBQWlCO0NBa0IxQjtBQUVELE1BQU0sTUFBTSxrQkFBa0IsR0FBRztJQUMvQixxQkFBcUIsRUFBRSxNQUFNLENBQUM7SUFDOUIsbUJBQW1CLEVBQUUsUUFBUSxDQUFDO0lBQzlCLGNBQWMsRUFBRSxNQUFNLENBQUM7Q0FDeEIsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/contracts/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAY,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,qBAAqB,EAAE,KAAK,GAAG,EAAe,MAAM,MAAM,CAAC;AAGxF,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,2CAA2C;AAC3C,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,EAAE,CAAC;IACT,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,QAAQ,CAAC;CACvB,CAAC;AAEF,uCAAuC;AACvC,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;AAEzD,qBAAa,aAAa;aAkBN,MAAM,EAAE,UAAU;IAjBpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqD;IAE3E,MAAM,CAAC,wBAAwB,CAAC,uBAAuB,EAAE,gCAAgC,iBAMxF;IAED,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,iBAI1C;IAED,YACkB,MAAM,EAAE,UAAU,EAClC,OAAO,EAAE,GAAG,GAAG,UAAU,EAM1B;IAED,IAAW,OAAO,kBAEjB;IAEM,WAAW,IAAI,qBAAqB,CAAC,OAAO,QAAQ,EAAE,UAAU,CAAC,CAEvE;IAEY,MAAM,CAAC,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAG7F;IAEY,QAAQ,CAAC,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAQ3G;IAED,+DAA+D;IACzD,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAKxF;IAED,2FAA2F;IACrF,yBAAyB,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAGxG;IAED,OAAO,CAAC,iBAAiB;CAkB1B;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAmB,EAAE,QAAQ,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC"}
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/contracts/inbox.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAY,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,qBAAqB,EAAE,KAAK,GAAG,EAAe,MAAM,MAAM,CAAC;AAGxF,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,2CAA2C;AAC3C,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,EAAE,CAAC;IACT,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,QAAQ,CAAC;CACvB,CAAC;AAEF,uCAAuC;AACvC,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;AAEzD,qBAAa,aAAa;aAkBN,MAAM,EAAE,UAAU;IAjBpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqD;IAE3E,MAAM,CAAC,wBAAwB,CAAC,uBAAuB,EAAE,gCAAgC,iBAMxF;IAED,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,iBAI1C;IAED,YACkB,MAAM,EAAE,UAAU,EAClC,OAAO,EAAE,GAAG,GAAG,UAAU,EAM1B;IAED,IAAW,OAAO,kBAEjB;IAEM,WAAW,IAAI,qBAAqB,CAAC,OAAO,QAAQ,EAAE,UAAU,CAAC,CAEvE;IAEY,MAAM,CAAC,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAG7F;IAEY,QAAQ,CAAC,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAQ3G;IAED,+DAA+D;IACzD,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAKxF;IAED,sFAAsF;IAChF,yBAAyB,CAAC,OAAO,EAAE,GAAG,EAAE,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAUlG;IAED,OAAO,CAAC,iBAAiB;CAkB1B;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAmB,EAAE,QAAQ,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { maxBigint } from '@aztec/foundation/bigint';
1
2
  import { CheckpointNumber } from '@aztec/foundation/branded-types';
2
3
  import { Buffer16, Buffer32 } from '@aztec/foundation/buffer';
3
4
  import { Fr } from '@aztec/foundation/curves/bn254';
@@ -15,7 +16,7 @@ export class InboxContract {
15
16
  }
16
17
  static getFromConfig(config) {
17
18
  const client = getPublicClient(config);
18
- const address = config.l1Contracts.inboxAddress.toString();
19
+ const address = config.inboxAddress.toString();
19
20
  return new InboxContract(client, address);
20
21
  }
21
22
  constructor(client, address){
@@ -55,14 +56,18 @@ export class InboxContract {
55
56
  });
56
57
  return logs.filter((log)=>log.blockNumber >= fromBlock && log.blockNumber <= toBlock).map((log)=>this.mapMessageSentLog(log));
57
58
  }
58
- /** Fetches MessageSent events for a specific message hash within the given block range. */ async getMessageSentEventByHash(hash, fromBlock, toBlock) {
59
- const logs = await this.inbox.getEvents.MessageSent({
60
- hash
59
+ /** Fetches MessageSent events for a specific message hash around a specific block. */ async getMessageSentEventByHash(msgHash, aroundL1BlockNumber) {
60
+ // We don't use blockHash here because we don't want the query to throw if the L1 block number no longer exists on chain
61
+ // due to an L1 reorg. The use case for this method is usually checking if a message still exists on the Inbox after
62
+ // a reorg, so it's possible the message was moved one block up or down, and that the original L1 block where we
63
+ // saw it no longer exists, rendering the block-by-hash approach invalid.
64
+ const [log] = await this.inbox.getEvents.MessageSent({
65
+ hash: msgHash
61
66
  }, {
62
- fromBlock,
63
- toBlock
67
+ fromBlock: maxBigint(aroundL1BlockNumber - 5n, 1n),
68
+ toBlock: aroundL1BlockNumber + 5n
64
69
  });
65
- return logs.map((log)=>this.mapMessageSentLog(log));
70
+ return log && this.mapMessageSentLog(log);
66
71
  }
67
72
  mapMessageSentLog(log) {
68
73
  return {
@@ -1,6 +1,8 @@
1
+ export * from './chain_state_override.js';
1
2
  export * from './empire_base.js';
2
3
  export * from './errors.js';
3
4
  export * from './fee_asset_handler.js';
5
+ export * from './fee_asset_price_oracle.js';
4
6
  export * from './fee_juice.js';
5
7
  export * from './governance.js';
6
8
  export * from './governance_proposer.js';
@@ -11,7 +13,6 @@ export * from './multicall.js';
11
13
  export * from './outbox.js';
12
14
  export * from './registry.js';
13
15
  export * from './rollup.js';
14
- export * from './empire_slashing_proposer.js';
15
- export * from './tally_slashing_proposer.js';
16
+ export * from './slashing_proposer.js';
16
17
  export * from './slasher_contract.js';
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsdUJBQXVCLENBQUMifQ==
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cmFjdHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx1QkFBdUIsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC"}
@@ -1,6 +1,8 @@
1
+ export * from './chain_state_override.js';
1
2
  export * from './empire_base.js';
2
3
  export * from './errors.js';
3
4
  export * from './fee_asset_handler.js';
5
+ export * from './fee_asset_price_oracle.js';
4
6
  export * from './fee_juice.js';
5
7
  export * from './governance.js';
6
8
  export * from './governance_proposer.js';
@@ -11,6 +13,5 @@ export * from './multicall.js';
11
13
  export * from './outbox.js';
12
14
  export * from './registry.js';
13
15
  export * from './rollup.js';
14
- export * from './empire_slashing_proposer.js';
15
- export * from './tally_slashing_proposer.js';
16
+ export * from './slashing_proposer.js';
16
17
  export * from './slasher_contract.js';
@@ -1,21 +1,136 @@
1
1
  import type { Logger } from '@aztec/foundation/log';
2
- import { type Hex } from 'viem';
2
+ import { type Abi, type Address, type BlockOverrides, type Hex, type RequiredBy, type StateOverride, type TransactionReceipt } from 'viem';
3
3
  import type { L1BlobInputs, L1TxConfig, L1TxRequest, L1TxUtils } from '../l1_tx_utils/index.js';
4
4
  import type { ExtendedViemWalletClient } from '../types.js';
5
- import { FormattedViemError } from '../utils.js';
6
5
  export declare const MULTI_CALL_3_ADDRESS: "0xcA11bde05977b3631167028862bE2a173976CA11";
6
+ /**
7
+ * Thrown by `Multicall3.forward` when the forwarder transaction lands but the receipt reports a
8
+ * reverted status. This is not expected (aggregate3 uses allowFailure: true), so callers should
9
+ * treat it as a fatal on-chain failure rather than retrying on a different publisher.
10
+ */
11
+ export declare class MulticallForwarderRevertedError extends Error {
12
+ readonly receipt: TransactionReceipt;
13
+ constructor(receipt: TransactionReceipt);
14
+ }
15
+ /** ABI fragment for aggregate3Value — not included in viem's multicall3Abi. */
16
+ export declare const aggregate3ValueAbi: readonly [{
17
+ readonly inputs: readonly [{
18
+ readonly components: readonly [{
19
+ readonly internalType: "address";
20
+ readonly name: "target";
21
+ readonly type: "address";
22
+ }, {
23
+ readonly internalType: "bool";
24
+ readonly name: "allowFailure";
25
+ readonly type: "bool";
26
+ }, {
27
+ readonly internalType: "uint256";
28
+ readonly name: "value";
29
+ readonly type: "uint256";
30
+ }, {
31
+ readonly internalType: "bytes";
32
+ readonly name: "callData";
33
+ readonly type: "bytes";
34
+ }];
35
+ readonly internalType: "struct Multicall3.Call3Value[]";
36
+ readonly name: "calls";
37
+ readonly type: "tuple[]";
38
+ }];
39
+ readonly name: "aggregate3Value";
40
+ readonly outputs: readonly [{
41
+ readonly components: readonly [{
42
+ readonly internalType: "bool";
43
+ readonly name: "success";
44
+ readonly type: "bool";
45
+ }, {
46
+ readonly internalType: "bytes";
47
+ readonly name: "returnData";
48
+ readonly type: "bytes";
49
+ }];
50
+ readonly internalType: "struct Multicall3.Result[]";
51
+ readonly name: "returnData";
52
+ readonly type: "tuple[]";
53
+ }];
54
+ readonly stateMutability: "payable";
55
+ readonly type: "function";
56
+ }];
57
+ /** A single call to embed inside an aggregate3 simulation. The abi is used to decode revert reasons. */
58
+ export type SimulateAggregate3Request = {
59
+ to: Address;
60
+ data: Hex;
61
+ /** Optional ABI used to decode the revert reason if this entry reverts. */
62
+ abi?: Abi;
63
+ };
64
+ export type SimulateAggregate3EntryResult = {
65
+ success: boolean;
66
+ /** Decoded revert reason text when `success === false` and a request abi was provided. */
67
+ revertReason?: string;
68
+ /** Raw return data hex. `'0x'` for successful entries with void return. */
69
+ returnData: Hex;
70
+ };
71
+ /**
72
+ * Outcome of a bundle simulation.
73
+ * - `decoded`: eth_simulateV1 ran and produced a per-entry Result[]. Use `entries` for filtering.
74
+ * - `fallback`: the node does not support eth_simulateV1; `fallbackGasEstimate` was returned and no
75
+ * per-entry info is available. Caller should send the bundle as-is with a conservative gas cap.
76
+ */
77
+ export type SimulateAggregate3Result = {
78
+ kind: 'decoded';
79
+ entries: SimulateAggregate3EntryResult[];
80
+ gasUsed: bigint;
81
+ } | {
82
+ kind: 'fallback';
83
+ gasUsed: bigint;
84
+ };
85
+ export type SimulateAggregate3Options = {
86
+ blockOverrides?: BlockOverrides<bigint, number>;
87
+ stateOverrides?: StateOverride;
88
+ /**
89
+ * If set, append a state override that fakes the sender's balance during the simulation so a
90
+ * low or zero balance does not cause the simulate to fail with insufficient funds. The fake
91
+ * balance is applied to `l1TxUtils.getSenderAddress()`.
92
+ */
93
+ fakeSenderBalance?: bigint;
94
+ /** Gas cap to pass on the simulate call itself (defaults to viem's behavior). */
95
+ gas?: bigint;
96
+ /** When eth_simulateV1 is unavailable, fall back to this gas estimate instead of throwing. */
97
+ fallbackGasEstimate?: bigint;
98
+ };
7
99
  export declare class Multicall3 {
8
- static forward(requests: L1TxRequest[], l1TxUtils: L1TxUtils, gasConfig: L1TxConfig | undefined, blobConfig: L1BlobInputs | undefined, rollupAddress: Hex, logger: Logger, opts?: {
9
- revertOnFailure?: boolean;
10
- }): Promise<FormattedViemError | {
11
- receipt: import("viem").TransactionReceipt;
100
+ /**
101
+ * Returns true iff Multicall3 bytecode is deployed at MULTI_CALL_3_ADDRESS. An empty result from
102
+ * a non-existent contract would otherwise silently validate any bundle that uses Multicall3.
103
+ */
104
+ static hasCode(l1TxUtils: L1TxUtils): Promise<boolean>;
105
+ /**
106
+ * Simulates an aggregate3 call composed of the given requests via eth_simulateV1 and decodes the
107
+ * per-entry Result[]. Entries that revert are returned with a decoded revertReason (if the request
108
+ * provided an abi).
109
+ *
110
+ * Use this to pre-validate a bundle before sending it through `Multicall3.forward`. The caller can
111
+ * drop reverted entries from the bundle and re-simulate with the reduced list to get an accurate
112
+ * `gasUsed`.
113
+ */
114
+ static simulateAggregate3(requests: SimulateAggregate3Request[], l1TxUtils: L1TxUtils, opts?: SimulateAggregate3Options): Promise<SimulateAggregate3Result>;
115
+ /**
116
+ * Sends a batch of requests through aggregate3. Individual calls may fail (allowFailure: true),
117
+ * but the top-level multicall is expected to land successfully. Throws if the send fails or if
118
+ * the receipt reports a reverted status.
119
+ */
120
+ static forward<TOptGasLimitRequired extends boolean>(requests: L1TxRequest[], l1TxUtils: L1TxUtils, gasConfig: TOptGasLimitRequired extends true ? RequiredBy<L1TxConfig, 'gasLimit'> : L1TxConfig | undefined, blobConfig: L1BlobInputs | undefined, opts?: {
121
+ gasLimitRequired?: TOptGasLimitRequired;
122
+ }): Promise<{
123
+ receipt: TransactionReceipt;
12
124
  stats: import("../l1_tx_utils/types.js").TransactionStats | undefined;
13
- errorMsg?: undefined;
14
- } | {
15
- stats?: undefined;
16
- receipt: import("viem").TransactionReceipt;
17
- errorMsg: string | undefined;
125
+ multicallData: `0x${string}`;
126
+ }>;
127
+ /** Batch multiple value transfers into a single aggregate3Value call on Multicall3. */
128
+ static forwardValue(calls: {
129
+ to: Address;
130
+ value: bigint;
131
+ }[], l1TxUtils: L1TxUtils, logger: Logger): Promise<{
132
+ receipt: TransactionReceipt;
18
133
  }>;
19
134
  }
20
135
  export declare function deployMulticall3(l1Client: ExtendedViemWalletClient, logger: Logger): Promise<void>;
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGljYWxsLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJhY3RzL211bHRpY2FsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEVBQXFDLEtBQUssR0FBRyxFQUFxQyxNQUFNLE1BQU0sQ0FBQztBQUV0RyxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRyxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQW1CLE1BQU0sYUFBYSxDQUFDO0FBR2xFLGVBQU8sTUFBTSxvQkFBb0IsOENBQXdELENBQUM7QUFFMUYscUJBQWEsVUFBVTtJQUNyQixPQUFhLE9BQU8sQ0FDbEIsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUN2QixTQUFTLEVBQUUsU0FBUyxFQUNwQixTQUFTLEVBQUUsVUFBVSxHQUFHLFNBQVMsRUFDakMsVUFBVSxFQUFFLFlBQVksR0FBRyxTQUFTLEVBQ3BDLGFBQWEsRUFBRSxHQUFHLEVBQ2xCLE1BQU0sRUFBRSxNQUFNLEVBQ2QsSUFBSSxHQUFFO1FBQUUsZUFBZSxDQUFDLEVBQUUsT0FBTyxDQUFBO0tBQU87Ozs7Ozs7O09BbUd6QztDQUNGO0FBRUQsd0JBQXNCLGdCQUFnQixDQUFDLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkErQnhGIn0=
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGljYWxsLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29udHJhY3RzL211bHRpY2FsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEVBQ0wsS0FBSyxHQUFHLEVBQ1IsS0FBSyxPQUFPLEVBQ1osS0FBSyxjQUFjLEVBQ25CLEtBQUssR0FBRyxFQUNSLEtBQUssVUFBVSxFQUNmLEtBQUssYUFBYSxFQUNsQixLQUFLLGtCQUFrQixFQUl4QixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hHLE9BQU8sS0FBSyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzVELGVBQU8sTUFBTSxvQkFBb0IsOENBQXdELENBQUM7QUFFMUY7Ozs7R0FJRztBQUNILHFCQUFhLCtCQUFnQyxTQUFRLEtBQUs7YUFDNUIsT0FBTyxFQUFFLGtCQUFrQjtJQUF2RCxZQUE0QixPQUFPLEVBQUUsa0JBQWtCLEVBR3REO0NBQ0Y7QUFFRCxpRkFBK0U7QUFDL0UsZUFBTyxNQUFNLGtCQUFrQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQThCckIsQ0FBQztBQUVYLHdHQUF3RztBQUN4RyxNQUFNLE1BQU0seUJBQXlCLEdBQUc7SUFDdEMsRUFBRSxFQUFFLE9BQU8sQ0FBQztJQUNaLElBQUksRUFBRSxHQUFHLENBQUM7SUFDViwyRUFBMkU7SUFDM0UsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDO0NBQ1gsQ0FBQztBQUVGLE1BQU0sTUFBTSw2QkFBNkIsR0FBRztJQUMxQyxPQUFPLEVBQUUsT0FBTyxDQUFDO0lBQ2pCLDBGQUEwRjtJQUMxRixZQUFZLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDdEIsMkVBQTJFO0lBQzNFLFVBQVUsRUFBRSxHQUFHLENBQUM7Q0FDakIsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxNQUFNLHdCQUF3QixHQUNoQztJQUFFLElBQUksRUFBRSxTQUFTLENBQUM7SUFBQyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsQ0FBQztJQUFDLE9BQU8sRUFBRSxNQUFNLENBQUE7Q0FBRSxHQUM5RTtJQUFFLElBQUksRUFBRSxVQUFVLENBQUM7SUFBQyxPQUFPLEVBQUUsTUFBTSxDQUFBO0NBQUUsQ0FBQztBQUUxQyxNQUFNLE1BQU0seUJBQXlCLEdBQUc7SUFDdEMsY0FBYyxDQUFDLEVBQUUsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRCxjQUFjLENBQUMsRUFBRSxhQUFhLENBQUM7SUFDL0I7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQzNCLGlGQUFpRjtJQUNqRixHQUFHLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDYiw4RkFBOEY7SUFDOUYsbUJBQW1CLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDOUIsQ0FBQztBQUVGLHFCQUFhLFVBQVU7SUFDckI7OztPQUdHO0lBQ0gsT0FBYSxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBRzNEO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxPQUFhLGtCQUFrQixDQUM3QixRQUFRLEVBQUUseUJBQXlCLEVBQUUsRUFDckMsU0FBUyxFQUFFLFNBQVMsRUFDcEIsSUFBSSxHQUFFLHlCQUE4QixHQUNuQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FpRG5DO0lBRUQ7Ozs7T0FJRztJQUNILE9BQWEsT0FBTyxDQUFDLG9CQUFvQixTQUFTLE9BQU8sRUFDdkQsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUN2QixTQUFTLEVBQUUsU0FBUyxFQUNwQixTQUFTLEVBQUUsb0JBQW9CLFNBQVMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEdBQUcsVUFBVSxHQUFHLFNBQVMsRUFDMUcsVUFBVSxFQUFFLFlBQVksR0FBRyxTQUFTLEVBQ3BDLElBQUksR0FBRTtRQUFFLGdCQUFnQixDQUFDLEVBQUUsb0JBQW9CLENBQUE7S0FBTzs7OztPQXNDdkQ7SUFFRCx1RkFBdUY7SUFDdkYsT0FBYSxZQUFZLENBQUMsS0FBSyxFQUFFO1FBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQztRQUFDLEtBQUssRUFBRSxNQUFNLENBQUE7S0FBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTTs7T0E0QnRHO0NBQ0Y7QUFFRCx3QkFBc0IsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQStCeEYifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"multicall.d.ts","sourceRoot":"","sources":["../../src/contracts/multicall.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAqC,KAAK,GAAG,EAAqC,MAAM,MAAM,CAAC;AAEtG,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAmB,MAAM,aAAa,CAAC;AAGlE,eAAO,MAAM,oBAAoB,8CAAwD,CAAC;AAE1F,qBAAa,UAAU;IACrB,OAAa,OAAO,CAClB,QAAQ,EAAE,WAAW,EAAE,EACvB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,UAAU,GAAG,SAAS,EACjC,UAAU,EAAE,YAAY,GAAG,SAAS,EACpC,aAAa,EAAE,GAAG,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO;;;;;;;;OAmGzC;CACF;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,iBA+BxF"}
1
+ {"version":3,"file":"multicall.d.ts","sourceRoot":"","sources":["../../src/contracts/multicall.ts"],"names":[],"mappings":"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"}
@@ -1,108 +1,216 @@
1
- import { toHex as toPaddedHex } from '@aztec/foundation/bigint-buffer';
2
- import { TimeoutError } from '@aztec/foundation/error';
3
- import { encodeFunctionData, multicall3Abi } from 'viem';
4
- import { FormattedViemError, formatViemError } from '../utils.js';
5
- import { RollupContract } from './rollup.js';
1
+ import { EthAddress } from '@aztec/foundation/eth-address';
2
+ import { decodeFunctionResult, encodeFunctionData, multicall3Abi } from 'viem';
3
+ import { tryDecodeRevertReason } from '../utils.js';
6
4
  export const MULTI_CALL_3_ADDRESS = '0xcA11bde05977b3631167028862bE2a173976CA11';
5
+ /**
6
+ * Thrown by `Multicall3.forward` when the forwarder transaction lands but the receipt reports a
7
+ * reverted status. This is not expected (aggregate3 uses allowFailure: true), so callers should
8
+ * treat it as a fatal on-chain failure rather than retrying on a different publisher.
9
+ */ export class MulticallForwarderRevertedError extends Error {
10
+ receipt;
11
+ constructor(receipt){
12
+ super(`Multicall3 forwarder tx reverted: ${receipt.transactionHash}`), this.receipt = receipt;
13
+ this.name = 'MulticallForwarderRevertedError';
14
+ }
15
+ }
16
+ /** ABI fragment for aggregate3Value — not included in viem's multicall3Abi. */ export const aggregate3ValueAbi = [
17
+ {
18
+ inputs: [
19
+ {
20
+ components: [
21
+ {
22
+ internalType: 'address',
23
+ name: 'target',
24
+ type: 'address'
25
+ },
26
+ {
27
+ internalType: 'bool',
28
+ name: 'allowFailure',
29
+ type: 'bool'
30
+ },
31
+ {
32
+ internalType: 'uint256',
33
+ name: 'value',
34
+ type: 'uint256'
35
+ },
36
+ {
37
+ internalType: 'bytes',
38
+ name: 'callData',
39
+ type: 'bytes'
40
+ }
41
+ ],
42
+ internalType: 'struct Multicall3.Call3Value[]',
43
+ name: 'calls',
44
+ type: 'tuple[]'
45
+ }
46
+ ],
47
+ name: 'aggregate3Value',
48
+ outputs: [
49
+ {
50
+ components: [
51
+ {
52
+ internalType: 'bool',
53
+ name: 'success',
54
+ type: 'bool'
55
+ },
56
+ {
57
+ internalType: 'bytes',
58
+ name: 'returnData',
59
+ type: 'bytes'
60
+ }
61
+ ],
62
+ internalType: 'struct Multicall3.Result[]',
63
+ name: 'returnData',
64
+ type: 'tuple[]'
65
+ }
66
+ ],
67
+ stateMutability: 'payable',
68
+ type: 'function'
69
+ }
70
+ ];
7
71
  export class Multicall3 {
8
- static async forward(requests, l1TxUtils, gasConfig, blobConfig, rollupAddress, logger, opts = {}) {
9
- requests = requests.filter((request)=>request.to !== null);
10
- const args = requests.map((r)=>({
72
+ /**
73
+ * Returns true iff Multicall3 bytecode is deployed at MULTI_CALL_3_ADDRESS. An empty result from
74
+ * a non-existent contract would otherwise silently validate any bundle that uses Multicall3.
75
+ */ static async hasCode(l1TxUtils) {
76
+ const code = await l1TxUtils.getCode(EthAddress.fromString(MULTI_CALL_3_ADDRESS));
77
+ return !!code && code !== '0x';
78
+ }
79
+ /**
80
+ * Simulates an aggregate3 call composed of the given requests via eth_simulateV1 and decodes the
81
+ * per-entry Result[]. Entries that revert are returned with a decoded revertReason (if the request
82
+ * provided an abi).
83
+ *
84
+ * Use this to pre-validate a bundle before sending it through `Multicall3.forward`. The caller can
85
+ * drop reverted entries from the bundle and re-simulate with the reduced list to get an accurate
86
+ * `gasUsed`.
87
+ */ static async simulateAggregate3(requests, l1TxUtils, opts = {}) {
88
+ const calldata = encodeFunctionData({
89
+ abi: multicall3Abi,
90
+ functionName: 'aggregate3',
91
+ args: [
92
+ requests.map((r)=>({
93
+ target: r.to,
94
+ callData: r.data,
95
+ allowFailure: true
96
+ }))
97
+ ]
98
+ });
99
+ const stateOverrides = [
100
+ ...opts.stateOverrides ?? []
101
+ ];
102
+ if (opts.fakeSenderBalance !== undefined) {
103
+ stateOverrides.push({
104
+ address: l1TxUtils.getSenderAddress().toString(),
105
+ balance: opts.fakeSenderBalance
106
+ });
107
+ }
108
+ const simResult = await l1TxUtils.simulate({
109
+ to: MULTI_CALL_3_ADDRESS,
110
+ data: calldata,
111
+ gas: opts.gas
112
+ }, opts.blockOverrides, stateOverrides, multicall3Abi, {
113
+ fallbackGasEstimate: opts.fallbackGasEstimate
114
+ });
115
+ if (simResult.result === '0x') {
116
+ return {
117
+ kind: 'fallback',
118
+ gasUsed: simResult.gasUsed
119
+ };
120
+ }
121
+ const decoded = decodeFunctionResult({
122
+ abi: multicall3Abi,
123
+ functionName: 'aggregate3',
124
+ data: simResult.result
125
+ });
126
+ const entries = decoded.map((entry, i)=>{
127
+ if (entry.success) {
128
+ return {
129
+ success: true,
130
+ returnData: entry.returnData
131
+ };
132
+ }
133
+ const abi = requests[i].abi;
134
+ const revertReason = abi ? tryDecodeRevertReason(entry.returnData, abi) : undefined;
135
+ return {
136
+ success: false,
137
+ returnData: entry.returnData,
138
+ revertReason
139
+ };
140
+ });
141
+ return {
142
+ kind: 'decoded',
143
+ entries,
144
+ gasUsed: simResult.gasUsed
145
+ };
146
+ }
147
+ /**
148
+ * Sends a batch of requests through aggregate3. Individual calls may fail (allowFailure: true),
149
+ * but the top-level multicall is expected to land successfully. Throws if the send fails or if
150
+ * the receipt reports a reverted status.
151
+ */ static async forward(requests, l1TxUtils, gasConfig, blobConfig, opts = {}) {
152
+ if (opts.gasLimitRequired && !gasConfig?.gasLimit) {
153
+ throw new Error('Multicall gasLimit is required when gasLimitRequired is true');
154
+ }
155
+ const args = requests.filter((request)=>request.to !== null).map((r)=>({
11
156
  target: r.to,
12
157
  callData: r.data,
13
- allowFailure: !opts.revertOnFailure
158
+ allowFailure: true
14
159
  }));
15
- const forwarderFunctionData = {
160
+ const encodedForwarderData = encodeFunctionData({
16
161
  abi: multicall3Abi,
17
162
  functionName: 'aggregate3',
18
163
  args: [
19
164
  args
20
165
  ]
166
+ });
167
+ const { receipt } = await l1TxUtils.sendAndMonitorTransaction({
168
+ to: MULTI_CALL_3_ADDRESS,
169
+ data: encodedForwarderData,
170
+ abi: multicall3Abi
171
+ }, gasConfig, blobConfig);
172
+ // This shouldn't happen. Any failure in individual calls is swallowed by forward since we set
173
+ // allowFailure to true for all calls, so a reverted status here would indicate a problem with
174
+ // the Multicall3 contract itself or the forwarder transaction (such as an out-of-gas).
175
+ if (receipt.status !== 'success') {
176
+ throw new MulticallForwarderRevertedError(receipt);
177
+ }
178
+ const stats = await l1TxUtils.getTransactionStats(receipt.transactionHash);
179
+ return {
180
+ receipt,
181
+ stats,
182
+ multicallData: encodedForwarderData
21
183
  };
22
- const encodedForwarderData = encodeFunctionData(forwarderFunctionData);
23
- try {
24
- const { receipt, state } = await l1TxUtils.sendAndMonitorTransaction({
25
- to: MULTI_CALL_3_ADDRESS,
26
- data: encodedForwarderData
27
- }, gasConfig, blobConfig);
28
- if (receipt.status === 'success') {
29
- const stats = await l1TxUtils.getTransactionStats(receipt.transactionHash);
30
- return {
31
- receipt,
32
- stats
33
- };
34
- } else {
35
- logger.error('Forwarder transaction failed', undefined, {
36
- receipt
37
- });
38
- const args = {
39
- ...forwarderFunctionData,
40
- address: MULTI_CALL_3_ADDRESS
41
- };
42
- let errorMsg;
43
- if (blobConfig) {
44
- const maxFeePerBlobGas = blobConfig.maxFeePerBlobGas ?? state.gasPrice.maxFeePerBlobGas;
45
- if (maxFeePerBlobGas === undefined) {
46
- errorMsg = 'maxFeePerBlobGas is required to get the error message';
47
- } else {
48
- logger.debug('Trying to get error from reverted tx with blob config');
49
- errorMsg = await l1TxUtils.tryGetErrorFromRevertedTx(encodedForwarderData, args, {
50
- blobs: blobConfig.blobs,
51
- kzg: blobConfig.kzg,
52
- maxFeePerBlobGas
53
- }, [
54
- {
55
- address: rollupAddress,
56
- stateDiff: [
57
- {
58
- slot: toPaddedHex(RollupContract.checkBlobStorageSlot, true),
59
- value: toPaddedHex(0n, true)
60
- }
61
- ]
62
- }
63
- ]);
64
- }
65
- } else {
66
- logger.debug('Trying to get error from reverted tx without blob config');
67
- errorMsg = await l1TxUtils.tryGetErrorFromRevertedTx(encodedForwarderData, args, undefined, []);
68
- }
69
- return {
70
- receipt,
71
- errorMsg
72
- };
73
- }
74
- } catch (err) {
75
- if (err instanceof TimeoutError) {
76
- throw err;
77
- }
78
- for (const request of requests){
79
- logger.debug('Simulating request', {
80
- request
81
- });
82
- const result = await l1TxUtils.simulate(request, undefined, [
83
- {
84
- address: rollupAddress,
85
- stateDiff: [
86
- {
87
- slot: toPaddedHex(RollupContract.checkBlobStorageSlot, true),
88
- value: toPaddedHex(0n, true)
89
- }
90
- ]
91
- }
92
- ]).catch((err)=>formatViemError(err, request.abi));
93
- if (result instanceof FormattedViemError) {
94
- logger.error('Found error in simulation', result, {
95
- to: request.to ?? 'null',
96
- data: request.data
97
- });
98
- return result;
99
- }
100
- }
101
- logger.warn('Failed to get error from reverted tx', {
102
- err
103
- });
104
- throw err;
184
+ }
185
+ /** Batch multiple value transfers into a single aggregate3Value call on Multicall3. */ static async forwardValue(calls, l1TxUtils, logger) {
186
+ const args = calls.map((c)=>({
187
+ target: c.to,
188
+ allowFailure: false,
189
+ value: c.value,
190
+ callData: '0x'
191
+ }));
192
+ const data = encodeFunctionData({
193
+ abi: aggregate3ValueAbi,
194
+ functionName: 'aggregate3Value',
195
+ args: [
196
+ args
197
+ ]
198
+ });
199
+ const totalValue = calls.reduce((sum, c)=>sum + c.value, 0n);
200
+ logger.info(`Sending aggregate3Value with ${calls.length} calls`, {
201
+ totalValue
202
+ });
203
+ const { receipt } = await l1TxUtils.sendAndMonitorTransaction({
204
+ to: MULTI_CALL_3_ADDRESS,
205
+ data,
206
+ value: totalValue
207
+ });
208
+ if (receipt.status !== 'success') {
209
+ throw new Error(`aggregate3Value transaction reverted: ${receipt.transactionHash}`);
105
210
  }
211
+ return {
212
+ receipt
213
+ };
106
214
  }
107
215
  }
108
216
  export async function deployMulticall3(l1Client, logger) {