@aztec/txe 0.0.1-commit.86469d5 → 0.0.1-commit.8655d4a

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 (134) hide show
  1. package/dest/ContractClassRegistry-KKNT527R.js +3 -0
  2. package/dest/ContractClassRegistry-KKNT527R.js.map +7 -0
  3. package/dest/ContractInstanceRegistry-GSKBNL3Q.js +3 -0
  4. package/dest/ContractInstanceRegistry-GSKBNL3Q.js.map +7 -0
  5. package/dest/FeeJuice-GUJ5O6GB.js +3 -0
  6. package/dest/FeeJuice-GUJ5O6GB.js.map +7 -0
  7. package/dest/MultiCallEntrypoint-ZQPCKVKL.js +3 -0
  8. package/dest/MultiCallEntrypoint-ZQPCKVKL.js.map +7 -0
  9. package/dest/SchnorrAccount-QIXE5DXA.js +3 -0
  10. package/dest/SchnorrAccount-QIXE5DXA.js.map +7 -0
  11. package/dest/bin/check_txe_oracle_version.d.ts +2 -0
  12. package/dest/bin/check_txe_oracle_version.d.ts.map +1 -0
  13. package/dest/bin/check_txe_oracle_version.js +32 -0
  14. package/dest/bin/index.js +3 -30
  15. package/dest/bin/index.js.map +7 -0
  16. package/dest/chunk-BJVAAXNA.js +3 -0
  17. package/dest/chunk-BJVAAXNA.js.map +7 -0
  18. package/dest/chunk-DF6RMOC6.js +304 -0
  19. package/dest/chunk-DF6RMOC6.js.map +7 -0
  20. package/dest/chunk-PPJTNNUG.js +265 -0
  21. package/dest/chunk-PPJTNNUG.js.map +7 -0
  22. package/dest/constants.d.ts +3 -1
  23. package/dest/constants.d.ts.map +1 -1
  24. package/dest/constants.js +5 -0
  25. package/dest/dispatcher_pool.d.ts +67 -0
  26. package/dest/dispatcher_pool.d.ts.map +1 -0
  27. package/dest/dispatcher_pool.js +284 -0
  28. package/dest/index.d.ts +188 -7
  29. package/dest/index.d.ts.map +1 -1
  30. package/dest/index.js +148 -75
  31. package/dest/metafile.json +38147 -0
  32. package/dest/msgpackr_fr_extension.d.ts +2 -0
  33. package/dest/msgpackr_fr_extension.d.ts.map +1 -0
  34. package/dest/msgpackr_fr_extension.js +21 -0
  35. package/dest/oracle/interfaces.d.ts +40 -28
  36. package/dest/oracle/interfaces.d.ts.map +1 -1
  37. package/dest/oracle/txe_oracle_public_context.d.ts +18 -13
  38. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
  39. package/dest/oracle/txe_oracle_public_context.js +27 -12
  40. package/dest/oracle/txe_oracle_top_level_context.d.ts +39 -24
  41. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  42. package/dest/oracle/txe_oracle_top_level_context.js +205 -78
  43. package/dest/oracle/txe_private_execution_oracle.d.ts +17 -0
  44. package/dest/oracle/txe_private_execution_oracle.d.ts.map +1 -0
  45. package/dest/oracle/txe_private_execution_oracle.js +15 -0
  46. package/dest/rpc_server.d.ts +14 -0
  47. package/dest/rpc_server.d.ts.map +1 -0
  48. package/dest/rpc_server.js +78 -0
  49. package/dest/rpc_translator.d.ts +140 -84
  50. package/dest/rpc_translator.d.ts.map +1 -1
  51. package/dest/rpc_translator.js +587 -239
  52. package/dest/server.bundle.js +3 -0
  53. package/dest/server.bundle.js.map +7 -0
  54. package/dest/state_machine/archiver.d.ts +4 -4
  55. package/dest/state_machine/archiver.d.ts.map +1 -1
  56. package/dest/state_machine/archiver.js +24 -20
  57. package/dest/state_machine/dummy_p2p_client.d.ts +26 -16
  58. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  59. package/dest/state_machine/dummy_p2p_client.js +44 -20
  60. package/dest/state_machine/global_variable_builder.d.ts +9 -4
  61. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  62. package/dest/state_machine/global_variable_builder.js +9 -3
  63. package/dest/state_machine/index.d.ts +10 -6
  64. package/dest/state_machine/index.d.ts.map +1 -1
  65. package/dest/state_machine/index.js +35 -12
  66. package/dest/state_machine/mock_epoch_cache.d.ts +20 -3
  67. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
  68. package/dest/state_machine/mock_epoch_cache.js +39 -2
  69. package/dest/state_machine/synchronizer.d.ts +5 -5
  70. package/dest/state_machine/synchronizer.d.ts.map +1 -1
  71. package/dest/state_machine/synchronizer.js +4 -4
  72. package/dest/txe_oracle_version.d.ts +17 -0
  73. package/dest/txe_oracle_version.d.ts.map +1 -0
  74. package/dest/txe_oracle_version.js +14 -0
  75. package/dest/txe_session.d.ts +71 -10
  76. package/dest/txe_session.d.ts.map +1 -1
  77. package/dest/txe_session.js +227 -40
  78. package/dest/utils/block_creation.d.ts +1 -1
  79. package/dest/utils/block_creation.d.ts.map +1 -1
  80. package/dest/utils/block_creation.js +3 -1
  81. package/dest/utils/encoding.d.ts +191 -0
  82. package/dest/utils/encoding.d.ts.map +1 -0
  83. package/dest/{util → utils}/encoding.js +7 -2
  84. package/dest/{util → utils}/expected_failure_error.d.ts +1 -1
  85. package/dest/utils/expected_failure_error.d.ts.map +1 -0
  86. package/dest/{util → utils}/txe_account_store.d.ts +1 -1
  87. package/dest/utils/txe_account_store.d.ts.map +1 -0
  88. package/dest/utils/txe_public_contract_data_source.d.ts +20 -0
  89. package/dest/utils/txe_public_contract_data_source.d.ts.map +1 -0
  90. package/dest/{util → utils}/txe_public_contract_data_source.js +6 -25
  91. package/dest/worker.bundle.js +3 -0
  92. package/dest/worker.bundle.js.map +7 -0
  93. package/dest/worker.d.ts +2 -0
  94. package/dest/worker.d.ts.map +1 -0
  95. package/dest/worker.js +92 -0
  96. package/package.json +37 -21
  97. package/src/bin/check_txe_oracle_version.ts +37 -0
  98. package/src/bin/index.ts +11 -2
  99. package/src/constants.ts +6 -0
  100. package/src/dispatcher_pool.ts +316 -0
  101. package/src/index.ts +166 -80
  102. package/src/msgpackr_fr_extension.ts +23 -0
  103. package/src/oracle/interfaces.ts +48 -34
  104. package/src/oracle/txe_oracle_public_context.ts +42 -12
  105. package/src/oracle/txe_oracle_top_level_context.ts +231 -144
  106. package/src/oracle/txe_private_execution_oracle.ts +30 -0
  107. package/src/rpc_server.ts +87 -0
  108. package/src/rpc_translator.ts +662 -316
  109. package/src/state_machine/archiver.ts +35 -18
  110. package/src/state_machine/dummy_p2p_client.ts +70 -32
  111. package/src/state_machine/global_variable_builder.ts +18 -3
  112. package/src/state_machine/index.ts +48 -13
  113. package/src/state_machine/mock_epoch_cache.ts +51 -3
  114. package/src/state_machine/synchronizer.ts +5 -5
  115. package/src/txe_oracle_version.ts +17 -0
  116. package/src/txe_session.ts +324 -90
  117. package/src/utils/block_creation.ts +3 -1
  118. package/src/{util → utils}/encoding.ts +8 -2
  119. package/src/{util → utils}/txe_public_contract_data_source.ts +10 -38
  120. package/src/worker.ts +98 -0
  121. package/dest/util/encoding.d.ts +0 -720
  122. package/dest/util/encoding.d.ts.map +0 -1
  123. package/dest/util/expected_failure_error.d.ts.map +0 -1
  124. package/dest/util/txe_account_store.d.ts.map +0 -1
  125. package/dest/util/txe_contract_store.d.ts +0 -12
  126. package/dest/util/txe_contract_store.d.ts.map +0 -1
  127. package/dest/util/txe_contract_store.js +0 -22
  128. package/dest/util/txe_public_contract_data_source.d.ts +0 -21
  129. package/dest/util/txe_public_contract_data_source.d.ts.map +0 -1
  130. package/src/util/txe_contract_store.ts +0 -36
  131. /package/dest/{util → utils}/expected_failure_error.js +0 -0
  132. /package/dest/{util → utils}/txe_account_store.js +0 -0
  133. /package/src/{util → utils}/expected_failure_error.ts +0 -0
  134. /package/src/{util → utils}/txe_account_store.ts +0 -0
