@aztec/txe 0.0.0-test.0 → 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
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env -S node --no-warnings
2
2
  export {};
3
- //# sourceMappingURL=index.d.ts.map
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
package/dest/bin/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env -S node --no-warnings
2
- import { createLogger } from '@aztec/aztec.js';
2
+ import { createLogger } from '@aztec/aztec.js/log';
3
3
  import { startHttpRpcServer } from '@aztec/foundation/json-rpc/server';
4
4
  import { createTXERpcServer } from '../index.js';
5
5
  /**
@@ -14,10 +14,11 @@ import { createTXERpcServer } from '../index.js';
14
14
  logger.info('Received SIGTERM.');
15
15
  process.exit(0);
16
16
  });
17
- const logger = createLogger('txe:service');
17
+ const logger = createLogger('txe:rpc');
18
18
  logger.info(`Setting up TXE...`);
19
19
  const txeServer = createTXERpcServer(logger);
20
20
  const { port } = await startHttpRpcServer(txeServer, {
21
+ host: '127.0.0.1',
21
22
  port: TXE_PORT,
22
23
  timeoutMs: 1e3 * 60 * 5
23
24
  });
@@ -0,0 +1,3 @@
1
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
2
+ export declare const DEFAULT_ADDRESS: AztecAddress;
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUzRCxlQUFPLE1BQU0sZUFBZSxjQUE4QixDQUFDIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,eAAO,MAAM,eAAe,cAA8B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
2
+ export const DEFAULT_ADDRESS = AztecAddress.fromNumber(42);
package/dest/index.d.ts CHANGED
@@ -5,4 +5,4 @@ import type { Logger } from '@aztec/foundation/log';
5
5
  * @returns A TXE RPC server.
6
6
  */
7
7
  export declare function createTXERpcServer(logger: Logger): import("@aztec/foundation/json-rpc/server").SafeJsonRpcServer;
8
- //# sourceMappingURL=index.d.ts.map
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQXFRcEQ7Ozs7R0FJRztBQUNILHdCQUFnQixrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxpRUFJaEQifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AA+LpD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,iEAIhD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAqQpD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,iEAIhD"}
package/dest/index.js CHANGED
@@ -1,16 +1,33 @@
1
1
  import { SchnorrAccountContractArtifact } from '@aztec/accounts/schnorr';
