@aztec/txe 0.0.1-commit.7b97ef96e → 0.0.1-commit.7cbc774
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/ContractClassRegistry-KKNT527R.js +3 -0
- package/dest/ContractClassRegistry-KKNT527R.js.map +7 -0
- package/dest/ContractInstanceRegistry-GSKBNL3Q.js +3 -0
- package/dest/ContractInstanceRegistry-GSKBNL3Q.js.map +7 -0
- package/dest/FeeJuice-GUJ5O6GB.js +3 -0
- package/dest/FeeJuice-GUJ5O6GB.js.map +7 -0
- package/dest/MultiCallEntrypoint-ZQPCKVKL.js +3 -0
- package/dest/MultiCallEntrypoint-ZQPCKVKL.js.map +7 -0
- package/dest/SchnorrAccount-QIXE5DXA.js +3 -0
- package/dest/SchnorrAccount-QIXE5DXA.js.map +7 -0
- package/dest/bin/check_txe_oracle_version.d.ts +2 -0
- package/dest/bin/check_txe_oracle_version.d.ts.map +1 -0
- package/dest/bin/check_txe_oracle_version.js +32 -0
- package/dest/bin/index.js +3 -30
- package/dest/bin/index.js.map +7 -0
- package/dest/chunk-BJVAAXNA.js +3 -0
- package/dest/chunk-BJVAAXNA.js.map +7 -0
- package/dest/chunk-DF6RMOC6.js +304 -0
- package/dest/chunk-DF6RMOC6.js.map +7 -0
- package/dest/chunk-PPJTNNUG.js +265 -0
- package/dest/chunk-PPJTNNUG.js.map +7 -0
- package/dest/constants.d.ts +3 -1
- package/dest/constants.d.ts.map +1 -1
- package/dest/constants.js +5 -0
- package/dest/dispatcher_pool.d.ts +67 -0
- package/dest/dispatcher_pool.d.ts.map +1 -0
- package/dest/dispatcher_pool.js +284 -0
- package/dest/index.d.ts +188 -7
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +160 -119
- package/dest/metafile.json +38147 -0
- package/dest/msgpackr_fr_extension.d.ts +2 -0
- package/dest/msgpackr_fr_extension.d.ts.map +1 -0
- package/dest/msgpackr_fr_extension.js +21 -0
- package/dest/oracle/interfaces.d.ts +40 -28
- package/dest/oracle/interfaces.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.d.ts +18 -13
- package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.js +27 -12
- package/dest/oracle/txe_oracle_top_level_context.d.ts +38 -22
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_top_level_context.js +141 -72
- package/dest/oracle/txe_private_execution_oracle.d.ts +17 -0
- package/dest/oracle/txe_private_execution_oracle.d.ts.map +1 -0
- package/dest/oracle/txe_private_execution_oracle.js +15 -0
- package/dest/rpc_server.d.ts +14 -0
- package/dest/rpc_server.d.ts.map +1 -0
- package/dest/rpc_server.js +78 -0
- package/dest/rpc_translator.d.ts +139 -83
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +574 -238
- package/dest/server.bundle.js +3 -0
- package/dest/server.bundle.js.map +7 -0
- package/dest/state_machine/archiver.d.ts +4 -4
- package/dest/state_machine/archiver.d.ts.map +1 -1
- package/dest/state_machine/archiver.js +22 -20
- package/dest/state_machine/dummy_p2p_client.d.ts +14 -8
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +17 -5
- package/dest/state_machine/global_variable_builder.d.ts +9 -4
- package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
- package/dest/state_machine/global_variable_builder.js +9 -3
- package/dest/state_machine/index.d.ts +7 -3
- package/dest/state_machine/index.d.ts.map +1 -1
- package/dest/state_machine/index.js +23 -5
- package/dest/state_machine/mock_epoch_cache.d.ts +18 -3
- package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
- package/dest/state_machine/mock_epoch_cache.js +35 -2
- package/dest/state_machine/synchronizer.d.ts +5 -5
- package/dest/state_machine/synchronizer.d.ts.map +1 -1
- package/dest/state_machine/synchronizer.js +4 -4
- package/dest/txe_oracle_version.d.ts +17 -0
- package/dest/txe_oracle_version.d.ts.map +1 -0
- package/dest/txe_oracle_version.js +14 -0
- package/dest/txe_session.d.ts +69 -6
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +170 -35
- package/dest/utils/encoding.d.ts +191 -0
- package/dest/utils/encoding.d.ts.map +1 -0
- package/dest/{util → utils}/encoding.js +7 -2
- package/dest/{util → utils}/expected_failure_error.d.ts +1 -1
- package/dest/utils/expected_failure_error.d.ts.map +1 -0
- package/dest/{util → utils}/txe_account_store.d.ts +1 -1
- package/dest/utils/txe_account_store.d.ts.map +1 -0
- package/dest/utils/txe_public_contract_data_source.d.ts +20 -0
- package/dest/utils/txe_public_contract_data_source.d.ts.map +1 -0
- package/dest/{util → utils}/txe_public_contract_data_source.js +1 -3
- package/dest/worker.bundle.js +3 -0
- package/dest/worker.bundle.js.map +7 -0
- package/dest/worker.d.ts +2 -0
- package/dest/worker.d.ts.map +1 -0
- package/dest/worker.js +92 -0
- package/package.json +37 -21
- package/src/bin/check_txe_oracle_version.ts +37 -0
- package/src/bin/index.ts +11 -2
- package/src/constants.ts +6 -0
- package/src/dispatcher_pool.ts +316 -0
- package/src/index.ts +178 -126
- package/src/msgpackr_fr_extension.ts +23 -0
- package/src/oracle/interfaces.ts +48 -34
- package/src/oracle/txe_oracle_public_context.ts +42 -12
- package/src/oracle/txe_oracle_top_level_context.ts +176 -83
- package/src/oracle/txe_private_execution_oracle.ts +30 -0
- package/src/rpc_server.ts +87 -0
- package/src/rpc_translator.ts +654 -319
- package/src/state_machine/archiver.ts +33 -18
- package/src/state_machine/dummy_p2p_client.ts +32 -12
- package/src/state_machine/global_variable_builder.ts +18 -3
- package/src/state_machine/index.ts +25 -6
- package/src/state_machine/mock_epoch_cache.ts +46 -3
- package/src/state_machine/synchronizer.ts +5 -5
- package/src/txe_oracle_version.ts +17 -0
- package/src/txe_session.ts +269 -37
- package/src/{util → utils}/encoding.ts +8 -2
- package/src/{util → utils}/txe_public_contract_data_source.ts +0 -2
- package/src/worker.ts +98 -0
- package/dest/util/encoding.d.ts +0 -720
- package/dest/util/encoding.d.ts.map +0 -1
- package/dest/util/expected_failure_error.d.ts.map +0 -1
- package/dest/util/txe_account_store.d.ts.map +0 -1
- package/dest/util/txe_public_contract_data_source.d.ts +0 -20
- package/dest/util/txe_public_contract_data_source.d.ts.map +0 -1
- /package/dest/{util → utils}/expected_failure_error.js +0 -0
- /package/dest/{util → utils}/txe_account_store.js +0 -0
- /package/src/{util → utils}/expected_failure_error.ts +0 -0
- /package/src/{util → utils}/txe_account_store.ts +0 -0
package/dest/rpc_translator.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { Fr
|
|
2
|
-
import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX } from '@aztec/constants';
|
|
1
|
+
import { Fr } from '@aztec/aztec.js/fields';
|
|
2
|
+
import { ARCHIVE_HEIGHT, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PRIVATE_LOGS_PER_TX, PRIVATE_LOG_SIZE_IN_FIELDS } from '@aztec/constants';
|
|
3
3
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
4
|
-
import {
|
|
4
|
+
import { MembershipWitness } from '@aztec/foundation/trees';
|
|
5
|
+
import { BoundedVec, Option, packAsHintedNote } from '@aztec/pxe/simulator';
|
|
5
6
|
import { EventSelector, FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
|
|
6
7
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
8
|
+
import { GasSettings } from '@aztec/stdlib/gas';
|
|
9
|
+
import { MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY, MAX_OFFCHAIN_EFFECT_LEN } from './constants.js';
|
|
10
|
+
import { addressFromSingle, arrayOfArraysToBoundedVecOfArrays, arrayToBoundedVec, blockHashFromSingle, bufferToU8Array, fromArray, fromSingle, fromUintArray, fromUintBoundedVec, toArray, toForeignCallResult, toSingle } from './utils/encoding.js';
|
|
11
|
+
const MAX_EVENT_LEN = 10; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_MSG_PLAINTEXT_RESERVED_FIELDS_LEN
|
|
10
12
|
const MAX_PRIVATE_EVENTS_PER_TXE_QUERY = 5;
|
|
11
13
|
export class UnavailableOracleError extends Error {
|
|
12
14
|
constructor(oracleName){
|
|
@@ -60,123 +62,190 @@ export class RPCTranslator {
|
|
|
60
62
|
}
|
|
61
63
|
return this.oracleHandler;
|
|
62
64
|
}
|
|
65
|
+
// eslint-disable-next-line camelcase
|
|
66
|
+
aztec_txe_assertCompatibleOracleVersion(foreignMajor, foreignMinor) {
|
|
67
|
+
const major = fromSingle(foreignMajor).toNumber();
|
|
68
|
+
const minor = fromSingle(foreignMinor).toNumber();
|
|
69
|
+
this.stateHandler.setTxeOracleVersion(major, minor);
|
|
70
|
+
return toForeignCallResult([]);
|
|
71
|
+
}
|
|
63
72
|
// TXE session state transition functions - these get handled by the state handler
|
|
64
|
-
|
|
73
|
+
// eslint-disable-next-line camelcase
|
|
74
|
+
async aztec_txe_setTopLevelTXEContext() {
|
|
65
75
|
await this.stateHandler.enterTopLevelState();
|
|
66
76
|
return toForeignCallResult([]);
|
|
67
77
|
}
|
|
68
|
-
|
|
78
|
+
// eslint-disable-next-line camelcase
|
|
79
|
+
async aztec_txe_setPrivateTXEContext(foreignContractAddressIsSome, foreignContractAddressValue, foreignAnchorBlockNumberIsSome, foreignAnchorBlockNumberValue, foreignGasSettings) {
|
|
69
80
|
const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
|
|
70
81
|
const anchorBlockNumber = fromSingle(foreignAnchorBlockNumberIsSome).toBool() ? BlockNumber(fromSingle(foreignAnchorBlockNumberValue).toNumber()) : undefined;
|
|
71
|
-
const
|
|
82
|
+
const gasSettings = GasSettings.fromFields(fromArray(foreignGasSettings));
|
|
83
|
+
const privateContextInputs = await this.stateHandler.enterPrivateState(contractAddress, anchorBlockNumber, gasSettings);
|
|
72
84
|
return toForeignCallResult(privateContextInputs.toFields().map(toSingle));
|
|
73
85
|
}
|
|
74
|
-
|
|
86
|
+
// eslint-disable-next-line camelcase
|
|
87
|
+
async aztec_txe_setPublicTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
|
|
75
88
|
const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
|
|
76
89
|
await this.stateHandler.enterPublicState(contractAddress);
|
|
77
90
|
return toForeignCallResult([]);
|
|
78
91
|
}
|
|
79
|
-
|
|
92
|
+
// eslint-disable-next-line camelcase
|
|
93
|
+
async aztec_txe_setUtilityTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
|
|
80
94
|
const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
|
|
81
95
|
await this.stateHandler.enterUtilityState(contractAddress);
|
|
82
96
|
return toForeignCallResult([]);
|
|
83
97
|
}
|
|
84
98
|
// Other oracles - these get handled by the oracle handler
|
|
85
99
|
// TXE-specific oracles
|
|
86
|
-
|
|
87
|
-
|
|
100
|
+
// eslint-disable-next-line camelcase
|
|
101
|
+
aztec_txe_getDefaultAddress() {
|
|
102
|
+
const defaultAddress = this.handlerAsTxe().getDefaultAddress();
|
|
88
103
|
return toForeignCallResult([
|
|
89
104
|
toSingle(defaultAddress)
|
|
90
105
|
]);
|
|
91
106
|
}
|
|
92
|
-
|
|
93
|
-
|
|
107
|
+
// eslint-disable-next-line camelcase
|
|
108
|
+
async aztec_txe_getNextBlockNumber() {
|
|
109
|
+
const nextBlockNumber = await this.handlerAsTxe().getNextBlockNumber();
|
|
94
110
|
return toForeignCallResult([
|
|
95
111
|
toSingle(nextBlockNumber)
|
|
96
112
|
]);
|
|
97
113
|
}
|
|
98
|
-
|
|
99
|
-
|
|
114
|
+
// eslint-disable-next-line camelcase
|
|
115
|
+
async aztec_txe_getNextBlockTimestamp() {
|
|
116
|
+
const nextBlockTimestamp = await this.handlerAsTxe().getNextBlockTimestamp();
|
|
100
117
|
return toForeignCallResult([
|
|
101
118
|
toSingle(nextBlockTimestamp)
|
|
102
119
|
]);
|
|
103
120
|
}
|
|
104
|
-
|
|
121
|
+
// eslint-disable-next-line camelcase
|
|
122
|
+
async aztec_txe_advanceBlocksBy(foreignBlocks) {
|
|
105
123
|
const blocks = fromSingle(foreignBlocks).toNumber();
|
|
106
|
-
await this.handlerAsTxe().
|
|
124
|
+
await this.handlerAsTxe().advanceBlocksBy(blocks);
|
|
107
125
|
return toForeignCallResult([]);
|
|
108
126
|
}
|
|
109
|
-
|
|
127
|
+
// eslint-disable-next-line camelcase
|
|
128
|
+
aztec_txe_advanceTimestampBy(foreignDuration) {
|
|
110
129
|
const duration = fromSingle(foreignDuration).toBigInt();
|
|
111
|
-
this.handlerAsTxe().
|
|
130
|
+
this.handlerAsTxe().advanceTimestampBy(duration);
|
|
112
131
|
return toForeignCallResult([]);
|
|
113
132
|
}
|
|
114
|
-
|
|
133
|
+
// eslint-disable-next-line camelcase
|
|
134
|
+
async aztec_txe_deploy(artifact, instance, foreignSecret) {
|
|
115
135
|
const secret = fromSingle(foreignSecret);
|
|
116
|
-
await this.handlerAsTxe().
|
|
136
|
+
await this.handlerAsTxe().deploy(artifact, instance, secret);
|
|
117
137
|
return toForeignCallResult([
|
|
118
138
|
toArray([
|
|
119
139
|
instance.salt,
|
|
120
140
|
instance.deployer.toField(),
|
|
121
141
|
instance.currentContractClassId,
|
|
122
142
|
instance.initializationHash,
|
|
143
|
+
instance.immutablesHash,
|
|
123
144
|
...instance.publicKeys.toFields()
|
|
124
145
|
])
|
|
125
146
|
]);
|
|
126
147
|
}
|
|
127
|
-
|
|
148
|
+
// eslint-disable-next-line camelcase
|
|
149
|
+
async aztec_txe_createAccount(foreignSecret) {
|
|
128
150
|
const secret = fromSingle(foreignSecret);
|
|
129
|
-
const completeAddress = await this.handlerAsTxe().
|
|
151
|
+
const completeAddress = await this.handlerAsTxe().createAccount(secret);
|
|
130
152
|
return toForeignCallResult([
|
|
131
153
|
toSingle(completeAddress.address),
|
|
132
154
|
...completeAddress.publicKeys.toFields().map(toSingle)
|
|
133
155
|
]);
|
|
134
156
|
}
|
|
135
|
-
|
|
157
|
+
// eslint-disable-next-line camelcase
|
|
158
|
+
async aztec_txe_addAccount(artifact, instance, foreignSecret) {
|
|
136
159
|
const secret = fromSingle(foreignSecret);
|
|
137
|
-
const completeAddress = await this.handlerAsTxe().
|
|
160
|
+
const completeAddress = await this.handlerAsTxe().addAccount(artifact, instance, secret);
|
|
138
161
|
return toForeignCallResult([
|
|
139
162
|
toSingle(completeAddress.address),
|
|
140
163
|
...completeAddress.publicKeys.toFields().map(toSingle)
|
|
141
164
|
]);
|
|
142
165
|
}
|
|
143
|
-
|
|
166
|
+
// eslint-disable-next-line camelcase
|
|
167
|
+
async aztec_txe_addAuthWitness(foreignAddress, foreignMessageHash) {
|
|
144
168
|
const address = addressFromSingle(foreignAddress);
|
|
145
169
|
const messageHash = fromSingle(foreignMessageHash);
|
|
146
|
-
await this.handlerAsTxe().
|
|
170
|
+
await this.handlerAsTxe().addAuthWitness(address, messageHash);
|
|
147
171
|
return toForeignCallResult([]);
|
|
148
172
|
}
|
|
149
173
|
// PXE oracles
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
174
|
+
// eslint-disable-next-line camelcase
|
|
175
|
+
aztec_utl_assertCompatibleOracleVersion(foreignMajor, foreignMinor) {
|
|
176
|
+
const major = fromSingle(foreignMajor).toNumber();
|
|
177
|
+
const minor = fromSingle(foreignMinor).toNumber();
|
|
178
|
+
this.handlerAsMisc().assertCompatibleOracleVersion(major, minor);
|
|
153
179
|
return toForeignCallResult([]);
|
|
154
180
|
}
|
|
155
|
-
|
|
156
|
-
|
|
181
|
+
// eslint-disable-next-line camelcase
|
|
182
|
+
aztec_utl_getRandomField() {
|
|
183
|
+
const randomField = this.handlerAsMisc().getRandomField();
|
|
157
184
|
return toForeignCallResult([
|
|
158
185
|
toSingle(randomField)
|
|
159
186
|
]);
|
|
160
187
|
}
|
|
161
|
-
|
|
162
|
-
|
|
188
|
+
// eslint-disable-next-line camelcase
|
|
189
|
+
async aztec_txe_getLastBlockTimestamp() {
|
|
190
|
+
const timestamp = await this.handlerAsTxe().getLastBlockTimestamp();
|
|
163
191
|
return toForeignCallResult([
|
|
164
192
|
toSingle(new Fr(timestamp))
|
|
165
193
|
]);
|
|
166
194
|
}
|
|
167
|
-
|
|
168
|
-
|
|
195
|
+
// eslint-disable-next-line camelcase
|
|
196
|
+
async aztec_txe_getLastTxEffects() {
|
|
197
|
+
const { txHash, noteHashes, nullifiers, privateLogs } = await this.handlerAsTxe().getLastTxEffects();
|
|
198
|
+
// Same workaround as `aztec_txe_getPrivateEvents`: Noir cannot yet return nested structs with arrays, so we return
|
|
199
|
+
// a flat multidimensional array plus per-log lengths and the total count, and reassemble into a
|
|
200
|
+
// `BoundedVec<BoundedVec<T>>` on the Noir side. Each log contributes only its emitted fields. The rest
|
|
201
|
+
// is zero-padded to `PRIVATE_LOG_SIZE_IN_FIELDS`.
|
|
202
|
+
const emittedLogs = privateLogs.map((log)=>log.getEmittedFields());
|
|
203
|
+
const rawLogStorage = emittedLogs.map((fields)=>fields.concat(Array(PRIVATE_LOG_SIZE_IN_FIELDS - fields.length).fill(new Fr(0)))).concat(Array(MAX_PRIVATE_LOGS_PER_TX - emittedLogs.length).fill(Array(PRIVATE_LOG_SIZE_IN_FIELDS).fill(new Fr(0)))).flat();
|
|
204
|
+
const logLengths = emittedLogs.map((fields)=>new Fr(fields.length)).concat(Array(MAX_PRIVATE_LOGS_PER_TX - emittedLogs.length).fill(new Fr(0)));
|
|
205
|
+
const logCount = new Fr(emittedLogs.length);
|
|
169
206
|
return toForeignCallResult([
|
|
170
207
|
toSingle(txHash.hash),
|
|
171
208
|
...arrayToBoundedVec(toArray(noteHashes), MAX_NOTE_HASHES_PER_TX),
|
|
172
|
-
...arrayToBoundedVec(toArray(nullifiers), MAX_NULLIFIERS_PER_TX)
|
|
209
|
+
...arrayToBoundedVec(toArray(nullifiers), MAX_NULLIFIERS_PER_TX),
|
|
210
|
+
toArray(rawLogStorage),
|
|
211
|
+
toArray(logLengths),
|
|
212
|
+
toSingle(logCount)
|
|
213
|
+
]);
|
|
214
|
+
}
|
|
215
|
+
// eslint-disable-next-line camelcase
|
|
216
|
+
aztec_txe_getLastCallOffchainEffects() {
|
|
217
|
+
const { effects } = this.stateHandler.getLastCallOffchainEffects();
|
|
218
|
+
const rawArrayStorage = effects.map((e)=>e.concat(Array(MAX_OFFCHAIN_EFFECT_LEN - e.length).fill(new Fr(0)))).concat(Array(MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY - effects.length).fill(Array(MAX_OFFCHAIN_EFFECT_LEN).fill(new Fr(0)))).flat();
|
|
219
|
+
const effectLengths = effects.map((e)=>new Fr(e.length)).concat(Array(MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY - effects.length).fill(new Fr(0)));
|
|
220
|
+
const count = new Fr(effects.length);
|
|
221
|
+
return toForeignCallResult([
|
|
222
|
+
toArray(rawArrayStorage),
|
|
223
|
+
toArray(effectLengths),
|
|
224
|
+
toSingle(count)
|
|
225
|
+
]);
|
|
226
|
+
}
|
|
227
|
+
// eslint-disable-next-line camelcase
|
|
228
|
+
aztec_txe_getLastCallContext() {
|
|
229
|
+
const { txHash, anchorBlockTimestamp } = this.stateHandler.getLastCallContext();
|
|
230
|
+
const isSome = txHash.isZero() ? 0 : 1;
|
|
231
|
+
return toForeignCallResult([
|
|
232
|
+
toSingle(isSome),
|
|
233
|
+
toSingle(txHash),
|
|
234
|
+
toSingle(new Fr(anchorBlockTimestamp))
|
|
173
235
|
]);
|
|
174
236
|
}
|
|
175
|
-
|
|
237
|
+
// eslint-disable-next-line camelcase
|
|
238
|
+
async aztec_txe_getPrivateEvents(foreignSelector, foreignContractAddress, foreignScope) {
|
|
176
239
|
const selector = EventSelector.fromField(fromSingle(foreignSelector));
|
|
177
240
|
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
178
241
|
const scope = addressFromSingle(foreignScope);
|
|
179
|
-
|
|
242
|
+
// TODO(F-335): Avoid doing the following 2 calls here.
|
|
243
|
+
{
|
|
244
|
+
await this.handlerAsTxe().syncContractNonOracleMethod(contractAddress, scope, this.stateHandler.getCurrentJob());
|
|
245
|
+
// We cycle job to commit the stores after the contract sync.
|
|
246
|
+
await this.stateHandler.cycleJob();
|
|
247
|
+
}
|
|
248
|
+
const events = await this.handlerAsTxe().getPrivateEvents(selector, contractAddress, scope);
|
|
180
249
|
if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
|
|
181
250
|
throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
|
|
182
251
|
}
|
|
@@ -194,50 +263,53 @@ export class RPCTranslator {
|
|
|
194
263
|
toSingle(queryLength)
|
|
195
264
|
]);
|
|
196
265
|
}
|
|
197
|
-
|
|
266
|
+
// eslint-disable-next-line camelcase
|
|
267
|
+
aztec_prv_setHashPreimage(foreignValues, foreignHash) {
|
|
198
268
|
const values = fromArray(foreignValues);
|
|
199
269
|
const hash = fromSingle(foreignHash);
|
|
200
|
-
this.handlerAsPrivate().
|
|
270
|
+
this.handlerAsPrivate().setHashPreimage(values, hash);
|
|
201
271
|
return toForeignCallResult([]);
|
|
202
272
|
}
|
|
203
|
-
|
|
273
|
+
// eslint-disable-next-line camelcase
|
|
274
|
+
async aztec_prv_getHashPreimage(foreignHash) {
|
|
204
275
|
const hash = fromSingle(foreignHash);
|
|
205
|
-
const returns = await this.handlerAsPrivate().
|
|
276
|
+
const returns = await this.handlerAsPrivate().getHashPreimage(hash);
|
|
206
277
|
return toForeignCallResult([
|
|
207
278
|
toArray(returns)
|
|
208
279
|
]);
|
|
209
280
|
}
|
|
210
281
|
// When the argument is a slice, noir automatically adds a length field to oracle call.
|
|
211
282
|
// When the argument is an array, we add the field length manually to the signature.
|
|
212
|
-
|
|
283
|
+
// eslint-disable-next-line camelcase
|
|
284
|
+
async aztec_utl_log(foreignLevel, foreignMessage, _foreignLength, foreignFields) {
|
|
213
285
|
const level = fromSingle(foreignLevel).toNumber();
|
|
214
286
|
const message = fromArray(foreignMessage).map((field)=>String.fromCharCode(field.toNumber())).join('');
|
|
215
287
|
const fields = fromArray(foreignFields);
|
|
216
|
-
await this.handlerAsMisc().
|
|
288
|
+
await this.handlerAsMisc().log(level, message, fields);
|
|
217
289
|
return toForeignCallResult([]);
|
|
218
290
|
}
|
|
219
|
-
|
|
220
|
-
|
|
291
|
+
// eslint-disable-next-line camelcase
|
|
292
|
+
async aztec_utl_getFromPublicStorage(foreignBlockHash, foreignContractAddress, foreignStartStorageSlot, foreignNumberOfElements) {
|
|
293
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
221
294
|
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
222
295
|
const startStorageSlot = fromSingle(foreignStartStorageSlot);
|
|
223
296
|
const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
|
|
224
|
-
const values = await this.handlerAsUtility().
|
|
297
|
+
const values = await this.handlerAsUtility().getFromPublicStorage(blockHash, contractAddress, startStorageSlot, numberOfElements);
|
|
225
298
|
return toForeignCallResult([
|
|
226
299
|
toArray(values)
|
|
227
300
|
]);
|
|
228
301
|
}
|
|
229
|
-
|
|
230
|
-
|
|
302
|
+
// eslint-disable-next-line camelcase
|
|
303
|
+
async aztec_utl_getPublicDataWitness(foreignBlockHash, foreignLeafSlot) {
|
|
304
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
231
305
|
const leafSlot = fromSingle(foreignLeafSlot);
|
|
232
|
-
const witness = await this.handlerAsUtility().
|
|
233
|
-
if (!witness) {
|
|
234
|
-
throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockHash.toString()}.`);
|
|
235
|
-
}
|
|
306
|
+
const witness = await this.handlerAsUtility().getPublicDataWitness(blockHash, leafSlot);
|
|
236
307
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
237
308
|
}
|
|
238
|
-
|
|
309
|
+
// eslint-disable-next-line camelcase
|
|
310
|
+
async aztec_utl_getNotes(foreignOwnerIsSome, foreignOwnerValue, foreignStorageSlot, foreignNumSelects, foreignSelectByIndexes, foreignSelectByOffsets, foreignSelectByLengths, foreignSelectValues, foreignSelectComparators, foreignSortByIndexes, foreignSortByOffsets, foreignSortByLengths, foreignSortOrder, foreignLimit, foreignOffset, foreignStatus, foreignMaxNotes, foreignPackedHintedNoteLength) {
|
|
239
311
|
// Parse Option<AztecAddress>: ownerIsSome is 0 for None, 1 for Some
|
|
240
|
-
const owner = fromSingle(foreignOwnerIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignOwnerValue)) :
|
|
312
|
+
const owner = fromSingle(foreignOwnerIsSome).toBool() ? Option.some(AztecAddress.fromField(fromSingle(foreignOwnerValue))) : Option.none(AztecAddress.ZERO);
|
|
241
313
|
const storageSlot = fromSingle(foreignStorageSlot);
|
|
242
314
|
const numSelects = fromSingle(foreignNumSelects).toNumber();
|
|
243
315
|
const selectByIndexes = fromArray(foreignSelectByIndexes).map((fr)=>fr.toNumber());
|
|
@@ -254,8 +326,8 @@ export class RPCTranslator {
|
|
|
254
326
|
const status = fromSingle(foreignStatus).toNumber();
|
|
255
327
|
const maxNotes = fromSingle(foreignMaxNotes).toNumber();
|
|
256
328
|
const packedHintedNoteLength = fromSingle(foreignPackedHintedNoteLength).toNumber();
|
|
257
|
-
const
|
|
258
|
-
const returnDataAsArrayOfArrays =
|
|
329
|
+
const noteVec = await this.handlerAsUtility().getNotes(owner, storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status, maxNotes, packedHintedNoteLength);
|
|
330
|
+
const returnDataAsArrayOfArrays = Array.from(noteVec.data).map((noteData)=>packAsHintedNote({
|
|
259
331
|
contractAddress: noteData.contractAddress,
|
|
260
332
|
owner: noteData.owner,
|
|
261
333
|
randomness: noteData.randomness,
|
|
@@ -264,12 +336,11 @@ export class RPCTranslator {
|
|
|
264
336
|
isPending: noteData.isPending,
|
|
265
337
|
note: noteData.note
|
|
266
338
|
}));
|
|
267
|
-
// Now we convert each sub-array to an array of ForeignCallSingles
|
|
268
339
|
const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map((subArray)=>subArray.map(toSingle));
|
|
269
|
-
// At last we convert the array of arrays to a bounded vec of arrays
|
|
270
340
|
return toForeignCallResult(arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedHintedNoteLength));
|
|
271
341
|
}
|
|
272
|
-
|
|
342
|
+
// eslint-disable-next-line camelcase
|
|
343
|
+
aztec_prv_notifyCreatedNote(foreignOwner, foreignStorageSlot, foreignRandomness, foreignNoteTypeId, foreignNote, foreignNoteHash, foreignCounter) {
|
|
273
344
|
const owner = addressFromSingle(foreignOwner);
|
|
274
345
|
const storageSlot = fromSingle(foreignStorageSlot);
|
|
275
346
|
const randomness = fromSingle(foreignRandomness);
|
|
@@ -277,415 +348,680 @@ export class RPCTranslator {
|
|
|
277
348
|
const note = fromArray(foreignNote);
|
|
278
349
|
const noteHash = fromSingle(foreignNoteHash);
|
|
279
350
|
const counter = fromSingle(foreignCounter).toNumber();
|
|
280
|
-
this.handlerAsPrivate().
|
|
351
|
+
this.handlerAsPrivate().notifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter);
|
|
281
352
|
return toForeignCallResult([]);
|
|
282
353
|
}
|
|
283
|
-
|
|
354
|
+
// eslint-disable-next-line camelcase
|
|
355
|
+
async aztec_prv_notifyNullifiedNote(foreignInnerNullifier, foreignNoteHash, foreignCounter) {
|
|
284
356
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
285
357
|
const noteHash = fromSingle(foreignNoteHash);
|
|
286
358
|
const counter = fromSingle(foreignCounter).toNumber();
|
|
287
|
-
await this.handlerAsPrivate().
|
|
359
|
+
await this.handlerAsPrivate().notifyNullifiedNote(innerNullifier, noteHash, counter);
|
|
288
360
|
return toForeignCallResult([]);
|
|
289
361
|
}
|
|
290
|
-
|
|
362
|
+
// eslint-disable-next-line camelcase
|
|
363
|
+
async aztec_prv_notifyCreatedNullifier(foreignInnerNullifier) {
|
|
291
364
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
292
|
-
await this.handlerAsPrivate().
|
|
365
|
+
await this.handlerAsPrivate().notifyCreatedNullifier(innerNullifier);
|
|
293
366
|
return toForeignCallResult([]);
|
|
294
367
|
}
|
|
295
|
-
|
|
368
|
+
// eslint-disable-next-line camelcase
|
|
369
|
+
async aztec_prv_isNullifierPending(foreignInnerNullifier, foreignContractAddress) {
|
|
296
370
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
297
371
|
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
298
|
-
const isPending = await this.handlerAsPrivate().
|
|
372
|
+
const isPending = await this.handlerAsPrivate().isNullifierPending(innerNullifier, contractAddress);
|
|
299
373
|
return toForeignCallResult([
|
|
300
374
|
toSingle(new Fr(isPending))
|
|
301
375
|
]);
|
|
302
376
|
}
|
|
303
|
-
|
|
377
|
+
// eslint-disable-next-line camelcase
|
|
378
|
+
async aztec_utl_doesNullifierExist(foreignInnerNullifier) {
|
|
304
379
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
305
|
-
const exists = await this.handlerAsUtility().
|
|
380
|
+
const exists = await this.handlerAsUtility().doesNullifierExist(innerNullifier);
|
|
306
381
|
return toForeignCallResult([
|
|
307
382
|
toSingle(new Fr(exists))
|
|
308
383
|
]);
|
|
309
384
|
}
|
|
310
|
-
|
|
385
|
+
// eslint-disable-next-line camelcase
|
|
386
|
+
async aztec_utl_getContractInstance(foreignAddress) {
|
|
311
387
|
const address = addressFromSingle(foreignAddress);
|
|
312
|
-
const instance = await this.handlerAsUtility().
|
|
388
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
313
389
|
return toForeignCallResult([
|
|
314
390
|
instance.salt,
|
|
315
391
|
instance.deployer.toField(),
|
|
316
392
|
instance.currentContractClassId,
|
|
317
393
|
instance.initializationHash,
|
|
394
|
+
instance.immutablesHash,
|
|
318
395
|
...instance.publicKeys.toFields()
|
|
319
396
|
].map(toSingle));
|
|
320
397
|
}
|
|
321
|
-
|
|
398
|
+
// eslint-disable-next-line camelcase
|
|
399
|
+
async aztec_utl_getPublicKeysAndPartialAddress(foreignAddress) {
|
|
322
400
|
const address = addressFromSingle(foreignAddress);
|
|
323
|
-
const result = await this.handlerAsUtility().
|
|
401
|
+
const result = await this.handlerAsUtility().getPublicKeysAndPartialAddress(address);
|
|
324
402
|
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
325
403
|
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
326
|
-
if (result
|
|
404
|
+
if (!result.isSome()) {
|
|
327
405
|
// No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
|
|
406
|
+
// Wire shape: [npk_m_hash, ivpk_m.x, ivpk_m.y, ovpk_m_hash, tpk_m_hash, mspk_m_hash, fbpk_m_hash, partial_address] = 8 fields.
|
|
328
407
|
return toForeignCallResult([
|
|
329
408
|
toSingle(new Fr(0)),
|
|
330
|
-
toArray(Array(
|
|
409
|
+
toArray(Array(8).fill(new Fr(0)))
|
|
331
410
|
]);
|
|
332
411
|
} else {
|
|
333
|
-
//
|
|
412
|
+
// The Noir side hand-decodes a `[Field; 8]` here (see aztec-nr/aztec/src/oracle/keys.nr), so we
|
|
413
|
+
// emit the 7-field PublicKeys shape + partial_address explicitly
|
|
414
|
+
// rather than going through `publicKeys.toFields()` (which is the struct-flattened 8-field
|
|
415
|
+
// wire for oracle returns that decode via struct shape).
|
|
416
|
+
const { publicKeys, partialAddress } = result.value;
|
|
334
417
|
return toForeignCallResult([
|
|
335
418
|
toSingle(new Fr(1)),
|
|
336
419
|
toArray([
|
|
337
|
-
|
|
338
|
-
|
|
420
|
+
publicKeys.npkMHash,
|
|
421
|
+
publicKeys.ivpkM.x,
|
|
422
|
+
publicKeys.ivpkM.y,
|
|
423
|
+
publicKeys.ovpkMHash,
|
|
424
|
+
publicKeys.tpkMHash,
|
|
425
|
+
publicKeys.mspkMHash,
|
|
426
|
+
publicKeys.fbpkMHash,
|
|
427
|
+
partialAddress
|
|
339
428
|
])
|
|
340
429
|
]);
|
|
341
430
|
}
|
|
342
431
|
}
|
|
343
|
-
|
|
432
|
+
// eslint-disable-next-line camelcase
|
|
433
|
+
async aztec_utl_getKeyValidationRequest(foreignPkMHash) {
|
|
344
434
|
const pkMHash = fromSingle(foreignPkMHash);
|
|
345
|
-
const keyValidationRequest = await this.handlerAsUtility().
|
|
435
|
+
const keyValidationRequest = await this.handlerAsUtility().getKeyValidationRequest(pkMHash);
|
|
346
436
|
return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
|
|
347
437
|
}
|
|
348
|
-
|
|
349
|
-
|
|
438
|
+
// eslint-disable-next-line camelcase
|
|
439
|
+
async aztec_prv_callPrivateFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgsHash, foreignSideEffectCounter, foreignIsStaticCall) {
|
|
440
|
+
const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
|
|
441
|
+
const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
|
|
442
|
+
const argsHash = fromSingle(foreignArgsHash);
|
|
443
|
+
const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
|
|
444
|
+
const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
|
|
445
|
+
const { endSideEffectCounter, returnsHash } = await this.handlerAsPrivate().callPrivateFunction(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall);
|
|
446
|
+
return toForeignCallResult([
|
|
447
|
+
[
|
|
448
|
+
endSideEffectCounter,
|
|
449
|
+
returnsHash
|
|
450
|
+
].map(toSingle)
|
|
451
|
+
]);
|
|
350
452
|
}
|
|
351
|
-
|
|
352
|
-
|
|
453
|
+
// eslint-disable-next-line camelcase
|
|
454
|
+
async aztec_utl_getNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
|
|
455
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
353
456
|
const nullifier = fromSingle(foreignNullifier);
|
|
354
|
-
const witness = await this.handlerAsUtility().
|
|
355
|
-
if (!witness) {
|
|
356
|
-
throw new Error(`Nullifier membership witness not found at block ${blockHash}.`);
|
|
357
|
-
}
|
|
457
|
+
const witness = await this.handlerAsUtility().getNullifierMembershipWitness(blockHash, nullifier);
|
|
358
458
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
359
459
|
}
|
|
360
|
-
|
|
460
|
+
// eslint-disable-next-line camelcase
|
|
461
|
+
async aztec_utl_getAuthWitness(foreignMessageHash) {
|
|
361
462
|
const messageHash = fromSingle(foreignMessageHash);
|
|
362
|
-
const authWitness = await this.handlerAsUtility().
|
|
363
|
-
if (!authWitness) {
|
|
364
|
-
throw new Error(`Auth witness not found for message hash ${messageHash}.`);
|
|
365
|
-
}
|
|
463
|
+
const authWitness = await this.handlerAsUtility().getAuthWitness(messageHash);
|
|
366
464
|
return toForeignCallResult([
|
|
367
465
|
toArray(authWitness)
|
|
368
466
|
]);
|
|
369
467
|
}
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
468
|
+
// eslint-disable-next-line camelcase
|
|
469
|
+
async aztec_prv_assertValidPublicCalldata(foreignCalldataHash) {
|
|
470
|
+
const calldataHash = fromSingle(foreignCalldataHash);
|
|
471
|
+
await this.handlerAsPrivate().assertValidPublicCalldata(calldataHash);
|
|
472
|
+
return toForeignCallResult([]);
|
|
375
473
|
}
|
|
376
|
-
|
|
377
|
-
|
|
474
|
+
// eslint-disable-next-line camelcase
|
|
475
|
+
async aztec_prv_notifyRevertiblePhaseStart(foreignMinRevertibleSideEffectCounter) {
|
|
476
|
+
const minRevertibleSideEffectCounter = fromSingle(foreignMinRevertibleSideEffectCounter).toNumber();
|
|
477
|
+
await this.handlerAsPrivate().notifyRevertiblePhaseStart(minRevertibleSideEffectCounter);
|
|
478
|
+
return toForeignCallResult([]);
|
|
378
479
|
}
|
|
379
|
-
|
|
480
|
+
// eslint-disable-next-line camelcase
|
|
481
|
+
async aztec_prv_isExecutionInRevertiblePhase(foreignSideEffectCounter) {
|
|
380
482
|
const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
|
|
381
|
-
const isRevertible = await this.handlerAsPrivate().
|
|
483
|
+
const isRevertible = await this.handlerAsPrivate().isExecutionInRevertiblePhase(sideEffectCounter);
|
|
382
484
|
return toForeignCallResult([
|
|
383
485
|
toSingle(new Fr(isRevertible))
|
|
384
486
|
]);
|
|
385
487
|
}
|
|
386
|
-
|
|
387
|
-
|
|
488
|
+
// eslint-disable-next-line camelcase
|
|
489
|
+
aztec_utl_getUtilityContext() {
|
|
490
|
+
const context = this.handlerAsUtility().getUtilityContext();
|
|
388
491
|
return toForeignCallResult(context.toNoirRepresentation());
|
|
389
492
|
}
|
|
390
|
-
|
|
493
|
+
// eslint-disable-next-line camelcase
|
|
494
|
+
async aztec_utl_getBlockHeader(foreignBlockNumber) {
|
|
391
495
|
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
392
|
-
const header = await this.handlerAsUtility().
|
|
393
|
-
if (!header) {
|
|
394
|
-
throw new Error(`Block header not found for block ${blockNumber}.`);
|
|
395
|
-
}
|
|
496
|
+
const header = await this.handlerAsUtility().getBlockHeader(blockNumber);
|
|
396
497
|
return toForeignCallResult(header.toFields().map(toSingle));
|
|
397
498
|
}
|
|
398
|
-
|
|
399
|
-
|
|
499
|
+
// eslint-disable-next-line camelcase
|
|
500
|
+
async aztec_utl_getNoteHashMembershipWitness(foreignAnchorBlockHash, foreignNoteHash) {
|
|
501
|
+
const blockHash = blockHashFromSingle(foreignAnchorBlockHash);
|
|
400
502
|
const noteHash = fromSingle(foreignNoteHash);
|
|
401
|
-
const witness = await this.handlerAsUtility().
|
|
402
|
-
if (!witness) {
|
|
403
|
-
throw new Error(`Note hash ${noteHash} not found in the note hash tree at block ${blockHash.toString()}.`);
|
|
404
|
-
}
|
|
503
|
+
const witness = await this.handlerAsUtility().getNoteHashMembershipWitness(blockHash, noteHash);
|
|
405
504
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
406
505
|
}
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
const
|
|
410
|
-
const
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
506
|
+
// eslint-disable-next-line camelcase
|
|
507
|
+
async aztec_utl_getBlockHashMembershipWitness(foreignAnchorBlockHash, foreignBlockHash) {
|
|
508
|
+
const anchorBlockHash = blockHashFromSingle(foreignAnchorBlockHash);
|
|
509
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
510
|
+
const witnessOpt = await this.handlerAsUtility().getBlockHashMembershipWitness(anchorBlockHash, blockHash);
|
|
511
|
+
const effective = witnessOpt.value ?? MembershipWitness.empty(ARCHIVE_HEIGHT);
|
|
512
|
+
return toForeignCallResult([
|
|
513
|
+
toSingle(new Fr(witnessOpt.isSome() ? 1 : 0)),
|
|
514
|
+
...effective.toNoirRepresentation()
|
|
515
|
+
]);
|
|
415
516
|
}
|
|
416
|
-
|
|
417
|
-
|
|
517
|
+
// eslint-disable-next-line camelcase
|
|
518
|
+
async aztec_utl_getLowNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
|
|
519
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
418
520
|
const nullifier = fromSingle(foreignNullifier);
|
|
419
|
-
const witness = await this.handlerAsUtility().
|
|
420
|
-
if (!witness) {
|
|
421
|
-
throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockHash}.`);
|
|
422
|
-
}
|
|
521
|
+
const witness = await this.handlerAsUtility().getLowNullifierMembershipWitness(blockHash, nullifier);
|
|
423
522
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
424
523
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
524
|
+
// eslint-disable-next-line camelcase
|
|
525
|
+
async aztec_utl_getPendingTaggedLogs(foreignScope) {
|
|
526
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
527
|
+
const slot = await this.handlerAsUtility().getPendingTaggedLogs(scope);
|
|
528
|
+
return toForeignCallResult([
|
|
529
|
+
toSingle(slot)
|
|
530
|
+
]);
|
|
429
531
|
}
|
|
430
|
-
|
|
431
|
-
|
|
532
|
+
// eslint-disable-next-line camelcase
|
|
533
|
+
async aztec_utl_validateAndStoreEnqueuedNotesAndEvents(foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot, foreignScope) {
|
|
432
534
|
const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
|
|
433
535
|
const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
|
|
434
|
-
|
|
536
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
537
|
+
await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot, scope);
|
|
435
538
|
return toForeignCallResult([]);
|
|
436
539
|
}
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
const
|
|
440
|
-
const
|
|
441
|
-
|
|
442
|
-
|
|
540
|
+
// eslint-disable-next-line camelcase
|
|
541
|
+
async aztec_utl_getLogsByTag(foreignRequestArrayBaseSlot) {
|
|
542
|
+
const requestArrayBaseSlot = fromSingle(foreignRequestArrayBaseSlot);
|
|
543
|
+
const responseSlot = await this.handlerAsUtility().getLogsByTag(requestArrayBaseSlot);
|
|
544
|
+
return toForeignCallResult([
|
|
545
|
+
toSingle(responseSlot)
|
|
546
|
+
]);
|
|
443
547
|
}
|
|
444
|
-
|
|
548
|
+
// eslint-disable-next-line camelcase
|
|
549
|
+
async aztec_utl_getMessageContextsByTxHash(foreignRequestArrayBaseSlot) {
|
|
550
|
+
const requestArrayBaseSlot = fromSingle(foreignRequestArrayBaseSlot);
|
|
551
|
+
const responseSlot = await this.handlerAsUtility().getMessageContextsByTxHash(requestArrayBaseSlot);
|
|
552
|
+
return toForeignCallResult([
|
|
553
|
+
toSingle(responseSlot)
|
|
554
|
+
]);
|
|
555
|
+
}
|
|
556
|
+
// eslint-disable-next-line camelcase
|
|
557
|
+
aztec_utl_setCapsule(foreignContractAddress, foreignSlot, foreignCapsule, foreignScope) {
|
|
445
558
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
446
559
|
const slot = fromSingle(foreignSlot);
|
|
447
560
|
const capsule = fromArray(foreignCapsule);
|
|
448
|
-
|
|
561
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
562
|
+
this.handlerAsUtility().setCapsule(contractAddress, slot, capsule, scope);
|
|
449
563
|
return toForeignCallResult([]);
|
|
450
564
|
}
|
|
451
|
-
|
|
565
|
+
// eslint-disable-next-line camelcase
|
|
566
|
+
async aztec_utl_getCapsule(foreignContractAddress, foreignSlot, foreignTSize, foreignScope) {
|
|
452
567
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
453
568
|
const slot = fromSingle(foreignSlot);
|
|
454
569
|
const tSize = fromSingle(foreignTSize).toNumber();
|
|
455
|
-
const
|
|
570
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
571
|
+
const opt = await this.handlerAsUtility().getCapsule(contractAddress, slot, tSize, scope);
|
|
456
572
|
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
457
573
|
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
458
|
-
if (
|
|
459
|
-
//
|
|
574
|
+
if (opt.isSome()) {
|
|
575
|
+
// Data was found so we set `some` to 1 and return it along with `value`.
|
|
460
576
|
return toForeignCallResult([
|
|
461
|
-
toSingle(new Fr(
|
|
462
|
-
toArray(Array(
|
|
577
|
+
toSingle(new Fr(1)),
|
|
578
|
+
toArray(Array.from(opt.value))
|
|
463
579
|
]);
|
|
464
580
|
} else {
|
|
465
|
-
//
|
|
581
|
+
// No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
|
|
466
582
|
return toForeignCallResult([
|
|
467
|
-
toSingle(new Fr(
|
|
468
|
-
toArray(
|
|
583
|
+
toSingle(new Fr(0)),
|
|
584
|
+
toArray(Array(tSize).fill(new Fr(0)))
|
|
469
585
|
]);
|
|
470
586
|
}
|
|
471
587
|
}
|
|
472
|
-
|
|
588
|
+
// eslint-disable-next-line camelcase
|
|
589
|
+
aztec_utl_deleteCapsule(foreignContractAddress, foreignSlot, foreignScope) {
|
|
473
590
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
474
591
|
const slot = fromSingle(foreignSlot);
|
|
475
|
-
|
|
592
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
593
|
+
this.handlerAsUtility().deleteCapsule(contractAddress, slot, scope);
|
|
476
594
|
return toForeignCallResult([]);
|
|
477
595
|
}
|
|
478
|
-
|
|
596
|
+
// eslint-disable-next-line camelcase
|
|
597
|
+
async aztec_utl_copyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries, foreignScope) {
|
|
479
598
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
480
599
|
const srcSlot = fromSingle(foreignSrcSlot);
|
|
481
600
|
const dstSlot = fromSingle(foreignDstSlot);
|
|
482
601
|
const numEntries = fromSingle(foreignNumEntries).toNumber();
|
|
483
|
-
|
|
602
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
603
|
+
await this.handlerAsUtility().copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, scope);
|
|
604
|
+
return toForeignCallResult([]);
|
|
605
|
+
}
|
|
606
|
+
// eslint-disable-next-line camelcase
|
|
607
|
+
aztec_utl_pushEphemeral(foreignSlot, foreignElements) {
|
|
608
|
+
const slot = fromSingle(foreignSlot);
|
|
609
|
+
const elements = fromArray(foreignElements);
|
|
610
|
+
const newLen = this.handlerAsUtility().pushEphemeral(slot, elements);
|
|
611
|
+
return toForeignCallResult([
|
|
612
|
+
toSingle(new Fr(newLen))
|
|
613
|
+
]);
|
|
614
|
+
}
|
|
615
|
+
// eslint-disable-next-line camelcase
|
|
616
|
+
aztec_utl_popEphemeral(foreignSlot) {
|
|
617
|
+
const slot = fromSingle(foreignSlot);
|
|
618
|
+
const element = this.handlerAsUtility().popEphemeral(slot);
|
|
619
|
+
return toForeignCallResult([
|
|
620
|
+
toArray(element)
|
|
621
|
+
]);
|
|
622
|
+
}
|
|
623
|
+
// eslint-disable-next-line camelcase
|
|
624
|
+
aztec_utl_getEphemeral(foreignSlot, foreignIndex) {
|
|
625
|
+
const slot = fromSingle(foreignSlot);
|
|
626
|
+
const index = fromSingle(foreignIndex).toNumber();
|
|
627
|
+
const element = this.handlerAsUtility().getEphemeral(slot, index);
|
|
628
|
+
return toForeignCallResult([
|
|
629
|
+
toArray(element)
|
|
630
|
+
]);
|
|
631
|
+
}
|
|
632
|
+
// eslint-disable-next-line camelcase
|
|
633
|
+
aztec_utl_setEphemeral(foreignSlot, foreignIndex, foreignElements) {
|
|
634
|
+
const slot = fromSingle(foreignSlot);
|
|
635
|
+
const index = fromSingle(foreignIndex).toNumber();
|
|
636
|
+
const elements = fromArray(foreignElements);
|
|
637
|
+
this.handlerAsUtility().setEphemeral(slot, index, elements);
|
|
638
|
+
return toForeignCallResult([]);
|
|
639
|
+
}
|
|
640
|
+
// eslint-disable-next-line camelcase
|
|
641
|
+
aztec_utl_getEphemeralLen(foreignSlot) {
|
|
642
|
+
const slot = fromSingle(foreignSlot);
|
|
643
|
+
const len = this.handlerAsUtility().getEphemeralLen(slot);
|
|
644
|
+
return toForeignCallResult([
|
|
645
|
+
toSingle(new Fr(len))
|
|
646
|
+
]);
|
|
647
|
+
}
|
|
648
|
+
// eslint-disable-next-line camelcase
|
|
649
|
+
aztec_utl_removeEphemeral(foreignSlot, foreignIndex) {
|
|
650
|
+
const slot = fromSingle(foreignSlot);
|
|
651
|
+
const index = fromSingle(foreignIndex).toNumber();
|
|
652
|
+
this.handlerAsUtility().removeEphemeral(slot, index);
|
|
653
|
+
return toForeignCallResult([]);
|
|
654
|
+
}
|
|
655
|
+
// eslint-disable-next-line camelcase
|
|
656
|
+
aztec_utl_clearEphemeral(foreignSlot) {
|
|
657
|
+
const slot = fromSingle(foreignSlot);
|
|
658
|
+
this.handlerAsUtility().clearEphemeral(slot);
|
|
484
659
|
return toForeignCallResult([]);
|
|
485
660
|
}
|
|
486
661
|
// TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
|
|
487
662
|
// The compiler didn't throw an error, so it took me a while to learn of the existence of this file, and that I need
|
|
488
663
|
// to implement this function here. Isn't there a way to programmatically identify that this is missing, given the
|
|
489
664
|
// existence of a txe_oracle method?
|
|
490
|
-
|
|
491
|
-
|
|
665
|
+
// eslint-disable-next-line camelcase
|
|
666
|
+
async aztec_utl_decryptAes128(foreignCiphertextBVecStorage, foreignCiphertextLength, foreignIv, foreignSymKey) {
|
|
667
|
+
const capacity = foreignCiphertextBVecStorage.length;
|
|
668
|
+
const ciphertextBuf = fromUintBoundedVec(foreignCiphertextBVecStorage, foreignCiphertextLength, 8);
|
|
669
|
+
const ciphertext = BoundedVec.from({
|
|
670
|
+
data: [
|
|
671
|
+
...ciphertextBuf
|
|
672
|
+
],
|
|
673
|
+
maxLength: capacity
|
|
674
|
+
});
|
|
492
675
|
const iv = fromUintArray(foreignIv, 8);
|
|
493
676
|
const symKey = fromUintArray(foreignSymKey, 8);
|
|
494
|
-
|
|
495
|
-
|
|
677
|
+
// Noir Option<BoundedVec> is encoded as [is_some: Field, storage: Field[], length: Field].
|
|
678
|
+
const plaintextOpt = await this.handlerAsUtility().decryptAes128(ciphertext, iv, symKey);
|
|
679
|
+
if (plaintextOpt.isSome()) {
|
|
680
|
+
const [storage, length] = arrayToBoundedVec(bufferToU8Array(Buffer.from(plaintextOpt.value.data)), capacity);
|
|
681
|
+
return toForeignCallResult([
|
|
682
|
+
toSingle(new Fr(1)),
|
|
683
|
+
storage,
|
|
684
|
+
length
|
|
685
|
+
]);
|
|
686
|
+
} else {
|
|
687
|
+
const zeroStorage = toArray(Array(capacity).fill(new Fr(0)));
|
|
688
|
+
return toForeignCallResult([
|
|
689
|
+
toSingle(new Fr(0)),
|
|
690
|
+
zeroStorage,
|
|
691
|
+
toSingle(new Fr(0))
|
|
692
|
+
]);
|
|
693
|
+
}
|
|
496
694
|
}
|
|
497
|
-
|
|
695
|
+
// eslint-disable-next-line camelcase
|
|
696
|
+
async aztec_utl_getSharedSecrets(foreignAddress, foreignEphPksSlot, foreignContractAddress) {
|
|
498
697
|
const address = AztecAddress.fromField(fromSingle(foreignAddress));
|
|
499
|
-
const
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
698
|
+
const ephPksSlot = fromSingle(foreignEphPksSlot);
|
|
699
|
+
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
700
|
+
const responseSlot = await this.handlerAsUtility().getSharedSecrets(address, ephPksSlot, contractAddress);
|
|
701
|
+
return toForeignCallResult([
|
|
702
|
+
toSingle(responseSlot)
|
|
503
703
|
]);
|
|
504
|
-
const secret = await this.handlerAsUtility().utilityGetSharedSecret(address, ephPK);
|
|
505
|
-
return toForeignCallResult(secret.toFields().map(toSingle));
|
|
506
704
|
}
|
|
507
|
-
|
|
508
|
-
|
|
705
|
+
// eslint-disable-next-line camelcase
|
|
706
|
+
aztec_utl_setContractSyncCacheInvalid(foreignContractAddress, foreignScopes, foreignScopeCount) {
|
|
707
|
+
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
708
|
+
const allFields = fromArray(foreignScopes);
|
|
709
|
+
const count = fromSingle(foreignScopeCount).toNumber();
|
|
710
|
+
const scopes = BoundedVec.from({
|
|
711
|
+
data: allFields.slice(0, count).map((f)=>new AztecAddress(f)),
|
|
712
|
+
maxLength: allFields.length
|
|
713
|
+
});
|
|
714
|
+
this.handlerAsUtility().setContractSyncCacheInvalid(contractAddress, scopes);
|
|
715
|
+
return Promise.resolve(toForeignCallResult([]));
|
|
716
|
+
}
|
|
717
|
+
// eslint-disable-next-line camelcase
|
|
718
|
+
aztec_utl_emitOffchainEffect(foreignData) {
|
|
719
|
+
// Record the raw payload against the currently-executing top-level call. The Noir side
|
|
720
|
+
// (via `env.offchain_messages()`) is responsible for decoding the protocol-reserved prefix
|
|
721
|
+
// (`OFFCHAIN_MESSAGE_IDENTIFIER`, recipient) and turning each payload into an `OffchainMessage` struct suitable
|
|
722
|
+
// for `offchain_receive`.
|
|
723
|
+
this.stateHandler.recordOffchainEffect(fromArray(foreignData));
|
|
724
|
+
return Promise.resolve(toForeignCallResult([]));
|
|
509
725
|
}
|
|
510
726
|
// AVM opcodes
|
|
511
|
-
|
|
727
|
+
// eslint-disable-next-line camelcase
|
|
728
|
+
aztec_avm_emitPublicLog(_foreignMessage) {
|
|
512
729
|
// TODO(#8811): Implement
|
|
513
730
|
return toForeignCallResult([]);
|
|
514
731
|
}
|
|
515
|
-
|
|
732
|
+
// eslint-disable-next-line camelcase
|
|
733
|
+
async aztec_avm_storageRead(foreignSlot, foreignContractAddress) {
|
|
516
734
|
const slot = fromSingle(foreignSlot);
|
|
517
735
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
518
|
-
const value = (await this.handlerAsAvm().
|
|
736
|
+
const value = (await this.handlerAsAvm().storageRead(slot, contractAddress)).value;
|
|
519
737
|
return toForeignCallResult([
|
|
520
738
|
toSingle(new Fr(value))
|
|
521
739
|
]);
|
|
522
740
|
}
|
|
523
|
-
|
|
741
|
+
// eslint-disable-next-line camelcase
|
|
742
|
+
async aztec_avm_storageWrite(foreignSlot, foreignValue) {
|
|
524
743
|
const slot = fromSingle(foreignSlot);
|
|
525
744
|
const value = fromSingle(foreignValue);
|
|
526
|
-
await this.handlerAsAvm().
|
|
745
|
+
await this.handlerAsAvm().storageWrite(slot, value);
|
|
527
746
|
return toForeignCallResult([]);
|
|
528
747
|
}
|
|
529
|
-
|
|
748
|
+
// eslint-disable-next-line camelcase
|
|
749
|
+
async aztec_avm_getContractInstanceDeployer(foreignAddress) {
|
|
530
750
|
const address = addressFromSingle(foreignAddress);
|
|
531
|
-
const instance = await this.handlerAsUtility().
|
|
751
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
532
752
|
return toForeignCallResult([
|
|
533
753
|
toSingle(instance.deployer),
|
|
534
754
|
// AVM requires an extra boolean indicating the instance was found
|
|
535
755
|
toSingle(new Fr(1))
|
|
536
756
|
]);
|
|
537
757
|
}
|
|
538
|
-
|
|
758
|
+
// eslint-disable-next-line camelcase
|
|
759
|
+
async aztec_avm_getContractInstanceClassId(foreignAddress) {
|
|
539
760
|
const address = addressFromSingle(foreignAddress);
|
|
540
|
-
const instance = await this.handlerAsUtility().
|
|
761
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
541
762
|
return toForeignCallResult([
|
|
542
763
|
toSingle(instance.currentContractClassId),
|
|
543
764
|
// AVM requires an extra boolean indicating the instance was found
|
|
544
765
|
toSingle(new Fr(1))
|
|
545
766
|
]);
|
|
546
767
|
}
|
|
547
|
-
|
|
768
|
+
// eslint-disable-next-line camelcase
|
|
769
|
+
async aztec_avm_getContractInstanceInitializationHash(foreignAddress) {
|
|
548
770
|
const address = addressFromSingle(foreignAddress);
|
|
549
|
-
const instance = await this.handlerAsUtility().
|
|
771
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
550
772
|
return toForeignCallResult([
|
|
551
773
|
toSingle(instance.initializationHash),
|
|
552
774
|
// AVM requires an extra boolean indicating the instance was found
|
|
553
775
|
toSingle(new Fr(1))
|
|
554
776
|
]);
|
|
555
777
|
}
|
|
556
|
-
|
|
557
|
-
|
|
778
|
+
// eslint-disable-next-line camelcase
|
|
779
|
+
async aztec_avm_getContractInstanceImmutablesHash(foreignAddress) {
|
|
780
|
+
const address = addressFromSingle(foreignAddress);
|
|
781
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
782
|
+
return toForeignCallResult([
|
|
783
|
+
toSingle(instance.immutablesHash),
|
|
784
|
+
// AVM requires an extra boolean indicating the instance was found
|
|
785
|
+
toSingle(new Fr(1))
|
|
786
|
+
]);
|
|
787
|
+
}
|
|
788
|
+
// eslint-disable-next-line camelcase
|
|
789
|
+
async aztec_avm_sender() {
|
|
790
|
+
const sender = await this.handlerAsAvm().sender();
|
|
558
791
|
return toForeignCallResult([
|
|
559
792
|
toSingle(sender)
|
|
560
793
|
]);
|
|
561
794
|
}
|
|
562
|
-
|
|
795
|
+
// eslint-disable-next-line camelcase
|
|
796
|
+
async aztec_avm_emitNullifier(foreignNullifier) {
|
|
563
797
|
const nullifier = fromSingle(foreignNullifier);
|
|
564
|
-
await this.handlerAsAvm().
|
|
798
|
+
await this.handlerAsAvm().emitNullifier(nullifier);
|
|
565
799
|
return toForeignCallResult([]);
|
|
566
800
|
}
|
|
567
|
-
|
|
801
|
+
// eslint-disable-next-line camelcase
|
|
802
|
+
async aztec_avm_emitNoteHash(foreignNoteHash) {
|
|
568
803
|
const noteHash = fromSingle(foreignNoteHash);
|
|
569
|
-
await this.handlerAsAvm().
|
|
804
|
+
await this.handlerAsAvm().emitNoteHash(noteHash);
|
|
570
805
|
return toForeignCallResult([]);
|
|
571
806
|
}
|
|
572
|
-
|
|
807
|
+
// eslint-disable-next-line camelcase
|
|
808
|
+
async aztec_avm_nullifierExists(foreignSiloedNullifier) {
|
|
573
809
|
const siloedNullifier = fromSingle(foreignSiloedNullifier);
|
|
574
|
-
const exists = await this.handlerAsAvm().
|
|
810
|
+
const exists = await this.handlerAsAvm().nullifierExists(siloedNullifier);
|
|
575
811
|
return toForeignCallResult([
|
|
576
812
|
toSingle(new Fr(exists))
|
|
577
813
|
]);
|
|
578
814
|
}
|
|
579
|
-
|
|
580
|
-
|
|
815
|
+
// eslint-disable-next-line camelcase
|
|
816
|
+
async aztec_avm_address() {
|
|
817
|
+
const contractAddress = await this.handlerAsAvm().address();
|
|
581
818
|
return toForeignCallResult([
|
|
582
819
|
toSingle(contractAddress.toField())
|
|
583
820
|
]);
|
|
584
821
|
}
|
|
585
|
-
|
|
586
|
-
|
|
822
|
+
// eslint-disable-next-line camelcase
|
|
823
|
+
async aztec_avm_blockNumber() {
|
|
824
|
+
const blockNumber = await this.handlerAsAvm().blockNumber();
|
|
587
825
|
return toForeignCallResult([
|
|
588
826
|
toSingle(new Fr(blockNumber))
|
|
589
827
|
]);
|
|
590
828
|
}
|
|
591
|
-
|
|
592
|
-
|
|
829
|
+
// eslint-disable-next-line camelcase
|
|
830
|
+
async aztec_avm_timestamp() {
|
|
831
|
+
const timestamp = await this.handlerAsAvm().timestamp();
|
|
593
832
|
return toForeignCallResult([
|
|
594
833
|
toSingle(new Fr(timestamp))
|
|
595
834
|
]);
|
|
596
835
|
}
|
|
597
|
-
|
|
598
|
-
|
|
836
|
+
// eslint-disable-next-line camelcase
|
|
837
|
+
async aztec_avm_isStaticCall() {
|
|
838
|
+
const isStaticCall = await this.handlerAsAvm().isStaticCall();
|
|
599
839
|
return toForeignCallResult([
|
|
600
840
|
toSingle(new Fr(isStaticCall ? 1 : 0))
|
|
601
841
|
]);
|
|
602
842
|
}
|
|
603
|
-
|
|
604
|
-
|
|
843
|
+
// eslint-disable-next-line camelcase
|
|
844
|
+
async aztec_avm_chainId() {
|
|
845
|
+
const chainId = await this.handlerAsAvm().chainId();
|
|
605
846
|
return toForeignCallResult([
|
|
606
847
|
toSingle(chainId)
|
|
607
848
|
]);
|
|
608
849
|
}
|
|
609
|
-
|
|
610
|
-
|
|
850
|
+
// eslint-disable-next-line camelcase
|
|
851
|
+
async aztec_avm_version() {
|
|
852
|
+
const version = await this.handlerAsAvm().version();
|
|
611
853
|
return toForeignCallResult([
|
|
612
854
|
toSingle(version)
|
|
613
855
|
]);
|
|
614
856
|
}
|
|
615
|
-
|
|
616
|
-
|
|
857
|
+
// eslint-disable-next-line camelcase
|
|
858
|
+
async aztec_avm_returndataSize() {
|
|
859
|
+
const result = await this.handlerAsAvm().returndataSize();
|
|
860
|
+
return toForeignCallResult([
|
|
861
|
+
toSingle(result)
|
|
862
|
+
]);
|
|
617
863
|
}
|
|
618
|
-
|
|
619
|
-
|
|
864
|
+
// eslint-disable-next-line camelcase
|
|
865
|
+
async aztec_avm_returndataCopy(foreignRdOffset, foreignCopySize) {
|
|
866
|
+
const rdOffset = fromSingle(foreignRdOffset).toNumber();
|
|
867
|
+
const copySize = fromSingle(foreignCopySize).toNumber();
|
|
868
|
+
const result = await this.handlerAsAvm().returndataCopy(rdOffset, copySize);
|
|
869
|
+
return toForeignCallResult([
|
|
870
|
+
toArray(result)
|
|
871
|
+
]);
|
|
620
872
|
}
|
|
621
|
-
|
|
622
|
-
|
|
873
|
+
// eslint-disable-next-line camelcase
|
|
874
|
+
async aztec_avm_call(foreignL2Gas, foreignDaGas, foreignAddress, foreignLength, foreignArgs) {
|
|
875
|
+
const l2Gas = fromSingle(foreignL2Gas).toNumber();
|
|
876
|
+
const daGas = fromSingle(foreignDaGas).toNumber();
|
|
877
|
+
const address = addressFromSingle(foreignAddress);
|
|
878
|
+
const argsLength = fromSingle(foreignLength).toNumber();
|
|
879
|
+
const args = fromArray(foreignArgs);
|
|
880
|
+
const result = await this.handlerAsAvm().call(l2Gas, daGas, address, argsLength, args);
|
|
881
|
+
return toForeignCallResult([
|
|
882
|
+
toArray(result)
|
|
883
|
+
]);
|
|
623
884
|
}
|
|
624
|
-
|
|
625
|
-
|
|
885
|
+
// eslint-disable-next-line camelcase
|
|
886
|
+
async aztec_avm_staticCall(foreignL2Gas, foreignDaGas, foreignAddress, foreignLength, foreignArgs) {
|
|
887
|
+
const l2Gas = fromSingle(foreignL2Gas).toNumber();
|
|
888
|
+
const daGas = fromSingle(foreignDaGas).toNumber();
|
|
889
|
+
const address = addressFromSingle(foreignAddress);
|
|
890
|
+
const argsLength = fromSingle(foreignLength).toNumber();
|
|
891
|
+
const args = fromArray(foreignArgs);
|
|
892
|
+
const result = await this.handlerAsAvm().staticCall(l2Gas, daGas, address, argsLength, args);
|
|
893
|
+
return toForeignCallResult([
|
|
894
|
+
toArray(result)
|
|
895
|
+
]);
|
|
626
896
|
}
|
|
627
|
-
|
|
628
|
-
|
|
897
|
+
// eslint-disable-next-line camelcase
|
|
898
|
+
async aztec_avm_successCopy() {
|
|
899
|
+
const result = await this.handlerAsAvm().successCopy();
|
|
900
|
+
return toForeignCallResult([
|
|
901
|
+
toSingle(result)
|
|
902
|
+
]);
|
|
629
903
|
}
|
|
630
|
-
|
|
631
|
-
|
|
904
|
+
// TODO(F-674): Move orchestration logic into the handler so the transport layer is pure serialize→delegate→deserialize.
|
|
905
|
+
// eslint-disable-next-line camelcase
|
|
906
|
+
async aztec_txe_privateCallNewFlow(foreignFromIsSome, foreignFromValue, foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignArgsHash, foreignIsStaticCall, foreignAdditionalScopes, foreignAuthorizedUtilityCallTargets, foreignGasSettings) {
|
|
907
|
+
const from = fromSingle(foreignFromIsSome).toBool() ? addressFromSingle(foreignFromValue) : undefined;
|
|
632
908
|
const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
|
|
633
909
|
const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
|
|
634
910
|
const args = fromArray(foreignArgs);
|
|
635
911
|
const argsHash = fromSingle(foreignArgsHash);
|
|
636
912
|
const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
|
|
637
|
-
const
|
|
913
|
+
const additionalScopes = fromArray(foreignAdditionalScopes).map((field)=>AztecAddress.fromField(field));
|
|
914
|
+
const authorizedUtilityCallTargets = fromArray(foreignAuthorizedUtilityCallTargets).map((field)=>AztecAddress.fromField(field));
|
|
915
|
+
const gasSettings = GasSettings.fromFields(fromArray(foreignGasSettings));
|
|
916
|
+
const returnValues = await this.stateHandler.withTopLevelCallTracking(async ()=>{
|
|
917
|
+
const { returnValues, offchainEffects } = await this.handlerAsTxe().privateCallNewFlow(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall, additionalScopes, this.stateHandler.getCurrentJob(), authorizedUtilityCallTargets, gasSettings);
|
|
918
|
+
// Private execution collects offchain effects inside PXE's PrivateExecutionOracle rather than
|
|
919
|
+
// round-tripping them through `aztec_utl_emitOffchainEffect`, so the session buffer is empty
|
|
920
|
+
// at this point. Drain the effects from the execution tree into the session buffer so the
|
|
921
|
+
// next `env.offchain_messages()` call in the test sees them.
|
|
922
|
+
for (const data of offchainEffects){
|
|
923
|
+
this.stateHandler.recordOffchainEffect(data);
|
|
924
|
+
}
|
|
925
|
+
// TODO(F-335): Avoid doing the following call here.
|
|
926
|
+
await this.stateHandler.cycleJob();
|
|
927
|
+
if (isStaticCall) {
|
|
928
|
+
// Static calls revert their checkpoint and mine no block, so there is no tx hash to tag
|
|
929
|
+
// offchain effects with. Querying `getLastTxEffects()` here would return an unrelated
|
|
930
|
+
// predecessor tx.
|
|
931
|
+
return {
|
|
932
|
+
result: returnValues
|
|
933
|
+
};
|
|
934
|
+
}
|
|
935
|
+
const { txHash } = await this.handlerAsTxe().getLastTxEffects();
|
|
936
|
+
return {
|
|
937
|
+
result: returnValues,
|
|
938
|
+
txHash: txHash.hash
|
|
939
|
+
};
|
|
940
|
+
});
|
|
638
941
|
return toForeignCallResult([
|
|
639
942
|
toArray(returnValues)
|
|
640
943
|
]);
|
|
641
944
|
}
|
|
642
|
-
|
|
945
|
+
// TODO(F-674): Move orchestration logic into the handler so the transport layer is pure serialize→delegate→deserialize.
|
|
946
|
+
// eslint-disable-next-line camelcase
|
|
947
|
+
async aztec_txe_executeUtilityFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignAuthorizedUtilityCallTargets) {
|
|
643
948
|
const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
|
|
644
949
|
const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
|
|
645
950
|
const args = fromArray(foreignArgs);
|
|
646
|
-
const
|
|
951
|
+
const authorizedUtilityCallTargets = fromArray(foreignAuthorizedUtilityCallTargets).map((field)=>AztecAddress.fromField(field));
|
|
952
|
+
const returnValues = await this.stateHandler.withTopLevelCallTracking(async ()=>{
|
|
953
|
+
const returnValues = await this.handlerAsTxe().executeUtilityFunction(targetContractAddress, functionSelector, args, this.stateHandler.getCurrentJob(), authorizedUtilityCallTargets);
|
|
954
|
+
// TODO(F-335): Avoid doing the following call here.
|
|
955
|
+
await this.stateHandler.cycleJob();
|
|
956
|
+
return {
|
|
957
|
+
result: returnValues
|
|
958
|
+
};
|
|
959
|
+
});
|
|
647
960
|
return toForeignCallResult([
|
|
648
961
|
toArray(returnValues)
|
|
649
962
|
]);
|
|
650
963
|
}
|
|
651
|
-
|
|
652
|
-
|
|
964
|
+
// TODO(F-674): Move orchestration logic into the handler so the transport layer is pure serialize→delegate→deserialize.
|
|
965
|
+
// eslint-disable-next-line camelcase
|
|
966
|
+
async aztec_txe_publicCallNewFlow(foreignFromIsSome, foreignFromValue, foreignAddress, foreignCalldata, foreignIsStaticCall, foreignGasSettings) {
|
|
967
|
+
const from = fromSingle(foreignFromIsSome).toBool() ? addressFromSingle(foreignFromValue) : undefined;
|
|
653
968
|
const address = addressFromSingle(foreignAddress);
|
|
654
969
|
const calldata = fromArray(foreignCalldata);
|
|
655
970
|
const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
|
|
656
|
-
const
|
|
971
|
+
const gasSettings = GasSettings.fromFields(fromArray(foreignGasSettings));
|
|
972
|
+
const returnValues = await this.stateHandler.withTopLevelCallTracking(async ()=>{
|
|
973
|
+
const returnValues = await this.handlerAsTxe().publicCallNewFlow(from, address, calldata, isStaticCall, gasSettings);
|
|
974
|
+
// TODO(F-335): Avoid doing the following call here.
|
|
975
|
+
await this.stateHandler.cycleJob();
|
|
976
|
+
if (isStaticCall) {
|
|
977
|
+
// See equivalent branch in `aztec_txe_privateCallNewFlow`.
|
|
978
|
+
return {
|
|
979
|
+
result: returnValues
|
|
980
|
+
};
|
|
981
|
+
}
|
|
982
|
+
const { txHash } = await this.handlerAsTxe().getLastTxEffects();
|
|
983
|
+
return {
|
|
984
|
+
result: returnValues,
|
|
985
|
+
txHash: txHash.hash
|
|
986
|
+
};
|
|
987
|
+
});
|
|
657
988
|
return toForeignCallResult([
|
|
658
989
|
toArray(returnValues)
|
|
659
990
|
]);
|
|
660
991
|
}
|
|
661
|
-
|
|
662
|
-
|
|
992
|
+
// eslint-disable-next-line camelcase
|
|
993
|
+
async aztec_prv_getSenderForTags() {
|
|
994
|
+
const senderOpt = await this.handlerAsPrivate().getSenderForTags();
|
|
663
995
|
// Return a Noir Option struct with `some` and `value` fields
|
|
664
|
-
if (
|
|
665
|
-
//
|
|
996
|
+
if (senderOpt.isSome()) {
|
|
997
|
+
// Sender found, return Option with some=1 and value=sender address
|
|
666
998
|
return toForeignCallResult([
|
|
667
|
-
toSingle(
|
|
668
|
-
toSingle(
|
|
999
|
+
toSingle(1),
|
|
1000
|
+
toSingle(senderOpt.value)
|
|
669
1001
|
]);
|
|
670
1002
|
} else {
|
|
671
|
-
//
|
|
1003
|
+
// No sender found, return Option with some=0 and value=0
|
|
672
1004
|
return toForeignCallResult([
|
|
673
|
-
toSingle(
|
|
674
|
-
toSingle(
|
|
1005
|
+
toSingle(0),
|
|
1006
|
+
toSingle(0)
|
|
675
1007
|
]);
|
|
676
1008
|
}
|
|
677
1009
|
}
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
await this.handlerAsPrivate().privateSetSenderForTags(senderForTags);
|
|
681
|
-
return toForeignCallResult([]);
|
|
682
|
-
}
|
|
683
|
-
async privateGetNextAppTagAsSender(foreignSender, foreignRecipient) {
|
|
1010
|
+
// eslint-disable-next-line camelcase
|
|
1011
|
+
async aztec_prv_getNextAppTagAsSender(foreignSender, foreignRecipient) {
|
|
684
1012
|
const sender = AztecAddress.fromField(fromSingle(foreignSender));
|
|
685
1013
|
const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
|
|
686
|
-
const nextAppTag = await this.handlerAsPrivate().
|
|
1014
|
+
const nextAppTag = await this.handlerAsPrivate().getNextAppTagAsSender(sender, recipient);
|
|
687
1015
|
return toForeignCallResult([
|
|
688
1016
|
toSingle(nextAppTag.value)
|
|
689
1017
|
]);
|
|
690
1018
|
}
|
|
1019
|
+
// eslint-disable-next-line camelcase
|
|
1020
|
+
async aztec_prv_getNextConstrainedTaggingIndex(foreignAppSiloedSecret) {
|
|
1021
|
+
const appSiloedSecret = fromSingle(foreignAppSiloedSecret);
|
|
1022
|
+
const index = await this.handlerAsPrivate().getNextConstrainedTaggingIndex(appSiloedSecret);
|
|
1023
|
+
return toForeignCallResult([
|
|
1024
|
+
toSingle(new Fr(index))
|
|
1025
|
+
]);
|
|
1026
|
+
}
|
|
691
1027
|
}
|