package/dest/index.js CHANGED
@@ -1,12 +1,10 @@
1
- import { SchnorrAccountContractArtifact } from '@aztec/accounts/schnorr';
2
1
  import { loadContractArtifact } from '@aztec/aztec.js/abi';
3
2
  import { AztecAddress } from '@aztec/aztec.js/addresses';
4
3
  import { getContractInstanceFromInstantiationParams } from '@aztec/aztec.js/contracts';
5
4
  import { Fr } from '@aztec/aztec.js/fields';
6
5
  import { PublicKeys, deriveKeys } from '@aztec/aztec.js/keys';
7
- import { createSafeJsonRpcServer } from '@aztec/foundation/json-rpc/server';
8
- import { protocolContractNames } from '@aztec/protocol-contracts';
9
- import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/providers/bundle';
6
+ import { cloneEphemeralStoreFrom } from '@aztec/kv-store/lmdb-v2';
7
+ import { ContractStore } from '@aztec/pxe/client/lazy';
10
8
  import { computeArtifactHash } from '@aztec/stdlib/contract';
11
9
  import { zodFor } from '@aztec/stdlib/schemas';
12
10
  import { createHash } from 'crypto';
@@ -14,16 +12,55 @@ import { createReadStream } from 'fs';
14
12
  import { readFile, readdir } from 'fs/promises';
