@aztec/txe 0.0.1-commit.42ee6df9b → 0.0.1-commit.431c48d
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/AuthRegistry-56AMRLSQ.js +3 -0
- package/dest/AuthRegistry-56AMRLSQ.js.map +7 -0
- package/dest/ContractClassRegistry-CRN27URB.js +3 -0
- package/dest/ContractClassRegistry-CRN27URB.js.map +7 -0
- package/dest/ContractInstanceRegistry-GRGL26IC.js +3 -0
- package/dest/ContractInstanceRegistry-GRGL26IC.js.map +7 -0
- package/dest/FeeJuice-J23RVHLW.js +3 -0
- package/dest/FeeJuice-J23RVHLW.js.map +7 -0
- package/dest/HandshakeRegistry-5.0.1-PEFCLEGP.js +3 -0
- package/dest/HandshakeRegistry-5.0.1-PEFCLEGP.js.map +7 -0
- package/dest/HandshakeRegistry-GNFACTEE.js +3 -0
- package/dest/HandshakeRegistry-GNFACTEE.js.map +7 -0
- package/dest/MultiCallEntrypoint-MIDICLQB.js +3 -0
- package/dest/MultiCallEntrypoint-MIDICLQB.js.map +7 -0
- package/dest/SchnorrAccount-ZRENHSMV.js +3 -0
- package/dest/SchnorrAccount-ZRENHSMV.js.map +7 -0
- package/dest/SchnorrInitializerlessAccount-L56LOFSV.js +3 -0
- package/dest/SchnorrInitializerlessAccount-L56LOFSV.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 +53 -0
- package/dest/bin/index.js +3 -30
- package/dest/bin/index.js.map +7 -0
- package/dest/bin/oracle_test_server.d.ts +3 -0
- package/dest/bin/oracle_test_server.d.ts.map +1 -0
- package/dest/bin/oracle_test_server.js +41 -0
- package/dest/chunk-BJVAAXNA.js +3 -0
- package/dest/chunk-BJVAAXNA.js.map +7 -0
- package/dest/chunk-LVLJKGGH.js +266 -0
- package/dest/chunk-LVLJKGGH.js.map +7 -0
- package/dest/chunk-OVMCQ5A6.js +304 -0
- package/dest/chunk-OVMCQ5A6.js.map +7 -0
- package/dest/constants.d.ts +5 -1
- package/dest/constants.d.ts.map +1 -1
- package/dest/constants.js +9 -1
- package/dest/dispatcher_pool.d.ts +67 -0
- package/dest/dispatcher_pool.d.ts.map +1 -0
- package/dest/dispatcher_pool.js +286 -0
- package/dest/index.d.ts +51 -7
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +72 -190
- package/dest/metafile.json +40494 -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 +47 -9
- package/dest/oracle/interfaces.d.ts.map +1 -1
- package/dest/oracle/tagging_secret_strategy.d.ts +12 -0
- package/dest/oracle/tagging_secret_strategy.d.ts.map +1 -0
- package/dest/oracle/tagging_secret_strategy.js +12 -0
- package/dest/oracle/test-resolver/default_fixtures.d.ts +16 -0
- package/dest/oracle/test-resolver/default_fixtures.d.ts.map +1 -0
- package/dest/oracle/test-resolver/default_fixtures.js +200 -0
- package/dest/oracle/test-resolver/index.d.ts +9 -0
- package/dest/oracle/test-resolver/index.d.ts.map +1 -0
- package/dest/oracle/test-resolver/index.js +32 -0
- package/dest/oracle/test-resolver/resolver.d.ts +48 -0
- package/dest/oracle/test-resolver/resolver.d.ts.map +1 -0
- package/dest/oracle/test-resolver/resolver.js +181 -0
- package/dest/oracle/txe_oracle_public_context.d.ts +26 -2
- package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.js +49 -1
- package/dest/oracle/txe_oracle_registry.d.ts +172 -0
- package/dest/oracle/txe_oracle_registry.d.ts.map +1 -0
- package/dest/oracle/txe_oracle_registry.js +767 -0
- package/dest/oracle/txe_oracle_top_level_context.d.ts +58 -18
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_top_level_context.js +286 -97
- package/dest/oracle/txe_oracle_version.d.ts +17 -0
- package/dest/oracle/txe_oracle_version.d.ts.map +1 -0
- package/dest/oracle/txe_oracle_version.js +14 -0
- 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 +115 -233
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +791 -647
- package/dest/server.bundle.js +3 -0
- package/dest/server.bundle.js.map +7 -0
- package/dest/state_machine/archiver.d.ts +4 -3
- package/dest/state_machine/archiver.d.ts.map +1 -1
- package/dest/state_machine/archiver.js +25 -16
- package/dest/state_machine/dummy_p2p_client.d.ts +16 -7
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +26 -2
- package/dest/state_machine/global_variable_builder.d.ts +10 -6
- package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
- package/dest/state_machine/global_variable_builder.js +8 -5
- package/dest/state_machine/index.d.ts +11 -7
- package/dest/state_machine/index.d.ts.map +1 -1
- package/dest/state_machine/index.js +52 -14
- package/dest/state_machine/mock_epoch_cache.d.ts +1 -2
- package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
- package/dest/state_machine/mock_epoch_cache.js +0 -3
- package/dest/state_machine/synchronizer.d.ts +5 -2
- package/dest/state_machine/synchronizer.d.ts.map +1 -1
- package/dest/state_machine/synchronizer.js +7 -3
- package/dest/txe_session.d.ts +90 -20
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +313 -67
- package/dest/utils/block_creation.d.ts +2 -2
- package/dest/utils/block_creation.d.ts.map +1 -1
- package/dest/utils/block_creation.js +2 -2
- package/dest/utils/encoding.d.ts +192 -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/utils/tx_effect_creation.d.ts +1 -1
- package/dest/utils/tx_effect_creation.d.ts.map +1 -1
- package/dest/utils/tx_effect_creation.js +0 -1
- 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_artifact_resolver.d.ts +37 -0
- package/dest/utils/txe_artifact_resolver.d.ts.map +1 -0
- package/dest/utils/txe_artifact_resolver.js +161 -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 +7 -4
- 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 +38 -21
- package/src/bin/check_txe_oracle_version.ts +67 -0
- package/src/bin/index.ts +11 -2
- package/src/bin/oracle_test_server.ts +51 -0
- package/src/constants.ts +11 -1
- package/src/dispatcher_pool.ts +317 -0
- package/src/index.ts +99 -227
- package/src/msgpackr_fr_extension.ts +23 -0
- package/src/oracle/interfaces.ts +47 -8
- package/src/oracle/tagging_secret_strategy.ts +25 -0
- package/src/oracle/test-resolver/default_fixtures.ts +271 -0
- package/src/oracle/test-resolver/index.ts +44 -0
- package/src/oracle/test-resolver/resolver.ts +245 -0
- package/src/oracle/txe_oracle_public_context.ts +62 -0
- package/src/oracle/txe_oracle_registry.ts +556 -0
- package/src/oracle/txe_oracle_top_level_context.ts +357 -118
- package/src/oracle/txe_oracle_version.ts +17 -0
- package/src/oracle/txe_private_execution_oracle.ts +30 -0
- package/src/rpc_server.ts +87 -0
- package/src/rpc_translator.ts +890 -938
- package/src/state_machine/archiver.ts +37 -17
- package/src/state_machine/dummy_p2p_client.ts +43 -10
- package/src/state_machine/global_variable_builder.ts +12 -17
- package/src/state_machine/index.ts +63 -32
- package/src/state_machine/mock_epoch_cache.ts +0 -4
- package/src/state_machine/synchronizer.ts +9 -3
- package/src/txe_session.ts +545 -80
- package/src/utils/block_creation.ts +2 -1
- package/src/{util → utils}/encoding.ts +8 -2
- package/src/utils/tx_effect_creation.ts +0 -2
- package/src/utils/txe_artifact_resolver.ts +217 -0
- package/src/{util → utils}/txe_public_contract_data_source.ts +6 -4
- package/src/worker.ts +98 -0
- package/dest/util/encoding.d.ts +0 -788
- 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
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
/* eslint-disable camelcase */
|
|
2
|
+
import {
|
|
3
|
+
GAS_SETTINGS_LENGTH,
|
|
4
|
+
MAX_NOTE_HASHES_PER_TX,
|
|
5
|
+
MAX_NULLIFIERS_PER_TX,
|
|
6
|
+
MAX_PRIVATE_LOGS_PER_TX,
|
|
7
|
+
PRIVATE_CONTEXT_INPUTS_LENGTH,
|
|
8
|
+
PRIVATE_LOG_SIZE_IN_FIELDS,
|
|
9
|
+
} from '@aztec/constants';
|
|
10
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
11
|
+
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
12
|
+
import { withHexPrefix, withoutHexPrefix } from '@aztec/foundation/string';
|
|
13
|
+
import type { TaggingSecretStrategy } from '@aztec/pxe/server';
|
|
14
|
+
import {
|
|
15
|
+
ARRAY,
|
|
16
|
+
AZTEC_ADDRESS,
|
|
17
|
+
BLOCK_NUMBER,
|
|
18
|
+
BOOL,
|
|
19
|
+
ETH_ADDRESS,
|
|
20
|
+
FIELD,
|
|
21
|
+
FIXED_ARRAY,
|
|
22
|
+
FUNCTION_SELECTOR,
|
|
23
|
+
type InputSlot,
|
|
24
|
+
LEAF,
|
|
25
|
+
type MaybePromise,
|
|
26
|
+
OPTION,
|
|
27
|
+
ORACLE_REGISTRY,
|
|
28
|
+
type OracleRegistryEntry,
|
|
29
|
+
type OutputSlot,
|
|
30
|
+
type ParamTypes,
|
|
31
|
+
SCALAR,
|
|
32
|
+
STR,
|
|
33
|
+
STRUCT,
|
|
34
|
+
type SlotShape,
|
|
35
|
+
type TypeMapping,
|
|
36
|
+
U32,
|
|
37
|
+
U64,
|
|
38
|
+
buildACIRCallback,
|
|
39
|
+
makeEntry,
|
|
40
|
+
} from '@aztec/pxe/simulator';
|
|
41
|
+
import { EventSelector } from '@aztec/stdlib/abi';
|
|
42
|
+
import { CompleteAddress } from '@aztec/stdlib/contract';
|
|
43
|
+
import { GasSettings } from '@aztec/stdlib/gas';
|
|
44
|
+
import { PrivateContextInputs } from '@aztec/stdlib/kernel';
|
|
45
|
+
import type { PrivateLog } from '@aztec/stdlib/logs';
|
|
46
|
+
import type { TxHash } from '@aztec/stdlib/tx';
|
|
47
|
+
|
|
48
|
+
import {
|
|
49
|
+
MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY,
|
|
50
|
+
MAX_OFFCHAIN_EFFECT_LEN,
|
|
51
|
+
MAX_PRIVATE_EVENTS_PER_TXE_QUERY,
|
|
52
|
+
MAX_PRIVATE_EVENT_LEN,
|
|
53
|
+
} from '../constants.js';
|
|
54
|
+
import type { ForeignCallArgs, ForeignCallResult } from '../utils/encoding.js';
|
|
55
|
+
|
|
56
|
+
// Spreading `ORACLE_REGISTRY` re-materializes its entries into `TXE_ORACLE_REGISTRY`'s inferred type, which names the
|
|
57
|
+
// protocol types below. Re-exporting them gives tsc a portable path to each instead of falling back to a deep
|
|
58
|
+
// node_modules path that breaks .d.ts portability (TS2742).
|
|
59
|
+
export type { ContractClassLogData, EmbeddedCurvePoint, TxEffectData } from '@aztec/pxe/simulator';
|
|
60
|
+
export type { BlockHash } from '@aztec/stdlib/block';
|
|
61
|
+
export type { MembershipWitness } from '@aztec/foundation/trees';
|
|
62
|
+
export type { NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
|
|
63
|
+
|
|
64
|
+
const GAS_SETTINGS: TypeMapping<GasSettings> = LEAF({
|
|
65
|
+
kind: 'gas-settings',
|
|
66
|
+
deserialization: {
|
|
67
|
+
fn: ([reader]) => GasSettings.fromFields(reader.readFieldArray(GAS_SETTINGS_LENGTH)),
|
|
68
|
+
},
|
|
69
|
+
shape: [{ len: GAS_SETTINGS_LENGTH }],
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Tagging secret strategy discriminants. Must match the Noir test helper `TaggingSecretStrategy` in
|
|
73
|
+
// aztec-nr `test/helpers/tagging_secret_strategy.nr`. This is a test-only oracle (only `set_tagging_secret_strategies`
|
|
74
|
+
// reads it), so the mapping lives here on the TXE side rather than in the production oracle type mappings.
|
|
75
|
+
const STRATEGY_NON_INTERACTIVE_HANDSHAKE = 1;
|
|
76
|
+
const STRATEGY_ARBITRARY_SECRET = 2;
|
|
77
|
+
const STRATEGY_ADDRESS_DERIVED = 3;
|
|
78
|
+
const STRATEGY_INTERACTIVE_HANDSHAKE = 4;
|
|
79
|
+
|
|
80
|
+
const TAGGING_SECRET_STRATEGY: TypeMapping<TaggingSecretStrategy> = LEAF({
|
|
81
|
+
kind: 'tagging-secret-strategy',
|
|
82
|
+
serialization: {
|
|
83
|
+
fn: strategy => {
|
|
84
|
+
switch (strategy.type) {
|
|
85
|
+
case 'non-interactive-handshake':
|
|
86
|
+
return [new Fr(STRATEGY_NON_INTERACTIVE_HANDSHAKE), Fr.ZERO, Fr.ZERO];
|
|
87
|
+
case 'interactive-handshake':
|
|
88
|
+
return [new Fr(STRATEGY_INTERACTIVE_HANDSHAKE), Fr.ZERO, Fr.ZERO];
|
|
89
|
+
case 'address-derived':
|
|
90
|
+
return [new Fr(STRATEGY_ADDRESS_DERIVED), Fr.ZERO, Fr.ZERO];
|
|
91
|
+
case 'arbitrary-secret':
|
|
92
|
+
return [new Fr(STRATEGY_ARBITRARY_SECRET), strategy.secret.x, strategy.secret.y];
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
deserialization: {
|
|
97
|
+
fn: ([kindReader, xReader, yReader]) => {
|
|
98
|
+
const kind = kindReader.readField().toNumber();
|
|
99
|
+
const [x, y] = [xReader.readField(), yReader.readField()];
|
|
100
|
+
switch (kind) {
|
|
101
|
+
case STRATEGY_NON_INTERACTIVE_HANDSHAKE:
|
|
102
|
+
return { type: 'non-interactive-handshake' };
|
|
103
|
+
case STRATEGY_INTERACTIVE_HANDSHAKE:
|
|
104
|
+
return { type: 'interactive-handshake' };
|
|
105
|
+
case STRATEGY_ADDRESS_DERIVED:
|
|
106
|
+
return { type: 'address-derived' };
|
|
107
|
+
case STRATEGY_ARBITRARY_SECRET:
|
|
108
|
+
return { type: 'arbitrary-secret', secret: Point.fromFields([x, y]) };
|
|
109
|
+
default:
|
|
110
|
+
throw new Error(`Unrecognized tagging secret strategy kind: ${kind}`);
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
shape: ['scalar', 'scalar', 'scalar'],
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const PRIVATE_CONTEXT_INPUTS: TypeMapping<PrivateContextInputs> = LEAF({
|
|
118
|
+
kind: 'private-context-inputs',
|
|
119
|
+
serialization: { fn: v => v.toFields() },
|
|
120
|
+
shape: Array<SlotShape>(PRIVATE_CONTEXT_INPUTS_LENGTH).fill('scalar'),
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const COMPLETE_ADDRESS: TypeMapping<CompleteAddress> = LEAF({
|
|
124
|
+
kind: 'complete-address',
|
|
125
|
+
serialization: { fn: v => [v.address.toField(), ...v.publicKeys.toFields()] },
|
|
126
|
+
shape: Array<SlotShape>(8).fill('scalar'), // address + 7 public-key fields
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
const TXE_TX_EFFECTS: TypeMapping<{
|
|
130
|
+
txHash: TxHash;
|
|
131
|
+
noteHashes: Fr[];
|
|
132
|
+
nullifiers: Fr[];
|
|
133
|
+
privateLogs: PrivateLog[];
|
|
134
|
+
}> = LEAF({
|
|
135
|
+
kind: 'txe-tx-effects',
|
|
136
|
+
serialization: {
|
|
137
|
+
fn: ({ txHash, noteHashes, nullifiers, privateLogs }) => {
|
|
138
|
+
const emittedLogs = privateLogs.map(log => log.getEmittedFields());
|
|
139
|
+
const rawLogStorage = emittedLogs
|
|
140
|
+
.map(fields => fields.concat(Array(PRIVATE_LOG_SIZE_IN_FIELDS - fields.length).fill(Fr.ZERO)))
|
|
141
|
+
.concat(
|
|
142
|
+
Array(MAX_PRIVATE_LOGS_PER_TX - emittedLogs.length).fill(Array(PRIVATE_LOG_SIZE_IN_FIELDS).fill(Fr.ZERO)),
|
|
143
|
+
)
|
|
144
|
+
.flat();
|
|
145
|
+
const logLengths = emittedLogs
|
|
146
|
+
.map(fields => new Fr(fields.length))
|
|
147
|
+
.concat(Array(MAX_PRIVATE_LOGS_PER_TX - emittedLogs.length).fill(Fr.ZERO));
|
|
148
|
+
const paddedNoteHashes = noteHashes.concat(Array(MAX_NOTE_HASHES_PER_TX - noteHashes.length).fill(Fr.ZERO));
|
|
149
|
+
const paddedNullifiers = nullifiers.concat(Array(MAX_NULLIFIERS_PER_TX - nullifiers.length).fill(Fr.ZERO));
|
|
150
|
+
|
|
151
|
+
return [
|
|
152
|
+
txHash.hash,
|
|
153
|
+
paddedNoteHashes,
|
|
154
|
+
new Fr(noteHashes.length),
|
|
155
|
+
paddedNullifiers,
|
|
156
|
+
new Fr(nullifiers.length),
|
|
157
|
+
rawLogStorage,
|
|
158
|
+
logLengths,
|
|
159
|
+
new Fr(emittedLogs.length),
|
|
160
|
+
] as (Fr | Fr[])[];
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
// txHash, padded note hashes + count, padded nullifiers + count, flattened private-log storage + lengths + count.
|
|
164
|
+
shape: [
|
|
165
|
+
'scalar',
|
|
166
|
+
{ len: MAX_NOTE_HASHES_PER_TX },
|
|
167
|
+
'scalar',
|
|
168
|
+
{ len: MAX_NULLIFIERS_PER_TX },
|
|
169
|
+
'scalar',
|
|
170
|
+
{ len: MAX_PRIVATE_LOGS_PER_TX * PRIVATE_LOG_SIZE_IN_FIELDS },
|
|
171
|
+
{ len: MAX_PRIVATE_LOGS_PER_TX },
|
|
172
|
+
'scalar',
|
|
173
|
+
],
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
const TXE_OFFCHAIN_EFFECTS: TypeMapping<{ effects: Fr[][] }> = LEAF({
|
|
177
|
+
kind: 'txe-offchain-effects',
|
|
178
|
+
serialization: {
|
|
179
|
+
fn: ({ effects }) => {
|
|
180
|
+
const rawArrayStorage = effects
|
|
181
|
+
.map(e => e.concat(Array(MAX_OFFCHAIN_EFFECT_LEN - e.length).fill(Fr.ZERO)))
|
|
182
|
+
.concat(
|
|
183
|
+
Array(MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY - effects.length).fill(Array(MAX_OFFCHAIN_EFFECT_LEN).fill(Fr.ZERO)),
|
|
184
|
+
)
|
|
185
|
+
.flat();
|
|
186
|
+
const effectLengths = effects
|
|
187
|
+
.map(e => new Fr(e.length))
|
|
188
|
+
.concat(Array(MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY - effects.length).fill(Fr.ZERO));
|
|
189
|
+
|
|
190
|
+
return [rawArrayStorage, effectLengths, new Fr(effects.length)] as (Fr | Fr[])[];
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
// Flattened effect storage, per-effect lengths, then the effect count.
|
|
194
|
+
shape: [
|
|
195
|
+
{ len: MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY * MAX_OFFCHAIN_EFFECT_LEN },
|
|
196
|
+
{ len: MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY },
|
|
197
|
+
'scalar',
|
|
198
|
+
],
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
const TXE_CALL_CONTEXT: TypeMapping<{ txHash: Fr; anchorBlockTimestamp: bigint }> = LEAF({
|
|
202
|
+
kind: 'txe-call-context',
|
|
203
|
+
serialization: {
|
|
204
|
+
fn: ({ txHash, anchorBlockTimestamp }) => {
|
|
205
|
+
const isSome = txHash.isZero() ? 0 : 1;
|
|
206
|
+
return [new Fr(isSome), txHash, new Fr(anchorBlockTimestamp)];
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
shape: ['scalar', 'scalar', 'scalar'], // discriminant, txHash, anchor block timestamp
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
const CONTRACT_INSTANCE_MEMBER: TypeMapping<{ exists: boolean; member: Fr }[]> = FIXED_ARRAY(
|
|
213
|
+
STRUCT([
|
|
214
|
+
{ name: 'exists', type: BOOL },
|
|
215
|
+
{ name: 'member', type: FIELD },
|
|
216
|
+
]),
|
|
217
|
+
1,
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
const EVENT_SELECTOR: TypeMapping<EventSelector> = SCALAR({
|
|
221
|
+
kind: 'event-selector',
|
|
222
|
+
serialization: { fn: v => [v.toField()] },
|
|
223
|
+
deserialization: { fn: ([reader]) => EventSelector.fromField(reader.readField()) },
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
const TXE_PRIVATE_EVENTS: TypeMapping<Fr[][]> = LEAF({
|
|
227
|
+
kind: 'txe-private-events',
|
|
228
|
+
serialization: {
|
|
229
|
+
fn: events => {
|
|
230
|
+
const rawArrayStorage = events
|
|
231
|
+
.map(e => e.concat(Array(MAX_PRIVATE_EVENT_LEN - e.length).fill(Fr.ZERO)))
|
|
232
|
+
.concat(
|
|
233
|
+
Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(Array(MAX_PRIVATE_EVENT_LEN).fill(Fr.ZERO)),
|
|
234
|
+
)
|
|
235
|
+
.flat();
|
|
236
|
+
const eventLengths = events
|
|
237
|
+
.map(e => new Fr(e.length))
|
|
238
|
+
.concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(Fr.ZERO));
|
|
239
|
+
return [rawArrayStorage, eventLengths, new Fr(events.length)] as (Fr | Fr[])[];
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
// Flattened event storage, per-event lengths, then the event count.
|
|
243
|
+
shape: [
|
|
244
|
+
{ len: MAX_PRIVATE_EVENTS_PER_TXE_QUERY * MAX_PRIVATE_EVENT_LEN },
|
|
245
|
+
{ len: MAX_PRIVATE_EVENTS_PER_TXE_QUERY },
|
|
246
|
+
'scalar',
|
|
247
|
+
],
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
export const TXE_ORACLE_REGISTRY = {
|
|
251
|
+
...ORACLE_REGISTRY,
|
|
252
|
+
|
|
253
|
+
aztec_txe_assertCompatibleOracleVersion: makeEntry({
|
|
254
|
+
params: [
|
|
255
|
+
{ name: 'major', type: U32 },
|
|
256
|
+
{ name: 'minor', type: U32 },
|
|
257
|
+
],
|
|
258
|
+
}),
|
|
259
|
+
|
|
260
|
+
aztec_txe_setTopLevelTXEContext: makeEntry(),
|
|
261
|
+
|
|
262
|
+
aztec_txe_setPrivateTXEContext: makeEntry({
|
|
263
|
+
params: [
|
|
264
|
+
{ name: 'contractAddress', type: OPTION(AZTEC_ADDRESS) },
|
|
265
|
+
{ name: 'anchorBlockNumber', type: OPTION(BLOCK_NUMBER) },
|
|
266
|
+
{ name: 'gasSettings', type: GAS_SETTINGS },
|
|
267
|
+
],
|
|
268
|
+
returnType: PRIVATE_CONTEXT_INPUTS,
|
|
269
|
+
}),
|
|
270
|
+
|
|
271
|
+
aztec_txe_setPublicTXEContext: makeEntry({
|
|
272
|
+
params: [{ name: 'contractAddress', type: OPTION(AZTEC_ADDRESS) }],
|
|
273
|
+
}),
|
|
274
|
+
|
|
275
|
+
aztec_txe_setUtilityTXEContext: makeEntry({
|
|
276
|
+
params: [{ name: 'contractAddress', type: OPTION(AZTEC_ADDRESS) }],
|
|
277
|
+
}),
|
|
278
|
+
|
|
279
|
+
aztec_txe_getDefaultAddress: makeEntry({ returnType: AZTEC_ADDRESS }),
|
|
280
|
+
|
|
281
|
+
aztec_txe_getNextBlockNumber: makeEntry({ returnType: BLOCK_NUMBER }),
|
|
282
|
+
|
|
283
|
+
aztec_txe_getNextBlockTimestamp: makeEntry({ returnType: U64 }),
|
|
284
|
+
|
|
285
|
+
aztec_txe_advanceBlocksBy: makeEntry({
|
|
286
|
+
params: [{ name: 'blocks', type: U32 }],
|
|
287
|
+
}),
|
|
288
|
+
|
|
289
|
+
aztec_txe_advanceTimestampBy: makeEntry({
|
|
290
|
+
params: [{ name: 'duration', type: U64 }],
|
|
291
|
+
}),
|
|
292
|
+
|
|
293
|
+
aztec_txe_deploy: makeEntry({
|
|
294
|
+
params: [
|
|
295
|
+
{ name: 'contractPath', type: STR },
|
|
296
|
+
{ name: 'initializer', type: STR },
|
|
297
|
+
{ name: 'argsLength', type: U32 },
|
|
298
|
+
{ name: 'args', type: ARRAY(FIELD) },
|
|
299
|
+
{ name: 'secret', type: FIELD },
|
|
300
|
+
{ name: 'salt', type: FIELD },
|
|
301
|
+
{ name: 'deployer', type: AZTEC_ADDRESS },
|
|
302
|
+
],
|
|
303
|
+
returnType: ARRAY(FIELD),
|
|
304
|
+
}),
|
|
305
|
+
|
|
306
|
+
aztec_txe_createAccount: makeEntry({
|
|
307
|
+
params: [
|
|
308
|
+
{ name: 'secret', type: FIELD },
|
|
309
|
+
{ name: 'partialAddress', type: FIELD },
|
|
310
|
+
],
|
|
311
|
+
returnType: COMPLETE_ADDRESS,
|
|
312
|
+
}),
|
|
313
|
+
|
|
314
|
+
aztec_txe_addAccount: makeEntry({
|
|
315
|
+
params: [{ name: 'secret', type: FIELD }],
|
|
316
|
+
returnType: COMPLETE_ADDRESS,
|
|
317
|
+
}),
|
|
318
|
+
|
|
319
|
+
aztec_txe_addAuthWitness: makeEntry({
|
|
320
|
+
params: [
|
|
321
|
+
{ name: 'address', type: AZTEC_ADDRESS },
|
|
322
|
+
{ name: 'messageHash', type: FIELD },
|
|
323
|
+
],
|
|
324
|
+
}),
|
|
325
|
+
|
|
326
|
+
aztec_txe_sendL1ToL2Message: makeEntry({
|
|
327
|
+
params: [
|
|
328
|
+
{ name: 'content', type: FIELD },
|
|
329
|
+
{ name: 'secretHash', type: FIELD },
|
|
330
|
+
{ name: 'sender', type: ETH_ADDRESS },
|
|
331
|
+
{ name: 'recipient', type: AZTEC_ADDRESS },
|
|
332
|
+
],
|
|
333
|
+
returnType: FIELD,
|
|
334
|
+
}),
|
|
335
|
+
|
|
336
|
+
aztec_txe_setTaggingSecretStrategies: makeEntry({
|
|
337
|
+
params: [
|
|
338
|
+
{ name: 'unconstrainedStrategy', type: OPTION(TAGGING_SECRET_STRATEGY) },
|
|
339
|
+
{ name: 'constrainedStrategy', type: OPTION(TAGGING_SECRET_STRATEGY) },
|
|
340
|
+
],
|
|
341
|
+
}),
|
|
342
|
+
|
|
343
|
+
aztec_txe_setAuthorizeAllUtilityCallTargets: makeEntry({
|
|
344
|
+
params: [{ name: 'authorizeAll', type: BOOL }],
|
|
345
|
+
}),
|
|
346
|
+
|
|
347
|
+
aztec_txe_getLastBlockTimestamp: makeEntry({
|
|
348
|
+
returnType: U64,
|
|
349
|
+
}),
|
|
350
|
+
|
|
351
|
+
aztec_txe_getLastTxEffects: makeEntry({ returnType: TXE_TX_EFFECTS }),
|
|
352
|
+
aztec_txe_getLastCallOffchainEffects: makeEntry({ returnType: TXE_OFFCHAIN_EFFECTS }),
|
|
353
|
+
aztec_txe_getLastCallContext: makeEntry({ returnType: TXE_CALL_CONTEXT }),
|
|
354
|
+
|
|
355
|
+
aztec_txe_getPrivateEvents: makeEntry({
|
|
356
|
+
params: [
|
|
357
|
+
{ name: 'selector', type: EVENT_SELECTOR },
|
|
358
|
+
{ name: 'contractAddress', type: AZTEC_ADDRESS },
|
|
359
|
+
{ name: 'scope', type: AZTEC_ADDRESS },
|
|
360
|
+
],
|
|
361
|
+
returnType: TXE_PRIVATE_EVENTS,
|
|
362
|
+
}),
|
|
363
|
+
|
|
364
|
+
aztec_txe_privateCallNewFlow: makeEntry({
|
|
365
|
+
params: [
|
|
366
|
+
{ name: 'from', type: OPTION(AZTEC_ADDRESS) },
|
|
367
|
+
{ name: 'targetContractAddress', type: AZTEC_ADDRESS },
|
|
368
|
+
{ name: 'functionSelector', type: FUNCTION_SELECTOR },
|
|
369
|
+
{ name: 'args', type: ARRAY(FIELD) },
|
|
370
|
+
{ name: 'argsHash', type: FIELD },
|
|
371
|
+
{ name: 'isStaticCall', type: BOOL },
|
|
372
|
+
{ name: 'additionalScopes', type: ARRAY(AZTEC_ADDRESS) },
|
|
373
|
+
{ name: 'authorizedUtilityCallTargets', type: ARRAY(AZTEC_ADDRESS) },
|
|
374
|
+
{ name: 'gasSettings', type: GAS_SETTINGS },
|
|
375
|
+
],
|
|
376
|
+
returnType: ARRAY(FIELD),
|
|
377
|
+
}),
|
|
378
|
+
|
|
379
|
+
aztec_txe_executeUtilityFunction: makeEntry({
|
|
380
|
+
params: [
|
|
381
|
+
{ name: 'from', type: OPTION(AZTEC_ADDRESS) },
|
|
382
|
+
{ name: 'targetContractAddress', type: AZTEC_ADDRESS },
|
|
383
|
+
{ name: 'functionSelector', type: FUNCTION_SELECTOR },
|
|
384
|
+
{ name: 'args', type: ARRAY(FIELD) },
|
|
385
|
+
{ name: 'authorizedUtilityCallTargets', type: ARRAY(AZTEC_ADDRESS) },
|
|
386
|
+
],
|
|
387
|
+
returnType: ARRAY(FIELD),
|
|
388
|
+
}),
|
|
389
|
+
|
|
390
|
+
aztec_txe_publicCallNewFlow: makeEntry({
|
|
391
|
+
params: [
|
|
392
|
+
{ name: 'from', type: OPTION(AZTEC_ADDRESS) },
|
|
393
|
+
{ name: 'address', type: AZTEC_ADDRESS },
|
|
394
|
+
{ name: 'calldata', type: ARRAY(FIELD) },
|
|
395
|
+
{ name: 'isStaticCall', type: BOOL },
|
|
396
|
+
{ name: 'gasSettings', type: GAS_SETTINGS },
|
|
397
|
+
],
|
|
398
|
+
returnType: ARRAY(FIELD),
|
|
399
|
+
}),
|
|
400
|
+
|
|
401
|
+
aztec_avm_address: makeEntry({ returnType: AZTEC_ADDRESS }),
|
|
402
|
+
|
|
403
|
+
aztec_avm_sender: makeEntry({ returnType: AZTEC_ADDRESS }),
|
|
404
|
+
|
|
405
|
+
aztec_avm_blockNumber: makeEntry({ returnType: BLOCK_NUMBER }),
|
|
406
|
+
|
|
407
|
+
aztec_avm_timestamp: makeEntry({ returnType: U64 }),
|
|
408
|
+
|
|
409
|
+
aztec_avm_isStaticCall: makeEntry({ returnType: BOOL }),
|
|
410
|
+
|
|
411
|
+
aztec_avm_chainId: makeEntry({ returnType: FIELD }),
|
|
412
|
+
|
|
413
|
+
aztec_avm_version: makeEntry({ returnType: FIELD }),
|
|
414
|
+
|
|
415
|
+
aztec_avm_emitNullifier: makeEntry({
|
|
416
|
+
params: [{ name: 'nullifier', type: FIELD }],
|
|
417
|
+
}),
|
|
418
|
+
|
|
419
|
+
aztec_avm_emitNoteHash: makeEntry({
|
|
420
|
+
params: [{ name: 'noteHash', type: FIELD }],
|
|
421
|
+
}),
|
|
422
|
+
|
|
423
|
+
aztec_avm_nullifierExists: makeEntry({
|
|
424
|
+
params: [{ name: 'siloedNullifier', type: FIELD }],
|
|
425
|
+
returnType: BOOL,
|
|
426
|
+
}),
|
|
427
|
+
|
|
428
|
+
aztec_avm_storageRead: makeEntry({
|
|
429
|
+
params: [
|
|
430
|
+
{ name: 'slot', type: FIELD },
|
|
431
|
+
{ name: 'contractAddress', type: AZTEC_ADDRESS },
|
|
432
|
+
],
|
|
433
|
+
returnType: FIELD,
|
|
434
|
+
}),
|
|
435
|
+
|
|
436
|
+
aztec_avm_storageWrite: makeEntry({
|
|
437
|
+
params: [
|
|
438
|
+
{ name: 'slot', type: FIELD },
|
|
439
|
+
{ name: 'value', type: FIELD },
|
|
440
|
+
],
|
|
441
|
+
}),
|
|
442
|
+
|
|
443
|
+
aztec_avm_emitPublicLog: makeEntry({
|
|
444
|
+
params: [{ name: 'message', type: ARRAY(FIELD) }],
|
|
445
|
+
}),
|
|
446
|
+
|
|
447
|
+
aztec_avm_returndataSize: makeEntry({ returnType: U32 }),
|
|
448
|
+
|
|
449
|
+
aztec_avm_returndataCopy: makeEntry({
|
|
450
|
+
params: [
|
|
451
|
+
{ name: 'rdOffset', type: U32 },
|
|
452
|
+
{ name: 'copySize', type: U32 },
|
|
453
|
+
],
|
|
454
|
+
returnType: ARRAY(FIELD),
|
|
455
|
+
}),
|
|
456
|
+
|
|
457
|
+
aztec_avm_call: makeEntry({
|
|
458
|
+
params: [
|
|
459
|
+
{ name: 'l2Gas', type: U32 },
|
|
460
|
+
{ name: 'daGas', type: U32 },
|
|
461
|
+
{ name: 'address', type: AZTEC_ADDRESS },
|
|
462
|
+
{ name: 'argsLength', type: U32 },
|
|
463
|
+
{ name: 'args', type: ARRAY(FIELD) },
|
|
464
|
+
],
|
|
465
|
+
}),
|
|
466
|
+
|
|
467
|
+
aztec_avm_staticCall: makeEntry({
|
|
468
|
+
params: [
|
|
469
|
+
{ name: 'l2Gas', type: U32 },
|
|
470
|
+
{ name: 'daGas', type: U32 },
|
|
471
|
+
{ name: 'address', type: AZTEC_ADDRESS },
|
|
472
|
+
{ name: 'argsLength', type: U32 },
|
|
473
|
+
{ name: 'args', type: ARRAY(FIELD) },
|
|
474
|
+
],
|
|
475
|
+
}),
|
|
476
|
+
|
|
477
|
+
aztec_avm_successCopy: makeEntry({ returnType: BOOL }),
|
|
478
|
+
|
|
479
|
+
aztec_avm_getContractInstanceDeployer: makeEntry({
|
|
480
|
+
params: [{ name: 'address', type: AZTEC_ADDRESS }],
|
|
481
|
+
returnType: CONTRACT_INSTANCE_MEMBER,
|
|
482
|
+
}),
|
|
483
|
+
aztec_avm_getContractInstanceClassId: makeEntry({
|
|
484
|
+
params: [{ name: 'address', type: AZTEC_ADDRESS }],
|
|
485
|
+
returnType: CONTRACT_INSTANCE_MEMBER,
|
|
486
|
+
}),
|
|
487
|
+
aztec_avm_getContractInstanceInitializationHash: makeEntry({
|
|
488
|
+
params: [{ name: 'address', type: AZTEC_ADDRESS }],
|
|
489
|
+
returnType: CONTRACT_INSTANCE_MEMBER,
|
|
490
|
+
}),
|
|
491
|
+
aztec_avm_getContractInstanceImmutablesHash: makeEntry({
|
|
492
|
+
params: [{ name: 'address', type: AZTEC_ADDRESS }],
|
|
493
|
+
returnType: CONTRACT_INSTANCE_MEMBER,
|
|
494
|
+
}),
|
|
495
|
+
} satisfies Record<string, OracleRegistryEntry>;
|
|
496
|
+
|
|
497
|
+
export function toInputSlots(inputs: ForeignCallArgs): InputSlot[] {
|
|
498
|
+
// TXE foreign calls use bare hex strings, but Fr.fromString requires a 0x prefix to parse as hex.
|
|
499
|
+
return inputs.map(v => (Array.isArray(v) ? (v as string[]).map(withHexPrefix) : [withHexPrefix(v as string)]));
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* Deserializes oracle inputs, calls the handler with typed params, serializes the result, and wraps
|
|
504
|
+
* it in a `ForeignCallResult`. Normalizes `ForeignCallArgs` (which may contain bare strings) into
|
|
505
|
+
* `InputSlot[]` (always arrays) before deserialization.
|
|
506
|
+
*/
|
|
507
|
+
export async function callTxeHandler<K extends keyof typeof TXE_ORACLE_REGISTRY>({
|
|
508
|
+
oracle,
|
|
509
|
+
inputs,
|
|
510
|
+
handler,
|
|
511
|
+
}: {
|
|
512
|
+
oracle: K;
|
|
513
|
+
inputs: ForeignCallArgs;
|
|
514
|
+
handler: (
|
|
515
|
+
params: ParamTypes<ReturnType<(typeof TXE_ORACLE_REGISTRY)[K]['deserializeParams']>>,
|
|
516
|
+
) => MaybePromise<Parameters<(typeof TXE_ORACLE_REGISTRY)[K]['serializeReturn']>[0]>;
|
|
517
|
+
}): Promise<ForeignCallResult> {
|
|
518
|
+
const entry = TXE_ORACLE_REGISTRY[oracle] as OracleRegistryEntry;
|
|
519
|
+
const named = entry.deserializeParams(toInputSlots(inputs));
|
|
520
|
+
const positional = named.map((p: { value: unknown }) => p.value);
|
|
521
|
+
const result = await handler(positional as any);
|
|
522
|
+
return outputSlotsToForeignCallResult(entry.serializeReturn(result));
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* Dispatches an oracle that has been retired into the PXE legacy registry. TXE has no explicit handler method for such
|
|
527
|
+
* names; this runs them through the same `buildACIRCallback` legacy path that contract execution already uses, so
|
|
528
|
+
* TXE's top-level oracle path and its in-contract path treat the legacy registry identically.
|
|
529
|
+
*/
|
|
530
|
+
const legacyCallbacksByHandler = new WeakMap<object, ReturnType<typeof buildACIRCallback>>();
|
|
531
|
+
|
|
532
|
+
export async function callTxeLegacyHandler(
|
|
533
|
+
oracle: string,
|
|
534
|
+
inputs: ForeignCallArgs,
|
|
535
|
+
oracleHandler: Parameters<typeof buildACIRCallback>[0],
|
|
536
|
+
): Promise<ForeignCallResult> {
|
|
537
|
+
// `buildACIRCallback` materializes the whole real+legacy closure set, so memoize it per handler rather than
|
|
538
|
+
// rebuilding on every call (TXE routes one legacy oracle through here on each top-level discovery).
|
|
539
|
+
let callback = legacyCallbacksByHandler.get(oracleHandler);
|
|
540
|
+
if (!callback) {
|
|
541
|
+
callback = buildACIRCallback(oracleHandler);
|
|
542
|
+
legacyCallbacksByHandler.set(oracleHandler, callback);
|
|
543
|
+
}
|
|
544
|
+
const outputSlots = await callback[oracle](...toInputSlots(inputs));
|
|
545
|
+
return outputSlotsToForeignCallResult(outputSlots);
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
/**
|
|
549
|
+
* Strips the `0x` prefix from each serialized output slot (TXE foreign calls use bare hex strings) and wraps them in a
|
|
550
|
+
* `ForeignCallResult`.
|
|
551
|
+
*/
|
|
552
|
+
function outputSlotsToForeignCallResult(outputSlots: OutputSlot[]): ForeignCallResult {
|
|
553
|
+
return {
|
|
554
|
+
values: outputSlots.map(slot => (Array.isArray(slot) ? slot.map(withoutHexPrefix) : withoutHexPrefix(slot))),
|
|
555
|
+
};
|
|
556
|
+
}
|