@aztec/txe 0.0.1-commit.86469d5 → 0.0.1-commit.8655d4a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +148 -75
- 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 +39 -24
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_top_level_context.js +205 -78
- 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 +140 -84
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +587 -239
- 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 +24 -20
- package/dest/state_machine/dummy_p2p_client.d.ts +26 -16
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +44 -20
- 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 +10 -6
- package/dest/state_machine/index.d.ts.map +1 -1
- package/dest/state_machine/index.js +35 -12
- package/dest/state_machine/mock_epoch_cache.d.ts +20 -3
- package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
- package/dest/state_machine/mock_epoch_cache.js +39 -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 +71 -10
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +227 -40
- package/dest/utils/block_creation.d.ts +1 -1
- package/dest/utils/block_creation.d.ts.map +1 -1
- package/dest/utils/block_creation.js +3 -1
- 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 +6 -25
- 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 +166 -80
- 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 +231 -144
- package/src/oracle/txe_private_execution_oracle.ts +30 -0
- package/src/rpc_server.ts +87 -0
- package/src/rpc_translator.ts +662 -316
- package/src/state_machine/archiver.ts +35 -18
- package/src/state_machine/dummy_p2p_client.ts +70 -32
- package/src/state_machine/global_variable_builder.ts +18 -3
- package/src/state_machine/index.ts +48 -13
- package/src/state_machine/mock_epoch_cache.ts +51 -3
- package/src/state_machine/synchronizer.ts +5 -5
- package/src/txe_oracle_version.ts +17 -0
- package/src/txe_session.ts +324 -90
- package/src/utils/block_creation.ts +3 -1
- package/src/{util → utils}/encoding.ts +8 -2
- package/src/{util → utils}/txe_public_contract_data_source.ts +10 -38
- 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_contract_store.d.ts +0 -12
- package/dest/util/txe_contract_store.d.ts.map +0 -1
- package/dest/util/txe_contract_store.js +0 -22
- package/dest/util/txe_public_contract_data_source.d.ts +0 -21
- package/dest/util/txe_public_contract_data_source.d.ts.map +0 -1
- package/src/util/txe_contract_store.ts +0 -36
- /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
|
-
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,403 +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
|
|
324
|
-
return
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
]
|
|
329
|
-
|
|
401
|
+
const result = await this.handlerAsUtility().getPublicKeysAndPartialAddress(address);
|
|
402
|
+
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
403
|
+
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
404
|
+
if (!result.isSome()) {
|
|
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.
|
|
407
|
+
return toForeignCallResult([
|
|
408
|
+
toSingle(new Fr(0)),
|
|
409
|
+
toArray(Array(8).fill(new Fr(0)))
|
|
410
|
+
]);
|
|
411
|
+
} else {
|
|
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;
|
|
417
|
+
return toForeignCallResult([
|
|
418
|
+
toSingle(new Fr(1)),
|
|
419
|
+
toArray([
|
|
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
|
|
428
|
+
])
|
|
429
|
+
]);
|
|
430
|
+
}
|
|
330
431
|
}
|
|
331
|
-
|
|
432
|
+
// eslint-disable-next-line camelcase
|
|
433
|
+
async aztec_utl_getKeyValidationRequest(foreignPkMHash) {
|
|
332
434
|
const pkMHash = fromSingle(foreignPkMHash);
|
|
333
|
-
const keyValidationRequest = await this.handlerAsUtility().
|
|
435
|
+
const keyValidationRequest = await this.handlerAsUtility().getKeyValidationRequest(pkMHash);
|
|
334
436
|
return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
|
|
335
437
|
}
|
|
336
|
-
|
|
337
|
-
|
|
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
|
+
]);
|
|
338
452
|
}
|
|
339
|
-
|
|
340
|
-
|
|
453
|
+
// eslint-disable-next-line camelcase
|
|
454
|
+
async aztec_utl_getNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
|
|
455
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
341
456
|
const nullifier = fromSingle(foreignNullifier);
|
|
342
|
-
const witness = await this.handlerAsUtility().
|
|
343
|
-
if (!witness) {
|
|
344
|
-
throw new Error(`Nullifier membership witness not found at block ${blockHash}.`);
|
|
345
|
-
}
|
|
457
|
+
const witness = await this.handlerAsUtility().getNullifierMembershipWitness(blockHash, nullifier);
|
|
346
458
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
347
459
|
}
|
|
348
|
-
|
|
460
|
+
// eslint-disable-next-line camelcase
|
|
461
|
+
async aztec_utl_getAuthWitness(foreignMessageHash) {
|
|
349
462
|
const messageHash = fromSingle(foreignMessageHash);
|
|
350
|
-
const authWitness = await this.handlerAsUtility().
|
|
351
|
-
if (!authWitness) {
|
|
352
|
-
throw new Error(`Auth witness not found for message hash ${messageHash}.`);
|
|
353
|
-
}
|
|
463
|
+
const authWitness = await this.handlerAsUtility().getAuthWitness(messageHash);
|
|
354
464
|
return toForeignCallResult([
|
|
355
465
|
toArray(authWitness)
|
|
356
466
|
]);
|
|
357
467
|
}
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
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([]);
|
|
363
473
|
}
|
|
364
|
-
|
|
365
|
-
|
|
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([]);
|
|
366
479
|
}
|
|
367
|
-
|
|
480
|
+
// eslint-disable-next-line camelcase
|
|
481
|
+
async aztec_prv_isExecutionInRevertiblePhase(foreignSideEffectCounter) {
|
|
368
482
|
const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
|
|
369
|
-
const isRevertible = await this.handlerAsPrivate().
|
|
483
|
+
const isRevertible = await this.handlerAsPrivate().isExecutionInRevertiblePhase(sideEffectCounter);
|
|
370
484
|
return toForeignCallResult([
|
|
371
485
|
toSingle(new Fr(isRevertible))
|
|
372
486
|
]);
|
|
373
487
|
}
|
|
374
|
-
|
|
375
|
-
|
|
488
|
+
// eslint-disable-next-line camelcase
|
|
489
|
+
aztec_utl_getUtilityContext() {
|
|
490
|
+
const context = this.handlerAsUtility().getUtilityContext();
|
|
376
491
|
return toForeignCallResult(context.toNoirRepresentation());
|
|
377
492
|
}
|
|
378
|
-
|
|
493
|
+
// eslint-disable-next-line camelcase
|
|
494
|
+
async aztec_utl_getBlockHeader(foreignBlockNumber) {
|
|
379
495
|
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
380
|
-
const header = await this.handlerAsUtility().
|
|
381
|
-
if (!header) {
|
|
382
|
-
throw new Error(`Block header not found for block ${blockNumber}.`);
|
|
383
|
-
}
|
|
496
|
+
const header = await this.handlerAsUtility().getBlockHeader(blockNumber);
|
|
384
497
|
return toForeignCallResult(header.toFields().map(toSingle));
|
|
385
498
|
}
|
|
386
|
-
|
|
387
|
-
|
|
499
|
+
// eslint-disable-next-line camelcase
|
|
500
|
+
async aztec_utl_getNoteHashMembershipWitness(foreignAnchorBlockHash, foreignNoteHash) {
|
|
501
|
+
const blockHash = blockHashFromSingle(foreignAnchorBlockHash);
|
|
388
502
|
const noteHash = fromSingle(foreignNoteHash);
|
|
389
|
-
const witness = await this.handlerAsUtility().
|
|
390
|
-
if (!witness) {
|
|
391
|
-
throw new Error(`Note hash ${noteHash} not found in the note hash tree at block ${blockHash.toString()}.`);
|
|
392
|
-
}
|
|
503
|
+
const witness = await this.handlerAsUtility().getNoteHashMembershipWitness(blockHash, noteHash);
|
|
393
504
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
394
505
|
}
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
const
|
|
398
|
-
const
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
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
|
+
]);
|
|
403
516
|
}
|
|
404
|
-
|
|
405
|
-
|
|
517
|
+
// eslint-disable-next-line camelcase
|
|
518
|
+
async aztec_utl_getLowNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
|
|
519
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
406
520
|
const nullifier = fromSingle(foreignNullifier);
|
|
407
|
-
const witness = await this.handlerAsUtility().
|
|
408
|
-
if (!witness) {
|
|
409
|
-
throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockHash}.`);
|
|
410
|
-
}
|
|
521
|
+
const witness = await this.handlerAsUtility().getLowNullifierMembershipWitness(blockHash, nullifier);
|
|
411
522
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
412
523
|
}
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
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
|
+
]);
|
|
417
531
|
}
|
|
418
|
-
|
|
419
|
-
|
|
532
|
+
// eslint-disable-next-line camelcase
|
|
533
|
+
async aztec_utl_validateAndStoreEnqueuedNotesAndEvents(foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot, foreignScope) {
|
|
420
534
|
const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
|
|
421
535
|
const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
|
|
422
|
-
|
|
536
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
537
|
+
await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot, scope);
|
|
423
538
|
return toForeignCallResult([]);
|
|
424
539
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
const
|
|
428
|
-
const
|
|
429
|
-
|
|
430
|
-
|
|
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
|
+
]);
|
|
431
547
|
}
|
|
432
|
-
|
|
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) {
|
|
433
558
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
434
559
|
const slot = fromSingle(foreignSlot);
|
|
435
560
|
const capsule = fromArray(foreignCapsule);
|
|
436
|
-
|
|
561
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
562
|
+
this.handlerAsUtility().setCapsule(contractAddress, slot, capsule, scope);
|
|
437
563
|
return toForeignCallResult([]);
|
|
438
564
|
}
|
|
439
|
-
|
|
565
|
+
// eslint-disable-next-line camelcase
|
|
566
|
+
async aztec_utl_getCapsule(foreignContractAddress, foreignSlot, foreignTSize, foreignScope) {
|
|
440
567
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
441
568
|
const slot = fromSingle(foreignSlot);
|
|
442
569
|
const tSize = fromSingle(foreignTSize).toNumber();
|
|
443
|
-
const
|
|
570
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
571
|
+
const opt = await this.handlerAsUtility().getCapsule(contractAddress, slot, tSize, scope);
|
|
444
572
|
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
445
573
|
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
446
|
-
if (
|
|
447
|
-
//
|
|
574
|
+
if (opt.isSome()) {
|
|
575
|
+
// Data was found so we set `some` to 1 and return it along with `value`.
|
|
448
576
|
return toForeignCallResult([
|
|
449
|
-
toSingle(new Fr(
|
|
450
|
-
toArray(Array(
|
|
577
|
+
toSingle(new Fr(1)),
|
|
578
|
+
toArray(Array.from(opt.value))
|
|
451
579
|
]);
|
|
452
580
|
} else {
|
|
453
|
-
//
|
|
581
|
+
// No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
|
|
454
582
|
return toForeignCallResult([
|
|
455
|
-
toSingle(new Fr(
|
|
456
|
-
toArray(
|
|
583
|
+
toSingle(new Fr(0)),
|
|
584
|
+
toArray(Array(tSize).fill(new Fr(0)))
|
|
457
585
|
]);
|
|
458
586
|
}
|
|
459
587
|
}
|
|
460
|
-
|
|
588
|
+
// eslint-disable-next-line camelcase
|
|
589
|
+
aztec_utl_deleteCapsule(foreignContractAddress, foreignSlot, foreignScope) {
|
|
461
590
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
462
591
|
const slot = fromSingle(foreignSlot);
|
|
463
|
-
|
|
592
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
593
|
+
this.handlerAsUtility().deleteCapsule(contractAddress, slot, scope);
|
|
464
594
|
return toForeignCallResult([]);
|
|
465
595
|
}
|
|
466
|
-
|
|
596
|
+
// eslint-disable-next-line camelcase
|
|
597
|
+
async aztec_utl_copyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries, foreignScope) {
|
|
467
598
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
468
599
|
const srcSlot = fromSingle(foreignSrcSlot);
|
|
469
600
|
const dstSlot = fromSingle(foreignDstSlot);
|
|
470
601
|
const numEntries = fromSingle(foreignNumEntries).toNumber();
|
|
471
|
-
|
|
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);
|
|
472
659
|
return toForeignCallResult([]);
|
|
473
660
|
}
|
|
474
661
|
// TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
|
|
475
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
|
|
476
663
|
// to implement this function here. Isn't there a way to programmatically identify that this is missing, given the
|
|
477
664
|
// existence of a txe_oracle method?
|
|
478
|
-
|
|
479
|
-
|
|
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
|
+
});
|
|
480
675
|
const iv = fromUintArray(foreignIv, 8);
|
|
481
676
|
const symKey = fromUintArray(foreignSymKey, 8);
|
|
482
|
-
|
|
483
|
-
|
|
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
|
+
}
|
|
484
694
|
}
|
|
485
|
-
|
|
695
|
+
// eslint-disable-next-line camelcase
|
|
696
|
+
async aztec_utl_getSharedSecrets(foreignAddress, foreignEphPksSlot, foreignContractAddress) {
|
|
486
697
|
const address = AztecAddress.fromField(fromSingle(foreignAddress));
|
|
487
|
-
const
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
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)
|
|
491
703
|
]);
|
|
492
|
-
const secret = await this.handlerAsUtility().utilityGetSharedSecret(address, ephPK);
|
|
493
|
-
return toForeignCallResult(secret.toFields().map(toSingle));
|
|
494
704
|
}
|
|
495
|
-
|
|
496
|
-
|
|
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([]));
|
|
497
725
|
}
|
|
498
726
|
// AVM opcodes
|
|
499
|
-
|
|
727
|
+
// eslint-disable-next-line camelcase
|
|
728
|
+
aztec_avm_emitPublicLog(_foreignMessage) {
|
|
500
729
|
// TODO(#8811): Implement
|
|
501
730
|
return toForeignCallResult([]);
|
|
502
731
|
}
|
|
503
|
-
|
|
732
|
+
// eslint-disable-next-line camelcase
|
|
733
|
+
async aztec_avm_storageRead(foreignSlot, foreignContractAddress) {
|
|
504
734
|
const slot = fromSingle(foreignSlot);
|
|
505
735
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
506
|
-
const value = (await this.handlerAsAvm().
|
|
736
|
+
const value = (await this.handlerAsAvm().storageRead(slot, contractAddress)).value;
|
|
507
737
|
return toForeignCallResult([
|
|
508
738
|
toSingle(new Fr(value))
|
|
509
739
|
]);
|
|
510
740
|
}
|
|
511
|
-
|
|
741
|
+
// eslint-disable-next-line camelcase
|
|
742
|
+
async aztec_avm_storageWrite(foreignSlot, foreignValue) {
|
|
512
743
|
const slot = fromSingle(foreignSlot);
|
|
513
744
|
const value = fromSingle(foreignValue);
|
|
514
|
-
await this.handlerAsAvm().
|
|
745
|
+
await this.handlerAsAvm().storageWrite(slot, value);
|
|
515
746
|
return toForeignCallResult([]);
|
|
516
747
|
}
|
|
517
|
-
|
|
748
|
+
// eslint-disable-next-line camelcase
|
|
749
|
+
async aztec_avm_getContractInstanceDeployer(foreignAddress) {
|
|
518
750
|
const address = addressFromSingle(foreignAddress);
|
|
519
|
-
const instance = await this.handlerAsUtility().
|
|
751
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
520
752
|
return toForeignCallResult([
|
|
521
753
|
toSingle(instance.deployer),
|
|
522
754
|
// AVM requires an extra boolean indicating the instance was found
|
|
523
755
|
toSingle(new Fr(1))
|
|
524
756
|
]);
|
|
525
757
|
}
|
|
526
|
-
|
|
758
|
+
// eslint-disable-next-line camelcase
|
|
759
|
+
async aztec_avm_getContractInstanceClassId(foreignAddress) {
|
|
527
760
|
const address = addressFromSingle(foreignAddress);
|
|
528
|
-
const instance = await this.handlerAsUtility().
|
|
761
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
529
762
|
return toForeignCallResult([
|
|
530
763
|
toSingle(instance.currentContractClassId),
|
|
531
764
|
// AVM requires an extra boolean indicating the instance was found
|
|
532
765
|
toSingle(new Fr(1))
|
|
533
766
|
]);
|
|
534
767
|
}
|
|
535
|
-
|
|
768
|
+
// eslint-disable-next-line camelcase
|
|
769
|
+
async aztec_avm_getContractInstanceInitializationHash(foreignAddress) {
|
|
536
770
|
const address = addressFromSingle(foreignAddress);
|
|
537
|
-
const instance = await this.handlerAsUtility().
|
|
771
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
538
772
|
return toForeignCallResult([
|
|
539
773
|
toSingle(instance.initializationHash),
|
|
540
774
|
// AVM requires an extra boolean indicating the instance was found
|
|
541
775
|
toSingle(new Fr(1))
|
|
542
776
|
]);
|
|
543
777
|
}
|
|
544
|
-
|
|
545
|
-
|
|
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();
|
|
546
791
|
return toForeignCallResult([
|
|
547
792
|
toSingle(sender)
|
|
548
793
|
]);
|
|
549
794
|
}
|
|
550
|
-
|
|
795
|
+
// eslint-disable-next-line camelcase
|
|
796
|
+
async aztec_avm_emitNullifier(foreignNullifier) {
|
|
551
797
|
const nullifier = fromSingle(foreignNullifier);
|
|
552
|
-
await this.handlerAsAvm().
|
|
798
|
+
await this.handlerAsAvm().emitNullifier(nullifier);
|
|
553
799
|
return toForeignCallResult([]);
|
|
554
800
|
}
|
|
555
|
-
|
|
801
|
+
// eslint-disable-next-line camelcase
|
|
802
|
+
async aztec_avm_emitNoteHash(foreignNoteHash) {
|
|
556
803
|
const noteHash = fromSingle(foreignNoteHash);
|
|
557
|
-
await this.handlerAsAvm().
|
|
804
|
+
await this.handlerAsAvm().emitNoteHash(noteHash);
|
|
558
805
|
return toForeignCallResult([]);
|
|
559
806
|
}
|
|
560
|
-
|
|
807
|
+
// eslint-disable-next-line camelcase
|
|
808
|
+
async aztec_avm_nullifierExists(foreignSiloedNullifier) {
|
|
561
809
|
const siloedNullifier = fromSingle(foreignSiloedNullifier);
|
|
562
|
-
const exists = await this.handlerAsAvm().
|
|
810
|
+
const exists = await this.handlerAsAvm().nullifierExists(siloedNullifier);
|
|
563
811
|
return toForeignCallResult([
|
|
564
812
|
toSingle(new Fr(exists))
|
|
565
813
|
]);
|
|
566
814
|
}
|
|
567
|
-
|
|
568
|
-
|
|
815
|
+
// eslint-disable-next-line camelcase
|
|
816
|
+
async aztec_avm_address() {
|
|
817
|
+
const contractAddress = await this.handlerAsAvm().address();
|
|
569
818
|
return toForeignCallResult([
|
|
570
819
|
toSingle(contractAddress.toField())
|
|
571
820
|
]);
|
|
572
821
|
}
|
|
573
|
-
|
|
574
|
-
|
|
822
|
+
// eslint-disable-next-line camelcase
|
|
823
|
+
async aztec_avm_blockNumber() {
|
|
824
|
+
const blockNumber = await this.handlerAsAvm().blockNumber();
|
|
575
825
|
return toForeignCallResult([
|
|
576
826
|
toSingle(new Fr(blockNumber))
|
|
577
827
|
]);
|
|
578
828
|
}
|
|
579
|
-
|
|
580
|
-
|
|
829
|
+
// eslint-disable-next-line camelcase
|
|
830
|
+
async aztec_avm_timestamp() {
|
|
831
|
+
const timestamp = await this.handlerAsAvm().timestamp();
|
|
581
832
|
return toForeignCallResult([
|
|
582
833
|
toSingle(new Fr(timestamp))
|
|
583
834
|
]);
|
|
584
835
|
}
|
|
585
|
-
|
|
586
|
-
|
|
836
|
+
// eslint-disable-next-line camelcase
|
|
837
|
+
async aztec_avm_isStaticCall() {
|
|
838
|
+
const isStaticCall = await this.handlerAsAvm().isStaticCall();
|
|
587
839
|
return toForeignCallResult([
|
|
588
840
|
toSingle(new Fr(isStaticCall ? 1 : 0))
|
|
589
841
|
]);
|
|
590
842
|
}
|
|
591
|
-
|
|
592
|
-
|
|
843
|
+
// eslint-disable-next-line camelcase
|
|
844
|
+
async aztec_avm_chainId() {
|
|
845
|
+
const chainId = await this.handlerAsAvm().chainId();
|
|
593
846
|
return toForeignCallResult([
|
|
594
847
|
toSingle(chainId)
|
|
595
848
|
]);
|
|
596
849
|
}
|
|
597
|
-
|
|
598
|
-
|
|
850
|
+
// eslint-disable-next-line camelcase
|
|
851
|
+
async aztec_avm_version() {
|
|
852
|
+
const version = await this.handlerAsAvm().version();
|
|
599
853
|
return toForeignCallResult([
|
|
600
854
|
toSingle(version)
|
|
601
855
|
]);
|
|
602
856
|
}
|
|
603
|
-
|
|
604
|
-
|
|
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
|
+
]);
|
|
605
863
|
}
|
|
606
|
-
|
|
607
|
-
|
|
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
|
+
]);
|
|
608
872
|
}
|
|
609
|
-
|
|
610
|
-
|
|
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
|
+
]);
|
|
611
884
|
}
|
|
612
|
-
|
|
613
|
-
|
|
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
|
+
]);
|
|
614
896
|
}
|
|
615
|
-
|
|
616
|
-
|
|
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
|
+
]);
|
|
617
903
|
}
|
|
618
|
-
|
|
619
|
-
|
|
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;
|
|
620
908
|
const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
|
|
621
909
|
const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
|
|
622
910
|
const args = fromArray(foreignArgs);
|
|
623
911
|
const argsHash = fromSingle(foreignArgsHash);
|
|
624
912
|
const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
|
|
625
|
-
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
|
+
});
|
|
626
941
|
return toForeignCallResult([
|
|
627
942
|
toArray(returnValues)
|
|
628
943
|
]);
|
|
629
944
|
}
|
|
630
|
-
|
|
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) {
|
|
631
948
|
const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
|
|
632
949
|
const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
|
|
633
950
|
const args = fromArray(foreignArgs);
|
|
634
|
-
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
|
+
});
|
|
635
960
|
return toForeignCallResult([
|
|
636
961
|
toArray(returnValues)
|
|
637
962
|
]);
|
|
638
963
|
}
|
|
639
|
-
|
|
640
|
-
|
|
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;
|
|
641
968
|
const address = addressFromSingle(foreignAddress);
|
|
642
969
|
const calldata = fromArray(foreignCalldata);
|
|
643
970
|
const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
|
|
644
|
-
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
|
+
});
|
|
645
988
|
return toForeignCallResult([
|
|
646
989
|
toArray(returnValues)
|
|
647
990
|
]);
|
|
648
991
|
}
|
|
649
|
-
|
|
650
|
-
|
|
992
|
+
// eslint-disable-next-line camelcase
|
|
993
|
+
async aztec_prv_getSenderForTags() {
|
|
994
|
+
const senderOpt = await this.handlerAsPrivate().getSenderForTags();
|
|
651
995
|
// Return a Noir Option struct with `some` and `value` fields
|
|
652
|
-
if (
|
|
653
|
-
//
|
|
996
|
+
if (senderOpt.isSome()) {
|
|
997
|
+
// Sender found, return Option with some=1 and value=sender address
|
|
654
998
|
return toForeignCallResult([
|
|
655
|
-
toSingle(
|
|
656
|
-
toSingle(
|
|
999
|
+
toSingle(1),
|
|
1000
|
+
toSingle(senderOpt.value)
|
|
657
1001
|
]);
|
|
658
1002
|
} else {
|
|
659
|
-
//
|
|
1003
|
+
// No sender found, return Option with some=0 and value=0
|
|
660
1004
|
return toForeignCallResult([
|
|
661
|
-
toSingle(
|
|
662
|
-
toSingle(
|
|
1005
|
+
toSingle(0),
|
|
1006
|
+
toSingle(0)
|
|
663
1007
|
]);
|
|
664
1008
|
}
|
|
665
1009
|
}
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
await this.handlerAsPrivate().privateSetSenderForTags(senderForTags);
|
|
669
|
-
return toForeignCallResult([]);
|
|
670
|
-
}
|
|
671
|
-
async privateGetNextAppTagAsSender(foreignSender, foreignRecipient) {
|
|
1010
|
+
// eslint-disable-next-line camelcase
|
|
1011
|
+
async aztec_prv_getNextAppTagAsSender(foreignSender, foreignRecipient) {
|
|
672
1012
|
const sender = AztecAddress.fromField(fromSingle(foreignSender));
|
|
673
1013
|
const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
|
|
674
|
-
const nextAppTag = await this.handlerAsPrivate().
|
|
1014
|
+
const nextAppTag = await this.handlerAsPrivate().getNextAppTagAsSender(sender, recipient);
|
|
675
1015
|
return toForeignCallResult([
|
|
676
1016
|
toSingle(nextAppTag.value)
|
|
677
1017
|
]);
|
|
678
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
|
+
}
|
|
679
1027
|
}
|