@aztec/ethereum 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2

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 (81) hide show
  1. package/dest/chain.js +17 -18
  2. package/dest/client.js +5 -9
  3. package/dest/config.js +13 -14
  4. package/dest/constants.js +0 -1
  5. package/dest/contracts/empire_base.js +3 -2
  6. package/dest/contracts/forwarder.js +46 -26
  7. package/dest/contracts/governance.js +11 -6
  8. package/dest/contracts/governance_proposer.js +78 -67
  9. package/dest/contracts/index.js +0 -1
  10. package/dest/contracts/rollup.js +270 -243
  11. package/dest/contracts/slashing_proposer.js +18 -8
  12. package/dest/deploy_l1_contracts.js +201 -126
  13. package/dest/eth_cheat_codes.js +144 -127
  14. package/dest/index.js +0 -1
  15. package/dest/l1_contract_addresses.js +17 -19
  16. package/dest/l1_reader.js +6 -7
  17. package/dest/l1_tx_utils.js +227 -186
  18. package/dest/l1_tx_utils_with_blobs.js +25 -22
  19. package/dest/queries.js +6 -9
  20. package/dest/test/delayed_tx_utils.js +3 -3
  21. package/dest/test/eth_cheat_codes_with_state.js +10 -12
  22. package/dest/test/index.js +0 -1
  23. package/dest/test/start_anvil.js +17 -9
  24. package/dest/test/tx_delayer.js +77 -74
  25. package/dest/types.js +1 -2
  26. package/dest/utils.js +35 -36
  27. package/package.json +5 -4
  28. package/src/contracts/rollup.ts +1 -1
  29. package/src/l1_tx_utils_with_blobs.ts +1 -1
  30. package/dest/chain.d.ts +0 -25
  31. package/dest/chain.d.ts.map +0 -1
  32. package/dest/client.d.ts +0 -16
  33. package/dest/client.d.ts.map +0 -1
  34. package/dest/config.d.ts +0 -38
  35. package/dest/config.d.ts.map +0 -1
  36. package/dest/constants.d.ts +0 -4
  37. package/dest/constants.d.ts.map +0 -1
  38. package/dest/contracts/empire_base.d.ts +0 -13
  39. package/dest/contracts/empire_base.d.ts.map +0 -1
  40. package/dest/contracts/forwarder.d.ts +0 -24
  41. package/dest/contracts/forwarder.d.ts.map +0 -1
  42. package/dest/contracts/governance.d.ts +0 -14
  43. package/dest/contracts/governance.d.ts.map +0 -1
  44. package/dest/contracts/governance_proposer.d.ts +0 -28
  45. package/dest/contracts/governance_proposer.d.ts.map +0 -1
  46. package/dest/contracts/index.d.ts +0 -7
  47. package/dest/contracts/index.d.ts.map +0 -1
  48. package/dest/contracts/rollup.d.ts +0 -115
  49. package/dest/contracts/rollup.d.ts.map +0 -1
  50. package/dest/contracts/slashing_proposer.d.ts +0 -21
  51. package/dest/contracts/slashing_proposer.d.ts.map +0 -1
  52. package/dest/deploy_l1_contracts.d.ts +0 -21118
  53. package/dest/deploy_l1_contracts.d.ts.map +0 -1
  54. package/dest/eth_cheat_codes.d.ts +0 -146
  55. package/dest/eth_cheat_codes.d.ts.map +0 -1
  56. package/dest/index.d.ts +0 -15
  57. package/dest/index.d.ts.map +0 -1
  58. package/dest/l1_contract_addresses.d.ts +0 -55
  59. package/dest/l1_contract_addresses.d.ts.map +0 -1
  60. package/dest/l1_reader.d.ts +0 -16
  61. package/dest/l1_reader.d.ts.map +0 -1
  62. package/dest/l1_tx_utils.d.ts +0 -194
  63. package/dest/l1_tx_utils.d.ts.map +0 -1
  64. package/dest/l1_tx_utils_with_blobs.d.ts +0 -12
  65. package/dest/l1_tx_utils_with_blobs.d.ts.map +0 -1
  66. package/dest/queries.d.ts +0 -15
  67. package/dest/queries.d.ts.map +0 -1
  68. package/dest/test/delayed_tx_utils.d.ts +0 -8
  69. package/dest/test/delayed_tx_utils.d.ts.map +0 -1
  70. package/dest/test/eth_cheat_codes_with_state.d.ts +0 -18
  71. package/dest/test/eth_cheat_codes_with_state.d.ts.map +0 -1
  72. package/dest/test/index.d.ts +0 -5
  73. package/dest/test/index.d.ts.map +0 -1
  74. package/dest/test/start_anvil.d.ts +0 -9
  75. package/dest/test/start_anvil.d.ts.map +0 -1
  76. package/dest/test/tx_delayer.d.ts +0 -24
  77. package/dest/test/tx_delayer.d.ts.map +0 -1
  78. package/dest/types.d.ts +0 -12
  79. package/dest/types.d.ts.map +0 -1
  80. package/dest/utils.d.ts +0 -24
  81. package/dest/utils.d.ts.map +0 -1
@@ -1,61 +1,64 @@
1
- import { Blob } from '@aztec/foundation/blob';
1
+ import { Blob } from '@aztec/blob-lib';
2
2
  import { formatGwei } from 'viem';
