@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,14 +1,23 @@
|
|
|
1
|
-
import { Fr, Point } from '@aztec/aztec.js';
|
|
1
|
+
import { Fr, Point } from '@aztec/aztec.js/fields';
|
|
2
|
+
import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX } from '@aztec/constants';
|
|
3
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
4
|
import { packAsRetrievedNote } from '@aztec/pxe/simulator';
|
|
3
|
-
import { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
|
|
5
|
+
import { EventSelector, FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
|
|
4
6
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
7
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
6
|
-
import { addressFromSingle, arrayOfArraysToBoundedVecOfArrays, arrayToBoundedVec, bufferToU8Array, fromArray, fromSingle, fromUintArray, fromUintBoundedVec, toArray, toForeignCallResult, toSingle } from '
|
|
7
|
-
|
|
8
|
+
import { addressFromSingle, arrayOfArraysToBoundedVecOfArrays, arrayToBoundedVec, bufferToU8Array, fromArray, fromSingle, fromUintArray, fromUintBoundedVec, toArray, toForeignCallResult, toSingle } from './util/encoding.js';
|
|
9
|
+
const MAX_EVENT_LEN = 12; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_RESERVED_FIELDS
|
|
10
|
+
const MAX_PRIVATE_EVENTS_PER_TXE_QUERY = 5;
|
|
11
|
+
export class UnavailableOracleError extends Error {
|
|
12
|
+
constructor(oracleName){
|
|
13
|
+
super(`${oracleName} oracles not available with the current handler`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class RPCTranslator {
|
|
8
17
|
stateHandler;
|
|
9
18
|
oracleHandler;
|
|
10
19
|
/**
|
|
11
|
-
* Create a new instance of `
|
|
20
|
+
* Create a new instance of `RPCTranslator` that will translate all TXE RPC calls to and from the foreign
|
|
12
21
|
* (`ForeignCallSingle`, `ForeignCallResult`, etc.) and native TS types, delegating actual execution of the oracles
|
|
13
22
|
* to the different handlers.
|
|
14
23
|
* @param stateHandler The handler that will process TXE session state transitions, such as entering a private or
|
|
@@ -19,42 +28,92 @@ export class TXEService {
|
|
|
19
28
|
this.stateHandler = stateHandler;
|
|
20
29
|
this.oracleHandler = oracleHandler;
|
|
21
30
|
}
|
|
31
|
+
// Note: If you rename the following functions to not start with "handlerAs", you must also update the validation
|
|
32
|
+
// check in `TXESession.processFunction`.
|
|
33
|
+
handlerAsMisc() {
|
|
34
|
+
if (!('isMisc' in this.oracleHandler)) {
|
|
35
|
+
throw new UnavailableOracleError('Misc');
|
|
36
|
+
}
|
|
37
|
+
return this.oracleHandler;
|
|
38
|
+
}
|
|
39
|
+
handlerAsUtility() {
|
|
40
|
+
if (!('isUtility' in this.oracleHandler)) {
|
|
41
|
+
throw new UnavailableOracleError('Utility');
|
|
42
|
+
}
|
|
43
|
+
return this.oracleHandler;
|
|
44
|
+
}
|
|
45
|
+
handlerAsPrivate() {
|
|
46
|
+
if (!('isPrivate' in this.oracleHandler)) {
|
|
47
|
+
throw new UnavailableOracleError('Private');
|
|
48
|
+
}
|
|
49
|
+
return this.oracleHandler;
|
|
50
|
+
}
|
|
51
|
+
handlerAsAvm() {
|
|
52
|
+
if (!('isAvm' in this.oracleHandler)) {
|
|
53
|
+
throw new UnavailableOracleError('Avm');
|
|
54
|
+
}
|
|
55
|
+
return this.oracleHandler;
|
|
56
|
+
}
|
|
57
|
+
handlerAsTxe() {
|
|
58
|
+
if (!('isTxe' in this.oracleHandler)) {
|
|
59
|
+
throw new UnavailableOracleError('Txe');
|
|
60
|
+
}
|
|
61
|
+
return this.oracleHandler;
|
|
62
|
+
}
|
|
22
63
|
// TXE session state transition functions - these get handled by the state handler
|
|
23
64
|
async txeSetTopLevelTXEContext() {
|
|
24
|
-
await this.stateHandler.
|
|
65
|
+
await this.stateHandler.enterTopLevelState();
|
|
25
66
|
return toForeignCallResult([]);
|
|
26
67
|
}
|
|
27
|
-
async txeSetPrivateTXEContext(foreignContractAddressIsSome, foreignContractAddressValue,
|
|
68
|
+
async txeSetPrivateTXEContext(foreignContractAddressIsSome, foreignContractAddressValue, foreignAnchorBlockNumberIsSome, foreignAnchorBlockNumberValue) {
|
|
28
69
|
const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
|
|
29
|
-
const
|
|
30
|
-
const privateContextInputs = await this.stateHandler.
|
|
70
|
+
const anchorBlockNumber = fromSingle(foreignAnchorBlockNumberIsSome).toBool() ? BlockNumber(fromSingle(foreignAnchorBlockNumberValue).toNumber()) : undefined;
|
|
71
|
+
const privateContextInputs = await this.stateHandler.enterPrivateState(contractAddress, anchorBlockNumber);
|
|
31
72
|
return toForeignCallResult(privateContextInputs.toFields().map(toSingle));
|
|
32
73
|
}
|
|
33
74
|
async txeSetPublicTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
|
|
34
75
|
const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
|
|
35
|
-
await this.stateHandler.
|
|
76
|
+
await this.stateHandler.enterPublicState(contractAddress);
|
|
36
77
|
return toForeignCallResult([]);
|
|
37
78
|
}
|
|
38
79
|
async txeSetUtilityTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
|
|
39
80
|
const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
|
|
40
|
-
await this.stateHandler.
|
|
81
|
+
await this.stateHandler.enterUtilityState(contractAddress);
|
|
41
82
|
return toForeignCallResult([]);
|
|
42
83
|
}
|
|
43
84
|
// Other oracles - these get handled by the oracle handler
|
|
44
85
|
// TXE-specific oracles
|
|
86
|
+
txeGetDefaultAddress() {
|
|
87
|
+
const defaultAddress = this.handlerAsTxe().txeGetDefaultAddress();
|
|
88
|
+
return toForeignCallResult([
|
|
89
|
+
toSingle(defaultAddress)
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
92
|
+
async txeGetNextBlockNumber() {
|
|
93
|
+
const nextBlockNumber = await this.handlerAsTxe().txeGetNextBlockNumber();
|
|
94
|
+
return toForeignCallResult([
|
|
95
|
+
toSingle(nextBlockNumber)
|
|
96
|
+
]);
|
|
97
|
+
}
|
|
98
|
+
async txeGetNextBlockTimestamp() {
|
|
99
|
+
const nextBlockTimestamp = await this.handlerAsTxe().txeGetNextBlockTimestamp();
|
|
100
|
+
return toForeignCallResult([
|
|
101
|
+
toSingle(nextBlockTimestamp)
|
|
102
|
+
]);
|
|
103
|
+
}
|
|
45
104
|
async txeAdvanceBlocksBy(foreignBlocks) {
|
|
46
105
|
const blocks = fromSingle(foreignBlocks).toNumber();
|
|
47
|
-
await this.
|
|
106
|
+
await this.handlerAsTxe().txeAdvanceBlocksBy(blocks);
|
|
48
107
|
return toForeignCallResult([]);
|
|
49
108
|
}
|
|
50
109
|
txeAdvanceTimestampBy(foreignDuration) {
|
|
51
110
|
const duration = fromSingle(foreignDuration).toBigInt();
|
|
52
|
-
this.
|
|
111
|
+
this.handlerAsTxe().txeAdvanceTimestampBy(duration);
|
|
53
112
|
return toForeignCallResult([]);
|
|
54
113
|
}
|
|
55
114
|
async txeDeploy(artifact, instance, foreignSecret) {
|
|
56
115
|
const secret = fromSingle(foreignSecret);
|
|
57
|
-
await this.
|
|
116
|
+
await this.handlerAsTxe().txeDeploy(artifact, instance, secret);
|
|
58
117
|
return toForeignCallResult([
|
|
59
118
|
toArray([
|
|
60
119
|
instance.salt,
|
|
@@ -67,7 +126,7 @@ export class TXEService {
|
|
|
67
126
|
}
|
|
68
127
|
async txeCreateAccount(foreignSecret) {
|
|
69
128
|
const secret = fromSingle(foreignSecret);
|
|
70
|
-
const completeAddress = await this.
|
|
129
|
+
const completeAddress = await this.handlerAsTxe().txeCreateAccount(secret);
|
|
71
130
|
return toForeignCallResult([
|
|
72
131
|
toSingle(completeAddress.address),
|
|
73
132
|
...completeAddress.publicKeys.toFields().map(toSingle)
|
|
@@ -75,7 +134,7 @@ export class TXEService {
|
|
|
75
134
|
}
|
|
76
135
|
async txeAddAccount(artifact, instance, foreignSecret) {
|
|
77
136
|
const secret = fromSingle(foreignSecret);
|
|
78
|
-
const completeAddress = await this.
|
|
137
|
+
const completeAddress = await this.handlerAsTxe().txeAddAccount(artifact, instance, secret);
|
|
79
138
|
return toForeignCallResult([
|
|
80
139
|
toSingle(completeAddress.address),
|
|
81
140
|
...completeAddress.publicKeys.toFields().map(toSingle)
|
|
@@ -84,87 +143,101 @@ export class TXEService {
|
|
|
84
143
|
async txeAddAuthWitness(foreignAddress, foreignMessageHash) {
|
|
85
144
|
const address = addressFromSingle(foreignAddress);
|
|
86
145
|
const messageHash = fromSingle(foreignMessageHash);
|
|
87
|
-
await this.
|
|
146
|
+
await this.handlerAsTxe().txeAddAuthWitness(address, messageHash);
|
|
88
147
|
return toForeignCallResult([]);
|
|
89
148
|
}
|
|
90
149
|
// PXE oracles
|
|
91
150
|
utilityAssertCompatibleOracleVersion(foreignVersion) {
|
|
92
151
|
const version = fromSingle(foreignVersion).toNumber();
|
|
93
|
-
this.
|
|
152
|
+
this.handlerAsMisc().utilityAssertCompatibleOracleVersion(version);
|
|
94
153
|
return toForeignCallResult([]);
|
|
95
154
|
}
|
|
96
155
|
utilityGetRandomField() {
|
|
97
|
-
const randomField = this.
|
|
156
|
+
const randomField = this.handlerAsMisc().utilityGetRandomField();
|
|
98
157
|
return toForeignCallResult([
|
|
99
158
|
toSingle(randomField)
|
|
100
159
|
]);
|
|
101
160
|
}
|
|
102
|
-
async
|
|
103
|
-
const
|
|
104
|
-
return toForeignCallResult([
|
|
105
|
-
toSingle(contractAddress.toField())
|
|
106
|
-
]);
|
|
107
|
-
}
|
|
108
|
-
async utilityGetBlockNumber() {
|
|
109
|
-
const blockNumber = await this.oracleHandler.utilityGetBlockNumber();
|
|
161
|
+
async txeGetLastBlockTimestamp() {
|
|
162
|
+
const timestamp = await this.handlerAsTxe().txeGetLastBlockTimestamp();
|
|
110
163
|
return toForeignCallResult([
|
|
111
|
-
toSingle(new Fr(
|
|
164
|
+
toSingle(new Fr(timestamp))
|
|
112
165
|
]);
|
|
113
166
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const timestamp = await this.oracleHandler.utilityGetTimestamp();
|
|
167
|
+
async txeGetLastTxEffects() {
|
|
168
|
+
const { txHash, noteHashes, nullifiers } = await this.handlerAsTxe().txeGetLastTxEffects();
|
|
117
169
|
return toForeignCallResult([
|
|
118
|
-
toSingle(
|
|
170
|
+
toSingle(txHash.hash),
|
|
171
|
+
...arrayToBoundedVec(toArray(noteHashes), MAX_NOTE_HASHES_PER_TX),
|
|
172
|
+
...arrayToBoundedVec(toArray(nullifiers), MAX_NULLIFIERS_PER_TX)
|
|
119
173
|
]);
|
|
120
174
|
}
|
|
121
|
-
async
|
|
122
|
-
const
|
|
175
|
+
async txeGetPrivateEvents(foreignSelector, foreignContractAddress, foreignScope) {
|
|
176
|
+
const selector = EventSelector.fromField(fromSingle(foreignSelector));
|
|
177
|
+
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
178
|
+
const scope = addressFromSingle(foreignScope);
|
|
179
|
+
const events = await this.handlerAsTxe().txeGetPrivateEvents(selector, contractAddress, scope);
|
|
180
|
+
if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
|
|
181
|
+
throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
|
|
182
|
+
}
|
|
183
|
+
if (events.some((e)=>e.length > MAX_EVENT_LEN)) {
|
|
184
|
+
throw new Error(`Some private event has length larger than maxLen ${MAX_EVENT_LEN}`);
|
|
185
|
+
}
|
|
186
|
+
// This is a workaround as Noir does not currently let us return nested structs with arrays. We instead return a raw
|
|
187
|
+
// multidimensional array in get_private_events_oracle and create the BoundedVecs here.
|
|
188
|
+
const rawArrayStorage = events.map((e)=>e.concat(Array(MAX_EVENT_LEN - e.length).fill(new Fr(0)))).concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(Array(MAX_EVENT_LEN).fill(new Fr(0)))).flat();
|
|
189
|
+
const eventLengths = events.map((e)=>new Fr(e.length)).concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(new Fr(0)));
|
|
190
|
+
const queryLength = new Fr(events.length);
|
|
123
191
|
return toForeignCallResult([
|
|
124
|
-
|
|
192
|
+
toArray(rawArrayStorage),
|
|
193
|
+
toArray(eventLengths),
|
|
194
|
+
toSingle(queryLength)
|
|
125
195
|
]);
|
|
126
196
|
}
|
|
127
|
-
|
|
128
|
-
privateStoreInExecutionCache(_foreignLength, foreignValues, foreignHash) {
|
|
197
|
+
privateStoreInExecutionCache(foreignValues, foreignHash) {
|
|
129
198
|
const values = fromArray(foreignValues);
|
|
130
199
|
const hash = fromSingle(foreignHash);
|
|
131
|
-
this.
|
|
200
|
+
this.handlerAsPrivate().privateStoreInExecutionCache(values, hash);
|
|
132
201
|
return toForeignCallResult([]);
|
|
133
202
|
}
|
|
134
203
|
async privateLoadFromExecutionCache(foreignHash) {
|
|
135
204
|
const hash = fromSingle(foreignHash);
|
|
136
|
-
const returns = await this.
|
|
205
|
+
const returns = await this.handlerAsPrivate().privateLoadFromExecutionCache(hash);
|
|
137
206
|
return toForeignCallResult([
|
|
138
207
|
toArray(returns)
|
|
139
208
|
]);
|
|
140
209
|
}
|
|
141
|
-
//
|
|
142
|
-
|
|
210
|
+
// When the argument is a slice, noir automatically adds a length field to oracle call.
|
|
211
|
+
// When the argument is an array, we add the field length manually to the signature.
|
|
212
|
+
utilityDebugLog(foreignLevel, foreignMessage, _foreignLength, foreignFields) {
|
|
213
|
+
const level = fromSingle(foreignLevel).toNumber();
|
|
143
214
|
const message = fromArray(foreignMessage).map((field)=>String.fromCharCode(field.toNumber())).join('');
|
|
144
215
|
const fields = fromArray(foreignFields);
|
|
145
|
-
this.
|
|
216
|
+
this.handlerAsMisc().utilityDebugLog(level, message, fields);
|
|
146
217
|
return toForeignCallResult([]);
|
|
147
218
|
}
|
|
148
219
|
async utilityStorageRead(foreignContractAddress, foreignStartStorageSlot, foreignBlockNumber, foreignNumberOfElements) {
|
|
149
220
|
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
150
221
|
const startStorageSlot = fromSingle(foreignStartStorageSlot);
|
|
151
|
-
const blockNumber = fromSingle(foreignBlockNumber).toNumber();
|
|
222
|
+
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
152
223
|
const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
|
|
153
|
-
const values = await this.
|
|
224
|
+
const values = await this.handlerAsUtility().utilityStorageRead(contractAddress, startStorageSlot, blockNumber, numberOfElements);
|
|
154
225
|
return toForeignCallResult([
|
|
155
226
|
toArray(values)
|
|
156
227
|
]);
|
|
157
228
|
}
|
|
158
229
|
async utilityGetPublicDataWitness(foreignBlockNumber, foreignLeafSlot) {
|
|
159
|
-
const blockNumber = fromSingle(foreignBlockNumber).toNumber();
|
|
230
|
+
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
160
231
|
const leafSlot = fromSingle(foreignLeafSlot);
|
|
161
|
-
const witness = await this.
|
|
232
|
+
const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(blockNumber, leafSlot);
|
|
162
233
|
if (!witness) {
|
|
163
234
|
throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockNumber}.`);
|
|
164
235
|
}
|
|
165
236
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
166
237
|
}
|
|
167
|
-
async utilityGetNotes(foreignStorageSlot, foreignNumSelects, foreignSelectByIndexes, foreignSelectByOffsets, foreignSelectByLengths, foreignSelectValues, foreignSelectComparators, foreignSortByIndexes, foreignSortByOffsets, foreignSortByLengths, foreignSortOrder, foreignLimit, foreignOffset, foreignStatus, foreignMaxNotes, foreignPackedRetrievedNoteLength) {
|
|
238
|
+
async utilityGetNotes(foreignOwnerIsSome, foreignOwnerValue, foreignStorageSlot, foreignNumSelects, foreignSelectByIndexes, foreignSelectByOffsets, foreignSelectByLengths, foreignSelectValues, foreignSelectComparators, foreignSortByIndexes, foreignSortByOffsets, foreignSortByLengths, foreignSortOrder, foreignLimit, foreignOffset, foreignStatus, foreignMaxNotes, foreignPackedRetrievedNoteLength) {
|
|
239
|
+
// Parse Option<AztecAddress>: ownerIsSome is 0 for None, 1 for Some
|
|
240
|
+
const owner = fromSingle(foreignOwnerIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignOwnerValue)) : undefined;
|
|
168
241
|
const storageSlot = fromSingle(foreignStorageSlot);
|
|
169
242
|
const numSelects = fromSingle(foreignNumSelects).toNumber();
|
|
170
243
|
const selectByIndexes = fromArray(foreignSelectByIndexes).map((fr)=>fr.toNumber());
|
|
@@ -181,44 +254,54 @@ export class TXEService {
|
|
|
181
254
|
const status = fromSingle(foreignStatus).toNumber();
|
|
182
255
|
const maxNotes = fromSingle(foreignMaxNotes).toNumber();
|
|
183
256
|
const packedRetrievedNoteLength = fromSingle(foreignPackedRetrievedNoteLength).toNumber();
|
|
184
|
-
const noteDatas = await this.
|
|
185
|
-
const returnDataAsArrayOfArrays = noteDatas.map(packAsRetrievedNote
|
|
257
|
+
const noteDatas = await this.handlerAsUtility().utilityGetNotes(owner, storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status);
|
|
258
|
+
const returnDataAsArrayOfArrays = noteDatas.map((noteData)=>packAsRetrievedNote({
|
|
259
|
+
contractAddress: noteData.contractAddress,
|
|
260
|
+
owner: noteData.owner,
|
|
261
|
+
randomness: noteData.randomness,
|
|
262
|
+
storageSlot: noteData.storageSlot,
|
|
263
|
+
noteNonce: noteData.noteNonce,
|
|
264
|
+
index: noteData.index,
|
|
265
|
+
note: noteData.note
|
|
266
|
+
}));
|
|
186
267
|
// Now we convert each sub-array to an array of ForeignCallSingles
|
|
187
268
|
const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map((subArray)=>subArray.map(toSingle));
|
|
188
269
|
// At last we convert the array of arrays to a bounded vec of arrays
|
|
189
270
|
return toForeignCallResult(arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedRetrievedNoteLength));
|
|
190
271
|
}
|
|
191
|
-
privateNotifyCreatedNote(foreignStorageSlot, foreignNoteTypeId, foreignNote, foreignNoteHash, foreignCounter) {
|
|
272
|
+
privateNotifyCreatedNote(foreignOwner, foreignStorageSlot, foreignRandomness, foreignNoteTypeId, foreignNote, foreignNoteHash, foreignCounter) {
|
|
273
|
+
const owner = addressFromSingle(foreignOwner);
|
|
192
274
|
const storageSlot = fromSingle(foreignStorageSlot);
|
|
275
|
+
const randomness = fromSingle(foreignRandomness);
|
|
193
276
|
const noteTypeId = NoteSelector.fromField(fromSingle(foreignNoteTypeId));
|
|
194
277
|
const note = fromArray(foreignNote);
|
|
195
278
|
const noteHash = fromSingle(foreignNoteHash);
|
|
196
279
|
const counter = fromSingle(foreignCounter).toNumber();
|
|
197
|
-
this.
|
|
280
|
+
this.handlerAsPrivate().privateNotifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter);
|
|
198
281
|
return toForeignCallResult([]);
|
|
199
282
|
}
|
|
200
283
|
async privateNotifyNullifiedNote(foreignInnerNullifier, foreignNoteHash, foreignCounter) {
|
|
201
284
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
202
285
|
const noteHash = fromSingle(foreignNoteHash);
|
|
203
286
|
const counter = fromSingle(foreignCounter).toNumber();
|
|
204
|
-
await this.
|
|
287
|
+
await this.handlerAsPrivate().privateNotifyNullifiedNote(innerNullifier, noteHash, counter);
|
|
205
288
|
return toForeignCallResult([]);
|
|
206
289
|
}
|
|
207
290
|
async privateNotifyCreatedNullifier(foreignInnerNullifier) {
|
|
208
291
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
209
|
-
await this.
|
|
292
|
+
await this.handlerAsPrivate().privateNotifyCreatedNullifier(innerNullifier);
|
|
210
293
|
return toForeignCallResult([]);
|
|
211
294
|
}
|
|
212
295
|
async utilityCheckNullifierExists(foreignInnerNullifier) {
|
|
213
296
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
214
|
-
const exists = await this.
|
|
297
|
+
const exists = await this.handlerAsUtility().utilityCheckNullifierExists(innerNullifier);
|
|
215
298
|
return toForeignCallResult([
|
|
216
299
|
toSingle(new Fr(exists))
|
|
217
300
|
]);
|
|
218
301
|
}
|
|
219
302
|
async utilityGetContractInstance(foreignAddress) {
|
|
220
303
|
const address = addressFromSingle(foreignAddress);
|
|
221
|
-
const instance = await this.
|
|
304
|
+
const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
|
|
222
305
|
return toForeignCallResult([
|
|
223
306
|
instance.salt,
|
|
224
307
|
instance.deployer.toField(),
|
|
@@ -229,7 +312,7 @@ export class TXEService {
|
|
|
229
312
|
}
|
|
230
313
|
async utilityGetPublicKeysAndPartialAddress(foreignAddress) {
|
|
231
314
|
const address = addressFromSingle(foreignAddress);
|
|
232
|
-
const { publicKeys, partialAddress } = await this.
|
|
315
|
+
const { publicKeys, partialAddress } = await this.handlerAsUtility().utilityGetPublicKeysAndPartialAddress(address);
|
|
233
316
|
return toForeignCallResult([
|
|
234
317
|
toArray([
|
|
235
318
|
...publicKeys.toFields(),
|
|
@@ -239,16 +322,16 @@ export class TXEService {
|
|
|
239
322
|
}
|
|
240
323
|
async utilityGetKeyValidationRequest(foreignPkMHash) {
|
|
241
324
|
const pkMHash = fromSingle(foreignPkMHash);
|
|
242
|
-
const keyValidationRequest = await this.
|
|
325
|
+
const keyValidationRequest = await this.handlerAsUtility().utilityGetKeyValidationRequest(pkMHash);
|
|
243
326
|
return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
|
|
244
327
|
}
|
|
245
328
|
privateCallPrivateFunction(_foreignTargetContractAddress, _foreignFunctionSelector, _foreignArgsHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
|
|
246
329
|
throw new Error('Contract calls are forbidden inside a `TestEnvironment::private_context`, use `private_call` instead');
|
|
247
330
|
}
|
|
248
331
|
async utilityGetNullifierMembershipWitness(foreignBlockNumber, foreignNullifier) {
|
|
249
|
-
const blockNumber = fromSingle(foreignBlockNumber).toNumber();
|
|
332
|
+
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
250
333
|
const nullifier = fromSingle(foreignNullifier);
|
|
251
|
-
const witness = await this.
|
|
334
|
+
const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(blockNumber, nullifier);
|
|
252
335
|
if (!witness) {
|
|
253
336
|
throw new Error(`Nullifier membership witness not found at block ${blockNumber}.`);
|
|
254
337
|
}
|
|
@@ -256,7 +339,7 @@ export class TXEService {
|
|
|
256
339
|
}
|
|
257
340
|
async utilityGetAuthWitness(foreignMessageHash) {
|
|
258
341
|
const messageHash = fromSingle(foreignMessageHash);
|
|
259
|
-
const authWitness = await this.
|
|
342
|
+
const authWitness = await this.handlerAsUtility().utilityGetAuthWitness(messageHash);
|
|
260
343
|
if (!authWitness) {
|
|
261
344
|
throw new Error(`Auth witness not found for message hash ${messageHash}.`);
|
|
262
345
|
}
|
|
@@ -273,31 +356,30 @@ export class TXEService {
|
|
|
273
356
|
privateNotifySetMinRevertibleSideEffectCounter(_foreignMinRevertibleSideEffectCounter) {
|
|
274
357
|
throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
|
|
275
358
|
}
|
|
276
|
-
async
|
|
277
|
-
const
|
|
359
|
+
async privateIsSideEffectCounterRevertible(foreignSideEffectCounter) {
|
|
360
|
+
const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
|
|
361
|
+
const isRevertible = await this.handlerAsPrivate().privateIsSideEffectCounterRevertible(sideEffectCounter);
|
|
278
362
|
return toForeignCallResult([
|
|
279
|
-
toSingle(
|
|
363
|
+
toSingle(new Fr(isRevertible))
|
|
280
364
|
]);
|
|
281
365
|
}
|
|
282
|
-
|
|
283
|
-
const
|
|
284
|
-
return toForeignCallResult(
|
|
285
|
-
toSingle(version)
|
|
286
|
-
]);
|
|
366
|
+
utilityGetUtilityContext() {
|
|
367
|
+
const context = this.handlerAsUtility().utilityGetUtilityContext();
|
|
368
|
+
return toForeignCallResult(context.toNoirRepresentation());
|
|
287
369
|
}
|
|
288
370
|
async utilityGetBlockHeader(foreignBlockNumber) {
|
|
289
|
-
const blockNumber = fromSingle(foreignBlockNumber).toNumber();
|
|
290
|
-
const header = await this.
|
|
371
|
+
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
372
|
+
const header = await this.handlerAsUtility().utilityGetBlockHeader(blockNumber);
|
|
291
373
|
if (!header) {
|
|
292
374
|
throw new Error(`Block header not found for block ${blockNumber}.`);
|
|
293
375
|
}
|
|
294
376
|
return toForeignCallResult(header.toFields().map(toSingle));
|
|
295
377
|
}
|
|
296
378
|
async utilityGetMembershipWitness(foreignBlockNumber, foreignTreeId, foreignLeafValue) {
|
|
297
|
-
const blockNumber = fromSingle(foreignBlockNumber).toNumber();
|
|
379
|
+
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
298
380
|
const treeId = fromSingle(foreignTreeId).toNumber();
|
|
299
381
|
const leafValue = fromSingle(foreignLeafValue);
|
|
300
|
-
const witness = await this.
|
|
382
|
+
const witness = await this.handlerAsUtility().utilityGetMembershipWitness(blockNumber, treeId, leafValue);
|
|
301
383
|
if (!witness) {
|
|
302
384
|
throw new Error(`Membership witness in tree ${MerkleTreeId[treeId]} not found for value ${leafValue} at block ${blockNumber}.`);
|
|
303
385
|
}
|
|
@@ -307,51 +389,45 @@ export class TXEService {
|
|
|
307
389
|
]);
|
|
308
390
|
}
|
|
309
391
|
async utilityGetLowNullifierMembershipWitness(foreignBlockNumber, foreignNullifier) {
|
|
310
|
-
const blockNumber = fromSingle(foreignBlockNumber).toNumber();
|
|
392
|
+
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
311
393
|
const nullifier = fromSingle(foreignNullifier);
|
|
312
|
-
const witness = await this.
|
|
394
|
+
const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(blockNumber, nullifier);
|
|
313
395
|
if (!witness) {
|
|
314
396
|
throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockNumber}.`);
|
|
315
397
|
}
|
|
316
398
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
317
399
|
}
|
|
318
|
-
async utilityGetIndexedTaggingSecretAsSender(foreignSender, foreignRecipient) {
|
|
319
|
-
const sender = AztecAddress.fromField(fromSingle(foreignSender));
|
|
320
|
-
const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
|
|
321
|
-
const secret = await this.oracleHandler.utilityGetIndexedTaggingSecretAsSender(sender, recipient);
|
|
322
|
-
return toForeignCallResult(secret.toFields().map(toSingle));
|
|
323
|
-
}
|
|
324
400
|
async utilityFetchTaggedLogs(foreignPendingTaggedLogArrayBaseSlot) {
|
|
325
401
|
const pendingTaggedLogArrayBaseSlot = fromSingle(foreignPendingTaggedLogArrayBaseSlot);
|
|
326
|
-
await this.
|
|
402
|
+
await this.handlerAsUtility().utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot);
|
|
327
403
|
return toForeignCallResult([]);
|
|
328
404
|
}
|
|
329
405
|
async utilityValidateEnqueuedNotesAndEvents(foreignContractAddress, foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot) {
|
|
330
406
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
331
407
|
const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
|
|
332
408
|
const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
|
|
333
|
-
await this.
|
|
409
|
+
await this.handlerAsUtility().utilityValidateEnqueuedNotesAndEvents(contractAddress, noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot);
|
|
334
410
|
return toForeignCallResult([]);
|
|
335
411
|
}
|
|
336
412
|
async utilityBulkRetrieveLogs(foreignContractAddress, foreignLogRetrievalRequestsArrayBaseSlot, foreignLogRetrievalResponsesArrayBaseSlot) {
|
|
337
413
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
338
414
|
const logRetrievalRequestsArrayBaseSlot = fromSingle(foreignLogRetrievalRequestsArrayBaseSlot);
|
|
339
415
|
const logRetrievalResponsesArrayBaseSlot = fromSingle(foreignLogRetrievalResponsesArrayBaseSlot);
|
|
340
|
-
await this.
|
|
416
|
+
await this.handlerAsUtility().utilityBulkRetrieveLogs(contractAddress, logRetrievalRequestsArrayBaseSlot, logRetrievalResponsesArrayBaseSlot);
|
|
341
417
|
return toForeignCallResult([]);
|
|
342
418
|
}
|
|
343
419
|
async utilityStoreCapsule(foreignContractAddress, foreignSlot, foreignCapsule) {
|
|
344
420
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
345
421
|
const slot = fromSingle(foreignSlot);
|
|
346
422
|
const capsule = fromArray(foreignCapsule);
|
|
347
|
-
await this.
|
|
423
|
+
await this.handlerAsUtility().utilityStoreCapsule(contractAddress, slot, capsule);
|
|
348
424
|
return toForeignCallResult([]);
|
|
349
425
|
}
|
|
350
426
|
async utilityLoadCapsule(foreignContractAddress, foreignSlot, foreignTSize) {
|
|
351
427
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
352
428
|
const slot = fromSingle(foreignSlot);
|
|
353
429
|
const tSize = fromSingle(foreignTSize).toNumber();
|
|
354
|
-
const values = await this.
|
|
430
|
+
const values = await this.handlerAsUtility().utilityLoadCapsule(contractAddress, slot);
|
|
355
431
|
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
356
432
|
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
357
433
|
if (values === null) {
|
|
@@ -371,7 +447,7 @@ export class TXEService {
|
|
|
371
447
|
async utilityDeleteCapsule(foreignContractAddress, foreignSlot) {
|
|
372
448
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
373
449
|
const slot = fromSingle(foreignSlot);
|
|
374
|
-
await this.
|
|
450
|
+
await this.handlerAsUtility().utilityDeleteCapsule(contractAddress, slot);
|
|
375
451
|
return toForeignCallResult([]);
|
|
376
452
|
}
|
|
377
453
|
async utilityCopyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries) {
|
|
@@ -379,7 +455,7 @@ export class TXEService {
|
|
|
379
455
|
const srcSlot = fromSingle(foreignSrcSlot);
|
|
380
456
|
const dstSlot = fromSingle(foreignDstSlot);
|
|
381
457
|
const numEntries = fromSingle(foreignNumEntries).toNumber();
|
|
382
|
-
await this.
|
|
458
|
+
await this.handlerAsUtility().utilityCopyCapsule(contractAddress, srcSlot, dstSlot, numEntries);
|
|
383
459
|
return toForeignCallResult([]);
|
|
384
460
|
}
|
|
385
461
|
// TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
|
|
@@ -390,7 +466,7 @@ export class TXEService {
|
|
|
390
466
|
const ciphertext = fromUintBoundedVec(foreignCiphertextBVecStorage, foreignCiphertextLength, 8);
|
|
391
467
|
const iv = fromUintArray(foreignIv, 8);
|
|
392
468
|
const symKey = fromUintArray(foreignSymKey, 8);
|
|
393
|
-
const plaintextBuffer = await this.
|
|
469
|
+
const plaintextBuffer = await this.handlerAsUtility().utilityAes128Decrypt(ciphertext, iv, symKey);
|
|
394
470
|
return toForeignCallResult(arrayToBoundedVec(bufferToU8Array(plaintextBuffer), foreignCiphertextBVecStorage.length));
|
|
395
471
|
}
|
|
396
472
|
async utilityGetSharedSecret(foreignAddress, foreignEphPKField0, foreignEphPKField1, foreignEphPKField2) {
|
|
@@ -400,7 +476,7 @@ export class TXEService {
|
|
|
400
476
|
fromSingle(foreignEphPKField1),
|
|
401
477
|
fromSingle(foreignEphPKField2)
|
|
402
478
|
]);
|
|
403
|
-
const secret = await this.
|
|
479
|
+
const secret = await this.handlerAsUtility().utilityGetSharedSecret(address, ephPK);
|
|
404
480
|
return toForeignCallResult(secret.toFields().map(toSingle));
|
|
405
481
|
}
|
|
406
482
|
emitOffchainEffect(_foreignData) {
|
|
@@ -413,7 +489,7 @@ export class TXEService {
|
|
|
413
489
|
}
|
|
414
490
|
async avmOpcodeStorageRead(foreignSlot) {
|
|
415
491
|
const slot = fromSingle(foreignSlot);
|
|
416
|
-
const value = (await this.
|
|
492
|
+
const value = (await this.handlerAsAvm().avmOpcodeStorageRead(slot)).value;
|
|
417
493
|
return toForeignCallResult([
|
|
418
494
|
toSingle(new Fr(value))
|
|
419
495
|
]);
|
|
@@ -421,12 +497,12 @@ export class TXEService {
|
|
|
421
497
|
async avmOpcodeStorageWrite(foreignSlot, foreignValue) {
|
|
422
498
|
const slot = fromSingle(foreignSlot);
|
|
423
499
|
const value = fromSingle(foreignValue);
|
|
424
|
-
await this.
|
|
500
|
+
await this.handlerAsAvm().avmOpcodeStorageWrite(slot, value);
|
|
425
501
|
return toForeignCallResult([]);
|
|
426
502
|
}
|
|
427
503
|
async avmOpcodeGetContractInstanceDeployer(foreignAddress) {
|
|
428
504
|
const address = addressFromSingle(foreignAddress);
|
|
429
|
-
const instance = await this.
|
|
505
|
+
const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
|
|
430
506
|
return toForeignCallResult([
|
|
431
507
|
toSingle(instance.deployer),
|
|
432
508
|
// AVM requires an extra boolean indicating the instance was found
|
|
@@ -435,7 +511,7 @@ export class TXEService {
|
|
|
435
511
|
}
|
|
436
512
|
async avmOpcodeGetContractInstanceClassId(foreignAddress) {
|
|
437
513
|
const address = addressFromSingle(foreignAddress);
|
|
438
|
-
const instance = await this.
|
|
514
|
+
const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
|
|
439
515
|
return toForeignCallResult([
|
|
440
516
|
toSingle(instance.currentContractClassId),
|
|
441
517
|
// AVM requires an extra boolean indicating the instance was found
|
|
@@ -444,69 +520,69 @@ export class TXEService {
|
|
|
444
520
|
}
|
|
445
521
|
async avmOpcodeGetContractInstanceInitializationHash(foreignAddress) {
|
|
446
522
|
const address = addressFromSingle(foreignAddress);
|
|
447
|
-
const instance = await this.
|
|
523
|
+
const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
|
|
448
524
|
return toForeignCallResult([
|
|
449
525
|
toSingle(instance.initializationHash),
|
|
450
526
|
// AVM requires an extra boolean indicating the instance was found
|
|
451
527
|
toSingle(new Fr(1))
|
|
452
528
|
]);
|
|
453
529
|
}
|
|
454
|
-
avmOpcodeSender() {
|
|
455
|
-
const sender = this.
|
|
530
|
+
async avmOpcodeSender() {
|
|
531
|
+
const sender = await this.handlerAsAvm().avmOpcodeSender();
|
|
456
532
|
return toForeignCallResult([
|
|
457
533
|
toSingle(sender)
|
|
458
534
|
]);
|
|
459
535
|
}
|
|
460
536
|
async avmOpcodeEmitNullifier(foreignNullifier) {
|
|
461
537
|
const nullifier = fromSingle(foreignNullifier);
|
|
462
|
-
await this.
|
|
538
|
+
await this.handlerAsAvm().avmOpcodeEmitNullifier(nullifier);
|
|
463
539
|
return toForeignCallResult([]);
|
|
464
540
|
}
|
|
465
541
|
async avmOpcodeEmitNoteHash(foreignNoteHash) {
|
|
466
542
|
const noteHash = fromSingle(foreignNoteHash);
|
|
467
|
-
await this.
|
|
543
|
+
await this.handlerAsAvm().avmOpcodeEmitNoteHash(noteHash);
|
|
468
544
|
return toForeignCallResult([]);
|
|
469
545
|
}
|
|
470
546
|
async avmOpcodeNullifierExists(foreignInnerNullifier, foreignTargetAddress) {
|
|
471
547
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
472
548
|
const targetAddress = AztecAddress.fromField(fromSingle(foreignTargetAddress));
|
|
473
|
-
const exists = await this.
|
|
549
|
+
const exists = await this.handlerAsAvm().avmOpcodeNullifierExists(innerNullifier, targetAddress);
|
|
474
550
|
return toForeignCallResult([
|
|
475
551
|
toSingle(new Fr(exists))
|
|
476
552
|
]);
|
|
477
553
|
}
|
|
478
554
|
async avmOpcodeAddress() {
|
|
479
|
-
const contractAddress = await this.
|
|
555
|
+
const contractAddress = await this.handlerAsAvm().avmOpcodeAddress();
|
|
480
556
|
return toForeignCallResult([
|
|
481
557
|
toSingle(contractAddress.toField())
|
|
482
558
|
]);
|
|
483
559
|
}
|
|
484
560
|
async avmOpcodeBlockNumber() {
|
|
485
|
-
const blockNumber = await this.
|
|
561
|
+
const blockNumber = await this.handlerAsAvm().avmOpcodeBlockNumber();
|
|
486
562
|
return toForeignCallResult([
|
|
487
563
|
toSingle(new Fr(blockNumber))
|
|
488
564
|
]);
|
|
489
565
|
}
|
|
490
566
|
async avmOpcodeTimestamp() {
|
|
491
|
-
const timestamp = await this.
|
|
567
|
+
const timestamp = await this.handlerAsAvm().avmOpcodeTimestamp();
|
|
492
568
|
return toForeignCallResult([
|
|
493
569
|
toSingle(new Fr(timestamp))
|
|
494
570
|
]);
|
|
495
571
|
}
|
|
496
572
|
async avmOpcodeIsStaticCall() {
|
|
497
|
-
const isStaticCall = await this.
|
|
573
|
+
const isStaticCall = await this.handlerAsAvm().avmOpcodeIsStaticCall();
|
|
498
574
|
return toForeignCallResult([
|
|
499
575
|
toSingle(new Fr(isStaticCall ? 1 : 0))
|
|
500
576
|
]);
|
|
501
577
|
}
|
|
502
578
|
async avmOpcodeChainId() {
|
|
503
|
-
const chainId = await this.
|
|
579
|
+
const chainId = await this.handlerAsAvm().avmOpcodeChainId();
|
|
504
580
|
return toForeignCallResult([
|
|
505
581
|
toSingle(chainId)
|
|
506
582
|
]);
|
|
507
583
|
}
|
|
508
584
|
async avmOpcodeVersion() {
|
|
509
|
-
const version = await this.
|
|
585
|
+
const version = await this.handlerAsAvm().avmOpcodeVersion();
|
|
510
586
|
return toForeignCallResult([
|
|
511
587
|
toSingle(version)
|
|
512
588
|
]);
|
|
@@ -526,46 +602,39 @@ export class TXEService {
|
|
|
526
602
|
avmOpcodeSuccessCopy() {
|
|
527
603
|
throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
|
|
528
604
|
}
|
|
529
|
-
async txePrivateCallNewFlow(foreignFrom, foreignTargetContractAddress, foreignFunctionSelector,
|
|
605
|
+
async txePrivateCallNewFlow(foreignFrom, foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignArgsHash, foreignIsStaticCall) {
|
|
530
606
|
const from = addressFromSingle(foreignFrom);
|
|
531
607
|
const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
|
|
532
608
|
const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
|
|
533
609
|
const args = fromArray(foreignArgs);
|
|
534
610
|
const argsHash = fromSingle(foreignArgsHash);
|
|
535
611
|
const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
|
|
536
|
-
const
|
|
612
|
+
const returnValues = await this.handlerAsTxe().txePrivateCallNewFlow(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall);
|
|
537
613
|
return toForeignCallResult([
|
|
538
|
-
toArray(
|
|
539
|
-
result.endSideEffectCounter,
|
|
540
|
-
result.returnsHash,
|
|
541
|
-
result.txHash.hash
|
|
542
|
-
])
|
|
614
|
+
toArray(returnValues)
|
|
543
615
|
]);
|
|
544
616
|
}
|
|
545
|
-
async
|
|
617
|
+
async txeSimulateUtilityFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgs) {
|
|
546
618
|
const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
|
|
547
619
|
const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
|
|
548
|
-
const
|
|
549
|
-
const
|
|
620
|
+
const args = fromArray(foreignArgs);
|
|
621
|
+
const returnValues = await this.handlerAsTxe().txeSimulateUtilityFunction(targetContractAddress, functionSelector, args);
|
|
550
622
|
return toForeignCallResult([
|
|
551
|
-
|
|
623
|
+
toArray(returnValues)
|
|
552
624
|
]);
|
|
553
625
|
}
|
|
554
|
-
async txePublicCallNewFlow(foreignFrom, foreignAddress,
|
|
626
|
+
async txePublicCallNewFlow(foreignFrom, foreignAddress, foreignCalldata, foreignIsStaticCall) {
|
|
555
627
|
const from = addressFromSingle(foreignFrom);
|
|
556
628
|
const address = addressFromSingle(foreignAddress);
|
|
557
629
|
const calldata = fromArray(foreignCalldata);
|
|
558
630
|
const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
|
|
559
|
-
const
|
|
631
|
+
const returnValues = await this.handlerAsTxe().txePublicCallNewFlow(from, address, calldata, isStaticCall);
|
|
560
632
|
return toForeignCallResult([
|
|
561
|
-
toArray(
|
|
562
|
-
result.returnsHash,
|
|
563
|
-
result.txHash.hash
|
|
564
|
-
])
|
|
633
|
+
toArray(returnValues)
|
|
565
634
|
]);
|
|
566
635
|
}
|
|
567
636
|
async privateGetSenderForTags() {
|
|
568
|
-
const sender = await this.
|
|
637
|
+
const sender = await this.handlerAsPrivate().privateGetSenderForTags();
|
|
569
638
|
// Return a Noir Option struct with `some` and `value` fields
|
|
570
639
|
if (sender === undefined) {
|
|
571
640
|
// No sender found, return Option with some=0 and value=0
|
|
@@ -583,7 +652,15 @@ export class TXEService {
|
|
|
583
652
|
}
|
|
584
653
|
async privateSetSenderForTags(foreignSenderForTags) {
|
|
585
654
|
const senderForTags = AztecAddress.fromField(fromSingle(foreignSenderForTags));
|
|
586
|
-
await this.
|
|
655
|
+
await this.handlerAsPrivate().privateSetSenderForTags(senderForTags);
|
|
587
656
|
return toForeignCallResult([]);
|
|
588
657
|
}
|
|
658
|
+
async privateGetNextAppTagAsSender(foreignSender, foreignRecipient) {
|
|
659
|
+
const sender = AztecAddress.fromField(fromSingle(foreignSender));
|
|
660
|
+
const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
|
|
661
|
+
const nextAppTag = await this.handlerAsPrivate().privateGetNextAppTagAsSender(sender, recipient);
|
|
662
|
+
return toForeignCallResult([
|
|
663
|
+
toSingle(nextAppTag.value)
|
|
664
|
+
]);
|
|
665
|
+
}
|
|
589
666
|
}
|