@aztec/txe 0.0.1-commit.f2ce05ee → 0.0.1-commit.f504929

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 (40) hide show
  1. package/dest/index.d.ts +1 -1
  2. package/dest/index.d.ts.map +1 -1
  3. package/dest/index.js +88 -54
  4. package/dest/oracle/interfaces.d.ts +29 -28
  5. package/dest/oracle/interfaces.d.ts.map +1 -1
  6. package/dest/oracle/txe_oracle_public_context.d.ts +13 -13
  7. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
  8. package/dest/oracle/txe_oracle_public_context.js +12 -12
  9. package/dest/oracle/txe_oracle_top_level_context.d.ts +22 -23
  10. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  11. package/dest/oracle/txe_oracle_top_level_context.js +104 -52
  12. package/dest/rpc_translator.d.ts +82 -82
  13. package/dest/rpc_translator.d.ts.map +1 -1
  14. package/dest/rpc_translator.js +241 -148
  15. package/dest/state_machine/dummy_p2p_client.d.ts +14 -11
  16. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  17. package/dest/state_machine/dummy_p2p_client.js +23 -14
  18. package/dest/state_machine/index.d.ts +1 -1
  19. package/dest/state_machine/index.d.ts.map +1 -1
  20. package/dest/state_machine/index.js +1 -1
  21. package/dest/txe_session.d.ts +9 -6
  22. package/dest/txe_session.d.ts.map +1 -1
  23. package/dest/txe_session.js +77 -21
  24. package/dest/util/txe_public_contract_data_source.d.ts +2 -3
  25. package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
  26. package/dest/util/txe_public_contract_data_source.js +5 -22
  27. package/package.json +15 -15
  28. package/src/index.ts +89 -52
  29. package/src/oracle/interfaces.ts +32 -31
  30. package/src/oracle/txe_oracle_public_context.ts +12 -12
  31. package/src/oracle/txe_oracle_top_level_context.ts +107 -91
  32. package/src/rpc_translator.ts +254 -156
  33. package/src/state_machine/dummy_p2p_client.ts +33 -20
  34. package/src/state_machine/index.ts +1 -0
  35. package/src/txe_session.ts +80 -71
  36. package/src/util/txe_public_contract_data_source.ts +10 -36
  37. package/dest/util/txe_contract_store.d.ts +0 -12
  38. package/dest/util/txe_contract_store.d.ts.map +0 -1
  39. package/dest/util/txe_contract_store.js +0 -22
  40. package/src/util/txe_contract_store.ts +0 -36