3
3
  import { L1TxUtils } from './l1_tx_utils.js';
4
4
  export class L1TxUtilsWithBlobs extends L1TxUtils {
5
5
  /**
6
- * Attempts to cancel a transaction by sending a 0-value tx to self with same nonce but higher gas prices
7
- * @param nonce - The nonce of the transaction to cancel
8
- * @param previousGasPrice - The gas price of the previous transaction
9
- * @param attempts - The number of attempts to cancel the transaction
10
- * @returns The hash of the cancellation transaction
11
- */
12
- async attemptTxCancellation(nonce, isBlobTx = false, previousGasPrice, attempts = 0) {
6
+ * Attempts to cancel a transaction by sending a 0-value tx to self with same nonce but higher gas prices
7
+ * @param nonce - The nonce of the transaction to cancel
8
+ * @param previousGasPrice - The gas price of the previous transaction
9
+ * @param attempts - The number of attempts to cancel the transaction
10
+ * @returns The hash of the cancellation transaction
11
+ */ async attemptTxCancellation(nonce, isBlobTx = false, previousGasPrice, attempts = 0) {
13
12
  const account = this.walletClient.account;
14
13
  // Get gas price with higher priority fee for cancellation
15
14
  const cancelGasPrice = await this.getGasPrice({
16
15
  ...this.config,
17
16
  // Use high bump for cancellation to ensure it replaces the original tx
18
- priorityFeeRetryBumpPercentage: 150, // 150% bump should be enough to replace any tx
17
+ priorityFeeRetryBumpPercentage: 150
19
18
  }, isBlobTx, attempts + 1, previousGasPrice);
20
19
  this.logger?.debug(`Attempting to cancel transaction with nonce ${nonce}`, {
21
20
  maxFeePerGas: formatGwei(cancelGasPrice.maxFeePerGas),
22
- maxPriorityFeePerGas: formatGwei(cancelGasPrice.maxPriorityFeePerGas),
21
+ maxPriorityFeePerGas: formatGwei(cancelGasPrice.maxPriorityFeePerGas)
23
22
  });
24
23
  const request = {
25
24
  to: account.address,
26
- value: 0n,
25
+ value: 0n
27
26
  };
28
27
  // Send 0-value tx to self with higher gas price
29
28
  if (!isBlobTx) {
30
29
  const cancelTxHash = await this.walletClient.sendTransaction({
31
30
  ...request,
32
31
  nonce,
33
- gas: 21000n, // Standard ETH transfer gas
32
+ gas: 21_000n,
34
33
  maxFeePerGas: cancelGasPrice.maxFeePerGas,
35
- maxPriorityFeePerGas: cancelGasPrice.maxPriorityFeePerGas,
34
+ maxPriorityFeePerGas: cancelGasPrice.maxPriorityFeePerGas
36
35
  });
37
- const receipt = await this.monitorTransaction(request, cancelTxHash, { gasLimit: 21000n }, undefined, undefined, true);
36
+ const receipt = await this.monitorTransaction(request, cancelTxHash, {
37
+ gasLimit: 21_000n
38
+ }, undefined, undefined, true);
38
39
  return receipt.transactionHash;
39
- }
40
- else {
40
+ } else {
41
41
  const blobData = new Uint8Array(131072).fill(0);
42
42
  const kzg = Blob.getViemKzgInstance();
43
43
  const blobInputs = {
44
- blobs: [blobData],
44
+ blobs: [
45
+ blobData
46
+ ],
45
47
  kzg,
46
- maxFeePerBlobGas: cancelGasPrice.maxFeePerBlobGas,
48
+ maxFeePerBlobGas: cancelGasPrice.maxFeePerBlobGas
47
49
  };
48
50
  const cancelTxHash = await this.walletClient.sendTransaction({
49
51
  ...request,
50
52
  ...blobInputs,
51
53
  nonce,
52
- gas: 21000n,
54
+ gas: 21_000n,
53
55
  maxFeePerGas: cancelGasPrice.maxFeePerGas,
54
- maxPriorityFeePerGas: cancelGasPrice.maxPriorityFeePerGas,
56
+ maxPriorityFeePerGas: cancelGasPrice.maxPriorityFeePerGas
55
57
  });
56
- const receipt = await this.monitorTransaction(request, cancelTxHash, { gasLimit: 21000n }, undefined, blobInputs, true);
58
+ const receipt = await this.monitorTransaction(request, cancelTxHash, {
59
+ gasLimit: 21_000n
60
+ }, undefined, blobInputs, true);
57
61
  return receipt.transactionHash;
58
62
  }
59
63
  }
60
64
  }
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdHhfdXRpbHNfd2l0aF9ibG9icy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9sMV90eF91dGlsc193aXRoX2Jsb2JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxDLE9BQU8sRUFBaUIsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUQsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFNBQVM7SUFDL0M7Ozs7OztPQU1HO0lBQ00sS0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQWEsRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFLGdCQUEyQixFQUFFLFFBQVEsR0FBRyxDQUFDO1FBQzdHLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO1FBRTFDLDBEQUEwRDtRQUMxRCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQzNDO1lBQ0UsR0FBRyxJQUFJLENBQUMsTUFBTTtZQUNkLHVFQUF1RTtZQUN2RSw4QkFBOEIsRUFBRSxHQUFHLEVBQUUsK0NBQStDO1NBQ3JGLEVBQ0QsUUFBUSxFQUNSLFFBQVEsR0FBRyxDQUFDLEVBQ1osZ0JBQWdCLENBQ2pCLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQywrQ0FBK0MsS0FBSyxFQUFFLEVBQUU7WUFDekUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDO1lBQ3JELG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUM7U0FDdEUsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUc7WUFDZCxFQUFFLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDbkIsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDO1FBRUYsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUM7Z0JBQzNELEdBQUcsT0FBTztnQkFDVixLQUFLO2dCQUNMLEdBQUcsRUFBRSxNQUFPLEVBQUUsNEJBQTRCO2dCQUMxQyxZQUFZLEVBQUUsY0FBYyxDQUFDLFlBQVk7Z0JBQ3pDLG9CQUFvQixFQUFFLGNBQWMsQ0FBQyxvQkFBb0I7YUFDMUQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQzNDLE9BQU8sRUFDUCxZQUFZLEVBQ1osRUFBRSxRQUFRLEVBQUUsTUFBTyxFQUFFLEVBQ3JCLFNBQVMsRUFDVCxTQUFTLEVBQ1QsSUFBSSxDQUNMLENBQUM7WUFFRixPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDakMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFFBQVEsR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDdEMsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDakIsR0FBRztnQkFDSCxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsZ0JBQWlCO2FBQ25ELENBQUM7WUFDRixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDO2dCQUMzRCxHQUFHLE9BQU87Z0JBQ1YsR0FBRyxVQUFVO2dCQUNiLEtBQUs7Z0JBQ0wsR0FBRyxFQUFFLE1BQU87Z0JBQ1osWUFBWSxFQUFFLGNBQWMsQ0FBQyxZQUFZO2dCQUN6QyxvQkFBb0IsRUFBRSxjQUFjLENBQUMsb0JBQW9CO2FBQzFELENBQUMsQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUMzQyxPQUFPLEVBQ1AsWUFBWSxFQUNaLEVBQUUsUUFBUSxFQUFFLE1BQU8sRUFBRSxFQUNyQixTQUFTLEVBQ1QsVUFBVSxFQUNWLElBQUksQ0FDTCxDQUFDO1lBRUYsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
package/dest/queries.js CHANGED
@@ -1,24 +1,22 @@
1
1
  import { GovernanceContract } from './contracts/governance.js';
2
2
  import { RollupContract } from './contracts/rollup.js';
3
- /** Given the Governance contract address, reads the addresses from all other contracts from L1. */
4
- export async function getL1ContractsAddresses(publicClient, governanceAddress) {
3
+ /** Given the Governance contract address, reads the addresses from all other contracts from L1. */ export async function getL1ContractsAddresses(publicClient, governanceAddress) {
5
4
  const governance = new GovernanceContract(publicClient, governanceAddress.toString());
6
5
  const governanceAddresses = await governance.getGovernanceAddresses();
7
6
  const rollup = new RollupContract(publicClient, governanceAddresses.rollupAddress.toString());
8
7
  const rollupAddresses = await rollup.getRollupAddresses();
9
8
  return {
10
9
  ...governanceAddresses,
11
- ...rollupAddresses,
10
+ ...rollupAddresses
12
11
  };
13
12
  }
14
- /** Reads the L1ContractsConfig from L1 contracts. */
15
- export async function getL1ContractsConfig(publicClient, addresses) {
13
+ /** Reads the L1ContractsConfig from L1 contracts. */ export async function getL1ContractsConfig(publicClient, addresses) {
16
14
  const governance = new GovernanceContract(publicClient, addresses.governanceAddress.toString());
17
15
  const governanceProposer = await governance.getProposer();
18
16
  const rollupAddress = addresses.rollupAddress ?? (await governance.getGovernanceAddresses()).rollupAddress;
19
17
  const rollup = new RollupContract(publicClient, rollupAddress.toString());
20
18
  const slasherProposer = await rollup.getSlashingProposer();
21
- const [l1StartBlock, l1GenesisTime, aztecEpochDuration, aztecEpochProofClaimWindowInL2Slots, aztecSlotDuration, aztecTargetCommitteeSize, minimumStake, governanceProposerQuorum, governanceProposerRoundSize, slashingQuorum, slashingRoundSize,] = await Promise.all([
19
+ const [l1StartBlock, l1GenesisTime, aztecEpochDuration, aztecEpochProofClaimWindowInL2Slots, aztecSlotDuration, aztecTargetCommitteeSize, minimumStake, governanceProposerQuorum, governanceProposerRoundSize, slashingQuorum, slashingRoundSize] = await Promise.all([
22
20
  rollup.getL1StartBlock(),
23
21
  rollup.getL1GenesisTime(),
24
22
  rollup.getEpochDuration(),
@@ -29,7 +27,7 @@ export async function getL1ContractsConfig(publicClient, addresses) {
29
27
  governanceProposer.getQuorumSize(),
30
28
  governanceProposer.getRoundSize(),
31
29
  slasherProposer.getQuorumSize(),
32
- slasherProposer.getRoundSize(),
30
+ slasherProposer.getRoundSize()
33
31
  ]);
34
32
  return {
35
33
  l1StartBlock,
@@ -42,7 +40,6 @@ export async function getL1ContractsConfig(publicClient, addresses) {
42
40
  governanceProposerRoundSize: Number(governanceProposerRoundSize),
43
41
  minimumStake,
44
42
  slashingQuorum: Number(slashingQuorum),
45
- slashingRoundSize: Number(slashingRoundSize),
43
+ slashingRoundSize: Number(slashingRoundSize)
46
44
  };
47
45
  }
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcmllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9xdWVyaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUd2RCxtR0FBbUc7QUFDbkcsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUIsQ0FDM0MsWUFBZ0QsRUFDaEQsaUJBQTZCO0lBRTdCLE1BQU0sVUFBVSxHQUFHLElBQUksa0JBQWtCLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdEYsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBRXRFLE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM5RixNQUFNLGVBQWUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBRTFELE9BQU87UUFDTCxHQUFHLG1CQUFtQjtRQUN0QixHQUFHLGVBQWU7S0FDbkIsQ0FBQztBQUNKLENBQUM7QUFFRCxxREFBcUQ7QUFDckQsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsWUFBZ0QsRUFDaEQsU0FBd0U7SUFFeEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDaEcsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMxRCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsYUFBYSxJQUFJLENBQUMsTUFBTSxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUMzRyxNQUFNLE1BQU0sR0FBRyxJQUFJLGNBQWMsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUUsTUFBTSxlQUFlLEdBQUcsTUFBTSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUUzRCxNQUFNLENBQ0osWUFBWSxFQUNaLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsbUNBQW1DLEVBQ25DLGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIsWUFBWSxFQUNaLHdCQUF3QixFQUN4QiwyQkFBMkIsRUFDM0IsY0FBYyxFQUNkLGlCQUFpQixFQUNsQixHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUNwQixNQUFNLENBQUMsZUFBZSxFQUFFO1FBQ3hCLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QixNQUFNLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsTUFBTSxDQUFDLHlCQUF5QixFQUFFO1FBQ2xDLE1BQU0sQ0FBQyxlQUFlLEVBQUU7UUFDeEIsTUFBTSxDQUFDLHNCQUFzQixFQUFFO1FBQy9CLE1BQU0sQ0FBQyxlQUFlLEVBQUU7UUFDeEIsa0JBQWtCLENBQUMsYUFBYSxFQUFFO1FBQ2xDLGtCQUFrQixDQUFDLFlBQVksRUFBRTtRQUNqQyxlQUFlLENBQUMsYUFBYSxFQUFFO1FBQy9CLGVBQWUsQ0FBQyxZQUFZLEVBQUU7S0FDdEIsQ0FBQyxDQUFDO0lBRVosT0FBTztRQUNMLFlBQVk7UUFDWixhQUFhO1FBQ2Isa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1FBQzlDLG1DQUFtQyxFQUFFLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQztRQUNoRixpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUM7UUFDNUMsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixDQUFDO1FBQzFELHdCQUF3QixFQUFFLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQztRQUMxRCwyQkFBMkIsRUFBRSxNQUFNLENBQUMsMkJBQTJCLENBQUM7UUFDaEUsWUFBWTtRQUNaLGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQ3RDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztLQUM3QyxDQUFDO0FBQ0osQ0FBQyJ9
@@ -1,9 +1,10 @@
1
1
  import { L1TxUtilsWithBlobs } from '../l1_tx_utils_with_blobs.js';
2
2
  import { withDelayer } from './tx_delayer.js';
3
3
  export class DelayedTxUtils extends L1TxUtilsWithBlobs {
4
+ delayer;
4
5
  static fromL1TxUtils(l1TxUtils, ethereumSlotDuration) {
5
6
  const { client, delayer } = withDelayer(l1TxUtils.walletClient, {
6
- ethereumSlotDuration,
7
+ ethereumSlotDuration
7
8
  });
8
9
  const casted = l1TxUtils;
9
10
  casted.delayer = delayer;
@@ -12,10 +13,9 @@ export class DelayedTxUtils extends L1TxUtilsWithBlobs {
12
13
  }
13
14
  enableDelayer(ethereumSlotDuration) {
14
15
  const { client, delayer } = withDelayer(this.walletClient, {
15
- ethereumSlotDuration,
16
+ ethereumSlotDuration
16
17
  });
17
18
  this.delayer = delayer;
18
19
  this.walletClient = client;
19
20
  }
20
21
  }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsYXllZF90eF91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2RlbGF5ZWRfdHhfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFnQixXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RCxNQUFNLE9BQU8sY0FBZSxTQUFRLGtCQUFrQjtJQUc3QyxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQTZCLEVBQUUsb0JBQTRCO1FBQ3JGLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUU7WUFDOUQsb0JBQW9CO1NBQ3JCLENBQUMsQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLFNBQXNDLENBQUM7UUFDdEQsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDekIsTUFBTSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7UUFDN0IsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVNLGFBQWEsQ0FBQyxvQkFBNEI7UUFDL0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN6RCxvQkFBb0I7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7SUFDN0IsQ0FBQztDQUNGIn0=
@@ -3,13 +3,11 @@ import { EthCheatCodes } from '../eth_cheat_codes.js';
3
3
  /**
4
4
  * A class that provides utility functions for interacting with ethereum (L1) dumping/loading state to/from a file.
5
5
  * It is separated to avoid importing fs in the main EthCheatCodes class, which might be used in the browser.
6
- */
7
- export class EthCheatCodesWithState extends EthCheatCodes {
6
+ */ export class EthCheatCodesWithState extends EthCheatCodes {
8
7
  /**
9
- * Dumps the current chain state to a file.
10
- * @param fileName - The file name to dump state into
11
- */
12
- async dumpChainState(fileName) {
8
+ * Dumps the current chain state to a file.
9
+ * @param fileName - The file name to dump state into
10
+ */ async dumpChainState(fileName) {
13
11
  const res = await this.rpcCall('hardhat_dumpState', []);
14
12
  if (res.error) {
15
13
  throw new Error(`Error dumping state: ${res.error.message}`);
@@ -19,16 +17,16 @@ export class EthCheatCodesWithState extends EthCheatCodes {
19
17
  this.logger.verbose(`Dumped state to ${fileName}`);
20
18
  }
21
19
  /**
22
- * Loads the chain state from a file.
23
- * @param fileName - The file name to load state from
24
- */
25
- async loadChainState(fileName) {
20
+ * Loads the chain state from a file.
21
+ * @param fileName - The file name to load state from
22
+ */ async loadChainState(fileName) {
26
23
  const data = JSON.parse(fs.readFileSync(`${fileName}.json`, 'utf8'));
27
- const res = await this.rpcCall('hardhat_loadState', [data]);
24
+ const res = await this.rpcCall('hardhat_loadState', [
25
+ data
26
+ ]);
28
27
  if (res.error) {
29
28
  throw new Error(`Error loading state: ${res.error.message}`);
30
29
  }
31
30
  this.logger.verbose(`Loaded state from ${fileName}`);
32
31
  }
33
32
  }
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRoX2NoZWF0X2NvZGVzX3dpdGhfc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9ldGhfY2hlYXRfY29kZXNfd2l0aF9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFcEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXREOzs7R0FHRztBQUNILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxhQUFhO0lBQ3ZEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBZ0I7UUFDMUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsUUFBUSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQWdCO1FBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLFFBQVEsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1RCxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGIn0=
@@ -2,4 +2,3 @@ export * from './delayed_tx_utils.js';
2
2
  export * from './eth_cheat_codes_with_state.js';
3
3
  export * from './start_anvil.js';
4
4
  export * from './tx_delayer.js';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGlCQUFpQixDQUFDIn0=
@@ -4,21 +4,20 @@ import { createAnvil } from '@viem/anvil';
4
4
  import { dirname, resolve } from 'path';
5
5
  /**
6
6
  * Ensures there's a running Anvil instance and returns the RPC URL.
7
- */
8
- export async function startAnvil(l1BlockTime) {
7
+ */ export async function startAnvil(l1BlockTime) {
9
8
  const anvilBinary = resolve(dirname(fileURLToPath(import.meta.url)), '../../', 'scripts/anvil_kill_wrapper.sh');
10
9
  let port;
11
10
  // Start anvil.
12
11
  // We go via a wrapper script to ensure if the parent dies, anvil dies.
13
- const anvil = await retry(async () => {
12
+ const anvil = await retry(async ()=>{
14
13
  const anvil = createAnvil({
15
14
  anvilBinary,
16
15
  port: 0,
17
16
  blockTime: l1BlockTime,
18
- stopTimeout: 1000,
17
+ stopTimeout: 1000
19
18
  });
20
19
  // Listen to the anvil output to get the port.
21
- const removeHandler = anvil.on('message', (message) => {
20
+ const removeHandler = anvil.on('message', (message)=>{
22
21
  if (port === undefined && message.includes('Listening on')) {
23
22
  port = parseInt(message.match(/Listening on ([^:]+):(\d+)/)[2]);
24
23
  }
@@ -26,12 +25,21 @@ export async function startAnvil(l1BlockTime) {
26
25
  await anvil.start();
27
26
  removeHandler();
28
27
  return anvil;
29
- }, 'Start anvil', makeBackoff([5, 5, 5]));
28
+ }, 'Start anvil', makeBackoff([
29
+ 5,
30
+ 5,
31
+ 5
32
+ ]));
30
33
  if (!port) {
31
34
  throw new Error('Failed to start anvil');
32
35
  }
33
36
  // Monkeypatch the anvil instance to include the actually assigned port
34
- Object.defineProperty(anvil, 'port', { value: port, writable: false });
35
- return { anvil, rpcUrl: `http://127.0.0.1:${port}` };
37
+ Object.defineProperty(anvil, 'port', {
38
+ value: port,
39
+ writable: false
40
+ });
41
+ return {
42
+ anvil,
43
+ rpcUrl: `http://127.0.0.1:${port}`
44
+ };
36
45
  }
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnRfYW52aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9zdGFydF9hbnZpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQWMsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXhDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQUMsV0FBb0I7SUFDbkQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBRWhILElBQUksSUFBd0IsQ0FBQztJQUU3QixlQUFlO0lBQ2YsdUVBQXVFO0lBQ3ZFLE1BQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUN2QixLQUFLLElBQUksRUFBRTtRQUNULE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQztZQUN4QixXQUFXO1lBQ1gsSUFBSSxFQUFFLENBQUM7WUFDUCxTQUFTLEVBQUUsV0FBVztZQUN0QixXQUFXLEVBQUUsSUFBSTtTQUNsQixDQUFDLENBQUM7UUFFSCw4Q0FBOEM7UUFDOUMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFlLEVBQUUsRUFBRTtZQUM1RCxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25FLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLGFBQWEsRUFBRSxDQUFDO1FBRWhCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxFQUNELGFBQWEsRUFDYixXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3ZCLENBQUM7SUFFRixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixJQUFJLEVBQUUsRUFBRSxDQUFDO0FBQ3ZELENBQUMifQ==
@@ -2,112 +2,115 @@ 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, walletActions, } from 'viem';
5
+ import { keccak256, parseTransaction, publicActions, walletActions } from 'viem';
6
6
  export function waitUntilBlock(client, blockNumber, logger) {
7
- const publicClient = 'getBlockNumber' in client && typeof client.getBlockNumber === 'function'
8
- ? client
9
- : client.extend(publicActions);
10
- return retryUntil(async () => {
11
- const currentBlockNumber = await publicClient.getBlockNumber({ cacheTime: 0 });
7
+ const publicClient = 'getBlockNumber' in client && typeof client.getBlockNumber === 'function' ? client : client.extend(publicActions);
8
+ return retryUntil(async ()=>{
9
+ const currentBlockNumber = await publicClient.getBlockNumber({
10
+ cacheTime: 0
11
+ });
12
12
  logger?.debug(`Block number is ${currentBlockNumber} (waiting until ${blockNumber})`);
13
13
  return currentBlockNumber >= BigInt(blockNumber);
14
14
  }, `Wait until L1 block ${blockNumber}`, 120, 0.1);
15
15
  }
16
16
  export function waitUntilL1Timestamp(client, timestamp, logger) {
17
- const publicClient = 'getBlockNumber' in client && typeof client.getBlockNumber === 'function'
18
- ? client
19
- : client.extend(publicActions);
17
+ const publicClient = 'getBlockNumber' in client && typeof client.getBlockNumber === 'function' ? client : client.extend(publicActions);
20
18
  let lastBlock = undefined;
21
- return retryUntil(async () => {
22
- const currentBlockNumber = await publicClient.getBlockNumber({ cacheTime: 0 });
19
+ return retryUntil(async ()=>{
20
+ const currentBlockNumber = await publicClient.getBlockNumber({
21
+ cacheTime: 0
22
+ });
23
23
  if (currentBlockNumber === lastBlock) {
24
24
  return false;
25
25
  }
26
26
  lastBlock = currentBlockNumber;
27
- const currentBlock = await publicClient.getBlock({ includeTransactions: false, blockNumber: currentBlockNumber });
27
+ const currentBlock = await publicClient.getBlock({
28
+ includeTransactions: false,
29
+ blockNumber: currentBlockNumber
30
+ });
28
31
  const currentTs = currentBlock.timestamp;
29
32
  logger?.debug(`Block timstamp is ${currentTs} (waiting until ${timestamp})`);
30
33
  return currentTs >= BigInt(timestamp);
31
34
  }, `Wait until L1 timestamp ${timestamp}`, 120, 0.1);
32
35
  }
33
36
  class DelayerImpl {
34
- constructor(opts) {
35
- this.nextWait = undefined;
36
- this.txs = [];
37
+ constructor(opts){
37
38
  this.ethereumSlotDuration = BigInt(opts.ethereumSlotDuration);
38
39
  }
40
+ ethereumSlotDuration;
41
+ nextWait = undefined;
42
+ txs = [];
39
43
  getTxs() {
40
44
  return this.txs;
41
45
  }
42
46
  pauseNextTxUntilBlock(l1BlockNumber) {
43
- this.nextWait = { l1BlockNumber: BigInt(l1BlockNumber) };
47
+ this.nextWait = {
48
+ l1BlockNumber: BigInt(l1BlockNumber)
49
+ };
44
50
  }
45
51
  pauseNextTxUntilTimestamp(l1Timestamp) {
46
- this.nextWait = { l1Timestamp: BigInt(l1Timestamp) };
52
+ this.nextWait = {
53
+ l1Timestamp: BigInt(l1Timestamp)
54
+ };
47
55
  }
48
56
  }
49
57
  /**
50
58
  * Returns a new client (without modifying the one passed in) with an injected tx delayer.
51
59
  * The delayer can be used to hold off the next tx to be sent until a given block number.
52
60
  * TODO(#10824): This doesn't play along well with blob txs for some reason.
53
- */
54
- export function withDelayer(client, opts) {
61
+ */ export function withDelayer(client, opts) {
55
62
  const logger = createLogger('ethereum:tx_delayer');
56
63
  const delayer = new DelayerImpl(opts);
57
- const extended = client
58
- // Tweak sendRawTransaction so it uses the delay defined in the delayer.
59
- // Note that this will only work with local accounts (ie accounts for which we have the private key).
60
- // Transactions signed by the node will not be delayed since they use sendTransaction directly,
61
- // but we do not use them in our codebase at all.
62
- .extend(client => ({
63
- async sendRawTransaction(...args) {
64
- if (delayer.nextWait !== undefined) {
65
- const waitUntil = delayer.nextWait;
66
- delayer.nextWait = undefined;
67
- const publicClient = client;
68
- const wait = 'l1BlockNumber' in waitUntil
69
- ? waitUntilBlock(publicClient, waitUntil.l1BlockNumber - 1n, logger)
70
- : waitUntilL1Timestamp(publicClient, waitUntil.l1Timestamp - delayer.ethereumSlotDuration, logger);
71
- // Compute the tx hash manually so we emulate sendRawTransaction response
72
- const { serializedTransaction } = args[0];
73
- const txHash = keccak256(serializedTransaction);
74
- logger.info(`Delaying tx ${txHash} until ${inspect(waitUntil)}`, {
75
- argsLen: args.length,
76
- ...omit(parseTransaction(serializedTransaction), 'data', 'sidecars'),
77
- });
78
- // Do not await here so we can return the tx hash immediately as if it had been sent on the spot.
79
- // Instead, delay it so it lands on the desired block number or timestamp, assuming anvil will
80
- // mine it immediately.
81
- void wait
82
- .then(async () => {
83
- const clientTxHash = await client.sendRawTransaction(...args);
84
- if (clientTxHash !== txHash) {
85
- logger.error(`Tx hash returned by the client does not match computed one`, {
86
- clientTxHash,
87
- computedTxHash: txHash,
88
- });
89
- }
90
- logger.info(`Sent previously delayed tx ${clientTxHash} to land on ${inspect(waitUntil)}`);
91
- delayer.txs.push(clientTxHash);
92
- })
93
- .catch(err => logger.error(`Error sending tx after delay`, err));
94
- return Promise.resolve(txHash);
64
+ const extended = client// Tweak sendRawTransaction so it uses the delay defined in the delayer.
65
+ // Note that this will only work with local accounts (ie accounts for which we have the private key).
66
+ // Transactions signed by the node will not be delayed since they use sendTransaction directly,
67
+ // but we do not use them in our codebase at all.
68
+ .extend((client)=>({
69
+ async sendRawTransaction (...args) {
70
+ if (delayer.nextWait !== undefined) {
71
+ const waitUntil = delayer.nextWait;
72
+ delayer.nextWait = undefined;
73
+ const publicClient = client;
74
+ const wait = 'l1BlockNumber' in waitUntil ? waitUntilBlock(publicClient, waitUntil.l1BlockNumber - 1n, logger) : waitUntilL1Timestamp(publicClient, waitUntil.l1Timestamp - delayer.ethereumSlotDuration, logger);
75
+ // Compute the tx hash manually so we emulate sendRawTransaction response
76
+ const { serializedTransaction } = args[0];
77
+ const txHash = keccak256(serializedTransaction);
78
+ logger.info(`Delaying tx ${txHash} until ${inspect(waitUntil)}`, {
79
+ argsLen: args.length,
80
+ ...omit(parseTransaction(serializedTransaction), 'data', 'sidecars')
81
+ });
82
+ // Do not await here so we can return the tx hash immediately as if it had been sent on the spot.
83
+ // Instead, delay it so it lands on the desired block number or timestamp, assuming anvil will
84
+ // mine it immediately.
85
+ void wait.then(async ()=>{
86
+ const clientTxHash = await client.sendRawTransaction(...args);
87
+ if (clientTxHash !== txHash) {
88
+ logger.error(`Tx hash returned by the client does not match computed one`, {
89
+ clientTxHash,
90
+ computedTxHash: txHash
91
+ });
92
+ }
93
+ logger.info(`Sent previously delayed tx ${clientTxHash} to land on ${inspect(waitUntil)}`);
94
+ delayer.txs.push(clientTxHash);
95
+ }).catch((err)=>logger.error(`Error sending tx after delay`, err));
96
+ return Promise.resolve(txHash);
97
+ } else {
98
+ const txHash = await client.sendRawTransaction(...args);
99
+ logger.verbose(`Sent tx immediately ${txHash}`);
100
+ delayer.txs.push(txHash);
101
+ return txHash;
102
+ }
95
103
  }
96
- else {
97
- const txHash = await client.sendRawTransaction(...args);
98
- logger.verbose(`Sent tx immediately ${txHash}`);
99
- delayer.txs.push(txHash);
100
- return txHash;
101
- }
102
- },
103
- }))
104
- // Re-extend with sendTransaction so it uses the modified sendRawTransaction.
105
- .extend(client => ({ sendTransaction: walletActions(client).sendTransaction }))
106
- // And with the actions that depend on the modified sendTransaction
107
- .extend(client => ({
108
- writeContract: walletActions(client).writeContract,
109
- deployContract: walletActions(client).deployContract,
110
- }));
111
- return { client: extended, delayer };
104
+ }))// Re-extend with sendTransaction so it uses the modified sendRawTransaction.
105
+ .extend((client)=>({
106
+ sendTransaction: walletActions(client).sendTransaction
107
+ }))// And with the actions that depend on the modified sendTransaction
108
+ .extend((client)=>({
109
+ writeContract: walletActions(client).writeContract,
110
+ deployContract: walletActions(client).deployContract
111
+ }));
112
+ return {
113
+ client: extended,
114
+ delayer
115
+ };
112
116
  }
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfZGVsYXllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3R4X2RlbGF5ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BELE9BQU8sRUFBZSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBS0wsU0FBUyxFQUNULGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsYUFBYSxHQUNkLE1BQU0sTUFBTSxDQUFDO0FBRWQsTUFBTSxVQUFVLGNBQWMsQ0FBbUIsTUFBUyxFQUFFLFdBQTRCLEVBQUUsTUFBZTtJQUN2RyxNQUFNLFlBQVksR0FDaEIsZ0JBQWdCLElBQUksTUFBTSxJQUFJLE9BQU8sTUFBTSxDQUFDLGNBQWMsS0FBSyxVQUFVO1FBQ3ZFLENBQUMsQ0FBRSxNQUFrQztRQUNyQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUVuQyxPQUFPLFVBQVUsQ0FDZixLQUFLLElBQUksRUFBRTtRQUNULE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0UsTUFBTSxFQUFFLEtBQUssQ0FBQyxtQkFBbUIsa0JBQWtCLG1CQUFtQixXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3RGLE9BQU8sa0JBQWtCLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25ELENBQUMsRUFDRCx1QkFBdUIsV0FBVyxFQUFFLEVBQ3BDLEdBQUcsRUFDSCxHQUFHLENBQ0osQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQW1CLE1BQVMsRUFBRSxTQUEwQixFQUFFLE1BQWU7SUFDM0csTUFBTSxZQUFZLEdBQ2hCLGdCQUFnQixJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxjQUFjLEtBQUssVUFBVTtRQUN2RSxDQUFDLENBQUUsTUFBa0M7UUFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFbkMsSUFBSSxTQUFTLEdBQXVCLFNBQVMsQ0FBQztJQUM5QyxPQUFPLFVBQVUsQ0FDZixLQUFLLElBQUksRUFBRTtRQUNULE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0UsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxTQUFTLEdBQUcsa0JBQWtCLENBQUM7UUFDL0IsTUFBTSxZQUFZLEdBQUcsTUFBTSxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDbEgsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUN6QyxNQUFNLEVBQUUsS0FBSyxDQUFDLHFCQUFxQixTQUFTLG1CQUFtQixTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQzdFLE9BQU8sU0FBUyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4QyxDQUFDLEVBQ0QsMkJBQTJCLFNBQVMsRUFBRSxFQUN0QyxHQUFHLEVBQ0gsR0FBRyxDQUNKLENBQUM7QUFDSixDQUFDO0FBV0QsTUFBTSxXQUFXO0lBQ2YsWUFBWSxJQUErQztRQUtwRCxhQUFRLEdBQW9FLFNBQVMsQ0FBQztRQUN0RixRQUFHLEdBQVUsRUFBRSxDQUFDO1FBTHJCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDaEUsQ0FBQztJQU1ELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELHFCQUFxQixDQUFDLGFBQThCO1FBQ2xELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQUVELHlCQUF5QixDQUFDLFdBQTRCO1FBQ3BELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7SUFDdkQsQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3pCLE1BQVMsRUFDVCxJQUErQztJQUUvQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxNQUFNO1FBQ3JCLHdFQUF3RTtRQUN4RSxxR0FBcUc7UUFDckcsK0ZBQStGO1FBQy9GLGlEQUFpRDtTQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLElBQUk7WUFDOUIsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNuQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUNuQyxPQUFPLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztnQkFFN0IsTUFBTSxZQUFZLEdBQUcsTUFBaUMsQ0FBQztnQkFDdkQsTUFBTSxJQUFJLEdBQ1IsZUFBZSxJQUFJLFNBQVM7b0JBQzFCLENBQUMsQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxhQUFhLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQztvQkFDcEUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFdkcseUVBQXlFO2dCQUN6RSxNQUFNLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsTUFBTSxVQUFVLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFO29CQUMvRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ3BCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQztpQkFDckUsQ0FBQyxDQUFDO2dCQUVILGlHQUFpRztnQkFDakcsOEZBQThGO2dCQUM5Rix1QkFBdUI7Z0JBQ3ZCLEtBQUssSUFBSTtxQkFDTixJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ2YsTUFBTSxZQUFZLEdBQUcsTUFBTSxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztvQkFDOUQsSUFBSSxZQUFZLEtBQUssTUFBTSxFQUFFLENBQUM7d0JBQzVCLE1BQU0sQ0FBQyxLQUFLLENBQUMsNERBQTRELEVBQUU7NEJBQ3pFLFlBQVk7NEJBQ1osY0FBYyxFQUFFLE1BQU07eUJBQ3ZCLENBQUMsQ0FBQztvQkFDTCxDQUFDO29CQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsOEJBQThCLFlBQVksZUFBZSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMzRixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDakMsQ0FBQyxDQUFDO3FCQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFFbkUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUF1QixNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDekIsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDLENBQUM7UUFDSCw2RUFBNkU7U0FDNUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUMvRSxtRUFBbUU7U0FDbEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQixhQUFhLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWE7UUFDbEQsY0FBYyxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxjQUFjO0tBQ3JELENBQUMsQ0FBTSxDQUFDO0lBRVgsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDdkMsQ0FBQyJ9
package/dest/types.js CHANGED
@@ -1,2 +1 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
1
+ /** Type for a viem public client */ export { };