2
- import { AztecAddress, Fr, PublicKeys, deriveKeys, getContractInstanceFromDeployParams, loadContractArtifact } from '@aztec/aztec.js';
2
+ import { loadContractArtifact } from '@aztec/aztec.js/abi';
3
+ import { AztecAddress } from '@aztec/aztec.js/addresses';
4
+ import { getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
5
+ import { Fr } from '@aztec/aztec.js/fields';
6
+ import { PublicKeys, deriveKeys } from '@aztec/aztec.js/keys';
3
7
  import { createSafeJsonRpcServer } from '@aztec/foundation/json-rpc/server';
8
+ import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
4
9
  import { protocolContractNames } from '@aztec/protocol-contracts';
5
10
  import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/providers/bundle';
11
+ import { ContractStore } from '@aztec/pxe/server';
12
+ import { computeArtifactHash } from '@aztec/stdlib/contract';
13
+ import { zodFor } from '@aztec/stdlib/schemas';
14
+ import { createHash } from 'crypto';
15
+ import { createReadStream } from 'fs';
6
16
  import { readFile, readdir } from 'fs/promises';
7
- import { join } from 'path';
17
+ import { join, parse } from 'path';
8
18
  import { z } from 'zod';
9
- import { TXEService } from './txe_service/txe_service.js';
10
- import { ForeignCallArgsSchema, ForeignCallResultSchema, fromArray, fromSingle, toForeignCallResult, toSingle } from './util/encoding.js';
11
- const TXESessions = new Map();
12
- const TXEArtifactsCache = new Map();
13
- const TXEForeignCallInputSchema = z.object({
19
+ import { TXESession } from './txe_session.js';
20
+ import { ForeignCallArgsSchema, ForeignCallResultSchema, addressFromSingle, fromArray, fromSingle, toSingle } from './util/encoding.js';
21
+ const sessions = new Map();
22
+ /*
23
+ * TXE typically has to load the same contract artifacts over and over again for multiple tests,
24
+ * so we cache them here to avoid loading from disk repeatedly.
25
+ *
26
+ * The in-flight map coalesces concurrent requests for the same cache key so that
27
+ * computeArtifactHash (very expensive) is only run once even under parallelism.
28
+ */ const TXEArtifactsCache = new Map();
29
+ const TXEArtifactsCacheInFlight = new Map();
30
+ const TXEForeignCallInputSchema = zodFor()(z.object({
14
31
  // eslint-disable-next-line camelcase
15
32
  session_id: z.number().int().nonnegative(),
16
33
  function: z.string(),
@@ -19,64 +36,96 @@ const TXEForeignCallInputSchema = z.object({
19
36
  // eslint-disable-next-line camelcase
20
37
  package_name: z.string(),
21
38
  inputs: ForeignCallArgsSchema
22
- });
39
+ }));
23
40
  class TXEDispatcher {
24
41
  logger;
25
- protocolContracts;
42
+ contractStore;
26
43
  constructor(logger){
27
44
  this.logger = logger;
28
45
  }
46
+ fastHashFile(path) {
47
+ return new Promise((resolve)=>{
48
+ const fd = createReadStream(path);
49
+ const hash = createHash('sha1');
50
+ hash.setEncoding('hex');
51
+ fd.on('end', function() {
52
+ hash.end();
53
+ resolve(hash.read());
54
+ });
55
+ fd.pipe(hash);
56
+ });
57
+ }
29
58
  async #processDeployInputs({ inputs, root_path: rootPath, package_name: packageName }) {
30
- const [pathStr, contractName, initializer] = inputs.slice(0, 3).map((input)=>fromArray(input).map((char)=>String.fromCharCode(char.toNumber())).join(''));
31
- const decodedArgs = fromArray(inputs[4]);
32
- const secret = fromSingle(inputs[5]);
59
+ const [contractPath, initializer] = inputs.slice(0, 2).map((input)=>fromArray(input).map((char)=>String.fromCharCode(char.toNumber())).join(''));
60
+ const decodedArgs = fromArray(inputs[3]);
61
+ const secret = fromSingle(inputs[4]);
62
+ const salt = fromSingle(inputs[5]);
63
+ const deployer = addressFromSingle(inputs[6]);
33
64
  const publicKeys = secret.equals(Fr.ZERO) ? PublicKeys.default() : (await deriveKeys(secret)).publicKeys;
34
65
  const publicKeysHash = await publicKeys.hash();
35
- const cacheKey = `${pathStr}-${contractName}-${initializer}-${decodedArgs.map((arg)=>arg.toString()).join('-')}-${publicKeysHash.toString()}`;
36
- let artifact;
66
+ let artifactPath = '';
67
+ const { dir: contractDirectory, base: contractFilename } = parse(contractPath);
68
+ if (contractDirectory) {
69
+ if (contractDirectory.includes('@')) {
70
+ // We're deploying a contract that belongs in a workspace
71
+ // env.deploy("../path/to/workspace/root@packageName/contractName")
72
+ const [workspace, pkg] = contractDirectory.split('@');
73
+ const targetPath = join(rootPath, workspace, '/target');
74
+ this.logger.debug(`Looking for compiled artifact in workspace ${targetPath}`);
75
+ artifactPath = join(targetPath, `${pkg}-${contractFilename}.json`);
76
+ } else {
77
+ // We're deploying a standalone external contract
78
+ // env.deploy("../path/to/contract/root/contractName")
79
+ const targetPath = join(rootPath, contractDirectory, '/target');
80
+ this.logger.debug(`Looking for compiled artifact in ${targetPath}`);
81
+ [artifactPath] = (await readdir(targetPath)).filter((file)=>file.endsWith(`-${contractFilename}.json`));
82
+ }
83
+ } else {
84
+ // We're deploying a local contract
85
+ // env.deploy("contractName")
86
+ artifactPath = join(rootPath, './target', `${packageName}-${contractFilename}.json`);
87
+ }
88
+ const fileHash = await this.fastHashFile(artifactPath);
89
+ const cacheKey = `${contractDirectory ?? ''}-${contractFilename}-${initializer}-${decodedArgs.map((arg)=>arg.toString()).join('-')}-${publicKeysHash}-${salt}-${deployer}-${fileHash}`;
37
90
  let instance;
91
+ let artifact;
38
92
  if (TXEArtifactsCache.has(cacheKey)) {
39
93
  this.logger.debug(`Using cached artifact for ${cacheKey}`);
40
94
  ({ artifact, instance } = TXEArtifactsCache.get(cacheKey));
41
95
  } else {
42
- let artifactPath = '';
43
- // We're deploying the contract under test
44
- // env.deploy_self("contractName")
45
- if (!pathStr) {
46
- artifactPath = join(rootPath, './target', `${packageName}-${contractName}.json`);
47
- } else {
48
- // We're deploying a contract that belongs in a workspace
49
- // env.deploy("../path/to/workspace/root@packageName", "contractName")
50
- if (pathStr.includes('@')) {
51
- const [workspace, pkg] = pathStr.split('@');
52
- const targetPath = join(rootPath, workspace, './target');
53
- this.logger.debug(`Looking for compiled artifact in workspace ${targetPath}`);
54
- artifactPath = join(targetPath, `${pkg}-${contractName}.json`);
55
- } else {
56
- // We're deploying a standalone contract
57
- // env.deploy("../path/to/contract/root", "contractName")
58
- const targetPath = join(rootPath, pathStr, './target');
59
- this.logger.debug(`Looking for compiled artifact in ${targetPath}`);
60
- [artifactPath] = (await readdir(targetPath)).filter((file)=>file.endsWith(`-${contractName}.json`));
61
- }
96
+ if (!TXEArtifactsCacheInFlight.has(cacheKey)) {
97
+ this.logger.debug(`Loading compiled artifact ${artifactPath}`);
98
+ const compute = async ()=>{
99
+ const artifactJSON = JSON.parse(await readFile(artifactPath, 'utf-8'));
100
+ const artifactWithoutHash = loadContractArtifact(artifactJSON);
101
+ const computedArtifact = {
102
+ ...artifactWithoutHash,
103
+ // Artifact hash is *very* expensive to compute, so we do it here once
104
+ // and the TXE contract data provider can cache it
105
+ artifactHash: await computeArtifactHash(artifactWithoutHash)
106
+ };
107
+ this.logger.debug(`Deploy ${computedArtifact.name} with initializer ${initializer}(${decodedArgs}) and public keys hash ${publicKeysHash.toString()}`);
108
+ const computedInstance = await getContractInstanceFromInstantiationParams(computedArtifact, {
109
+ constructorArgs: decodedArgs,
110
+ skipArgsDecoding: true,
111
+ salt,
112
+ publicKeys,
113
+ constructorArtifact: initializer ? initializer : undefined,
114
+ deployer
115
+ });
116
+ const result = {
117
+ artifact: computedArtifact,
118
+ instance: computedInstance
119
+ };
120
+ TXEArtifactsCache.set(cacheKey, result);
121
+ TXEArtifactsCacheInFlight.delete(cacheKey);
122
+ return result;
123
+ };
124
+ TXEArtifactsCacheInFlight.set(cacheKey, compute());
62
125
  }
63
- this.logger.debug(`Loading compiled artifact ${artifactPath}`);
64
- artifact = loadContractArtifact(JSON.parse(await readFile(artifactPath, 'utf-8')));
65
- this.logger.debug(`Deploy ${artifact.name} with initializer ${initializer}(${decodedArgs}) and public keys hash ${publicKeysHash.toString()}`);
66
- instance = await getContractInstanceFromDeployParams(artifact, {
67
- constructorArgs: decodedArgs,
68
- skipArgsDecoding: true,
69
- salt: Fr.ONE,
70
- publicKeys,
71
- constructorArtifact: initializer ? initializer : undefined,
72
- deployer: AztecAddress.ZERO
73
- });
74
- TXEArtifactsCache.set(cacheKey, {
75
- artifact,
76
- instance
77
- });
126
+ ({ artifact, instance } = await TXEArtifactsCacheInFlight.get(cacheKey));
78
127
  }
79
- inputs.splice(0, 2, artifact, instance, toSingle(secret));
128
+ inputs.splice(0, 1, artifact, instance, toSingle(secret));
80
129
  }
81
130
  async #processAddAccountInputs({ inputs }) {
82
131
  const secret = fromSingle(inputs[0]);
@@ -87,24 +136,38 @@ class TXEDispatcher {
87
136
  this.logger.debug(`Using cached artifact for ${cacheKey}`);
88
137
  ({ artifact, instance } = TXEArtifactsCache.get(cacheKey));
89
138
  } else {
90
- const keys = await deriveKeys(secret);
91
- const args = [
92
- keys.publicKeys.masterIncomingViewingPublicKey.x,
93
- keys.publicKeys.masterIncomingViewingPublicKey.y
94
- ];
95
- artifact = SchnorrAccountContractArtifact;
96
- instance = await getContractInstanceFromDeployParams(artifact, {
97
- constructorArgs: args,
98
- skipArgsDecoding: true,
99
- salt: Fr.ONE,
100
- publicKeys: keys.publicKeys,
101
- constructorArtifact: 'constructor',
102
- deployer: AztecAddress.ZERO
103
- });
104
- TXEArtifactsCache.set(cacheKey, {
105
- artifact,
106
- instance
107
- });
139
+ if (!TXEArtifactsCacheInFlight.has(cacheKey)) {
140
+ const compute = async ()=>{
141
+ const keys = await deriveKeys(secret);
142
+ const args = [
143
+ keys.publicKeys.masterIncomingViewingPublicKey.x,
144
+ keys.publicKeys.masterIncomingViewingPublicKey.y
145
+ ];
146
+ const computedArtifact = {
147
+ ...SchnorrAccountContractArtifact,
148
+ // Artifact hash is *very* expensive to compute, so we do it here once
149
+ // and the TXE contract data provider can cache it
150
+ artifactHash: await computeArtifactHash(SchnorrAccountContractArtifact)
151
+ };
152
+ const computedInstance = await getContractInstanceFromInstantiationParams(computedArtifact, {
153
+ constructorArgs: args,
154
+ skipArgsDecoding: true,
155
+ salt: Fr.ONE,
156
+ publicKeys: keys.publicKeys,
157
+ constructorArtifact: 'constructor',
158
+ deployer: AztecAddress.ZERO
159
+ });
160
+ const result = {
161
+ artifact: computedArtifact,
162
+ instance: computedInstance
163
+ };
164
+ TXEArtifactsCache.set(cacheKey, result);
165
+ TXEArtifactsCacheInFlight.delete(cacheKey);
166
+ return result;
167
+ };
168
+ TXEArtifactsCacheInFlight.set(cacheKey, compute());
169
+ }
170
+ ({ artifact, instance } = await TXEArtifactsCacheInFlight.get(cacheKey));
108
171
  }
109
172
  inputs.splice(0, 0, artifact, instance);
110
173
  }
@@ -112,33 +175,34 @@ class TXEDispatcher {
112
175
  async resolve_foreign_call(callData) {
113
176
  const { session_id: sessionId, function: functionName, inputs } = callData;
114
177
  this.logger.debug(`Calling ${functionName} on session ${sessionId}`);
115
- if (!TXESessions.has(sessionId) && functionName != 'reset') {
178
+ if (!sessions.has(sessionId)) {
116
179
  this.logger.debug(`Creating new session ${sessionId}`);
117
- if (!this.protocolContracts) {
118
- this.protocolContracts = await Promise.all(protocolContractNames.map((name)=>new BundledProtocolContractsProvider().getProtocolContractArtifact(name)));
180
+ if (!this.contractStore) {
181
+ const kvStore = await openTmpStore('txe-contracts');
182
+ this.contractStore = new ContractStore(kvStore);
183
+ const provider = new BundledProtocolContractsProvider();
184
+ for (const name of protocolContractNames){
185
+ const { instance, artifact } = await provider.getProtocolContractArtifact(name);
186
+ await this.contractStore.addContractArtifact(artifact);
187
+ await this.contractStore.addContractInstance(instance);
188
+ }
189
+ this.logger.debug('Registered protocol contracts in shared contract store');
119
190
  }
120
- TXESessions.set(sessionId, await TXEService.init(this.logger, this.protocolContracts));
191
+ sessions.set(sessionId, await TXESession.init(this.contractStore));
121
192
  }
122
193
  switch(functionName){
123
- case 'reset':
124
- {
125
- TXESessions.delete(sessionId) && this.logger.debug(`Called reset on session ${sessionId}, yeeting it out of existence`);
126
- return toForeignCallResult([]);
127
- }
128
- case 'deploy':
194
+ case 'aztec_txe_deploy':
129
195
  {
130
196
  await this.#processDeployInputs(callData);
131
197
  break;
132
198
  }
133
- case 'addAccount':
199
+ case 'aztec_txe_addAccount':
134
200
  {
135
201
  await this.#processAddAccountInputs(callData);
136
202
  break;
137
203
  }
138
204
  }
139
- const txeService = TXESessions.get(sessionId);
140
- const response = await txeService[functionName](...inputs);
141
- return response;
205
+ return await sessions.get(sessionId).processFunction(functionName, inputs);
142
206
  }
143
207
  }
144
208
  const TXEDispatcherApiSchema = {
@@ -0,0 +1,58 @@
1
+ import type { ContractArtifact } from '@aztec/aztec.js/abi';
2
+ import { CompleteAddress } from '@aztec/aztec.js/addresses';
3
+ import type { ContractInstanceWithAddress } from '@aztec/aztec.js/contracts';
4
+ import { TxHash } from '@aztec/aztec.js/tx';
5
+ import { BlockNumber } from '@aztec/foundation/branded-types';
6
+ import type { Fr } from '@aztec/foundation/curves/bn254';
7
+ import type { EventSelector, FunctionSelector } from '@aztec/stdlib/abi';
8
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
9
+ import type { UInt64 } from '@aztec/stdlib/types';
10
+ /**
11
+ * Oracle methods associated with the execution of an Aztec #[external("public")] function.
12
+ *
13
+ * Note that real contracts have their Brillig calls to these be transpiled into opcodes, the oracles are only executed
14
+ * as such when running the original Brillig code, e.g. when invoking functions that interact with a PublicContext
15
+ * directly in a Noir test.
16
+ */
17
+ export interface IAvmExecutionOracle {
18
+ isAvm: true;
19
+ address(): Promise<AztecAddress>;
20
+ sender(): Promise<AztecAddress>;
21
+ blockNumber(): Promise<BlockNumber>;
22
+ timestamp(): Promise<bigint>;
23
+ isStaticCall(): Promise<boolean>;
24
+ chainId(): Promise<Fr>;
25
+ version(): Promise<Fr>;
26
+ emitNullifier(nullifier: Fr): Promise<void>;
27
+ emitNoteHash(noteHash: Fr): Promise<void>;
28
+ nullifierExists(siloedNullifier: Fr): Promise<boolean>;
29
+ storageWrite(slot: Fr, value: Fr): Promise<void>;
30
+ storageRead(slot: Fr, contractAddress: AztecAddress): Promise<Fr>;
31
+ }
32
+ /**
33
+ * Oracle methods associated with the execution of an Aztec Noir test.
34
+ */
35
+ export interface ITxeExecutionOracle {
36
+ isTxe: true;
37
+ getDefaultAddress(): AztecAddress;
38
+ getNextBlockNumber(): Promise<BlockNumber>;
39
+ getNextBlockTimestamp(): Promise<UInt64>;
40
+ advanceBlocksBy(blocks: number): Promise<void>;
41
+ advanceTimestampBy(duration: UInt64): void;
42
+ deploy(artifact: ContractArtifact, instance: ContractInstanceWithAddress, foreignSecret: Fr): Promise<void>;
43
+ createAccount(secret: Fr): Promise<CompleteAddress>;
44
+ addAccount(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: Fr): Promise<CompleteAddress>;
45
+ addAuthWitness(address: AztecAddress, messageHash: Fr): Promise<void>;
46
+ getLastBlockTimestamp(): Promise<bigint>;
47
+ getLastTxEffects(): Promise<{
48
+ txHash: TxHash;
49
+ noteHashes: Fr[];
50
+ nullifiers: Fr[];
51
+ }>;
52
+ getPrivateEvents(selector: EventSelector, contractAddress: AztecAddress, scope: AztecAddress): Promise<Fr[][]>;
53
+ privateCallNewFlow(from: AztecAddress, targetContractAddress: AztecAddress, functionSelector: FunctionSelector, args: Fr[], argsHash: Fr, isStaticCall: boolean, jobId: string): Promise<Fr[]>;
54
+ executeUtilityFunction(targetContractAddress: AztecAddress, functionSelector: FunctionSelector, args: Fr[], jobId: string): Promise<Fr[]>;
55
+ publicCallNewFlow(from: AztecAddress, targetContractAddress: AztecAddress, calldata: Fr[], isStaticCall: boolean): Promise<Fr[]>;
56
+ syncContractNonOracleMethod(contractAddress: AztecAddress, scope: AztecAddress, jobId: string): Promise<void>;
57
+ }
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29yYWNsZS9pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN6RSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVFsRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFdBQVcsbUJBQW1CO0lBQ2xDLEtBQUssRUFBRSxJQUFJLENBQUM7SUFFWixPQUFPLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwQyxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLFlBQVksSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QixPQUFPLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxD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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/oracle/interfaces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /**
2
+ * Oracle methods associated with the execution of an Aztec Noir test.
3
+ */ export { };
@@ -0,0 +1,34 @@
1
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
+ import { Fr } from '@aztec/foundation/curves/bn254';
3
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
4
+ import type { L2Block } from '@aztec/stdlib/block';
5
+ import { type MerkleTreeWriteOperations } from '@aztec/stdlib/trees';
6
+ import { GlobalVariables } from '@aztec/stdlib/tx';
7
+ import type { IAvmExecutionOracle } from './interfaces.js';
8
+ export declare class TXEOraclePublicContext implements IAvmExecutionOracle {
9
+ private contractAddress;
10
+ private forkedWorldTrees;
11
+ private txRequestHash;
12
+ private globalVariables;
13
+ isAvm: true;
14
+ private logger;
15
+ private transientUniqueNoteHashes;
16
+ private transientSiloedNullifiers;
17
+ private publicDataWrites;
18
+ constructor(contractAddress: AztecAddress, forkedWorldTrees: MerkleTreeWriteOperations, txRequestHash: Fr, globalVariables: GlobalVariables);
19
+ address(): Promise<AztecAddress>;
20
+ sender(): Promise<AztecAddress>;
21
+ blockNumber(): Promise<BlockNumber>;
22
+ timestamp(): Promise<bigint>;
23
+ isStaticCall(): Promise<boolean>;
24
+ chainId(): Promise<Fr>;
25
+ version(): Promise<Fr>;
26
+ emitNullifier(nullifier: Fr): Promise<void>;
27
+ emitNoteHash(noteHash: Fr): Promise<void>;
28
+ nullifierExists(siloedNullifier: Fr): Promise<boolean>;
29
+ storageWrite(slot: Fr, value: Fr): Promise<void>;
30
+ storageRead(slot: Fr, contractAddress: AztecAddress): Promise<Fr>;
31
+ close(): Promise<L2Block>;
32
+ private makeTxEffect;
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX29yYWNsZV9wdWJsaWNfY29udGV4dC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29yYWNsZS90eGVfb3JhY2xlX3B1YmxpY19jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRW5ELE9BQU8sRUFFTCxLQUFLLHlCQUF5QixFQUcvQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxlQUFlLEVBQW9CLE1BQU0sa0JBQWtCLENBQUM7QUFHckUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRCxxQkFBYSxzQkFBdUIsWUFBVyxtQkFBbUI7SUFTOUQsT0FBTyxDQUFDLGVBQWU7SUFDdkIsT0FBTyxDQUFDLGdCQUFnQjtJQUN4QixPQUFPLENBQUMsYUFBYTtJQUNyQixPQUFPLENBQUMsZUFBZTtJQVh6QixLQUFLLE9BQWlCO0lBRXRCLE9BQU8sQ0FBQyxNQUFNLENBQVM7SUFDdkIsT0FBTyxDQUFDLHlCQUF5QixDQUFZO0lBQzdDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBWTtJQUM3QyxPQUFPLENBQUMsZ0JBQWdCLENBQXlCO0lBRWpELFlBQ1UsZUFBZSxFQUFFLFlBQVksRUFDN0IsZ0JBQWdCLEVBQUUseUJBQXlCLEVBQzNDLGFBQWEsRUFBRSxFQUFFLEVBQ2pCLGVBQWUsRUFBRSxlQUFlLEVBU3pDO0lBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FFL0I7SUFFRCxNQUFNLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUU5QjtJQUVELFdBQVcsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLENBRWxDO0lBRUQsU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FFM0I7SUFFRCxZQUFZLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUUvQjtJQUVELE9BQU8sSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDLENBRXJCO0lBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FFckI7SUFFSyxhQUFhLENBQUMsU0FBUyxFQUFFLEVBQUUsaUJBR2hDO0lBRUssWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLGlCQUk5QjtJQUVLLGVBQWUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FPM0Q7SUFFSyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxpQkFVckM7SUFFSyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsWUFBWSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FxQnRFO0lBRUssS0FBSyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FrQjlCO0lBRUQsT0FBTyxDQUFDLFlBQVk7Q0FhckIifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txe_oracle_public_context.d.ts","sourceRoot":"","sources":["../../src/oracle/txe_oracle_public_context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAEL,KAAK,yBAAyB,EAG/B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAoB,MAAM,kBAAkB,CAAC;AAGrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,qBAAa,sBAAuB,YAAW,mBAAmB;IAS9D,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,eAAe;IAXzB,KAAK,OAAiB;IAEtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,yBAAyB,CAAY;IAC7C,OAAO,CAAC,yBAAyB,CAAY;IAC7C,OAAO,CAAC,gBAAgB,CAAyB;IAEjD,YACU,eAAe,EAAE,YAAY,EAC7B,gBAAgB,EAAE,yBAAyB,EAC3C,aAAa,EAAE,EAAE,EACjB,eAAe,EAAE,eAAe,EASzC;IAED,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAE/B;IAED,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,CAE9B;IAED,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAElC;IAED,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAE3B;IAED,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAE/B;IAED,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC,CAErB;IAED,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC,CAErB;IAEK,aAAa,CAAC,SAAS,EAAE,EAAE,iBAGhC;IAEK,YAAY,CAAC,QAAQ,EAAE,EAAE,iBAI9B;IAEK,eAAe,CAAC,eAAe,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3D;IAEK,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,iBAUrC;IAEK,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,eAAe,EAAE,YAAY,GAAG,OAAO,CAAC,EAAE,CAAC,CAqBtE;IAEK,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAkB9B;IAED,OAAO,CAAC,YAAY;CAarB"}
@@ -0,0 +1,122 @@
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
2
+ import { createLogger } from '@aztec/foundation/log';
3
+ import { PublicDataWrite } from '@aztec/stdlib/avm';
4
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
5
+ import { computePublicDataTreeLeafSlot, siloNoteHash, siloNullifier } from '@aztec/stdlib/hash';
6
+ import { MerkleTreeId, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
7
+ import { TxEffect, TxHash } from '@aztec/stdlib/tx';
8
+ import { insertTxEffectIntoWorldTrees, makeTXEBlock } from '../utils/block_creation.js';
9
+ export class TXEOraclePublicContext {
10
+ contractAddress;
11
+ forkedWorldTrees;
12
+ txRequestHash;
13
+ globalVariables;
14
+ isAvm;
15
+ logger;
16
+ transientUniqueNoteHashes;
17
+ transientSiloedNullifiers;
18
+ publicDataWrites;
19
+ constructor(contractAddress, forkedWorldTrees, txRequestHash, globalVariables){
20
+ this.contractAddress = contractAddress;
21
+ this.forkedWorldTrees = forkedWorldTrees;
22
+ this.txRequestHash = txRequestHash;
23
+ this.globalVariables = globalVariables;
24
+ this.isAvm = true;
25
+ this.transientUniqueNoteHashes = [];
26
+ this.transientSiloedNullifiers = [];
27
+ this.publicDataWrites = [];
28
+ this.logger = createLogger('txe:public_context');
29
+ this.logger.debug('Entering Public Context', {
30
+ contractAddress,
31
+ blockNumber: globalVariables.blockNumber,
32
+ timestamp: globalVariables.timestamp
33
+ });
34
+ }
35
+ address() {
36
+ return Promise.resolve(this.contractAddress);
37
+ }
38
+ sender() {
39
+ return Promise.resolve(AztecAddress.ZERO); // todo: change?
40
+ }
41
+ blockNumber() {
42
+ return Promise.resolve(this.globalVariables.blockNumber);
43
+ }
44
+ timestamp() {
45
+ return Promise.resolve(this.globalVariables.timestamp);
46
+ }
47
+ isStaticCall() {
48
+ return Promise.resolve(false);
49
+ }
50
+ chainId() {
51
+ return Promise.resolve(this.globalVariables.chainId);
52
+ }
53
+ version() {
54
+ return Promise.resolve(this.globalVariables.version);
55
+ }
56
+ async emitNullifier(nullifier) {
57
+ const siloedNullifier = await siloNullifier(this.contractAddress, nullifier);
58
+ this.transientSiloedNullifiers.push(siloedNullifier);
59
+ }
60
+ async emitNoteHash(noteHash) {
61
+ const siloedNoteHash = await siloNoteHash(this.contractAddress, noteHash);
62
+ // TODO: make the note hash unique - they are only siloed right now
63
+ this.transientUniqueNoteHashes.push(siloedNoteHash);
64
+ }
65
+ async nullifierExists(siloedNullifier) {
66
+ const treeIndex = (await this.forkedWorldTrees.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [
67
+ siloedNullifier.toBuffer()
68
+ ]))[0];
69
+ const transientIndex = this.transientSiloedNullifiers.find((n)=>n.equals(siloedNullifier));
70
+ return treeIndex !== undefined || transientIndex !== undefined;
71
+ }
72
+ async storageWrite(slot, value) {
73
+ this.logger.debug('AVM storage write', {
74
+ slot,
75
+ value
76
+ });
77
+ const dataWrite = new PublicDataWrite(await computePublicDataTreeLeafSlot(this.contractAddress, slot), value);
78
+ this.publicDataWrites.push(dataWrite);
79
+ await this.forkedWorldTrees.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [
80
+ new PublicDataTreeLeaf(dataWrite.leafSlot, dataWrite.value).toBuffer()
81
+ ]);
82
+ }
83
+ async storageRead(slot, contractAddress) {
84
+ const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
85
+ const lowLeafResult = await this.forkedWorldTrees.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot.toBigInt());
86
+ const value = !lowLeafResult || !lowLeafResult.alreadyPresent ? Fr.ZERO : (await this.forkedWorldTrees.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index)).leaf.value;
87
+ this.logger.debug('AVM storage read', {
88
+ slot,
89
+ contractAddress,
90
+ value
91
+ });
92
+ return value;
93
+ }
94
+ async close() {
95
+ this.logger.debug('Exiting Public Context, building block with collected side effects', {
96
+ blockNumber: this.globalVariables.blockNumber
97
+ });
98
+ const txEffect = this.makeTxEffect();
99
+ await insertTxEffectIntoWorldTrees(txEffect, this.forkedWorldTrees);
100
+ const block = await makeTXEBlock(this.forkedWorldTrees, this.globalVariables, [
101
+ txEffect
102
+ ]);
103
+ await this.forkedWorldTrees.close();
104
+ this.logger.debug('Exited PublicContext with built block', {
105
+ blockNumber: block.number,
106
+ txEffects: block.body.txEffects
107
+ });
108
+ return block;
109
+ }
110
+ makeTxEffect() {
111
+ const txEffect = TxEffect.empty();
112
+ txEffect.noteHashes = this.transientUniqueNoteHashes;
113
+ txEffect.nullifiers = [
114
+ this.txRequestHash,
115
+ ...this.transientSiloedNullifiers
116
+ ];
117
+ txEffect.publicDataWrites = this.publicDataWrites;
118
+ // TODO: support public logs
119
+ txEffect.txHash = new TxHash(new Fr(this.globalVariables.blockNumber));
120
+ return txEffect;
121
+ }
122
+ }