@aztec/txe 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2
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/bin/index.js +3 -5
- package/dest/index.js +112 -64
- package/dest/node/txe_node.js +292 -338
- package/dest/oracle/txe_oracle.js +208 -147
- package/dest/txe_service/txe_service.js +194 -118
- package/dest/util/encoding.js +16 -7
- package/dest/util/expected_failure_error.js +1 -2
- package/dest/util/txe_database.js +5 -9
- package/dest/util/txe_public_contract_data_source.js +21 -12
- package/dest/util/txe_world_state_db.js +7 -8
- package/package.json +14 -15
- package/src/index.ts +109 -35
- package/src/node/txe_node.ts +4 -0
- package/src/oracle/txe_oracle.ts +8 -29
- package/src/txe_service/txe_service.ts +14 -46
- package/src/util/encoding.ts +3 -3
- package/dest/bin/index.d.ts +0 -3
- package/dest/bin/index.d.ts.map +0 -1
- package/dest/index.d.ts +0 -8
- package/dest/index.d.ts.map +0 -1
- package/dest/node/txe_node.d.ts +0 -354
- package/dest/node/txe_node.d.ts.map +0 -1
- package/dest/oracle/txe_oracle.d.ts +0 -132
- package/dest/oracle/txe_oracle.d.ts.map +0 -1
- package/dest/txe_service/txe_service.d.ts +0 -204
- package/dest/txe_service/txe_service.d.ts.map +0 -1
- package/dest/util/encoding.d.ts +0 -29
- package/dest/util/encoding.d.ts.map +0 -1
- package/dest/util/expected_failure_error.d.ts +0 -4
- package/dest/util/expected_failure_error.d.ts.map +0 -1
- package/dest/util/txe_database.d.ts +0 -10
- package/dest/util/txe_database.d.ts.map +0 -1
- package/dest/util/txe_public_contract_data_source.d.ts +0 -18
- package/dest/util/txe_public_contract_data_source.d.ts.map +0 -1
- package/dest/util/txe_world_state_db.d.ts +0 -16
- package/dest/util/txe_world_state_db.d.ts.map +0 -1
package/dest/util/encoding.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AztecAddress } from '@aztec/circuits.js';
|
|
1
|
+
import { AztecAddress, ContractInstanceWithAddressSchema } from '@aztec/circuits.js';
|
|
2
2
|
import { ContractArtifactSchema } from '@aztec/foundation/abi';
|
|
3
3
|
import { Fr } from '@aztec/foundation/fields';
|
|
4
4
|
import { hexToBuffer } from '@aztec/foundation/string';
|
|
@@ -10,21 +10,30 @@ export function addressFromSingle(obj) {
|
|
|
10
10
|
return new AztecAddress(fromSingle(obj));
|
|
11
11
|
}
|
|
12
12
|
export function fromArray(obj) {
|
|
13
|
-
return obj.map(str
|
|
13
|
+
return obj.map((str)=>Fr.fromBuffer(hexToBuffer(str)));
|
|
14
14
|
}
|
|
15
15
|
export function toSingle(obj) {
|
|
16
16
|
return obj.toString().slice(2);
|
|
17
17
|
}
|
|
18
18
|
export function toArray(objs) {
|
|
19
|
-
return objs.map(obj
|
|
19
|
+
return objs.map((obj)=>obj.toString());
|
|
20
20
|
}
|
|
21
21
|
export function toForeignCallResult(obj) {
|
|
22
|
-
return {
|
|
22
|
+
return {
|
|
23
|
+
values: obj
|
|
24
|
+
};
|
|
23
25
|
}
|
|
24
26
|
export const ForeignCallSingleSchema = z.string();
|
|
25
27
|
export const ForeignCallArraySchema = z.array(z.string());
|
|
26
|
-
export const ForeignCallArgsSchema = z.array(z.union([
|
|
28
|
+
export const ForeignCallArgsSchema = z.array(z.union([
|
|
29
|
+
ForeignCallSingleSchema,
|
|
30
|
+
ForeignCallArraySchema,
|
|
31
|
+
ContractArtifactSchema,
|
|
32
|
+
ContractInstanceWithAddressSchema
|
|
33
|
+
]));
|
|
27
34
|
export const ForeignCallResultSchema = z.object({
|
|
28
|
-
values: z.array(z.union([
|
|
35
|
+
values: z.array(z.union([
|
|
36
|
+
ForeignCallSingleSchema,
|
|
37
|
+
ForeignCallArraySchema
|
|
38
|
+
]))
|
|
29
39
|
});
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC9lbmNvZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUF5QixzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkQsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQVl4QixNQUFNLFVBQVUsVUFBVSxDQUFDLEdBQXNCO0lBQy9DLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsR0FBc0I7SUFDdEQsT0FBTyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFxQjtJQUM3QyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVELE1BQU0sVUFBVSxRQUFRLENBQUMsR0FBc0I7SUFDN0MsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCxNQUFNLFVBQVUsT0FBTyxDQUFDLElBQVU7SUFDaEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxHQUE2QztJQUMvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFFbEQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUUxRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUMxQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsdUJBQXVCLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxDQUNuRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM5QyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsdUJBQXVCLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO0NBQzVFLENBQUMsQ0FBQyJ9
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export class ExpectedFailureError extends Error {
|
|
2
|
-
constructor(message)
|
|
2
|
+
constructor(message){
|
|
3
3
|
super(message);
|
|
4
4
|
}
|
|
5
5
|
}
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZWN0ZWRfZmFpbHVyZV9lcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2V4cGVjdGVkX2ZhaWx1cmVfZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLG9CQUFxQixTQUFRLEtBQUs7SUFDN0MsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQixDQUFDO0NBQ0YifQ==
|
|
@@ -1,24 +1,20 @@
|
|
|
1
|
-
var _TXEDatabase_accounts;
|
|
2
|
-
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
1
|
import { CompleteAddress } from '@aztec/circuits.js';
|
|
4
2
|
import { KVPxeDatabase } from '@aztec/pxe';
|
|
5
3
|
export class TXEDatabase extends KVPxeDatabase {
|
|
6
|
-
|
|
4
|
+
#accounts;
|
|
5
|
+
constructor(db){
|
|
7
6
|
super(db);
|
|
8
|
-
|
|
9
|
-
__classPrivateFieldSet(this, _TXEDatabase_accounts, db.openMap('accounts'), "f");
|
|
7
|
+
this.#accounts = db.openMap('accounts');
|
|
10
8
|
}
|
|
11
9
|
async getAccount(key) {
|
|
12
|
-
const completeAddress = await
|
|
10
|
+
const completeAddress = await this.#accounts.getAsync(key.toString());
|
|
13
11
|
if (!completeAddress) {
|
|
14
12
|
throw new Error(`Account not found: ${key.toString()}`);
|
|
15
13
|
}
|
|
16
14
|
return CompleteAddress.fromBuffer(completeAddress);
|
|
17
15
|
}
|
|
18
16
|
async setAccount(key, value) {
|
|
19
|
-
await
|
|
17
|
+
await this.#accounts.set(key.toString(), value.toBuffer());
|
|
20
18
|
await this.addCompleteAddress(value);
|
|
21
19
|
}
|
|
22
20
|
}
|
|
23
|
-
_TXEDatabase_accounts = new WeakMap();
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX2RhdGFiYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWwvdHhlX2RhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFxQixlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTNDLE1BQU0sT0FBTyxXQUFZLFNBQVEsYUFBYTtJQUc1QyxZQUFZLEVBQXFCO1FBQy9CLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUhaLHdDQUF5QztRQUl2Qyx1QkFBQSxJQUFJLHlCQUFhLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQUEsQ0FBQztJQUMxQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFpQjtRQUNoQyxNQUFNLGVBQWUsR0FBRyxNQUFNLHVCQUFBLElBQUksNkJBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELE9BQU8sZUFBZSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFpQixFQUFFLEtBQXNCO1FBQ3hELE1BQU0sdUJBQUEsSUFBSSw2QkFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDM0QsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGIn0=
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Fr, FunctionSelector, PUBLIC_DISPATCH_SELECTOR, computePublicBytecodeCommitment
|
|
1
|
+
import { Fr, FunctionSelector, PUBLIC_DISPATCH_SELECTOR, computePublicBytecodeCommitment } from '@aztec/circuits.js';
|
|
2
2
|
import { PrivateFunctionsTree } from '@aztec/pxe';
|
|
3
3
|
export class TXEPublicContractDataSource {
|
|
4
|
-
|
|
4
|
+
txeOracle;
|
|
5
|
+
constructor(txeOracle){
|
|
5
6
|
this.txeOracle = txeOracle;
|
|
6
7
|
}
|
|
7
8
|
async getPublicFunction(address, selector) {
|
|
@@ -9,7 +10,10 @@ export class TXEPublicContractDataSource {
|
|
|
9
10
|
if (!bytecode) {
|
|
10
11
|
return undefined;
|
|
11
12
|
}
|
|
12
|
-
return {
|
|
13
|
+
return {
|
|
14
|
+
bytecode,
|
|
15
|
+
selector
|
|
16
|
+
};
|
|
13
17
|
}
|
|
14
18
|
getBlockNumber() {
|
|
15
19
|
return this.txeOracle.getBlockNumber();
|
|
@@ -23,7 +27,7 @@ export class TXEPublicContractDataSource {
|
|
|
23
27
|
if (contractClass.packedBytecode.length > 0) {
|
|
24
28
|
publicFunctions.push({
|
|
25
29
|
selector: FunctionSelector.fromField(new Fr(PUBLIC_DISPATCH_SELECTOR)),
|
|
26
|
-
bytecode: contractClass.packedBytecode
|
|
30
|
+
bytecode: contractClass.packedBytecode
|
|
27
31
|
});
|
|
28
32
|
}
|
|
29
33
|
return {
|
|
@@ -34,7 +38,7 @@ export class TXEPublicContractDataSource {
|
|
|
34
38
|
privateFunctionsRoot: new Fr(privateFunctionsRoot.root),
|
|
35
39
|
version: contractClass.version,
|
|
36
40
|
privateFunctions: [],
|
|
37
|
-
unconstrainedFunctions: []
|
|
41
|
+
unconstrainedFunctions: []
|
|
38
42
|
};
|
|
39
43
|
}
|
|
40
44
|
async getBytecodeCommitment(id) {
|
|
@@ -43,7 +47,10 @@ export class TXEPublicContractDataSource {
|
|
|
43
47
|
}
|
|
44
48
|
async getContract(address) {
|
|
45
49
|
const instance = await this.txeOracle.getContractDataOracle().getContractInstance(address);
|
|
46
|
-
return {
|
|
50
|
+
return {
|
|
51
|
+
...instance,
|
|
52
|
+
address
|
|
53
|
+
};
|
|
47
54
|
}
|
|
48
55
|
getContractClassIds() {
|
|
49
56
|
throw new Error('Method not implemented.');
|
|
@@ -57,11 +64,14 @@ export class TXEPublicContractDataSource {
|
|
|
57
64
|
if (!artifact) {
|
|
58
65
|
return undefined;
|
|
59
66
|
}
|
|
60
|
-
const functionSelectorsAndNames = await Promise.all(artifact.functions.map(async (f)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
67
|
+
const functionSelectorsAndNames = await Promise.all(artifact.functions.map(async (f)=>({
|
|
68
|
+
name: f.name,
|
|
69
|
+
selector: await FunctionSelector.fromNameAndParameters({
|
|
70
|
+
name: f.name,
|
|
71
|
+
parameters: f.parameters
|
|
72
|
+
})
|
|
73
|
+
})));
|
|
74
|
+
const func = functionSelectorsAndNames.find((f)=>f.selector.equals(selector));
|
|
65
75
|
return Promise.resolve(func?.name);
|
|
66
76
|
}
|
|
67
77
|
registerContractFunctionSignatures(_address, _signatures) {
|
|
@@ -73,4 +83,3 @@ export class TXEPublicContractDataSource {
|
|
|
73
83
|
return Promise.resolve();
|
|
74
84
|
}
|
|
75
85
|
}
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX3B1YmxpY19jb250cmFjdF9kYXRhX3NvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3R4ZV9wdWJsaWNfY29udHJhY3RfZGF0YV9zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUtMLEVBQUUsRUFDRixnQkFBZ0IsRUFDaEIsd0JBQXdCLEVBRXhCLCtCQUErQixHQUNoQyxNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUlsRCxNQUFNLE9BQU8sMkJBQTJCO0lBQ3RDLFlBQW9CLFNBQWM7UUFBZCxjQUFTLEdBQVQsU0FBUyxDQUFLO0lBQUcsQ0FBQztJQUV0QyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBcUIsRUFBRSxRQUEwQjtRQUN2RSxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBTTtRQUMzQixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4RixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RixN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
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
import { MerkleTreeId } from '@aztec/circuit-types';
|
|
2
|
-
import { Fr, PublicDataWrite
|
|
2
|
+
import { Fr, PublicDataWrite } from '@aztec/circuits.js';
|
|
3
3
|
import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
|
|
4
4
|
import { WorldStateDB } from '@aztec/simulator/server';
|
|
5
5
|
export class TXEWorldStateDB extends WorldStateDB {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
this.txe = txe;
|
|
6
|
+
merkleDb;
|
|
7
|
+
txe;
|
|
8
|
+
constructor(merkleDb, dataSource, txe){
|
|
9
|
+
super(merkleDb, dataSource), this.merkleDb = merkleDb, this.txe = txe;
|
|
10
10
|
}
|
|
11
11
|
async storageRead(contract, slot) {
|
|
12
12
|
const leafSlot = (await computePublicDataTreeLeafSlot(contract, slot)).toBigInt();
|
|
13
13
|
const lowLeafResult = await this.merkleDb.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot);
|
|
14
14
|
let value = Fr.ZERO;
|
|
15
15
|
if (lowLeafResult && lowLeafResult.alreadyPresent) {
|
|
16
|
-
const preimage =
|
|
16
|
+
const preimage = await this.merkleDb.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
|
|
17
17
|
value = preimage.value;
|
|
18
18
|
}
|
|
19
19
|
return value;
|
|
20
20
|
}
|
|
21
21
|
async storageWrite(contract, slot, newValue) {
|
|
22
22
|
await this.txe.addPublicDataWrites([
|
|
23
|
-
new PublicDataWrite(await computePublicDataTreeLeafSlot(contract, slot), newValue)
|
|
23
|
+
new PublicDataWrite(await computePublicDataTreeLeafSlot(contract, slot), newValue)
|
|
24
24
|
]);
|
|
25
25
|
return newValue.toBigInt();
|
|
26
26
|
}
|
|
@@ -37,4 +37,3 @@ export class TXEWorldStateDB extends WorldStateDB {
|
|
|
37
37
|
throw new Error('Cannot rollback');
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX3dvcmxkX3N0YXRlX2RiLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWwvdHhlX3dvcmxkX3N0YXRlX2RiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQWtDLE1BQU0sc0JBQXNCLENBQUM7QUFDcEYsT0FBTyxFQUdMLEVBQUUsRUFFRixlQUFlLEdBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXZELE1BQU0sT0FBTyxlQUFnQixTQUFRLFlBQVk7SUFDL0MsWUFBb0IsUUFBbUMsRUFBRSxVQUE4QixFQUFVLEdBQVE7UUFDdkcsS0FBSyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQURWLGFBQVEsR0FBUixRQUFRLENBQTJCO1FBQTBDLFFBQUcsR0FBSCxHQUFHLENBQUs7SUFFekcsQ0FBQztJQUVRLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBc0IsRUFBRSxJQUFRO1FBQ3pELE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBTSw2QkFBNkIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVsRixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXpHLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDcEIsSUFBSSxhQUFhLElBQUksYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xELE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FDbkQsWUFBWSxDQUFDLGdCQUFnQixFQUM3QixhQUFhLENBQUMsS0FBSyxDQUNwQixDQUErQixDQUFDO1lBQ2pDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFUSxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQXNCLEVBQUUsSUFBUSxFQUFFLFFBQVk7UUFDeEUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDO1lBQ2pDLElBQUksZUFBZSxDQUFDLE1BQU0sNkJBQTZCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQztTQUNuRixDQUFDLENBQUM7UUFFSCxPQUFPLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRVEsVUFBVTtRQUNqQixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ1Esb0JBQW9CO1FBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ1EsTUFBTTtRQUNiLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFDUSxnQkFBZ0I7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Q0FDRiJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/txe",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"bin": "./dest/bin/index.js",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
18
18
|
"formatting": "run -T prettier --check ./src && run -T eslint ./src",
|
|
19
19
|
"formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
|
|
20
|
-
"test": "
|
|
20
|
+
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}",
|
|
21
21
|
"dev": "LOG_LEVEL=debug node ./dest/bin/index.js",
|
|
22
22
|
"start": "node --no-warnings ./dest/bin/index.js"
|
|
23
23
|
},
|
|
@@ -59,19 +59,18 @@
|
|
|
59
59
|
]
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@aztec/accounts": "0.
|
|
63
|
-
"@aztec/aztec.js": "0.
|
|
64
|
-
"@aztec/circuit-types": "0.
|
|
65
|
-
"@aztec/circuits.js": "0.
|
|
66
|
-
"@aztec/foundation": "0.
|
|
67
|
-
"@aztec/key-store": "0.
|
|
68
|
-
"@aztec/kv-store": "0.
|
|
69
|
-
"@aztec/protocol-contracts": "0.
|
|
70
|
-
"@aztec/pxe": "0.
|
|
71
|
-
"@aztec/simulator": "0.
|
|
72
|
-
"@aztec/
|
|
73
|
-
"@aztec/
|
|
74
|
-
"@aztec/world-state": "0.74.0",
|
|
62
|
+
"@aztec/accounts": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
63
|
+
"@aztec/aztec.js": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
64
|
+
"@aztec/circuit-types": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
65
|
+
"@aztec/circuits.js": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
66
|
+
"@aztec/foundation": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
67
|
+
"@aztec/key-store": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
68
|
+
"@aztec/kv-store": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
69
|
+
"@aztec/protocol-contracts": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
70
|
+
"@aztec/pxe": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
71
|
+
"@aztec/simulator": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
72
|
+
"@aztec/types": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
73
|
+
"@aztec/world-state": "0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2",
|
|
75
74
|
"zod": "^3.23.8"
|
|
76
75
|
},
|
|
77
76
|
"devDependencies": {
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SchnorrAccountContractArtifact } from '@aztec/accounts/schnorr';
|
|
2
|
+
import {
|
|
3
|
+
AztecAddress,
|
|
4
|
+
type ContractArtifact,
|
|
5
|
+
type ContractInstanceWithAddress,
|
|
6
|
+
Fr,
|
|
7
|
+
PublicKeys,
|
|
8
|
+
deriveKeys,
|
|
9
|
+
getContractInstanceFromDeployParams,
|
|
10
|
+
loadContractArtifact,
|
|
11
|
+
} from '@aztec/aztec.js';
|
|
12
|
+
import { createSafeJsonRpcServer } from '@aztec/foundation/json-rpc/server';
|
|
2
13
|
import { type Logger } from '@aztec/foundation/log';
|
|
3
14
|
import { type ApiSchemaFor, type ZodFor } from '@aztec/foundation/schemas';
|
|
4
|
-
import { createTracedJsonRpcServer } from '@aztec/telemetry-client';
|
|
5
15
|
|
|
6
16
|
import { readFile, readdir } from 'fs/promises';
|
|
7
17
|
import { join } from 'path';
|
|
@@ -14,12 +24,16 @@ import {
|
|
|
14
24
|
type ForeignCallArray,
|
|
15
25
|
type ForeignCallResult,
|
|
16
26
|
ForeignCallResultSchema,
|
|
27
|
+
type ForeignCallSingle,
|
|
17
28
|
fromArray,
|
|
29
|
+
fromSingle,
|
|
18
30
|
toForeignCallResult,
|
|
19
31
|
} from './util/encoding.js';
|
|
20
32
|
|
|
21
33
|
const TXESessions = new Map<number, TXEService>();
|
|
22
34
|
|
|
35
|
+
const TXEArtifactsCache = new Map<string, { artifact: ContractArtifact; instance: ContractInstanceWithAddress }>();
|
|
36
|
+
|
|
23
37
|
type MethodNames<T> = {
|
|
24
38
|
[K in keyof T]: T[K] extends (...args: any[]) => any ? K : never;
|
|
25
39
|
}[keyof T];
|
|
@@ -47,36 +61,94 @@ class TXEDispatcher {
|
|
|
47
61
|
constructor(private logger: Logger) {}
|
|
48
62
|
|
|
49
63
|
async #processDeployInputs({ inputs, root_path: rootPath, package_name: packageName }: TXEForeignCallInput) {
|
|
50
|
-
const pathStr =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
64
|
+
const [pathStr, contractName, initializer] = inputs.slice(0, 3).map(input =>
|
|
65
|
+
fromArray(input as ForeignCallArray)
|
|
66
|
+
.map(char => String.fromCharCode(char.toNumber()))
|
|
67
|
+
.join(''),
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
const decodedArgs = fromArray(inputs[4] as ForeignCallArray);
|
|
71
|
+
const publicKeysHashFr = fromSingle(inputs[5] as ForeignCallSingle);
|
|
72
|
+
|
|
73
|
+
const cacheKey = `${pathStr}-${contractName}-${initializer}-${decodedArgs
|
|
74
|
+
.map(arg => arg.toString())
|
|
75
|
+
.join('-')}-${publicKeysHashFr}`;
|
|
76
|
+
|
|
77
|
+
let artifact;
|
|
78
|
+
let instance;
|
|
79
|
+
|
|
80
|
+
if (TXEArtifactsCache.has(cacheKey)) {
|
|
81
|
+
this.logger.debug(`Using cached artifact for ${cacheKey}`);
|
|
82
|
+
({ artifact, instance } = TXEArtifactsCache.get(cacheKey)!);
|
|
61
83
|
} else {
|
|
62
|
-
|
|
63
|
-
//
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
this.logger.debug(`Looking for compiled artifact in workspace ${targetPath}`);
|
|
68
|
-
artifactPath = join(targetPath, `${pkg}-${contractName}.json`);
|
|
84
|
+
let artifactPath = '';
|
|
85
|
+
// We're deploying the contract under test
|
|
86
|
+
// env.deploy_self("contractName")
|
|
87
|
+
if (!pathStr) {
|
|
88
|
+
artifactPath = join(rootPath, './target', `${packageName}-${contractName}.json`);
|
|
69
89
|
} else {
|
|
70
|
-
// We're deploying a
|
|
71
|
-
// env.deploy("../path/to/
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
90
|
+
// We're deploying a contract that belongs in a workspace
|
|
91
|
+
// env.deploy("../path/to/workspace/root@packageName", "contractName")
|
|
92
|
+
if (pathStr.includes('@')) {
|
|
93
|
+
const [workspace, pkg] = pathStr.split('@');
|
|
94
|
+
const targetPath = join(rootPath, workspace, './target');
|
|
95
|
+
this.logger.debug(`Looking for compiled artifact in workspace ${targetPath}`);
|
|
96
|
+
artifactPath = join(targetPath, `${pkg}-${contractName}.json`);
|
|
97
|
+
} else {
|
|
98
|
+
// We're deploying a standalone contract
|
|
99
|
+
// env.deploy("../path/to/contract/root", "contractName")
|
|
100
|
+
const targetPath = join(rootPath, pathStr, './target');
|
|
101
|
+
this.logger.debug(`Looking for compiled artifact in ${targetPath}`);
|
|
102
|
+
[artifactPath] = (await readdir(targetPath)).filter(file => file.endsWith(`-${contractName}.json`));
|
|
103
|
+
}
|
|
75
104
|
}
|
|
105
|
+
this.logger.debug(`Loading compiled artifact ${artifactPath}`);
|
|
106
|
+
artifact = loadContractArtifact(JSON.parse(await readFile(artifactPath, 'utf-8')));
|
|
107
|
+
this.logger.debug(
|
|
108
|
+
`Deploy ${artifact.name} with initializer ${initializer}(${decodedArgs}) and public keys hash ${publicKeysHashFr}`,
|
|
109
|
+
);
|
|
110
|
+
instance = await getContractInstanceFromDeployParams(artifact, {
|
|
111
|
+
constructorArgs: decodedArgs,
|
|
112
|
+
skipArgsDecoding: true,
|
|
113
|
+
salt: Fr.ONE,
|
|
114
|
+
// TODO: Modify this to allow for passing public keys.
|
|
115
|
+
publicKeys: PublicKeys.default(),
|
|
116
|
+
constructorArtifact: initializer ? initializer : undefined,
|
|
117
|
+
deployer: AztecAddress.ZERO,
|
|
118
|
+
});
|
|
119
|
+
TXEArtifactsCache.set(cacheKey, { artifact, instance });
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
inputs.splice(0, 2, artifact, instance);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async #processAddAccountInputs({ inputs }: TXEForeignCallInput) {
|
|
126
|
+
const secret = fromSingle(inputs[0] as ForeignCallSingle);
|
|
127
|
+
|
|
128
|
+
const cacheKey = `SchnorrAccountContract-${secret}`;
|
|
129
|
+
|
|
130
|
+
let artifact;
|
|
131
|
+
let instance;
|
|
132
|
+
|
|
133
|
+
if (TXEArtifactsCache.has(cacheKey)) {
|
|
134
|
+
this.logger.debug(`Using cached artifact for ${cacheKey}`);
|
|
135
|
+
({ artifact, instance } = TXEArtifactsCache.get(cacheKey)!);
|
|
136
|
+
} else {
|
|
137
|
+
const keys = await deriveKeys(secret);
|
|
138
|
+
const args = [keys.publicKeys.masterIncomingViewingPublicKey.x, keys.publicKeys.masterIncomingViewingPublicKey.y];
|
|
139
|
+
artifact = SchnorrAccountContractArtifact;
|
|
140
|
+
instance = await getContractInstanceFromDeployParams(artifact, {
|
|
141
|
+
constructorArgs: args,
|
|
142
|
+
skipArgsDecoding: true,
|
|
143
|
+
salt: Fr.ONE,
|
|
144
|
+
publicKeys: keys.publicKeys,
|
|
145
|
+
constructorArtifact: 'constructor',
|
|
146
|
+
deployer: AztecAddress.ZERO,
|
|
147
|
+
});
|
|
148
|
+
TXEArtifactsCache.set(cacheKey, { artifact, instance });
|
|
76
149
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
inputs.splice(0, 2, artifact);
|
|
150
|
+
|
|
151
|
+
inputs.splice(0, 0, artifact, instance);
|
|
80
152
|
}
|
|
81
153
|
|
|
82
154
|
// eslint-disable-next-line camelcase
|
|
@@ -96,16 +168,18 @@ class TXEDispatcher {
|
|
|
96
168
|
return toForeignCallResult([]);
|
|
97
169
|
}
|
|
98
170
|
case 'deploy': {
|
|
99
|
-
// Modify inputs and fall through
|
|
100
171
|
await this.#processDeployInputs(callData);
|
|
172
|
+
break;
|
|
101
173
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const response = await (txeService as any)[functionName](...inputs);
|
|
106
|
-
return response;
|
|
174
|
+
case 'addAccount': {
|
|
175
|
+
await this.#processAddAccountInputs(callData);
|
|
176
|
+
break;
|
|
107
177
|
}
|
|
108
178
|
}
|
|
179
|
+
|
|
180
|
+
const txeService = TXESessions.get(sessionId);
|
|
181
|
+
const response = await (txeService as any)[functionName](...inputs);
|
|
182
|
+
return response;
|
|
109
183
|
}
|
|
110
184
|
}
|
|
111
185
|
|
|
@@ -120,7 +194,7 @@ const TXEDispatcherApiSchema: ApiSchemaFor<TXEDispatcher> = {
|
|
|
120
194
|
* @returns A TXE RPC server.
|
|
121
195
|
*/
|
|
122
196
|
export function createTXERpcServer(logger: Logger) {
|
|
123
|
-
return
|
|
197
|
+
return createSafeJsonRpcServer(new TXEDispatcher(logger), TXEDispatcherApiSchema, {
|
|
124
198
|
http200OnError: true,
|
|
125
199
|
});
|
|
126
200
|
}
|
package/src/node/txe_node.ts
CHANGED
|
@@ -568,6 +568,10 @@ export class TXENode implements AztecNode {
|
|
|
568
568
|
throw new Error('TXE Node method getTxByHash not implemented');
|
|
569
569
|
}
|
|
570
570
|
|
|
571
|
+
getTxsByHash(_txHashes: TxHash[]): Promise<Tx[]> {
|
|
572
|
+
throw new Error('TXE Node method getTxByHash not implemented');
|
|
573
|
+
}
|
|
574
|
+
|
|
571
575
|
/**
|
|
572
576
|
* Gets the storage value at the given contract storage slot.
|
|
573
577
|
*
|
package/src/oracle/txe_oracle.ts
CHANGED
|
@@ -22,7 +22,6 @@ import {
|
|
|
22
22
|
CallContext,
|
|
23
23
|
type ContractInstance,
|
|
24
24
|
type ContractInstanceWithAddress,
|
|
25
|
-
DEPLOYER_CONTRACT_ADDRESS,
|
|
26
25
|
Gas,
|
|
27
26
|
GasFees,
|
|
28
27
|
GlobalVariables,
|
|
@@ -44,10 +43,8 @@ import {
|
|
|
44
43
|
type PublicDataTreeLeafPreimage,
|
|
45
44
|
PublicDataWrite,
|
|
46
45
|
type PublicLog,
|
|
47
|
-
computeContractClassId,
|
|
48
46
|
computeTaggingSecretPoint,
|
|
49
47
|
deriveKeys,
|
|
50
|
-
getContractClassFromArtifact,
|
|
51
48
|
} from '@aztec/circuits.js';
|
|
52
49
|
import { Schnorr } from '@aztec/circuits.js/barretenberg';
|
|
53
50
|
import {
|
|
@@ -251,9 +248,8 @@ export class TXE implements TypedOracle {
|
|
|
251
248
|
await this.txeDatabase.addContractInstance(contractInstance);
|
|
252
249
|
}
|
|
253
250
|
|
|
254
|
-
async addContractArtifact(artifact: ContractArtifact) {
|
|
255
|
-
|
|
256
|
-
await this.txeDatabase.addContractArtifact(await computeContractClassId(contractClass), artifact);
|
|
251
|
+
async addContractArtifact(contractClassId: Fr, artifact: ContractArtifact) {
|
|
252
|
+
await this.txeDatabase.addContractArtifact(contractClassId, artifact);
|
|
257
253
|
}
|
|
258
254
|
|
|
259
255
|
async getPrivateContextInputs(
|
|
@@ -502,6 +498,8 @@ export class TXE implements TypedOracle {
|
|
|
502
498
|
Fr.ZERO,
|
|
503
499
|
);
|
|
504
500
|
|
|
501
|
+
header.globalVariables.blockNumber = new Fr(blockNumber);
|
|
502
|
+
|
|
505
503
|
return header;
|
|
506
504
|
}
|
|
507
505
|
|
|
@@ -741,6 +739,8 @@ export class TXE implements TypedOracle {
|
|
|
741
739
|
Fr.ZERO,
|
|
742
740
|
);
|
|
743
741
|
|
|
742
|
+
header.globalVariables.blockNumber = new Fr(blockNumber);
|
|
743
|
+
|
|
744
744
|
l2Block.header = header;
|
|
745
745
|
|
|
746
746
|
await fork.updateArchive(l2Block.header);
|
|
@@ -888,7 +888,6 @@ export class TXE implements TypedOracle {
|
|
|
888
888
|
const executionRequest = new PublicExecutionRequest(callContext, args);
|
|
889
889
|
|
|
890
890
|
const db = this.baseFork;
|
|
891
|
-
const worldStateDb = new TXEWorldStateDB(db, new TXEPublicContractDataSource(this), this);
|
|
892
891
|
|
|
893
892
|
const globalVariables = GlobalVariables.empty();
|
|
894
893
|
globalVariables.chainId = new Fr(await this.node.getChainId());
|
|
@@ -896,28 +895,9 @@ export class TXE implements TypedOracle {
|
|
|
896
895
|
globalVariables.blockNumber = new Fr(this.blockNumber);
|
|
897
896
|
globalVariables.gasFees = new GasFees(1, 1);
|
|
898
897
|
|
|
899
|
-
const tempFork = await this.nativeWorldStateService.fork();
|
|
900
|
-
// Apply current public data writes
|
|
901
|
-
await tempFork.sequentialInsert(
|
|
902
|
-
MerkleTreeId.PUBLIC_DATA_TREE,
|
|
903
|
-
this.publicDataWrites.map(p => p.toBuffer()),
|
|
904
|
-
);
|
|
905
|
-
|
|
906
|
-
// If the contract instance exists in the TXE's world state, make sure its nullifier is present in the tree
|
|
907
|
-
// so its nullifier check passes.
|
|
908
|
-
if ((await worldStateDb.getContractInstance(callContext.contractAddress)) !== undefined) {
|
|
909
|
-
const contractAddressNullifier = await siloNullifier(
|
|
910
|
-
AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS),
|
|
911
|
-
callContext.contractAddress.toField(),
|
|
912
|
-
);
|
|
913
|
-
if ((await worldStateDb.getNullifierIndex(contractAddressNullifier)) === undefined) {
|
|
914
|
-
await tempFork.batchInsert(MerkleTreeId.NULLIFIER_TREE, [contractAddressNullifier.toBuffer()], 0);
|
|
915
|
-
}
|
|
916
|
-
}
|
|
917
|
-
|
|
918
898
|
const simulator = new PublicTxSimulator(
|
|
919
|
-
|
|
920
|
-
new TXEWorldStateDB(
|
|
899
|
+
db,
|
|
900
|
+
new TXEWorldStateDB(db, new TXEPublicContractDataSource(this), this),
|
|
921
901
|
globalVariables,
|
|
922
902
|
);
|
|
923
903
|
|
|
@@ -954,7 +934,6 @@ export class TXE implements TypedOracle {
|
|
|
954
934
|
),
|
|
955
935
|
);
|
|
956
936
|
|
|
957
|
-
await tempFork.close();
|
|
958
937
|
return Promise.resolve(result);
|
|
959
938
|
}
|
|
960
939
|
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import { SchnorrAccountContractArtifact } from '@aztec/accounts/schnorr';
|
|
2
1
|
import { MerkleTreeId, SimulationError } from '@aztec/circuit-types';
|
|
3
2
|
import {
|
|
3
|
+
type ContractInstanceWithAddress,
|
|
4
|
+
DEPLOYER_CONTRACT_ADDRESS,
|
|
4
5
|
Fr,
|
|
5
6
|
FunctionSelector,
|
|
6
7
|
PublicDataWrite,
|
|
7
|
-
PublicKeys,
|
|
8
8
|
computePartialAddress,
|
|
9
|
-
getContractInstanceFromDeployParams,
|
|
10
9
|
} from '@aztec/circuits.js';
|
|
11
|
-
import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash';
|
|
10
|
+
import { computePublicDataTreeLeafSlot, siloNullifier } from '@aztec/circuits.js/hash';
|
|
12
11
|
import { type ContractArtifact, NoteSelector } from '@aztec/foundation/abi';
|
|
13
12
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
14
13
|
import { type Logger } from '@aztec/foundation/log';
|
|
@@ -89,35 +88,15 @@ export class TXEService {
|
|
|
89
88
|
return toForeignCallResult(keys.publicKeys.toFields().map(toSingle));
|
|
90
89
|
}
|
|
91
90
|
|
|
92
|
-
async deploy(
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
publicKeysHash: ForeignCallSingle,
|
|
98
|
-
) {
|
|
99
|
-
const initializerStr = fromArray(initializer)
|
|
100
|
-
.map(char => String.fromCharCode(char.toNumber()))
|
|
101
|
-
.join('');
|
|
102
|
-
const decodedArgs = fromArray(args);
|
|
103
|
-
const publicKeysHashFr = fromSingle(publicKeysHash);
|
|
104
|
-
this.logger.debug(
|
|
105
|
-
`Deploy ${artifact.name} with initializer ${initializerStr}(${decodedArgs}) and public keys hash ${publicKeysHashFr}`,
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
const instance = await getContractInstanceFromDeployParams(artifact, {
|
|
109
|
-
constructorArgs: decodedArgs,
|
|
110
|
-
skipArgsDecoding: true,
|
|
111
|
-
salt: Fr.ONE,
|
|
112
|
-
// TODO: Modify this to allow for passing public keys.
|
|
113
|
-
publicKeys: PublicKeys.default(),
|
|
114
|
-
constructorArtifact: initializerStr ? initializerStr : undefined,
|
|
115
|
-
deployer: AztecAddress.ZERO,
|
|
116
|
-
});
|
|
91
|
+
async deploy(artifact: ContractArtifact, instance: ContractInstanceWithAddress) {
|
|
92
|
+
// Emit deployment nullifier
|
|
93
|
+
(this.typedOracle as TXE).addSiloedNullifiersFromPublic([
|
|
94
|
+
await siloNullifier(AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS), instance.address.toField()),
|
|
95
|
+
]);
|
|
117
96
|
|
|
118
97
|
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
119
98
|
await (this.typedOracle as TXE).addContractInstance(instance);
|
|
120
|
-
await (this.typedOracle as TXE).addContractArtifact(artifact);
|
|
99
|
+
await (this.typedOracle as TXE).addContractArtifact(instance.contractClassId, artifact);
|
|
121
100
|
return toForeignCallResult([
|
|
122
101
|
toArray([
|
|
123
102
|
instance.salt,
|
|
@@ -151,9 +130,10 @@ export class TXEService {
|
|
|
151
130
|
return toForeignCallResult([toArray(publicDataWrites.map(write => write.value))]);
|
|
152
131
|
}
|
|
153
132
|
|
|
154
|
-
async createAccount() {
|
|
133
|
+
async createAccount(secret: ForeignCallSingle) {
|
|
155
134
|
const keyStore = (this.typedOracle as TXE).getKeyStore();
|
|
156
|
-
const
|
|
135
|
+
const secretFr = fromSingle(secret);
|
|
136
|
+
const completeAddress = await keyStore.addAccount(secretFr, secretFr);
|
|
157
137
|
const accountStore = (this.typedOracle as TXE).getTXEDatabase();
|
|
158
138
|
await accountStore.setAccount(completeAddress.address, completeAddress);
|
|
159
139
|
this.logger.debug(`Created account ${completeAddress.address}`);
|
|
@@ -163,22 +143,10 @@ export class TXEService {
|
|
|
163
143
|
]);
|
|
164
144
|
}
|
|
165
145
|
|
|
166
|
-
async addAccount(secret: ForeignCallSingle) {
|
|
167
|
-
const keys = await (this.typedOracle as TXE).deriveKeys(fromSingle(secret));
|
|
168
|
-
const args = [keys.publicKeys.masterIncomingViewingPublicKey.x, keys.publicKeys.masterIncomingViewingPublicKey.y];
|
|
169
|
-
const artifact = SchnorrAccountContractArtifact;
|
|
170
|
-
const instance = await getContractInstanceFromDeployParams(artifact, {
|
|
171
|
-
constructorArgs: args,
|
|
172
|
-
skipArgsDecoding: true,
|
|
173
|
-
salt: Fr.ONE,
|
|
174
|
-
publicKeys: keys.publicKeys,
|
|
175
|
-
constructorArtifact: 'constructor',
|
|
176
|
-
deployer: AztecAddress.ZERO,
|
|
177
|
-
});
|
|
178
|
-
|
|
146
|
+
async addAccount(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: ForeignCallSingle) {
|
|
179
147
|
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
180
148
|
await (this.typedOracle as TXE).addContractInstance(instance);
|
|
181
|
-
await (this.typedOracle as TXE).addContractArtifact(artifact);
|
|
149
|
+
await (this.typedOracle as TXE).addContractArtifact(instance.contractClassId, artifact);
|
|
182
150
|
|
|
183
151
|
const keyStore = (this.typedOracle as TXE).getKeyStore();
|
|
184
152
|
const completeAddress = await keyStore.addAccount(fromSingle(secret), await computePartialAddress(instance));
|