@aztec/world-state 0.56.0 → 0.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +1 -1
  2. package/dest/index.d.ts +1 -0
  3. package/dest/index.d.ts.map +1 -1
  4. package/dest/index.js +2 -1
  5. package/dest/native/merkle_trees_facade.d.ts +34 -0
  6. package/dest/native/merkle_trees_facade.d.ts.map +1 -0
  7. package/dest/native/merkle_trees_facade.js +193 -0
  8. package/dest/native/message.d.ts +78 -19
  9. package/dest/native/message.d.ts.map +1 -1
  10. package/dest/native/message.js +27 -26
  11. package/dest/native/native_world_state.d.ts +39 -38
  12. package/dest/native/native_world_state.d.ts.map +1 -1
  13. package/dest/native/native_world_state.js +108 -254
  14. package/dest/native/native_world_state_instance.d.ts +40 -0
  15. package/dest/native/native_world_state_instance.d.ts.map +1 -0
  16. package/dest/native/native_world_state_instance.js +183 -0
  17. package/dest/synchronizer/config.d.ts +2 -2
  18. package/dest/synchronizer/config.d.ts.map +1 -1
  19. package/dest/synchronizer/config.js +6 -7
  20. package/dest/synchronizer/factory.d.ts +3 -0
  21. package/dest/synchronizer/factory.d.ts.map +1 -1
  22. package/dest/synchronizer/factory.js +13 -4
  23. package/dest/synchronizer/server_world_state_synchronizer.d.ts +41 -41
  24. package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
  25. package/dest/synchronizer/server_world_state_synchronizer.js +128 -163
  26. package/dest/test/utils.d.ts +14 -0
  27. package/dest/test/utils.d.ts.map +1 -0
  28. package/dest/test/utils.js +67 -0
  29. package/dest/world-state-db/index.d.ts +1 -1
  30. package/dest/world-state-db/index.d.ts.map +1 -1
  31. package/dest/world-state-db/merkle_tree_db.d.ts +42 -32
  32. package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
  33. package/dest/world-state-db/merkle_tree_db.js +1 -1
  34. package/dest/world-state-db/merkle_tree_operations_facade.d.ts +8 -37
  35. package/dest/world-state-db/merkle_tree_operations_facade.d.ts.map +1 -1
  36. package/dest/world-state-db/merkle_tree_operations_facade.js +6 -45
  37. package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts +4 -13
  38. package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts.map +1 -1
  39. package/dest/world-state-db/merkle_tree_snapshot_operations_facade.js +2 -29
  40. package/dest/world-state-db/merkle_trees.d.ts +17 -19
  41. package/dest/world-state-db/merkle_trees.d.ts.map +1 -1
  42. package/dest/world-state-db/merkle_trees.js +39 -36
  43. package/package.json +18 -12
  44. package/src/index.ts +1 -0
  45. package/src/native/merkle_trees_facade.ts +279 -0
  46. package/src/native/message.ts +97 -20
  47. package/src/native/native_world_state.ts +125 -346
  48. package/src/native/native_world_state_instance.ts +262 -0
  49. package/src/synchronizer/config.ts +8 -9
  50. package/src/synchronizer/factory.ts +20 -3
  51. package/src/synchronizer/server_world_state_synchronizer.ts +160 -186
  52. package/src/test/utils.ts +123 -0
  53. package/src/world-state-db/index.ts +1 -1
  54. package/src/world-state-db/merkle_tree_db.ts +55 -49
  55. package/src/world-state-db/merkle_tree_operations_facade.ts +10 -55
  56. package/src/world-state-db/merkle_tree_snapshot_operations_facade.ts +7 -46
  57. package/src/world-state-db/merkle_trees.ts +50 -45
