@aztec/txe 5.0.0-rc.2 → 5.0.0
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-FSRZIMX6.js +3 -0
- package/dest/AuthRegistry-FSRZIMX6.js.map +7 -0
- package/dest/ContractClassRegistry-N6NA3SFA.js +3 -0
- package/dest/ContractClassRegistry-N6NA3SFA.js.map +7 -0
- package/dest/ContractInstanceRegistry-NADDSLGL.js +3 -0
- package/dest/ContractInstanceRegistry-NADDSLGL.js.map +7 -0
- package/dest/FeeJuice-QBH5JWJV.js +3 -0
- package/dest/FeeJuice-QBH5JWJV.js.map +7 -0
- package/dest/HandshakeRegistry-KKUEU7XW.js +3 -0
- package/dest/HandshakeRegistry-KKUEU7XW.js.map +7 -0
- package/dest/MultiCallEntrypoint-TGICA67H.js +3 -0
- package/dest/MultiCallEntrypoint-TGICA67H.js.map +7 -0
- package/dest/SchnorrAccount-J5T6OKR3.js +3 -0
- package/dest/SchnorrAccount-J5T6OKR3.js.map +7 -0
- package/dest/SchnorrInitializerlessAccount-OOES6Q4F.js +3 -0
- package/dest/SchnorrInitializerlessAccount-OOES6Q4F.js.map +7 -0
- package/dest/bin/index.js +1 -1
- package/dest/bin/oracle_test_server.js +1 -1
- package/dest/{chunk-I6DL4FT2.js → chunk-PDOEF22H.js} +2 -2
- package/dest/{chunk-I6DL4FT2.js.map → chunk-PDOEF22H.js.map} +3 -3
- package/dest/chunk-YP4ODNMQ.js +268 -0
- package/dest/chunk-YP4ODNMQ.js.map +7 -0
- package/dest/index.d.ts +1 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +5 -3
- package/dest/metafile.json +3419 -2900
- package/dest/oracle/interfaces.d.ts +11 -7
- 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 +3 -3
- package/dest/oracle/test-resolver/default_fixtures.d.ts.map +1 -1
- package/dest/oracle/test-resolver/default_fixtures.js +54 -11
- package/dest/oracle/test-resolver/resolver.d.ts +1 -1
- package/dest/oracle/test-resolver/resolver.js +39 -2
- package/dest/oracle/txe_oracle_public_context.d.ts +6 -6
- package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.js +15 -9
- package/dest/oracle/txe_oracle_registry.d.ts +19 -16
- package/dest/oracle/txe_oracle_registry.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_registry.js +51 -17
- package/dest/oracle/txe_oracle_top_level_context.d.ts +8 -6
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_top_level_context.js +47 -31
- package/dest/oracle/txe_oracle_version.d.ts +3 -3
- package/dest/oracle/txe_oracle_version.js +3 -3
- package/dest/rpc_translator.d.ts +7 -5
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +28 -12
- package/dest/server.bundle.js +1 -1
- package/dest/state_machine/dummy_p2p_client.d.ts +2 -1
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +3 -0
- package/dest/state_machine/index.d.ts +4 -3
- package/dest/state_machine/index.d.ts.map +1 -1
- package/dest/state_machine/index.js +7 -4
- package/dest/state_machine/synchronizer.d.ts +3 -1
- package/dest/state_machine/synchronizer.d.ts.map +1 -1
- package/dest/state_machine/synchronizer.js +3 -0
- package/dest/txe_session.d.ts +2 -2
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +28 -14
- package/dest/utils/encoding.d.ts +4 -3
- package/dest/utils/encoding.d.ts.map +1 -1
- 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/utils/txe_public_contract_data_source.d.ts +1 -1
- package/dest/utils/txe_public_contract_data_source.d.ts.map +1 -1
- package/dest/utils/txe_public_contract_data_source.js +7 -4
- package/dest/worker.bundle.js +1 -1
- package/package.json +17 -17
- package/src/bin/oracle_test_server.ts +1 -1
- package/src/index.ts +5 -3
- package/src/oracle/interfaces.ts +13 -6
- package/src/oracle/tagging_secret_strategy.ts +25 -0
- package/src/oracle/test-resolver/default_fixtures.ts +73 -17
- package/src/oracle/test-resolver/resolver.ts +49 -2
- package/src/oracle/txe_oracle_public_context.ts +13 -11
- package/src/oracle/txe_oracle_registry.ts +54 -9
- package/src/oracle/txe_oracle_top_level_context.ts +82 -31
- package/src/oracle/txe_oracle_version.ts +3 -3
- package/src/rpc_translator.ts +33 -13
- package/src/state_machine/dummy_p2p_client.ts +4 -0
- package/src/state_machine/index.ts +19 -2
- package/src/state_machine/synchronizer.ts +5 -0
- package/src/txe_session.ts +50 -12
- package/src/utils/tx_effect_creation.ts +0 -2
- package/src/utils/txe_public_contract_data_source.ts +6 -4
- package/dest/AuthRegistry-URXCCPYF.js +0 -3
- package/dest/AuthRegistry-URXCCPYF.js.map +0 -7
- package/dest/ContractClassRegistry-5RDBM6TC.js +0 -3
- package/dest/ContractClassRegistry-5RDBM6TC.js.map +0 -7
- package/dest/ContractInstanceRegistry-GCR4G4D7.js +0 -3
- package/dest/ContractInstanceRegistry-GCR4G4D7.js.map +0 -7
- package/dest/FeeJuice-O3KOSZO5.js +0 -3
- package/dest/FeeJuice-O3KOSZO5.js.map +0 -7
- package/dest/HandshakeRegistry-TXSMHMNY.js +0 -3
- package/dest/HandshakeRegistry-TXSMHMNY.js.map +0 -7
- package/dest/MultiCallEntrypoint-P4FSRXAD.js +0 -3
- package/dest/MultiCallEntrypoint-P4FSRXAD.js.map +0 -7
- package/dest/SchnorrAccount-AQZX7ROU.js +0 -3
- package/dest/SchnorrAccount-AQZX7ROU.js.map +0 -7
- package/dest/SchnorrInitializerlessAccount-KMX2H3J6.js +0 -3
- package/dest/SchnorrInitializerlessAccount-KMX2H3J6.js.map +0 -7
- package/dest/chunk-IAO54JS2.js +0 -266
- package/dest/chunk-IAO54JS2.js.map +0 -7
|
@@ -3,7 +3,6 @@ import { computeNoteHashNonce, computeUniqueNoteHash, siloNoteHash } from '@azte
|
|
|
3
3
|
import { TxEffect, TxHash } from '@aztec/stdlib/tx';
|
|
4
4
|
export async function makeTxEffect(noteCache, txBlockNumber) {
|
|
5
5
|
const txEffect = TxEffect.empty();
|
|
6
|
-
noteCache.finish();
|
|
7
6
|
const nonceGenerator = noteCache.getNonceGenerator();
|
|
8
7
|
txEffect.noteHashes = await Promise.all(noteCache.getAllNotes().map(async (pendingNote, i)=>computeUniqueNoteHash(await computeNoteHashNonce(nonceGenerator, i), await siloNoteHash(pendingNote.note.contractAddress, pendingNote.noteHashForConsumption))));
|
|
9
8
|
// Nullifiers are already siloed
|
|
@@ -17,4 +17,4 @@ export declare class TXEPublicContractDataSource implements ContractDataSource {
|
|
|
17
17
|
getDebugFunctionName(address: AztecAddress, selector: FunctionSelector): Promise<string | undefined>;
|
|
18
18
|
registerContractFunctionSignatures(_signatures: []): Promise<void>;
|
|
19
19
|
}
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX3B1YmxpY19jb250cmFjdF9kYXRhX3NvdXJjZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3R4ZV9wdWJsaWNfY29udHJhY3RfZGF0YV9zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFbkgscUJBQWEsMkJBQTRCLFlBQVcsa0JBQWtCO0lBRWxFLE9BQU8sQ0FBQyxXQUFXO0lBQ25CLE9BQU8sQ0FBQyxhQUFhO0lBRnZCLFlBQ1UsV0FBVyxFQUFFLFdBQVcsRUFDeEIsYUFBYSxFQUFFLGFBQWEsRUFDbEM7SUFFSixjQUFjLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUVyQztJQUVLLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxDQVl2RTtJQUVLLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FHM0Q7SUFFSyxXQUFXLENBQUMsT0FBTyxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsMkJBQTJCLEdBQUcsU0FBUyxDQUFDLENBSXpGO0lBRUQsbUJBQW1CLElBQUksT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBRW5DO0lBRUssbUJBQW1CLENBQUMsT0FBTyxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLENBR3RGO0lBRUssb0JBQW9CLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FHekc7SUFFRCxrQ0FBa0MsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFakU7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"txe_public_contract_data_source.d.ts","sourceRoot":"","sources":["../../src/utils/txe_public_contract_data_source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,KAAK,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAEnH,qBAAa,2BAA4B,YAAW,kBAAkB;IAElE,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,aAAa;IAFvB,YACU,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAClC;IAEJ,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAErC;IAEK,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAYvE;IAEK,qBAAqB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,CAG3D;IAEK,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"txe_public_contract_data_source.d.ts","sourceRoot":"","sources":["../../src/utils/txe_public_contract_data_source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,KAAK,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAEnH,qBAAa,2BAA4B,YAAW,kBAAkB;IAElE,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,aAAa;IAFvB,YACU,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAClC;IAEJ,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAErC;IAEK,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAYvE;IAEK,qBAAqB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,CAG3D;IAEK,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC,CAIzF;IAED,mBAAmB,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC,CAEnC;IAEK,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAGtF;IAEK,oBAAoB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAGzG;IAED,kCAAkC,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE;CACF"}
|
|
@@ -27,20 +27,23 @@ export class TXEPublicContractDataSource {
|
|
|
27
27
|
}
|
|
28
28
|
async getContract(address) {
|
|
29
29
|
const instance = await this.contractStore.getContractInstance(address);
|
|
30
|
+
// TXE has no contract updates, so the current class always equals the original.
|
|
30
31
|
return instance && {
|
|
31
32
|
...instance,
|
|
32
|
-
address
|
|
33
|
+
address,
|
|
34
|
+
currentContractClassId: instance.originalContractClassId
|
|
33
35
|
};
|
|
34
36
|
}
|
|
35
37
|
getContractClassIds() {
|
|
36
38
|
throw new Error('Method not implemented.');
|
|
37
39
|
}
|
|
38
40
|
async getContractArtifact(address) {
|
|
39
|
-
const instance = await this.
|
|
40
|
-
return instance && this.contractStore.getContractArtifact(instance.
|
|
41
|
+
const instance = await this.getContract(address);
|
|
42
|
+
return instance && this.contractStore.getContractArtifact(instance.originalContractClassId);
|
|
41
43
|
}
|
|
42
44
|
async getDebugFunctionName(address, selector) {
|
|
43
|
-
|
|
45
|
+
const instance = await this.getContract(address);
|
|
46
|
+
return instance && this.contractStore.getDebugFunctionName(instance.originalContractClassId, selector);
|
|
44
47
|
}
|
|
45
48
|
registerContractFunctionSignatures(_signatures) {
|
|
46
49
|
return Promise.resolve();
|
package/dest/worker.bundle.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { createRequire as __txeCreateRequire } from 'node:module';
|
|
2
2
|
const require = __txeCreateRequire(import.meta.url);
|
|
3
|
-
import{TXEDispatcher,activeSessionCount,createLogger}from"./chunk-
|
|
3
|
+
import{TXEDispatcher,activeSessionCount,createLogger}from"./chunk-YP4ODNMQ.js";import{__name}from"./chunk-BJVAAXNA.js";import{BackendType,Barretenberg,BarretenbergSync}from"@aztec/bb.js";import{parentPort,workerData}from"node:worker_threads";Barretenberg.initSingleton({backend:BackendType.Wasm,skipSrsInit:!0,threads:1});BarretenbergSync.initSingleton({backend:BackendType.Wasm});if(!parentPort)throw new Error("worker.ts must be loaded as a worker_thread");var port=parentPort,logger=createLogger("txe:worker"),dispatcherOpts={contractStoreSourceDir:workerData.contractStoreSourceDir,schnorrClassId:workerData.schnorrClassId},dispatcher=new TXEDispatcher(logger,dispatcherOpts);function serializeError(err){return err instanceof Error?{message:err.message,name:err.name,stack:err.stack}:{message:String(err)}}__name(serializeError,"serializeError");process.env.TXE_WORKER_MEMSTAT==="1"&&setInterval(()=>{let m=process.memoryUsage();port.postMessage({type:"memstat",sessions:activeSessionCount(),rss:m.rss,heapTotal:m.heapTotal,heapUsed:m.heapUsed,external:m.external,arrayBuffers:m.arrayBuffers})},2e3).unref();port.on("message",msg=>{switch(msg.type){case"foreign-call":(async()=>{try{let value=await dispatcher.resolve_foreign_call(msg.callData);port.postMessage({type:"result",requestId:msg.requestId,ok:!0,value})}catch(err){port.postMessage({type:"result",requestId:msg.requestId,ok:!1,error:serializeError(err)})}})();return;case"dispose-session":dispatcher.disposeSession(msg.sessionId).catch(err=>logger.warn("disposeSession failed",err));return}});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/txe",
|
|
3
|
-
"version": "5.0.0
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./server": {
|
|
@@ -69,22 +69,22 @@
|
|
|
69
69
|
]
|
|
70
70
|
},
|
|
71
71
|
"dependencies": {
|
|
72
|
-
"@aztec/accounts": "5.0.0
|
|
73
|
-
"@aztec/archiver": "5.0.0
|
|
74
|
-
"@aztec/aztec-node": "5.0.0
|
|
75
|
-
"@aztec/aztec.js": "5.0.0
|
|
76
|
-
"@aztec/bb-prover": "5.0.0
|
|
77
|
-
"@aztec/bb.js": "5.0.0
|
|
78
|
-
"@aztec/constants": "5.0.0
|
|
79
|
-
"@aztec/foundation": "5.0.0
|
|
80
|
-
"@aztec/key-store": "5.0.0
|
|
81
|
-
"@aztec/kv-store": "5.0.0
|
|
82
|
-
"@aztec/protocol-contracts": "5.0.0
|
|
83
|
-
"@aztec/pxe": "5.0.0
|
|
84
|
-
"@aztec/simulator": "5.0.0
|
|
85
|
-
"@aztec/standard-contracts": "5.0.0
|
|
86
|
-
"@aztec/stdlib": "5.0.0
|
|
87
|
-
"@aztec/world-state": "5.0.0
|
|
72
|
+
"@aztec/accounts": "5.0.0",
|
|
73
|
+
"@aztec/archiver": "5.0.0",
|
|
74
|
+
"@aztec/aztec-node": "5.0.0",
|
|
75
|
+
"@aztec/aztec.js": "5.0.0",
|
|
76
|
+
"@aztec/bb-prover": "5.0.0",
|
|
77
|
+
"@aztec/bb.js": "5.0.0",
|
|
78
|
+
"@aztec/constants": "5.0.0",
|
|
79
|
+
"@aztec/foundation": "5.0.0",
|
|
80
|
+
"@aztec/key-store": "5.0.0",
|
|
81
|
+
"@aztec/kv-store": "5.0.0",
|
|
82
|
+
"@aztec/protocol-contracts": "5.0.0",
|
|
83
|
+
"@aztec/pxe": "5.0.0",
|
|
84
|
+
"@aztec/simulator": "5.0.0",
|
|
85
|
+
"@aztec/standard-contracts": "5.0.0",
|
|
86
|
+
"@aztec/stdlib": "5.0.0",
|
|
87
|
+
"@aztec/world-state": "5.0.0",
|
|
88
88
|
"msgpackr": "^1.11.2",
|
|
89
89
|
"zod": "^4"
|
|
90
90
|
},
|
|
@@ -6,7 +6,7 @@ import { createOracleTestRpcServer } from '../oracle/test-resolver/index.js';
|
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Starts an HTTP RPC server that resolves oracle foreign calls using auto-synthesized fixture scenarios. Used by
|
|
9
|
-
* `nargo test --oracle-resolver` to run `#[
|
|
9
|
+
* `nargo test --oracle-resolver` to run `#[generate_oracle_tests]` serialization tests against a dedicated resolver.
|
|
10
10
|
* Logs fixture coverage on shutdown.
|
|
11
11
|
*/
|
|
12
12
|
async function main() {
|
package/src/index.ts
CHANGED
|
@@ -21,9 +21,11 @@ import {
|
|
|
21
21
|
} from './utils/encoding.js';
|
|
22
22
|
import { TXEArtifactResolver } from './utils/txe_artifact_resolver.js';
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
export const TXE_REQUIRED_PROTOCOL_CONTRACTS: ProtocolContractName[] = [
|
|
25
|
+
'ContractClassRegistry',
|
|
26
|
+
'ContractInstanceRegistry',
|
|
27
|
+
'FeeJuice',
|
|
28
|
+
];
|
|
27
29
|
|
|
28
30
|
const sessions = new Map<number, TXESession>();
|
|
29
31
|
|
package/src/oracle/interfaces.ts
CHANGED
|
@@ -39,11 +39,11 @@ export interface IAvmExecutionOracle {
|
|
|
39
39
|
nullifierExists(siloedNullifier: Fr): Promise<boolean>;
|
|
40
40
|
storageWrite(slot: Fr, value: Fr): Promise<void>;
|
|
41
41
|
storageRead(slot: Fr, contractAddress: AztecAddress): Promise<Fr>;
|
|
42
|
-
getContractInstanceDeployer(address: AztecAddress): Promise<{ member: Fr; exists: boolean }>;
|
|
43
|
-
getContractInstanceClassId(address: AztecAddress): Promise<{ member: Fr; exists: boolean }>;
|
|
44
|
-
getContractInstanceInitializationHash(address: AztecAddress): Promise<{ member: Fr; exists: boolean }>;
|
|
45
|
-
getContractInstanceImmutablesHash(address: AztecAddress): Promise<{ member: Fr; exists: boolean }>;
|
|
46
|
-
returndataSize(): Promise<
|
|
42
|
+
getContractInstanceDeployer(address: AztecAddress): Promise<{ member: Fr; exists: boolean }[]>;
|
|
43
|
+
getContractInstanceClassId(address: AztecAddress): Promise<{ member: Fr; exists: boolean }[]>;
|
|
44
|
+
getContractInstanceInitializationHash(address: AztecAddress): Promise<{ member: Fr; exists: boolean }[]>;
|
|
45
|
+
getContractInstanceImmutablesHash(address: AztecAddress): Promise<{ member: Fr; exists: boolean }[]>;
|
|
46
|
+
returndataSize(): Promise<number>;
|
|
47
47
|
returndataCopy(rdOffset: number, copySize: number): Promise<Fr[]>;
|
|
48
48
|
call(l2Gas: number, daGas: number, address: AztecAddress, argsLength: number, args: Fr[]): Promise<void>;
|
|
49
49
|
staticCall(l2Gas: number, daGas: number, address: AztecAddress, argsLength: number, args: Fr[]): Promise<void>;
|
|
@@ -73,7 +73,14 @@ export interface ITxeExecutionOracle {
|
|
|
73
73
|
addAccount(secret: Fr): Promise<CompleteAddress>;
|
|
74
74
|
addAuthWitness(address: AztecAddress, messageHash: Fr): Promise<void>;
|
|
75
75
|
sendL1ToL2Message(content: Fr, secretHash: Fr, sender: EthAddress, recipient: AztecAddress): Promise<Fr>;
|
|
76
|
-
|
|
76
|
+
/**
|
|
77
|
+
* Configures the tagging secret strategy the test's simulated wallet resolves for each delivery mode. A `none`
|
|
78
|
+
* clears that mode, so it falls back to the default strategy (or, when both modes end up unset, to no hook at all).
|
|
79
|
+
*/
|
|
80
|
+
setTaggingSecretStrategies(
|
|
81
|
+
unconstrainedStrategy: Option<TaggingSecretStrategy>,
|
|
82
|
+
constrainedStrategy: Option<TaggingSecretStrategy>,
|
|
83
|
+
): void;
|
|
77
84
|
getLastBlockTimestamp(): Promise<bigint>;
|
|
78
85
|
getLastTxEffects(): Promise<{
|
|
79
86
|
txHash: TxHash;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_TAGGING_SECRET_STRATEGY,
|
|
3
|
+
type ResolveTaggingSecretStrategy,
|
|
4
|
+
type TaggingSecretStrategy,
|
|
5
|
+
} from '@aztec/pxe/server';
|
|
6
|
+
import type { AppTaggingSecretKind } from '@aztec/stdlib/logs';
|
|
7
|
+
|
|
8
|
+
/** The tagging secret strategies a TXE test has configured, keyed by delivery mode. Absence means "not configured". */
|
|
9
|
+
export type TXETaggingSecretStrategies = Map<AppTaggingSecretKind, TaggingSecretStrategy>;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Builds the `resolveTaggingSecretStrategy` hook backing the `aztec_txe_setTaggingSecretStrategies` oracle. Returns
|
|
13
|
+
* `undefined` when no strategy is configured, so PXE's own no-hook default path is exercised. When at least one mode
|
|
14
|
+
* is configured, modes without an entry resolve to {@link DEFAULT_TAGGING_SECRET_STRATEGY}, matching what PXE would
|
|
15
|
+
* apply without a hook.
|
|
16
|
+
*/
|
|
17
|
+
export function makeResolveTaggingSecretStrategyHook(
|
|
18
|
+
strategies: TXETaggingSecretStrategies,
|
|
19
|
+
): ResolveTaggingSecretStrategy | undefined {
|
|
20
|
+
if (strategies.size === 0) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return ({ deliveryMode }) => Promise.resolve(strategies.get(deliveryMode) ?? DEFAULT_TAGGING_SECRET_STRATEGY);
|
|
25
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
|
-
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
4
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
5
|
import {
|
|
@@ -10,24 +10,29 @@ import {
|
|
|
10
10
|
BOOL,
|
|
11
11
|
BYTE,
|
|
12
12
|
BoundedVec,
|
|
13
|
+
DELIVERY_MODE,
|
|
13
14
|
ETH_ADDRESS,
|
|
14
15
|
FIELD,
|
|
15
16
|
FUNCTION_SELECTOR,
|
|
16
17
|
NOTE_SELECTOR,
|
|
17
18
|
Option,
|
|
18
19
|
type OracleRegistryEntry,
|
|
20
|
+
SLOT_NUMBER,
|
|
21
|
+
type StructField,
|
|
19
22
|
type TypeMapping,
|
|
20
23
|
U32,
|
|
24
|
+
tryFieldWidth,
|
|
21
25
|
} from '@aztec/pxe/simulator';
|
|
22
26
|
import { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
|
|
23
27
|
import { BlockHash } from '@aztec/stdlib/block';
|
|
28
|
+
import { AppTaggingSecretKind } from '@aztec/stdlib/logs';
|
|
24
29
|
|
|
25
30
|
import type { OracleTestScenario } from './resolver.js';
|
|
26
31
|
|
|
27
32
|
/**
|
|
28
33
|
* Synthesizes fixture scenarios for every oracle in the registry whose parameters and return are built from scalars,
|
|
29
|
-
* arrays/bounded vecs of them,
|
|
30
|
-
* `#[
|
|
34
|
+
* arrays/bounded vecs of them, `Option`s of them, or `STRUCT`s over them. The matching Noir serialization tests are
|
|
35
|
+
* auto-generated by `#[generate_oracle_tests]` from the same seed/scenario convention.
|
|
31
36
|
*/
|
|
32
37
|
export function synthesizeDefaultFixtures(
|
|
33
38
|
registry: Record<string, OracleRegistryEntry>,
|
|
@@ -45,8 +50,8 @@ export function synthesizeDefaultFixtures(
|
|
|
45
50
|
}
|
|
46
51
|
|
|
47
52
|
/**
|
|
48
|
-
* The test-value implementations, one per oracle type, mirroring the Noir `
|
|
49
|
-
*
|
|
53
|
+
* The test-value implementations, one per oracle type, mirroring the Noir synthesizer tables (`scalars` and
|
|
54
|
+
* `synthesizers` in `noir-projects/aztec-nr/.../macros/oracle_testing.nr`) exactly.
|
|
50
55
|
*/
|
|
51
56
|
const TEST_VALUE_IMPLS: TestValueImpl[] = [
|
|
52
57
|
scalar(FIELD, seed => new Fr(seed)),
|
|
@@ -60,6 +65,11 @@ const TEST_VALUE_IMPLS: TestValueImpl[] = [
|
|
|
60
65
|
scalar(FUNCTION_SELECTOR, seed => FunctionSelector.fromField(new Fr(seed))),
|
|
61
66
|
scalar(NOTE_SELECTOR, seed => NoteSelector.fromField(new Fr(seed))),
|
|
62
67
|
scalar(BLOCK_HASH, seed => new BlockHash(new Fr(seed))),
|
|
68
|
+
scalar(SLOT_NUMBER, seed => SlotNumber(seed)),
|
|
69
|
+
// Only two delivery modes are valid for tagging, so the seed alternates between them, matching the Noir impl.
|
|
70
|
+
scalar(DELIVERY_MODE, seed =>
|
|
71
|
+
seed % 2 === 0 ? AppTaggingSecretKind.UNCONSTRAINED : AppTaggingSecretKind.CONSTRAINED,
|
|
72
|
+
),
|
|
63
73
|
composite(isOption, (type, seed) => [
|
|
64
74
|
named(Option.some(firstValue(type.inner, seed)), 'some'),
|
|
65
75
|
named(Option.none(firstValue(type.inner, seed)), 'none'),
|
|
@@ -73,6 +83,15 @@ const TEST_VALUE_IMPLS: TestValueImpl[] = [
|
|
|
73
83
|
}),
|
|
74
84
|
),
|
|
75
85
|
]),
|
|
86
|
+
composite(isStruct, (type, seed) => [unnamed(structValue(type, seed))]),
|
|
87
|
+
// A fixed-length array uses its real (signature) length, unlike the generic-length ARRAY which is pinned to
|
|
88
|
+
// DEFAULT_ARRAY_LENGTH.
|
|
89
|
+
composite(isFixedArray, (type, seed) => [unnamed(collectionData(type.inner, seed, type.length))]),
|
|
90
|
+
// Same for a fixed-capacity bounded vec: real capacity, DEFAULT_ARRAY_LENGTH elements (its value type is a plain
|
|
91
|
+
// element array, unlike the two-slot BOUNDED_VEC), clamped to the capacity so small vecs stay valid.
|
|
92
|
+
composite(isFixedBoundedVec, (type, seed) => [
|
|
93
|
+
unnamed(collectionData(type.inner, seed, Math.min(DEFAULT_ARRAY_LENGTH, type.maxLength))),
|
|
94
|
+
]),
|
|
76
95
|
];
|
|
77
96
|
|
|
78
97
|
/**
|
|
@@ -107,9 +126,9 @@ function named(value: unknown, name: string): Scenario {
|
|
|
107
126
|
}
|
|
108
127
|
|
|
109
128
|
/**
|
|
110
|
-
* One type's test-value implementation, mirroring a Noir `
|
|
111
|
-
* `scenarios` yields its [`Scenario`]s for `seed`, one per serialization shape, like Noir's
|
|
112
|
-
*
|
|
129
|
+
* One type's test-value implementation, mirroring a Noir `TestValueSynthesizer` entry: `match` selects the type and
|
|
130
|
+
* `scenarios` yields its [`Scenario`]s for `seed`, one per serialization shape, like the Noir entry's `scenarios`
|
|
131
|
+
* function.
|
|
113
132
|
*/
|
|
114
133
|
interface TestValueImpl {
|
|
115
134
|
match: (type: TypeMapping<any>) => boolean;
|
|
@@ -135,8 +154,27 @@ function collectionData(element: TypeMapping<any>, seed: number, length: number)
|
|
|
135
154
|
}
|
|
136
155
|
|
|
137
156
|
/**
|
|
138
|
-
* The
|
|
139
|
-
*
|
|
157
|
+
* The synthesized prop bag for a struct: each field's first scenario, seeded at the field's flat wire offset so the
|
|
158
|
+
* values depend on the wire layout rather than on how each side groups its fields. Mirrors the Noir reflected impls.
|
|
159
|
+
*/
|
|
160
|
+
function structValue(type: StructMapping, seed: number): Record<string, unknown> {
|
|
161
|
+
const value: Record<string, unknown> = {};
|
|
162
|
+
let offset = 0;
|
|
163
|
+
for (const field of type.fields) {
|
|
164
|
+
value[field.name] = firstValue(field.type, seed + offset);
|
|
165
|
+
const width = tryFieldWidth(field.type.shape);
|
|
166
|
+
if (width === undefined) {
|
|
167
|
+
// A variable-width field has no flat offset to seed the next field at, so only this oracle is unsynthesizable.
|
|
168
|
+
throw new UnsynthesizableTypeError(field.type, `struct field '${field.name}' has a variable-width shape`);
|
|
169
|
+
}
|
|
170
|
+
offset += width;
|
|
171
|
+
}
|
|
172
|
+
return value;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* The [`Scenario`]s for `type` at `seed`, one per serialization *shape*, mirroring the Noir `scenarios_for`
|
|
177
|
+
* dispatcher. Throws if the type has no matching impl.
|
|
140
178
|
*/
|
|
141
179
|
function scenariosForType(type: TypeMapping<any>, seed: number): Scenario[] {
|
|
142
180
|
const impl = TEST_VALUE_IMPLS.find(i => i.match(type));
|
|
@@ -152,8 +190,8 @@ function firstValue(type: TypeMapping<any>, seed: number): unknown {
|
|
|
152
190
|
}
|
|
153
191
|
|
|
154
192
|
class UnsynthesizableTypeError extends Error {
|
|
155
|
-
constructor(type: TypeMapping<any
|
|
156
|
-
super(`No test-value impl for type: ${JSON.stringify(Object.keys(type))}`);
|
|
193
|
+
constructor(type: TypeMapping<any>, detail?: string) {
|
|
194
|
+
super(detail ?? `No test-value impl for type: ${JSON.stringify(Object.keys(type))}`);
|
|
157
195
|
this.name = 'UnsynthesizableTypeError';
|
|
158
196
|
}
|
|
159
197
|
}
|
|
@@ -161,7 +199,7 @@ class UnsynthesizableTypeError extends Error {
|
|
|
161
199
|
/**
|
|
162
200
|
* Synthesizes the scenarios for one oracle by zipping every position's [`Scenario`] list to one case per test (a
|
|
163
201
|
* shorter list wraps around via mod), mirroring the Noir macro. Returns `undefined` if any param or return type is
|
|
164
|
-
* unsynthesizable (
|
|
202
|
+
* unsynthesizable (ephemeral arrays, structs with a variable-width field).
|
|
165
203
|
*/
|
|
166
204
|
function synthesizeScenarios(entry: OracleRegistryEntry): OracleTestScenario[] | undefined {
|
|
167
205
|
try {
|
|
@@ -206,14 +244,23 @@ function synthesizeScenariosOrThrow(entry: OracleRegistryEntry): OracleTestScena
|
|
|
206
244
|
}
|
|
207
245
|
|
|
208
246
|
/**
|
|
209
|
-
* The composite `TypeMapping`s (`ARRAY`/`BOUNDED_VEC`/`OPTION`),
|
|
210
|
-
* plus the inner mapping at construction; the registry
|
|
211
|
-
* recover the structure for recursion.
|
|
247
|
+
* The composite `TypeMapping`s (`ARRAY`/`BOUNDED_VEC`/`OPTION`/`STRUCT`/`FIXED_ARRAY`/`FIXED_BOUNDED_VEC`),
|
|
248
|
+
* discriminated by `kind`. The combinators attach `kind` plus the inner mapping(s) at construction; the registry
|
|
249
|
+
* erases params to the base `TypeMapping`, so the guards below recover the structure for recursion.
|
|
212
250
|
*/
|
|
213
251
|
type ArrayMapping = TypeMapping & { kind: 'array'; inner: TypeMapping };
|
|
214
252
|
type BoundedVecMapping = TypeMapping & { kind: 'bounded-vec'; inner: TypeMapping };
|
|
215
253
|
type OptionMapping = TypeMapping & { kind: 'option'; inner: TypeMapping };
|
|
216
|
-
type
|
|
254
|
+
type StructMapping = TypeMapping & { kind: 'struct'; fields: readonly StructField[] };
|
|
255
|
+
type FixedArrayMapping = TypeMapping & { kind: 'fixed-array'; inner: TypeMapping; length: number };
|
|
256
|
+
type FixedBoundedVecMapping = TypeMapping & { kind: 'fixed-bounded-vec'; inner: TypeMapping; maxLength: number };
|
|
257
|
+
type CompositeMapping =
|
|
258
|
+
| ArrayMapping
|
|
259
|
+
| BoundedVecMapping
|
|
260
|
+
| OptionMapping
|
|
261
|
+
| StructMapping
|
|
262
|
+
| FixedArrayMapping
|
|
263
|
+
| FixedBoundedVecMapping;
|
|
217
264
|
|
|
218
265
|
function isArray(type: TypeMapping<any>): type is ArrayMapping {
|
|
219
266
|
return 'kind' in type && type.kind === 'array';
|
|
@@ -224,3 +271,12 @@ function isBoundedVec(type: TypeMapping<any>): type is BoundedVecMapping {
|
|
|
224
271
|
function isOption(type: TypeMapping<any>): type is OptionMapping {
|
|
225
272
|
return 'kind' in type && type.kind === 'option';
|
|
226
273
|
}
|
|
274
|
+
function isStruct(type: TypeMapping<any>): type is StructMapping {
|
|
275
|
+
return 'kind' in type && type.kind === 'struct';
|
|
276
|
+
}
|
|
277
|
+
function isFixedArray(type: TypeMapping<any>): type is FixedArrayMapping {
|
|
278
|
+
return 'kind' in type && type.kind === 'fixed-array';
|
|
279
|
+
}
|
|
280
|
+
function isFixedBoundedVec(type: TypeMapping<any>): type is FixedBoundedVecMapping {
|
|
281
|
+
return 'kind' in type && type.kind === 'fixed-bounded-vec';
|
|
282
|
+
}
|
|
@@ -53,7 +53,7 @@ export class OracleTestResolver {
|
|
|
53
53
|
|
|
54
54
|
/**
|
|
55
55
|
* Builds a resolver whose fixtures are the default scenarios synthesized from the registry's type mappings. The
|
|
56
|
-
* matching Noir serialization tests are auto-generated by `#[
|
|
56
|
+
* matching Noir serialization tests are auto-generated by `#[generate_oracle_tests]` from the same convention.
|
|
57
57
|
*/
|
|
58
58
|
static fromRegistry(registry: Record<string, OracleRegistryEntry>, logger?: Logger): OracleTestResolver {
|
|
59
59
|
return new OracleTestResolver(registry, synthesizeDefaultFixtures(registry), logger);
|
|
@@ -179,6 +179,11 @@ function decodeScenarioName(inputs: ForeignCallArgs): string {
|
|
|
179
179
|
}
|
|
180
180
|
|
|
181
181
|
function valuesEqual(actual: unknown, expected: unknown): boolean {
|
|
182
|
+
if (!isNonNullObject(actual) || !isNonNullObject(expected)) {
|
|
183
|
+
// Primitive scalars; String() bridges bigint vs number representations of the same seed. A primitive compared
|
|
184
|
+
// against an object is never equal.
|
|
185
|
+
return isNonNullObject(actual) === isNonNullObject(expected) && String(actual) === String(expected);
|
|
186
|
+
}
|
|
182
187
|
if (actual instanceof Option && expected instanceof Option) {
|
|
183
188
|
return actual.equals(expected, valuesEqual);
|
|
184
189
|
}
|
|
@@ -188,7 +193,49 @@ function valuesEqual(actual: unknown, expected: unknown): boolean {
|
|
|
188
193
|
if (Array.isArray(actual) && Array.isArray(expected)) {
|
|
189
194
|
return actual.length === expected.length && actual.every((v, i) => valuesEqual(v, expected[i]));
|
|
190
195
|
}
|
|
191
|
-
|
|
196
|
+
if (isPlainObject(actual) && isPlainObject(expected)) {
|
|
197
|
+
const expectedKeys = Object.keys(expected);
|
|
198
|
+
return (
|
|
199
|
+
Object.keys(actual).length === expectedKeys.length &&
|
|
200
|
+
expectedKeys.every(key => valuesEqual(actual[key], expected[key]))
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
if (actual.constructor !== expected.constructor) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
if (hasEquals(actual)) {
|
|
207
|
+
return actual.equals(expected);
|
|
208
|
+
}
|
|
209
|
+
const actualStr = customStringForm(actual);
|
|
210
|
+
const expectedStr = customStringForm(expected);
|
|
211
|
+
if (actualStr !== undefined && expectedStr !== undefined) {
|
|
212
|
+
return actualStr === expectedStr;
|
|
213
|
+
}
|
|
214
|
+
// Comparing blindly here could pass vacuously (e.g. two '[object Object]' strings), so refuse instead.
|
|
215
|
+
throw new Error(
|
|
216
|
+
`valuesEqual cannot compare a '${actual.constructor?.name}' against a '${expected.constructor?.name}'. Add a branch for the type.`,
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function isNonNullObject(value: unknown): value is object {
|
|
221
|
+
return typeof value === 'object' && value !== null;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
225
|
+
return isNonNullObject(value) && value.constructor === Object;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function hasEquals(value: object): value is { equals(other: unknown): boolean } {
|
|
229
|
+
return typeof (value as { equals?: unknown }).equals === 'function';
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** The value's string form when its class overrides `toString` (a meaningful representation), undefined otherwise. */
|
|
233
|
+
function customStringForm(value: object): string | undefined {
|
|
234
|
+
const { toString } = value;
|
|
235
|
+
if (typeof toString !== 'function' || toString === Object.prototype.toString) {
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
return toString.call(value);
|
|
192
239
|
}
|
|
193
240
|
|
|
194
241
|
function versionBumpHint(oracle: string): string {
|
|
@@ -5,7 +5,7 @@ import type { ContractStore } from '@aztec/pxe/server';
|
|
|
5
5
|
import { PublicDataWrite } from '@aztec/stdlib/avm';
|
|
6
6
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
7
7
|
import type { L2Block } from '@aztec/stdlib/block';
|
|
8
|
-
import type {
|
|
8
|
+
import type { ContractInstancePreimageWithAddress } from '@aztec/stdlib/contract';
|
|
9
9
|
import { computePublicDataTreeLeafSlot, siloNoteHash, siloNullifier } from '@aztec/stdlib/hash';
|
|
10
10
|
import {
|
|
11
11
|
MerkleTreeId,
|
|
@@ -125,34 +125,36 @@ export class TXEOraclePublicContext implements IAvmExecutionOracle {
|
|
|
125
125
|
return value;
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
getContractInstanceDeployer(address: AztecAddress): Promise<{ member: Fr; exists: boolean }> {
|
|
128
|
+
getContractInstanceDeployer(address: AztecAddress): Promise<{ member: Fr; exists: boolean }[]> {
|
|
129
129
|
return this.getContractInstanceMember(address, i => i.deployer.toField());
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
getContractInstanceClassId(address: AztecAddress): Promise<{ member: Fr; exists: boolean }> {
|
|
133
|
-
|
|
132
|
+
getContractInstanceClassId(address: AztecAddress): Promise<{ member: Fr; exists: boolean }[]> {
|
|
133
|
+
// TXE has no contract updates, so the current class always equals the original.
|
|
134
|
+
return this.getContractInstanceMember(address, i => i.originalContractClassId);
|
|
134
135
|
}
|
|
135
136
|
|
|
136
|
-
getContractInstanceInitializationHash(address: AztecAddress): Promise<{ member: Fr; exists: boolean }> {
|
|
137
|
+
getContractInstanceInitializationHash(address: AztecAddress): Promise<{ member: Fr; exists: boolean }[]> {
|
|
137
138
|
return this.getContractInstanceMember(address, i => i.initializationHash);
|
|
138
139
|
}
|
|
139
140
|
|
|
140
|
-
getContractInstanceImmutablesHash(address: AztecAddress): Promise<{ member: Fr; exists: boolean }> {
|
|
141
|
+
getContractInstanceImmutablesHash(address: AztecAddress): Promise<{ member: Fr; exists: boolean }[]> {
|
|
141
142
|
return this.getContractInstanceMember(address, i => i.immutablesHash);
|
|
142
143
|
}
|
|
143
144
|
|
|
145
|
+
// The one-element array mirrors the oracles' Noir return type, `[GetContractInstanceResult; 1]`.
|
|
144
146
|
private async getContractInstanceMember(
|
|
145
147
|
address: AztecAddress,
|
|
146
|
-
accessor: (instance:
|
|
147
|
-
): Promise<{ member: Fr; exists: boolean }> {
|
|
148
|
+
accessor: (instance: ContractInstancePreimageWithAddress) => Fr,
|
|
149
|
+
): Promise<{ member: Fr; exists: boolean }[]> {
|
|
148
150
|
const instance = await this.contractStore.getContractInstance(address);
|
|
149
151
|
if (!instance) {
|
|
150
|
-
return { member: Fr.ZERO, exists: false };
|
|
152
|
+
return [{ member: Fr.ZERO, exists: false }];
|
|
151
153
|
}
|
|
152
|
-
return { member: accessor(instance), exists: true };
|
|
154
|
+
return [{ member: accessor(instance), exists: true }];
|
|
153
155
|
}
|
|
154
156
|
|
|
155
|
-
returndataSize(): Promise<
|
|
157
|
+
returndataSize(): Promise<number> {
|
|
156
158
|
throw new Error(
|
|
157
159
|
'Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead',
|
|
158
160
|
);
|
|
@@ -19,17 +19,21 @@ import {
|
|
|
19
19
|
BOOL,
|
|
20
20
|
ETH_ADDRESS,
|
|
21
21
|
FIELD,
|
|
22
|
+
FIXED_ARRAY,
|
|
22
23
|
FUNCTION_SELECTOR,
|
|
23
24
|
type InputSlot,
|
|
24
25
|
type MaybePromise,
|
|
25
26
|
OPTION,
|
|
26
27
|
ORACLE_REGISTRY,
|
|
27
28
|
type OracleRegistryEntry,
|
|
29
|
+
type OutputSlot,
|
|
28
30
|
type ParamTypes,
|
|
29
31
|
STR,
|
|
32
|
+
STRUCT,
|
|
30
33
|
type SlotShape,
|
|
31
34
|
type TypeMapping,
|
|
32
35
|
U32,
|
|
36
|
+
buildACIRCallback,
|
|
33
37
|
makeEntry,
|
|
34
38
|
} from '@aztec/pxe/simulator';
|
|
35
39
|
import { EventSelector } from '@aztec/stdlib/abi';
|
|
@@ -63,11 +67,12 @@ const GAS_SETTINGS: TypeMapping<GasSettings> = {
|
|
|
63
67
|
};
|
|
64
68
|
|
|
65
69
|
// Tagging secret strategy discriminants. Must match the Noir test helper `TaggingSecretStrategy` in
|
|
66
|
-
// aztec-nr `test/helpers/tagging_secret_strategy.nr`. This is a test-only oracle (only `
|
|
70
|
+
// aztec-nr `test/helpers/tagging_secret_strategy.nr`. This is a test-only oracle (only `set_tagging_secret_strategies`
|
|
67
71
|
// reads it), so the mapping lives here on the TXE side rather than in the production oracle type mappings.
|
|
68
72
|
const STRATEGY_NON_INTERACTIVE_HANDSHAKE = 1;
|
|
69
73
|
const STRATEGY_ARBITRARY_SECRET = 2;
|
|
70
74
|
const STRATEGY_ADDRESS_DERIVED = 3;
|
|
75
|
+
const STRATEGY_INTERACTIVE_HANDSHAKE = 4;
|
|
71
76
|
|
|
72
77
|
const TAGGING_SECRET_STRATEGY: TypeMapping<TaggingSecretStrategy> = {
|
|
73
78
|
serialization: {
|
|
@@ -75,6 +80,8 @@ const TAGGING_SECRET_STRATEGY: TypeMapping<TaggingSecretStrategy> = {
|
|
|
75
80
|
switch (strategy.type) {
|
|
76
81
|
case 'non-interactive-handshake':
|
|
77
82
|
return [new Fr(STRATEGY_NON_INTERACTIVE_HANDSHAKE), Fr.ZERO, Fr.ZERO];
|
|
83
|
+
case 'interactive-handshake':
|
|
84
|
+
return [new Fr(STRATEGY_INTERACTIVE_HANDSHAKE), Fr.ZERO, Fr.ZERO];
|
|
78
85
|
case 'address-derived':
|
|
79
86
|
return [new Fr(STRATEGY_ADDRESS_DERIVED), Fr.ZERO, Fr.ZERO];
|
|
80
87
|
case 'arbitrary-secret':
|
|
@@ -89,6 +96,8 @@ const TAGGING_SECRET_STRATEGY: TypeMapping<TaggingSecretStrategy> = {
|
|
|
89
96
|
switch (kind) {
|
|
90
97
|
case STRATEGY_NON_INTERACTIVE_HANDSHAKE:
|
|
91
98
|
return { type: 'non-interactive-handshake' };
|
|
99
|
+
case STRATEGY_INTERACTIVE_HANDSHAKE:
|
|
100
|
+
return { type: 'interactive-handshake' };
|
|
92
101
|
case STRATEGY_ADDRESS_DERIVED:
|
|
93
102
|
return { type: 'address-derived' };
|
|
94
103
|
case STRATEGY_ARBITRARY_SECRET:
|
|
@@ -191,10 +200,13 @@ const TXE_CALL_CONTEXT: TypeMapping<{ txHash: Fr; anchorBlockTimestamp: bigint }
|
|
|
191
200
|
shape: ['scalar', 'scalar', 'scalar'], // discriminant, txHash, anchor block timestamp
|
|
192
201
|
};
|
|
193
202
|
|
|
194
|
-
const CONTRACT_INSTANCE_MEMBER: TypeMapping<{
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}
|
|
203
|
+
const CONTRACT_INSTANCE_MEMBER: TypeMapping<{ exists: boolean; member: Fr }[]> = FIXED_ARRAY(
|
|
204
|
+
STRUCT([
|
|
205
|
+
{ name: 'exists', type: BOOL },
|
|
206
|
+
{ name: 'member', type: FIELD },
|
|
207
|
+
]),
|
|
208
|
+
1,
|
|
209
|
+
);
|
|
198
210
|
|
|
199
211
|
const EVENT_SELECTOR: TypeMapping<EventSelector> = {
|
|
200
212
|
serialization: { fn: v => [v.toField()] },
|
|
@@ -308,8 +320,11 @@ export const TXE_ORACLE_REGISTRY = {
|
|
|
308
320
|
returnType: FIELD,
|
|
309
321
|
}),
|
|
310
322
|
|
|
311
|
-
|
|
312
|
-
params: [
|
|
323
|
+
aztec_txe_setTaggingSecretStrategies: makeEntry({
|
|
324
|
+
params: [
|
|
325
|
+
{ name: 'unconstrainedStrategy', type: OPTION(TAGGING_SECRET_STRATEGY) },
|
|
326
|
+
{ name: 'constrainedStrategy', type: OPTION(TAGGING_SECRET_STRATEGY) },
|
|
327
|
+
],
|
|
313
328
|
}),
|
|
314
329
|
|
|
315
330
|
aztec_txe_getLastBlockTimestamp: makeEntry({
|
|
@@ -412,7 +427,7 @@ export const TXE_ORACLE_REGISTRY = {
|
|
|
412
427
|
params: [{ name: 'message', type: ARRAY(FIELD) }],
|
|
413
428
|
}),
|
|
414
429
|
|
|
415
|
-
aztec_avm_returndataSize: makeEntry({ returnType:
|
|
430
|
+
aztec_avm_returndataSize: makeEntry({ returnType: U32 }),
|
|
416
431
|
|
|
417
432
|
aztec_avm_returndataCopy: makeEntry({
|
|
418
433
|
params: [
|
|
@@ -487,7 +502,37 @@ export async function callTxeHandler<K extends keyof typeof TXE_ORACLE_REGISTRY>
|
|
|
487
502
|
const named = entry.deserializeParams(toInputSlots(inputs));
|
|
488
503
|
const positional = named.map((p: { value: unknown }) => p.value);
|
|
489
504
|
const result = await handler(positional as any);
|
|
490
|
-
|
|
505
|
+
return outputSlotsToForeignCallResult(entry.serializeReturn(result));
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Dispatches an oracle that has been retired into the PXE legacy registry. TXE has no explicit handler method for such
|
|
510
|
+
* names; this runs them through the same `buildACIRCallback` legacy path that contract execution already uses, so
|
|
511
|
+
* TXE's top-level oracle path and its in-contract path treat the legacy registry identically.
|
|
512
|
+
*/
|
|
513
|
+
const legacyCallbacksByHandler = new WeakMap<object, ReturnType<typeof buildACIRCallback>>();
|
|
514
|
+
|
|
515
|
+
export async function callTxeLegacyHandler(
|
|
516
|
+
oracle: string,
|
|
517
|
+
inputs: ForeignCallArgs,
|
|
518
|
+
oracleHandler: Parameters<typeof buildACIRCallback>[0],
|
|
519
|
+
): Promise<ForeignCallResult> {
|
|
520
|
+
// `buildACIRCallback` materializes the whole real+legacy closure set, so memoize it per handler rather than
|
|
521
|
+
// rebuilding on every call (TXE routes one legacy oracle through here on each top-level discovery).
|
|
522
|
+
let callback = legacyCallbacksByHandler.get(oracleHandler);
|
|
523
|
+
if (!callback) {
|
|
524
|
+
callback = buildACIRCallback(oracleHandler);
|
|
525
|
+
legacyCallbacksByHandler.set(oracleHandler, callback);
|
|
526
|
+
}
|
|
527
|
+
const outputSlots = await callback[oracle](...toInputSlots(inputs));
|
|
528
|
+
return outputSlotsToForeignCallResult(outputSlots);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* Strips the `0x` prefix from each serialized output slot (TXE foreign calls use bare hex strings) and wraps them in a
|
|
533
|
+
* `ForeignCallResult`.
|
|
534
|
+
*/
|
|
535
|
+
function outputSlotsToForeignCallResult(outputSlots: OutputSlot[]): ForeignCallResult {
|
|
491
536
|
return {
|
|
492
537
|
values: outputSlots.map(slot => (Array.isArray(slot) ? slot.map(withoutHexPrefix) : withoutHexPrefix(slot))),
|
|
493
538
|
};
|