@@ -6,6 +6,7 @@ import type {
6
6
  P2PBlockReceivedCallback,
7
7
  P2PCheckpointReceivedCallback,
8
8
  P2PConfig,
9
+ P2PDuplicateAttestationCallback,
9
10
  P2PDuplicateProposalCallback,
10
11
  P2PSyncState,
11
12
  PeerId,
@@ -15,12 +16,12 @@ import type {
15
16
  StatusMessage,
16
17
  } from '@aztec/p2p';
17
18
  import type { EthAddress, L2BlockStreamEvent, L2Tips } from '@aztec/stdlib/block';
18
- import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
19
- import type { BlockProposal, CheckpointAttestation, CheckpointProposal } from '@aztec/stdlib/p2p';
20
- import type { Tx, TxHash } from '@aztec/stdlib/tx';
19
+ import type { ITxProvider, PeerInfo } from '@aztec/stdlib/interfaces/server';
20
+ import type { BlockProposal, CheckpointAttestation, CheckpointProposal, TopicType } from '@aztec/stdlib/p2p';
21
+ import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
21
22
 
22
23
  export class DummyP2P implements P2P {
23
- public validate(_txs: Tx[]): Promise<void> {
24
+ public validateTxsReceivedInBlockProposal(_txs: Tx[]): Promise<void> {
24
25
  return Promise.resolve();
25
26
  }
26
27
 
@@ -40,6 +41,10 @@ export class DummyP2P implements P2P {
40
41
  throw new Error('DummyP2P does not implement "getPeers"');
41
42
  }
42
43
 
44
+ public getGossipMeshPeerCount(_topicType: TopicType): Promise<number> {
45
+ return Promise.resolve(0);
46
+ }
47
+
43
48
  public broadcastProposal(_proposal: BlockProposal): Promise<void> {
44
49
  throw new Error('DummyP2P does not implement "broadcastProposal"');
45
50
  }
@@ -72,8 +77,8 @@ export class DummyP2P implements P2P {
72
77
  throw new Error('DummyP2P does not implement "sendTx"');
73
78
  }
74
79
 
75
- public deleteTxs(_txHashes: TxHash[]): Promise<void> {
76
- throw new Error('DummyP2P does not implement "deleteTxs"');
80
+ public handleFailedExecution(_txHashes: TxHash[]): Promise<void> {
81
+ throw new Error('DummyP2P does not implement "handleFailedExecution"');
77
82
  }
78
83
 
79
84
  public getTxByHashFromPool(_txHash: TxHash): Promise<Tx | undefined> {
@@ -98,6 +103,10 @@ export class DummyP2P implements P2P {
98
103
  throw new Error('DummyP2P does not implement "iteratePendingTxs"');
99
104
  }
100
105
 
106
+ public iterateEligiblePendingTxs(): AsyncIterableIterator<Tx> {
107
+ throw new Error('DummyP2P does not implement "iterateEligiblePendingTxs"');
108
+ }
109
+
101
110
  public getPendingTxCount(): Promise<number> {
102
111
  throw new Error('DummyP2P does not implement "getPendingTxCount"');
103
112
  }
@@ -126,6 +135,10 @@ export class DummyP2P implements P2P {
126
135
  throw new Error('DummyP2P does not implement "isP2PClient"');
127
136
  }
128
137
 
138
+ public getTxProvider(): ITxProvider {
139
+ throw new Error('DummyP2P does not implement "getTxProvider"');
140
+ }
141
+
129
142
  public getTxsByHash(_txHashes: TxHash[]): Promise<Tx[]> {
130
143
  throw new Error('DummyP2P does not implement "getTxsByHash"');
131
144
  }
@@ -158,14 +171,6 @@ export class DummyP2P implements P2P {
158
171
  throw new Error('DummyP2P does not implement "sync"');
159
172
  }
160
173
 
161
- public requestTxsByHash(_txHashes: TxHash[]): Promise<Tx[]> {
162
- throw new Error('DummyP2P does not implement "requestTxsByHash"');
163
- }
164
-
165
- public getTxs(_filter: 'all' | 'pending' | 'mined'): Promise<Tx[]> {
166
- throw new Error('DummyP2P does not implement "getTxs"');
167
- }
168
-
169
174
  public getTxsByHashFromPool(_txHashes: TxHash[]): Promise<(Tx | undefined)[]> {
170
175
  throw new Error('DummyP2P does not implement "getTxsByHashFromPool"');
171
176
  }
@@ -174,10 +179,6 @@ export class DummyP2P implements P2P {
174
179
  throw new Error('DummyP2P does not implement "hasTxsInPool"');
175
180
  }
176
181
 
177
- public addTxsToPool(_txs: Tx[]): Promise<number> {
178
- throw new Error('DummyP2P does not implement "addTxs"');
179
- }
180
-
181
182
  public getSyncedLatestBlockNum(): Promise<number> {
182
183
  throw new Error('DummyP2P does not implement "getSyncedLatestBlockNum"');
183
184
  }
@@ -190,8 +191,12 @@ export class DummyP2P implements P2P {
190
191
  throw new Error('DummyP2P does not implement "getSyncedLatestSlot"');
191
192
  }
192
193
 
193
- markTxsAsNonEvictable(_: TxHash[]): Promise<void> {
194
- throw new Error('DummyP2P does not implement "markTxsAsNonEvictable".');
194
+ protectTxs(_txHashes: TxHash[], _blockHeader: BlockHeader): Promise<TxHash[]> {
195
+ throw new Error('DummyP2P does not implement "protectTxs".');
196
+ }
197
+
198
+ prepareForSlot(_slotNumber: SlotNumber): Promise<void> {
199
+ return Promise.resolve();
195
200
  }
196
201
 
197
202
  addReqRespSubProtocol(
@@ -211,4 +216,12 @@ export class DummyP2P implements P2P {
211
216
  public registerDuplicateProposalCallback(_callback: P2PDuplicateProposalCallback): void {
212
217
  throw new Error('DummyP2P does not implement "registerDuplicateProposalCallback"');
213
218
  }
219
+
220
+ public registerDuplicateAttestationCallback(_callback: P2PDuplicateAttestationCallback): void {
221
+ throw new Error('DummyP2P does not implement "registerDuplicateAttestationCallback"');
222
+ }
223
+
224
+ public hasBlockProposalsForSlot(_slot: SlotNumber): Promise<boolean> {
225
+ throw new Error('DummyP2P does not implement "hasBlockProposalsForSlot"');
226
+ }
214
227
  }
@@ -50,6 +50,7 @@ export class TXEStateMachine {
50
50
  undefined,
51
51
  undefined,
52
52
  undefined,
53
+ undefined,
53
54
  VERSION,
54
55
  CHAIN_ID,
55
56
  new TXEGlobalVariablesBuilder(),
@@ -3,11 +3,12 @@ import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
4
4
  import { KeyStore } from '@aztec/key-store';
5
5
  import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
6
- import type { ProtocolContract } from '@aztec/protocol-contracts';
6
+ import type { AccessScopes } from '@aztec/pxe/client/lazy';
7
7
  import {
8
8
  AddressStore,
9
9
  AnchorBlockStore,
10
10
  CapsuleStore,
11
+ ContractStore,
11
12
  JobCoordinator,
12
13
  NoteService,
13
14
  NoteStore,
@@ -54,7 +55,6 @@ import { TXEArchiver } from './state_machine/archiver.js';
54
55
  import { TXEStateMachine } from './state_machine/index.js';
55
56
  import type { ForeignCallArgs, ForeignCallResult } from './util/encoding.js';
56
57
  import { TXEAccountStore } from './util/txe_account_store.js';
57
- import { TXEContractStore } from './util/txe_contract_store.js';
58
58
  import { getSingleTxBlockRequestHash, insertTxEffectIntoWorldTrees, makeTXEBlock } from './utils/block_creation.js';
59
59
  import { makeTxEffect } from './utils/tx_effect_creation.js';
60
60
 
@@ -113,6 +113,10 @@ export interface TXESessionStateHandler {
113
113
  enterPublicState(contractAddress?: AztecAddress): Promise<void>;
114
114
  enterPrivateState(contractAddress?: AztecAddress, anchorBlockNumber?: BlockNumber): Promise<PrivateContextInputs>;
115
115
  enterUtilityState(contractAddress?: AztecAddress): Promise<void>;
116
+
117
+ // TODO(F-335): Exposing the job info is abstraction breakage - drop the following 2 functions.
118
+ cycleJob(): Promise<string>;
119
+ getCurrentJob(): string;
116
120
  }
117
121
 
118
122
  /**
@@ -131,7 +135,7 @@ export class TXESession implements TXESessionStateHandler {
131
135
  | IPrivateExecutionOracle
132
136
  | IAvmExecutionOracle
133
137
  | ITxeExecutionOracle,
134
- private contractStore: TXEContractStore,
138
+ private contractStore: ContractStore,
135
139
  private noteStore: NoteStore,
136
140
  private keyStore: KeyStore,
137
141
  private addressStore: AddressStore,
@@ -148,12 +152,11 @@ export class TXESession implements TXESessionStateHandler {
148
152
  private nextBlockTimestamp: bigint,
149
153
  ) {}
150
154
 
151
- static async init(protocolContracts: ProtocolContract[]) {
155
+ static async init(contractStore: ContractStore) {
152
156
  const store = await openTmpStore('txe-session');
153
157
 
154
158
  const addressStore = new AddressStore(store);
155
159
  const privateEventStore = new PrivateEventStore(store);
156
- const contractStore = new TXEContractStore(store);
157
160
  const noteStore = new NoteStore(store);
158
161
  const senderTaggingStore = new SenderTaggingStore(store);
159
162
  const recipientTaggingStore = new RecipientTaggingStore(store);
@@ -172,12 +175,6 @@ export class TXESession implements TXESessionStateHandler {
172
175
  noteStore,
173
176
  ]);
174
177
 
175
- // Register protocol contracts.
176
- for (const { contractClass, instance, artifact } of protocolContracts) {
177
- await contractStore.addContractArtifact(contractClass.id, artifact);
178
- await contractStore.addContractInstance(instance);
179
- }
180
-
181
178
  const archiver = new TXEArchiver(store);
182
179
  const anchorBlockStore = new AnchorBlockStore(store);
183
180
  const stateMachine = await TXEStateMachine.create(archiver, anchorBlockStore, contractStore, noteStore);
@@ -200,13 +197,12 @@ export class TXESession implements TXESessionStateHandler {
200
197
  senderAddressBookStore,
201
198
  capsuleStore,
202
199
  privateEventStore,
203
- initialJobId,
204
200
  nextBlockTimestamp,
205
201
  version,
206
202
  chainId,
207
203
  new Map(),
208
204
  );
209
- await topLevelOracleHandler.txeAdvanceBlocksBy(1);
205
+ await topLevelOracleHandler.advanceBlocksBy(1);
210
206
 
211
207
  return new TXESession(
212
208
  createLogger('txe:session'),
@@ -261,6 +257,17 @@ export class TXESession implements TXESessionStateHandler {
261
257
  }
262
258
  }
263
259
 
260
+ getCurrentJob(): string {
261
+ return this.currentJobId;
262
+ }
263
+
264
+ /** Commits the current job and begins a new one. Returns the new job ID. */
265
+ async cycleJob(): Promise<string> {
266
+ await this.jobCoordinator.commitJob(this.currentJobId);
267
+ this.currentJobId = this.jobCoordinator.beginJob();
268
+ return this.currentJobId;
269
+ }
270
+
264
271
  async enterTopLevelState() {
265
272
  switch (this.state.name) {
266
273
  case 'PRIVATE': {
@@ -284,8 +291,7 @@ export class TXESession implements TXESessionStateHandler {
284
291
  }
285
292
 
286
293
  // Commit all staged stores from the job that was just completed, then begin a new job
287
- await this.jobCoordinator.commitJob(this.currentJobId);
288
- this.currentJobId = this.jobCoordinator.beginJob();
294
+ await this.cycleJob();
289
295
 
290
296
  this.oracleHandler = new TXEOracleTopLevelContext(
291
297
  this.stateMachine,
@@ -299,7 +305,6 @@ export class TXESession implements TXESessionStateHandler {
299
305
  this.senderAddressBookStore,
300
306
  this.capsuleStore,
301
307
  this.privateEventStore,
302
- this.currentJobId,
303
308
  this.nextBlockTimestamp,
304
309
  this.version,
305
310
  this.chainId,
@@ -323,6 +328,7 @@ export class TXESession implements TXESessionStateHandler {
323
328
 
324
329
  await new NoteService(this.noteStore, this.stateMachine.node, anchorBlock!, this.currentJobId).syncNoteNullifiers(
325
330
  contractAddress,
331
+ 'ALL_SCOPES',
326
332
  );
327
333
  const latestBlock = await this.stateMachine.node.getBlockHeader('latest');
328
334
 
@@ -339,30 +345,31 @@ export class TXESession implements TXESessionStateHandler {
339
345
  const taggingIndexCache = new ExecutionTaggingIndexCache();
340
346
 
341
347
  const utilityExecutor = this.utilityExecutorForContractSync(anchorBlock);
342
- this.oracleHandler = new PrivateExecutionOracle(
343
- Fr.ZERO,
344
- new TxContext(this.chainId, this.version, GasSettings.empty()),
345
- new CallContext(AztecAddress.ZERO, contractAddress, FunctionSelector.empty(), false),
346
- anchorBlock!,
348
+ this.oracleHandler = new PrivateExecutionOracle({
349
+ argsHash: Fr.ZERO,
350
+ txContext: new TxContext(this.chainId, this.version, GasSettings.empty()),
351
+ callContext: new CallContext(AztecAddress.ZERO, contractAddress, FunctionSelector.empty(), false),
352
+ anchorBlockHeader: anchorBlock!,
347
353
  utilityExecutor,
348
- [],
349
- [],
350
- new HashedValuesCache(),
354
+ authWitnesses: [],
355
+ capsules: [],
356
+ executionCache: new HashedValuesCache(),
351
357
  noteCache,
352
358
  taggingIndexCache,
353
- this.contractStore,
354
- this.noteStore,
355
- this.keyStore,
356
- this.addressStore,
357
- this.stateMachine.node,
358
- this.senderTaggingStore,
359
- this.recipientTaggingStore,
360
- this.senderAddressBookStore,
361
- this.capsuleStore,
362
- this.privateEventStore,
363
- this.stateMachine.contractSyncService,
364
- this.currentJobId,
365
- );
359
+ contractStore: this.contractStore,
360
+ noteStore: this.noteStore,
361
+ keyStore: this.keyStore,
362
+ addressStore: this.addressStore,
363
+ aztecNode: this.stateMachine.node,
364
+ senderTaggingStore: this.senderTaggingStore,
365
+ recipientTaggingStore: this.recipientTaggingStore,
366
+ senderAddressBookStore: this.senderAddressBookStore,
367
+ capsuleStore: this.capsuleStore,
368
+ privateEventStore: this.privateEventStore,
369
+ contractSyncService: this.stateMachine.contractSyncService,
370
+ jobId: this.currentJobId,
371
+ scopes: 'ALL_SCOPES',
372
+ });
366
373
 
367
374
  // We store the note and tagging index caches fed into the PrivateExecutionOracle (along with some other auxiliary
368
375
  // data) in order to refer to it later, mimicking the way this object is used by the ContractFunctionSimulator. The
@@ -414,24 +421,25 @@ export class TXESession implements TXESessionStateHandler {
414
421
  this.stateMachine.node,
415
422
  anchorBlockHeader,
416
423
  this.currentJobId,
417
- ).syncNoteNullifiers(contractAddress);
424
+ ).syncNoteNullifiers(contractAddress, 'ALL_SCOPES');
418
425
 
419
- this.oracleHandler = new UtilityExecutionOracle(
426
+ this.oracleHandler = new UtilityExecutionOracle({
420
427
  contractAddress,
421
- [],
422
- [],
428
+ authWitnesses: [],
429
+ capsules: [],
423
430
  anchorBlockHeader,
424
- this.contractStore,
425
- this.noteStore,
426
- this.keyStore,
427
- this.addressStore,
428
- this.stateMachine.node,
429
- this.recipientTaggingStore,
430
- this.senderAddressBookStore,
431
- this.capsuleStore,
432
- this.privateEventStore,
433
- this.currentJobId,
434
- );
431
+ contractStore: this.contractStore,
432
+ noteStore: this.noteStore,
433
+ keyStore: this.keyStore,
434
+ addressStore: this.addressStore,
435
+ aztecNode: this.stateMachine.node,
436
+ recipientTaggingStore: this.recipientTaggingStore,
437
+ senderAddressBookStore: this.senderAddressBookStore,
438
+ capsuleStore: this.capsuleStore,
439
+ privateEventStore: this.privateEventStore,
440
+ jobId: this.currentJobId,
441
+ scopes: 'ALL_SCOPES',
442
+ });
435
443
 
436
444
  this.state = { name: 'UTILITY' };
437
445
  this.logger.debug(`Entered state ${this.state.name}`);
@@ -444,8 +452,8 @@ export class TXESession implements TXESessionStateHandler {
444
452
 
445
453
  // Note that while all public and private contexts do is build a single block that we then process when exiting
446
454
  // those, the top level context performs a large number of actions not captured in the following 'close' call. Among
447
- // others, it will create empty blocks (via `txeAdvanceBlocksBy` and `deploy`), create blocks with transactions via
448
- // `txePrivateCallNewFlow` and `txePublicCallNewFlow`, add accounts to PXE via `txeAddAccount`, etc. This is a
455
+ // others, it will create empty blocks (via `advanceBlocksBy` and `deploy`), create blocks with transactions via
456
+ // `privateCallNewFlow` and `publicCallNewFlow`, add accounts to PXE via `addAccount`, etc. This is a
449
457
  // slight inconsistency in the working model of this class, but is not too bad.
450
458
  // TODO: it's quite unfortunate that we need to capture the authwits created to later pass them again when the top
451
459
  // level context is re-created. This is because authwits create a temporary utility context that'd otherwise reset
@@ -499,29 +507,30 @@ export class TXESession implements TXESessionStateHandler {
499
507
  }
500
508
 
501
509
  private utilityExecutorForContractSync(anchorBlock: any) {
502
- return async (call: FunctionCall) => {
510
+ return async (call: FunctionCall, scopes: AccessScopes) => {
503
511
  const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
504
512
  if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
505
513
  throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
506
514
  }
507
515
 
508
516
  try {
509
- const oracle = new UtilityExecutionOracle(
510
- call.to,
511
- [],
512
- [],
513
- anchorBlock!,
514
- this.contractStore,
515
- this.noteStore,
516
- this.keyStore,
517
- this.addressStore,
518
- this.stateMachine.node,
519
- this.recipientTaggingStore,
520
- this.senderAddressBookStore,
521
- this.capsuleStore,
522
- this.privateEventStore,
523
- this.currentJobId,
524
- );
517
+ const oracle = new UtilityExecutionOracle({
518
+ contractAddress: call.to,
519
+ authWitnesses: [],
520
+ capsules: [],
521
+ anchorBlockHeader: anchorBlock!,
522
+ contractStore: this.contractStore,
523
+ noteStore: this.noteStore,
524
+ keyStore: this.keyStore,
525
+ addressStore: this.addressStore,
526
+ aztecNode: this.stateMachine.node,
527
+ recipientTaggingStore: this.recipientTaggingStore,
528
+ senderAddressBookStore: this.senderAddressBookStore,
529
+ capsuleStore: this.capsuleStore,
530
+ privateEventStore: this.privateEventStore,
531
+ jobId: this.currentJobId,
532
+ scopes,
533
+ });
525
534
  await new WASMSimulator()
526
535
  .executeUserCircuit(toACVMWitness(0, call.args), entryPointArtifact, new Oracle(oracle).toACIRCallback())
527
536
  .catch((err: Error) => {
@@ -1,19 +1,11 @@
1
1
  import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import type { ContractStore } from '@aztec/pxe/server';
4
- import { type ContractArtifact, FunctionSelector, FunctionType } from '@aztec/stdlib/abi';
4
+ import { type ContractArtifact, FunctionSelector } from '@aztec/stdlib/abi';
5
5
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
6
- import {
7
- type ContractClassPublic,
8
- type ContractDataSource,
9
- type ContractInstanceWithAddress,
10
- computePrivateFunctionsRoot,
11
- computePublicBytecodeCommitment,
12
- getContractClassPrivateFunctionFromArtifact,
13
- } from '@aztec/stdlib/contract';
6
+ import type { ContractClassPublic, ContractDataSource, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
14
7
 
15
8
  export class TXEPublicContractDataSource implements ContractDataSource {
16
- #privateFunctionsRoot: Map<string, Buffer> = new Map();
17
9
  constructor(
18
10
  private blockNumber: BlockNumber,
19
11
  private contractStore: ContractStore,
@@ -24,42 +16,24 @@ export class TXEPublicContractDataSource implements ContractDataSource {
24
16
  }
25
17
 
26
18
  async getContractClass(id: Fr): Promise<ContractClassPublic | undefined> {
27
- const contractClass = await this.contractStore.getContractClass(id);
19
+ const contractClass = await this.contractStore.getContractClassWithPreimage(id);
28
20
  if (!contractClass) {
29
21
  return;
30
22
  }
31
- const artifact = await this.contractStore.getContractArtifact(id);
32
- if (!artifact) {
33
- return;
34
- }
35
-
36
- let privateFunctionsRoot;
37
- if (!this.#privateFunctionsRoot.has(id.toString())) {
38
- const privateFunctions = await Promise.all(
39
- artifact.functions
40
- .filter(fn => fn.functionType === FunctionType.PRIVATE)
41
- .map(fn => getContractClassPrivateFunctionFromArtifact(fn)),
42
- );
43
- privateFunctionsRoot = await computePrivateFunctionsRoot(privateFunctions);
44
- this.#privateFunctionsRoot.set(id.toString(), privateFunctionsRoot.toBuffer());
45
- } else {
46
- privateFunctionsRoot = Fr.fromBuffer(this.#privateFunctionsRoot.get(id.toString())!);
47
- }
48
-
49
23
  return {
50
- id,
51
- artifactHash: contractClass!.artifactHash,
52
- packedBytecode: contractClass!.packedBytecode,
53
- privateFunctionsRoot,
54
- version: contractClass!.version,
24
+ id: contractClass.id,
25
+ artifactHash: contractClass.artifactHash,
26
+ packedBytecode: contractClass.packedBytecode,
27
+ privateFunctionsRoot: contractClass.privateFunctionsRoot,
28
+ version: contractClass.version,
55
29
  privateFunctions: [],
56
30
  utilityFunctions: [],
57
31
  };
58
32
  }
59
33
 
60
34
  async getBytecodeCommitment(id: Fr): Promise<Fr | undefined> {
61
- const contractClass = await this.contractStore.getContractClass(id);
62
- return contractClass && computePublicBytecodeCommitment(contractClass.packedBytecode);
35
+ const contractClass = await this.contractStore.getContractClassWithPreimage(id);
36
+ return contractClass?.publicBytecodeCommitment;
63
37
  }
64
38
 
65
39
  async getContract(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
@@ -1,12 +0,0 @@
1
- import type { ContractArtifact } from '@aztec/aztec.js/abi';
2
- import { Fr } from '@aztec/aztec.js/fields';
3
- import { ContractStore } from '@aztec/pxe/server';
4
- export type ContractArtifactWithHash = ContractArtifact & {
5
- artifactHash: Fr;
6
- };
7
- export declare class TXEContractStore extends ContractStore {
8
- #private;
9
- addContractArtifact(id: Fr, artifact: ContractArtifact | ContractArtifactWithHash): Promise<void>;
10
- getContractArtifact(contractClassId: Fr): Promise<ContractArtifact | ContractArtifactWithHash | undefined>;
11
- }
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX2NvbnRyYWN0X3N0b3JlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC90eGVfY29udHJhY3Rfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE1BQU0sTUFBTSx3QkFBd0IsR0FBRyxnQkFBZ0IsR0FBRztJQUFFLFlBQVksRUFBRSxFQUFFLENBQUE7Q0FBRSxDQUFDO0FBTy9FLHFCQUFhLGdCQUFpQixTQUFRLGFBQWE7O0lBRzNCLG1CQUFtQixDQUN2QyxFQUFFLEVBQUUsRUFBRSxFQUNOLFFBQVEsRUFBRSxnQkFBZ0IsR0FBRyx3QkFBd0IsR0FDcEQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUtmO0lBRXFCLG1CQUFtQixDQUN2QyxlQUFlLEVBQUUsRUFBRSxHQUNsQixPQUFPLENBQUMsZ0JBQWdCLEdBQUcsd0JBQXdCLEdBQUcsU0FBUyxDQUFDLENBUWxFO0NBQ0YifQ==
@@ -1 +0,0 @@
1
- {"version":3,"file":"txe_contract_store.d.ts","sourceRoot":"","sources":["../../src/util/txe_contract_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,MAAM,wBAAwB,GAAG,gBAAgB,GAAG;IAAE,YAAY,EAAE,EAAE,CAAA;CAAE,CAAC;AAO/E,qBAAa,gBAAiB,SAAQ,aAAa;;IAG3B,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,QAAQ,EAAE,gBAAgB,GAAG,wBAAwB,GACpD,OAAO,CAAC,IAAI,CAAC,CAKf;IAEqB,mBAAmB,CACvC,eAAe,EAAE,EAAE,GAClB,OAAO,CAAC,gBAAgB,GAAG,wBAAwB,GAAG,SAAS,CAAC,CAQlE;CACF"}
@@ -1,22 +0,0 @@
1
- import { Fr } from '@aztec/aztec.js/fields';
2
- import { ContractStore } from '@aztec/pxe/server';
3
- /*
4
- * A contract store that stores contract artifacts with their hashes. Since
5
- * TXE typically deploys the same contract again and again for multiple tests, caching
6
- * the *very* expensive artifact hash computation improves testing speed significantly.
7
- */ export class TXEContractStore extends ContractStore {
8
- #artifactHashes = new Map();
9
- async addContractArtifact(id, artifact) {
10
- if ('artifactHash' in artifact) {
11
- this.#artifactHashes.set(id.toString(), artifact.artifactHash.toBuffer());
12
- }
13
- await super.addContractArtifact(id, artifact);
14
- }
15
- async getContractArtifact(contractClassId) {
16
- const artifact = await super.getContractArtifact(contractClassId);
17
- if (artifact && this.#artifactHashes.has(contractClassId.toString())) {
18
- artifact.artifactHash = Fr.fromBuffer(this.#artifactHashes.get(contractClassId.toString()));
19
- }
20
- return artifact;
21
- }
22
- }
@@ -1,36 +0,0 @@
1
- import type { ContractArtifact } from '@aztec/aztec.js/abi';
2
- import { Fr } from '@aztec/aztec.js/fields';
3
- import { ContractStore } from '@aztec/pxe/server';
4
-
5
- export type ContractArtifactWithHash = ContractArtifact & { artifactHash: Fr };
6
-
7
- /*
8
- * A contract store that stores contract artifacts with their hashes. Since
9
- * TXE typically deploys the same contract again and again for multiple tests, caching
10
- * the *very* expensive artifact hash computation improves testing speed significantly.
11
- */
12
- export class TXEContractStore extends ContractStore {
13
- #artifactHashes: Map<string, Buffer> = new Map();
14
-
15
- public override async addContractArtifact(
16
- id: Fr,
17
- artifact: ContractArtifact | ContractArtifactWithHash,
18
- ): Promise<void> {
19
- if ('artifactHash' in artifact) {
20
- this.#artifactHashes.set(id.toString(), artifact.artifactHash.toBuffer());
21
- }
22
- await super.addContractArtifact(id, artifact);
23
- }
24
-
25
- public override async getContractArtifact(
26
- contractClassId: Fr,
27
- ): Promise<ContractArtifact | ContractArtifactWithHash | undefined> {
28
- const artifact = await super.getContractArtifact(contractClassId);
29
- if (artifact && this.#artifactHashes.has(contractClassId.toString())) {
30
- (artifact as ContractArtifactWithHash).artifactHash = Fr.fromBuffer(
31
- this.#artifactHashes.get(contractClassId.toString())!,
32
- );
33
- }
34
- return artifact;
35
- }
36
- }