@aztec/pxe 0.0.1-commit.29c6b1a3 → 0.0.1-commit.2e2504e2

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 (120) hide show
  1. package/dest/block_synchronizer/block_synchronizer.d.ts +5 -3
  2. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  3. package/dest/block_synchronizer/block_synchronizer.js +9 -3
  4. package/dest/contract_function_simulator/contract_function_simulator.d.ts +4 -4
  5. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  6. package/dest/contract_function_simulator/contract_function_simulator.js +9 -9
  7. package/dest/contract_function_simulator/oracle/interfaces.d.ts +8 -8
  8. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  9. package/dest/contract_function_simulator/oracle/oracle.d.ts +4 -4
  10. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  11. package/dest/contract_function_simulator/oracle/oracle.js +29 -17
  12. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +4 -3
  13. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  14. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +7 -7
  15. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +18 -15
  16. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +28 -33
  18. package/dest/contract_sync/contract_sync_service.d.ts +41 -0
  19. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
  20. package/dest/contract_sync/contract_sync_service.js +82 -0
  21. package/dest/contract_sync/helpers.d.ts +28 -0
  22. package/dest/contract_sync/helpers.d.ts.map +1 -0
  23. package/dest/contract_sync/{index.js → helpers.js} +13 -12
  24. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  25. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  26. package/dest/entrypoints/client/bundle/utils.js +12 -6
  27. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  28. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  29. package/dest/entrypoints/client/lazy/utils.js +13 -7
  30. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  31. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  32. package/dest/entrypoints/server/index.d.ts +2 -2
  33. package/dest/entrypoints/server/index.d.ts.map +1 -1
  34. package/dest/entrypoints/server/index.js +1 -1
  35. package/dest/entrypoints/server/utils.d.ts +1 -1
  36. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  37. package/dest/entrypoints/server/utils.js +19 -8
  38. package/dest/events/event_service.d.ts +4 -5
  39. package/dest/events/event_service.d.ts.map +1 -1
  40. package/dest/events/event_service.js +5 -6
  41. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  42. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  43. package/dest/job_coordinator/job_coordinator.js +3 -2
  44. package/dest/logs/log_service.d.ts +6 -5
  45. package/dest/logs/log_service.d.ts.map +1 -1
  46. package/dest/logs/log_service.js +10 -15
  47. package/dest/notes/note_service.d.ts +4 -5
  48. package/dest/notes/note_service.d.ts.map +1 -1
  49. package/dest/notes/note_service.js +6 -7
  50. package/dest/oracle_version.d.ts +3 -3
  51. package/dest/oracle_version.d.ts.map +1 -1
  52. package/dest/oracle_version.js +2 -2
  53. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  54. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  55. package/dest/private_kernel/private_kernel_execution_prover.js +2 -2
  56. package/dest/pxe.d.ts +2 -1
  57. package/dest/pxe.d.ts.map +1 -1
  58. package/dest/pxe.js +25 -12
  59. package/dest/storage/address_store/address_store.d.ts +1 -1
  60. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  61. package/dest/storage/address_store/address_store.js +12 -11
  62. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  63. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  64. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  65. package/dest/storage/capsule_store/capsule_store.js +6 -8
  66. package/dest/storage/contract_store/contract_store.d.ts +1 -1
  67. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  68. package/dest/storage/contract_store/contract_store.js +22 -13
  69. package/dest/storage/metadata.d.ts +1 -1
  70. package/dest/storage/metadata.js +1 -1
  71. package/dest/storage/note_store/note_store.d.ts +11 -1
  72. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  73. package/dest/storage/note_store/note_store.js +143 -105
  74. package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
  75. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  76. package/dest/storage/private_event_store/private_event_store.js +84 -61
  77. package/dest/storage/private_event_store/stored_private_event.js +1 -1
  78. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +1 -1
  79. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  80. package/dest/storage/tagging_store/recipient_tagging_store.js +31 -19
  81. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  82. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  83. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  84. package/dest/storage/tagging_store/sender_tagging_store.d.ts +1 -1
  85. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  86. package/dest/storage/tagging_store/sender_tagging_store.js +183 -113
  87. package/package.json +25 -16
  88. package/src/block_synchronizer/block_synchronizer.ts +21 -12
  89. package/src/contract_function_simulator/contract_function_simulator.ts +9 -6
  90. package/src/contract_function_simulator/oracle/interfaces.ts +9 -9
  91. package/src/contract_function_simulator/oracle/oracle.ts +32 -15
  92. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +7 -10
  93. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +31 -35
  94. package/src/contract_sync/contract_sync_service.ts +129 -0
  95. package/src/contract_sync/{index.ts → helpers.ts} +15 -20
  96. package/src/entrypoints/client/bundle/utils.ts +7 -14
  97. package/src/entrypoints/client/lazy/utils.ts +8 -14
  98. package/src/entrypoints/pxe_creation_options.ts +2 -1
  99. package/src/entrypoints/server/index.ts +1 -1
  100. package/src/entrypoints/server/utils.ts +15 -19
  101. package/src/events/event_service.ts +4 -6
  102. package/src/job_coordinator/job_coordinator.ts +4 -3
  103. package/src/logs/log_service.ts +14 -14
  104. package/src/notes/note_service.ts +5 -7
  105. package/src/oracle_version.ts +2 -2
  106. package/src/private_kernel/private_kernel_execution_prover.ts +6 -3
  107. package/src/pxe.ts +40 -16
  108. package/src/storage/address_store/address_store.ts +15 -15
  109. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  110. package/src/storage/capsule_store/capsule_store.ts +8 -8
  111. package/src/storage/contract_store/contract_store.ts +22 -11
  112. package/src/storage/metadata.ts +1 -1
  113. package/src/storage/note_store/note_store.ts +159 -129
  114. package/src/storage/private_event_store/private_event_store.ts +102 -81
  115. package/src/storage/private_event_store/stored_private_event.ts +1 -1
  116. package/src/storage/tagging_store/recipient_tagging_store.ts +31 -21
  117. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  118. package/src/storage/tagging_store/sender_tagging_store.ts +210 -126
  119. package/dest/contract_sync/index.d.ts +0 -23
  120. package/dest/contract_sync/index.d.ts.map +0 -1
