@aztec/txe 4.0.0-nightly.20250907 → 4.0.0-nightly.20260107
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.
- package/dest/bin/index.d.ts +1 -1
- package/dest/bin/index.js +1 -1
- package/dest/constants.d.ts +3 -0
- package/dest/constants.d.ts.map +1 -0
- package/dest/constants.js +2 -0
- package/dest/index.d.ts +1 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +8 -4
- package/dest/oracle/interfaces.d.ts +57 -0
- package/dest/oracle/interfaces.d.ts.map +1 -0
- package/dest/oracle/interfaces.js +3 -0
- package/dest/oracle/txe_oracle_public_context.d.ts +12 -12
- package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.js +30 -34
- package/dest/oracle/txe_oracle_top_level_context.d.ts +65 -0
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -0
- package/dest/oracle/txe_oracle_top_level_context.js +463 -0
- package/dest/rpc_translator.d.ts +246 -0
- package/dest/rpc_translator.d.ts.map +1 -0
- package/dest/{txe_service/txe_service.js → rpc_translator.js} +201 -124
- package/dest/state_machine/archiver.d.ts +34 -13
- package/dest/state_machine/archiver.d.ts.map +1 -1
- package/dest/state_machine/archiver.js +111 -16
- package/dest/state_machine/dummy_p2p_client.d.ts +5 -2
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +9 -1
- package/dest/state_machine/global_variable_builder.d.ts +5 -16
- package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
- package/dest/state_machine/global_variable_builder.js +15 -22
- package/dest/state_machine/index.d.ts +5 -5
- package/dest/state_machine/index.d.ts.map +1 -1
- package/dest/state_machine/index.js +17 -21
- package/dest/state_machine/mock_epoch_cache.d.ts +6 -5
- package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
- package/dest/state_machine/mock_epoch_cache.js +8 -7
- package/dest/state_machine/synchronizer.d.ts +5 -4
- package/dest/state_machine/synchronizer.d.ts.map +1 -1
- package/dest/state_machine/synchronizer.js +5 -4
- package/dest/txe_session.d.ts +42 -46
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +241 -93
- package/dest/util/encoding.d.ts +623 -24
- package/dest/util/encoding.d.ts.map +1 -1
- package/dest/util/encoding.js +1 -1
- package/dest/util/expected_failure_error.d.ts +1 -1
- package/dest/util/expected_failure_error.d.ts.map +1 -1
- package/dest/util/txe_account_store.d.ts +10 -0
- package/dest/util/txe_account_store.d.ts.map +1 -0
- package/dest/util/{txe_account_data_provider.js → txe_account_store.js} +1 -1
- package/dest/util/txe_contract_store.d.ts +12 -0
- package/dest/util/txe_contract_store.d.ts.map +1 -0
- package/dest/util/{txe_contract_data_provider.js → txe_contract_store.js} +4 -4
- package/dest/util/txe_public_contract_data_source.d.ts +8 -6
- package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
- package/dest/util/txe_public_contract_data_source.js +14 -12
- package/dest/utils/block_creation.d.ts +28 -0
- package/dest/utils/block_creation.d.ts.map +1 -0
- package/dest/utils/block_creation.js +45 -0
- package/dest/utils/tx_effect_creation.d.ts +6 -0
- package/dest/utils/tx_effect_creation.d.ts.map +1 -0
- package/dest/utils/tx_effect_creation.js +16 -0
- package/package.json +18 -17
- package/src/bin/index.ts +1 -1
- package/src/constants.ts +3 -0
- package/src/index.ts +20 -20
- package/src/oracle/interfaces.ts +86 -0
- package/src/oracle/txe_oracle_public_context.ts +37 -75
- package/src/oracle/txe_oracle_top_level_context.ts +716 -0
- package/src/{txe_service/txe_service.ts → rpc_translator.ts} +261 -125
- package/src/state_machine/archiver.ts +147 -29
- package/src/state_machine/dummy_p2p_client.ts +13 -2
- package/src/state_machine/global_variable_builder.ts +24 -41
- package/src/state_machine/index.ts +24 -21
- package/src/state_machine/mock_epoch_cache.ts +12 -11
- package/src/state_machine/synchronizer.ts +8 -7
- package/src/txe_session.ts +416 -115
- package/src/util/encoding.ts +1 -1
- package/src/util/{txe_account_data_provider.ts → txe_account_store.ts} +1 -1
- package/src/util/{txe_contract_data_provider.ts → txe_contract_store.ts} +5 -4
- package/src/util/txe_public_contract_data_source.ts +16 -13
- package/src/utils/block_creation.ts +94 -0
- package/src/utils/tx_effect_creation.ts +38 -0
- package/dest/oracle/txe_oracle.d.ts +0 -124
- package/dest/oracle/txe_oracle.d.ts.map +0 -1
- package/dest/oracle/txe_oracle.js +0 -770
- package/dest/oracle/txe_typed_oracle.d.ts +0 -42
- package/dest/oracle/txe_typed_oracle.d.ts.map +0 -1
- package/dest/oracle/txe_typed_oracle.js +0 -83
- package/dest/txe_constants.d.ts +0 -2
- package/dest/txe_constants.d.ts.map +0 -1
- package/dest/txe_constants.js +0 -7
- package/dest/txe_service/txe_service.d.ts +0 -231
- package/dest/txe_service/txe_service.d.ts.map +0 -1
- package/dest/util/txe_account_data_provider.d.ts +0 -10
- package/dest/util/txe_account_data_provider.d.ts.map +0 -1
- package/dest/util/txe_contract_data_provider.d.ts +0 -11
- package/dest/util/txe_contract_data_provider.d.ts.map +0 -1
- package/src/oracle/txe_oracle.ts +0 -1287
- package/src/oracle/txe_typed_oracle.ts +0 -142
- package/src/txe_constants.ts +0 -9
|
@@ -1,11 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import type { ContractInstanceWithAddress } from '@aztec/aztec.js/contracts';
|
|
2
|
+
import { Fr, Point } from '@aztec/aztec.js/fields';
|
|
3
|
+
import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX } from '@aztec/constants';
|
|
4
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
5
|
+
import {
|
|
6
|
+
type IMiscOracle,
|
|
7
|
+
type IPrivateExecutionOracle,
|
|
8
|
+
type IUtilityExecutionOracle,
|
|
9
|
+
packAsRetrievedNote,
|
|
10
|
+
} from '@aztec/pxe/simulator';
|
|
11
|
+
import { type ContractArtifact, EventSelector, FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
|
|
4
12
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
13
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
6
14
|
|
|
7
|
-
import type {
|
|
8
|
-
import type { TXESessionStateHandler } from '
|
|
15
|
+
import type { IAvmExecutionOracle, ITxeExecutionOracle } from './oracle/interfaces.js';
|
|
16
|
+
import type { TXESessionStateHandler } from './txe_session.js';
|
|
9
17
|
import {
|
|
10
18
|
type ForeignCallArray,
|
|
11
19
|
type ForeignCallSingle,
|
|
@@ -20,11 +28,20 @@ import {
|
|
|
20
28
|
toArray,
|
|
21
29
|
toForeignCallResult,
|
|
22
30
|
toSingle,
|
|
23
|
-
} from '
|
|
31
|
+
} from './util/encoding.js';
|
|
32
|
+
|
|
33
|
+
const MAX_EVENT_LEN = 12; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_RESERVED_FIELDS
|
|
34
|
+
const MAX_PRIVATE_EVENTS_PER_TXE_QUERY = 5;
|
|
35
|
+
|
|
36
|
+
export class UnavailableOracleError extends Error {
|
|
37
|
+
constructor(oracleName: string) {
|
|
38
|
+
super(`${oracleName} oracles not available with the current handler`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
24
41
|
|
|
25
|
-
export class
|
|
42
|
+
export class RPCTranslator {
|
|
26
43
|
/**
|
|
27
|
-
* Create a new instance of `
|
|
44
|
+
* Create a new instance of `RPCTranslator` that will translate all TXE RPC calls to and from the foreign
|
|
28
45
|
* (`ForeignCallSingle`, `ForeignCallResult`, etc.) and native TS types, delegating actual execution of the oracles
|
|
29
46
|
* to the different handlers.
|
|
30
47
|
* @param stateHandler The handler that will process TXE session state transitions, such as entering a private or
|
|
@@ -34,13 +51,61 @@ export class TXEService {
|
|
|
34
51
|
*/
|
|
35
52
|
constructor(
|
|
36
53
|
private stateHandler: TXESessionStateHandler,
|
|
37
|
-
private oracleHandler:
|
|
54
|
+
private oracleHandler:
|
|
55
|
+
| IMiscOracle
|
|
56
|
+
| IUtilityExecutionOracle
|
|
57
|
+
| IPrivateExecutionOracle
|
|
58
|
+
| IAvmExecutionOracle
|
|
59
|
+
| ITxeExecutionOracle,
|
|
38
60
|
) {}
|
|
39
61
|
|
|
62
|
+
// Note: If you rename the following functions to not start with "handlerAs", you must also update the validation
|
|
63
|
+
// check in `TXESession.processFunction`.
|
|
64
|
+
|
|
65
|
+
private handlerAsMisc(): IMiscOracle {
|
|
66
|
+
if (!('isMisc' in this.oracleHandler)) {
|
|
67
|
+
throw new UnavailableOracleError('Misc');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return this.oracleHandler;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private handlerAsUtility(): IUtilityExecutionOracle {
|
|
74
|
+
if (!('isUtility' in this.oracleHandler)) {
|
|
75
|
+
throw new UnavailableOracleError('Utility');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return this.oracleHandler;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private handlerAsPrivate(): IPrivateExecutionOracle {
|
|
82
|
+
if (!('isPrivate' in this.oracleHandler)) {
|
|
83
|
+
throw new UnavailableOracleError('Private');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return this.oracleHandler;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private handlerAsAvm(): IAvmExecutionOracle {
|
|
90
|
+
if (!('isAvm' in this.oracleHandler)) {
|
|
91
|
+
throw new UnavailableOracleError('Avm');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return this.oracleHandler;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private handlerAsTxe(): ITxeExecutionOracle {
|
|
98
|
+
if (!('isTxe' in this.oracleHandler)) {
|
|
99
|
+
throw new UnavailableOracleError('Txe');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return this.oracleHandler;
|
|
103
|
+
}
|
|
104
|
+
|
|
40
105
|
// TXE session state transition functions - these get handled by the state handler
|
|
41
106
|
|
|
42
107
|
async txeSetTopLevelTXEContext() {
|
|
43
|
-
await this.stateHandler.
|
|
108
|
+
await this.stateHandler.enterTopLevelState();
|
|
44
109
|
|
|
45
110
|
return toForeignCallResult([]);
|
|
46
111
|
}
|
|
@@ -48,18 +113,18 @@ export class TXEService {
|
|
|
48
113
|
async txeSetPrivateTXEContext(
|
|
49
114
|
foreignContractAddressIsSome: ForeignCallSingle,
|
|
50
115
|
foreignContractAddressValue: ForeignCallSingle,
|
|
51
|
-
|
|
52
|
-
|
|
116
|
+
foreignAnchorBlockNumberIsSome: ForeignCallSingle,
|
|
117
|
+
foreignAnchorBlockNumberValue: ForeignCallSingle,
|
|
53
118
|
) {
|
|
54
119
|
const contractAddress = fromSingle(foreignContractAddressIsSome).toBool()
|
|
55
120
|
? AztecAddress.fromField(fromSingle(foreignContractAddressValue))
|
|
56
121
|
: undefined;
|
|
57
122
|
|
|
58
|
-
const
|
|
59
|
-
? fromSingle(
|
|
123
|
+
const anchorBlockNumber = fromSingle(foreignAnchorBlockNumberIsSome).toBool()
|
|
124
|
+
? BlockNumber(fromSingle(foreignAnchorBlockNumberValue).toNumber())
|
|
60
125
|
: undefined;
|
|
61
126
|
|
|
62
|
-
const privateContextInputs = await this.stateHandler.
|
|
127
|
+
const privateContextInputs = await this.stateHandler.enterPrivateState(contractAddress, anchorBlockNumber);
|
|
63
128
|
|
|
64
129
|
return toForeignCallResult(privateContextInputs.toFields().map(toSingle));
|
|
65
130
|
}
|
|
@@ -72,7 +137,7 @@ export class TXEService {
|
|
|
72
137
|
? AztecAddress.fromField(fromSingle(foreignContractAddressValue))
|
|
73
138
|
: undefined;
|
|
74
139
|
|
|
75
|
-
await this.stateHandler.
|
|
140
|
+
await this.stateHandler.enterPublicState(contractAddress);
|
|
76
141
|
|
|
77
142
|
return toForeignCallResult([]);
|
|
78
143
|
}
|
|
@@ -85,7 +150,7 @@ export class TXEService {
|
|
|
85
150
|
? AztecAddress.fromField(fromSingle(foreignContractAddressValue))
|
|
86
151
|
: undefined;
|
|
87
152
|
|
|
88
|
-
await this.stateHandler.
|
|
153
|
+
await this.stateHandler.enterUtilityState(contractAddress);
|
|
89
154
|
|
|
90
155
|
return toForeignCallResult([]);
|
|
91
156
|
}
|
|
@@ -94,10 +159,28 @@ export class TXEService {
|
|
|
94
159
|
|
|
95
160
|
// TXE-specific oracles
|
|
96
161
|
|
|
162
|
+
txeGetDefaultAddress() {
|
|
163
|
+
const defaultAddress = this.handlerAsTxe().txeGetDefaultAddress();
|
|
164
|
+
|
|
165
|
+
return toForeignCallResult([toSingle(defaultAddress)]);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async txeGetNextBlockNumber() {
|
|
169
|
+
const nextBlockNumber = await this.handlerAsTxe().txeGetNextBlockNumber();
|
|
170
|
+
|
|
171
|
+
return toForeignCallResult([toSingle(nextBlockNumber)]);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
async txeGetNextBlockTimestamp() {
|
|
175
|
+
const nextBlockTimestamp = await this.handlerAsTxe().txeGetNextBlockTimestamp();
|
|
176
|
+
|
|
177
|
+
return toForeignCallResult([toSingle(nextBlockTimestamp)]);
|
|
178
|
+
}
|
|
179
|
+
|
|
97
180
|
async txeAdvanceBlocksBy(foreignBlocks: ForeignCallSingle) {
|
|
98
181
|
const blocks = fromSingle(foreignBlocks).toNumber();
|
|
99
182
|
|
|
100
|
-
await this.
|
|
183
|
+
await this.handlerAsTxe().txeAdvanceBlocksBy(blocks);
|
|
101
184
|
|
|
102
185
|
return toForeignCallResult([]);
|
|
103
186
|
}
|
|
@@ -105,7 +188,7 @@ export class TXEService {
|
|
|
105
188
|
txeAdvanceTimestampBy(foreignDuration: ForeignCallSingle) {
|
|
106
189
|
const duration = fromSingle(foreignDuration).toBigInt();
|
|
107
190
|
|
|
108
|
-
this.
|
|
191
|
+
this.handlerAsTxe().txeAdvanceTimestampBy(duration);
|
|
109
192
|
|
|
110
193
|
return toForeignCallResult([]);
|
|
111
194
|
}
|
|
@@ -113,7 +196,7 @@ export class TXEService {
|
|
|
113
196
|
async txeDeploy(artifact: ContractArtifact, instance: ContractInstanceWithAddress, foreignSecret: ForeignCallSingle) {
|
|
114
197
|
const secret = fromSingle(foreignSecret);
|
|
115
198
|
|
|
116
|
-
await this.
|
|
199
|
+
await this.handlerAsTxe().txeDeploy(artifact, instance, secret);
|
|
117
200
|
|
|
118
201
|
return toForeignCallResult([
|
|
119
202
|
toArray([
|
|
@@ -129,7 +212,7 @@ export class TXEService {
|
|
|
129
212
|
async txeCreateAccount(foreignSecret: ForeignCallSingle) {
|
|
130
213
|
const secret = fromSingle(foreignSecret);
|
|
131
214
|
|
|
132
|
-
const completeAddress = await this.
|
|
215
|
+
const completeAddress = await this.handlerAsTxe().txeCreateAccount(secret);
|
|
133
216
|
|
|
134
217
|
return toForeignCallResult([
|
|
135
218
|
toSingle(completeAddress.address),
|
|
@@ -144,7 +227,7 @@ export class TXEService {
|
|
|
144
227
|
) {
|
|
145
228
|
const secret = fromSingle(foreignSecret);
|
|
146
229
|
|
|
147
|
-
const completeAddress = await this.
|
|
230
|
+
const completeAddress = await this.handlerAsTxe().txeAddAccount(artifact, instance, secret);
|
|
148
231
|
|
|
149
232
|
return toForeignCallResult([
|
|
150
233
|
toSingle(completeAddress.address),
|
|
@@ -156,7 +239,7 @@ export class TXEService {
|
|
|
156
239
|
const address = addressFromSingle(foreignAddress);
|
|
157
240
|
const messageHash = fromSingle(foreignMessageHash);
|
|
158
241
|
|
|
159
|
-
await this.
|
|
242
|
+
await this.handlerAsTxe().txeAddAuthWitness(address, messageHash);
|
|
160
243
|
|
|
161
244
|
return toForeignCallResult([]);
|
|
162
245
|
}
|
|
@@ -166,52 +249,71 @@ export class TXEService {
|
|
|
166
249
|
utilityAssertCompatibleOracleVersion(foreignVersion: ForeignCallSingle) {
|
|
167
250
|
const version = fromSingle(foreignVersion).toNumber();
|
|
168
251
|
|
|
169
|
-
this.
|
|
252
|
+
this.handlerAsMisc().utilityAssertCompatibleOracleVersion(version);
|
|
170
253
|
|
|
171
254
|
return toForeignCallResult([]);
|
|
172
255
|
}
|
|
173
256
|
|
|
174
257
|
utilityGetRandomField() {
|
|
175
|
-
const randomField = this.
|
|
258
|
+
const randomField = this.handlerAsMisc().utilityGetRandomField();
|
|
176
259
|
|
|
177
260
|
return toForeignCallResult([toSingle(randomField)]);
|
|
178
261
|
}
|
|
179
262
|
|
|
180
|
-
async
|
|
181
|
-
const
|
|
263
|
+
async txeGetLastBlockTimestamp() {
|
|
264
|
+
const timestamp = await this.handlerAsTxe().txeGetLastBlockTimestamp();
|
|
182
265
|
|
|
183
|
-
return toForeignCallResult([toSingle(
|
|
266
|
+
return toForeignCallResult([toSingle(new Fr(timestamp))]);
|
|
184
267
|
}
|
|
185
268
|
|
|
186
|
-
async
|
|
187
|
-
const
|
|
269
|
+
async txeGetLastTxEffects() {
|
|
270
|
+
const { txHash, noteHashes, nullifiers } = await this.handlerAsTxe().txeGetLastTxEffects();
|
|
188
271
|
|
|
189
|
-
return toForeignCallResult([
|
|
272
|
+
return toForeignCallResult([
|
|
273
|
+
toSingle(txHash.hash),
|
|
274
|
+
...arrayToBoundedVec(toArray(noteHashes), MAX_NOTE_HASHES_PER_TX),
|
|
275
|
+
...arrayToBoundedVec(toArray(nullifiers), MAX_NULLIFIERS_PER_TX),
|
|
276
|
+
]);
|
|
190
277
|
}
|
|
191
278
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
279
|
+
async txeGetPrivateEvents(
|
|
280
|
+
foreignSelector: ForeignCallSingle,
|
|
281
|
+
foreignContractAddress: ForeignCallSingle,
|
|
282
|
+
foreignScope: ForeignCallSingle,
|
|
283
|
+
) {
|
|
284
|
+
const selector = EventSelector.fromField(fromSingle(foreignSelector));
|
|
285
|
+
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
286
|
+
const scope = addressFromSingle(foreignScope);
|
|
195
287
|
|
|
196
|
-
|
|
197
|
-
}
|
|
288
|
+
const events = await this.handlerAsTxe().txeGetPrivateEvents(selector, contractAddress, scope);
|
|
198
289
|
|
|
199
|
-
|
|
200
|
-
|
|
290
|
+
if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
|
|
291
|
+
throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
|
|
292
|
+
}
|
|
201
293
|
|
|
202
|
-
|
|
294
|
+
if (events.some(e => e.length > MAX_EVENT_LEN)) {
|
|
295
|
+
throw new Error(`Some private event has length larger than maxLen ${MAX_EVENT_LEN}`);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// This is a workaround as Noir does not currently let us return nested structs with arrays. We instead return a raw
|
|
299
|
+
// multidimensional array in get_private_events_oracle and create the BoundedVecs here.
|
|
300
|
+
const rawArrayStorage = events
|
|
301
|
+
.map(e => e.concat(Array(MAX_EVENT_LEN - e.length).fill(new Fr(0))))
|
|
302
|
+
.concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(Array(MAX_EVENT_LEN).fill(new Fr(0))))
|
|
303
|
+
.flat();
|
|
304
|
+
const eventLengths = events
|
|
305
|
+
.map(e => new Fr(e.length))
|
|
306
|
+
.concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(new Fr(0)));
|
|
307
|
+
const queryLength = new Fr(events.length);
|
|
308
|
+
|
|
309
|
+
return toForeignCallResult([toArray(rawArrayStorage), toArray(eventLengths), toSingle(queryLength)]);
|
|
203
310
|
}
|
|
204
311
|
|
|
205
|
-
|
|
206
|
-
privateStoreInExecutionCache(
|
|
207
|
-
_foreignLength: ForeignCallSingle,
|
|
208
|
-
foreignValues: ForeignCallArray,
|
|
209
|
-
foreignHash: ForeignCallSingle,
|
|
210
|
-
) {
|
|
312
|
+
privateStoreInExecutionCache(foreignValues: ForeignCallArray, foreignHash: ForeignCallSingle) {
|
|
211
313
|
const values = fromArray(foreignValues);
|
|
212
314
|
const hash = fromSingle(foreignHash);
|
|
213
315
|
|
|
214
|
-
this.
|
|
316
|
+
this.handlerAsPrivate().privateStoreInExecutionCache(values, hash);
|
|
215
317
|
|
|
216
318
|
return toForeignCallResult([]);
|
|
217
319
|
}
|
|
@@ -219,23 +321,26 @@ export class TXEService {
|
|
|
219
321
|
async privateLoadFromExecutionCache(foreignHash: ForeignCallSingle) {
|
|
220
322
|
const hash = fromSingle(foreignHash);
|
|
221
323
|
|
|
222
|
-
const returns = await this.
|
|
324
|
+
const returns = await this.handlerAsPrivate().privateLoadFromExecutionCache(hash);
|
|
223
325
|
|
|
224
326
|
return toForeignCallResult([toArray(returns)]);
|
|
225
327
|
}
|
|
226
328
|
|
|
227
|
-
//
|
|
329
|
+
// When the argument is a slice, noir automatically adds a length field to oracle call.
|
|
330
|
+
// When the argument is an array, we add the field length manually to the signature.
|
|
228
331
|
utilityDebugLog(
|
|
332
|
+
foreignLevel: ForeignCallSingle,
|
|
229
333
|
foreignMessage: ForeignCallArray,
|
|
230
334
|
_foreignLength: ForeignCallSingle,
|
|
231
335
|
foreignFields: ForeignCallArray,
|
|
232
336
|
) {
|
|
337
|
+
const level = fromSingle(foreignLevel).toNumber();
|
|
233
338
|
const message = fromArray(foreignMessage)
|
|
234
339
|
.map(field => String.fromCharCode(field.toNumber()))
|
|
235
340
|
.join('');
|
|
236
341
|
const fields = fromArray(foreignFields);
|
|
237
342
|
|
|
238
|
-
this.
|
|
343
|
+
this.handlerAsMisc().utilityDebugLog(level, message, fields);
|
|
239
344
|
|
|
240
345
|
return toForeignCallResult([]);
|
|
241
346
|
}
|
|
@@ -248,10 +353,10 @@ export class TXEService {
|
|
|
248
353
|
) {
|
|
249
354
|
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
250
355
|
const startStorageSlot = fromSingle(foreignStartStorageSlot);
|
|
251
|
-
const blockNumber = fromSingle(foreignBlockNumber).toNumber();
|
|
356
|
+
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
252
357
|
const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
|
|
253
358
|
|
|
254
|
-
const values = await this.
|
|
359
|
+
const values = await this.handlerAsUtility().utilityStorageRead(
|
|
255
360
|
contractAddress,
|
|
256
361
|
startStorageSlot,
|
|
257
362
|
blockNumber,
|
|
@@ -262,10 +367,10 @@ export class TXEService {
|
|
|
262
367
|
}
|
|
263
368
|
|
|
264
369
|
async utilityGetPublicDataWitness(foreignBlockNumber: ForeignCallSingle, foreignLeafSlot: ForeignCallSingle) {
|
|
265
|
-
const blockNumber = fromSingle(foreignBlockNumber).toNumber();
|
|
370
|
+
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
266
371
|
const leafSlot = fromSingle(foreignLeafSlot);
|
|
267
372
|
|
|
268
|
-
const witness = await this.
|
|
373
|
+
const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(blockNumber, leafSlot);
|
|
269
374
|
|
|
270
375
|
if (!witness) {
|
|
271
376
|
throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockNumber}.`);
|
|
@@ -274,6 +379,8 @@ export class TXEService {
|
|
|
274
379
|
}
|
|
275
380
|
|
|
276
381
|
async utilityGetNotes(
|
|
382
|
+
foreignOwnerIsSome: ForeignCallSingle,
|
|
383
|
+
foreignOwnerValue: ForeignCallSingle,
|
|
277
384
|
foreignStorageSlot: ForeignCallSingle,
|
|
278
385
|
foreignNumSelects: ForeignCallSingle,
|
|
279
386
|
foreignSelectByIndexes: ForeignCallArray,
|
|
@@ -291,6 +398,10 @@ export class TXEService {
|
|
|
291
398
|
foreignMaxNotes: ForeignCallSingle,
|
|
292
399
|
foreignPackedRetrievedNoteLength: ForeignCallSingle,
|
|
293
400
|
) {
|
|
401
|
+
// Parse Option<AztecAddress>: ownerIsSome is 0 for None, 1 for Some
|
|
402
|
+
const owner = fromSingle(foreignOwnerIsSome).toBool()
|
|
403
|
+
? AztecAddress.fromField(fromSingle(foreignOwnerValue))
|
|
404
|
+
: undefined;
|
|
294
405
|
const storageSlot = fromSingle(foreignStorageSlot);
|
|
295
406
|
const numSelects = fromSingle(foreignNumSelects).toNumber();
|
|
296
407
|
const selectByIndexes = fromArray(foreignSelectByIndexes).map(fr => fr.toNumber());
|
|
@@ -308,7 +419,8 @@ export class TXEService {
|
|
|
308
419
|
const maxNotes = fromSingle(foreignMaxNotes).toNumber();
|
|
309
420
|
const packedRetrievedNoteLength = fromSingle(foreignPackedRetrievedNoteLength).toNumber();
|
|
310
421
|
|
|
311
|
-
const noteDatas = await this.
|
|
422
|
+
const noteDatas = await this.handlerAsUtility().utilityGetNotes(
|
|
423
|
+
owner,
|
|
312
424
|
storageSlot,
|
|
313
425
|
numSelects,
|
|
314
426
|
selectByIndexes,
|
|
@@ -325,7 +437,17 @@ export class TXEService {
|
|
|
325
437
|
status,
|
|
326
438
|
);
|
|
327
439
|
|
|
328
|
-
const returnDataAsArrayOfArrays = noteDatas.map(
|
|
440
|
+
const returnDataAsArrayOfArrays = noteDatas.map(noteData =>
|
|
441
|
+
packAsRetrievedNote({
|
|
442
|
+
contractAddress: noteData.contractAddress,
|
|
443
|
+
owner: noteData.owner,
|
|
444
|
+
randomness: noteData.randomness,
|
|
445
|
+
storageSlot: noteData.storageSlot,
|
|
446
|
+
noteNonce: noteData.noteNonce,
|
|
447
|
+
index: noteData.index,
|
|
448
|
+
note: noteData.note,
|
|
449
|
+
}),
|
|
450
|
+
);
|
|
329
451
|
|
|
330
452
|
// Now we convert each sub-array to an array of ForeignCallSingles
|
|
331
453
|
const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map(subArray =>
|
|
@@ -343,19 +465,31 @@ export class TXEService {
|
|
|
343
465
|
}
|
|
344
466
|
|
|
345
467
|
privateNotifyCreatedNote(
|
|
468
|
+
foreignOwner: ForeignCallSingle,
|
|
346
469
|
foreignStorageSlot: ForeignCallSingle,
|
|
470
|
+
foreignRandomness: ForeignCallSingle,
|
|
347
471
|
foreignNoteTypeId: ForeignCallSingle,
|
|
348
472
|
foreignNote: ForeignCallArray,
|
|
349
473
|
foreignNoteHash: ForeignCallSingle,
|
|
350
474
|
foreignCounter: ForeignCallSingle,
|
|
351
475
|
) {
|
|
476
|
+
const owner = addressFromSingle(foreignOwner);
|
|
352
477
|
const storageSlot = fromSingle(foreignStorageSlot);
|
|
478
|
+
const randomness = fromSingle(foreignRandomness);
|
|
353
479
|
const noteTypeId = NoteSelector.fromField(fromSingle(foreignNoteTypeId));
|
|
354
480
|
const note = fromArray(foreignNote);
|
|
355
481
|
const noteHash = fromSingle(foreignNoteHash);
|
|
356
482
|
const counter = fromSingle(foreignCounter).toNumber();
|
|
357
483
|
|
|
358
|
-
this.
|
|
484
|
+
this.handlerAsPrivate().privateNotifyCreatedNote(
|
|
485
|
+
owner,
|
|
486
|
+
storageSlot,
|
|
487
|
+
randomness,
|
|
488
|
+
noteTypeId,
|
|
489
|
+
note,
|
|
490
|
+
noteHash,
|
|
491
|
+
counter,
|
|
492
|
+
);
|
|
359
493
|
|
|
360
494
|
return toForeignCallResult([]);
|
|
361
495
|
}
|
|
@@ -369,7 +503,7 @@ export class TXEService {
|
|
|
369
503
|
const noteHash = fromSingle(foreignNoteHash);
|
|
370
504
|
const counter = fromSingle(foreignCounter).toNumber();
|
|
371
505
|
|
|
372
|
-
await this.
|
|
506
|
+
await this.handlerAsPrivate().privateNotifyNullifiedNote(innerNullifier, noteHash, counter);
|
|
373
507
|
|
|
374
508
|
return toForeignCallResult([]);
|
|
375
509
|
}
|
|
@@ -377,7 +511,7 @@ export class TXEService {
|
|
|
377
511
|
async privateNotifyCreatedNullifier(foreignInnerNullifier: ForeignCallSingle) {
|
|
378
512
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
379
513
|
|
|
380
|
-
await this.
|
|
514
|
+
await this.handlerAsPrivate().privateNotifyCreatedNullifier(innerNullifier);
|
|
381
515
|
|
|
382
516
|
return toForeignCallResult([]);
|
|
383
517
|
}
|
|
@@ -385,7 +519,7 @@ export class TXEService {
|
|
|
385
519
|
async utilityCheckNullifierExists(foreignInnerNullifier: ForeignCallSingle) {
|
|
386
520
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
387
521
|
|
|
388
|
-
const exists = await this.
|
|
522
|
+
const exists = await this.handlerAsUtility().utilityCheckNullifierExists(innerNullifier);
|
|
389
523
|
|
|
390
524
|
return toForeignCallResult([toSingle(new Fr(exists))]);
|
|
391
525
|
}
|
|
@@ -393,7 +527,7 @@ export class TXEService {
|
|
|
393
527
|
async utilityGetContractInstance(foreignAddress: ForeignCallSingle) {
|
|
394
528
|
const address = addressFromSingle(foreignAddress);
|
|
395
529
|
|
|
396
|
-
const instance = await this.
|
|
530
|
+
const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
|
|
397
531
|
|
|
398
532
|
return toForeignCallResult(
|
|
399
533
|
[
|
|
@@ -409,7 +543,7 @@ export class TXEService {
|
|
|
409
543
|
async utilityGetPublicKeysAndPartialAddress(foreignAddress: ForeignCallSingle) {
|
|
410
544
|
const address = addressFromSingle(foreignAddress);
|
|
411
545
|
|
|
412
|
-
const { publicKeys, partialAddress } = await this.
|
|
546
|
+
const { publicKeys, partialAddress } = await this.handlerAsUtility().utilityGetPublicKeysAndPartialAddress(address);
|
|
413
547
|
|
|
414
548
|
return toForeignCallResult([toArray([...publicKeys.toFields(), partialAddress])]);
|
|
415
549
|
}
|
|
@@ -417,7 +551,7 @@ export class TXEService {
|
|
|
417
551
|
async utilityGetKeyValidationRequest(foreignPkMHash: ForeignCallSingle) {
|
|
418
552
|
const pkMHash = fromSingle(foreignPkMHash);
|
|
419
553
|
|
|
420
|
-
const keyValidationRequest = await this.
|
|
554
|
+
const keyValidationRequest = await this.handlerAsUtility().utilityGetKeyValidationRequest(pkMHash);
|
|
421
555
|
|
|
422
556
|
return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
|
|
423
557
|
}
|
|
@@ -438,10 +572,10 @@ export class TXEService {
|
|
|
438
572
|
foreignBlockNumber: ForeignCallSingle,
|
|
439
573
|
foreignNullifier: ForeignCallSingle,
|
|
440
574
|
) {
|
|
441
|
-
const blockNumber = fromSingle(foreignBlockNumber).toNumber();
|
|
575
|
+
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
442
576
|
const nullifier = fromSingle(foreignNullifier);
|
|
443
577
|
|
|
444
|
-
const witness = await this.
|
|
578
|
+
const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(blockNumber, nullifier);
|
|
445
579
|
|
|
446
580
|
if (!witness) {
|
|
447
581
|
throw new Error(`Nullifier membership witness not found at block ${blockNumber}.`);
|
|
@@ -452,7 +586,7 @@ export class TXEService {
|
|
|
452
586
|
async utilityGetAuthWitness(foreignMessageHash: ForeignCallSingle) {
|
|
453
587
|
const messageHash = fromSingle(foreignMessageHash);
|
|
454
588
|
|
|
455
|
-
const authWitness = await this.
|
|
589
|
+
const authWitness = await this.handlerAsUtility().utilityGetAuthWitness(messageHash);
|
|
456
590
|
|
|
457
591
|
if (!authWitness) {
|
|
458
592
|
throw new Error(`Auth witness not found for message hash ${messageHash}.`);
|
|
@@ -482,22 +616,22 @@ export class TXEService {
|
|
|
482
616
|
throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
|
|
483
617
|
}
|
|
484
618
|
|
|
485
|
-
async
|
|
486
|
-
const
|
|
487
|
-
|
|
488
|
-
return toForeignCallResult([toSingle(
|
|
619
|
+
public async privateIsSideEffectCounterRevertible(foreignSideEffectCounter: ForeignCallSingle) {
|
|
620
|
+
const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
|
|
621
|
+
const isRevertible = await this.handlerAsPrivate().privateIsSideEffectCounterRevertible(sideEffectCounter);
|
|
622
|
+
return toForeignCallResult([toSingle(new Fr(isRevertible))]);
|
|
489
623
|
}
|
|
490
624
|
|
|
491
|
-
|
|
492
|
-
const
|
|
625
|
+
utilityGetUtilityContext() {
|
|
626
|
+
const context = this.handlerAsUtility().utilityGetUtilityContext();
|
|
493
627
|
|
|
494
|
-
return toForeignCallResult(
|
|
628
|
+
return toForeignCallResult(context.toNoirRepresentation());
|
|
495
629
|
}
|
|
496
630
|
|
|
497
631
|
async utilityGetBlockHeader(foreignBlockNumber: ForeignCallSingle) {
|
|
498
|
-
const blockNumber = fromSingle(foreignBlockNumber).toNumber();
|
|
632
|
+
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
499
633
|
|
|
500
|
-
const header = await this.
|
|
634
|
+
const header = await this.handlerAsUtility().utilityGetBlockHeader(blockNumber);
|
|
501
635
|
|
|
502
636
|
if (!header) {
|
|
503
637
|
throw new Error(`Block header not found for block ${blockNumber}.`);
|
|
@@ -510,11 +644,11 @@ export class TXEService {
|
|
|
510
644
|
foreignTreeId: ForeignCallSingle,
|
|
511
645
|
foreignLeafValue: ForeignCallSingle,
|
|
512
646
|
) {
|
|
513
|
-
const blockNumber = fromSingle(foreignBlockNumber).toNumber();
|
|
647
|
+
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
514
648
|
const treeId = fromSingle(foreignTreeId).toNumber();
|
|
515
649
|
const leafValue = fromSingle(foreignLeafValue);
|
|
516
650
|
|
|
517
|
-
const witness = await this.
|
|
651
|
+
const witness = await this.handlerAsUtility().utilityGetMembershipWitness(blockNumber, treeId, leafValue);
|
|
518
652
|
|
|
519
653
|
if (!witness) {
|
|
520
654
|
throw new Error(
|
|
@@ -528,10 +662,10 @@ export class TXEService {
|
|
|
528
662
|
foreignBlockNumber: ForeignCallSingle,
|
|
529
663
|
foreignNullifier: ForeignCallSingle,
|
|
530
664
|
) {
|
|
531
|
-
const blockNumber = fromSingle(foreignBlockNumber).toNumber();
|
|
665
|
+
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
532
666
|
const nullifier = fromSingle(foreignNullifier);
|
|
533
667
|
|
|
534
|
-
const witness = await this.
|
|
668
|
+
const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(blockNumber, nullifier);
|
|
535
669
|
|
|
536
670
|
if (!witness) {
|
|
537
671
|
throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockNumber}.`);
|
|
@@ -539,19 +673,10 @@ export class TXEService {
|
|
|
539
673
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
540
674
|
}
|
|
541
675
|
|
|
542
|
-
async utilityGetIndexedTaggingSecretAsSender(foreignSender: ForeignCallSingle, foreignRecipient: ForeignCallSingle) {
|
|
543
|
-
const sender = AztecAddress.fromField(fromSingle(foreignSender));
|
|
544
|
-
const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
|
|
545
|
-
|
|
546
|
-
const secret = await this.oracleHandler.utilityGetIndexedTaggingSecretAsSender(sender, recipient);
|
|
547
|
-
|
|
548
|
-
return toForeignCallResult(secret.toFields().map(toSingle));
|
|
549
|
-
}
|
|
550
|
-
|
|
551
676
|
async utilityFetchTaggedLogs(foreignPendingTaggedLogArrayBaseSlot: ForeignCallSingle) {
|
|
552
677
|
const pendingTaggedLogArrayBaseSlot = fromSingle(foreignPendingTaggedLogArrayBaseSlot);
|
|
553
678
|
|
|
554
|
-
await this.
|
|
679
|
+
await this.handlerAsUtility().utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot);
|
|
555
680
|
|
|
556
681
|
return toForeignCallResult([]);
|
|
557
682
|
}
|
|
@@ -565,7 +690,7 @@ export class TXEService {
|
|
|
565
690
|
const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
|
|
566
691
|
const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
|
|
567
692
|
|
|
568
|
-
await this.
|
|
693
|
+
await this.handlerAsUtility().utilityValidateEnqueuedNotesAndEvents(
|
|
569
694
|
contractAddress,
|
|
570
695
|
noteValidationRequestsArrayBaseSlot,
|
|
571
696
|
eventValidationRequestsArrayBaseSlot,
|
|
@@ -583,7 +708,7 @@ export class TXEService {
|
|
|
583
708
|
const logRetrievalRequestsArrayBaseSlot = fromSingle(foreignLogRetrievalRequestsArrayBaseSlot);
|
|
584
709
|
const logRetrievalResponsesArrayBaseSlot = fromSingle(foreignLogRetrievalResponsesArrayBaseSlot);
|
|
585
710
|
|
|
586
|
-
await this.
|
|
711
|
+
await this.handlerAsUtility().utilityBulkRetrieveLogs(
|
|
587
712
|
contractAddress,
|
|
588
713
|
logRetrievalRequestsArrayBaseSlot,
|
|
589
714
|
logRetrievalResponsesArrayBaseSlot,
|
|
@@ -601,7 +726,7 @@ export class TXEService {
|
|
|
601
726
|
const slot = fromSingle(foreignSlot);
|
|
602
727
|
const capsule = fromArray(foreignCapsule);
|
|
603
728
|
|
|
604
|
-
await this.
|
|
729
|
+
await this.handlerAsUtility().utilityStoreCapsule(contractAddress, slot, capsule);
|
|
605
730
|
|
|
606
731
|
return toForeignCallResult([]);
|
|
607
732
|
}
|
|
@@ -615,7 +740,7 @@ export class TXEService {
|
|
|
615
740
|
const slot = fromSingle(foreignSlot);
|
|
616
741
|
const tSize = fromSingle(foreignTSize).toNumber();
|
|
617
742
|
|
|
618
|
-
const values = await this.
|
|
743
|
+
const values = await this.handlerAsUtility().utilityLoadCapsule(contractAddress, slot);
|
|
619
744
|
|
|
620
745
|
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
621
746
|
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
@@ -632,7 +757,7 @@ export class TXEService {
|
|
|
632
757
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
633
758
|
const slot = fromSingle(foreignSlot);
|
|
634
759
|
|
|
635
|
-
await this.
|
|
760
|
+
await this.handlerAsUtility().utilityDeleteCapsule(contractAddress, slot);
|
|
636
761
|
|
|
637
762
|
return toForeignCallResult([]);
|
|
638
763
|
}
|
|
@@ -648,7 +773,7 @@ export class TXEService {
|
|
|
648
773
|
const dstSlot = fromSingle(foreignDstSlot);
|
|
649
774
|
const numEntries = fromSingle(foreignNumEntries).toNumber();
|
|
650
775
|
|
|
651
|
-
await this.
|
|
776
|
+
await this.handlerAsUtility().utilityCopyCapsule(contractAddress, srcSlot, dstSlot, numEntries);
|
|
652
777
|
|
|
653
778
|
return toForeignCallResult([]);
|
|
654
779
|
}
|
|
@@ -667,7 +792,7 @@ export class TXEService {
|
|
|
667
792
|
const iv = fromUintArray(foreignIv, 8);
|
|
668
793
|
const symKey = fromUintArray(foreignSymKey, 8);
|
|
669
794
|
|
|
670
|
-
const plaintextBuffer = await this.
|
|
795
|
+
const plaintextBuffer = await this.handlerAsUtility().utilityAes128Decrypt(ciphertext, iv, symKey);
|
|
671
796
|
|
|
672
797
|
return toForeignCallResult(
|
|
673
798
|
arrayToBoundedVec(bufferToU8Array(plaintextBuffer), foreignCiphertextBVecStorage.length),
|
|
@@ -687,7 +812,7 @@ export class TXEService {
|
|
|
687
812
|
fromSingle(foreignEphPKField2),
|
|
688
813
|
]);
|
|
689
814
|
|
|
690
|
-
const secret = await this.
|
|
815
|
+
const secret = await this.handlerAsUtility().utilityGetSharedSecret(address, ephPK);
|
|
691
816
|
|
|
692
817
|
return toForeignCallResult(secret.toFields().map(toSingle));
|
|
693
818
|
}
|
|
@@ -706,7 +831,7 @@ export class TXEService {
|
|
|
706
831
|
async avmOpcodeStorageRead(foreignSlot: ForeignCallSingle) {
|
|
707
832
|
const slot = fromSingle(foreignSlot);
|
|
708
833
|
|
|
709
|
-
const value = (await this.
|
|
834
|
+
const value = (await this.handlerAsAvm().avmOpcodeStorageRead(slot)).value;
|
|
710
835
|
|
|
711
836
|
return toForeignCallResult([toSingle(new Fr(value))]);
|
|
712
837
|
}
|
|
@@ -715,7 +840,7 @@ export class TXEService {
|
|
|
715
840
|
const slot = fromSingle(foreignSlot);
|
|
716
841
|
const value = fromSingle(foreignValue);
|
|
717
842
|
|
|
718
|
-
await this.
|
|
843
|
+
await this.handlerAsAvm().avmOpcodeStorageWrite(slot, value);
|
|
719
844
|
|
|
720
845
|
return toForeignCallResult([]);
|
|
721
846
|
}
|
|
@@ -723,7 +848,7 @@ export class TXEService {
|
|
|
723
848
|
async avmOpcodeGetContractInstanceDeployer(foreignAddress: ForeignCallSingle) {
|
|
724
849
|
const address = addressFromSingle(foreignAddress);
|
|
725
850
|
|
|
726
|
-
const instance = await this.
|
|
851
|
+
const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
|
|
727
852
|
|
|
728
853
|
return toForeignCallResult([
|
|
729
854
|
toSingle(instance.deployer),
|
|
@@ -735,7 +860,7 @@ export class TXEService {
|
|
|
735
860
|
async avmOpcodeGetContractInstanceClassId(foreignAddress: ForeignCallSingle) {
|
|
736
861
|
const address = addressFromSingle(foreignAddress);
|
|
737
862
|
|
|
738
|
-
const instance = await this.
|
|
863
|
+
const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
|
|
739
864
|
|
|
740
865
|
return toForeignCallResult([
|
|
741
866
|
toSingle(instance.currentContractClassId),
|
|
@@ -747,7 +872,7 @@ export class TXEService {
|
|
|
747
872
|
async avmOpcodeGetContractInstanceInitializationHash(foreignAddress: ForeignCallSingle) {
|
|
748
873
|
const address = addressFromSingle(foreignAddress);
|
|
749
874
|
|
|
750
|
-
const instance = await this.
|
|
875
|
+
const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
|
|
751
876
|
|
|
752
877
|
return toForeignCallResult([
|
|
753
878
|
toSingle(instance.initializationHash),
|
|
@@ -756,8 +881,8 @@ export class TXEService {
|
|
|
756
881
|
]);
|
|
757
882
|
}
|
|
758
883
|
|
|
759
|
-
avmOpcodeSender() {
|
|
760
|
-
const sender = this.
|
|
884
|
+
async avmOpcodeSender() {
|
|
885
|
+
const sender = await this.handlerAsAvm().avmOpcodeSender();
|
|
761
886
|
|
|
762
887
|
return toForeignCallResult([toSingle(sender)]);
|
|
763
888
|
}
|
|
@@ -765,7 +890,7 @@ export class TXEService {
|
|
|
765
890
|
async avmOpcodeEmitNullifier(foreignNullifier: ForeignCallSingle) {
|
|
766
891
|
const nullifier = fromSingle(foreignNullifier);
|
|
767
892
|
|
|
768
|
-
await this.
|
|
893
|
+
await this.handlerAsAvm().avmOpcodeEmitNullifier(nullifier);
|
|
769
894
|
|
|
770
895
|
return toForeignCallResult([]);
|
|
771
896
|
}
|
|
@@ -773,7 +898,7 @@ export class TXEService {
|
|
|
773
898
|
async avmOpcodeEmitNoteHash(foreignNoteHash: ForeignCallSingle) {
|
|
774
899
|
const noteHash = fromSingle(foreignNoteHash);
|
|
775
900
|
|
|
776
|
-
await this.
|
|
901
|
+
await this.handlerAsAvm().avmOpcodeEmitNoteHash(noteHash);
|
|
777
902
|
|
|
778
903
|
return toForeignCallResult([]);
|
|
779
904
|
}
|
|
@@ -782,43 +907,43 @@ export class TXEService {
|
|
|
782
907
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
783
908
|
const targetAddress = AztecAddress.fromField(fromSingle(foreignTargetAddress));
|
|
784
909
|
|
|
785
|
-
const exists = await this.
|
|
910
|
+
const exists = await this.handlerAsAvm().avmOpcodeNullifierExists(innerNullifier, targetAddress);
|
|
786
911
|
|
|
787
912
|
return toForeignCallResult([toSingle(new Fr(exists))]);
|
|
788
913
|
}
|
|
789
914
|
|
|
790
915
|
async avmOpcodeAddress() {
|
|
791
|
-
const contractAddress = await this.
|
|
916
|
+
const contractAddress = await this.handlerAsAvm().avmOpcodeAddress();
|
|
792
917
|
|
|
793
918
|
return toForeignCallResult([toSingle(contractAddress.toField())]);
|
|
794
919
|
}
|
|
795
920
|
|
|
796
921
|
async avmOpcodeBlockNumber() {
|
|
797
|
-
const blockNumber = await this.
|
|
922
|
+
const blockNumber = await this.handlerAsAvm().avmOpcodeBlockNumber();
|
|
798
923
|
|
|
799
924
|
return toForeignCallResult([toSingle(new Fr(blockNumber))]);
|
|
800
925
|
}
|
|
801
926
|
|
|
802
927
|
async avmOpcodeTimestamp() {
|
|
803
|
-
const timestamp = await this.
|
|
928
|
+
const timestamp = await this.handlerAsAvm().avmOpcodeTimestamp();
|
|
804
929
|
|
|
805
930
|
return toForeignCallResult([toSingle(new Fr(timestamp))]);
|
|
806
931
|
}
|
|
807
932
|
|
|
808
933
|
async avmOpcodeIsStaticCall() {
|
|
809
|
-
const isStaticCall = await this.
|
|
934
|
+
const isStaticCall = await this.handlerAsAvm().avmOpcodeIsStaticCall();
|
|
810
935
|
|
|
811
936
|
return toForeignCallResult([toSingle(new Fr(isStaticCall ? 1 : 0))]);
|
|
812
937
|
}
|
|
813
938
|
|
|
814
939
|
async avmOpcodeChainId() {
|
|
815
|
-
const chainId = await this.
|
|
940
|
+
const chainId = await this.handlerAsAvm().avmOpcodeChainId();
|
|
816
941
|
|
|
817
942
|
return toForeignCallResult([toSingle(chainId)]);
|
|
818
943
|
}
|
|
819
944
|
|
|
820
945
|
async avmOpcodeVersion() {
|
|
821
|
-
const version = await this.
|
|
946
|
+
const version = await this.handlerAsAvm().avmOpcodeVersion();
|
|
822
947
|
|
|
823
948
|
return toForeignCallResult([toSingle(version)]);
|
|
824
949
|
}
|
|
@@ -869,7 +994,6 @@ export class TXEService {
|
|
|
869
994
|
foreignFrom: ForeignCallSingle,
|
|
870
995
|
foreignTargetContractAddress: ForeignCallSingle,
|
|
871
996
|
foreignFunctionSelector: ForeignCallSingle,
|
|
872
|
-
_foreignArgsLength: ForeignCallSingle,
|
|
873
997
|
foreignArgs: ForeignCallArray,
|
|
874
998
|
foreignArgsHash: ForeignCallSingle,
|
|
875
999
|
foreignIsStaticCall: ForeignCallSingle,
|
|
@@ -881,7 +1005,7 @@ export class TXEService {
|
|
|
881
1005
|
const argsHash = fromSingle(foreignArgsHash);
|
|
882
1006
|
const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
|
|
883
1007
|
|
|
884
|
-
const
|
|
1008
|
+
const returnValues = await this.handlerAsTxe().txePrivateCallNewFlow(
|
|
885
1009
|
from,
|
|
886
1010
|
targetContractAddress,
|
|
887
1011
|
functionSelector,
|
|
@@ -890,27 +1014,30 @@ export class TXEService {
|
|
|
890
1014
|
isStaticCall,
|
|
891
1015
|
);
|
|
892
1016
|
|
|
893
|
-
return toForeignCallResult([toArray(
|
|
1017
|
+
return toForeignCallResult([toArray(returnValues)]);
|
|
894
1018
|
}
|
|
895
1019
|
|
|
896
|
-
async
|
|
1020
|
+
async txeSimulateUtilityFunction(
|
|
897
1021
|
foreignTargetContractAddress: ForeignCallSingle,
|
|
898
1022
|
foreignFunctionSelector: ForeignCallSingle,
|
|
899
|
-
|
|
1023
|
+
foreignArgs: ForeignCallArray,
|
|
900
1024
|
) {
|
|
901
1025
|
const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
|
|
902
1026
|
const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
|
|
903
|
-
const
|
|
1027
|
+
const args = fromArray(foreignArgs);
|
|
904
1028
|
|
|
905
|
-
const
|
|
1029
|
+
const returnValues = await this.handlerAsTxe().txeSimulateUtilityFunction(
|
|
1030
|
+
targetContractAddress,
|
|
1031
|
+
functionSelector,
|
|
1032
|
+
args,
|
|
1033
|
+
);
|
|
906
1034
|
|
|
907
|
-
return toForeignCallResult([
|
|
1035
|
+
return toForeignCallResult([toArray(returnValues)]);
|
|
908
1036
|
}
|
|
909
1037
|
|
|
910
1038
|
async txePublicCallNewFlow(
|
|
911
1039
|
foreignFrom: ForeignCallSingle,
|
|
912
1040
|
foreignAddress: ForeignCallSingle,
|
|
913
|
-
_foreignLength: ForeignCallSingle,
|
|
914
1041
|
foreignCalldata: ForeignCallArray,
|
|
915
1042
|
foreignIsStaticCall: ForeignCallSingle,
|
|
916
1043
|
) {
|
|
@@ -919,13 +1046,13 @@ export class TXEService {
|
|
|
919
1046
|
const calldata = fromArray(foreignCalldata);
|
|
920
1047
|
const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
|
|
921
1048
|
|
|
922
|
-
const
|
|
1049
|
+
const returnValues = await this.handlerAsTxe().txePublicCallNewFlow(from, address, calldata, isStaticCall);
|
|
923
1050
|
|
|
924
|
-
return toForeignCallResult([toArray(
|
|
1051
|
+
return toForeignCallResult([toArray(returnValues)]);
|
|
925
1052
|
}
|
|
926
1053
|
|
|
927
1054
|
async privateGetSenderForTags() {
|
|
928
|
-
const sender = await this.
|
|
1055
|
+
const sender = await this.handlerAsPrivate().privateGetSenderForTags();
|
|
929
1056
|
|
|
930
1057
|
// Return a Noir Option struct with `some` and `value` fields
|
|
931
1058
|
if (sender === undefined) {
|
|
@@ -940,8 +1067,17 @@ export class TXEService {
|
|
|
940
1067
|
async privateSetSenderForTags(foreignSenderForTags: ForeignCallSingle) {
|
|
941
1068
|
const senderForTags = AztecAddress.fromField(fromSingle(foreignSenderForTags));
|
|
942
1069
|
|
|
943
|
-
await this.
|
|
1070
|
+
await this.handlerAsPrivate().privateSetSenderForTags(senderForTags);
|
|
944
1071
|
|
|
945
1072
|
return toForeignCallResult([]);
|
|
946
1073
|
}
|
|
1074
|
+
|
|
1075
|
+
async privateGetNextAppTagAsSender(foreignSender: ForeignCallSingle, foreignRecipient: ForeignCallSingle) {
|
|
1076
|
+
const sender = AztecAddress.fromField(fromSingle(foreignSender));
|
|
1077
|
+
const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
|
|
1078
|
+
|
|
1079
|
+
const nextAppTag = await this.handlerAsPrivate().privateGetNextAppTagAsSender(sender, recipient);
|
|
1080
|
+
|
|
1081
|
+
return toForeignCallResult([toSingle(nextAppTag.value)]);
|
|
1082
|
+
}
|
|
947
1083
|
}
|