15
13
  import { join, parse } from 'path';
16
14
  import { z } from 'zod';
15
+ // Side-effect import: registers the msgpackr Fr extension for the bundled `Fr` class. Must
16
+ // be loaded before any `sendMessage` call. See msgpackr_fr_extension.ts for the why.
17
+ import './msgpackr_fr_extension.js';
17
18
  import { TXESession } from './txe_session.js';
18
- import { ForeignCallArgsSchema, ForeignCallResultSchema, fromArray, fromSingle, toSingle } from './util/encoding.js';
19
+ import { ForeignCallArgsSchema, ForeignCallResultSchema, addressFromSingle, fromArray, fromSingle, toSingle } from './utils/encoding.js';
20
+ // Protocol contracts TXE registers in its contract store. Only AuthRegistry is needed for the
21
+ // current test suites; add a contract here if a lookup against a `0x000…00X` address fails.
22
+ export const TXE_REQUIRED_PROTOCOL_CONTRACTS = [];
19
23
  const sessions = new Map();
20
- /*
21
- * TXE typically has to load the same contract artifacts over and over again for multiple tests,
22
- * so we cache them here to avoid both loading them from disk repeatedly and computing their artifact hashes
23
- */ const TXEArtifactsCache = new Map();
24
- const TXEForeignCallInputSchema = zodFor()(z.object({
24
+ /**
25
+ * Cache + in-flight map pair. Lookup hits the cache, then awaits an in-flight `compute()` if one
26
+ * exists, otherwise starts one and stores it. Guarantees `compute()` runs at most once per `key`
27
+ * across concurrent callers, which matters because `computeArtifactHash` is expensive.
28
+ */ class AsyncCache {
29
+ cache = new Map();
30
+ inFlight = new Map();
31
+ getOrCompute(key, compute) {
32
+ const cached = this.cache.get(key);
33
+ if (cached !== undefined) {
34
+ return Promise.resolve(cached);
35
+ }
36
+ let pending = this.inFlight.get(key);
37
+ if (!pending) {
38
+ pending = (async ()=>{
39
+ try {
40
+ const value = await compute();
41
+ this.cache.set(key, value);
42
+ return value;
43
+ } finally{
44
+ this.inFlight.delete(key);
45
+ }
46
+ })();
47
+ this.inFlight.set(key, pending);
48
+ }
49
+ return pending;
50
+ }
51
+ }
52
+ // Full deploys (artifact + computed instance), keyed by the full deploy context (contract +
53
+ // constructor args + publicKeys + salt + deployer). Hits on repeated identical deploys.
54
+ const TXEDeploymentsCache = new AsyncCache();
55
+ // Loaded + hashed contract artifact, keyed by compiled-bytecode hash. Hits across deploys of the
56
+ // same contract when constructor args / salt / deployer differ.
57
+ const TXEArtifactsCache = new AsyncCache();
58
+ export const TXEForeignCallInputSchema = zodFor()(z.object({
59
+ // Nargo generates session_id as a u64, which may exceed Number.MAX_SAFE_INTEGER.
60
+ // Zod 4's `.int()` enforces the safe-integer bound, so we drop it here and only require
61
+ // the value to be a non-negative number (it is used solely as a Map key).
25
62
  // eslint-disable-next-line camelcase
26
- session_id: z.number().int().nonnegative(),
63
+ session_id: z.number().nonnegative(),
27
64
  function: z.string(),
28
65
  // eslint-disable-next-line camelcase
29
66
  root_path: z.string(),
@@ -31,11 +68,30 @@ const TXEForeignCallInputSchema = zodFor()(z.object({
31
68
  package_name: z.string(),
32
69
  inputs: ForeignCallArgsSchema
33
70
  }));
34
- class TXEDispatcher {
71
+ export class TXEDispatcher {
35
72
  logger;
36
- protocolContracts;
37
- constructor(logger){
73
+ contractStore;
74
+ contractStoreSourceDir;
75
+ schnorrClassId;
76
+ constructor(logger, opts){
38
77
  this.logger = logger;
78
+ this.contractStoreSourceDir = opts.contractStoreSourceDir;
79
+ this.schnorrClassId = Fr.fromString(opts.schnorrClassId);
80
+ }
81
+ /**
82
+ * Clones the pre-populated LMDB at `contractStoreSourceDir` into a fresh per-instance tmpdir
83
+ * on first use, so this dispatcher has a writable store already containing the required
84
+ * protocol contracts + SchnorrAccount. Idempotent — subsequent calls are no-ops.
85
+ */ async warmUp() {
86
+ if (this.contractStore) {
87
+ return;
88
+ }
89
+ const t0 = Date.now();
90
+ const kvStore = await cloneEphemeralStoreFrom(join(this.contractStoreSourceDir, 'data.mdb'), 'txe-contracts', undefined, 2);
91
+ this.contractStore = new ContractStore(kvStore);
92
+ this.logger.debug('Cloned shared protocol-contracts store', {
93
+ totalMs: Date.now() - t0
94
+ });
39
95
  }
40
96
  fastHashFile(path) {
41
97
  return new Promise((resolve)=>{
@@ -53,6 +109,8 @@ class TXEDispatcher {
53
109
  const [contractPath, initializer] = inputs.slice(0, 2).map((input)=>fromArray(input).map((char)=>String.fromCharCode(char.toNumber())).join(''));
54
110
  const decodedArgs = fromArray(inputs[3]);
55
111
  const secret = fromSingle(inputs[4]);
112
+ const salt = fromSingle(inputs[5]);
113
+ const deployer = addressFromSingle(inputs[6]);
56
114
  const publicKeys = secret.equals(Fr.ZERO) ? PublicKeys.default() : (await deriveKeys(secret)).publicKeys;
57
115
  const publicKeysHash = await publicKeys.hash();
58
116
  let artifactPath = '';
@@ -78,59 +136,57 @@ class TXEDispatcher {
78
136
  artifactPath = join(rootPath, './target', `${packageName}-${contractFilename}.json`);
79
137
  }
80
138
  const fileHash = await this.fastHashFile(artifactPath);
81
- const cacheKey = `${contractDirectory ?? ''}-${contractFilename}-${initializer}-${decodedArgs.map((arg)=>arg.toString()).join('-')}-${publicKeysHash}-${fileHash}`;
82
- let instance;
83
- let artifact;
84
- if (TXEArtifactsCache.has(cacheKey)) {
85
- this.logger.debug(`Using cached artifact for ${cacheKey}`);
86
- ({ artifact, instance } = TXEArtifactsCache.get(cacheKey));
87
- } else {
139
+ const cacheKey = `${contractDirectory ?? ''}-${contractFilename}-${initializer}-${decodedArgs.map((arg)=>arg.toString()).join('-')}-${publicKeysHash}-${salt}-${deployer}-${fileHash}`;
140
+ const { artifact, instance } = await TXEDeploymentsCache.getOrCompute(cacheKey, async ()=>{
88
141
  this.logger.debug(`Loading compiled artifact ${artifactPath}`);
89
- const artifactJSON = JSON.parse(await readFile(artifactPath, 'utf-8'));
90
- const artifactWithoutHash = loadContractArtifact(artifactJSON);
91
- artifact = {
92
- ...artifactWithoutHash,
93
- // Artifact hash is *very* expensive to compute, so we do it here once
94
- // and the TXE contract data provider can cache it
95
- artifactHash: await computeArtifactHash(artifactWithoutHash)
96
- };
97
- this.logger.debug(`Deploy ${artifact.name} with initializer ${initializer}(${decodedArgs}) and public keys hash ${publicKeysHash.toString()}`);
98
- instance = await getContractInstanceFromInstantiationParams(artifact, {
142
+ // Inner cache: artifact load + hash depends only on the compiled bytecode (`fileHash`), so
143
+ // subsequent deploys of the same contract — regardless of constructor args / deployer /
144
+ // salt — reuse the same `ContractArtifactWithHash`.
145
+ const computedArtifact = await TXEArtifactsCache.getOrCompute(fileHash, async ()=>{
146
+ const artifactJSON = JSON.parse(await readFile(artifactPath, 'utf-8'));
147
+ const artifactWithoutHash = loadContractArtifact(artifactJSON);
148
+ return {
149
+ ...artifactWithoutHash,
150
+ artifactHash: await computeArtifactHash(artifactWithoutHash)
151
+ };
152
+ });
153
+ this.logger.debug(`Deploy ${computedArtifact.name} with initializer ${initializer}(${decodedArgs}) and public keys hash ${publicKeysHash.toString()}`);
154
+ const computedInstance = await getContractInstanceFromInstantiationParams(computedArtifact, {
99
155
  constructorArgs: decodedArgs,
100
156
  skipArgsDecoding: true,
101
- salt: Fr.ONE,
157
+ salt,
102
158
  publicKeys,
103
159
  constructorArtifact: initializer ? initializer : undefined,
104
- deployer: AztecAddress.ZERO
160
+ deployer
105
161
  });
106
- TXEArtifactsCache.set(cacheKey, {
107
- artifact,
108
- instance
109
- });
110
- }
162
+ return {
163
+ artifact: computedArtifact,
164
+ instance: computedInstance
165
+ };
166
+ });
111
167
  inputs.splice(0, 1, artifact, instance, toSingle(secret));
112
168
  }
113
169
  async #processAddAccountInputs({ inputs }) {
114
170
  const secret = fromSingle(inputs[0]);
115
171
  const cacheKey = `SchnorrAccountContract-${secret}`;
116
- let artifact;
117
- let instance;
118
- if (TXEArtifactsCache.has(cacheKey)) {
119
- this.logger.debug(`Using cached artifact for ${cacheKey}`);
120
- ({ artifact, instance } = TXEArtifactsCache.get(cacheKey));
121
- } else {
172
+ const { artifact, instance } = await TXEDeploymentsCache.getOrCompute(cacheKey, async ()=>{
173
+ const [artifactFromStore, classWithPreimage] = await Promise.all([
174
+ this.contractStore.getContractArtifact(this.schnorrClassId),
175
+ this.contractStore.getContractClassWithPreimage(this.schnorrClassId)
176
+ ]);
177
+ if (!artifactFromStore || !classWithPreimage) {
178
+ throw new Error(`SchnorrAccount not found in shared contract store at class id ${this.schnorrClassId.toString()}`);
179
+ }
180
+ const computedArtifact = {
181
+ ...artifactFromStore,
182
+ artifactHash: classWithPreimage.artifactHash
183
+ };
122
184
  const keys = await deriveKeys(secret);
123
185
  const args = [
124
- keys.publicKeys.masterIncomingViewingPublicKey.x,
125
- keys.publicKeys.masterIncomingViewingPublicKey.y
186
+ keys.publicKeys.ivpkM.x,
187
+ keys.publicKeys.ivpkM.y
126
188
  ];
127
- artifact = {
128
- ...SchnorrAccountContractArtifact,
129
- // Artifact hash is *very* expensive to compute, so we do it here once
130
- // and the TXE contract data provider can cache it
131
- artifactHash: await computeArtifactHash(SchnorrAccountContractArtifact)
132
- };
133
- instance = await getContractInstanceFromInstantiationParams(artifact, {
189
+ const computedInstance = await getContractInstanceFromInstantiationParams(computedArtifact, {
134
190
  constructorArgs: args,
135
191
  skipArgsDecoding: true,
136
192
  salt: Fr.ONE,
@@ -138,11 +194,11 @@ class TXEDispatcher {
138
194
  constructorArtifact: 'constructor',
139
195
  deployer: AztecAddress.ZERO
140
196
  });
141
- TXEArtifactsCache.set(cacheKey, {
142
- artifact,
143
- instance
144
- });
145
- }
197
+ return {
198
+ artifact: computedArtifact,
199
+ instance: computedInstance
200
+ };
201
+ });
146
202
  inputs.splice(0, 0, artifact, instance);
147
203
  }
148
204
  // eslint-disable-next-line camelcase
@@ -151,18 +207,16 @@ class TXEDispatcher {
151
207
  this.logger.debug(`Calling ${functionName} on session ${sessionId}`);
152
208
  if (!sessions.has(sessionId)) {
153
209
  this.logger.debug(`Creating new session ${sessionId}`);
154
- if (!this.protocolContracts) {
155
- this.protocolContracts = await Promise.all(protocolContractNames.map((name)=>new BundledProtocolContractsProvider().getProtocolContractArtifact(name)));
156
- }
157
- sessions.set(sessionId, await TXESession.init(this.protocolContracts));
210
+ await this.warmUp();
211
+ sessions.set(sessionId, await TXESession.init(this.contractStore));
158
212
  }
159
213
  switch(functionName){
160
- case 'txeDeploy':
214
+ case 'aztec_txe_deploy':
161
215
  {
162
216
  await this.#processDeployInputs(callData);
163
217
  break;
164
218
  }
165
- case 'txeAddAccount':
219
+ case 'aztec_txe_addAccount':
166
220
  {
167
221
  await this.#processAddAccountInputs(callData);
168
222
  break;
@@ -170,17 +224,36 @@ class TXEDispatcher {
170
224
  }
171
225
  return await sessions.get(sessionId).processFunction(functionName, inputs);
172
226
  }
227
+ /**
228
+ * Releases a session and its resources (per-session LMDB + `NativeWorldStateService`).
229
+ * Called by the dispatcher pool when nargo closes its TCP connection for a test (see
230
+ * `rpc_server.ts`'s socket tracker). No-op if the session was never created — that happens
231
+ * when nargo opens a connection but errors before sending a request.
232
+ */ async disposeSession(sessionId) {
233
+ const session = sessions.get(sessionId);
234
+ if (!session) {
235
+ return;
236
+ }
237
+ sessions.delete(sessionId);
238
+ await session.dispose();
239
+ }
240
+ }
241
+ /** Diagnostic-only: number of sessions currently held by this worker. */ export function activeSessionCount() {
242
+ return sessions.size;
173
243
  }
174
- const TXEDispatcherApiSchema = {
244
+ export const TXEDispatcherApiSchema = {
175
245
  // eslint-disable-next-line camelcase
176
- resolve_foreign_call: z.function().args(TXEForeignCallInputSchema).returns(ForeignCallResultSchema)
246
+ resolve_foreign_call: z.function({
247
+ input: z.tuple([
248
+ TXEForeignCallInputSchema
249
+ ]),
250
+ output: ForeignCallResultSchema
251
+ }),
252
+ // disposeSession is invoked over IPC from the worker, not via RPC; required by ApiSchemaFor.
253
+ disposeSession: z.function({
254
+ input: z.tuple([
255
+ z.number().nonnegative()
256
+ ]),
257
+ output: z.void()
258
+ })
177
259
  };
178
- /**
179
- * Creates an RPC server that forwards calls to the TXE.
180
- * @param logger - Logger to output to
181
- * @returns A TXE RPC server.
182
- */ export function createTXERpcServer(logger) {
183
- return createSafeJsonRpcServer(new TXEDispatcher(logger), TXEDispatcherApiSchema, {
184
- http200OnError: true
185
- });
186
- }