@aztec/ethereum 0.0.1-commit.6d63667d → 0.0.1-commit.7ac86ea28
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.
- package/dest/config.d.ts +1 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +5 -3
- package/dest/contracts/empire_base.d.ts +3 -1
- package/dest/contracts/empire_base.d.ts.map +1 -1
- package/dest/contracts/empire_slashing_proposer.d.ts +3 -1
- package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/empire_slashing_proposer.js +9 -0
- package/dest/contracts/fee_asset_price_oracle.d.ts +101 -0
- package/dest/contracts/fee_asset_price_oracle.d.ts.map +1 -0
- package/dest/contracts/fee_asset_price_oracle.js +651 -0
- package/dest/contracts/governance.js +3 -3
- package/dest/contracts/governance_proposer.d.ts +3 -1
- package/dest/contracts/governance_proposer.d.ts.map +1 -1
- package/dest/contracts/governance_proposer.js +9 -0
- package/dest/contracts/index.d.ts +2 -1
- package/dest/contracts/index.d.ts.map +1 -1
- package/dest/contracts/index.js +1 -0
- package/dest/contracts/rollup.d.ts +2 -1
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +5 -3
- package/dest/deploy_aztec_l1_contracts.d.ts +2 -3
- package/dest/deploy_aztec_l1_contracts.d.ts.map +1 -1
- package/dest/deploy_aztec_l1_contracts.js +33 -19
- package/dest/deploy_l1_contract.js +3 -3
- package/dest/l1_artifacts.d.ts +1051 -42
- package/dest/l1_artifacts.d.ts.map +1 -1
- package/dest/l1_tx_utils/config.d.ts +7 -1
- package/dest/l1_tx_utils/config.d.ts.map +1 -1
- package/dest/l1_tx_utils/config.js +14 -1
- package/dest/l1_tx_utils/factory.d.ts +18 -10
- package/dest/l1_tx_utils/factory.d.ts.map +1 -1
- package/dest/l1_tx_utils/factory.js +17 -7
- package/dest/l1_tx_utils/fee-strategies/p75_competitive.js +1 -1
- package/dest/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.js +1 -1
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts +15 -15
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/forwarder_l1_tx_utils.js +9 -15
- package/dest/l1_tx_utils/index-blobs.d.ts +3 -3
- package/dest/l1_tx_utils/index-blobs.d.ts.map +1 -1
- package/dest/l1_tx_utils/index-blobs.js +2 -2
- package/dest/l1_tx_utils/index.d.ts +2 -1
- package/dest/l1_tx_utils/index.d.ts.map +1 -1
- package/dest/l1_tx_utils/index.js +1 -0
- package/dest/l1_tx_utils/l1_tx_utils.d.ts +15 -5
- package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -1
- package/dest/l1_tx_utils/l1_tx_utils.js +41 -7
- package/dest/l1_tx_utils/tx_delayer.d.ts +56 -0
- package/dest/l1_tx_utils/tx_delayer.d.ts.map +1 -0
- package/dest/{test → l1_tx_utils}/tx_delayer.js +62 -34
- package/dest/test/index.d.ts +1 -3
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +0 -2
- package/dest/test/upgrade_utils.js +2 -2
- package/package.json +5 -5
- package/src/config.ts +3 -2
- package/src/contracts/empire_base.ts +2 -0
- package/src/contracts/empire_slashing_proposer.ts +6 -0
- package/src/contracts/fee_asset_price_oracle.ts +280 -0
- package/src/contracts/governance.ts +3 -3
- package/src/contracts/governance_proposer.ts +6 -0
- package/src/contracts/index.ts +1 -0
- package/src/contracts/rollup.ts +11 -7
- package/src/deploy_aztec_l1_contracts.ts +56 -29
- package/src/deploy_l1_contract.ts +3 -3
- package/src/l1_tx_utils/config.ts +20 -0
- package/src/l1_tx_utils/factory.ts +31 -31
- package/src/l1_tx_utils/fee-strategies/p75_competitive.ts +1 -1
- package/src/l1_tx_utils/fee-strategies/p75_competitive_blob_txs_only.ts +1 -1
- package/src/l1_tx_utils/forwarder_l1_tx_utils.ts +43 -54
- package/src/l1_tx_utils/index-blobs.ts +2 -2
- package/src/l1_tx_utils/index.ts +1 -0
- package/src/l1_tx_utils/l1_tx_utils.ts +46 -11
- package/src/{test → l1_tx_utils}/tx_delayer.ts +78 -50
- package/src/test/index.ts +0 -2
- package/src/test/upgrade_utils.ts +2 -2
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +0 -26
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +0 -1
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +0 -26
- package/dest/test/delayed_tx_utils.d.ts +0 -13
- package/dest/test/delayed_tx_utils.d.ts.map +0 -1
- package/dest/test/delayed_tx_utils.js +0 -28
- package/dest/test/tx_delayer.d.ts +0 -36
- package/dest/test/tx_delayer.d.ts.map +0 -1
- package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +0 -77
- package/src/test/delayed_tx_utils.ts +0 -52
|
@@ -1,19 +1,21 @@
|
|
|
1
|
+
import type { BlobKzgInstance } from '@aztec/blob-lib/types';
|
|
1
2
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
3
|
import type { Logger } from '@aztec/foundation/log';
|
|
3
4
|
import type { DateProvider } from '@aztec/foundation/timer';
|
|
4
|
-
import type {
|
|
5
|
-
import type { ExtendedViemWalletClient, ViemClient } from '../types.js';
|
|
5
|
+
import type { ViemClient } from '../types.js';
|
|
6
6
|
import type { L1TxUtilsConfig } from './config.js';
|
|
7
|
+
import type { L1SignerSource } from './factory.js';
|
|
7
8
|
import type { IL1TxMetrics, IL1TxStore } from './interfaces.js';
|
|
8
|
-
import {
|
|
9
|
+
import { L1TxUtils } from './l1_tx_utils.js';
|
|
10
|
+
import { Delayer } from './tx_delayer.js';
|
|
9
11
|
import type { L1BlobInputs, L1TxConfig, L1TxRequest, SigningCallback } from './types.js';
|
|
10
12
|
/**
|
|
11
|
-
* Extends
|
|
13
|
+
* Extends L1TxUtils to wrap all transactions through a forwarder contract.
|
|
12
14
|
* This is mainly used for testing the archiver's ability to decode transactions that go through proxies.
|
|
13
15
|
*/
|
|
14
|
-
export declare class ForwarderL1TxUtils extends
|
|
16
|
+
export declare class ForwarderL1TxUtils extends L1TxUtils {
|
|
15
17
|
private readonly forwarderAddress;
|
|
16
|
-
constructor(client: ViemClient
|
|
18
|
+
constructor(client: ViemClient, senderAddress: EthAddress, signingCallback: SigningCallback, logger: Logger | undefined, dateProvider: DateProvider | undefined, config: Partial<L1TxUtilsConfig>, debugMaxGasLimit: boolean, store: IL1TxStore | undefined, metrics: IL1TxMetrics | undefined, kzg: BlobKzgInstance | undefined, delayer: Delayer | undefined, forwarderAddress: EthAddress);
|
|
17
19
|
/**
|
|
18
20
|
* Wraps the transaction request in a call to the forwarder contract.
|
|
19
21
|
*/
|
|
@@ -26,16 +28,14 @@ export declare class ForwarderL1TxUtils extends L1TxUtilsWithBlobs {
|
|
|
26
28
|
state: import("./types.js").L1TxState;
|
|
27
29
|
}>;
|
|
28
30
|
}
|
|
29
|
-
export declare function
|
|
31
|
+
export declare function createForwarderL1TxUtils(source: L1SignerSource, forwarderAddress: EthAddress, deps?: {
|
|
30
32
|
logger?: Logger;
|
|
31
33
|
dateProvider?: DateProvider;
|
|
32
34
|
store?: IL1TxStore;
|
|
33
35
|
metrics?: IL1TxMetrics;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}, config?: Partial<L1TxUtilsConfig>, debugMaxGasLimit?: boolean): ForwarderL1TxUtils;
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yd2FyZGVyX2wxX3R4X3V0aWxzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbDFfdHhfdXRpbHMvZm9yd2FyZGVyX2wxX3R4X3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUk1RCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU3RCxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEUsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVqRSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekY7OztHQUdHO0FBQ0gscUJBQWEsa0JBQW1CLFNBQVEsa0JBQWtCO0lBV3RELE9BQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO0lBVm5DLFlBQ0UsTUFBTSxFQUFFLFVBQVUsR0FBRyx3QkFBd0IsRUFDN0MsYUFBYSxFQUFFLFVBQVUsRUFDekIsZUFBZSxFQUFFLGVBQWUsRUFDaEMsTUFBTSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQzFCLFlBQVksRUFBRSxZQUFZLEdBQUcsU0FBUyxFQUN0QyxNQUFNLEVBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUNoQyxnQkFBZ0IsRUFBRSxPQUFPLEVBQ3pCLEtBQUssRUFBRSxVQUFVLEdBQUcsU0FBUyxFQUM3QixPQUFPLEVBQUUsWUFBWSxHQUFHLFNBQVMsRUFDaEIsZ0JBQWdCLEVBQUUsVUFBVSxFQUc5QztJQUVEOztPQUVHO0lBQ0gsT0FBTyxDQUFDLGVBQWU7SUFldkI7O09BRUc7SUFDYSx5QkFBeUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsRUFBRSxZQUFZOzs7T0FJaEg7Q0FDRjtBQUVELHdCQUFnQixzQ0FBc0MsQ0FDcEQsTUFBTSxFQUFFLHdCQUF3QixFQUNoQyxnQkFBZ0IsRUFBRSxVQUFVLEVBQzVCLElBQUksR0FBRTtJQUNKLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNoQixZQUFZLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDNUIsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFDO0lBQ25CLE9BQU8sQ0FBQyxFQUFFLFlBQVksQ0FBQztDQUNuQixFQUNOLE1BQU0sR0FBRSxPQUFPLENBQUMsZUFBZSxDQUFNLEVBQ3JDLGdCQUFnQixHQUFFLE9BQWUsc0JBY2xDO0FBRUQsd0JBQWdCLHFDQUFxQyxDQUNuRCxNQUFNLEVBQUUsVUFBVSxFQUNsQixNQUFNLEVBQUUsU0FBUyxFQUNqQixnQkFBZ0IsRUFBRSxVQUFVLEVBQzVCLElBQUksR0FBRTtJQUNKLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNoQixZQUFZLENBQUMsRUFBRSxZQUFZLENBQUM7SUFDNUIsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFDO0lBQ25CLE9BQU8sQ0FBQyxFQUFFLFlBQVksQ0FBQztDQUNuQixFQUNOLE1BQU0sR0FBRSxPQUFPLENBQUMsZUFBZSxDQUFNLEVBQ3JDLGdCQUFnQixHQUFFLE9BQWUsc0JBa0JsQyJ9
|
|
36
|
+
kzg?: BlobKzgInstance;
|
|
37
|
+
delayer?: Delayer;
|
|
38
|
+
}, config?: Partial<L1TxUtilsConfig> & {
|
|
39
|
+
debugMaxGasLimit?: boolean;
|
|
40
|
+
}): ForwarderL1TxUtils;
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yd2FyZGVyX2wxX3R4X3V0aWxzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbDFfdHhfdXRpbHMvZm9yd2FyZGVyX2wxX3R4X3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUs1RCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVuRCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekY7OztHQUdHO0FBQ0gscUJBQWEsa0JBQW1CLFNBQVEsU0FBUztJQWE3QyxPQUFPLENBQUMsUUFBUSxDQUFDLGdCQUFnQjtJQVpuQyxZQUNFLE1BQU0sRUFBRSxVQUFVLEVBQ2xCLGFBQWEsRUFBRSxVQUFVLEVBQ3pCLGVBQWUsRUFBRSxlQUFlLEVBQ2hDLE1BQU0sRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUMxQixZQUFZLEVBQUUsWUFBWSxHQUFHLFNBQVMsRUFDdEMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFDaEMsZ0JBQWdCLEVBQUUsT0FBTyxFQUN6QixLQUFLLEVBQUUsVUFBVSxHQUFHLFNBQVMsRUFDN0IsT0FBTyxFQUFFLFlBQVksR0FBRyxTQUFTLEVBQ2pDLEdBQUcsRUFBRSxlQUFlLEdBQUcsU0FBUyxFQUNoQyxPQUFPLEVBQUUsT0FBTyxHQUFHLFNBQVMsRUFDWCxnQkFBZ0IsRUFBRSxVQUFVLEVBZTlDO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsZUFBZTtJQWV2Qjs7T0FFRztJQUNhLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLFlBQVk7OztPQUloSDtDQUNGO0FBRUQsd0JBQWdCLHdCQUF3QixDQUN0QyxNQUFNLEVBQUUsY0FBYyxFQUN0QixnQkFBZ0IsRUFBRSxVQUFVLEVBQzVCLElBQUksQ0FBQyxFQUFFO0lBQ0wsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQztJQUM1QixLQUFLLENBQUMsRUFBRSxVQUFVLENBQUM7SUFDbkIsT0FBTyxDQUFDLEVBQUUsWUFBWSxDQUFDO0lBQ3ZCLEdBQUcsQ0FBQyxFQUFFLGVBQWUsQ0FBQztJQUN0QixPQUFPLENBQUMsRUFBRSxPQUFPLENBQUM7Q0FDbkIsRUFDRCxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUc7SUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQTtDQUFFLEdBQ2pFLGtCQUFrQixDQWdCcEIifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forwarder_l1_tx_utils.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/forwarder_l1_tx_utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"forwarder_l1_tx_utils.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/forwarder_l1_tx_utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAK5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEzF;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;IAa7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAZnC,YACE,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,UAAU,EACzB,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,EAChC,gBAAgB,EAAE,OAAO,EACzB,KAAK,EAAE,UAAU,GAAG,SAAS,EAC7B,OAAO,EAAE,YAAY,GAAG,SAAS,EACjC,GAAG,EAAE,eAAe,GAAG,SAAS,EAChC,OAAO,EAAE,OAAO,GAAG,SAAS,EACX,gBAAgB,EAAE,UAAU,EAe9C;IAED;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACa,yBAAyB,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,YAAY;;;OAIhH;CACF;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,cAAc,EACtB,gBAAgB,EAAE,UAAU,EAC5B,IAAI,CAAC,EAAE;IACL,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,GAAG,CAAC,EAAE,eAAe,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,EACD,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,GACjE,kBAAkB,CAgBpB"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
1
|
import { encodeFunctionData } from 'viem';
|
|
3
2
|
import { FORWARDER_ABI } from '../forwarder_proxy.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { resolveSignerSource } from './factory.js';
|
|
4
|
+
import { L1TxUtils } from './l1_tx_utils.js';
|
|
6
5
|
/**
|
|
7
|
-
* Extends
|
|
6
|
+
* Extends L1TxUtils to wrap all transactions through a forwarder contract.
|
|
8
7
|
* This is mainly used for testing the archiver's ability to decode transactions that go through proxies.
|
|
9
|
-
*/ export class ForwarderL1TxUtils extends
|
|
8
|
+
*/ export class ForwarderL1TxUtils extends L1TxUtils {
|
|
10
9
|
forwarderAddress;
|
|
11
|
-
constructor(client, senderAddress, signingCallback, logger, dateProvider, config, debugMaxGasLimit, store, metrics, forwarderAddress){
|
|
12
|
-
super(client, senderAddress, signingCallback, logger, dateProvider, config, debugMaxGasLimit, store, metrics), this.forwarderAddress = forwarderAddress;
|
|
10
|
+
constructor(client, senderAddress, signingCallback, logger, dateProvider, config, debugMaxGasLimit, store, metrics, kzg, delayer, forwarderAddress){
|
|
11
|
+
super(client, senderAddress, signingCallback, logger, dateProvider, config, debugMaxGasLimit, store, metrics, kzg, delayer), this.forwarderAddress = forwarderAddress;
|
|
13
12
|
}
|
|
14
13
|
/**
|
|
15
14
|
* Wraps the transaction request in a call to the forwarder contract.
|
|
@@ -37,12 +36,7 @@ import { createViemSigner } from './signer.js';
|
|
|
37
36
|
return super.sendAndMonitorTransaction(wrappedRequest, gasConfig, blobInputs);
|
|
38
37
|
}
|
|
39
38
|
}
|
|
40
|
-
export function
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
export function createForwarderL1TxUtilsFromEthSigner(client, signer, forwarderAddress, deps = {}, config = {}, debugMaxGasLimit = false) {
|
|
44
|
-
const callback = async (transaction, _signingAddress)=>{
|
|
45
|
-
return (await signer.signTransaction(transaction)).toViemTransactionSignature();
|
|
46
|
-
};
|
|
47
|
-
return new ForwarderL1TxUtils(client, signer.address, callback, deps.logger, deps.dateProvider, config, debugMaxGasLimit, deps.store, deps.metrics, forwarderAddress);
|
|
39
|
+
export function createForwarderL1TxUtils(source, forwarderAddress, deps, config) {
|
|
40
|
+
const { client, address, signingCallback } = resolveSignerSource(source);
|
|
41
|
+
return new ForwarderL1TxUtils(client, address, signingCallback, deps?.logger, deps?.dateProvider, config ?? {}, config?.debugMaxGasLimit ?? false, deps?.store, deps?.metrics, deps?.kzg, deps?.delayer, forwarderAddress);
|
|
48
42
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export { createForwarderL1TxUtils, ForwarderL1TxUtils } from './forwarder_l1_tx_utils.js';
|
|
2
|
+
export { createL1TxUtils, type L1SignerSource, resolveSignerSource } from './factory.js';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtYmxvYnMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sMV90eF91dGlscy9pbmRleC1ibG9icy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRixPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssY0FBYyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-blobs.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/index-blobs.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index-blobs.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/index-blobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
1
|
+
export { createForwarderL1TxUtils, ForwarderL1TxUtils } from './forwarder_l1_tx_utils.js';
|
|
2
|
+
export { createL1TxUtils, resolveSignerSource } from './factory.js';
|
|
@@ -8,5 +8,6 @@ export * from './l1_tx_utils.js';
|
|
|
8
8
|
export * from './readonly_l1_tx_utils.js';
|
|
9
9
|
export * from './signer.js';
|
|
10
10
|
export * from './types.js';
|
|
11
|
+
export * from './tx_delayer.js';
|
|
11
12
|
export * from './utils.js';
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sMV90eF91dGlscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsWUFBWSxDQUFDIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
|
|
@@ -8,5 +8,6 @@ export * from './l1_tx_utils.js';
|
|
|
8
8
|
export * from './readonly_l1_tx_utils.js';
|
|
9
9
|
export * from './signer.js';
|
|
10
10
|
export * from './types.js';
|
|
11
|
+
export * from './tx_delayer.js';
|
|
11
12
|
export * from './utils.js'; // Note: We intentionally do not export l1_tx_utils_with_blobs.js
|
|
12
13
|
// to avoid accidentally importing blob-lib dependency.
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
import type { BlobKzgInstance } from '@aztec/blob-lib/types';
|
|
1
2
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
-
import { type Logger } from '@aztec/foundation/log';
|
|
3
|
+
import { type Logger, type LoggerBindings } from '@aztec/foundation/log';
|
|
3
4
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
4
5
|
import { type Abi, type BlockOverrides, type Hex, type NonceManager, type PrepareTransactionRequestRequest, type StateOverride, type TransactionReceipt } from 'viem';
|
|
5
6
|
import type { ViemClient } from '../types.js';
|
|
6
7
|
import { type L1TxUtilsConfig } from './config.js';
|
|
7
8
|
import type { IL1TxMetrics, IL1TxStore } from './interfaces.js';
|
|
8
9
|
import { ReadOnlyL1TxUtils } from './readonly_l1_tx_utils.js';
|
|
10
|
+
import { Delayer } from './tx_delayer.js';
|
|
9
11
|
import { type L1BlobInputs, type L1TxConfig, type L1TxRequest, type L1TxState, type SigningCallback, TxUtilsState } from './types.js';
|
|
10
12
|
export declare class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
11
13
|
client: ViemClient;
|
|
@@ -15,7 +17,11 @@ export declare class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
15
17
|
protected metrics?: IL1TxMetrics | undefined;
|
|
16
18
|
protected nonceManager: NonceManager;
|
|
17
19
|
protected txs: L1TxState[];
|
|
18
|
-
|
|
20
|
+
/** Tx delayer for testing. Only set when enableDelayer config is true. */
|
|
21
|
+
delayer?: Delayer;
|
|
22
|
+
/** KZG instance for blob operations. */
|
|
23
|
+
protected kzg?: BlobKzgInstance;
|
|
24
|
+
constructor(client: ViemClient, address: EthAddress, signer: SigningCallback, logger?: Logger, dateProvider?: DateProvider, config?: Partial<L1TxUtilsConfig>, debugMaxGasLimit?: boolean, store?: IL1TxStore | undefined, metrics?: IL1TxMetrics | undefined, kzg?: BlobKzgInstance, delayer?: Delayer);
|
|
19
25
|
get state(): TxUtilsState;
|
|
20
26
|
get lastMinedAtBlockNumber(): bigint | undefined;
|
|
21
27
|
protected updateState(l1TxState: L1TxState, newState: TxUtilsState.MINED, l1Timestamp: number): Promise<void>;
|
|
@@ -88,7 +94,11 @@ export declare class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
88
94
|
*/
|
|
89
95
|
protected attemptTxCancellation(state: L1TxState): Promise<void>;
|
|
90
96
|
private getL1Timestamp;
|
|
91
|
-
/** Makes empty blob inputs for the cancellation tx.
|
|
92
|
-
protected makeEmptyBlobInputs(
|
|
97
|
+
/** Makes empty blob inputs for the cancellation tx. */
|
|
98
|
+
protected makeEmptyBlobInputs(maxFeePerBlobGas: bigint): Required<L1BlobInputs>;
|
|
99
|
+
/** Creates a new delayer instance. */
|
|
100
|
+
protected createDelayer(opts: {
|
|
101
|
+
ethereumSlotDuration: bigint | number;
|
|
102
|
+
}, bindings: LoggerBindings): Delayer;
|
|
93
103
|
}
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdHhfdXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sMV90eF91dGlscy9sMV90eF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUk3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBR3ZGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUl2RCxPQUFPLEVBQ0wsS0FBSyxHQUFHLEVBQ1IsS0FBSyxjQUFjLEVBQ25CLEtBQUssR0FBRyxFQUNSLEtBQUssWUFBWSxFQUNqQixLQUFLLGdDQUFnQyxFQUNyQyxLQUFLLGFBQWEsRUFDbEIsS0FBSyxrQkFBa0IsRUFLeEIsTUFBTSxNQUFNLENBQUM7QUFHZCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFOUMsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUEyQixNQUFNLGFBQWEsQ0FBQztBQUU1RSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE9BQU8sRUFBd0MsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRixPQUFPLEVBRUwsS0FBSyxZQUFZLEVBQ2pCLEtBQUssVUFBVSxFQUNmLEtBQUssV0FBVyxFQUNoQixLQUFLLFNBQVMsRUFDZCxLQUFLLGVBQWUsRUFFcEIsWUFBWSxFQUViLE1BQU0sWUFBWSxDQUFDO0FBSXBCLHFCQUFhLFNBQVUsU0FBUSxpQkFBaUI7SUFTNUIsTUFBTSxFQUFFLFVBQVU7SUFDM0IsT0FBTyxFQUFFLFVBQVU7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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l1_tx_utils.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/l1_tx_utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"l1_tx_utils.d.ts","sourceRoot":"","sources":["../../src/l1_tx_utils/l1_tx_utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import { formatViemError } from '../utils.js';
|
|
|
13
13
|
import { l1TxUtilsConfigMappings } from './config.js';
|
|
14
14
|
import { MAX_L1_TX_LIMIT } from './constants.js';
|
|
15
15
|
import { ReadOnlyL1TxUtils } from './readonly_l1_tx_utils.js';
|
|
16
|
+
import { createDelayer, wrapClientWithDelayer } from './tx_delayer.js';
|
|
16
17
|
import { DroppedTransactionError, TerminalTxUtilsState, TxUtilsState, UnknownMinedTxError } from './types.js';
|
|
17
18
|
const MAX_L1_TX_STATES = 32;
|
|
18
19
|
export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
@@ -23,11 +24,28 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
23
24
|
metrics;
|
|
24
25
|
nonceManager;
|
|
25
26
|
txs;
|
|
26
|
-
|
|
27
|
+
/** Tx delayer for testing. Only set when enableDelayer config is true. */ delayer;
|
|
28
|
+
/** KZG instance for blob operations. */ kzg;
|
|
29
|
+
constructor(client, address, signer, logger = createLogger('ethereum:publisher'), dateProvider = new DateProvider(), config, debugMaxGasLimit = false, store, metrics, kzg, delayer){
|
|
27
30
|
super(client, logger, dateProvider, config, debugMaxGasLimit), this.client = client, this.address = address, this.signer = signer, this.store = store, this.metrics = metrics, this.txs = [];
|
|
28
31
|
this.nonceManager = createNonceManager({
|
|
29
32
|
source: jsonRpc()
|
|
30
33
|
});
|
|
34
|
+
this.kzg = kzg;
|
|
35
|
+
// Set up delayer: use provided one or create new
|
|
36
|
+
if (config?.enableDelayer && config?.ethereumSlotDuration) {
|
|
37
|
+
this.delayer = delayer ?? this.createDelayer({
|
|
38
|
+
ethereumSlotDuration: config.ethereumSlotDuration
|
|
39
|
+
}, logger.getBindings());
|
|
40
|
+
this.client = wrapClientWithDelayer(this.client, this.delayer);
|
|
41
|
+
if (config.txDelayerMaxInclusionTimeIntoSlot !== undefined) {
|
|
42
|
+
this.delayer.setMaxInclusionTimeIntoSlot(config.txDelayerMaxInclusionTimeIntoSlot);
|
|
43
|
+
}
|
|
44
|
+
} else if (delayer) {
|
|
45
|
+
// Delayer provided but enableDelayer not set — just store it without wrapping
|
|
46
|
+
logger.warn('Delayer provided but enableDelayer config is not set; delayer will not be used');
|
|
47
|
+
this.delayer = delayer;
|
|
48
|
+
}
|
|
31
49
|
}
|
|
32
50
|
get state() {
|
|
33
51
|
return this.txs.at(-1)?.status ?? TxUtilsState.IDLE;
|
|
@@ -148,6 +166,13 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
148
166
|
if (this.interrupted) {
|
|
149
167
|
throw new InterruptError(`Transaction sending is interrupted`);
|
|
150
168
|
}
|
|
169
|
+
// Check timeout before consuming nonce to avoid leaking a nonce that was never sent.
|
|
170
|
+
// A leaked nonce creates a gap (e.g. nonce 107 consumed but unsent), so all subsequent
|
|
171
|
+
// transactions (108, 109, ...) can never be mined since the chain expects 107 first.
|
|
172
|
+
const now = new Date(await this.getL1Timestamp());
|
|
173
|
+
if (gasConfig.txTimeoutAt && now > gasConfig.txTimeoutAt) {
|
|
174
|
+
throw new TimeoutError(`Transaction timed out before sending (now ${now.toISOString()} > timeoutAt ${gasConfig.txTimeoutAt.toISOString()})`);
|
|
175
|
+
}
|
|
151
176
|
const nonce = await this.nonceManager.consume({
|
|
152
177
|
client: this.client,
|
|
153
178
|
address: account,
|
|
@@ -163,10 +188,6 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
163
188
|
const txData = this.makeTxData(baseState, {
|
|
164
189
|
isCancelTx: false
|
|
165
190
|
});
|
|
166
|
-
const now = new Date(await this.getL1Timestamp());
|
|
167
|
-
if (gasConfig.txTimeoutAt && now > gasConfig.txTimeoutAt) {
|
|
168
|
-
throw new TimeoutError(`Transaction timed out before sending (now ${now.toISOString()} > timeoutAt ${gasConfig.txTimeoutAt.toISOString()})`);
|
|
169
|
-
}
|
|
170
191
|
// Send the new tx
|
|
171
192
|
const signedRequest = await this.prepareSignedTransaction(txData);
|
|
172
193
|
const txHash = await this.client.sendRawTransaction({
|
|
@@ -617,7 +638,20 @@ export class L1TxUtils extends ReadOnlyL1TxUtils {
|
|
|
617
638
|
});
|
|
618
639
|
return Number(timestamp) * 1000;
|
|
619
640
|
}
|
|
620
|
-
/** Makes empty blob inputs for the cancellation tx.
|
|
621
|
-
|
|
641
|
+
/** Makes empty blob inputs for the cancellation tx. */ makeEmptyBlobInputs(maxFeePerBlobGas) {
|
|
642
|
+
if (!this.kzg) {
|
|
643
|
+
throw new Error('Cannot make empty blob inputs for cancellation without kzg');
|
|
644
|
+
}
|
|
645
|
+
const blobData = new Uint8Array(131072).fill(0);
|
|
646
|
+
return {
|
|
647
|
+
blobs: [
|
|
648
|
+
blobData
|
|
649
|
+
],
|
|
650
|
+
kzg: this.kzg,
|
|
651
|
+
maxFeePerBlobGas
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
/** Creates a new delayer instance. */ createDelayer(opts, bindings) {
|
|
655
|
+
return createDelayer(this.dateProvider, opts, bindings);
|
|
622
656
|
}
|
|
623
657
|
}
|
|
@@ -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,7 @@ 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';
|
|
7
6
|
const MAX_WAIT_TIME_SECONDS = 180;
|
|
8
7
|
export function waitUntilBlock(client, blockNumber, logger, timeout) {
|
|
9
8
|
const publicClient = 'getBlockNumber' in client && typeof client.getBlockNumber === 'function' ? client : client.extend(publicActions);
|
|
@@ -35,59 +34,78 @@ export function waitUntilL1Timestamp(client, timestamp, logger, timeout) {
|
|
|
35
34
|
return currentTs >= BigInt(timestamp);
|
|
36
35
|
}, `Wait until L1 timestamp ${timestamp}`, timeout ?? MAX_WAIT_TIME_SECONDS, 0.1);
|
|
37
36
|
}
|
|
38
|
-
class
|
|
37
|
+
/** Manages tx delaying for testing, intercepting sendRawTransaction calls to delay or cancel them. */ export class Delayer {
|
|
39
38
|
dateProvider;
|
|
40
39
|
logger;
|
|
41
|
-
|
|
40
|
+
maxInclusionTimeIntoSlot;
|
|
41
|
+
ethereumSlotDuration;
|
|
42
|
+
nextWait;
|
|
43
|
+
sentTxHashes;
|
|
44
|
+
cancelledTxs;
|
|
45
|
+
constructor(dateProvider, opts, bindings){
|
|
42
46
|
this.dateProvider = dateProvider;
|
|
43
|
-
this.logger = createLogger('ethereum:tx_delayer');
|
|
44
47
|
this.maxInclusionTimeIntoSlot = undefined;
|
|
45
48
|
this.nextWait = undefined;
|
|
46
49
|
this.sentTxHashes = [];
|
|
47
50
|
this.cancelledTxs = [];
|
|
48
51
|
this.ethereumSlotDuration = BigInt(opts.ethereumSlotDuration);
|
|
52
|
+
this.logger = createLogger('ethereum:tx_delayer', bindings);
|
|
49
53
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
cancelledTxs;
|
|
55
|
-
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() {
|
|
56
58
|
return this.sentTxHashes;
|
|
57
59
|
}
|
|
58
|
-
getCancelledTxs() {
|
|
60
|
+
/** Returns the raw hex for all cancelled txs. */ getCancelledTxs() {
|
|
59
61
|
return this.cancelledTxs;
|
|
60
62
|
}
|
|
61
|
-
pauseNextTxUntilBlock(l1BlockNumber) {
|
|
63
|
+
/** Delays the next tx to be sent so it lands on the given L1 block number. */ pauseNextTxUntilBlock(l1BlockNumber) {
|
|
62
64
|
this.nextWait = {
|
|
63
65
|
l1BlockNumber: BigInt(l1BlockNumber)
|
|
64
66
|
};
|
|
65
67
|
}
|
|
66
|
-
pauseNextTxUntilTimestamp(l1Timestamp) {
|
|
68
|
+
/** Delays the next tx to be sent so it lands on the given timestamp. */ pauseNextTxUntilTimestamp(l1Timestamp) {
|
|
67
69
|
this.nextWait = {
|
|
68
70
|
l1Timestamp: BigInt(l1Timestamp)
|
|
69
71
|
};
|
|
70
72
|
}
|
|
71
|
-
cancelNextTx() {
|
|
73
|
+
/** Delays the next tx to be sent indefinitely. */ cancelNextTx() {
|
|
72
74
|
this.nextWait = {
|
|
73
75
|
indefinitely: true
|
|
74
76
|
};
|
|
75
77
|
}
|
|
76
|
-
|
|
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) {
|
|
77
83
|
this.maxInclusionTimeIntoSlot = seconds;
|
|
78
84
|
}
|
|
79
85
|
}
|
|
80
86
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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;
|
|
87
99
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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.
|
|
91
109
|
// Note that this will only work with local accounts (ie accounts for which we have the private key).
|
|
92
110
|
// Transactions signed by the node will not be delayed since they use sendTransaction directly,
|
|
93
111
|
// but we do not use them in our codebase at all.
|
|
@@ -97,6 +115,7 @@ class DelayerImpl {
|
|
|
97
115
|
let txHash;
|
|
98
116
|
const { serializedTransaction } = args[0];
|
|
99
117
|
const publicClient = client;
|
|
118
|
+
const sender = await tryRecoverSender(serializedTransaction);
|
|
100
119
|
if (delayer.nextWait !== undefined) {
|
|
101
120
|
// Check if we have been instructed to delay the next tx.
|
|
102
121
|
const waitUntil = delayer.nextWait;
|
|
@@ -105,13 +124,16 @@ class DelayerImpl {
|
|
|
105
124
|
txHash = computeTxHash(serializedTransaction);
|
|
106
125
|
// Cancel tx outright if instructed
|
|
107
126
|
if ('indefinitely' in waitUntil && waitUntil.indefinitely) {
|
|
108
|
-
logger.info(`Cancelling tx ${txHash}
|
|
127
|
+
logger.info(`Cancelling tx ${txHash}`, {
|
|
128
|
+
sender
|
|
129
|
+
});
|
|
109
130
|
delayer.cancelledTxs.push(serializedTransaction);
|
|
110
131
|
return Promise.resolve(txHash);
|
|
111
132
|
}
|
|
112
133
|
// Or wait until the desired block number or timestamp
|
|
113
134
|
wait = 'l1BlockNumber' in waitUntil ? waitUntilBlock(publicClient, waitUntil.l1BlockNumber - 1n, logger) : 'l1Timestamp' in waitUntil ? waitUntilL1Timestamp(publicClient, waitUntil.l1Timestamp - delayer.ethereumSlotDuration, logger) : undefined;
|
|
114
135
|
logger.info(`Delaying tx ${txHash} until ${inspect(waitUntil)}`, {
|
|
136
|
+
sender,
|
|
115
137
|
argsLen: args.length,
|
|
116
138
|
...omit(parseTransaction(serializedTransaction), 'data', 'sidecars')
|
|
117
139
|
});
|
|
@@ -124,6 +146,7 @@ class DelayerImpl {
|
|
|
124
146
|
const now = delayer.dateProvider.now();
|
|
125
147
|
txHash = computeTxHash(serializedTransaction);
|
|
126
148
|
const logData = {
|
|
149
|
+
sender,
|
|
127
150
|
...omit(parseTransaction(serializedTransaction), 'data', 'sidecars'),
|
|
128
151
|
lastBlockTimestamp,
|
|
129
152
|
now,
|
|
@@ -150,29 +173,34 @@ class DelayerImpl {
|
|
|
150
173
|
computedTxHash: txHash
|
|
151
174
|
});
|
|
152
175
|
}
|
|
153
|
-
logger.info(`Sent previously delayed tx ${clientTxHash}
|
|
176
|
+
logger.info(`Sent previously delayed tx ${clientTxHash}`, {
|
|
177
|
+
sender
|
|
178
|
+
});
|
|
154
179
|
delayer.sentTxHashes.push(clientTxHash);
|
|
155
180
|
}).catch((err)=>logger.error(`Error sending tx after delay`, err));
|
|
156
181
|
return Promise.resolve(txHash);
|
|
157
182
|
} else {
|
|
158
183
|
const txHash = await client.sendRawTransaction(...args);
|
|
159
|
-
logger.debug(`Sent tx immediately ${txHash}
|
|
184
|
+
logger.debug(`Sent tx immediately ${txHash}`, {
|
|
185
|
+
sender
|
|
186
|
+
});
|
|
160
187
|
delayer.sentTxHashes.push(txHash);
|
|
161
188
|
return txHash;
|
|
162
189
|
}
|
|
163
190
|
}
|
|
164
|
-
}))
|
|
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.
|
|
165
196
|
.extend((client)=>({
|
|
166
197
|
sendTransaction: walletActions(client).sendTransaction
|
|
167
198
|
}))// And with the actions that depend on the modified sendTransaction
|
|
168
199
|
.extend((client)=>({
|
|
169
200
|
writeContract: walletActions(client).writeContract,
|
|
170
201
|
deployContract: walletActions(client).deployContract
|
|
171
|
-
}));
|
|
172
|
-
return
|
|
173
|
-
client: extended,
|
|
174
|
-
delayer
|
|
175
|
-
};
|
|
202
|
+
})) : withRawTx;
|
|
203
|
+
return extended;
|
|
176
204
|
}
|
|
177
205
|
/**
|
|
178
206
|
* Compute the tx hash given the serialized tx. Note that if this is a blob tx, we need to
|
package/dest/test/index.d.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
export * from './delayed_tx_utils.js';
|
|
2
1
|
export * from './eth_cheat_codes.js';
|
|
3
2
|
export * from './eth_cheat_codes_with_state.js';
|
|
4
3
|
export * from './start_anvil.js';
|
|
5
|
-
export * from './tx_delayer.js';
|
|
6
4
|
export * from './upgrade_utils.js';
|
|
7
5
|
export * from './chain_monitor.js';
|
|
8
6
|
export * from './rollup_cheat_codes.js';
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHlCQUF5QixDQUFDIn0=
|
package/dest/test/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC"}
|
package/dest/test/index.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
export * from './delayed_tx_utils.js';
|
|
2
1
|
export * from './eth_cheat_codes.js';
|
|
3
2
|
export * from './eth_cheat_codes_with_state.js';
|
|
4
3
|
export * from './start_anvil.js';
|
|
5
|
-
export * from './tx_delayer.js';
|
|
6
4
|
export * from './upgrade_utils.js';
|
|
7
5
|
export * from './chain_monitor.js';
|
|
8
6
|
export * from './rollup_cheat_codes.js';
|