@aztec/txe 0.0.0-test.1 → 0.0.1-commit.001888fc

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 (96) hide show
  1. package/dest/bin/index.d.ts +1 -1
  2. package/dest/bin/index.js +3 -2
  3. package/dest/constants.d.ts +3 -0
  4. package/dest/constants.d.ts.map +1 -0
  5. package/dest/constants.js +2 -0
  6. package/dest/index.d.ts +1 -1
  7. package/dest/index.d.ts.map +1 -1
  8. package/dest/index.js +146 -82
  9. package/dest/oracle/interfaces.d.ts +58 -0
  10. package/dest/oracle/interfaces.d.ts.map +1 -0
  11. package/dest/oracle/interfaces.js +3 -0
  12. package/dest/oracle/txe_oracle_public_context.d.ts +34 -0
  13. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -0
  14. package/dest/oracle/txe_oracle_public_context.js +122 -0
  15. package/dest/oracle/txe_oracle_top_level_context.d.ts +65 -0
  16. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -0
  17. package/dest/oracle/txe_oracle_top_level_context.js +542 -0
  18. package/dest/rpc_translator.d.ts +254 -0
  19. package/dest/rpc_translator.d.ts.map +1 -0
  20. package/dest/rpc_translator.js +791 -0
  21. package/dest/state_machine/archiver.d.ts +31 -0
  22. package/dest/state_machine/archiver.d.ts.map +1 -0
  23. package/dest/state_machine/archiver.js +85 -0
  24. package/dest/state_machine/dummy_p2p_client.d.ts +59 -0
  25. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -0
  26. package/dest/state_machine/dummy_p2p_client.js +153 -0
  27. package/dest/state_machine/global_variable_builder.d.ts +11 -0
  28. package/dest/state_machine/global_variable_builder.d.ts.map +1 -0
  29. package/dest/state_machine/global_variable_builder.js +22 -0
  30. package/dest/state_machine/index.d.ts +18 -0
  31. package/dest/state_machine/index.d.ts.map +1 -0
  32. package/dest/state_machine/index.js +72 -0
  33. package/dest/state_machine/mock_epoch_cache.d.ts +29 -0
  34. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -0
  35. package/dest/state_machine/mock_epoch_cache.js +58 -0
  36. package/dest/state_machine/synchronizer.d.ts +33 -0
  37. package/dest/state_machine/synchronizer.d.ts.map +1 -0
  38. package/dest/state_machine/synchronizer.js +59 -0
  39. package/dest/txe_session.d.ts +78 -0
  40. package/dest/txe_session.d.ts.map +1 -0
  41. package/dest/txe_session.js +364 -0
  42. package/dest/util/encoding.d.ts +641 -24
  43. package/dest/util/encoding.d.ts.map +1 -1
  44. package/dest/util/encoding.js +66 -11
  45. package/dest/util/expected_failure_error.d.ts +1 -1
  46. package/dest/util/expected_failure_error.d.ts.map +1 -1
  47. package/dest/util/txe_account_store.d.ts +10 -0
  48. package/dest/util/txe_account_store.d.ts.map +1 -0
  49. package/dest/util/{txe_account_data_provider.js → txe_account_store.js} +1 -1
  50. package/dest/util/txe_public_contract_data_source.d.ts +11 -11
  51. package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
  52. package/dest/util/txe_public_contract_data_source.js +21 -59
  53. package/dest/utils/block_creation.d.ts +28 -0
  54. package/dest/utils/block_creation.d.ts.map +1 -0
  55. package/dest/utils/block_creation.js +58 -0
  56. package/dest/utils/tx_effect_creation.d.ts +5 -0
  57. package/dest/utils/tx_effect_creation.d.ts.map +1 -0
  58. package/dest/utils/tx_effect_creation.js +13 -0
  59. package/package.json +30 -24
  60. package/src/bin/index.ts +3 -2
  61. package/src/constants.ts +3 -0
  62. package/src/index.ts +171 -103
  63. package/src/oracle/interfaces.ts +87 -0
  64. package/src/oracle/txe_oracle_public_context.ts +158 -0
  65. package/src/oracle/txe_oracle_top_level_context.ts +782 -0
  66. package/src/rpc_translator.ts +1218 -0
  67. package/src/state_machine/archiver.ts +97 -0
  68. package/src/state_machine/dummy_p2p_client.ts +227 -0
  69. package/src/state_machine/global_variable_builder.ts +38 -0
  70. package/src/state_machine/index.ts +120 -0
  71. package/src/state_machine/mock_epoch_cache.ts +72 -0
  72. package/src/state_machine/synchronizer.ts +88 -0
  73. package/src/txe_session.ts +556 -0
  74. package/src/util/encoding.ts +85 -11
  75. package/src/util/{txe_account_data_provider.ts → txe_account_store.ts} +1 -1
  76. package/src/util/txe_public_contract_data_source.ts +28 -69
  77. package/src/utils/block_creation.ts +97 -0
  78. package/src/utils/tx_effect_creation.ts +30 -0
  79. package/dest/node/txe_node.d.ts +0 -358
  80. package/dest/node/txe_node.d.ts.map +0 -1
  81. package/dest/node/txe_node.js +0 -504
  82. package/dest/oracle/txe_oracle.d.ts +0 -152
  83. package/dest/oracle/txe_oracle.d.ts.map +0 -1
  84. package/dest/oracle/txe_oracle.js +0 -833
  85. package/dest/txe_service/txe_service.d.ts +0 -212
  86. package/dest/txe_service/txe_service.d.ts.map +0 -1
  87. package/dest/txe_service/txe_service.js +0 -572
  88. package/dest/util/txe_account_data_provider.d.ts +0 -10
  89. package/dest/util/txe_account_data_provider.d.ts.map +0 -1
  90. package/dest/util/txe_world_state_db.d.ts +0 -14
  91. package/dest/util/txe_world_state_db.d.ts.map +0 -1
  92. package/dest/util/txe_world_state_db.js +0 -27
  93. package/src/node/txe_node.ts +0 -725
  94. package/src/oracle/txe_oracle.ts +0 -1241
  95. package/src/txe_service/txe_service.ts +0 -749
  96. package/src/util/txe_world_state_db.ts +0 -38
