@aztec/ethereum 3.0.0-canary.a9708bd → 3.0.0-devnet.2
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/client.d.ts +1 -1
- package/dest/client.d.ts.map +1 -1
- package/dest/config.d.ts +11 -6
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +124 -64
- package/dest/contracts/empire_base.d.ts +1 -1
- package/dest/contracts/empire_base.d.ts.map +1 -1
- package/dest/contracts/empire_slashing_proposer.d.ts +2 -2
- package/dest/contracts/empire_slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/empire_slashing_proposer.js +1 -1
- package/dest/contracts/fee_asset_handler.d.ts +3 -3
- package/dest/contracts/fee_asset_handler.d.ts.map +1 -1
- package/dest/contracts/governance.js +7 -3
- package/dest/contracts/governance_proposer.d.ts +1 -2
- package/dest/contracts/governance_proposer.d.ts.map +1 -1
- package/dest/contracts/governance_proposer.js +1 -2
- package/dest/contracts/multicall.d.ts +3 -5
- package/dest/contracts/multicall.d.ts.map +1 -1
- package/dest/contracts/multicall.js +6 -4
- package/dest/contracts/rollup.d.ts +39 -19
- package/dest/contracts/rollup.d.ts.map +1 -1
- package/dest/contracts/rollup.js +84 -88
- package/dest/contracts/slasher_contract.d.ts +10 -0
- package/dest/contracts/slasher_contract.d.ts.map +1 -1
- package/dest/contracts/slasher_contract.js +18 -0
- package/dest/contracts/tally_slashing_proposer.d.ts +22 -3
- package/dest/contracts/tally_slashing_proposer.d.ts.map +1 -1
- package/dest/contracts/tally_slashing_proposer.js +55 -5
- package/dest/deploy_l1_contracts.d.ts +22 -7
- package/dest/deploy_l1_contracts.d.ts.map +1 -1
- package/dest/deploy_l1_contracts.js +555 -362
- package/dest/index.d.ts +1 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -1
- package/dest/l1_artifacts.d.ts +8729 -6014
- package/dest/l1_artifacts.d.ts.map +1 -1
- package/dest/l1_artifacts.js +10 -5
- package/dest/l1_contract_addresses.d.ts +5 -1
- package/dest/l1_contract_addresses.d.ts.map +1 -1
- package/dest/l1_contract_addresses.js +16 -26
- package/dest/l1_reader.d.ts +1 -1
- package/dest/l1_reader.d.ts.map +1 -1
- package/dest/l1_reader.js +8 -8
- package/dest/l1_tx_utils/config.d.ts +59 -0
- package/dest/l1_tx_utils/config.d.ts.map +1 -0
- package/dest/l1_tx_utils/config.js +73 -0
- package/dest/l1_tx_utils/constants.d.ts +6 -0
- package/dest/l1_tx_utils/constants.d.ts.map +1 -0
- package/dest/l1_tx_utils/constants.js +14 -0
- package/dest/l1_tx_utils/factory.d.ts +24 -0
- package/dest/l1_tx_utils/factory.d.ts.map +1 -0
- package/dest/l1_tx_utils/factory.js +12 -0
- package/dest/l1_tx_utils/index.d.ts +10 -0
- package/dest/l1_tx_utils/index.d.ts.map +1 -0
- package/dest/l1_tx_utils/index.js +10 -0
- package/dest/l1_tx_utils/interfaces.d.ts +76 -0
- package/dest/l1_tx_utils/interfaces.d.ts.map +1 -0
- package/dest/l1_tx_utils/interfaces.js +4 -0
- package/dest/l1_tx_utils/l1_tx_utils.d.ts +95 -0
- package/dest/l1_tx_utils/l1_tx_utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/l1_tx_utils.js +610 -0
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts +26 -0
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.d.ts.map +1 -0
- package/dest/l1_tx_utils/l1_tx_utils_with_blobs.js +26 -0
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts +81 -0
- package/dest/l1_tx_utils/readonly_l1_tx_utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/readonly_l1_tx_utils.js +294 -0
- package/dest/l1_tx_utils/signer.d.ts +4 -0
- package/dest/l1_tx_utils/signer.d.ts.map +1 -0
- package/dest/l1_tx_utils/signer.js +16 -0
- package/dest/l1_tx_utils/types.d.ts +67 -0
- package/dest/l1_tx_utils/types.d.ts.map +1 -0
- package/dest/l1_tx_utils/types.js +26 -0
- package/dest/l1_tx_utils/utils.d.ts +4 -0
- package/dest/l1_tx_utils/utils.d.ts.map +1 -0
- package/dest/l1_tx_utils/utils.js +14 -0
- package/dest/publisher_manager.d.ts +7 -2
- package/dest/publisher_manager.d.ts.map +1 -1
- package/dest/publisher_manager.js +36 -8
- package/dest/queries.d.ts.map +1 -1
- package/dest/queries.js +11 -12
- package/dest/test/chain_monitor.d.ts +11 -0
- package/dest/test/chain_monitor.d.ts.map +1 -1
- package/dest/test/chain_monitor.js +81 -12
- package/dest/test/delayed_tx_utils.d.ts +2 -2
- package/dest/test/delayed_tx_utils.d.ts.map +1 -1
- package/dest/test/delayed_tx_utils.js +2 -2
- package/dest/test/eth_cheat_codes.d.ts +32 -6
- package/dest/test/eth_cheat_codes.d.ts.map +1 -1
- package/dest/test/eth_cheat_codes.js +115 -28
- package/dest/test/rollup_cheat_codes.d.ts +11 -9
- package/dest/test/rollup_cheat_codes.d.ts.map +1 -1
- package/dest/test/rollup_cheat_codes.js +38 -6
- package/dest/test/upgrade_utils.d.ts.map +1 -1
- package/dest/test/upgrade_utils.js +3 -2
- package/dest/utils.d.ts.map +1 -1
- package/dest/utils.js +10 -161
- package/dest/zkPassportVerifierAddress.js +1 -1
- package/package.json +7 -7
- package/src/client.ts +1 -1
- package/src/config.ts +136 -68
- package/src/contracts/empire_base.ts +1 -1
- package/src/contracts/empire_slashing_proposer.ts +7 -3
- package/src/contracts/fee_asset_handler.ts +1 -1
- package/src/contracts/governance.ts +3 -3
- package/src/contracts/governance_proposer.ts +3 -4
- package/src/contracts/multicall.ts +12 -10
- package/src/contracts/rollup.ts +104 -106
- package/src/contracts/slasher_contract.ts +22 -0
- package/src/contracts/tally_slashing_proposer.ts +54 -6
- package/src/deploy_l1_contracts.ts +570 -328
- package/src/index.ts +1 -1
- package/src/l1_artifacts.ts +14 -6
- package/src/l1_contract_addresses.ts +17 -26
- package/src/l1_reader.ts +9 -9
- package/src/l1_tx_utils/README.md +177 -0
- package/src/l1_tx_utils/config.ts +140 -0
- package/src/l1_tx_utils/constants.ts +18 -0
- package/src/l1_tx_utils/factory.ts +64 -0
- package/src/l1_tx_utils/index.ts +12 -0
- package/src/l1_tx_utils/interfaces.ts +86 -0
- package/src/l1_tx_utils/l1_tx_utils.ts +718 -0
- package/src/l1_tx_utils/l1_tx_utils_with_blobs.ts +77 -0
- package/src/l1_tx_utils/readonly_l1_tx_utils.ts +372 -0
- package/src/l1_tx_utils/signer.ts +28 -0
- package/src/l1_tx_utils/types.ts +85 -0
- package/src/l1_tx_utils/utils.ts +16 -0
- package/src/publisher_manager.ts +51 -9
- package/src/queries.ts +13 -8
- package/src/test/chain_monitor.ts +89 -9
- package/src/test/delayed_tx_utils.ts +2 -2
- package/src/test/eth_cheat_codes.ts +142 -29
- package/src/test/rollup_cheat_codes.ts +54 -14
- package/src/test/upgrade_utils.ts +3 -2
- package/src/utils.ts +13 -185
- package/src/zkPassportVerifierAddress.ts +1 -1
- package/dest/l1_tx_utils.d.ts +0 -250
- package/dest/l1_tx_utils.d.ts.map +0 -1
- package/dest/l1_tx_utils.js +0 -826
- package/dest/l1_tx_utils_with_blobs.d.ts +0 -19
- package/dest/l1_tx_utils_with_blobs.d.ts.map +0 -1
- package/dest/l1_tx_utils_with_blobs.js +0 -85
- package/src/l1_tx_utils.ts +0 -1105
- package/src/l1_tx_utils_with_blobs.ts +0 -144
package/dest/queries.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
-
import { SlasherAbi } from '@aztec/l1-artifacts/SlasherAbi';
|
|
3
|
-
import { getContract } from 'viem';
|
|
4
2
|
import { ReadOnlyGovernanceContract } from './contracts/governance.js';
|
|
5
3
|
import { GovernanceProposerContract } from './contracts/governance_proposer.js';
|
|
6
4
|
import { RollupContract } from './contracts/rollup.js';
|
|
@@ -11,21 +9,18 @@ import { RollupContract } from './contracts/rollup.js';
|
|
|
11
9
|
const rollupAddress = addresses.rollupAddress ?? await governanceProposer.getRollupAddress();
|
|
12
10
|
const rollup = new RollupContract(publicClient, rollupAddress.toString());
|
|
13
11
|
const slasherProposer = await rollup.getSlashingProposer();
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
address: slasherAddress,
|
|
17
|
-
abi: SlasherAbi,
|
|
18
|
-
client: publicClient
|
|
19
|
-
});
|
|
20
|
-
const [l1StartBlock, l1GenesisTime, aztecEpochDuration, aztecSlotDuration, aztecProofSubmissionEpochs, aztecTargetCommitteeSize, activationThreshold, ejectionThreshold, governanceProposerQuorum, governanceProposerRoundSize, slashingQuorum, slashingRoundSize, slashingLifetimeInRounds, slashingExecutionDelayInRounds, slashingOffsetInRounds, slashingAmounts, slashingVetoer, manaTarget, provingCostPerMana, rollupVersion, genesisArchiveTreeRoot, exitDelay] = await Promise.all([
|
|
12
|
+
const slasher = await rollup.getSlasherContract();
|
|
13
|
+
const [l1StartBlock, l1GenesisTime, aztecEpochDuration, aztecSlotDuration, aztecProofSubmissionEpochs, aztecTargetCommitteeSize, lagInEpochs, activationThreshold, ejectionThreshold, localEjectionThreshold, governanceProposerQuorum, governanceProposerRoundSize, slashingQuorum, slashingRoundSize, slashingLifetimeInRounds, slashingExecutionDelayInRounds, slashingOffsetInRounds, slashingAmounts, slashingVetoer, slashingDisableDuration, manaTarget, provingCostPerMana, rollupVersion, genesisArchiveTreeRoot, exitDelay] = await Promise.all([
|
|
21
14
|
rollup.getL1StartBlock(),
|
|
22
15
|
rollup.getL1GenesisTime(),
|
|
23
16
|
rollup.getEpochDuration(),
|
|
24
17
|
rollup.getSlotDuration(),
|
|
25
18
|
rollup.getProofSubmissionEpochs(),
|
|
26
19
|
rollup.getTargetCommitteeSize(),
|
|
20
|
+
rollup.getLagInEpochs(),
|
|
27
21
|
rollup.getActivationThreshold(),
|
|
28
22
|
rollup.getEjectionThreshold(),
|
|
23
|
+
rollup.getLocalEjectionThreshold(),
|
|
29
24
|
governanceProposer.getQuorumSize(),
|
|
30
25
|
governanceProposer.getRoundSize(),
|
|
31
26
|
slasherProposer?.getQuorumSize() ?? 0n,
|
|
@@ -38,7 +33,8 @@ import { RollupContract } from './contracts/rollup.js';
|
|
|
38
33
|
0n,
|
|
39
34
|
0n
|
|
40
35
|
],
|
|
41
|
-
slasher
|
|
36
|
+
slasher?.getVetoer() ?? EthAddress.ZERO,
|
|
37
|
+
slasher?.getSlashingDisableDuration() ?? 0,
|
|
42
38
|
rollup.getManaTarget(),
|
|
43
39
|
rollup.getProvingCostPerMana(),
|
|
44
40
|
rollup.getVersion(),
|
|
@@ -52,16 +48,19 @@ import { RollupContract } from './contracts/rollup.js';
|
|
|
52
48
|
aztecSlotDuration: Number(aztecSlotDuration),
|
|
53
49
|
aztecProofSubmissionEpochs: Number(aztecProofSubmissionEpochs),
|
|
54
50
|
aztecTargetCommitteeSize: Number(aztecTargetCommitteeSize),
|
|
51
|
+
lagInEpochs: Number(lagInEpochs),
|
|
55
52
|
governanceProposerQuorum: Number(governanceProposerQuorum),
|
|
56
53
|
governanceProposerRoundSize: Number(governanceProposerRoundSize),
|
|
57
54
|
activationThreshold,
|
|
58
55
|
ejectionThreshold,
|
|
56
|
+
localEjectionThreshold,
|
|
59
57
|
slashingQuorum: Number(slashingQuorum),
|
|
60
58
|
slashingRoundSizeInEpochs: Number(slashingRoundSize / aztecEpochDuration),
|
|
61
59
|
slashingLifetimeInRounds: Number(slashingLifetimeInRounds),
|
|
62
60
|
slashingExecutionDelayInRounds: Number(slashingExecutionDelayInRounds),
|
|
63
|
-
slashingVetoer
|
|
64
|
-
|
|
61
|
+
slashingVetoer,
|
|
62
|
+
slashingDisableDuration,
|
|
63
|
+
manaTarget,
|
|
65
64
|
provingCostPerMana: provingCostPerMana,
|
|
66
65
|
rollupVersion: Number(rollupVersion),
|
|
67
66
|
genesisArchiveTreeRoot,
|
|
@@ -10,6 +10,7 @@ export type ChainMonitorEventMap = {
|
|
|
10
10
|
'l2-block': [{
|
|
11
11
|
l2BlockNumber: number;
|
|
12
12
|
l1BlockNumber: number;
|
|
13
|
+
l2SlotNumber: number;
|
|
13
14
|
timestamp: bigint;
|
|
14
15
|
}];
|
|
15
16
|
'l2-block-proven': [{
|
|
@@ -26,6 +27,10 @@ export type ChainMonitorEventMap = {
|
|
|
26
27
|
timestamp: bigint;
|
|
27
28
|
committee: EthAddress[] | undefined;
|
|
28
29
|
}];
|
|
30
|
+
'l2-slot': [{
|
|
31
|
+
l2SlotNumber: number;
|
|
32
|
+
timestamp: bigint;
|
|
33
|
+
}];
|
|
29
34
|
};
|
|
30
35
|
/** Utility class that polls the chain on quick intervals and logs new L1 blocks, L2 blocks, and L2 proofs. */
|
|
31
36
|
export declare class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
|
|
@@ -51,11 +56,17 @@ export declare class ChainMonitor extends EventEmitter<ChainMonitorEventMap> {
|
|
|
51
56
|
totalL2Messages: number;
|
|
52
57
|
/** Current L2 epoch number */
|
|
53
58
|
l2EpochNumber: bigint;
|
|
59
|
+
/** Current L2 slot number */
|
|
60
|
+
l2SlotNumber: bigint;
|
|
54
61
|
constructor(rollup: RollupContract, dateProvider?: DateProvider, logger?: import("@aztec/foundation/log").Logger, intervalMs?: number);
|
|
55
62
|
start(): this;
|
|
56
63
|
stop(): Promise<void>;
|
|
57
64
|
private getInbox;
|
|
58
65
|
protected safeRun(): void;
|
|
59
66
|
run(force?: boolean): Promise<this>;
|
|
67
|
+
waitUntilL2Slot(slot: number | bigint): Promise<void>;
|
|
68
|
+
waitUntilL1Block(block: number | bigint): Promise<void>;
|
|
69
|
+
waitUntilL1Timestamp(timestamp: number | bigint): Promise<void>;
|
|
70
|
+
waitUntilL2Block(l2BlockNumber: number | bigint): Promise<void>;
|
|
60
71
|
}
|
|
61
72
|
//# sourceMappingURL=chain_monitor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chain_monitor.d.ts","sourceRoot":"","sources":["../../src/test/chain_monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,UAAU,EAAE,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"chain_monitor.d.ts","sourceRoot":"","sources":["../../src/test/chain_monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,UAAU,EAAE,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxG,iBAAiB,EAAE,CAAC;QAAE,mBAAmB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/F,aAAa,EAAE,CAAC;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,UAAU,EAAE,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,UAAU,EAAE,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IAChG,SAAS,EAAE,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D,CAAC;AAEF,8GAA8G;AAC9G,qBAAa,YAAa,SAAQ,YAAY,CAAC,oBAAoB,CAAC;IAyBhE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IA3B7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,MAAM,CAA6B;IAE3C,OAAO,CAAC,OAAO,CAAiC;IAEhD,8BAA8B;IACvB,aAAa,EAAG,MAAM,CAAC;IAC9B,8BAA8B;IACvB,aAAa,EAAG,MAAM,CAAC;IAC9B,qCAAqC;IAC9B,mBAAmB,EAAG,MAAM,CAAC;IACpC,4CAA4C;IACrC,gBAAgB,EAAG,MAAM,CAAC;IACjC,2CAA2C;IACpC,sBAAsB,EAAG,MAAM,CAAC;IACvC,wDAAwD;IACjD,eAAe,EAAE,MAAM,CAAK;IACnC,8BAA8B;IACvB,aAAa,EAAG,MAAM,CAAC;IAC9B,6BAA6B;IACtB,YAAY,EAAG,MAAM,CAAC;gBAGV,MAAM,EAAE,cAAc,EACtB,YAAY,GAAE,YAAiC,EAC/C,MAAM,yCAA8C,EACpD,UAAU,SAAM;IAMnC,KAAK;IAQC,IAAI;YAaI,QAAQ;IAQtB,SAAS,CAAC,OAAO;IAcX,GAAG,CAAC,KAAK,UAAQ;IAkFhB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBrD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvD,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/D,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAevE"}
|
|
@@ -21,6 +21,7 @@ import { EventEmitter } from 'events';
|
|
|
21
21
|
/** L1 timestamp for the proven L2 block */ l2ProvenBlockTimestamp;
|
|
22
22
|
/** Total number of L2 messages pushed into the Inbox */ totalL2Messages;
|
|
23
23
|
/** Current L2 epoch number */ l2EpochNumber;
|
|
24
|
+
/** Current L2 slot number */ l2SlotNumber;
|
|
24
25
|
constructor(rollup, dateProvider = new DateProvider(), logger = createLogger('aztecjs:utils:chain_monitor'), intervalMs = 200){
|
|
25
26
|
super(), this.rollup = rollup, this.dateProvider = dateProvider, this.logger = logger, this.intervalMs = intervalMs, this.running = new Set(), this.totalL2Messages = 0;
|
|
26
27
|
this.l1Client = rollup.client;
|
|
@@ -71,11 +72,15 @@ import { EventEmitter } from 'events';
|
|
|
71
72
|
return this;
|
|
72
73
|
}
|
|
73
74
|
this.l1BlockNumber = newL1BlockNumber;
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
const [l2SlotNumber, l2Epoch, l1block] = await Promise.all([
|
|
76
|
+
this.rollup.getSlotNumber(),
|
|
77
|
+
this.rollup.getCurrentEpoch(),
|
|
78
|
+
this.l1Client.getBlock({
|
|
79
|
+
blockNumber: BigInt(newL1BlockNumber),
|
|
80
|
+
includeTransactions: false
|
|
81
|
+
})
|
|
82
|
+
]);
|
|
83
|
+
const timestamp = l1block.timestamp;
|
|
79
84
|
const timestampString = new Date(Number(timestamp) * 1000).toTimeString().split(' ')[0];
|
|
80
85
|
this.emit('l1-block', {
|
|
81
86
|
l1BlockNumber: newL1BlockNumber,
|
|
@@ -84,19 +89,20 @@ import { EventEmitter } from 'events';
|
|
|
84
89
|
let msg = `L1 block ${newL1BlockNumber} mined at ${timestampString}`;
|
|
85
90
|
const newL2BlockNumber = Number(await this.rollup.getBlockNumber());
|
|
86
91
|
if (this.l2BlockNumber !== newL2BlockNumber) {
|
|
87
|
-
const epochNumber = await this.rollup.
|
|
92
|
+
const epochNumber = await this.rollup.getEpochNumberForBlock(BigInt(newL2BlockNumber));
|
|
88
93
|
msg += ` with new L2 block ${newL2BlockNumber} for epoch ${epochNumber}`;
|
|
89
94
|
this.l2BlockNumber = newL2BlockNumber;
|
|
90
95
|
this.l2BlockTimestamp = timestamp;
|
|
91
96
|
this.emit('l2-block', {
|
|
92
97
|
l2BlockNumber: newL2BlockNumber,
|
|
93
98
|
l1BlockNumber: newL1BlockNumber,
|
|
99
|
+
l2SlotNumber: Number(l2SlotNumber),
|
|
94
100
|
timestamp
|
|
95
101
|
});
|
|
96
102
|
}
|
|
97
103
|
const newL2ProvenBlockNumber = Number(await this.rollup.getProvenBlockNumber());
|
|
98
104
|
if (this.l2ProvenBlockNumber !== newL2ProvenBlockNumber) {
|
|
99
|
-
const epochNumber = await this.rollup.
|
|
105
|
+
const epochNumber = await this.rollup.getEpochNumberForBlock(BigInt(newL2ProvenBlockNumber));
|
|
100
106
|
msg += ` with proof up to L2 block ${newL2ProvenBlockNumber} for epoch ${epochNumber}`;
|
|
101
107
|
this.l2ProvenBlockNumber = newL2ProvenBlockNumber;
|
|
102
108
|
this.l2ProvenBlockTimestamp = timestamp;
|
|
@@ -116,10 +122,6 @@ import { EventEmitter } from 'events';
|
|
|
116
122
|
l1BlockNumber: newL1BlockNumber
|
|
117
123
|
});
|
|
118
124
|
}
|
|
119
|
-
const [l2SlotNumber, l2Epoch] = await Promise.all([
|
|
120
|
-
this.rollup.getSlotNumber(),
|
|
121
|
-
this.rollup.getCurrentEpoch()
|
|
122
|
-
]);
|
|
123
125
|
let committee;
|
|
124
126
|
if (l2Epoch !== this.l2EpochNumber) {
|
|
125
127
|
this.l2EpochNumber = l2Epoch;
|
|
@@ -129,7 +131,14 @@ import { EventEmitter } from 'events';
|
|
|
129
131
|
timestamp,
|
|
130
132
|
committee
|
|
131
133
|
});
|
|
132
|
-
msg += ` starting new epoch ${this.l2EpochNumber}
|
|
134
|
+
msg += ` starting new epoch ${this.l2EpochNumber} `;
|
|
135
|
+
}
|
|
136
|
+
if (l2SlotNumber !== this.l2SlotNumber) {
|
|
137
|
+
this.l2SlotNumber = l2SlotNumber;
|
|
138
|
+
this.emit('l2-slot', {
|
|
139
|
+
l2SlotNumber: Number(l2SlotNumber),
|
|
140
|
+
timestamp
|
|
141
|
+
});
|
|
133
142
|
}
|
|
134
143
|
this.logger.info(msg, {
|
|
135
144
|
currentTimestamp: this.dateProvider.nowInSeconds(),
|
|
@@ -144,4 +153,64 @@ import { EventEmitter } from 'events';
|
|
|
144
153
|
});
|
|
145
154
|
return this;
|
|
146
155
|
}
|
|
156
|
+
waitUntilL2Slot(slot) {
|
|
157
|
+
const targetSlot = typeof slot === 'bigint' ? slot.valueOf() : slot;
|
|
158
|
+
if (this.l2SlotNumber >= targetSlot) {
|
|
159
|
+
return Promise.resolve();
|
|
160
|
+
}
|
|
161
|
+
return new Promise((resolve)=>{
|
|
162
|
+
const listener = (data)=>{
|
|
163
|
+
if (data.l2SlotNumber >= targetSlot) {
|
|
164
|
+
this.off('l2-slot', listener);
|
|
165
|
+
resolve();
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
this.on('l2-slot', listener);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
waitUntilL1Block(block) {
|
|
172
|
+
const targetBlock = typeof block === 'bigint' ? block.valueOf() : block;
|
|
173
|
+
if (this.l1BlockNumber >= targetBlock) {
|
|
174
|
+
return Promise.resolve();
|
|
175
|
+
}
|
|
176
|
+
return new Promise((resolve)=>{
|
|
177
|
+
const listener = (data)=>{
|
|
178
|
+
if (data.l1BlockNumber >= targetBlock) {
|
|
179
|
+
this.off('l1-block', listener);
|
|
180
|
+
resolve();
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
this.on('l1-block', listener);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
waitUntilL1Timestamp(timestamp) {
|
|
187
|
+
const targetTimestamp = typeof timestamp === 'bigint' ? timestamp.valueOf() : timestamp;
|
|
188
|
+
if (this.l1BlockNumber >= targetTimestamp) {
|
|
189
|
+
return Promise.resolve();
|
|
190
|
+
}
|
|
191
|
+
return new Promise((resolve)=>{
|
|
192
|
+
const listener = (data)=>{
|
|
193
|
+
if (data.timestamp >= targetTimestamp) {
|
|
194
|
+
this.off('l1-block', listener);
|
|
195
|
+
resolve();
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
this.on('l1-block', listener);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
waitUntilL2Block(l2BlockNumber) {
|
|
202
|
+
const targetBlock = typeof l2BlockNumber === 'bigint' ? l2BlockNumber.valueOf() : l2BlockNumber;
|
|
203
|
+
if (this.l2BlockNumber >= targetBlock) {
|
|
204
|
+
return Promise.resolve();
|
|
205
|
+
}
|
|
206
|
+
return new Promise((resolve)=>{
|
|
207
|
+
const listener = (data)=>{
|
|
208
|
+
if (data.l2BlockNumber >= targetBlock) {
|
|
209
|
+
this.off('l2-block', listener);
|
|
210
|
+
resolve();
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
this.on('l2-block', listener);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
147
216
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Logger } from '@aztec/foundation/log';
|
|
2
2
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
3
|
-
import { type L1TxUtilsConfig } from '../l1_tx_utils.js';
|
|
4
|
-
import { L1TxUtilsWithBlobs } from '../l1_tx_utils_with_blobs.js';
|
|
3
|
+
import { type L1TxUtilsConfig } from '../l1_tx_utils/index.js';
|
|
4
|
+
import { L1TxUtilsWithBlobs } from '../l1_tx_utils/l1_tx_utils_with_blobs.js';
|
|
5
5
|
import type { ExtendedViemWalletClient } from '../types.js';
|
|
6
6
|
import { type Delayer } from './tx_delayer.js';
|
|
7
7
|
export declare class DelayedTxUtils extends L1TxUtilsWithBlobs {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delayed_tx_utils.d.ts","sourceRoot":"","sources":["../../src/test/delayed_tx_utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,
|
|
1
|
+
{"version":3,"file":"delayed_tx_utils.d.ts","sourceRoot":"","sources":["../../src/test/delayed_tx_utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,KAAK,OAAO,EAAe,MAAM,iBAAiB,CAAC;AAE5D,qBAAa,cAAe,SAAQ,kBAAkB;IAC7C,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;WAEtB,aAAa,CACzB,SAAS,EAAE,kBAAkB,EAC7B,oBAAoB,EAAE,MAAM,EAC5B,MAAM,EAAE,wBAAwB;IAW3B,aAAa,CAAC,oBAAoB,EAAE,MAAM;CAOlD;AAED,wBAAgB,oCAAoC,CAClD,MAAM,EAAE,wBAAwB,EAChC,MAAM,GAAE,MAAkC,EAC1C,YAAY,GAAE,YAAiC,EAC/C,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACjC,gBAAgB,GAAE,OAAe,kBAWlC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
4
|
-
import { createViemSigner } from '../l1_tx_utils.js';
|
|
5
|
-
import { L1TxUtilsWithBlobs } from '../l1_tx_utils_with_blobs.js';
|
|
4
|
+
import { createViemSigner } from '../l1_tx_utils/index.js';
|
|
5
|
+
import { L1TxUtilsWithBlobs } from '../l1_tx_utils/l1_tx_utils_with_blobs.js';
|
|
6
6
|
import { withDelayer } from './tx_delayer.js';
|
|
7
7
|
export class DelayedTxUtils extends L1TxUtilsWithBlobs {
|
|
8
8
|
delayer;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
-
import type { TestDateProvider } from '@aztec/foundation/timer';
|
|
3
|
-
import { type Hex } from 'viem';
|
|
2
|
+
import type { DateProvider, TestDateProvider } from '@aztec/foundation/timer';
|
|
3
|
+
import { type Hex, type Transaction } from 'viem';
|
|
4
4
|
import type { ViemPublicClient } from '../types.js';
|
|
5
5
|
/**
|
|
6
6
|
* A class that provides utility functions for interacting with ethereum (L1).
|
|
@@ -10,6 +10,10 @@ export declare class EthCheatCodes {
|
|
|
10
10
|
* The RPC URL to use for interacting with the chain
|
|
11
11
|
*/
|
|
12
12
|
rpcUrls: string[];
|
|
13
|
+
/**
|
|
14
|
+
* The date provider to use for time operations
|
|
15
|
+
*/
|
|
16
|
+
dateProvider: DateProvider | TestDateProvider;
|
|
13
17
|
/**
|
|
14
18
|
* The logger to use for the eth cheatcodes
|
|
15
19
|
*/
|
|
@@ -20,11 +24,16 @@ export declare class EthCheatCodes {
|
|
|
20
24
|
* The RPC URL to use for interacting with the chain
|
|
21
25
|
*/
|
|
22
26
|
rpcUrls: string[],
|
|
27
|
+
/**
|
|
28
|
+
* The date provider to use for time operations
|
|
29
|
+
*/
|
|
30
|
+
dateProvider: DateProvider | TestDateProvider,
|
|
23
31
|
/**
|
|
24
32
|
* The logger to use for the eth cheatcodes
|
|
25
33
|
*/
|
|
26
34
|
logger?: import("@aztec/foundation/log").Logger);
|
|
27
35
|
rpcCall(method: string, params: any[]): Promise<any>;
|
|
36
|
+
private doRpcCall;
|
|
28
37
|
/**
|
|
29
38
|
* Get the auto mine status of the underlying chain
|
|
30
39
|
* @returns True if automine is on, false otherwise
|
|
@@ -104,13 +113,12 @@ export declare class EthCheatCodes {
|
|
|
104
113
|
/**
|
|
105
114
|
* Set the next block timestamp and mines the block.
|
|
106
115
|
* Optionally resets interval mining so the next block is mined in `blockInterval` seconds from now.
|
|
107
|
-
*
|
|
116
|
+
* Always updates the injected date provider to follow L1 time.
|
|
108
117
|
* @param timestamp - The timestamp to set the next block to
|
|
109
118
|
*/
|
|
110
119
|
warp(timestamp: number | bigint, opts?: {
|
|
111
120
|
silent?: boolean;
|
|
112
121
|
resetBlockInterval?: boolean;
|
|
113
|
-
updateDateProvider?: TestDateProvider;
|
|
114
122
|
}): Promise<void>;
|
|
115
123
|
/**
|
|
116
124
|
* Load the value at a storage slot of a contract address on eth
|
|
@@ -125,7 +133,9 @@ export declare class EthCheatCodes {
|
|
|
125
133
|
* @param slot - The storage slot
|
|
126
134
|
* @param value - The value to set the storage slot to
|
|
127
135
|
*/
|
|
128
|
-
store(contract: EthAddress, slot: bigint, value: bigint
|
|
136
|
+
store(contract: EthAddress, slot: bigint, value: bigint, opts?: {
|
|
137
|
+
silent?: boolean;
|
|
138
|
+
}): Promise<void>;
|
|
129
139
|
/**
|
|
130
140
|
* Computes the slot value for a given map and key.
|
|
131
141
|
* @param baseSlot - The base slot of the map (specified in Aztec.nr contract)
|
|
@@ -190,6 +200,22 @@ export declare class EthCheatCodes {
|
|
|
190
200
|
value?: number | bigint;
|
|
191
201
|
})[][]): Promise<void>;
|
|
192
202
|
traceTransaction(txHash: Hex): Promise<any>;
|
|
193
|
-
|
|
203
|
+
getTxPoolStatus(): Promise<{
|
|
204
|
+
pending: number;
|
|
205
|
+
queued: number;
|
|
206
|
+
}>;
|
|
207
|
+
getTxPoolContents(): Promise<TxPoolTransaction[]>;
|
|
208
|
+
/**
|
|
209
|
+
* Mines an empty block by temporarily removing all pending transactions from the mempool,
|
|
210
|
+
* mining a block, and then re-adding the transactions back to the pool.
|
|
211
|
+
*/
|
|
212
|
+
mineEmptyBlock(blockCount?: number): Promise<void>;
|
|
213
|
+
execWithPausedAnvil<T>(fn: () => Promise<T>): Promise<T>;
|
|
214
|
+
syncDateProvider(): Promise<void>;
|
|
194
215
|
}
|
|
216
|
+
type TxPoolState = 'pending' | 'queued';
|
|
217
|
+
export type TxPoolTransaction = Transaction & {
|
|
218
|
+
poolState: TxPoolState;
|
|
219
|
+
};
|
|
220
|
+
export {};
|
|
195
221
|
//# sourceMappingURL=eth_cheat_codes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eth_cheat_codes.d.ts","sourceRoot":"","sources":["../../src/test/eth_cheat_codes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"eth_cheat_codes.d.ts","sourceRoot":"","sources":["../../src/test/eth_cheat_codes.ts"],"names":[],"mappings":"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"}
|