@aztec/txe 0.0.1-commit.85d7d01 → 0.0.1-commit.8655d4a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +39 -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 +36 -20
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_top_level_context.js +125 -66
- 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 +567 -243
- 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 +13 -7
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +16 -4
- 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 +64 -6
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +159 -31
- 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 +43 -34
- package/src/oracle/txe_oracle_public_context.ts +42 -12
- package/src/oracle/txe_oracle_top_level_context.ts +146 -77
- package/src/oracle/txe_private_execution_oracle.ts +30 -0
- package/src/rpc_server.ts +87 -0
- package/src/rpc_translator.ts +646 -326
- package/src/state_machine/archiver.ts +33 -18
- package/src/state_machine/dummy_p2p_client.ts +31 -11
- 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 +253 -33
- 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,11 +1,13 @@
|
|
|
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 {
|
|
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';
|
|
9
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 {
|
|
@@ -60,119 +62,180 @@ 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);
|
|
@@ -182,7 +245,7 @@ export class RPCTranslator {
|
|
|
182
245
|
// We cycle job to commit the stores after the contract sync.
|
|
183
246
|
await this.stateHandler.cycleJob();
|
|
184
247
|
}
|
|
185
|
-
const events = await this.handlerAsTxe().
|
|
248
|
+
const events = await this.handlerAsTxe().getPrivateEvents(selector, contractAddress, scope);
|
|
186
249
|
if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
|
|
187
250
|
throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
|
|
188
251
|
}
|
|
@@ -200,50 +263,53 @@ export class RPCTranslator {
|
|
|
200
263
|
toSingle(queryLength)
|
|
201
264
|
]);
|
|
202
265
|
}
|
|
203
|
-
|
|
266
|
+
// eslint-disable-next-line camelcase
|
|
267
|
+
aztec_prv_setHashPreimage(foreignValues, foreignHash) {
|
|
204
268
|
const values = fromArray(foreignValues);
|
|
205
269
|
const hash = fromSingle(foreignHash);
|
|
206
|
-
this.handlerAsPrivate().
|
|
270
|
+
this.handlerAsPrivate().setHashPreimage(values, hash);
|
|
207
271
|
return toForeignCallResult([]);
|
|
208
272
|
}
|
|
209
|
-
|
|
273
|
+
// eslint-disable-next-line camelcase
|
|
274
|
+
async aztec_prv_getHashPreimage(foreignHash) {
|
|
210
275
|
const hash = fromSingle(foreignHash);
|
|
211
|
-
const returns = await this.handlerAsPrivate().
|
|
276
|
+
const returns = await this.handlerAsPrivate().getHashPreimage(hash);
|
|
212
277
|
return toForeignCallResult([
|
|
213
278
|
toArray(returns)
|
|
214
279
|
]);
|
|
215
280
|
}
|
|
216
281
|
// When the argument is a slice, noir automatically adds a length field to oracle call.
|
|
217
282
|
// When the argument is an array, we add the field length manually to the signature.
|
|
218
|
-
|
|
283
|
+
// eslint-disable-next-line camelcase
|
|
284
|
+
async aztec_utl_log(foreignLevel, foreignMessage, _foreignLength, foreignFields) {
|
|
219
285
|
const level = fromSingle(foreignLevel).toNumber();
|
|
220
286
|
const message = fromArray(foreignMessage).map((field)=>String.fromCharCode(field.toNumber())).join('');
|
|
221
287
|
const fields = fromArray(foreignFields);
|
|
222
|
-
await this.handlerAsMisc().
|
|
288
|
+
await this.handlerAsMisc().log(level, message, fields);
|
|
223
289
|
return toForeignCallResult([]);
|
|
224
290
|
}
|
|
225
|
-
|
|
226
|
-
|
|
291
|
+
// eslint-disable-next-line camelcase
|
|
292
|
+
async aztec_utl_getFromPublicStorage(foreignBlockHash, foreignContractAddress, foreignStartStorageSlot, foreignNumberOfElements) {
|
|
293
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
227
294
|
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
228
295
|
const startStorageSlot = fromSingle(foreignStartStorageSlot);
|
|
229
296
|
const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
|
|
230
|
-
const values = await this.handlerAsUtility().
|
|
297
|
+
const values = await this.handlerAsUtility().getFromPublicStorage(blockHash, contractAddress, startStorageSlot, numberOfElements);
|
|
231
298
|
return toForeignCallResult([
|
|
232
299
|
toArray(values)
|
|
233
300
|
]);
|
|
234
301
|
}
|
|
235
|
-
|
|
236
|
-
|
|
302
|
+
// eslint-disable-next-line camelcase
|
|
303
|
+
async aztec_utl_getPublicDataWitness(foreignBlockHash, foreignLeafSlot) {
|
|
304
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
237
305
|
const leafSlot = fromSingle(foreignLeafSlot);
|
|
238
|
-
const witness = await this.handlerAsUtility().
|
|
239
|
-
if (!witness) {
|
|
240
|
-
throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockHash.toString()}.`);
|
|
241
|
-
}
|
|
306
|
+
const witness = await this.handlerAsUtility().getPublicDataWitness(blockHash, leafSlot);
|
|
242
307
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
243
308
|
}
|
|
244
|
-
|
|
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) {
|
|
245
311
|
// Parse Option<AztecAddress>: ownerIsSome is 0 for None, 1 for Some
|
|
246
|
-
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);
|
|
247
313
|
const storageSlot = fromSingle(foreignStorageSlot);
|
|
248
314
|
const numSelects = fromSingle(foreignNumSelects).toNumber();
|
|
249
315
|
const selectByIndexes = fromArray(foreignSelectByIndexes).map((fr)=>fr.toNumber());
|
|
@@ -260,8 +326,8 @@ export class RPCTranslator {
|
|
|
260
326
|
const status = fromSingle(foreignStatus).toNumber();
|
|
261
327
|
const maxNotes = fromSingle(foreignMaxNotes).toNumber();
|
|
262
328
|
const packedHintedNoteLength = fromSingle(foreignPackedHintedNoteLength).toNumber();
|
|
263
|
-
const
|
|
264
|
-
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({
|
|
265
331
|
contractAddress: noteData.contractAddress,
|
|
266
332
|
owner: noteData.owner,
|
|
267
333
|
randomness: noteData.randomness,
|
|
@@ -270,12 +336,11 @@ export class RPCTranslator {
|
|
|
270
336
|
isPending: noteData.isPending,
|
|
271
337
|
note: noteData.note
|
|
272
338
|
}));
|
|
273
|
-
// Now we convert each sub-array to an array of ForeignCallSingles
|
|
274
339
|
const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map((subArray)=>subArray.map(toSingle));
|
|
275
|
-
// At last we convert the array of arrays to a bounded vec of arrays
|
|
276
340
|
return toForeignCallResult(arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedHintedNoteLength));
|
|
277
341
|
}
|
|
278
|
-
|
|
342
|
+
// eslint-disable-next-line camelcase
|
|
343
|
+
aztec_prv_notifyCreatedNote(foreignOwner, foreignStorageSlot, foreignRandomness, foreignNoteTypeId, foreignNote, foreignNoteHash, foreignCounter) {
|
|
279
344
|
const owner = addressFromSingle(foreignOwner);
|
|
280
345
|
const storageSlot = fromSingle(foreignStorageSlot);
|
|
281
346
|
const randomness = fromSingle(foreignRandomness);
|
|
@@ -283,421 +348,680 @@ export class RPCTranslator {
|
|
|
283
348
|
const note = fromArray(foreignNote);
|
|
284
349
|
const noteHash = fromSingle(foreignNoteHash);
|
|
285
350
|
const counter = fromSingle(foreignCounter).toNumber();
|
|
286
|
-
this.handlerAsPrivate().
|
|
351
|
+
this.handlerAsPrivate().notifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter);
|
|
287
352
|
return toForeignCallResult([]);
|
|
288
353
|
}
|
|
289
|
-
|
|
354
|
+
// eslint-disable-next-line camelcase
|
|
355
|
+
async aztec_prv_notifyNullifiedNote(foreignInnerNullifier, foreignNoteHash, foreignCounter) {
|
|
290
356
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
291
357
|
const noteHash = fromSingle(foreignNoteHash);
|
|
292
358
|
const counter = fromSingle(foreignCounter).toNumber();
|
|
293
|
-
await this.handlerAsPrivate().
|
|
359
|
+
await this.handlerAsPrivate().notifyNullifiedNote(innerNullifier, noteHash, counter);
|
|
294
360
|
return toForeignCallResult([]);
|
|
295
361
|
}
|
|
296
|
-
|
|
362
|
+
// eslint-disable-next-line camelcase
|
|
363
|
+
async aztec_prv_notifyCreatedNullifier(foreignInnerNullifier) {
|
|
297
364
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
298
|
-
await this.handlerAsPrivate().
|
|
365
|
+
await this.handlerAsPrivate().notifyCreatedNullifier(innerNullifier);
|
|
299
366
|
return toForeignCallResult([]);
|
|
300
367
|
}
|
|
301
|
-
|
|
368
|
+
// eslint-disable-next-line camelcase
|
|
369
|
+
async aztec_prv_isNullifierPending(foreignInnerNullifier, foreignContractAddress) {
|
|
302
370
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
303
371
|
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
304
|
-
const isPending = await this.handlerAsPrivate().
|
|
372
|
+
const isPending = await this.handlerAsPrivate().isNullifierPending(innerNullifier, contractAddress);
|
|
305
373
|
return toForeignCallResult([
|
|
306
374
|
toSingle(new Fr(isPending))
|
|
307
375
|
]);
|
|
308
376
|
}
|
|
309
|
-
|
|
377
|
+
// eslint-disable-next-line camelcase
|
|
378
|
+
async aztec_utl_doesNullifierExist(foreignInnerNullifier) {
|
|
310
379
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
311
|
-
const exists = await this.handlerAsUtility().
|
|
380
|
+
const exists = await this.handlerAsUtility().doesNullifierExist(innerNullifier);
|
|
312
381
|
return toForeignCallResult([
|
|
313
382
|
toSingle(new Fr(exists))
|
|
314
383
|
]);
|
|
315
384
|
}
|
|
316
|
-
|
|
385
|
+
// eslint-disable-next-line camelcase
|
|
386
|
+
async aztec_utl_getContractInstance(foreignAddress) {
|
|
317
387
|
const address = addressFromSingle(foreignAddress);
|
|
318
|
-
const instance = await this.handlerAsUtility().
|
|
388
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
319
389
|
return toForeignCallResult([
|
|
320
390
|
instance.salt,
|
|
321
391
|
instance.deployer.toField(),
|
|
322
392
|
instance.currentContractClassId,
|
|
323
393
|
instance.initializationHash,
|
|
394
|
+
instance.immutablesHash,
|
|
324
395
|
...instance.publicKeys.toFields()
|
|
325
396
|
].map(toSingle));
|
|
326
397
|
}
|
|
327
|
-
|
|
398
|
+
// eslint-disable-next-line camelcase
|
|
399
|
+
async aztec_utl_getPublicKeysAndPartialAddress(foreignAddress) {
|
|
328
400
|
const address = addressFromSingle(foreignAddress);
|
|
329
|
-
const result = await this.handlerAsUtility().
|
|
401
|
+
const result = await this.handlerAsUtility().getPublicKeysAndPartialAddress(address);
|
|
330
402
|
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
331
403
|
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
332
|
-
if (result
|
|
404
|
+
if (!result.isSome()) {
|
|
333
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.
|
|
334
407
|
return toForeignCallResult([
|
|
335
408
|
toSingle(new Fr(0)),
|
|
336
|
-
toArray(Array(
|
|
409
|
+
toArray(Array(8).fill(new Fr(0)))
|
|
337
410
|
]);
|
|
338
411
|
} else {
|
|
339
|
-
//
|
|
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;
|
|
340
417
|
return toForeignCallResult([
|
|
341
418
|
toSingle(new Fr(1)),
|
|
342
419
|
toArray([
|
|
343
|
-
|
|
344
|
-
|
|
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
|
|
345
428
|
])
|
|
346
429
|
]);
|
|
347
430
|
}
|
|
348
431
|
}
|
|
349
|
-
|
|
432
|
+
// eslint-disable-next-line camelcase
|
|
433
|
+
async aztec_utl_getKeyValidationRequest(foreignPkMHash) {
|
|
350
434
|
const pkMHash = fromSingle(foreignPkMHash);
|
|
351
|
-
const keyValidationRequest = await this.handlerAsUtility().
|
|
435
|
+
const keyValidationRequest = await this.handlerAsUtility().getKeyValidationRequest(pkMHash);
|
|
352
436
|
return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
|
|
353
437
|
}
|
|
354
|
-
|
|
355
|
-
|
|
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
|
+
]);
|
|
356
452
|
}
|
|
357
|
-
|
|
358
|
-
|
|
453
|
+
// eslint-disable-next-line camelcase
|
|
454
|
+
async aztec_utl_getNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
|
|
455
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
359
456
|
const nullifier = fromSingle(foreignNullifier);
|
|
360
|
-
const witness = await this.handlerAsUtility().
|
|
361
|
-
if (!witness) {
|
|
362
|
-
throw new Error(`Nullifier membership witness not found at block ${blockHash}.`);
|
|
363
|
-
}
|
|
457
|
+
const witness = await this.handlerAsUtility().getNullifierMembershipWitness(blockHash, nullifier);
|
|
364
458
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
365
459
|
}
|
|
366
|
-
|
|
460
|
+
// eslint-disable-next-line camelcase
|
|
461
|
+
async aztec_utl_getAuthWitness(foreignMessageHash) {
|
|
367
462
|
const messageHash = fromSingle(foreignMessageHash);
|
|
368
|
-
const authWitness = await this.handlerAsUtility().
|
|
369
|
-
if (!authWitness) {
|
|
370
|
-
throw new Error(`Auth witness not found for message hash ${messageHash}.`);
|
|
371
|
-
}
|
|
463
|
+
const authWitness = await this.handlerAsUtility().getAuthWitness(messageHash);
|
|
372
464
|
return toForeignCallResult([
|
|
373
465
|
toArray(authWitness)
|
|
374
466
|
]);
|
|
375
467
|
}
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
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([]);
|
|
381
473
|
}
|
|
382
|
-
|
|
383
|
-
|
|
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([]);
|
|
384
479
|
}
|
|
385
|
-
|
|
480
|
+
// eslint-disable-next-line camelcase
|
|
481
|
+
async aztec_prv_isExecutionInRevertiblePhase(foreignSideEffectCounter) {
|
|
386
482
|
const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
|
|
387
|
-
const isRevertible = await this.handlerAsPrivate().
|
|
483
|
+
const isRevertible = await this.handlerAsPrivate().isExecutionInRevertiblePhase(sideEffectCounter);
|
|
388
484
|
return toForeignCallResult([
|
|
389
485
|
toSingle(new Fr(isRevertible))
|
|
390
486
|
]);
|
|
391
487
|
}
|
|
392
|
-
|
|
393
|
-
|
|
488
|
+
// eslint-disable-next-line camelcase
|
|
489
|
+
aztec_utl_getUtilityContext() {
|
|
490
|
+
const context = this.handlerAsUtility().getUtilityContext();
|
|
394
491
|
return toForeignCallResult(context.toNoirRepresentation());
|
|
395
492
|
}
|
|
396
|
-
|
|
493
|
+
// eslint-disable-next-line camelcase
|
|
494
|
+
async aztec_utl_getBlockHeader(foreignBlockNumber) {
|
|
397
495
|
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
398
|
-
const header = await this.handlerAsUtility().
|
|
399
|
-
if (!header) {
|
|
400
|
-
throw new Error(`Block header not found for block ${blockNumber}.`);
|
|
401
|
-
}
|
|
496
|
+
const header = await this.handlerAsUtility().getBlockHeader(blockNumber);
|
|
402
497
|
return toForeignCallResult(header.toFields().map(toSingle));
|
|
403
498
|
}
|
|
404
|
-
|
|
405
|
-
|
|
499
|
+
// eslint-disable-next-line camelcase
|
|
500
|
+
async aztec_utl_getNoteHashMembershipWitness(foreignAnchorBlockHash, foreignNoteHash) {
|
|
501
|
+
const blockHash = blockHashFromSingle(foreignAnchorBlockHash);
|
|
406
502
|
const noteHash = fromSingle(foreignNoteHash);
|
|
407
|
-
const witness = await this.handlerAsUtility().
|
|
408
|
-
if (!witness) {
|
|
409
|
-
throw new Error(`Note hash ${noteHash} not found in the note hash tree at block ${blockHash.toString()}.`);
|
|
410
|
-
}
|
|
503
|
+
const witness = await this.handlerAsUtility().getNoteHashMembershipWitness(blockHash, noteHash);
|
|
411
504
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
412
505
|
}
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
const
|
|
416
|
-
const
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
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
|
+
]);
|
|
421
516
|
}
|
|
422
|
-
|
|
423
|
-
|
|
517
|
+
// eslint-disable-next-line camelcase
|
|
518
|
+
async aztec_utl_getLowNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
|
|
519
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
424
520
|
const nullifier = fromSingle(foreignNullifier);
|
|
425
|
-
const witness = await this.handlerAsUtility().
|
|
426
|
-
if (!witness) {
|
|
427
|
-
throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockHash}.`);
|
|
428
|
-
}
|
|
521
|
+
const witness = await this.handlerAsUtility().getLowNullifierMembershipWitness(blockHash, nullifier);
|
|
429
522
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
430
523
|
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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
|
+
]);
|
|
435
531
|
}
|
|
436
|
-
|
|
437
|
-
|
|
532
|
+
// eslint-disable-next-line camelcase
|
|
533
|
+
async aztec_utl_validateAndStoreEnqueuedNotesAndEvents(foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot, foreignScope) {
|
|
438
534
|
const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
|
|
439
535
|
const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
|
|
440
|
-
|
|
536
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
537
|
+
await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot, scope);
|
|
441
538
|
return toForeignCallResult([]);
|
|
442
539
|
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
const
|
|
446
|
-
const
|
|
447
|
-
|
|
448
|
-
|
|
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
|
+
]);
|
|
547
|
+
}
|
|
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
|
+
]);
|
|
449
555
|
}
|
|
450
|
-
|
|
556
|
+
// eslint-disable-next-line camelcase
|
|
557
|
+
aztec_utl_setCapsule(foreignContractAddress, foreignSlot, foreignCapsule, foreignScope) {
|
|
451
558
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
452
559
|
const slot = fromSingle(foreignSlot);
|
|
453
560
|
const capsule = fromArray(foreignCapsule);
|
|
454
|
-
|
|
561
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
562
|
+
this.handlerAsUtility().setCapsule(contractAddress, slot, capsule, scope);
|
|
455
563
|
return toForeignCallResult([]);
|
|
456
564
|
}
|
|
457
|
-
|
|
565
|
+
// eslint-disable-next-line camelcase
|
|
566
|
+
async aztec_utl_getCapsule(foreignContractAddress, foreignSlot, foreignTSize, foreignScope) {
|
|
458
567
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
459
568
|
const slot = fromSingle(foreignSlot);
|
|
460
569
|
const tSize = fromSingle(foreignTSize).toNumber();
|
|
461
|
-
const
|
|
570
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
571
|
+
const opt = await this.handlerAsUtility().getCapsule(contractAddress, slot, tSize, scope);
|
|
462
572
|
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
463
573
|
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
464
|
-
if (
|
|
465
|
-
//
|
|
574
|
+
if (opt.isSome()) {
|
|
575
|
+
// Data was found so we set `some` to 1 and return it along with `value`.
|
|
466
576
|
return toForeignCallResult([
|
|
467
|
-
toSingle(new Fr(
|
|
468
|
-
toArray(Array(
|
|
577
|
+
toSingle(new Fr(1)),
|
|
578
|
+
toArray(Array.from(opt.value))
|
|
469
579
|
]);
|
|
470
580
|
} else {
|
|
471
|
-
//
|
|
581
|
+
// No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
|
|
472
582
|
return toForeignCallResult([
|
|
473
|
-
toSingle(new Fr(
|
|
474
|
-
toArray(
|
|
583
|
+
toSingle(new Fr(0)),
|
|
584
|
+
toArray(Array(tSize).fill(new Fr(0)))
|
|
475
585
|
]);
|
|
476
586
|
}
|
|
477
587
|
}
|
|
478
|
-
|
|
588
|
+
// eslint-disable-next-line camelcase
|
|
589
|
+
aztec_utl_deleteCapsule(foreignContractAddress, foreignSlot, foreignScope) {
|
|
479
590
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
480
591
|
const slot = fromSingle(foreignSlot);
|
|
481
|
-
|
|
592
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
593
|
+
this.handlerAsUtility().deleteCapsule(contractAddress, slot, scope);
|
|
482
594
|
return toForeignCallResult([]);
|
|
483
595
|
}
|
|
484
|
-
|
|
596
|
+
// eslint-disable-next-line camelcase
|
|
597
|
+
async aztec_utl_copyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries, foreignScope) {
|
|
485
598
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
486
599
|
const srcSlot = fromSingle(foreignSrcSlot);
|
|
487
600
|
const dstSlot = fromSingle(foreignDstSlot);
|
|
488
601
|
const numEntries = fromSingle(foreignNumEntries).toNumber();
|
|
489
|
-
|
|
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);
|
|
490
659
|
return toForeignCallResult([]);
|
|
491
660
|
}
|
|
492
661
|
// TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
|
|
493
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
|
|
494
663
|
// to implement this function here. Isn't there a way to programmatically identify that this is missing, given the
|
|
495
664
|
// existence of a txe_oracle method?
|
|
496
|
-
|
|
497
|
-
|
|
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
|
+
});
|
|
498
675
|
const iv = fromUintArray(foreignIv, 8);
|
|
499
676
|
const symKey = fromUintArray(foreignSymKey, 8);
|
|
500
|
-
|
|
501
|
-
|
|
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
|
+
}
|
|
502
694
|
}
|
|
503
|
-
|
|
695
|
+
// eslint-disable-next-line camelcase
|
|
696
|
+
async aztec_utl_getSharedSecrets(foreignAddress, foreignEphPksSlot, foreignContractAddress) {
|
|
504
697
|
const address = AztecAddress.fromField(fromSingle(foreignAddress));
|
|
505
|
-
const
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
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)
|
|
509
703
|
]);
|
|
510
|
-
const secret = await this.handlerAsUtility().utilityGetSharedSecret(address, ephPK);
|
|
511
|
-
return toForeignCallResult(secret.toFields().map(toSingle));
|
|
512
704
|
}
|
|
513
|
-
|
|
514
|
-
|
|
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([]));
|
|
515
725
|
}
|
|
516
726
|
// AVM opcodes
|
|
517
|
-
|
|
727
|
+
// eslint-disable-next-line camelcase
|
|
728
|
+
aztec_avm_emitPublicLog(_foreignMessage) {
|
|
518
729
|
// TODO(#8811): Implement
|
|
519
730
|
return toForeignCallResult([]);
|
|
520
731
|
}
|
|
521
|
-
|
|
732
|
+
// eslint-disable-next-line camelcase
|
|
733
|
+
async aztec_avm_storageRead(foreignSlot, foreignContractAddress) {
|
|
522
734
|
const slot = fromSingle(foreignSlot);
|
|
523
735
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
524
|
-
const value = (await this.handlerAsAvm().
|
|
736
|
+
const value = (await this.handlerAsAvm().storageRead(slot, contractAddress)).value;
|
|
525
737
|
return toForeignCallResult([
|
|
526
738
|
toSingle(new Fr(value))
|
|
527
739
|
]);
|
|
528
740
|
}
|
|
529
|
-
|
|
741
|
+
// eslint-disable-next-line camelcase
|
|
742
|
+
async aztec_avm_storageWrite(foreignSlot, foreignValue) {
|
|
530
743
|
const slot = fromSingle(foreignSlot);
|
|
531
744
|
const value = fromSingle(foreignValue);
|
|
532
|
-
await this.handlerAsAvm().
|
|
745
|
+
await this.handlerAsAvm().storageWrite(slot, value);
|
|
533
746
|
return toForeignCallResult([]);
|
|
534
747
|
}
|
|
535
|
-
|
|
748
|
+
// eslint-disable-next-line camelcase
|
|
749
|
+
async aztec_avm_getContractInstanceDeployer(foreignAddress) {
|
|
536
750
|
const address = addressFromSingle(foreignAddress);
|
|
537
|
-
const instance = await this.handlerAsUtility().
|
|
751
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
538
752
|
return toForeignCallResult([
|
|
539
753
|
toSingle(instance.deployer),
|
|
540
754
|
// AVM requires an extra boolean indicating the instance was found
|
|
541
755
|
toSingle(new Fr(1))
|
|
542
756
|
]);
|
|
543
757
|
}
|
|
544
|
-
|
|
758
|
+
// eslint-disable-next-line camelcase
|
|
759
|
+
async aztec_avm_getContractInstanceClassId(foreignAddress) {
|
|
545
760
|
const address = addressFromSingle(foreignAddress);
|
|
546
|
-
const instance = await this.handlerAsUtility().
|
|
761
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
547
762
|
return toForeignCallResult([
|
|
548
763
|
toSingle(instance.currentContractClassId),
|
|
549
764
|
// AVM requires an extra boolean indicating the instance was found
|
|
550
765
|
toSingle(new Fr(1))
|
|
551
766
|
]);
|
|
552
767
|
}
|
|
553
|
-
|
|
768
|
+
// eslint-disable-next-line camelcase
|
|
769
|
+
async aztec_avm_getContractInstanceInitializationHash(foreignAddress) {
|
|
554
770
|
const address = addressFromSingle(foreignAddress);
|
|
555
|
-
const instance = await this.handlerAsUtility().
|
|
771
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
556
772
|
return toForeignCallResult([
|
|
557
773
|
toSingle(instance.initializationHash),
|
|
558
774
|
// AVM requires an extra boolean indicating the instance was found
|
|
559
775
|
toSingle(new Fr(1))
|
|
560
776
|
]);
|
|
561
777
|
}
|
|
562
|
-
|
|
563
|
-
|
|
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();
|
|
564
791
|
return toForeignCallResult([
|
|
565
792
|
toSingle(sender)
|
|
566
793
|
]);
|
|
567
794
|
}
|
|
568
|
-
|
|
795
|
+
// eslint-disable-next-line camelcase
|
|
796
|
+
async aztec_avm_emitNullifier(foreignNullifier) {
|
|
569
797
|
const nullifier = fromSingle(foreignNullifier);
|
|
570
|
-
await this.handlerAsAvm().
|
|
798
|
+
await this.handlerAsAvm().emitNullifier(nullifier);
|
|
571
799
|
return toForeignCallResult([]);
|
|
572
800
|
}
|
|
573
|
-
|
|
801
|
+
// eslint-disable-next-line camelcase
|
|
802
|
+
async aztec_avm_emitNoteHash(foreignNoteHash) {
|
|
574
803
|
const noteHash = fromSingle(foreignNoteHash);
|
|
575
|
-
await this.handlerAsAvm().
|
|
804
|
+
await this.handlerAsAvm().emitNoteHash(noteHash);
|
|
576
805
|
return toForeignCallResult([]);
|
|
577
806
|
}
|
|
578
|
-
|
|
807
|
+
// eslint-disable-next-line camelcase
|
|
808
|
+
async aztec_avm_nullifierExists(foreignSiloedNullifier) {
|
|
579
809
|
const siloedNullifier = fromSingle(foreignSiloedNullifier);
|
|
580
|
-
const exists = await this.handlerAsAvm().
|
|
810
|
+
const exists = await this.handlerAsAvm().nullifierExists(siloedNullifier);
|
|
581
811
|
return toForeignCallResult([
|
|
582
812
|
toSingle(new Fr(exists))
|
|
583
813
|
]);
|
|
584
814
|
}
|
|
585
|
-
|
|
586
|
-
|
|
815
|
+
// eslint-disable-next-line camelcase
|
|
816
|
+
async aztec_avm_address() {
|
|
817
|
+
const contractAddress = await this.handlerAsAvm().address();
|
|
587
818
|
return toForeignCallResult([
|
|
588
819
|
toSingle(contractAddress.toField())
|
|
589
820
|
]);
|
|
590
821
|
}
|
|
591
|
-
|
|
592
|
-
|
|
822
|
+
// eslint-disable-next-line camelcase
|
|
823
|
+
async aztec_avm_blockNumber() {
|
|
824
|
+
const blockNumber = await this.handlerAsAvm().blockNumber();
|
|
593
825
|
return toForeignCallResult([
|
|
594
826
|
toSingle(new Fr(blockNumber))
|
|
595
827
|
]);
|
|
596
828
|
}
|
|
597
|
-
|
|
598
|
-
|
|
829
|
+
// eslint-disable-next-line camelcase
|
|
830
|
+
async aztec_avm_timestamp() {
|
|
831
|
+
const timestamp = await this.handlerAsAvm().timestamp();
|
|
599
832
|
return toForeignCallResult([
|
|
600
833
|
toSingle(new Fr(timestamp))
|
|
601
834
|
]);
|
|
602
835
|
}
|
|
603
|
-
|
|
604
|
-
|
|
836
|
+
// eslint-disable-next-line camelcase
|
|
837
|
+
async aztec_avm_isStaticCall() {
|
|
838
|
+
const isStaticCall = await this.handlerAsAvm().isStaticCall();
|
|
605
839
|
return toForeignCallResult([
|
|
606
840
|
toSingle(new Fr(isStaticCall ? 1 : 0))
|
|
607
841
|
]);
|
|
608
842
|
}
|
|
609
|
-
|
|
610
|
-
|
|
843
|
+
// eslint-disable-next-line camelcase
|
|
844
|
+
async aztec_avm_chainId() {
|
|
845
|
+
const chainId = await this.handlerAsAvm().chainId();
|
|
611
846
|
return toForeignCallResult([
|
|
612
847
|
toSingle(chainId)
|
|
613
848
|
]);
|
|
614
849
|
}
|
|
615
|
-
|
|
616
|
-
|
|
850
|
+
// eslint-disable-next-line camelcase
|
|
851
|
+
async aztec_avm_version() {
|
|
852
|
+
const version = await this.handlerAsAvm().version();
|
|
617
853
|
return toForeignCallResult([
|
|
618
854
|
toSingle(version)
|
|
619
855
|
]);
|
|
620
856
|
}
|
|
621
|
-
|
|
622
|
-
|
|
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
|
+
]);
|
|
623
863
|
}
|
|
624
|
-
|
|
625
|
-
|
|
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
|
+
]);
|
|
626
872
|
}
|
|
627
|
-
|
|
628
|
-
|
|
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
|
+
]);
|
|
629
884
|
}
|
|
630
|
-
|
|
631
|
-
|
|
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
|
+
]);
|
|
632
896
|
}
|
|
633
|
-
|
|
634
|
-
|
|
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
|
+
]);
|
|
635
903
|
}
|
|
636
|
-
|
|
637
|
-
|
|
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;
|
|
638
908
|
const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
|
|
639
909
|
const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
|
|
640
910
|
const args = fromArray(foreignArgs);
|
|
641
911
|
const argsHash = fromSingle(foreignArgsHash);
|
|
642
912
|
const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
|
|
643
|
-
const
|
|
644
|
-
|
|
645
|
-
|
|
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
|
+
});
|
|
646
941
|
return toForeignCallResult([
|
|
647
942
|
toArray(returnValues)
|
|
648
943
|
]);
|
|
649
944
|
}
|
|
650
|
-
|
|
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) {
|
|
651
948
|
const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
|
|
652
949
|
const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
|
|
653
950
|
const args = fromArray(foreignArgs);
|
|
654
|
-
const
|
|
655
|
-
|
|
656
|
-
|
|
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
|
+
});
|
|
657
960
|
return toForeignCallResult([
|
|
658
961
|
toArray(returnValues)
|
|
659
962
|
]);
|
|
660
963
|
}
|
|
661
|
-
|
|
662
|
-
|
|
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;
|
|
663
968
|
const address = addressFromSingle(foreignAddress);
|
|
664
969
|
const calldata = fromArray(foreignCalldata);
|
|
665
970
|
const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
|
|
666
|
-
const
|
|
667
|
-
|
|
668
|
-
|
|
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
|
+
});
|
|
669
988
|
return toForeignCallResult([
|
|
670
989
|
toArray(returnValues)
|
|
671
990
|
]);
|
|
672
991
|
}
|
|
673
|
-
|
|
674
|
-
|
|
992
|
+
// eslint-disable-next-line camelcase
|
|
993
|
+
async aztec_prv_getSenderForTags() {
|
|
994
|
+
const senderOpt = await this.handlerAsPrivate().getSenderForTags();
|
|
675
995
|
// Return a Noir Option struct with `some` and `value` fields
|
|
676
|
-
if (
|
|
677
|
-
//
|
|
996
|
+
if (senderOpt.isSome()) {
|
|
997
|
+
// Sender found, return Option with some=1 and value=sender address
|
|
678
998
|
return toForeignCallResult([
|
|
679
|
-
toSingle(
|
|
680
|
-
toSingle(
|
|
999
|
+
toSingle(1),
|
|
1000
|
+
toSingle(senderOpt.value)
|
|
681
1001
|
]);
|
|
682
1002
|
} else {
|
|
683
|
-
//
|
|
1003
|
+
// No sender found, return Option with some=0 and value=0
|
|
684
1004
|
return toForeignCallResult([
|
|
685
|
-
toSingle(
|
|
686
|
-
toSingle(
|
|
1005
|
+
toSingle(0),
|
|
1006
|
+
toSingle(0)
|
|
687
1007
|
]);
|
|
688
1008
|
}
|
|
689
1009
|
}
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
await this.handlerAsPrivate().privateSetSenderForTags(senderForTags);
|
|
693
|
-
return toForeignCallResult([]);
|
|
694
|
-
}
|
|
695
|
-
async privateGetNextAppTagAsSender(foreignSender, foreignRecipient) {
|
|
1010
|
+
// eslint-disable-next-line camelcase
|
|
1011
|
+
async aztec_prv_getNextAppTagAsSender(foreignSender, foreignRecipient) {
|
|
696
1012
|
const sender = AztecAddress.fromField(fromSingle(foreignSender));
|
|
697
1013
|
const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
|
|
698
|
-
const nextAppTag = await this.handlerAsPrivate().
|
|
1014
|
+
const nextAppTag = await this.handlerAsPrivate().getNextAppTagAsSender(sender, recipient);
|
|
699
1015
|
return toForeignCallResult([
|
|
700
1016
|
toSingle(nextAppTag.value)
|
|
701
1017
|
]);
|
|
702
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
|
+
}
|
|
703
1027
|
}
|