package/src/pxe.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
2
2
  import { BlockNumber } from '@aztec/foundation/branded-types';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
- import { type Logger, createLogger } from '@aztec/foundation/log';
4
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
5
5
  import { SerialQueue } from '@aztec/foundation/queue';
6
6
  import { Timer } from '@aztec/foundation/timer';
7
7
  import { KeyStore } from '@aztec/key-store';
@@ -59,7 +59,8 @@ import {
59
59
  generateSimulatedProvingResult,
60
60
  } from './contract_function_simulator/contract_function_simulator.js';
61
61
  import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
62
- import { ensureContractSynced, readCurrentClassId } from './contract_sync/index.js';
62
+ import { ContractSyncService } from './contract_sync/contract_sync_service.js';
63
+ import { readCurrentClassId } from './contract_sync/helpers.js';
63
64
  import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
64
65
  import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
65
66
  import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
@@ -102,6 +103,7 @@ export class PXE {
102
103
  private recipientTaggingStore: RecipientTaggingStore,
103
104
  private addressStore: AddressStore,
104
105
  private privateEventStore: PrivateEventStore,
106
+ private contractSyncService: ContractSyncService,
105
107
  private simulator: CircuitSimulator,
106
108
  private proverEnabled: boolean,
107
109
  private proofCreator: PrivateKernelProver,
@@ -128,6 +130,10 @@ export class PXE {
128
130
  config: PXEConfig,
129
131
  loggerOrSuffix?: string | Logger,
130
132
  ) {
133
+ // Extract bindings from the logger, or use empty bindings if a string suffix is provided.
134
+ const bindings: LoggerBindings | undefined =
135
+ loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
136
+
131
137
  const log =
132
138
  !loggerOrSuffix || typeof loggerOrSuffix === 'string'
133
139
  ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
@@ -145,6 +151,12 @@ export class PXE {
145
151
  const capsuleStore = new CapsuleStore(store);
146
152
  const keyStore = new KeyStore(store);
147
153
  const tipsStore = new L2TipsKVStore(store, 'pxe');
154
+ const contractSyncService = new ContractSyncService(
155
+ node,
156
+ contractStore,
157
+ noteStore,
158
+ createLogger('pxe:contract_sync', bindings),
159
+ );
148
160
  const synchronizer = new BlockSynchronizer(
149
161
  node,
150
162
  store,
@@ -152,17 +164,19 @@ export class PXE {
152
164
  noteStore,
153
165
  privateEventStore,
154
166
  tipsStore,
167
+ contractSyncService,
155
168
  config,
156
- loggerOrSuffix,
169
+ bindings,
157
170
  );
158
171
 
159
- const jobCoordinator = new JobCoordinator(store);
172
+ const jobCoordinator = new JobCoordinator(store, bindings);
160
173
  jobCoordinator.registerStores([
161
174
  capsuleStore,
162
175
  senderTaggingStore,
163
176
  recipientTaggingStore,
164
177
  privateEventStore,
165
178
  noteStore,
179
+ contractSyncService,
166
180
  ]);
167
181
 
168
182
  const debugUtils = new PXEDebugUtils(contractStore, noteStore, synchronizer, anchorBlockStore);
@@ -182,6 +196,7 @@ export class PXE {
182
196
  recipientTaggingStore,
183
197
  addressStore,
184
198
  privateEventStore,
199
+ contractSyncService,
185
200
  simulator,
186
201
  proverEnabled,
187
202
  proofCreator,
@@ -213,13 +228,13 @@ export class PXE {
213
228
  this.keyStore,
214
229
  this.addressStore,
215
230
  BenchmarkedNodeFactory.create(this.node),
216
- this.anchorBlockStore,
217
231
  this.senderTaggingStore,
218
232
  this.recipientTaggingStore,
219
233
  this.senderAddressBookStore,
220
234
  this.capsuleStore,
221
235
  this.privateEventStore,
222
236
  this.simulator,
237
+ this.contractSyncService,
223
238
  );
224
239
  }
225
240
 
@@ -294,13 +309,12 @@ export class PXE {
294
309
  try {
295
310
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
296
311
 
297
- await ensureContractSynced(
312
+ await this.contractSyncService.ensureContractSynced(
298
313
  contractAddress,
299
314
  functionSelector,
300
315
  privateSyncCall => this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
301
- this.node,
302
- this.contractStore,
303
316
  anchorBlockHeader,
317
+ jobId,
304
318
  );
305
319
 
306
320
  const result = await contractFunctionSimulator.run(
@@ -400,7 +414,12 @@ export class PXE {
400
414
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
401
415
  const anchorBlockHash = await anchorBlockHeader.hash();
402
416
  const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
403
- const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled);
417
+ const kernelTraceProver = new PrivateKernelExecutionProver(
418
+ kernelOracle,
419
+ proofCreator,
420
+ !this.proverEnabled,
421
+ this.log.getBindings(),
422
+ );
404
423
  this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
405
424
  return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
406
425
  }
@@ -840,7 +859,14 @@ export class PXE {
840
859
  // Temporary: in case there are overrides, we have to skip the kernels or validations
841
860
  // will fail. Consider handing control to the user/wallet on whether they want to run them
842
861
  // or not.
843
- const skipKernels = overrides?.contracts !== undefined && Object.keys(overrides.contracts ?? {}).length > 0;
862
+ const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
863
+ const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
864
+ const skipKernels = hasOverriddenContracts;
865
+
866
+ // Set overridden contracts on the sync service so it knows to skip syncing them
867
+ if (hasOverriddenContracts) {
868
+ this.contractSyncService.setOverriddenContracts(jobId, overriddenContracts);
869
+ }
844
870
 
845
871
  // Execution of private functions only; no proving, and no kernel logic.
846
872
  const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
@@ -962,13 +988,12 @@ export class PXE {
962
988
  const contractFunctionSimulator = this.#getSimulatorForTx();
963
989
 
964
990
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
965
- await ensureContractSynced(
991
+ await this.contractSyncService.ensureContractSynced(
966
992
  call.to,
967
993
  call.selector,
968
994
  privateSyncCall => this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
969
- this.node,
970
- this.contractStore,
971
995
  anchorBlockHeader,
996
+ jobId,
972
997
  );
973
998
 
974
999
  const executionResult = await this.#simulateUtility(
@@ -1032,14 +1057,13 @@ export class PXE {
1032
1057
 
1033
1058
  const contractFunctionSimulator = this.#getSimulatorForTx();
1034
1059
 
1035
- await ensureContractSynced(
1060
+ await this.contractSyncService.ensureContractSynced(
1036
1061
  filter.contractAddress,
1037
1062
  null,
1038
1063
  async privateSyncCall =>
1039
1064
  await this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
1040
- this.node,
1041
- this.contractStore,
1042
1065
  anchorBlockHeader,
1066
+ jobId,
1043
1067
  );
1044
1068
  });
1045
1069
 
@@ -43,23 +43,23 @@ export class AddressStore {
43
43
  });
44
44
  }
45
45
 
46
- async #getCompleteAddress(address: AztecAddress): Promise<CompleteAddress | undefined> {
47
- const index = await this.#completeAddressIndex.getAsync(address.toString());
48
- if (index === undefined) {
49
- return undefined;
50
- }
51
-
52
- const value = await this.#completeAddresses.atAsync(index);
53
- return value ? await CompleteAddress.fromBuffer(value) : undefined;
54
- }
55
-
56
46
  getCompleteAddress(account: AztecAddress): Promise<CompleteAddress | undefined> {
57
- return this.#getCompleteAddress(account);
47
+ return this.#store.transactionAsync(async () => {
48
+ const index = await this.#completeAddressIndex.getAsync(account.toString());
49
+ if (index === undefined) {
50
+ return undefined;
51
+ }
52
+
53
+ const value = await this.#completeAddresses.atAsync(index);
54
+ return value ? await CompleteAddress.fromBuffer(value) : undefined;
55
+ });
58
56
  }
59
57
 
60
- async getCompleteAddresses(): Promise<CompleteAddress[]> {
61
- return await Promise.all(
62
- (await toArray(this.#completeAddresses.valuesAsync())).map(v => CompleteAddress.fromBuffer(v)),
63
- );
58
+ getCompleteAddresses(): Promise<CompleteAddress[]> {
59
+ return this.#store.transactionAsync(async () => {
60
+ return await Promise.all(
61
+ (await toArray(this.#completeAddresses.valuesAsync())).map(v => CompleteAddress.fromBuffer(v)),
62
+ );
63
+ });
64
64
  }
65
65
  }
@@ -10,6 +10,14 @@ export class AnchorBlockStore {
10
10
  this.#synchronizedHeader = this.#store.openSingleton('header');
11
11
  }
12
12
 
13
+ /**
14
+ * Sets the currently synchronized block
15
+ *
16
+ * Important: this method is only called from BlockSynchronizer, and since we need it to run atomically with other
17
+ * stores in the case of a reorg, it MUST NOT be wrapped in a `transactionAsync` call. Doing so would result in a
18
+ * deadlock when the backend is IndexedDB, because `transactionAsync` is not designed to support reentrancy.
19
+ *
20
+ */
13
21
  async setHeader(header: BlockHeader): Promise<void> {
14
22
  await this.#synchronizedHeader.set(header.toBuffer());
15
23
  }
@@ -57,14 +57,14 @@ export class CapsuleStore implements StagedStore {
57
57
  */
58
58
  async #getFromStage(jobId: string, dbSlotKey: string): Promise<Buffer | null | undefined> {
59
59
  const jobStagedCapsules = this.#getJobStagedCapsules(jobId);
60
- let staged: Buffer | null | undefined = jobStagedCapsules.get(dbSlotKey);
61
- // Note that if staged === null, we marked it for deletion, so we don't want to
62
- // re-read it from DB
63
- if (staged === undefined) {
64
- // If we don't have a staged version of this dbSlotKey, first we check if there's one in DB
65
- staged = await this.#loadCapsuleFromDb(dbSlotKey);
66
- }
67
- return staged;
60
+ const staged: Buffer | null | undefined = jobStagedCapsules.get(dbSlotKey);
61
+
62
+ // Always issue DB read to keep IndexedDB transaction alive, even if the value is in the job staged data. This
63
+ // keeps IndexedDB transactions alive (they auto-commit when a new micro-task starts and there are no pending read
64
+ // requests). The staged value still takes precedence if it exists (including null for deletions).
65
+ const dbValue = await this.#loadCapsuleFromDb(dbSlotKey);
66
+
67
+ return staged !== undefined ? staged : dbValue;
68
68
  }
69
69
 
70
70
  /**
@@ -42,10 +42,12 @@ export class ContractStore {
42
42
  /** Map from contract address to contract class id */
43
43
  #contractClassIdMap: Map<string, Fr> = new Map();
44
44
 
45
+ #store: AztecAsyncKVStore;
45
46
  #contractArtifacts: AztecAsyncMap<string, Buffer>;
46
47
  #contractInstances: AztecAsyncMap<string, Buffer>;
47
48
 
48
49
  constructor(store: AztecAsyncKVStore) {
50
+ this.#store = store;
49
51
  this.#contractArtifacts = store.openMap('contract_artifacts');
50
52
  this.#contractInstances = store.openMap('contracts_instances');
51
53
  }
@@ -53,6 +55,7 @@ export class ContractStore {
53
55
  // Setters
54
56
 
55
57
  public async addContractArtifact(id: Fr, contract: ContractArtifact): Promise<void> {
58
+ // Validation outside transactionAsync - these are not DB operations
56
59
  const privateFunctions = contract.functions.filter(
57
60
  functionArtifact => functionArtifact.functionType === FunctionType.PRIVATE,
58
61
  );
@@ -69,7 +72,9 @@ export class ContractStore {
69
72
  throw new Error('Repeated function selectors of private functions');
70
73
  }
71
74
 
72
- await this.#contractArtifacts.set(id.toString(), contractArtifactToBuffer(contract));
75
+ await this.#store.transactionAsync(() =>
76
+ this.#contractArtifacts.set(id.toString(), contractArtifactToBuffer(contract)),
77
+ );
73
78
  }
74
79
 
75
80
  async addContractInstance(contract: ContractInstanceWithAddress): Promise<void> {
@@ -123,21 +128,27 @@ export class ContractStore {
123
128
 
124
129
  // Public getters
125
130
 
126
- async getContractsAddresses(): Promise<AztecAddress[]> {
127
- const keys = await toArray(this.#contractInstances.keysAsync());
128
- return keys.map(AztecAddress.fromString);
131
+ getContractsAddresses(): Promise<AztecAddress[]> {
132
+ return this.#store.transactionAsync(async () => {
133
+ const keys = await toArray(this.#contractInstances.keysAsync());
134
+ return keys.map(AztecAddress.fromString);
135
+ });
129
136
  }
130
137
 
131
138
  /** Returns a contract instance for a given address. Throws if not found. */
132
- public async getContractInstance(contractAddress: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
133
- const contract = await this.#contractInstances.getAsync(contractAddress.toString());
134
- return contract && SerializableContractInstance.fromBuffer(contract).withAddress(contractAddress);
139
+ public getContractInstance(contractAddress: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
140
+ return this.#store.transactionAsync(async () => {
141
+ const contract = await this.#contractInstances.getAsync(contractAddress.toString());
142
+ return contract && SerializableContractInstance.fromBuffer(contract).withAddress(contractAddress);
143
+ });
135
144
  }
136
145
 
137
- public async getContractArtifact(contractClassId: Fr): Promise<ContractArtifact | undefined> {
138
- const contract = await this.#contractArtifacts.getAsync(contractClassId.toString());
139
- // TODO(@spalladino): AztecAsyncMap lies and returns Uint8Arrays instead of Buffers, hence the extra Buffer.from.
140
- return contract && contractArtifactFromBuffer(Buffer.from(contract));
146
+ public getContractArtifact(contractClassId: Fr): Promise<ContractArtifact | undefined> {
147
+ return this.#store.transactionAsync(async () => {
148
+ const contract = await this.#contractArtifacts.getAsync(contractClassId.toString());
149
+ // TODO(@spalladino): AztecAsyncMap lies and returns Uint8Arrays instead of Buffers, hence the extra Buffer.from.
150
+ return contract && contractArtifactFromBuffer(Buffer.from(contract));
151
+ });
141
152
  }
142
153
 
143
154
  /** Returns a contract class for a given class id. Throws if not found. */
@@ -1 +1 @@
1
- export const PXE_DATA_SCHEMA_VERSION = 2;
1
+ export const PXE_DATA_SCHEMA_VERSION = 3;