@aztec/stdlib 4.0.0-nightly.20260112 → 4.0.0-nightly.20260114
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/abi/utils.d.ts +7 -1
- package/dest/abi/utils.d.ts.map +1 -1
- package/dest/abi/utils.js +7 -0
- package/dest/avm/avm.d.ts +300 -300
- package/dest/block/attestation_info.d.ts +5 -5
- package/dest/block/attestation_info.d.ts.map +1 -1
- package/dest/block/attestation_info.js +4 -4
- package/dest/block/body.d.ts +1 -1
- package/dest/block/body.d.ts.map +1 -1
- package/dest/block/body.js +2 -1
- package/dest/block/checkpointed_l2_block.d.ts +1 -1
- package/dest/block/checkpointed_l2_block.d.ts.map +1 -1
- package/dest/block/checkpointed_l2_block.js +5 -4
- package/dest/block/l2_block.d.ts +6 -3
- package/dest/block/l2_block.d.ts.map +1 -1
- package/dest/block/l2_block.js +3 -3
- package/dest/block/l2_block_code_to_purge.d.ts +1 -1
- package/dest/block/l2_block_code_to_purge.d.ts.map +1 -1
- package/dest/block/l2_block_code_to_purge.js +1 -1
- package/dest/block/l2_block_header.d.ts +6 -2
- package/dest/block/l2_block_header.d.ts.map +1 -1
- package/dest/block/l2_block_header.js +14 -7
- package/dest/block/l2_block_new.d.ts +1 -2
- package/dest/block/l2_block_new.d.ts.map +1 -1
- package/dest/block/l2_block_new.js +4 -1
- package/dest/block/l2_block_source.d.ts +247 -42
- package/dest/block/l2_block_source.d.ts.map +1 -1
- package/dest/block/l2_block_source.js +23 -5
- package/dest/block/l2_block_stream/index.d.ts +2 -1
- package/dest/block/l2_block_stream/index.d.ts.map +1 -1
- package/dest/block/l2_block_stream/index.js +1 -0
- package/dest/block/l2_block_stream/interfaces.d.ts +16 -5
- package/dest/block/l2_block_stream/interfaces.d.ts.map +1 -1
- package/dest/block/l2_block_stream/l2_block_stream.d.ts +4 -2
- package/dest/block/l2_block_stream/l2_block_stream.d.ts.map +1 -1
- package/dest/block/l2_block_stream/l2_block_stream.js +102 -30
- package/dest/block/l2_block_stream/l2_tips_memory_store.d.ts +24 -16
- package/dest/block/l2_block_stream/l2_tips_memory_store.d.ts.map +1 -1
- package/dest/block/l2_block_stream/l2_tips_memory_store.js +55 -61
- package/dest/block/l2_block_stream/l2_tips_store_base.d.ts +49 -0
- package/dest/block/l2_block_stream/l2_tips_store_base.d.ts.map +1 -0
- package/dest/block/l2_block_stream/l2_tips_store_base.js +179 -0
- package/dest/block/test/l2_tips_store_test_suite.d.ts +1 -1
- package/dest/block/test/l2_tips_store_test_suite.d.ts.map +1 -1
- package/dest/block/test/l2_tips_store_test_suite.js +483 -38
- package/dest/block/validate_block_result.d.ts +24 -24
- package/dest/block/validate_block_result.d.ts.map +1 -1
- package/dest/block/validate_block_result.js +18 -17
- package/dest/checkpoint/checkpoint.d.ts +2 -1
- package/dest/checkpoint/checkpoint.d.ts.map +1 -1
- package/dest/checkpoint/checkpoint.js +11 -1
- package/dest/checkpoint/checkpoint_info.d.ts +32 -3
- package/dest/checkpoint/checkpoint_info.d.ts.map +1 -1
- package/dest/checkpoint/checkpoint_info.js +34 -1
- package/dest/checkpoint/index.d.ts +2 -1
- package/dest/checkpoint/index.d.ts.map +1 -1
- package/dest/checkpoint/index.js +1 -0
- package/dest/checkpoint/published_checkpoint.d.ts +1 -1
- package/dest/checkpoint/published_checkpoint.d.ts.map +1 -1
- package/dest/checkpoint/published_checkpoint.js +4 -3
- package/dest/contract/index.d.ts +1 -3
- package/dest/contract/index.d.ts.map +1 -1
- package/dest/contract/index.js +0 -2
- package/dest/deserialization/index.d.ts +11 -0
- package/dest/deserialization/index.d.ts.map +1 -0
- package/dest/deserialization/index.js +10 -0
- package/dest/interfaces/api_limit.d.ts +2 -1
- package/dest/interfaces/api_limit.d.ts.map +1 -1
- package/dest/interfaces/api_limit.js +1 -0
- package/dest/interfaces/archiver.d.ts +6 -6
- package/dest/interfaces/archiver.d.ts.map +1 -1
- package/dest/interfaces/archiver.js +6 -4
- package/dest/interfaces/aztec-node-admin.d.ts +12 -9
- package/dest/interfaces/aztec-node-admin.d.ts.map +1 -1
- package/dest/interfaces/aztec-node-admin.js +2 -2
- package/dest/interfaces/aztec-node.d.ts +2 -2
- package/dest/interfaces/aztec-node.d.ts.map +1 -1
- package/dest/interfaces/aztec-node.js +8 -3
- package/dest/interfaces/block-builder.d.ts +2 -2
- package/dest/interfaces/block-builder.d.ts.map +1 -1
- package/dest/interfaces/configs.d.ts +6 -1
- package/dest/interfaces/configs.d.ts.map +1 -1
- package/dest/interfaces/configs.js +2 -1
- package/dest/interfaces/p2p.d.ts +7 -9
- package/dest/interfaces/p2p.d.ts.map +1 -1
- package/dest/interfaces/p2p.js +3 -4
- package/dest/interfaces/validator.d.ts +41 -15
- package/dest/interfaces/validator.d.ts.map +1 -1
- package/dest/interfaces/validator.js +3 -2
- package/dest/kernel/hints/build_note_hash_read_request_hints.d.ts +6 -5
- package/dest/kernel/hints/build_note_hash_read_request_hints.d.ts.map +1 -1
- package/dest/kernel/hints/build_note_hash_read_request_hints.js +5 -6
- package/dest/messaging/l2_to_l1_membership.d.ts +1 -1
- package/dest/messaging/l2_to_l1_membership.d.ts.map +1 -1
- package/dest/messaging/l2_to_l1_membership.js +5 -3
- package/dest/messaging/out_hash.d.ts +41 -4
- package/dest/messaging/out_hash.d.ts.map +1 -1
- package/dest/messaging/out_hash.js +52 -26
- package/dest/note/note_dao.d.ts +8 -5
- package/dest/note/note_dao.d.ts.map +1 -1
- package/dest/note/note_dao.js +15 -12
- package/dest/p2p/attestation_utils.d.ts +3 -3
- package/dest/p2p/attestation_utils.d.ts.map +1 -1
- package/dest/p2p/attestation_utils.js +1 -1
- package/dest/p2p/block_proposal.d.ts +85 -21
- package/dest/p2p/block_proposal.d.ts.map +1 -1
- package/dest/p2p/block_proposal.js +126 -38
- package/dest/p2p/checkpoint_attestation.d.ts +78 -0
- package/dest/p2p/checkpoint_attestation.d.ts.map +1 -0
- package/dest/p2p/{block_attestation.js → checkpoint_attestation.js} +22 -19
- package/dest/p2p/checkpoint_proposal.d.ts +155 -0
- package/dest/p2p/checkpoint_proposal.d.ts.map +1 -0
- package/dest/p2p/checkpoint_proposal.js +222 -0
- package/dest/p2p/consensus_payload.d.ts +5 -2
- package/dest/p2p/consensus_payload.d.ts.map +1 -1
- package/dest/p2p/consensus_payload.js +3 -2
- package/dest/p2p/index.d.ts +4 -2
- package/dest/p2p/index.d.ts.map +1 -1
- package/dest/p2p/index.js +3 -1
- package/dest/p2p/signature_utils.d.ts +5 -3
- package/dest/p2p/signature_utils.d.ts.map +1 -1
- package/dest/p2p/signature_utils.js +3 -1
- package/dest/p2p/signed_txs.d.ts +40 -0
- package/dest/p2p/signed_txs.d.ts.map +1 -0
- package/dest/p2p/signed_txs.js +75 -0
- package/dest/p2p/topic_type.d.ts +3 -2
- package/dest/p2p/topic_type.d.ts.map +1 -1
- package/dest/p2p/topic_type.js +8 -2
- package/dest/rollup/block_headers_hash.js +1 -1
- package/dest/rollup/block_rollup_public_inputs.d.ts +2 -2
- package/dest/rollup/block_rollup_public_inputs.js +2 -2
- package/dest/rollup/checkpoint_header.d.ts +16 -2
- package/dest/rollup/checkpoint_header.d.ts.map +1 -1
- package/dest/rollup/checkpoint_header.js +25 -5
- package/dest/rollup/checkpoint_rollup_public_inputs.d.ts +11 -6
- package/dest/rollup/checkpoint_rollup_public_inputs.d.ts.map +1 -1
- package/dest/rollup/checkpoint_rollup_public_inputs.js +10 -6
- package/dest/rollup/checkpoint_root_rollup_private_inputs.d.ts +14 -3
- package/dest/rollup/checkpoint_root_rollup_private_inputs.d.ts.map +1 -1
- package/dest/rollup/checkpoint_root_rollup_private_inputs.js +13 -2
- package/dest/rollup/root_rollup_public_inputs.d.ts +5 -2
- package/dest/rollup/root_rollup_public_inputs.d.ts.map +1 -1
- package/dest/rollup/root_rollup_public_inputs.js +4 -1
- package/dest/tests/factories.d.ts +13 -1
- package/dest/tests/factories.d.ts.map +1 -1
- package/dest/tests/factories.js +53 -3
- package/dest/tests/mocks.d.ts +55 -9
- package/dest/tests/mocks.d.ts.map +1 -1
- package/dest/tests/mocks.js +84 -35
- package/dest/tx/private_execution_result.d.ts +1 -5
- package/dest/tx/private_execution_result.d.ts.map +1 -1
- package/dest/tx/private_execution_result.js +3 -20
- package/dest/tx/tx_effect.d.ts +1 -6
- package/dest/tx/tx_effect.d.ts.map +1 -1
- package/dest/tx/tx_effect.js +0 -7
- package/package.json +9 -8
- package/src/abi/utils.ts +17 -0
- package/src/block/attestation_info.ts +9 -6
- package/src/block/body.ts +2 -1
- package/src/block/checkpointed_l2_block.ts +5 -4
- package/src/block/l2_block.ts +4 -3
- package/src/block/l2_block_code_to_purge.ts +1 -0
- package/src/block/l2_block_header.ts +13 -0
- package/src/block/l2_block_new.ts +5 -1
- package/src/block/l2_block_source.ts +69 -17
- package/src/block/l2_block_stream/index.ts +1 -0
- package/src/block/l2_block_stream/interfaces.ts +16 -4
- package/src/block/l2_block_stream/l2_block_stream.ts +121 -38
- package/src/block/l2_block_stream/l2_tips_memory_store.ts +62 -56
- package/src/block/l2_block_stream/l2_tips_store_base.ts +226 -0
- package/src/block/test/l2_tips_store_test_suite.ts +485 -36
- package/src/block/validate_block_result.ts +40 -35
- package/src/checkpoint/checkpoint.ts +12 -1
- package/src/checkpoint/checkpoint_info.ts +45 -2
- package/src/checkpoint/index.ts +1 -0
- package/src/checkpoint/published_checkpoint.ts +4 -3
- package/src/contract/index.ts +0 -2
- package/src/deserialization/index.ts +21 -0
- package/src/interfaces/api_limit.ts +1 -0
- package/src/interfaces/archiver.ts +14 -6
- package/src/interfaces/aztec-node-admin.ts +5 -2
- package/src/interfaces/aztec-node.ts +30 -3
- package/src/interfaces/block-builder.ts +1 -0
- package/src/interfaces/configs.ts +5 -0
- package/src/interfaces/p2p.ts +8 -12
- package/src/interfaces/validator.ts +57 -11
- package/src/kernel/hints/build_note_hash_read_request_hints.ts +5 -8
- package/src/messaging/l2_to_l1_membership.ts +5 -3
- package/src/messaging/out_hash.ts +60 -29
- package/src/note/note_dao.ts +18 -13
- package/src/p2p/attestation_utils.ts +3 -3
- package/src/p2p/block_proposal.ts +191 -42
- package/src/p2p/{block_attestation.ts → checkpoint_attestation.ts} +31 -25
- package/src/p2p/checkpoint_proposal.ts +342 -0
- package/src/p2p/consensus_payload.ts +5 -2
- package/src/p2p/index.ts +3 -1
- package/src/p2p/signature_utils.ts +3 -1
- package/src/p2p/signed_txs.ts +88 -0
- package/src/p2p/topic_type.ts +3 -2
- package/src/rollup/block_headers_hash.ts +1 -1
- package/src/rollup/block_rollup_public_inputs.ts +2 -2
- package/src/rollup/checkpoint_header.ts +33 -0
- package/src/rollup/checkpoint_rollup_public_inputs.ts +12 -6
- package/src/rollup/checkpoint_root_rollup_private_inputs.ts +14 -1
- package/src/rollup/root_rollup_public_inputs.ts +4 -1
- package/src/tests/factories.ts +46 -2
- package/src/tests/mocks.ts +146 -50
- package/src/tx/private_execution_result.ts +0 -15
- package/src/tx/tx_effect.ts +0 -9
- package/dest/contract/contract_class_metadata.d.ts +0 -8
- package/dest/contract/contract_class_metadata.d.ts.map +0 -1
- package/dest/contract/contract_class_metadata.js +0 -1
- package/dest/contract/contract_metadata.d.ts +0 -7
- package/dest/contract/contract_metadata.d.ts.map +0 -1
- package/dest/contract/contract_metadata.js +0 -1
- package/dest/p2p/block_attestation.d.ts +0 -77
- package/dest/p2p/block_attestation.d.ts.map +0 -1
- package/src/contract/contract_class_metadata.ts +0 -8
- package/src/contract/contract_metadata.ts +0 -7
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
1
|
+
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { AbortError } from '@aztec/foundation/error';
|
|
3
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { RunningPromise } from '@aztec/foundation/running-promise';
|
|
@@ -50,39 +50,39 @@ import { makeL2BlockId } from '../l2_block_source.js';
|
|
|
50
50
|
const sourceTips = await this.l2BlockSource.getL2Tips();
|
|
51
51
|
const localTips = await this.localData.getL2Tips();
|
|
52
52
|
this.log.trace(`Running L2 block stream`, {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
sourceFinalized: sourceTips.finalized.number,
|
|
56
|
-
localFinalized: localTips.finalized.number,
|
|
57
|
-
sourceProven: sourceTips.proven.number,
|
|
58
|
-
localProven: localTips.proven.number,
|
|
59
|
-
sourceLatestHash: sourceTips.latest.hash,
|
|
60
|
-
localLatestHash: localTips.latest.hash,
|
|
61
|
-
sourceProvenHash: sourceTips.proven.hash,
|
|
62
|
-
localProvenHash: localTips.proven.hash,
|
|
63
|
-
sourceFinalizedHash: sourceTips.finalized.hash,
|
|
64
|
-
localFinalizedHash: localTips.finalized.hash
|
|
53
|
+
sourceTips,
|
|
54
|
+
localTips
|
|
65
55
|
});
|
|
66
56
|
// Check if there was a reorg and emit a chain-pruned event if so.
|
|
67
|
-
let latestBlockNumber = localTips.
|
|
57
|
+
let latestBlockNumber = localTips.proposed.number;
|
|
68
58
|
const sourceCache = new BlockHashCache([
|
|
69
|
-
sourceTips.
|
|
59
|
+
sourceTips.proposed
|
|
70
60
|
]);
|
|
71
61
|
while(!await this.areBlockHashesEqualAt(latestBlockNumber, {
|
|
72
62
|
sourceCache
|
|
73
63
|
})){
|
|
74
64
|
latestBlockNumber--;
|
|
75
65
|
}
|
|
76
|
-
if (latestBlockNumber < localTips.
|
|
77
|
-
latestBlockNumber = BlockNumber(Math.min(latestBlockNumber, sourceTips.
|
|
66
|
+
if (latestBlockNumber < localTips.proposed.number) {
|
|
67
|
+
latestBlockNumber = BlockNumber(Math.min(latestBlockNumber, sourceTips.proposed.number)); // see #13471
|
|
78
68
|
const hash = sourceCache.get(latestBlockNumber) ?? await this.getBlockHashFromSource(latestBlockNumber);
|
|
79
69
|
if (latestBlockNumber !== 0 && !hash) {
|
|
80
70
|
throw new Error(`Block hash not found in block source for block number ${latestBlockNumber}`);
|
|
81
71
|
}
|
|
82
|
-
this.log.verbose(`Reorg detected. Pruning blocks from ${latestBlockNumber + 1} to ${localTips.
|
|
72
|
+
this.log.verbose(`Reorg detected. Pruning blocks from ${latestBlockNumber + 1} to ${localTips.proposed.number}.`);
|
|
73
|
+
// This check is not 100% accurate
|
|
74
|
+
// If the local tips are sufficiently behind the source tips, such that we are missing at least one checkpoint
|
|
75
|
+
// that has now been re-orged due to a proof failure then this will indicate a failure to checkpoint rather than a failure to prove
|
|
76
|
+
// TODO: (mbps/PhilWindle): Improve re-org detection accuracy when we come to do re-orgs
|
|
77
|
+
let reason = 'unproven';
|
|
78
|
+
if (latestBlockNumber === localTips.checkpointed.block.number && !this.opts.ignoreCheckpoints) {
|
|
79
|
+
reason = 'uncheckpointed';
|
|
80
|
+
}
|
|
83
81
|
await this.emitEvent({
|
|
84
82
|
type: 'chain-pruned',
|
|
85
|
-
block: makeL2BlockId(latestBlockNumber, hash)
|
|
83
|
+
block: makeL2BlockId(latestBlockNumber, hash),
|
|
84
|
+
reason,
|
|
85
|
+
checkpoint: sourceTips.checkpointed.checkpoint
|
|
86
86
|
});
|
|
87
87
|
}
|
|
88
88
|
// If we are just starting, use the starting block number from the options.
|
|
@@ -95,19 +95,91 @@ import { makeL2BlockId } from '../l2_block_source.js';
|
|
|
95
95
|
this.hasStarted = true;
|
|
96
96
|
}
|
|
97
97
|
let nextBlockNumber = latestBlockNumber + 1;
|
|
98
|
+
let nextCheckpointToEmit = CheckpointNumber(localTips.checkpointed.checkpoint.number + 1);
|
|
98
99
|
if (this.opts.skipFinalized) {
|
|
99
100
|
// When skipping finalized blocks we need to provide reliable reorg detection while fetching as few blocks as
|
|
100
101
|
// possible. Finalized blocks cannot be reorged by definition, so we can skip most of them. We do need the very
|
|
101
102
|
// last finalized block however in order to guarantee that we will eventually find a block in which our local
|
|
102
103
|
// store matches the source.
|
|
103
104
|
// If the last finalized block is behind our local tip, there is nothing to skip.
|
|
104
|
-
nextBlockNumber = Math.max(sourceTips.finalized.number, nextBlockNumber);
|
|
105
|
+
nextBlockNumber = Math.max(sourceTips.finalized.block.number, nextBlockNumber);
|
|
106
|
+
// If the next checkpoint to emit is behind the finalized tip then skip forward
|
|
107
|
+
nextCheckpointToEmit = CheckpointNumber(Math.max(nextCheckpointToEmit, sourceTips.finalized.checkpoint.number));
|
|
108
|
+
}
|
|
109
|
+
// Loop 1: Emit checkpoint events for checkpoints whose blocks are already in local storage.
|
|
110
|
+
// This handles the case where blocks were synced as uncheckpointed and later became checkpointed.
|
|
111
|
+
// The guard `lastBlockInCheckpoint.number > localTips.proposed.number` ensures we don't emit
|
|
112
|
+
// checkpoints for blocks we don't have (e.g., when startingBlock skips earlier blocks).
|
|
113
|
+
// Since only one checkpoint can ever be uncheckpointed, this loop should iterate at most once.
|
|
114
|
+
if (!this.opts.ignoreCheckpoints) {
|
|
115
|
+
let loop1Iterations = 0;
|
|
116
|
+
while(nextCheckpointToEmit <= sourceTips.checkpointed.checkpoint.number){
|
|
117
|
+
const checkpoints = await this.l2BlockSource.getPublishedCheckpoints(nextCheckpointToEmit, 1);
|
|
118
|
+
if (checkpoints.length === 0) {
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
const lastBlockInCheckpoint = checkpoints[0].checkpoint.blocks.at(-1);
|
|
122
|
+
// If this checkpoint has blocks we haven't seen yet, stop - they need to be fetched first
|
|
123
|
+
if (lastBlockInCheckpoint.number > localTips.proposed.number) {
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
loop1Iterations++;
|
|
127
|
+
if (loop1Iterations > 1) {
|
|
128
|
+
this.log.warn(`Emitting multiple checkpoints (${loop1Iterations}) for already-local blocks. ` + `Next checkpoint: ${nextCheckpointToEmit}, source checkpointed: ${sourceTips.checkpointed.checkpoint.number}`);
|
|
129
|
+
}
|
|
130
|
+
const lastBlockHash = await lastBlockInCheckpoint.hash();
|
|
131
|
+
await this.emitEvent({
|
|
132
|
+
type: 'chain-checkpointed',
|
|
133
|
+
checkpoint: checkpoints[0],
|
|
134
|
+
block: makeL2BlockId(lastBlockInCheckpoint.number, lastBlockHash.toString())
|
|
135
|
+
});
|
|
136
|
+
nextCheckpointToEmit = CheckpointNumber(nextCheckpointToEmit + 1);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Loop 2: Fetch new checkpointed blocks. For each block, get its checkpoint, emit all blocks
|
|
140
|
+
// from that checkpoint that we need, then emit the checkpoint event.
|
|
141
|
+
// We cache the current checkpoint to avoid redundant fetches when batchSize < checkpoint size.
|
|
142
|
+
let checkpoint;
|
|
143
|
+
while(nextBlockNumber <= sourceTips.checkpointed.block.number){
|
|
144
|
+
const limit = Math.min(this.opts.batchSize ?? 50, sourceTips.checkpointed.block.number - nextBlockNumber + 1);
|
|
145
|
+
// Check if we need to fetch a new checkpoint (nextBlockNumber is beyond the cached one)
|
|
146
|
+
if (!checkpoint || nextBlockNumber > checkpoint.checkpoint.blocks.at(-1).number) {
|
|
147
|
+
const blocks = await this.l2BlockSource.getCheckpointedBlocks(BlockNumber(nextBlockNumber), 1);
|
|
148
|
+
if (blocks.length === 0) {
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
const checkpoints = await this.l2BlockSource.getPublishedCheckpoints(blocks[0].checkpointNumber, 1);
|
|
152
|
+
if (checkpoints.length === 0) {
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
checkpoint = checkpoints[0];
|
|
156
|
+
}
|
|
157
|
+
// Get all blocks from this checkpoint that we need, respecting batchSize
|
|
158
|
+
const blocksForCheckpoint = checkpoint.checkpoint.blocks.filter((b)=>b.number >= nextBlockNumber).slice(0, limit);
|
|
159
|
+
if (blocksForCheckpoint.length === 0) {
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
await this.emitEvent({
|
|
163
|
+
type: 'blocks-added',
|
|
164
|
+
blocks: blocksForCheckpoint
|
|
165
|
+
});
|
|
166
|
+
nextBlockNumber = blocksForCheckpoint.at(-1).number + 1;
|
|
167
|
+
// If we've reached the end of this checkpoint, emit the checkpoint event
|
|
168
|
+
const lastBlockInCheckpoint = checkpoint.checkpoint.blocks.at(-1);
|
|
169
|
+
if (!this.opts.ignoreCheckpoints && nextBlockNumber > lastBlockInCheckpoint.number) {
|
|
170
|
+
const lastBlockHash = await lastBlockInCheckpoint.hash();
|
|
171
|
+
await this.emitEvent({
|
|
172
|
+
type: 'chain-checkpointed',
|
|
173
|
+
checkpoint,
|
|
174
|
+
block: makeL2BlockId(lastBlockInCheckpoint.number, lastBlockHash.toString())
|
|
175
|
+
});
|
|
176
|
+
}
|
|
105
177
|
}
|
|
106
|
-
//
|
|
107
|
-
while(nextBlockNumber <= sourceTips.
|
|
108
|
-
const limit = Math.min(this.opts.batchSize ?? 50, sourceTips.
|
|
178
|
+
// Loop 3: Fetch any remaining uncheckpointed (proposed) blocks.
|
|
179
|
+
while(nextBlockNumber <= sourceTips.proposed.number){
|
|
180
|
+
const limit = Math.min(this.opts.batchSize ?? 50, sourceTips.proposed.number - nextBlockNumber + 1);
|
|
109
181
|
this.log.trace(`Requesting blocks from ${nextBlockNumber} limit ${limit} proven=${this.opts.proven}`);
|
|
110
|
-
const blocks = await this.l2BlockSource.
|
|
182
|
+
const blocks = await this.l2BlockSource.getL2BlocksNew(BlockNumber(nextBlockNumber), limit, this.opts.proven);
|
|
111
183
|
if (blocks.length === 0) {
|
|
112
184
|
break;
|
|
113
185
|
}
|
|
@@ -115,19 +187,19 @@ import { makeL2BlockId } from '../l2_block_source.js';
|
|
|
115
187
|
type: 'blocks-added',
|
|
116
188
|
blocks
|
|
117
189
|
});
|
|
118
|
-
nextBlockNumber = blocks.at(-1).
|
|
190
|
+
nextBlockNumber = blocks.at(-1).number + 1;
|
|
119
191
|
}
|
|
120
192
|
// Update the proven and finalized tips.
|
|
121
|
-
if (localTips.proven !== undefined && sourceTips.proven.number !== localTips.proven.number) {
|
|
193
|
+
if (localTips.proven !== undefined && sourceTips.proven.block.number !== localTips.proven.block.number) {
|
|
122
194
|
await this.emitEvent({
|
|
123
195
|
type: 'chain-proven',
|
|
124
|
-
block: sourceTips.proven
|
|
196
|
+
block: sourceTips.proven.block
|
|
125
197
|
});
|
|
126
198
|
}
|
|
127
|
-
if (localTips.finalized !== undefined && sourceTips.finalized.number !== localTips.finalized.number) {
|
|
199
|
+
if (localTips.finalized !== undefined && sourceTips.finalized.block.number !== localTips.finalized.block.number) {
|
|
128
200
|
await this.emitEvent({
|
|
129
201
|
type: 'chain-finalized',
|
|
130
|
-
block: sourceTips.finalized
|
|
202
|
+
block: sourceTips.finalized.block
|
|
131
203
|
});
|
|
132
204
|
}
|
|
133
205
|
} catch (err) {
|
|
@@ -172,7 +244,7 @@ import { makeL2BlockId } from '../l2_block_source.js';
|
|
|
172
244
|
return this.l2BlockSource.getBlockHeader(blockNumber).then((h)=>h?.hash()).then((hash)=>hash?.toString());
|
|
173
245
|
}
|
|
174
246
|
async emitEvent(event) {
|
|
175
|
-
this.log.debug(`Emitting ${event.type} (${event.type === 'blocks-added' ? event.blocks.length : event.block.number})`);
|
|
247
|
+
this.log.debug(`Emitting ${event.type} (${event.type === 'blocks-added' ? event.blocks.length : event.type === 'chain-checkpointed' ? event.checkpoint.checkpoint.number : event.block.number})`);
|
|
176
248
|
await this.handler.handleBlockStreamEvent(event);
|
|
177
249
|
if (!this.isRunning() && !this.isSyncing) {
|
|
178
250
|
throw new AbortError();
|
|
@@ -1,19 +1,27 @@
|
|
|
1
|
-
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import
|
|
1
|
+
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { PublishedCheckpoint } from '../../checkpoint/published_checkpoint.js';
|
|
3
|
+
import type { L2BlockTag } from '../l2_block_source.js';
|
|
4
|
+
import { L2TipsStoreBase } from './l2_tips_store_base.js';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
* @dev
|
|
6
|
+
* In-memory implementation of L2 tips store. Useful for testing and lightweight clients.
|
|
7
|
+
* @dev Tests in kv-store/src/stores/l2_tips_memory_store.test.ts
|
|
8
8
|
*/
|
|
9
|
-
export declare class L2TipsMemoryStore
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
protected
|
|
17
|
-
protected
|
|
9
|
+
export declare class L2TipsMemoryStore extends L2TipsStoreBase {
|
|
10
|
+
private readonly tips;
|
|
11
|
+
private readonly blockHashes;
|
|
12
|
+
private readonly blockToCheckpoint;
|
|
13
|
+
private readonly checkpoints;
|
|
14
|
+
protected getTip(tag: L2BlockTag): Promise<BlockNumber | undefined>;
|
|
15
|
+
protected setTip(tag: L2BlockTag, blockNumber: BlockNumber): Promise<void>;
|
|
16
|
+
protected getStoredBlockHash(blockNumber: BlockNumber): Promise<string | undefined>;
|
|
17
|
+
protected setBlockHash(blockNumber: BlockNumber, hash: string): Promise<void>;
|
|
18
|
+
protected deleteBlockHashesBefore(blockNumber: BlockNumber): Promise<void>;
|
|
19
|
+
protected getCheckpointNumberForBlock(blockNumber: BlockNumber): Promise<CheckpointNumber | undefined>;
|
|
20
|
+
protected setCheckpointNumberForBlock(blockNumber: BlockNumber, checkpointNumber: CheckpointNumber): Promise<void>;
|
|
21
|
+
protected deleteBlockToCheckpointBefore(blockNumber: BlockNumber): Promise<void>;
|
|
22
|
+
protected getCheckpoint(checkpointNumber: CheckpointNumber): Promise<PublishedCheckpoint | undefined>;
|
|
23
|
+
protected saveCheckpointData(checkpoint: PublishedCheckpoint): Promise<void>;
|
|
24
|
+
protected deleteCheckpointsBefore(checkpointNumber: CheckpointNumber): Promise<void>;
|
|
25
|
+
protected runInTransaction<T>(fn: () => Promise<T>): Promise<T>;
|
|
18
26
|
}
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfdGlwc19tZW1vcnlfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ibG9jay9sMl9ibG9ja19zdHJlYW0vbDJfdGlwc19tZW1vcnlfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRWhGLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDcEYsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTFEOzs7R0FHRztBQUNILHFCQUFhLGlCQUFrQixTQUFRLGVBQWU7SUFDcEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQXNDO0lBQzNELE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUE2QjtJQUN6RCxPQUFPLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUF1QztJQUN6RSxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBMEM7SUFFdEUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBRWxFO0lBRUQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUd6RTtJQUVELFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBRWxGO0lBRUQsU0FBUyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUc1RTtJQUVELFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FPekU7SUFFRCxTQUFTLENBQUMsMkJBQTJCLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLENBRXJHO0lBRUQsU0FBUyxDQUFDLDJCQUEyQixDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUdqSDtJQUVELFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FPL0U7SUFFRCxTQUFTLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsQ0FFcEc7SUFFRCxTQUFTLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FHM0U7SUFFRCxTQUFTLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQU9uRjtJQUVELFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FHOUQ7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l2_tips_memory_store.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/l2_tips_memory_store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"l2_tips_memory_store.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/l2_tips_memory_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsC;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuC;IACzE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0C;IAEtE,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAElE;IAED,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;IAED,SAAS,CAAC,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAElF;IAED,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E;IAED,SAAS,CAAC,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzE;IAED,SAAS,CAAC,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAErG;IAED,SAAS,CAAC,2BAA2B,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjH;IAED,SAAS,CAAC,6BAA6B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/E;IAED,SAAS,CAAC,aAAa,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAEpG;IAED,SAAS,CAAC,kBAAkB,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E;IAED,SAAS,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnF;IAED,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAG9D;CACF"}
|
|
@@ -1,72 +1,66 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
1
|
+
import { L2TipsStoreBase } from './l2_tips_store_base.js';
|
|
3
2
|
/**
|
|
4
|
-
*
|
|
5
|
-
* @dev
|
|
6
|
-
*/ export class L2TipsMemoryStore {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
* In-memory implementation of L2 tips store. Useful for testing and lightweight clients.
|
|
4
|
+
* @dev Tests in kv-store/src/stores/l2_tips_memory_store.test.ts
|
|
5
|
+
*/ export class L2TipsMemoryStore extends L2TipsStoreBase {
|
|
6
|
+
tips = new Map();
|
|
7
|
+
blockHashes = new Map();
|
|
8
|
+
blockToCheckpoint = new Map();
|
|
9
|
+
checkpoints = new Map();
|
|
10
|
+
getTip(tag) {
|
|
11
|
+
return Promise.resolve(this.tips.get(tag));
|
|
11
12
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
finalized: this.getL2Tip('finalized'),
|
|
16
|
-
proven: this.getL2Tip('proven')
|
|
17
|
-
});
|
|
13
|
+
setTip(tag, blockNumber) {
|
|
14
|
+
this.tips.set(tag, blockNumber);
|
|
15
|
+
return Promise.resolve();
|
|
18
16
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
17
|
+
getStoredBlockHash(blockNumber) {
|
|
18
|
+
return Promise.resolve(this.blockHashes.get(blockNumber));
|
|
19
|
+
}
|
|
20
|
+
setBlockHash(blockNumber, hash) {
|
|
21
|
+
this.blockHashes.set(blockNumber, hash);
|
|
22
|
+
return Promise.resolve();
|
|
23
|
+
}
|
|
24
|
+
deleteBlockHashesBefore(blockNumber) {
|
|
25
|
+
for (const key of this.blockHashes.keys()){
|
|
26
|
+
if (key < blockNumber) {
|
|
27
|
+
this.blockHashes.delete(key);
|
|
28
|
+
}
|
|
30
29
|
}
|
|
31
|
-
return
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
return Promise.resolve();
|
|
31
|
+
}
|
|
32
|
+
getCheckpointNumberForBlock(blockNumber) {
|
|
33
|
+
return Promise.resolve(this.blockToCheckpoint.get(blockNumber));
|
|
35
34
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
break;
|
|
46
|
-
}
|
|
47
|
-
case 'chain-pruned':
|
|
48
|
-
this.saveTag('latest', event.block);
|
|
49
|
-
break;
|
|
50
|
-
case 'chain-proven':
|
|
51
|
-
this.saveTag('proven', event.block);
|
|
52
|
-
break;
|
|
53
|
-
case 'chain-finalized':
|
|
54
|
-
this.saveTag('finalized', event.block);
|
|
55
|
-
for (const key of this.l2BlockHashesStore.keys()){
|
|
56
|
-
if (key < event.block.number) {
|
|
57
|
-
this.l2BlockHashesStore.delete(key);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
break;
|
|
35
|
+
setCheckpointNumberForBlock(blockNumber, checkpointNumber) {
|
|
36
|
+
this.blockToCheckpoint.set(blockNumber, checkpointNumber);
|
|
37
|
+
return Promise.resolve();
|
|
38
|
+
}
|
|
39
|
+
deleteBlockToCheckpointBefore(blockNumber) {
|
|
40
|
+
for (const key of this.blockToCheckpoint.keys()){
|
|
41
|
+
if (key < blockNumber) {
|
|
42
|
+
this.blockToCheckpoint.delete(key);
|
|
43
|
+
}
|
|
61
44
|
}
|
|
45
|
+
return Promise.resolve();
|
|
46
|
+
}
|
|
47
|
+
getCheckpoint(checkpointNumber) {
|
|
48
|
+
return Promise.resolve(this.checkpoints.get(checkpointNumber));
|
|
49
|
+
}
|
|
50
|
+
saveCheckpointData(checkpoint) {
|
|
51
|
+
this.checkpoints.set(checkpoint.checkpoint.number, checkpoint);
|
|
52
|
+
return Promise.resolve();
|
|
62
53
|
}
|
|
63
|
-
|
|
64
|
-
this.
|
|
65
|
-
|
|
66
|
-
|
|
54
|
+
deleteCheckpointsBefore(checkpointNumber) {
|
|
55
|
+
for (const key of this.checkpoints.keys()){
|
|
56
|
+
if (key < checkpointNumber) {
|
|
57
|
+
this.checkpoints.delete(key);
|
|
58
|
+
}
|
|
67
59
|
}
|
|
60
|
+
return Promise.resolve();
|
|
68
61
|
}
|
|
69
|
-
|
|
70
|
-
|
|
62
|
+
runInTransaction(fn) {
|
|
63
|
+
// Memory store doesn't need transactions - just execute immediately
|
|
64
|
+
return fn();
|
|
71
65
|
}
|
|
72
66
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { PublishedCheckpoint } from '../../checkpoint/published_checkpoint.js';
|
|
3
|
+
import type { L2BlockNew } from '../l2_block_new.js';
|
|
4
|
+
import { type L2BlockTag, type L2Tips } from '../l2_block_source.js';
|
|
5
|
+
import type { L2BlockStreamEvent, L2BlockStreamEventHandler, L2BlockStreamLocalDataProvider } from './interfaces.js';
|
|
6
|
+
/**
|
|
7
|
+
* Abstract base class for L2 tips stores. Provides common event handling logic
|
|
8
|
+
* while delegating storage operations to subclasses.
|
|
9
|
+
*/
|
|
10
|
+
export declare abstract class L2TipsStoreBase implements L2BlockStreamEventHandler, L2BlockStreamLocalDataProvider {
|
|
11
|
+
/** Gets the block number for a given tag. */
|
|
12
|
+
protected abstract getTip(tag: L2BlockTag): Promise<BlockNumber | undefined>;
|
|
13
|
+
/** Sets the block number for a given tag. */
|
|
14
|
+
protected abstract setTip(tag: L2BlockTag, blockNumber: BlockNumber): Promise<void>;
|
|
15
|
+
/** Gets the block hash for a given block number. */
|
|
16
|
+
protected abstract getStoredBlockHash(blockNumber: BlockNumber): Promise<string | undefined>;
|
|
17
|
+
/** Sets the block hash for a given block number. */
|
|
18
|
+
protected abstract setBlockHash(blockNumber: BlockNumber, hash: string): Promise<void>;
|
|
19
|
+
/** Deletes all block hashes for blocks before the given block number. */
|
|
20
|
+
protected abstract deleteBlockHashesBefore(blockNumber: BlockNumber): Promise<void>;
|
|
21
|
+
/** Gets the checkpoint number for a given block number. */
|
|
22
|
+
protected abstract getCheckpointNumberForBlock(blockNumber: BlockNumber): Promise<CheckpointNumber | undefined>;
|
|
23
|
+
/** Sets the checkpoint number for a given block number. */
|
|
24
|
+
protected abstract setCheckpointNumberForBlock(blockNumber: BlockNumber, checkpointNumber: CheckpointNumber): Promise<void>;
|
|
25
|
+
/** Deletes all block-to-checkpoint mappings for blocks before the given block number. */
|
|
26
|
+
protected abstract deleteBlockToCheckpointBefore(blockNumber: BlockNumber): Promise<void>;
|
|
27
|
+
/** Gets a checkpoint by its number. */
|
|
28
|
+
protected abstract getCheckpoint(checkpointNumber: CheckpointNumber): Promise<PublishedCheckpoint | undefined>;
|
|
29
|
+
/** Saves a checkpoint. */
|
|
30
|
+
protected abstract saveCheckpointData(checkpoint: PublishedCheckpoint): Promise<void>;
|
|
31
|
+
/** Deletes all checkpoints before the given checkpoint number. */
|
|
32
|
+
protected abstract deleteCheckpointsBefore(checkpointNumber: CheckpointNumber): Promise<void>;
|
|
33
|
+
/** Runs the given function in a transaction. Memory stores can just execute immediately. */
|
|
34
|
+
protected abstract runInTransaction<T>(fn: () => Promise<T>): Promise<T>;
|
|
35
|
+
getL2BlockHash(number: BlockNumber): Promise<string | undefined>;
|
|
36
|
+
getL2Tips(): Promise<L2Tips>;
|
|
37
|
+
handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void>;
|
|
38
|
+
protected computeBlockHash(block: L2BlockNew): Promise<string>;
|
|
39
|
+
private getBlockId;
|
|
40
|
+
private getCheckpointId;
|
|
41
|
+
private handleBlocksAdded;
|
|
42
|
+
private handleChainCheckpointed;
|
|
43
|
+
private handleChainPruned;
|
|
44
|
+
private handleChainProven;
|
|
45
|
+
private handleChainFinalized;
|
|
46
|
+
private saveTag;
|
|
47
|
+
private saveCheckpoint;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfdGlwc19zdG9yZV9iYXNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmxvY2svbDJfYmxvY2tfc3RyZWFtL2wyX3RpcHNfc3RvcmVfYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFaEYsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNwRixPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBSUwsS0FBSyxVQUFVLEVBQ2YsS0FBSyxNQUFNLEVBQ1osTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSx5QkFBeUIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJIOzs7R0FHRztBQUNILDhCQUFzQixlQUFnQixZQUFXLHlCQUF5QixFQUFFLDhCQUE4QjtJQUd4Ryw2Q0FBNkM7SUFDN0MsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRTdFLDZDQUE2QztJQUM3QyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXBGLG9EQUFvRDtJQUNwRCxTQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQztJQUU3RixvREFBb0Q7SUFDcEQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV2Rix5RUFBeUU7SUFDekUsU0FBUyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwRiwyREFBMkQ7SUFDM0QsU0FBUyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUVoSCwyREFBMkQ7SUFDM0QsU0FBUyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FDNUMsV0FBVyxFQUFFLFdBQVcsRUFDeEIsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVqQix5RkFBeUY7SUFDekYsU0FBUyxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUUxRix1Q0FBdUM7SUFDdkMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRS9HLDBCQUEwQjtJQUMxQixTQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdEYsa0VBQWtFO0lBQ2xFLFNBQVMsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTlGLDRGQUE0RjtJQUM1RixTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBSWxFLGNBQWMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBRXRFO0lBRU0sU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FzQmxDO0lBRVksc0JBQXNCLENBQUMsS0FBSyxFQUFFLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FrQjVFO0lBR0QsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUU3RDtZQUlhLFVBQVU7WUFZVixlQUFlO1lBaUJmLGlCQUFpQjtZQWFqQix1QkFBdUI7WUFVdkIsaUJBQWlCO1lBY2pCLGlCQUFpQjtZQVNqQixvQkFBb0I7WUFpQnBCLE9BQU87WUFPUCxjQUFjO0NBUzdCIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"l2_tips_store_base.d.ts","sourceRoot":"","sources":["../../../src/block/l2_block_stream/l2_tips_store_base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,MAAM,EACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAErH;;;GAGG;AACH,8BAAsB,eAAgB,YAAW,yBAAyB,EAAE,8BAA8B;IAGxG,6CAA6C;IAC7C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAE7E,6CAA6C;IAC7C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpF,oDAAoD;IACpD,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAE7F,oDAAoD;IACpD,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvF,yEAAyE;IACzE,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpF,2DAA2D;IAC3D,SAAS,CAAC,QAAQ,CAAC,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC;IAEhH,2DAA2D;IAC3D,SAAS,CAAC,QAAQ,CAAC,2BAA2B,CAC5C,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,yFAAyF;IACzF,SAAS,CAAC,QAAQ,CAAC,6BAA6B,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1F,uCAAuC;IACvC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IAE/G,0BAA0B;IAC1B,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtF,kEAAkE;IAClE,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9F,4FAA4F;IAC5F,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAIlE,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEtE;IAEM,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAsBlC;IAEY,sBAAsB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB5E;IAGD,SAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;YAIa,UAAU;YAYV,eAAe;YAiBf,iBAAiB;YAajB,uBAAuB;YAUvB,iBAAiB;YAcjB,iBAAiB;YASjB,oBAAoB;YAiBpB,OAAO;YAOP,cAAc;CAS7B"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { GENESIS_BLOCK_HEADER_HASH } from '@aztec/constants';
|
|
2
|
+
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { GENESIS_CHECKPOINT_HEADER_HASH } from '../l2_block_source.js';
|
|
4
|
+
/**
|
|
5
|
+
* Abstract base class for L2 tips stores. Provides common event handling logic
|
|
6
|
+
* while delegating storage operations to subclasses.
|
|
7
|
+
*/ export class L2TipsStoreBase {
|
|
8
|
+
// Public interface implementation
|
|
9
|
+
getL2BlockHash(number) {
|
|
10
|
+
return this.getStoredBlockHash(number);
|
|
11
|
+
}
|
|
12
|
+
getL2Tips() {
|
|
13
|
+
return this.runInTransaction(async ()=>{
|
|
14
|
+
const [proposedBlockId, finalizedBlockId, provenBlockId, checkpointedBlockId] = await Promise.all([
|
|
15
|
+
this.getBlockId('proposed'),
|
|
16
|
+
this.getBlockId('finalized'),
|
|
17
|
+
this.getBlockId('proven'),
|
|
18
|
+
this.getBlockId('checkpointed')
|
|
19
|
+
]);
|
|
20
|
+
const [finalizedCheckpointId, provenCheckpointId, checkpointedCheckpointId] = await Promise.all([
|
|
21
|
+
this.getCheckpointId('finalized'),
|
|
22
|
+
this.getCheckpointId('proven'),
|
|
23
|
+
this.getCheckpointId('checkpointed')
|
|
24
|
+
]);
|
|
25
|
+
return {
|
|
26
|
+
proposed: proposedBlockId,
|
|
27
|
+
finalized: {
|
|
28
|
+
block: finalizedBlockId,
|
|
29
|
+
checkpoint: finalizedCheckpointId
|
|
30
|
+
},
|
|
31
|
+
proven: {
|
|
32
|
+
block: provenBlockId,
|
|
33
|
+
checkpoint: provenCheckpointId
|
|
34
|
+
},
|
|
35
|
+
checkpointed: {
|
|
36
|
+
block: checkpointedBlockId,
|
|
37
|
+
checkpoint: checkpointedCheckpointId
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async handleBlockStreamEvent(event) {
|
|
43
|
+
switch(event.type){
|
|
44
|
+
case 'blocks-added':
|
|
45
|
+
await this.handleBlocksAdded(event);
|
|
46
|
+
break;
|
|
47
|
+
case 'chain-checkpointed':
|
|
48
|
+
await this.handleChainCheckpointed(event);
|
|
49
|
+
break;
|
|
50
|
+
case 'chain-pruned':
|
|
51
|
+
await this.handleChainPruned(event);
|
|
52
|
+
break;
|
|
53
|
+
case 'chain-proven':
|
|
54
|
+
await this.handleChainProven(event);
|
|
55
|
+
break;
|
|
56
|
+
case 'chain-finalized':
|
|
57
|
+
await this.handleChainFinalized(event);
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Protected helper that subclasses can override for block hash computation
|
|
62
|
+
computeBlockHash(block) {
|
|
63
|
+
return block.hash().then((hash)=>hash.toString());
|
|
64
|
+
}
|
|
65
|
+
// Private implementation
|
|
66
|
+
async getBlockId(tag) {
|
|
67
|
+
const blockNumber = await this.getTip(tag);
|
|
68
|
+
if (blockNumber === undefined || blockNumber === 0) {
|
|
69
|
+
return {
|
|
70
|
+
number: BlockNumber.ZERO,
|
|
71
|
+
hash: GENESIS_BLOCK_HEADER_HASH.toString()
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const blockHash = await this.getStoredBlockHash(blockNumber);
|
|
75
|
+
if (!blockHash) {
|
|
76
|
+
throw new Error(`Block hash not found for block number ${blockNumber}`);
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
number: blockNumber,
|
|
80
|
+
hash: blockHash
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async getCheckpointId(tag) {
|
|
84
|
+
const blockNumber = await this.getTip(tag);
|
|
85
|
+
if (blockNumber === undefined || blockNumber === 0) {
|
|
86
|
+
return {
|
|
87
|
+
number: CheckpointNumber.ZERO,
|
|
88
|
+
hash: GENESIS_CHECKPOINT_HEADER_HASH.toString()
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const checkpointNumber = await this.getCheckpointNumberForBlock(blockNumber);
|
|
92
|
+
if (checkpointNumber === undefined) {
|
|
93
|
+
// No checkpoint associated with this block yet
|
|
94
|
+
return {
|
|
95
|
+
number: CheckpointNumber.ZERO,
|
|
96
|
+
hash: GENESIS_CHECKPOINT_HEADER_HASH.toString()
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const checkpoint = await this.getCheckpoint(checkpointNumber);
|
|
100
|
+
if (!checkpoint) {
|
|
101
|
+
throw new Error(`Checkpoint not found for checkpoint number ${checkpointNumber}`);
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
number: checkpointNumber,
|
|
105
|
+
hash: checkpoint.checkpoint.hash().toString()
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
async handleBlocksAdded(event) {
|
|
109
|
+
if (event.type !== 'blocks-added') {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
await this.runInTransaction(async ()=>{
|
|
113
|
+
const blocks = event.blocks;
|
|
114
|
+
for (const block of blocks){
|
|
115
|
+
await this.setBlockHash(block.number, await this.computeBlockHash(block));
|
|
116
|
+
}
|
|
117
|
+
await this.setTip('proposed', blocks.at(-1).number);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
async handleChainCheckpointed(event) {
|
|
121
|
+
if (event.type !== 'chain-checkpointed') {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
await this.runInTransaction(async ()=>{
|
|
125
|
+
await this.saveTag('checkpointed', event.block);
|
|
126
|
+
await this.saveCheckpoint(event.checkpoint);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
async handleChainPruned(event) {
|
|
130
|
+
if (event.type !== 'chain-pruned') {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
await this.runInTransaction(async ()=>{
|
|
134
|
+
await this.saveTag('proposed', event.block);
|
|
135
|
+
await this.saveTag('checkpointed', event.block);
|
|
136
|
+
const storeProven = await this.getBlockId('proven');
|
|
137
|
+
if (storeProven.number > event.block.number) {
|
|
138
|
+
await this.saveTag('proven', event.block);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
async handleChainProven(event) {
|
|
143
|
+
if (event.type !== 'chain-proven') {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
await this.runInTransaction(async ()=>{
|
|
147
|
+
await this.saveTag('proven', event.block);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
async handleChainFinalized(event) {
|
|
151
|
+
if (event.type !== 'chain-finalized') {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
await this.runInTransaction(async ()=>{
|
|
155
|
+
await this.saveTag('finalized', event.block);
|
|
156
|
+
const finalizedCheckpointNumber = await this.getCheckpointNumberForBlock(event.block.number);
|
|
157
|
+
await this.deleteBlockHashesBefore(event.block.number);
|
|
158
|
+
await this.deleteBlockToCheckpointBefore(event.block.number);
|
|
159
|
+
if (finalizedCheckpointNumber !== undefined) {
|
|
160
|
+
await this.deleteCheckpointsBefore(finalizedCheckpointNumber);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
async saveTag(name, block) {
|
|
165
|
+
await this.setTip(name, block.number);
|
|
166
|
+
if (block.hash) {
|
|
167
|
+
await this.setBlockHash(block.number, block.hash);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async saveCheckpoint(publishedCheckpoint) {
|
|
171
|
+
const checkpoint = publishedCheckpoint.checkpoint;
|
|
172
|
+
const lastBlock = checkpoint.blocks.at(-1);
|
|
173
|
+
// Only store the mapping for the last block since tips only point to checkpoint boundaries
|
|
174
|
+
await Promise.all([
|
|
175
|
+
this.setCheckpointNumberForBlock(lastBlock.number, checkpoint.number),
|
|
176
|
+
this.saveCheckpointData(publishedCheckpoint)
|
|
177
|
+
]);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { L2TipsStore } from '../l2_block_stream/index.js';
|
|
2
2
|
export declare function testL2TipsStore(makeTipsStore: () => Promise<L2TipsStore>): void;
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDJfdGlwc19zdG9yZV90ZXN0X3N1aXRlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmxvY2svdGVzdC9sMl90aXBzX3N0b3JlX3Rlc3Rfc3VpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFL0Qsd0JBQWdCLGVBQWUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxPQUFPLENBQUMsV0FBVyxDQUFDLFFBNGdCeEUifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l2_tips_store_test_suite.d.ts","sourceRoot":"","sources":["../../../src/block/test/l2_tips_store_test_suite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"l2_tips_store_test_suite.d.ts","sourceRoot":"","sources":["../../../src/block/test/l2_tips_store_test_suite.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,QA4gBxE"}
|