@@ -0,0 +1,65 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
+ import type { KeyStore } from '@aztec/key-store';
4
+ import { AddressStore, CapsuleStore, type ContractStore, NoteStore, PrivateEventStore, RecipientTaggingStore, SenderAddressBookStore, SenderTaggingStore } from '@aztec/pxe/server';
5
+ import { type IMiscOracle } from '@aztec/pxe/simulator';
6
+ import { type ContractArtifact, EventSelector, FunctionSelector } from '@aztec/stdlib/abi';
7
+ import { AuthWitness } from '@aztec/stdlib/auth-witness';
8
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
9
+ import { type ContractInstanceWithAddress } from '@aztec/stdlib/contract';
10
+ import { TxHash } from '@aztec/stdlib/tx';
11
+ import type { UInt64 } from '@aztec/stdlib/types';
12
+ import type { TXEStateMachine } from '../state_machine/index.js';
13
+ import type { TXEAccountStore } from '../util/txe_account_store.js';
14
+ import type { ITxeExecutionOracle } from './interfaces.js';
15
+ export declare class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracle {
16
+ private stateMachine;
17
+ private contractStore;
18
+ private noteStore;
19
+ private keyStore;
20
+ private addressStore;
21
+ private accountStore;
22
+ private senderTaggingStore;
23
+ private recipientTaggingStore;
24
+ private senderAddressBookStore;
25
+ private capsuleStore;
26
+ private privateEventStore;
27
+ private nextBlockTimestamp;
28
+ private version;
29
+ private chainId;
30
+ private authwits;
31
+ isMisc: true;
32
+ isTxe: true;
33
+ private logger;
34
+ constructor(stateMachine: TXEStateMachine, contractStore: ContractStore, noteStore: NoteStore, keyStore: KeyStore, addressStore: AddressStore, accountStore: TXEAccountStore, senderTaggingStore: SenderTaggingStore, recipientTaggingStore: RecipientTaggingStore, senderAddressBookStore: SenderAddressBookStore, capsuleStore: CapsuleStore, privateEventStore: PrivateEventStore, nextBlockTimestamp: bigint, version: Fr, chainId: Fr, authwits: Map<string, AuthWitness>);
35
+ assertCompatibleOracleVersion(version: number): void;
36
+ getRandomField(): Fr;
37
+ log(level: number, message: string, fields: Fr[]): Promise<void>;
38
+ getDefaultAddress(): AztecAddress;
39
+ getNextBlockNumber(): Promise<BlockNumber>;
40
+ getNextBlockTimestamp(): Promise<bigint>;
41
+ getLastBlockTimestamp(): Promise<bigint>;
42
+ getLastTxEffects(): Promise<{
43
+ txHash: TxHash;
44
+ noteHashes: Fr[];
45
+ nullifiers: Fr[];
46
+ }>;
47
+ syncContractNonOracleMethod(contractAddress: AztecAddress, scope: AztecAddress, jobId: string): Promise<void>;
48
+ getPrivateEvents(selector: EventSelector, contractAddress: AztecAddress, scope: AztecAddress): Promise<Fr[][]>;
49
+ advanceBlocksBy(blocks: number): Promise<void>;
50
+ advanceTimestampBy(duration: UInt64): void;
51
+ deploy(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: Fr): Promise<void>;
52
+ addAccount(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: Fr): Promise<import("@aztec/stdlib/contract").CompleteAddress>;
53
+ createAccount(secret: Fr): Promise<import("@aztec/stdlib/contract").CompleteAddress>;
54
+ addAuthWitness(address: AztecAddress, messageHash: Fr): Promise<void>;
55
+ mineBlock(options?: {
56
+ nullifiers?: Fr[];
57
+ }): Promise<void>;
58
+ privateCallNewFlow(from: AztecAddress, targetContractAddress: AztecAddress | undefined, functionSelector: FunctionSelector | undefined, args: Fr[], argsHash: Fr | undefined, isStaticCall: boolean | undefined, jobId: string): Promise<Fr[]>;
59
+ publicCallNewFlow(from: AztecAddress, targetContractAddress: AztecAddress, calldata: Fr[], isStaticCall: boolean): Promise<Fr[]>;
60
+ executeUtilityFunction(targetContractAddress: AztecAddress, functionSelector: FunctionSelector, args: Fr[], jobId: string): Promise<Fr[]>;
61
+ private executeUtilityCall;
62
+ close(): [bigint, Map<string, AuthWitness>];
63
+ private getLastBlockNumber;
64
+ }
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX29yYWNsZV90b3BfbGV2ZWxfY29udGV4dC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29yYWNsZS90eGVfb3JhY2xlX3RvcF9sZXZlbF9jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHcEQsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakQsT0FBTyxFQUNMLFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxhQUFhLEVBQ2xCLFNBQVMsRUFFVCxpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixrQkFBa0IsRUFFbkIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBSUwsS0FBSyxXQUFXLEVBTWpCLE1BQU0sc0JBQXNCLENBQUM7QUFnQjlCLE9BQU8sRUFBRSxLQUFLLGdCQUFnQixFQUFFLGFBQWEsRUFBZ0IsZ0JBQWdCLEVBQWdCLE1BQU0sbUJBQW1CLENBQUM7QUFDdkgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsS0FBSywyQkFBMkIsRUFBeUIsTUFBTSx3QkFBd0IsQ0FBQztBQVlqRyxPQUFPLEVBU0wsTUFBTSxFQUVQLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFJbEQsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHcEUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVB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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txe_oracle_top_level_context.d.ts","sourceRoot":"","sources":["../../src/oracle/txe_oracle_top_level_context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,542 @@
1
+ import { CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS, DEFAULT_DA_GAS_LIMIT, DEFAULT_L2_GAS_LIMIT, DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
2
+ import { BlockNumber } from '@aztec/foundation/branded-types';
3
+ import { Schnorr } from '@aztec/foundation/crypto/schnorr';
4
+ import { Fr } from '@aztec/foundation/curves/bn254';
5
+ import { LogLevels, applyStringFormatting, createLogger } from '@aztec/foundation/log';
6
+ import { TestDateProvider } from '@aztec/foundation/timer';
7
+ import { ORACLE_VERSION, enrichPublicSimulationError } from '@aztec/pxe/server';
8
+ import { ExecutionNoteCache, ExecutionTaggingIndexCache, HashedValuesCache, Oracle, PrivateExecutionOracle, UtilityExecutionOracle, executePrivateFunction, generateSimulatedProvingResult } from '@aztec/pxe/simulator';
9
+ import { ExecutionError, WASMSimulator, createSimulationError, extractCallStack, resolveAssertionMessageFromError, toACVMWitness, witnessMapToFields } from '@aztec/simulator/client';
10
+ import { CppPublicTxSimulator, GuardedMerkleTreeOperations, PublicContractsDB, PublicProcessor } from '@aztec/simulator/server';
11
+ import { FunctionCall, FunctionSelector, FunctionType } from '@aztec/stdlib/abi';
12
+ import { AuthWitness } from '@aztec/stdlib/auth-witness';
13
+ import { PublicSimulatorConfig } from '@aztec/stdlib/avm';
14
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
15
+ import { computePartialAddress } from '@aztec/stdlib/contract';
16
+ import { Gas, GasFees, GasSettings } from '@aztec/stdlib/gas';
17
+ import { computeCalldataHash, computeProtocolNullifier, siloNullifier } from '@aztec/stdlib/hash';
18
+ import { PartialPrivateTailPublicInputsForPublic, PrivateKernelTailCircuitPublicInputs, PrivateToPublicAccumulatedData, PublicCallRequest } from '@aztec/stdlib/kernel';
19
+ import { ChonkProof } from '@aztec/stdlib/proofs';
20
+ import { makeGlobalVariables } from '@aztec/stdlib/testing';
21
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
22
+ import { CallContext, HashedValues, PrivateExecutionResult, Tx, TxConstantData, TxContext, TxEffect, TxHash, collectNested } from '@aztec/stdlib/tx';
23
+ import { ForkCheckpoint } from '@aztec/world-state';
24
+ import { DEFAULT_ADDRESS } from '../constants.js';
25
+ import { TXEPublicContractDataSource } from '../util/txe_public_contract_data_source.js';
26
+ import { getSingleTxBlockRequestHash, insertTxEffectIntoWorldTrees, makeTXEBlock } from '../utils/block_creation.js';
27
+ export class TXEOracleTopLevelContext {
28
+ stateMachine;
29
+ contractStore;
30
+ noteStore;
31
+ keyStore;
32
+ addressStore;
33
+ accountStore;
34
+ senderTaggingStore;
35
+ recipientTaggingStore;
36
+ senderAddressBookStore;
37
+ capsuleStore;
38
+ privateEventStore;
39
+ nextBlockTimestamp;
40
+ version;
41
+ chainId;
42
+ authwits;
43
+ isMisc;
44
+ isTxe;
45
+ logger;
46
+ constructor(stateMachine, contractStore, noteStore, keyStore, addressStore, accountStore, senderTaggingStore, recipientTaggingStore, senderAddressBookStore, capsuleStore, privateEventStore, nextBlockTimestamp, version, chainId, authwits){
47
+ this.stateMachine = stateMachine;
48
+ this.contractStore = contractStore;
49
+ this.noteStore = noteStore;
50
+ this.keyStore = keyStore;
51
+ this.addressStore = addressStore;
52
+ this.accountStore = accountStore;
53
+ this.senderTaggingStore = senderTaggingStore;
54
+ this.recipientTaggingStore = recipientTaggingStore;
55
+ this.senderAddressBookStore = senderAddressBookStore;
56
+ this.capsuleStore = capsuleStore;
57
+ this.privateEventStore = privateEventStore;
58
+ this.nextBlockTimestamp = nextBlockTimestamp;
59
+ this.version = version;
60
+ this.chainId = chainId;
61
+ this.authwits = authwits;
62
+ this.isMisc = true;
63
+ this.isTxe = true;
64
+ this.logger = createLogger('txe:top_level_context');
65
+ this.logger.debug('Entering Top Level Context');
66
+ }
67
+ assertCompatibleOracleVersion(version) {
68
+ if (version !== ORACLE_VERSION) {
69
+ throw new Error(`Incompatible oracle version. TXE is using version '${ORACLE_VERSION}', but got a request for '${version}'.`);
70
+ }
71
+ }
72
+ // This is typically only invoked in private contexts, but it is convenient to also have it in top-level for testing
73
+ // setup.
74
+ getRandomField() {
75
+ return Fr.random();
76
+ }
77
+ // We instruct users to debug contracts via this oracle, so it makes sense that they'd expect it to also work in tests
78
+ log(level, message, fields) {
79
+ if (!LogLevels[level]) {
80
+ throw new Error(`Invalid log level: ${level}`);
81
+ }
82
+ const levelName = LogLevels[level];
83
+ this.logger[levelName](`${applyStringFormatting(message, fields)}`, {
84
+ module: `${this.logger.module}:debug_log`
85
+ });
86
+ return Promise.resolve();
87
+ }
88
+ getDefaultAddress() {
89
+ return DEFAULT_ADDRESS;
90
+ }
91
+ async getNextBlockNumber() {
92
+ return BlockNumber(await this.getLastBlockNumber() + 1);
93
+ }
94
+ getNextBlockTimestamp() {
95
+ return Promise.resolve(this.nextBlockTimestamp);
96
+ }
97
+ async getLastBlockTimestamp() {
98
+ return (await this.stateMachine.node.getBlockHeader('latest')).globalVariables.timestamp;
99
+ }
100
+ async getLastTxEffects() {
101
+ const latestBlockNumber = await this.stateMachine.archiver.getBlockNumber();
102
+ const block = await this.stateMachine.archiver.getBlock(latestBlockNumber);
103
+ if (block.body.txEffects.length != 1) {
104
+ // Note that calls like env.mine() will result in blocks with no transactions, hitting this
105
+ throw new Error(`Expected a single transaction in the last block, found ${block.body.txEffects.length}`);
106
+ }
107
+ const txEffects = block.body.txEffects[0];
108
+ return {
109
+ txHash: txEffects.txHash,
110
+ noteHashes: txEffects.noteHashes,
111
+ nullifiers: txEffects.nullifiers
112
+ };
113
+ }
114
+ async syncContractNonOracleMethod(contractAddress, scope, jobId) {
115
+ if (contractAddress.equals(DEFAULT_ADDRESS)) {
116
+ this.logger.debug(`Skipping sync in getPrivateEvents because the events correspond to the default address.`);
117
+ return;
118
+ }
119
+ const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
120
+ await this.stateMachine.contractSyncService.ensureContractSynced(contractAddress, null, async (call, execScopes)=>{
121
+ await this.executeUtilityCall(call, execScopes, jobId);
122
+ }, blockHeader, jobId, [
123
+ scope
124
+ ]);
125
+ }
126
+ async getPrivateEvents(selector, contractAddress, scope) {
127
+ return (await this.privateEventStore.getPrivateEvents(selector, {
128
+ contractAddress,
129
+ scopes: [
130
+ scope
131
+ ],
132
+ fromBlock: 0,
133
+ toBlock: await this.getLastBlockNumber() + 1
134
+ })).map((e)=>e.packedEvent);
135
+ }
136
+ async advanceBlocksBy(blocks) {
137
+ this.logger.debug(`time traveling ${blocks} blocks`);
138
+ for(let i = 0; i < blocks; i++){
139
+ await this.mineBlock();
140
+ }
141
+ }
142
+ advanceTimestampBy(duration) {
143
+ this.logger.debug(`time traveling ${duration} seconds`);
144
+ this.nextBlockTimestamp += duration;
145
+ }
146
+ async deploy(artifact, instance, secret) {
147
+ // Emit deployment nullifier
148
+ await this.mineBlock({
149
+ nullifiers: [
150
+ await siloNullifier(AztecAddress.fromNumber(CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS), instance.address.toField())
151
+ ]
152
+ });
153
+ if (!secret.equals(Fr.ZERO)) {
154
+ await this.addAccount(artifact, instance, secret);
155
+ } else {
156
+ await this.contractStore.addContractInstance(instance);
157
+ await this.contractStore.addContractArtifact(artifact);
158
+ this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
159
+ }
160
+ }
161
+ async addAccount(artifact, instance, secret) {
162
+ const partialAddress = await computePartialAddress(instance);
163
+ this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
164
+ await this.contractStore.addContractInstance(instance);
165
+ await this.contractStore.addContractArtifact(artifact);
166
+ const completeAddress = await this.keyStore.addAccount(secret, partialAddress);
167
+ await this.accountStore.setAccount(completeAddress.address, completeAddress);
168
+ await this.addressStore.addCompleteAddress(completeAddress);
169
+ this.logger.debug(`Created account ${completeAddress.address}`);
170
+ return completeAddress;
171
+ }
172
+ async createAccount(secret) {
173
+ // This is a foot gun !
174
+ const completeAddress = await this.keyStore.addAccount(secret, secret);
175
+ await this.accountStore.setAccount(completeAddress.address, completeAddress);
176
+ await this.addressStore.addCompleteAddress(completeAddress);
177
+ this.logger.debug(`Created account ${completeAddress.address}`);
178
+ return completeAddress;
179
+ }
180
+ async addAuthWitness(address, messageHash) {
181
+ const account = await this.accountStore.getAccount(address);
182
+ const privateKey = await this.keyStore.getMasterSecretKey(account.publicKeys.masterIncomingViewingPublicKey);
183
+ const schnorr = new Schnorr();
184
+ const signature = await schnorr.constructSignature(messageHash.toBuffer(), privateKey);
185
+ const authWitness = new AuthWitness(messageHash, [
186
+ ...signature.toBuffer()
187
+ ]);
188
+ this.authwits.set(authWitness.requestHash.toString(), authWitness);
189
+ }
190
+ async mineBlock(options = {}) {
191
+ const blockNumber = await this.getNextBlockNumber();
192
+ const txEffect = TxEffect.empty();
193
+ txEffect.nullifiers = [
194
+ getSingleTxBlockRequestHash(blockNumber),
195
+ ...options.nullifiers ?? []
196
+ ];
197
+ txEffect.txHash = new TxHash(new Fr(blockNumber));
198
+ const forkedWorldTrees = await this.stateMachine.synchronizer.nativeWorldStateService.fork();
199
+ await insertTxEffectIntoWorldTrees(txEffect, forkedWorldTrees);
200
+ const globals = makeGlobalVariables(undefined, {
201
+ blockNumber,
202
+ timestamp: this.nextBlockTimestamp,
203
+ version: this.version,
204
+ chainId: this.chainId
205
+ });
206
+ const block = await makeTXEBlock(forkedWorldTrees, globals, [
207
+ txEffect
208
+ ]);
209
+ await forkedWorldTrees.close();
210
+ this.logger.info(`Created block ${blockNumber} with timestamp ${block.header.globalVariables.timestamp}`);
211
+ await this.stateMachine.handleL2Block(block);
212
+ }
213
+ async privateCallNewFlow(from, targetContractAddress = AztecAddress.zero(), functionSelector = FunctionSelector.empty(), args, argsHash = Fr.zero(), isStaticCall = false, jobId) {
214
+ this.logger.verbose(`Executing external function ${await this.contractStore.getDebugFunctionName(targetContractAddress, functionSelector)}@${targetContractAddress} isStaticCall=${isStaticCall}`);
215
+ const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector);
216
+ if (!artifact) {
217
+ const message = functionSelector.equals(await FunctionSelector.fromSignature('verify_private_authwit(Field)')) ? 'Found no account contract artifact for a private authwit check - use `create_contract_account` instead of `create_light_account` for authwit support.' : 'Function Artifact does not exist';
218
+ throw new Error(message);
219
+ }
220
+ // When `from` is the zero address (e.g. when deploying a new account contract), we return an
221
+ // empty scope list which acts as deny-all: no notes are visible and no keys are accessible.
222
+ const effectiveScopes = from.isZero() ? [] : [
223
+ from
224
+ ];
225
+ // Sync notes before executing private function to discover notes from previous transactions
226
+ const utilityExecutor = async (call, execScopes)=>{
227
+ await this.executeUtilityCall(call, execScopes, jobId);
228
+ };
229
+ const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
230
+ await this.stateMachine.contractSyncService.ensureContractSynced(targetContractAddress, functionSelector, utilityExecutor, blockHeader, jobId, effectiveScopes);
231
+ const blockNumber = await this.getNextBlockNumber();
232
+ const callContext = new CallContext(from, targetContractAddress, functionSelector, isStaticCall);
233
+ const gasLimits = new Gas(DEFAULT_DA_GAS_LIMIT, DEFAULT_L2_GAS_LIMIT);
234
+ const teardownGasLimits = new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT);
235
+ const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty(), GasFees.empty());
236
+ const txContext = new TxContext(this.chainId, this.version, gasSettings);
237
+ const protocolNullifier = await computeProtocolNullifier(getSingleTxBlockRequestHash(blockNumber));
238
+ const noteCache = new ExecutionNoteCache(protocolNullifier);
239
+ // In production, the account contract sets the min revertible counter before calling the app function.
240
+ // Since TXE bypasses the account contract, we simulate this by setting minRevertibleSideEffectCounter to 1,
241
+ // marking all side effects as revertible.
242
+ const minRevertibleSideEffectCounter = 1;
243
+ await noteCache.setMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter);
244
+ const taggingIndexCache = new ExecutionTaggingIndexCache();
245
+ const simulator = new WASMSimulator();
246
+ const privateExecutionOracle = new PrivateExecutionOracle({
247
+ argsHash,
248
+ txContext,
249
+ callContext,
250
+ anchorBlockHeader: blockHeader,
251
+ utilityExecutor,
252
+ authWitnesses: Array.from(this.authwits.values()),
253
+ capsules: [],
254
+ executionCache: HashedValuesCache.create([
255
+ new HashedValues(args, argsHash)
256
+ ]),
257
+ noteCache,
258
+ taggingIndexCache,
259
+ contractStore: this.contractStore,
260
+ noteStore: this.noteStore,
261
+ keyStore: this.keyStore,
262
+ addressStore: this.addressStore,
263
+ aztecNode: this.stateMachine.node,
264
+ senderTaggingStore: this.senderTaggingStore,
265
+ recipientTaggingStore: this.recipientTaggingStore,
266
+ senderAddressBookStore: this.senderAddressBookStore,
267
+ capsuleStore: this.capsuleStore,
268
+ privateEventStore: this.privateEventStore,
269
+ contractSyncService: this.stateMachine.contractSyncService,
270
+ jobId,
271
+ totalPublicCalldataCount: 0,
272
+ sideEffectCounter: minRevertibleSideEffectCounter,
273
+ scopes: effectiveScopes,
274
+ // In TXE, the typical transaction entrypoint is skipped, so we need to simulate the actions that such a
275
+ // contract would perform, including setting senderForTags.
276
+ senderForTags: from,
277
+ simulator,
278
+ messageContextService: this.stateMachine.messageContextService
279
+ });
280
+ // Note: This is a slight modification of simulator.run without any of the checks. Maybe we should modify simulator.run with a boolean value to skip checks.
281
+ let result;
282
+ let executionResult;
283
+ try {
284
+ executionResult = await executePrivateFunction(simulator, privateExecutionOracle, artifact, targetContractAddress, functionSelector);
285
+ const publicCallRequests = collectNested([
286
+ executionResult
287
+ ], (r)=>r.publicInputs.publicCallRequests.getActiveItems().map((r)=>r.inner).concat(r.publicInputs.publicTeardownCallRequest.isEmpty() ? [] : [
288
+ r.publicInputs.publicTeardownCallRequest
289
+ ]));
290
+ const publicFunctionsCalldata = await Promise.all(publicCallRequests.map(async (r)=>{
291
+ const calldata = await privateExecutionOracle.loadFromExecutionCache(r.calldataHash);
292
+ return new HashedValues(calldata, r.calldataHash);
293
+ }));
294
+ noteCache.finish();
295
+ const nonceGenerator = noteCache.getNonceGenerator();
296
+ result = new PrivateExecutionResult(executionResult, nonceGenerator, publicFunctionsCalldata);
297
+ } catch (err) {
298
+ throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
299
+ }
300
+ // According to the protocol rules, there must be at least one nullifier in the tx. The first nullifier is used as
301
+ // the nonce generator for the note hashes.
302
+ // We pass the non-zero minRevertibleSideEffectCounter to make sure the side effects are split correctly.
303
+ const { publicInputs } = await generateSimulatedProvingResult(result, (addr, sel)=>this.contractStore.getDebugFunctionName(addr, sel), this.stateMachine.node, minRevertibleSideEffectCounter);
304
+ const globals = makeGlobalVariables();
305
+ globals.blockNumber = blockNumber;
306
+ globals.timestamp = this.nextBlockTimestamp;
307
+ globals.chainId = this.chainId;
308
+ globals.version = this.version;
309
+ globals.gasFees = GasFees.empty();
310
+ const forkedWorldTrees = await this.stateMachine.synchronizer.nativeWorldStateService.fork();
311
+ const bindings = this.logger.getBindings();
312
+ const contractsDB = new PublicContractsDB(new TXEPublicContractDataSource(blockNumber, this.contractStore), bindings);
313
+ const guardedMerkleTrees = new GuardedMerkleTreeOperations(forkedWorldTrees);
314
+ const config = PublicSimulatorConfig.from({
315
+ skipFeeEnforcement: true,
316
+ collectDebugLogs: true,
317
+ collectHints: false,
318
+ collectStatistics: false,
319
+ collectCallMetadata: true
320
+ });
321
+ const processor = new PublicProcessor(globals, guardedMerkleTrees, contractsDB, new CppPublicTxSimulator(guardedMerkleTrees, contractsDB, globals, config, bindings), new TestDateProvider(), undefined, createLogger('simulator:public-processor', bindings));
322
+ const tx = await Tx.create({
323
+ data: publicInputs,
324
+ chonkProof: ChonkProof.empty(),
325
+ contractClassLogFields: [],
326
+ publicFunctionCalldata: result.publicFunctionCalldata
327
+ });
328
+ let checkpoint;
329
+ if (isStaticCall) {
330
+ checkpoint = await ForkCheckpoint.new(forkedWorldTrees);
331
+ }
332
+ const results = await processor.process([
333
+ tx
334
+ ]);
335
+ const [processedTx] = results[0];
336
+ const failedTxs = results[1];
337
+ if (failedTxs.length !== 0) {
338
+ throw new Error(`Public execution has failed: ${failedTxs[0].error}`);
339
+ } else if (!processedTx.revertCode.isOK()) {
340
+ if (processedTx.revertReason) {
341
+ try {
342
+ await enrichPublicSimulationError(processedTx.revertReason, this.contractStore, this.logger);
343
+ // eslint-disable-next-line no-empty
344
+ } catch {}
345
+ throw new Error(`Contract execution has reverted: ${processedTx.revertReason.getMessage()}`);
346
+ } else {
347
+ throw new Error('Contract execution has reverted');
348
+ }
349
+ }
350
+ if (isStaticCall) {
351
+ await checkpoint.revert();
352
+ await forkedWorldTrees.close();
353
+ return executionResult.returnValues ?? [];
354
+ }
355
+ const txEffect = TxEffect.empty();
356
+ txEffect.noteHashes = processedTx.txEffect.noteHashes;
357
+ txEffect.nullifiers = processedTx.txEffect.nullifiers;
358
+ txEffect.privateLogs = processedTx.txEffect.privateLogs;
359
+ txEffect.publicLogs = processedTx.txEffect.publicLogs;
360
+ txEffect.publicDataWrites = processedTx.txEffect.publicDataWrites;
361
+ txEffect.txHash = new TxHash(new Fr(blockNumber));
362
+ const l1ToL2Messages = Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(0).map(Fr.zero);
363
+ await forkedWorldTrees.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2Messages);
364
+ const l2Block = await makeTXEBlock(forkedWorldTrees, globals, [
365
+ txEffect
366
+ ]);
367
+ await this.stateMachine.handleL2Block(l2Block);
368
+ await forkedWorldTrees.close();
369
+ return executionResult.returnValues ?? [];
370
+ }
371
+ async publicCallNewFlow(from, targetContractAddress, calldata, isStaticCall) {
372
+ this.logger.verbose(`Executing public function ${await this.contractStore.getDebugFunctionName(targetContractAddress, FunctionSelector.fromField(calldata[0]))}@${targetContractAddress} isStaticCall=${isStaticCall}`);
373
+ const blockNumber = await this.getNextBlockNumber();
374
+ const gasLimits = new Gas(DEFAULT_DA_GAS_LIMIT, DEFAULT_L2_GAS_LIMIT);
375
+ const teardownGasLimits = new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT);
376
+ const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty(), GasFees.empty());
377
+ const txContext = new TxContext(this.chainId, this.version, gasSettings);
378
+ const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
379
+ const calldataHash = await computeCalldataHash(calldata);
380
+ const calldataHashedValues = new HashedValues(calldata, calldataHash);
381
+ const globals = makeGlobalVariables();
382
+ globals.blockNumber = blockNumber;
383
+ globals.timestamp = this.nextBlockTimestamp;
384
+ globals.chainId = this.chainId;
385
+ globals.version = this.version;
386
+ globals.gasFees = GasFees.empty();
387
+ const forkedWorldTrees = await this.stateMachine.synchronizer.nativeWorldStateService.fork();
388
+ const bindings2 = this.logger.getBindings();
389
+ const contractsDB = new PublicContractsDB(new TXEPublicContractDataSource(blockNumber, this.contractStore), bindings2);
390
+ const guardedMerkleTrees = new GuardedMerkleTreeOperations(forkedWorldTrees);
391
+ const config = PublicSimulatorConfig.from({
392
+ skipFeeEnforcement: true,
393
+ collectDebugLogs: true,
394
+ collectHints: false,
395
+ collectStatistics: false,
396
+ collectCallMetadata: true
397
+ });
398
+ const simulator = new CppPublicTxSimulator(guardedMerkleTrees, contractsDB, globals, config, bindings2);
399
+ const processor = new PublicProcessor(globals, guardedMerkleTrees, contractsDB, simulator, new TestDateProvider(), undefined, createLogger('simulator:public-processor', bindings2));
400
+ // We're simulating a scenario in which private execution immediately enqueues a public call and halts. The private
401
+ // kernel init would in this case inject a nullifier with the transaction request hash as a non-revertible
402
+ // side-effect, which the AVM then expects to exist in order to use it as the nonce generator when siloing notes as
403
+ // unique.
404
+ const nonRevertibleAccumulatedData = PrivateToPublicAccumulatedData.empty();
405
+ nonRevertibleAccumulatedData.nullifiers[0] = getSingleTxBlockRequestHash(blockNumber);
406
+ // The enqueued public call itself we make be revertible so that the public execution is itself revertible, as tests
407
+ // may require producing reverts.
408
+ const revertibleAccumulatedData = PrivateToPublicAccumulatedData.empty();
409
+ revertibleAccumulatedData.publicCallRequests[0] = new PublicCallRequest(from, targetContractAddress, isStaticCall, calldataHash);
410
+ const inputsForPublic = new PartialPrivateTailPublicInputsForPublic(nonRevertibleAccumulatedData, revertibleAccumulatedData, PublicCallRequest.empty());
411
+ const constantData = new TxConstantData(anchorBlockHeader, txContext, Fr.zero(), Fr.zero());
412
+ const txData = new PrivateKernelTailCircuitPublicInputs(constantData, /*gasUsed=*/ new Gas(0, 0), /*feePayer=*/ AztecAddress.zero(), /*expirationTimestamp=*/ 0n, inputsForPublic, undefined);
413
+ const tx = await Tx.create({
414
+ data: txData,
415
+ chonkProof: ChonkProof.empty(),
416
+ contractClassLogFields: [],
417
+ publicFunctionCalldata: [
418
+ calldataHashedValues
419
+ ]
420
+ });
421
+ let checkpoint;
422
+ if (isStaticCall) {
423
+ checkpoint = await ForkCheckpoint.new(forkedWorldTrees);
424
+ }
425
+ const results = await processor.process([
426
+ tx
427
+ ]);
428
+ const [processedTx] = results[0];
429
+ const failedTxs = results[1];
430
+ if (failedTxs.length !== 0) {
431
+ throw new Error(`Public execution has failed: ${failedTxs[0].error}`);
432
+ } else if (!processedTx.revertCode.isOK()) {
433
+ if (processedTx.revertReason) {
434
+ try {
435
+ await enrichPublicSimulationError(processedTx.revertReason, this.contractStore, this.logger);
436
+ // eslint-disable-next-line no-empty
437
+ } catch {}
438
+ throw new Error(`Contract execution has reverted: ${processedTx.revertReason.getMessage()}`);
439
+ } else {
440
+ throw new Error('Contract execution has reverted');
441
+ }
442
+ }
443
+ const returnValues = results[3][0].values;
444
+ if (isStaticCall) {
445
+ await checkpoint.revert();
446
+ await forkedWorldTrees.close();
447
+ return returnValues ?? [];
448
+ }
449
+ const txEffect = TxEffect.empty();
450
+ txEffect.noteHashes = processedTx.txEffect.noteHashes;
451
+ txEffect.nullifiers = processedTx.txEffect.nullifiers;
452
+ txEffect.privateLogs = processedTx.txEffect.privateLogs;
453
+ txEffect.publicLogs = processedTx.txEffect.publicLogs;
454
+ txEffect.publicDataWrites = processedTx.txEffect.publicDataWrites;
455
+ txEffect.txHash = new TxHash(new Fr(blockNumber));
456
+ const l1ToL2Messages = Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(0).map(Fr.zero);
457
+ await forkedWorldTrees.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2Messages);
458
+ const l2Block = await makeTXEBlock(forkedWorldTrees, globals, [
459
+ txEffect
460
+ ]);
461
+ await this.stateMachine.handleL2Block(l2Block);
462
+ await forkedWorldTrees.close();
463
+ return returnValues ?? [];
464
+ }
465
+ async executeUtilityFunction(targetContractAddress, functionSelector, args, jobId) {
466
+ const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector);
467
+ if (!artifact) {
468
+ throw new Error(`Cannot call ${functionSelector} as there is no artifact found at ${targetContractAddress}.`);
469
+ }
470
+ // Sync notes before executing utility function to discover notes from previous transactions
471
+ const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
472
+ await this.stateMachine.contractSyncService.ensureContractSynced(targetContractAddress, functionSelector, async (call, execScopes)=>{
473
+ await this.executeUtilityCall(call, execScopes, jobId);
474
+ }, blockHeader, jobId, 'ALL_SCOPES');
475
+ const call = FunctionCall.from({
476
+ name: artifact.name,
477
+ to: targetContractAddress,
478
+ selector: functionSelector,
479
+ type: FunctionType.UTILITY,
480
+ hideMsgSender: false,
481
+ isStatic: false,
482
+ args,
483
+ returnTypes: []
484
+ });
485
+ return this.executeUtilityCall(call, 'ALL_SCOPES', jobId);
486
+ }
487
+ async executeUtilityCall(call, scopes, jobId) {
488
+ const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
489
+ if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
490
+ throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
491
+ }
492
+ this.logger.verbose(`Executing utility function ${entryPointArtifact.name}`, {
493
+ contract: call.to,
494
+ selector: call.selector
495
+ });
496
+ try {
497
+ const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
498
+ const oracle = new UtilityExecutionOracle({
499
+ contractAddress: call.to,
500
+ authWitnesses: [],
501
+ capsules: [],
502
+ anchorBlockHeader,
503
+ contractStore: this.contractStore,
504
+ noteStore: this.noteStore,
505
+ keyStore: this.keyStore,
506
+ addressStore: this.addressStore,
507
+ aztecNode: this.stateMachine.node,
508
+ recipientTaggingStore: this.recipientTaggingStore,
509
+ senderAddressBookStore: this.senderAddressBookStore,
510
+ capsuleStore: this.capsuleStore,
511
+ privateEventStore: this.privateEventStore,
512
+ messageContextService: this.stateMachine.messageContextService,
513
+ jobId,
514
+ scopes
515
+ });
516
+ const acirExecutionResult = await new WASMSimulator().executeUserCircuit(toACVMWitness(0, call.args), entryPointArtifact, new Oracle(oracle).toACIRCallback()).catch((err)=>{
517
+ err.message = resolveAssertionMessageFromError(err, entryPointArtifact);
518
+ throw new ExecutionError(err.message, {
519
+ contractAddress: call.to,
520
+ functionSelector: call.selector
521
+ }, extractCallStack(err, entryPointArtifact.debug), {
522
+ cause: err
523
+ });
524
+ });
525
+ this.logger.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
526
+ return witnessMapToFields(acirExecutionResult.returnWitness);
527
+ } catch (err) {
528
+ throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility execution'));
529
+ }
530
+ }
531
+ close() {
532
+ this.logger.debug('Exiting Top Level Context');
533
+ return [
534
+ this.nextBlockTimestamp,
535
+ this.authwits
536
+ ];
537
+ }
538
+ async getLastBlockNumber() {
539
+ const header = await this.stateMachine.node.getBlockHeader('latest');
540
+ return header ? header.globalVariables.blockNumber : BlockNumber.ZERO;
541
+ }
542
+ }