@@ -1,44 +1,45 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
- import { type BatchInsertionResult, type HandleL2BlockAndMessagesResult, type IndexedTreeId, type L2Block, type MerkleTreeAdminOperations, MerkleTreeId, type MerkleTreeLeafType, SiblingPath, type TreeInfo } from '@aztec/circuit-types';
3
- import { Fr, Header, NullifierLeafPreimage, StateReference } from '@aztec/circuits.js';
4
- import type { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
5
- import { type MerkleTreeDb, type TreeSnapshots } from '../world-state-db/merkle_tree_db.js';
6
- export interface NativeInstance {
7
- call(msg: Buffer | Uint8Array): Promise<any>;
8
- }
9
- export declare class NativeWorldStateService implements MerkleTreeDb {
10
- private instance;
11
- private nextMessageId;
12
- private encoder;
13
- private decoder;
14
- private queue;
15
- protected constructor(instance: NativeInstance);
16
- static create(dataDir: string, libraryName?: string, className?: string): Promise<NativeWorldStateService>;
2
+ import { type IndexedTreeId, type L2Block, type MerkleTreeReadOperations, type MerkleTreeWriteOperations } from '@aztec/circuit-types';
3
+ import { EthAddress, Fr, Header, type NullifierLeafPreimage } from '@aztec/circuits.js';
4
+ import { type MerkleTreeAdminDatabase as MerkleTreeDatabase } from '../world-state-db/merkle_tree_db.js';
5
+ import { type WorldStateStatus } from './message.js';
6
+ import { NativeWorldState } from './native_world_state_instance.js';
7
+ export declare class NativeWorldStateService implements MerkleTreeDatabase {
8
+ protected readonly instance: NativeWorldState;
9
+ protected readonly log: import("@aztec/foundation/log").Logger;
10
+ private readonly cleanup;
11
+ protected initialHeader: Header | undefined;
12
+ protected constructor(instance: NativeWorldState, log?: import("@aztec/foundation/log").Logger, cleanup?: () => Promise<void>);
13
+ static new(rollupAddress: EthAddress, dataDir: string, log?: import("@aztec/foundation/log").Logger, cleanup?: () => Promise<void>): Promise<NativeWorldStateService>;
14
+ static tmp(rollupAddress?: EthAddress, cleanupTmpDir?: boolean): Promise<NativeWorldStateService>;
17
15
  protected init(): Promise<void>;
18
- asLatest(): MerkleTreeAdminOperations;
16
+ getCommitted(): MerkleTreeReadOperations;
17
+ getSnapshot(blockNumber: number): MerkleTreeReadOperations;
18
+ fork(blockNumber?: number): Promise<MerkleTreeWriteOperations>;
19
19
  getInitialHeader(): Header;
20
- appendLeaves<ID extends MerkleTreeId>(treeId: ID, leaves: MerkleTreeLeafType<ID>[]): Promise<void>;
21
- batchInsert<TreeHeight extends number, SubtreeSiblingPathHeight extends number, ID extends IndexedTreeId>(treeId: ID, rawLeaves: Buffer[], subtreeHeight: number): Promise<BatchInsertionResult<TreeHeight, SubtreeSiblingPathHeight>>;
22
- commit(): Promise<void>;
23
- findLeafIndex(treeId: MerkleTreeId, value: MerkleTreeLeafType<MerkleTreeId>, includeUncommitted: boolean): Promise<bigint | undefined>;
24
- findLeafIndexAfter(treeId: MerkleTreeId, leaf: MerkleTreeLeafType<MerkleTreeId>, startIndex: bigint, includeUncommitted: boolean): Promise<bigint | undefined>;
25
- getLeafPreimage(treeId: IndexedTreeId, leafIndex: bigint, args: boolean): Promise<IndexedTreeLeafPreimage | undefined>;
26
- getLeafValue(treeId: MerkleTreeId, leafIndex: bigint, includeUncommitted: boolean): Promise<MerkleTreeLeafType<MerkleTreeId> | undefined>;
27
- getPreviousValueIndex(treeId: IndexedTreeId, value: bigint, includeUncommitted: boolean): Promise<{
28
- index: bigint;
29
- alreadyPresent: boolean;
30
- } | undefined>;
31
- getSiblingPath(treeId: MerkleTreeId, leafIndex: bigint, includeUncommitted: boolean): Promise<SiblingPath<number>>;
32
- getSnapshot(_block: number): Promise<TreeSnapshots>;
33
- getStateReference(includeUncommitted: boolean): Promise<StateReference>;
34
- getTreeInfo(treeId: MerkleTreeId, includeUncommitted: boolean): Promise<TreeInfo>;
35
- handleL2BlockAndMessages(l2Block: L2Block, l1ToL2Messages: Fr[]): Promise<HandleL2BlockAndMessagesResult>;
36
- rollback(): Promise<void>;
37
- updateArchive(header: Header, _includeUncommitted: boolean): Promise<void>;
20
+ handleL2BlockAndMessages(l2Block: L2Block, l1ToL2Messages: Fr[]): Promise<WorldStateStatus>;
21
+ close(): Promise<void>;
22
+ private buildInitialHeader;
23
+ /**
24
+ * Advances the finalised block number to be the number provided
25
+ * @param toBlockNumber The block number that is now the tip of the finalised chain
26
+ * @returns The new WorldStateStatus
27
+ */
28
+ setFinalised(toBlockNumber: bigint): Promise<WorldStateStatus>;
29
+ /**
30
+ * Removes all historical snapshots up to but not including the given block number
31
+ * @param toBlockNumber The block number of the new oldest historical block
32
+ * @returns The new WorldStateStatus
33
+ */
34
+ removeHistoricalBlocks(toBlockNumber: bigint): Promise<WorldStateStatus>;
35
+ /**
36
+ * Removes all pending blocks down to but not including the given block number
37
+ * @param toBlockNumber The block number of the new tip of the pending chain,
38
+ * @returns The new WorldStateStatus
39
+ */
40
+ unwindBlocks(toBlockNumber: bigint): Promise<WorldStateStatus>;
41
+ getStatus(): Promise<WorldStateStatus>;
38
42
  updateLeaf<ID extends IndexedTreeId>(_treeId: ID, _leaf: NullifierLeafPreimage | Buffer, _index: bigint): Promise<void>;
39
- private call;
40
- stop(): Promise<void>;
41
- delete(): Promise<void>;
42
- fork(): Promise<MerkleTreeDb>;
43
+ private getInitialStateReference;
43
44
  }
44
45
  //# sourceMappingURL=native_world_state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"native_world_state.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"native_world_state.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,OAAO,EAEZ,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAE/B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,UAAU,EACV,EAAE,EACF,MAAM,EAMN,KAAK,qBAAqB,EAI3B,MAAM,oBAAoB,CAAC;AAS5B,OAAO,EAAE,KAAK,uBAAuB,IAAI,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzG,OAAO,EAEL,KAAK,gBAAgB,EAItB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAIpE,qBAAa,uBAAwB,YAAW,kBAAkB;IAI9D,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB;IAC7C,SAAS,CAAC,QAAQ,CAAC,GAAG;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAE5C,SAAS,aACY,QAAQ,EAAE,gBAAgB,EAC1B,GAAG,yCAAkD,EACvD,OAAO,sBAA0B;WAGvC,GAAG,CACd,aAAa,EAAE,UAAU,EACzB,OAAO,EAAE,MAAM,EACf,GAAG,yCAAkD,EACrD,OAAO,sBAA0B,GAChC,OAAO,CAAC,uBAAuB,CAAC;WAmBtB,GAAG,CAAC,aAAa,aAAkB,EAAE,aAAa,UAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC;cAkBzF,IAAI;IAgBb,YAAY,IAAI,wBAAwB;IAIxC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB;IAIpD,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAQpE,gBAAgB,IAAI,MAAM;IAIpB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2C3F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAKrB,kBAAkB;IAKhC;;;;OAIG;IACU,YAAY,CAAC,aAAa,EAAE,MAAM;IAM/C;;;;OAIG;IACU,sBAAsB,CAAC,aAAa,EAAE,MAAM;IAMzD;;;;OAIG;IACU,YAAY,CAAC,aAAa,EAAE,MAAM;IAMlC,SAAS;IAItB,UAAU,CAAC,EAAE,SAAS,aAAa,EACjC,OAAO,EAAE,EAAE,EACX,KAAK,EAAE,qBAAqB,GAAG,MAAM,EACrC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;YAIF,wBAAwB;CAYvC"}
@@ -1,179 +1,80 @@
1
- import { MerkleTreeId, SiblingPath, TxEffect, } from '@aztec/circuit-types';
2
- import { Fr, Header, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NullifierLeaf, NullifierLeafPreimage, PartialStateReference, PublicDataTreeLeaf, PublicDataTreeLeafPreimage, StateReference, } from '@aztec/circuits.js';
1
+ import { MerkleTreeId, TxEffect, } from '@aztec/circuit-types';
2
+ import { EthAddress, Fr, Header, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NullifierLeaf, PartialStateReference, PublicDataTreeLeaf, StateReference, } from '@aztec/circuits.js';
3
3
  import { padArrayEnd } from '@aztec/foundation/collection';
4
- import { SerialQueue } from '@aztec/foundation/queue';
5
- import { serializeToBuffer } from '@aztec/foundation/serialize';
6
- import bindings from 'bindings';
7
- import { Decoder, Encoder, addExtension } from 'msgpackr';
8
- import { isAnyArrayBuffer } from 'util/types';
9
- import { MerkleTreeAdminOperationsFacade } from '../world-state-db/merkle_tree_operations_facade.js';
10
- import { MessageHeader, TypedMessage, WorldStateMessageType, blockStateReference, treeStateReferenceToSnapshot, worldStateRevision, } from './message.js';
11
- // small extension to pack an NodeJS Fr instance to a representation that the C++ code can understand
12
- // this only works for writes. Unpacking from C++ can't create Fr instances because the data is passed
13
- // as raw, untagged, buffers. On the NodeJS side we don't know what the buffer represents
14
- // Adding a tag would be a solution, but it would have to be done on both sides and it's unclear where else
15
- // C++ fr instances are sent/received/stored.
16
- addExtension({
17
- Class: Fr,
18
- write: fr => fr.toBuffer(),
19
- });
4
+ import { createDebugLogger } from '@aztec/foundation/log';
5
+ import assert from 'assert/strict';
6
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'fs/promises';
7
+ import { tmpdir } from 'os';
8
+ import { join } from 'path';
9
+ import { MerkleTreesFacade, MerkleTreesForkFacade, serializeLeaf } from './merkle_trees_facade.js';
10
+ import { WorldStateMessageType, blockStateReference, treeStateReferenceToSnapshot, worldStateRevision, } from './message.js';
11
+ import { NativeWorldState } from './native_world_state_instance.js';
12
+ const ROLLUP_ADDRESS_FILE = 'rollup_address';
20
13
  export class NativeWorldStateService {
21
- constructor(instance) {
14
+ constructor(instance, log = createDebugLogger('aztec:world-state:database'), cleanup = () => Promise.resolve()) {
22
15
  this.instance = instance;
23
- this.nextMessageId = 1;
24
- this.encoder = new Encoder({
25
- // always encode JS objects as MessagePack maps
26
- // this makes it compatible with other MessagePack decoders
27
- useRecords: false,
28
- int64AsType: 'bigint',
29
- });
30
- this.decoder = new Decoder({
31
- useRecords: false,
32
- int64AsType: 'bigint',
33
- });
34
- this.queue = new SerialQueue();
35
- this.queue.start();
36
- }
37
- static async create(dataDir, libraryName = 'world_state_napi', className = 'WorldState') {
38
- const library = bindings(libraryName);
39
- const instance = new library[className](dataDir);
40
- const worldState = new NativeWorldStateService(instance);
16
+ this.log = log;
17
+ this.cleanup = cleanup;
18
+ }
19
+ static async new(rollupAddress, dataDir, log = createDebugLogger('aztec:world-state:database'), cleanup = () => Promise.resolve()) {
20
+ const rollupAddressFile = join(dataDir, ROLLUP_ADDRESS_FILE);
21
+ const currentRollupStr = await readFile(rollupAddressFile, 'utf8').catch(() => undefined);
22
+ const currentRollupAddress = currentRollupStr ? EthAddress.fromString(currentRollupStr.trim()) : undefined;
23
+ if (currentRollupAddress && !rollupAddress.equals(currentRollupAddress)) {
24
+ log.warn('Rollup address changed, deleting database');
25
+ await rm(dataDir, { recursive: true, force: true });
26
+ }
27
+ await mkdir(dataDir, { recursive: true });
28
+ await writeFile(rollupAddressFile, rollupAddress.toString(), 'utf8');
29
+ const instance = new NativeWorldState(dataDir);
30
+ const worldState = new this(instance, log, cleanup);
41
31
  await worldState.init();
42
32
  return worldState;
43
33
  }
44
- async init() {
45
- const archive = await this.getTreeInfo(MerkleTreeId.ARCHIVE, false);
46
- if (archive.size === 0n) {
47
- // TODO (alexg) move this to the native module
48
- // const header = await this.buildInitialHeader(true);
49
- // await this.appendLeaves(MerkleTreeId.ARCHIVE, [header.hash()]);
50
- // await this.commit();
51
- }
52
- }
53
- asLatest() {
54
- return new MerkleTreeAdminOperationsFacade(this, true);
55
- }
56
- // async buildInitialHeader(ic: boolean = false): Promise<Header> {
57
- // const state = await this.getStateReference(ic);
58
- // return new Header(
59
- // AppendOnlyTreeSnapshot.zero(),
60
- // ContentCommitment.empty(),
61
- // state,
62
- // GlobalVariables.empty(),
63
- // Fr.ZERO,
64
- // );
65
- // }
66
- getInitialHeader() {
67
- // TODO (alexg) implement this
68
- return Header.empty();
69
- }
70
- async appendLeaves(treeId, leaves) {
71
- await this.call(WorldStateMessageType.APPEND_LEAVES, {
72
- leaves: leaves.map(leaf => leaf),
73
- treeId,
74
- });
75
- }
76
- async batchInsert(treeId, rawLeaves, subtreeHeight) {
77
- const leaves = rawLeaves.map((leaf) => hydrateLeaf(treeId, leaf)).map(serializeLeaf);
78
- const resp = await this.call(WorldStateMessageType.BATCH_INSERT, { leaves, treeId, subtreeDepth: subtreeHeight });
79
- return {
80
- newSubtreeSiblingPath: new SiblingPath(resp.subtree_path.length, resp.subtree_path),
81
- sortedNewLeaves: resp.sorted_leaves
82
- .map(([leaf]) => leaf)
83
- .map(deserializeLeafValue)
84
- .map(serializeToBuffer),
85
- sortedNewLeavesIndexes: resp.sorted_leaves.map(([, index]) => index),
86
- lowLeavesWitnessData: resp.low_leaf_witness_data.map(data => ({
87
- index: BigInt(data.index),
88
- leafPreimage: deserializeIndexedLeaf(data.leaf),
89
- siblingPath: new SiblingPath(data.path.length, data.path),
90
- })),
34
+ static async tmp(rollupAddress = EthAddress.ZERO, cleanupTmpDir = true) {
35
+ const log = createDebugLogger('aztec:world-state:database');
36
+ const dataDir = await mkdtemp(join(tmpdir(), 'aztec-world-state-'));
37
+ log.debug(`Created temporary world state database: ${dataDir}`);
38
+ // pass a cleanup callback because process.on('beforeExit', cleanup) does not work under Jest
39
+ const cleanup = async () => {
40
+ if (cleanupTmpDir) {
41
+ await rm(dataDir, { recursive: true, force: true });
42
+ log.debug(`Deleted temporary world state database: ${dataDir}`);
43
+ }
44
+ else {
45
+ log.debug(`Leaving temporary world state database: ${dataDir}`);
46
+ }
91
47
  };
48
+ return this.new(rollupAddress, dataDir, log, cleanup);
92
49
  }
93
- async commit() {
94
- await this.call(WorldStateMessageType.COMMIT, void 0);
95
- }
96
- findLeafIndex(treeId, value, includeUncommitted) {
97
- return this.findLeafIndexAfter(treeId, value, 0n, includeUncommitted);
98
- }
99
- async findLeafIndexAfter(treeId, leaf, startIndex, includeUncommitted) {
100
- const index = await this.call(WorldStateMessageType.FIND_LEAF_INDEX, {
101
- leaf: serializeLeaf(hydrateLeaf(treeId, leaf)),
102
- revision: worldStateRevision(includeUncommitted),
103
- treeId,
104
- startIndex,
105
- });
106
- if (typeof index === 'number' || typeof index === 'bigint') {
107
- return BigInt(index);
108
- }
109
- else {
110
- return undefined;
111
- }
112
- }
113
- async getLeafPreimage(treeId, leafIndex, args) {
114
- const resp = await this.call(WorldStateMessageType.GET_LEAF_PREIMAGE, {
115
- leafIndex,
116
- revision: worldStateRevision(args),
117
- treeId,
118
- });
119
- return resp ? deserializeIndexedLeaf(resp) : undefined;
120
- }
121
- async getLeafValue(treeId, leafIndex, includeUncommitted) {
122
- const resp = await this.call(WorldStateMessageType.GET_LEAF_VALUE, {
123
- leafIndex,
124
- revision: worldStateRevision(includeUncommitted),
125
- treeId,
126
- });
127
- if (!resp) {
128
- return undefined;
129
- }
130
- const leaf = deserializeLeafValue(resp);
131
- if (leaf instanceof Fr) {
132
- return leaf;
133
- }
134
- else {
135
- return leaf.toBuffer();
50
+ async init() {
51
+ this.initialHeader = await this.buildInitialHeader();
52
+ const committed = this.getCommitted();
53
+ // validate the initial state
54
+ const archive = await committed.getTreeInfo(MerkleTreeId.ARCHIVE);
55
+ if (archive.size === 0n) {
56
+ throw new Error("Archive tree can't be empty");
136
57
  }
58
+ // the initial header _must_ be the first element in the archive tree
59
+ // if this assertion fails, check that the hashing done in Header in yarn-project matches the initial header hash done in world_state.cpp
60
+ const initialHeaderIndex = await committed.findLeafIndex(MerkleTreeId.ARCHIVE, this.initialHeader.hash());
61
+ assert.strictEqual(initialHeaderIndex, 0n, 'Invalid initial archive state');
137
62
  }
138
- async getPreviousValueIndex(treeId, value, includeUncommitted) {
139
- const resp = await this.call(WorldStateMessageType.FIND_LOW_LEAF, {
140
- key: new Fr(value),
141
- revision: worldStateRevision(includeUncommitted),
142
- treeId,
143
- });
144
- return {
145
- alreadyPresent: resp.alreadyPresent,
146
- index: BigInt(resp.index),
147
- };
148
- }
149
- async getSiblingPath(treeId, leafIndex, includeUncommitted) {
150
- const siblingPath = await this.call(WorldStateMessageType.GET_SIBLING_PATH, {
151
- leafIndex,
152
- revision: worldStateRevision(includeUncommitted),
153
- treeId,
154
- });
155
- return new SiblingPath(siblingPath.length, siblingPath);
63
+ getCommitted() {
64
+ return new MerkleTreesFacade(this.instance, this.initialHeader, worldStateRevision(false, 0, 0));
156
65
  }
157
- getSnapshot(_block) {
158
- return Promise.reject(new Error('getSnapshot not implemented'));
66
+ getSnapshot(blockNumber) {
67
+ return new MerkleTreesFacade(this.instance, this.initialHeader, worldStateRevision(false, 0, blockNumber));
159
68
  }
160
- async getStateReference(includeUncommitted) {
161
- const resp = await this.call(WorldStateMessageType.GET_STATE_REFERENCE, {
162
- revision: worldStateRevision(includeUncommitted),
69
+ async fork(blockNumber) {
70
+ const resp = await this.instance.call(WorldStateMessageType.CREATE_FORK, {
71
+ latest: blockNumber === undefined,
72
+ blockNumber: blockNumber ?? 0,
163
73
  });
164
- return new StateReference(treeStateReferenceToSnapshot(resp.state[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]), new PartialStateReference(treeStateReferenceToSnapshot(resp.state[MerkleTreeId.NOTE_HASH_TREE]), treeStateReferenceToSnapshot(resp.state[MerkleTreeId.NULLIFIER_TREE]), treeStateReferenceToSnapshot(resp.state[MerkleTreeId.PUBLIC_DATA_TREE])));
74
+ return new MerkleTreesForkFacade(this.instance, this.initialHeader, worldStateRevision(true, resp.forkId, 0));
165
75
  }
166
- async getTreeInfo(treeId, includeUncommitted) {
167
- const resp = await this.call(WorldStateMessageType.GET_TREE_INFO, {
168
- treeId: treeId,
169
- revision: worldStateRevision(includeUncommitted),
170
- });
171
- return {
172
- depth: resp.depth,
173
- root: resp.root,
174
- size: BigInt(resp.size),
175
- treeId,
176
- };
76
+ getInitialHeader() {
77
+ return this.initialHeader;
177
78
  }
178
79
  async handleL2BlockAndMessages(l2Block, l1ToL2Messages) {
179
80
  // We have to pad both the tx effects and the values within tx effects because that's how the trees are built
@@ -193,111 +94,64 @@ export class NativeWorldStateService {
193
94
  }
194
95
  batchesOfPaddedPublicDataWrites.push(batch);
195
96
  }
196
- return await this.call(WorldStateMessageType.SYNC_BLOCK, {
197
- blockHash: l2Block.hash(),
97
+ const response = await this.instance.call(WorldStateMessageType.SYNC_BLOCK, {
98
+ blockNumber: l2Block.number,
99
+ blockHeaderHash: l2Block.header.hash(),
198
100
  paddedL1ToL2Messages: paddedL1ToL2Messages.map(serializeLeaf),
199
101
  paddedNoteHashes: paddedNoteHashes.map(serializeLeaf),
200
102
  paddedNullifiers: paddedNullifiers.map(serializeLeaf),
201
103
  batchesOfPaddedPublicDataWrites: batchesOfPaddedPublicDataWrites.map(batch => batch.map(serializeLeaf)),
202
104
  blockStateRef: blockStateReference(l2Block.header.state),
203
105
  });
204
- }
205
- async rollback() {
206
- await this.call(WorldStateMessageType.ROLLBACK, void 0);
207
- }
208
- async updateArchive(header, _includeUncommitted) {
209
- await this.call(WorldStateMessageType.UPDATE_ARCHIVE, {
210
- blockHash: header.hash().toBuffer(),
211
- blockStateRef: blockStateReference(header.state),
106
+ return response.status;
107
+ }
108
+ async close() {
109
+ await this.instance.close();
110
+ await this.cleanup();
111
+ }
112
+ async buildInitialHeader() {
113
+ const state = await this.getInitialStateReference();
114
+ return Header.empty({ state });
115
+ }
116
+ /**
117
+ * Advances the finalised block number to be the number provided
118
+ * @param toBlockNumber The block number that is now the tip of the finalised chain
119
+ * @returns The new WorldStateStatus
120
+ */
121
+ async setFinalised(toBlockNumber) {
122
+ return await this.instance.call(WorldStateMessageType.FINALISE_BLOCKS, {
123
+ toBlockNumber,
212
124
  });
213
125
  }
214
- updateLeaf(_treeId, _leaf, _index) {
215
- return Promise.reject(new Error('Method not implemented'));
216
- }
217
- call(messageType, body) {
218
- return this.queue.put(async () => {
219
- const request = new TypedMessage(messageType, new MessageHeader({ messageId: this.nextMessageId++ }), body);
220
- const encodedRequest = this.encoder.encode(request);
221
- const encodedResponse = await this.instance.call(encodedRequest);
222
- const buf = Buffer.isBuffer(encodedResponse)
223
- ? encodedResponse
224
- : isAnyArrayBuffer(encodedResponse)
225
- ? Buffer.from(encodedResponse)
226
- : encodedResponse;
227
- if (!Buffer.isBuffer(buf)) {
228
- throw new TypeError('Invalid encoded response: expected Buffer or ArrayBuffer, got ' +
229
- (encodedResponse === null ? 'null' : typeof encodedResponse));
230
- }
231
- const decodedResponse = this.decoder.unpack(buf);
232
- if (!TypedMessage.isTypedMessageLike(decodedResponse)) {
233
- throw new TypeError('Invalid response: expected TypedMessageLike, got ' +
234
- (decodedResponse === null ? 'null' : typeof decodedResponse));
235
- }
236
- const response = TypedMessage.fromMessagePack(decodedResponse);
237
- if (response.header.requestId !== request.header.messageId) {
238
- throw new Error('Response ID does not match request: ' + response.header.requestId + ' != ' + request.header.messageId);
239
- }
240
- if (response.msgType !== messageType) {
241
- throw new Error('Invalid response message type: ' + response.msgType + ' != ' + messageType);
242
- }
243
- return response.value;
126
+ /**
127
+ * Removes all historical snapshots up to but not including the given block number
128
+ * @param toBlockNumber The block number of the new oldest historical block
129
+ * @returns The new WorldStateStatus
130
+ */
131
+ async removeHistoricalBlocks(toBlockNumber) {
132
+ return await this.instance.call(WorldStateMessageType.REMOVE_HISTORICAL_BLOCKS, {
133
+ toBlockNumber,
244
134
  });
245
135
  }
246
- async stop() {
247
- await this.queue.end();
136
+ /**
137
+ * Removes all pending blocks down to but not including the given block number
138
+ * @param toBlockNumber The block number of the new tip of the pending chain,
139
+ * @returns The new WorldStateStatus
140
+ */
141
+ async unwindBlocks(toBlockNumber) {
142
+ return await this.instance.call(WorldStateMessageType.UNWIND_BLOCKS, {
143
+ toBlockNumber,
144
+ });
248
145
  }
249
- delete() {
250
- return Promise.reject(new Error('Method not implemented'));
146
+ async getStatus() {
147
+ return await this.instance.call(WorldStateMessageType.GET_STATUS, void 0);
251
148
  }
252
- fork() {
149
+ updateLeaf(_treeId, _leaf, _index) {
253
150
  return Promise.reject(new Error('Method not implemented'));
254
151
  }
255
- }
256
- function hydrateLeaf(treeId, leaf) {
257
- if (leaf instanceof Fr) {
258
- return leaf;
259
- }
260
- else if (treeId === MerkleTreeId.NULLIFIER_TREE) {
261
- return NullifierLeaf.fromBuffer(leaf);
262
- }
263
- else if (treeId === MerkleTreeId.PUBLIC_DATA_TREE) {
264
- return PublicDataTreeLeaf.fromBuffer(leaf);
265
- }
266
- else {
267
- return Fr.fromBuffer(leaf);
268
- }
269
- }
270
- function serializeLeaf(leaf) {
271
- if (leaf instanceof Fr) {
272
- return leaf.toBuffer();
273
- }
274
- else if (leaf instanceof NullifierLeaf) {
275
- return { value: leaf.nullifier.toBuffer() };
276
- }
277
- else {
278
- return { value: leaf.value.toBuffer(), slot: leaf.slot.toBuffer() };
279
- }
280
- }
281
- function deserializeLeafValue(leaf) {
282
- if (Buffer.isBuffer(leaf)) {
283
- return Fr.fromBuffer(leaf);
284
- }
285
- else if ('slot' in leaf) {
286
- return new PublicDataTreeLeaf(Fr.fromBuffer(leaf.slot), Fr.fromBuffer(leaf.value));
287
- }
288
- else {
289
- return new NullifierLeaf(Fr.fromBuffer(leaf.value));
290
- }
291
- }
292
- function deserializeIndexedLeaf(leaf) {
293
- if ('slot' in leaf.value) {
294
- return new PublicDataTreeLeafPreimage(Fr.fromBuffer(leaf.value.slot), Fr.fromBuffer(leaf.value.value), Fr.fromBuffer(leaf.nextValue), BigInt(leaf.nextIndex));
295
- }
296
- else if ('value' in leaf.value) {
297
- return new NullifierLeafPreimage(Fr.fromBuffer(leaf.value.value), Fr.fromBuffer(leaf.nextValue), BigInt(leaf.nextIndex));
298
- }
299
- else {
300
- throw new Error('Invalid leaf type');
152
+ async getInitialStateReference() {
153
+ const resp = await this.instance.call(WorldStateMessageType.GET_INITIAL_STATE_REFERENCE, void 0);
154
+ return new StateReference(treeStateReferenceToSnapshot(resp.state[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]), new PartialStateReference(treeStateReferenceToSnapshot(resp.state[MerkleTreeId.NOTE_HASH_TREE]), treeStateReferenceToSnapshot(resp.state[MerkleTreeId.NULLIFIER_TREE]), treeStateReferenceToSnapshot(resp.state[MerkleTreeId.PUBLIC_DATA_TREE])));
301
155
  }
302
156
  }
303
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS9uYXRpdmVfd29ybGRfc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQU1MLFlBQVksRUFFWixXQUFXLEVBRVgsUUFBUSxHQUNULE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLEVBQUUsRUFDRixNQUFNLEVBQ04sc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQiw0Q0FBNEMsRUFDNUMsbUNBQW1DLEVBQ25DLGFBQWEsRUFDYixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUNsQiwwQkFBMEIsRUFDMUIsY0FBYyxHQUNmLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdoRSxPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUc5QyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNyRyxPQUFPLEVBQ0wsYUFBYSxFQUdiLFlBQVksRUFDWixxQkFBcUIsRUFHckIsbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QixrQkFBa0IsR0FDbkIsTUFBTSxjQUFjLENBQUM7QUFFdEIscUdBQXFHO0FBQ3JHLHNHQUFzRztBQUN0Ryx5RkFBeUY7QUFDekYsMkdBQTJHO0FBQzNHLDZDQUE2QztBQUM3QyxZQUFZLENBQUM7SUFDWCxLQUFLLEVBQUUsRUFBRTtJQUNULEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDM0IsQ0FBQyxDQUFDO0FBTUgsTUFBTSxPQUFPLHVCQUF1QjtJQWlCbEMsWUFBOEIsUUFBd0I7UUFBeEIsYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFoQjlDLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBRWxCLFlBQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQztZQUM1QiwrQ0FBK0M7WUFDL0MsMkRBQTJEO1lBQzNELFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxRQUFRO1NBQ3RCLENBQUMsQ0FBQztRQUVLLFlBQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQztZQUM1QixVQUFVLEVBQUUsS0FBSztZQUNqQixXQUFXLEVBQUUsUUFBUTtTQUN0QixDQUFDLENBQUM7UUFFSyxVQUFLLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUdoQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FDakIsT0FBZSxFQUNmLFdBQVcsR0FBRyxrQkFBa0IsRUFDaEMsU0FBUyxHQUFHLFlBQVk7UUFFeEIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekQsTUFBTSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEIsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVTLEtBQUssQ0FBQyxJQUFJO1FBQ2xCLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BFLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN4Qiw4Q0FBOEM7WUFDOUMsc0RBQXNEO1lBQ3RELGtFQUFrRTtZQUNsRSx1QkFBdUI7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFTSxRQUFRO1FBQ2IsT0FBTyxJQUFJLCtCQUErQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLG9EQUFvRDtJQUNwRCx1QkFBdUI7SUFDdkIscUNBQXFDO0lBQ3JDLGlDQUFpQztJQUNqQyxhQUFhO0lBQ2IsK0JBQStCO0lBQy9CLGVBQWU7SUFDZixPQUFPO0lBQ1AsSUFBSTtJQUVHLGdCQUFnQjtRQUNyQiw4QkFBOEI7UUFDOUIsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQTBCLE1BQVUsRUFBRSxNQUFnQztRQUN0RixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUFFO1lBQ25ELE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBVyxDQUFDO1lBQ3ZDLE1BQU07U0FDUCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FDZixNQUFVLEVBQ1YsU0FBbUIsRUFDbkIsYUFBcUI7UUFFckIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3RixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUVsSCxPQUFPO1lBQ0wscUJBQXFCLEVBQUUsSUFBSSxXQUFXLENBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBYSxFQUMvQixJQUFJLENBQUMsWUFBWSxDQUNsQjtZQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYTtpQkFDaEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO2lCQUNyQixHQUFHLENBQUMsb0JBQW9CLENBQUM7aUJBQ3pCLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztZQUN6QixzQkFBc0IsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3BFLG9CQUFvQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3pCLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUMvQyxXQUFXLEVBQUUsSUFBSSxXQUFXLENBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQzthQUM3RSxDQUFDLENBQUM7U0FDSixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxhQUFhLENBQ1gsTUFBb0IsRUFDcEIsS0FBdUMsRUFDdkMsa0JBQTJCO1FBRTNCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FDdEIsTUFBb0IsRUFDcEIsSUFBc0MsRUFDdEMsVUFBa0IsRUFDbEIsa0JBQTJCO1FBRTNCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLEVBQUU7WUFDbkUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzlDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQztZQUNoRCxNQUFNO1lBQ04sVUFBVTtTQUNYLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUNuQixNQUFxQixFQUNyQixTQUFpQixFQUNqQixJQUFhO1FBRWIsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixFQUFFO1lBQ3BFLFNBQVM7WUFDVCxRQUFRLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDO1lBQ2xDLE1BQU07U0FDUCxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FDaEIsTUFBb0IsRUFDcEIsU0FBaUIsRUFDakIsa0JBQTJCO1FBRTNCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLEVBQUU7WUFDakUsU0FBUztZQUNULFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQztZQUNoRCxNQUFNO1NBQ1AsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxxQkFBcUIsQ0FDekIsTUFBcUIsRUFDckIsS0FBYSxFQUNiLGtCQUEyQjtRQUUzQixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUFFO1lBQ2hFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbEIsUUFBUSxFQUFFLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDO1lBQ2hELE1BQU07U0FDUCxDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ25DLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUMxQixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjLENBQ2xCLE1BQW9CLEVBQ3BCLFNBQWlCLEVBQ2pCLGtCQUEyQjtRQUUzQixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLEVBQUU7WUFDMUUsU0FBUztZQUNULFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQztZQUNoRCxNQUFNO1NBQ1AsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxXQUFXLENBQUMsTUFBYztRQUN4QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsa0JBQTJCO1FBQ2pELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxtQkFBbUIsRUFBRTtZQUN0RSxRQUFRLEVBQUUsa0JBQWtCLENBQUMsa0JBQWtCLENBQUM7U0FDakQsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLGNBQWMsQ0FDdkIsNEJBQTRCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUM1RSxJQUFJLHFCQUFxQixDQUN2Qiw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUNyRSw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUNyRSw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQ3hFLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQW9CLEVBQUUsa0JBQTJCO1FBQ2pFLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQUU7WUFDaEUsTUFBTSxFQUFFLE1BQU07WUFDZCxRQUFRLEVBQUUsa0JBQWtCLENBQUMsa0JBQWtCLENBQUM7U0FDakQsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdkIsTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLHdCQUF3QixDQUFDLE9BQWdCLEVBQUUsY0FBb0I7UUFDbkUsNkdBQTZHO1FBQzdHLGVBQWU7UUFDZixNQUFNLGVBQWUsR0FBRyxXQUFXLENBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUN0QixRQUFRLENBQUMsS0FBSyxFQUFFLEVBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQ3hDLENBQUM7UUFFRixNQUFNLGdCQUFnQixHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FDMUQsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxDQUNsRSxDQUFDO1FBQ0YsTUFBTSxvQkFBb0IsR0FBRyxXQUFXLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUV2RyxNQUFNLGdCQUFnQixHQUFHLGVBQWU7YUFDckMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO2FBQ3JGLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFbEQsbUdBQW1HO1FBQ25HLE1BQU0sK0JBQStCLEdBQTJCLEVBQUUsQ0FBQztRQUNuRSxLQUFLLE1BQU0sUUFBUSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sS0FBSyxHQUF5QixLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQyxJQUFJLENBQzFGLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUMzQixDQUFDO1lBQ0YsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUM3RCxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBRUQsK0JBQStCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUU7WUFDdkQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDekIsb0JBQW9CLEVBQUUsb0JBQW9CLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztZQUM3RCxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQ3JELGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7WUFDckQsK0JBQStCLEVBQUUsK0JBQStCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2RyxhQUFhLEVBQUUsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDekQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQWMsRUFBRSxtQkFBNEI7UUFDOUQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsRUFBRTtZQUNwRCxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUNuQyxhQUFhLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUNqRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVSxDQUNSLE9BQVcsRUFDWCxLQUFxQyxFQUNyQyxNQUFjO1FBRWQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRU8sSUFBSSxDQUNWLFdBQWMsRUFDZCxJQUEwQjtRQUUxQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQy9CLE1BQU0sT0FBTyxHQUFHLElBQUksWUFBWSxDQUFDLFdBQVcsRUFBRSxJQUFJLGFBQWEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTVHLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFakUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7Z0JBQzFDLENBQUMsQ0FBQyxlQUFlO2dCQUNqQixDQUFDLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDO29CQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7b0JBQzlCLENBQUMsQ0FBQyxlQUFlLENBQUM7WUFFcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLFNBQVMsQ0FDakIsZ0VBQWdFO29CQUM5RCxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxlQUFlLENBQUMsQ0FDL0QsQ0FBQztZQUNKLENBQUM7WUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RELE1BQU0sSUFBSSxTQUFTLENBQ2pCLG1EQUFtRDtvQkFDakQsQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sZUFBZSxDQUFDLENBQy9ELENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBMkIsZUFBZSxDQUFDLENBQUM7WUFFekYsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUMzRCxNQUFNLElBQUksS0FBSyxDQUNiLHNDQUFzQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FDdkcsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEdBQUcsUUFBUSxDQUFDLE9BQU8sR0FBRyxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUM7WUFDL0YsQ0FBQztZQUVELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSTtRQUNmLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU0sTUFBTTtRQUNYLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVNLElBQUk7UUFDVCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7Q0FDRjtBQUVELFNBQVMsV0FBVyxDQUEwQixNQUFVLEVBQUUsSUFBaUI7SUFDekUsSUFBSSxJQUFJLFlBQVksRUFBRSxFQUFFLENBQUM7UUFDdkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO1NBQU0sSUFBSSxNQUFNLEtBQUssWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2xELE9BQU8sYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO1NBQU0sSUFBSSxNQUFNLEtBQUssWUFBWSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDcEQsT0FBTyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUE2QztJQUNsRSxJQUFJLElBQUksWUFBWSxFQUFFLEVBQUUsQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN6QixDQUFDO1NBQU0sSUFBSSxJQUFJLFlBQVksYUFBYSxFQUFFLENBQUM7UUFDekMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7SUFDOUMsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsSUFBeUI7SUFDckQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7U0FBTSxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksa0JBQWtCLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNyRixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sSUFBSSxhQUFhLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsSUFBMkI7SUFDekQsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE9BQU8sSUFBSSwwQkFBMEIsQ0FDbkMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUM5QixFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQy9CLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUN2QixDQUFDO0lBQ0osQ0FBQztTQUFNLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxPQUFPLElBQUkscUJBQXFCLENBQzlCLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFDL0IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQ3ZCLENBQUM7SUFDSixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN2QyxDQUFDO0FBQ0gsQ0FBQyJ9
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS9uYXRpdmVfd29ybGRfc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFlBQVksRUFHWixRQUFRLEdBQ1QsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsVUFBVSxFQUNWLEVBQUUsRUFDRixNQUFNLEVBQ04sc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQiw0Q0FBNEMsRUFDNUMsbUNBQW1DLEVBQ25DLGFBQWEsRUFFYixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLGNBQWMsR0FDZixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQztBQUM1QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRzVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRyxPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLG1CQUFtQixFQUNuQiw0QkFBNEIsRUFDNUIsa0JBQWtCLEdBQ25CLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBFLE1BQU0sbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUM7QUFFN0MsTUFBTSxPQUFPLHVCQUF1QjtJQUdsQyxZQUNxQixRQUEwQixFQUMxQixNQUFNLGlCQUFpQixDQUFDLDRCQUE0QixDQUFDLEVBQ3ZELFVBQVUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtRQUYvQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUMxQixRQUFHLEdBQUgsR0FBRyxDQUFrRDtRQUN2RCxZQUFPLEdBQVAsT0FBTyxDQUEwQjtJQUNqRCxDQUFDO0lBRUosTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQ2QsYUFBeUIsRUFDekIsT0FBZSxFQUNmLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyw0QkFBNEIsQ0FBQyxFQUNyRCxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtRQUVqQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUM3RCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sUUFBUSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRixNQUFNLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUUzRyxJQUFJLG9CQUFvQixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7WUFDeEUsR0FBRyxDQUFDLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUVELE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sU0FBUyxDQUFDLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVyRSxNQUFNLFFBQVEsR0FBRyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sVUFBVSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEQsTUFBTSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEIsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLGFBQWEsR0FBRyxJQUFJO1FBQ3BFLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDNUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQztRQUNwRSxHQUFHLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRWhFLDZGQUE2RjtRQUM3RixNQUFNLE9BQU8sR0FBRyxLQUFLLElBQUksRUFBRTtZQUN6QixJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRCxHQUFHLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixHQUFHLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVTLEtBQUssQ0FBQyxJQUFJO1FBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNyRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFdEMsNkJBQTZCO1FBQzdCLE1BQU0sT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEUsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQscUVBQXFFO1FBQ3JFLHlJQUF5STtRQUN6SSxNQUFNLGtCQUFrQixHQUFHLE1BQU0sU0FBUyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxRyxNQUFNLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFTSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFjLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFTSxXQUFXLENBQUMsV0FBbUI7UUFDcEMsT0FBTyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWMsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDOUcsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBb0I7UUFDcEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUU7WUFDdkUsTUFBTSxFQUFFLFdBQVcsS0FBSyxTQUFTO1lBQ2pDLFdBQVcsRUFBRSxXQUFXLElBQUksQ0FBQztTQUM5QixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYyxFQUFFLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakgsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVNLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxPQUFnQixFQUFFLGNBQW9CO1FBQzFFLDZHQUE2RztRQUM3RyxlQUFlO1FBQ2YsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFDdEIsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUN4QyxDQUFDO1FBRUYsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQzFELFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsQ0FDbEUsQ0FBQztRQUNGLE1BQU0sb0JBQW9CLEdBQUcsV0FBVyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLG1DQUFtQyxDQUFDLENBQUM7UUFFdkcsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlO2FBQ3JDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLENBQUMsQ0FBQzthQUNyRixHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRWxELG1HQUFtRztRQUNuRyxNQUFNLCtCQUErQixHQUEyQixFQUFFLENBQUM7UUFDbkUsS0FBSyxNQUFNLFFBQVEsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUN2QyxNQUFNLEtBQUssR0FBeUIsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUMsSUFBSSxDQUMxRixrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FDM0IsQ0FBQztZQUNGLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDN0QsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksa0JBQWtCLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDckUsQ0FBQztZQUVELCtCQUErQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUU7WUFDMUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQzNCLGVBQWUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRTtZQUN0QyxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQzdELGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7WUFDckQsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztZQUNyRCwrQkFBK0IsRUFBRSwrQkFBK0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZHLGFBQWEsRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUN6RCxDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDekIsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sS0FBSyxDQUFDLGtCQUFrQjtRQUM5QixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3BELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLGFBQXFCO1FBQzdDLE9BQU8sTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLEVBQUU7WUFDckUsYUFBYTtTQUNkLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLHNCQUFzQixDQUFDLGFBQXFCO1FBQ3ZELE9BQU8sTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyx3QkFBd0IsRUFBRTtZQUM5RSxhQUFhO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLGFBQXFCO1FBQzdDLE9BQU8sTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQUU7WUFDbkUsYUFBYTtTQUNkLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUztRQUNwQixPQUFPLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELFVBQVUsQ0FDUixPQUFXLEVBQ1gsS0FBcUMsRUFDckMsTUFBYztRQUVkLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVPLEtBQUssQ0FBQyx3QkFBd0I7UUFDcEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQywyQkFBMkIsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWpHLE9BQU8sSUFBSSxjQUFjLENBQ3ZCLDRCQUE0QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUMsRUFDNUUsSUFBSSxxQkFBcUIsQ0FDdkIsNEJBQTRCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsRUFDckUsNEJBQTRCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsRUFDckUsNEJBQTRCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUN4RSxDQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YifQ==
@@ -0,0 +1,40 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { WorldStateMessageType, type WorldStateRequest, type WorldStateResponse } from './message.js';
3
+ export interface NativeInstance {
4
+ call(msg: Buffer | Uint8Array): Promise<any>;
5
+ }
6
+ export interface NativeWorldStateInstance {
7
+ call<T extends WorldStateMessageType>(messageType: T, body: WorldStateRequest[T]): Promise<WorldStateResponse[T]>;
8
+ }
9
+ /**
10
+ * Strongly-typed interface to access the WorldState class in the native world_state_napi module.
11
+ */
12
+ export declare class NativeWorldState implements NativeWorldStateInstance {
13
+ private log;
14
+ private open;
15
+ /** Each message needs a unique ID */
16
+ private nextMessageId;
17
+ /** A long-lived msgpack encoder */
18
+ private encoder;
19
+ /** A long-lived msgpack decoder */
20
+ private decoder;
21
+ /** The actual native instance */
22
+ private instance;
23
+ /** Calls to the same instance are serialized */
24
+ private queue;
25
+ /** Creates a new native WorldState instance */
26
+ constructor(dataDir: string, log?: import("@aztec/foundation/log").Logger);
27
+ /**
28
+ * Sends a message to the native instance and returns the response.
29
+ * @param messageType - The type of message to send
30
+ * @param body - The message body
31
+ * @returns The response to the message
32
+ */
33
+ call<T extends WorldStateMessageType>(messageType: T, body: WorldStateRequest[T]): Promise<WorldStateResponse[T]>;
34
+ /**
35
+ * Stops the native instance.
36
+ */
37
+ close(): Promise<void>;
38
+ private _sendMessage;
39
+ }
40
+ //# sourceMappingURL=native_world_state_instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native_world_state_instance.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state_instance.ts"],"names":[],"mappings":";AAsBA,OAAO,EAGL,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AAYtB,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAC9C;AAQD,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,CAAC,SAAS,qBAAqB,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;CACnH;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,wBAAwB;IA2BlC,OAAO,CAAC,GAAG;IA1BxC,OAAO,CAAC,IAAI,CAAQ;IAEpB,qCAAqC;IACrC,OAAO,CAAC,aAAa,CAAK;IAE1B,mCAAmC;IACnC,OAAO,CAAC,OAAO,CAKZ;IAEH,mCAAmC;IACnC,OAAO,CAAC,OAAO,CAGZ;IAEH,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAM;IAEtB,gDAAgD;IAChD,OAAO,CAAC,KAAK,CAAqB;IAElC,+CAA+C;gBACnC,OAAO,EAAE,MAAM,EAAU,GAAG,yCAAkD;IAqB1F;;;;;OAKG;IACI,IAAI,CAAC,CAAC,SAAS,qBAAqB,EACzC,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAQjC;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YASrB,YAAY;CA+H3B"}