@aztec/stdlib 6.0.0-nightly.20260723 → 6.0.0-nightly.20260725
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/abi/abi.d.ts +8 -1
- package/dest/abi/abi.d.ts.map +1 -1
- package/dest/abi/contract_artifact.d.ts +1 -1
- package/dest/abi/contract_artifact.d.ts.map +1 -1
- package/dest/abi/contract_artifact.js +26 -8
- package/dest/hash/hash.d.ts +1 -2
- package/dest/hash/hash.d.ts.map +1 -1
- package/dest/hash/hash.js +0 -7
- package/dest/interfaces/archiver.d.ts +8 -1
- package/dest/interfaces/archiver.d.ts.map +1 -1
- package/dest/interfaces/archiver.js +2 -1
- package/dest/interfaces/block-builder.d.ts +7 -2
- package/dest/interfaces/block-builder.d.ts.map +1 -1
- package/dest/interfaces/proving-job.d.ts +14 -1
- package/dest/interfaces/proving-job.d.ts.map +1 -1
- package/dest/interfaces/proving-job.js +11 -2
- package/dest/keys/derivation.d.ts +1 -2
- package/dest/keys/derivation.d.ts.map +1 -1
- package/dest/keys/derivation.js +0 -7
- package/dest/logs/app_tagging_secret.d.ts +1 -1
- package/dest/logs/app_tagging_secret.d.ts.map +1 -1
- package/dest/logs/app_tagging_secret.js +4 -13
- package/dest/logs/shared_secret_derivation.d.ts +12 -2
- package/dest/logs/shared_secret_derivation.d.ts.map +1 -1
- package/dest/logs/shared_secret_derivation.js +18 -0
- package/dest/messaging/l1_to_l2_message.d.ts +23 -2
- package/dest/messaging/l1_to_l2_message.d.ts.map +1 -1
- package/dest/messaging/l1_to_l2_message.js +36 -11
- package/dest/noir/index.d.ts +3 -3
- package/dest/noir/index.d.ts.map +1 -1
- package/dest/rollup/checkpoint_rollup_public_inputs.d.ts +1 -1
- package/dest/world-state/genesis_data.d.ts +9 -1
- package/dest/world-state/genesis_data.d.ts.map +1 -1
- package/dest/world-state/genesis_data.js +1 -0
- package/package.json +8 -8
- package/src/abi/abi.ts +8 -0
- package/src/abi/contract_artifact.ts +33 -9
- package/src/gas/README.md +108 -36
- package/src/hash/hash.ts +0 -8
- package/src/interfaces/archiver.ts +8 -0
- package/src/interfaces/block-builder.ts +6 -1
- package/src/interfaces/proving-job.ts +12 -0
- package/src/keys/derivation.ts +0 -5
- package/src/logs/app_tagging_secret.ts +8 -17
- package/src/logs/shared_secret_derivation.ts +18 -1
- package/src/messaging/l1_to_l2_message.ts +51 -13
- package/src/noir/index.ts +2 -1
- package/src/world-state/genesis_data.ts +10 -0
|
@@ -65,24 +65,15 @@ const AppTaggingSecretKindSchema = z.union([
|
|
|
65
65
|
return AppTaggingSecret.computeDirectional(taggingSecretPoint, app, recipient);
|
|
66
66
|
}
|
|
67
67
|
toString() {
|
|
68
|
-
// TODO(F-680): Migrate stored tagging keys and remove the legacy unconstrained format.
|
|
69
|
-
if (this.kind === AppTaggingSecretKind.UNCONSTRAINED) {
|
|
70
|
-
return `${this.secret.toString()}:${this.app.toString()}`;
|
|
71
|
-
}
|
|
72
68
|
return `${this.kind}:${this.secret.toString()}:${this.app.toString()}`;
|
|
73
69
|
}
|
|
74
70
|
static fromString(str) {
|
|
75
71
|
const parts = str.split(':');
|
|
76
|
-
if (parts.length
|
|
77
|
-
|
|
78
|
-
const [secretStr, appStr] = parts;
|
|
79
|
-
return new AppTaggingSecret(Fr.fromString(secretStr), AztecAddress.fromStringUnsafe(appStr));
|
|
80
|
-
}
|
|
81
|
-
if (parts.length === 3) {
|
|
82
|
-
const [kindStr, secretStr, appStr] = parts;
|
|
83
|
-
return new AppTaggingSecret(Fr.fromString(secretStr), AztecAddress.fromStringUnsafe(appStr), appTaggingSecretKindFromString(kindStr));
|
|
72
|
+
if (parts.length !== 3) {
|
|
73
|
+
throw new Error(`Invalid AppTaggingSecret string: ${str}`);
|
|
84
74
|
}
|
|
85
|
-
|
|
75
|
+
const [kindStr, secretStr, appStr] = parts;
|
|
76
|
+
return new AppTaggingSecret(Fr.fromString(secretStr), AztecAddress.fromStringUnsafe(appStr), appTaggingSecretKindFromString(kindStr));
|
|
86
77
|
}
|
|
87
78
|
}
|
|
88
79
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
-
import
|
|
2
|
+
import { GrumpkinScalar, type Point } from '@aztec/foundation/curves/grumpkin';
|
|
3
3
|
import type { AztecAddress } from '../aztec-address/index.js';
|
|
4
4
|
import type { PublicKey } from '../keys/public_key.js';
|
|
5
5
|
/**
|
|
@@ -28,4 +28,14 @@ export declare function appSiloEcdhSharedSecret(secretKey: GrumpkinScalar, publi
|
|
|
28
28
|
* @param app - The contract address to silo to.
|
|
29
29
|
*/
|
|
30
30
|
export declare function appSiloEcdhSharedSecretPoint(point: Point, app: AztecAddress): Promise<Fr>;
|
|
31
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Protects a handshake's shared secret from being forged by the recipient: `S' = hash(ephPk, recipientPoint) * S`.
|
|
33
|
+
*
|
|
34
|
+
* Mirrors aztec-nr's `protect_from_forgery` and must stay byte-compatible with it.
|
|
35
|
+
*
|
|
36
|
+
* @param secret - The raw shared secret `S` to protect.
|
|
37
|
+
* @param ephPk - The handshake's ephemeral public key.
|
|
38
|
+
* @param recipientPoint - The recipient's address point.
|
|
39
|
+
*/
|
|
40
|
+
export declare function protectFromForgery(secret: Point, ephPk: Point, recipientPoint: Point): Promise<Point>;
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkX3NlY3JldF9kZXJpdmF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG9ncy9zaGFyZWRfc2VjcmV0X2Rlcml2YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxLQUFLLEtBQUssRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRS9FLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXZEOzs7O0dBSUc7QUFDSCx3QkFBZ0IsMkJBQTJCLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FPM0c7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCx3QkFBc0IsdUJBQXVCLENBQzNDLFNBQVMsRUFBRSxjQUFjLEVBQ3pCLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLGVBQWUsRUFBRSxZQUFZLEdBQzVCLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FHYjtBQUVEOzs7Ozs7O0dBT0c7QUFDSCx3QkFBZ0IsNEJBQTRCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsWUFBWSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FFekY7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILHdCQUFzQixrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBTTNHIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared_secret_derivation.d.ts","sourceRoot":"","sources":["../../src/logs/shared_secret_derivation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,
|
|
1
|
+
{"version":3,"file":"shared_secret_derivation.d.ts","sourceRoot":"","sources":["../../src/logs/shared_secret_derivation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,KAAK,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAO3G;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,YAAY,GAC5B,OAAO,CAAC,EAAE,CAAC,CAGb;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,EAAE,CAAC,CAEzF;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAM3G"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DomainSeparator } from '@aztec/constants';
|
|
2
2
|
import { Grumpkin } from '@aztec/foundation/crypto/grumpkin';
|
|
3
3
|
import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
|
|
4
|
+
import { GrumpkinScalar } from '@aztec/foundation/curves/grumpkin';
|
|
4
5
|
/**
|
|
5
6
|
* Derives the raw ECDH shared secret point `S = secretKey * publicKey`.
|
|
6
7
|
*
|
|
@@ -38,3 +39,20 @@ import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
|
|
|
38
39
|
app
|
|
39
40
|
], DomainSeparator.APP_SILOED_ECDH_SHARED_SECRET);
|
|
40
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Protects a handshake's shared secret from being forged by the recipient: `S' = hash(ephPk, recipientPoint) * S`.
|
|
44
|
+
*
|
|
45
|
+
* Mirrors aztec-nr's `protect_from_forgery` and must stay byte-compatible with it.
|
|
46
|
+
*
|
|
47
|
+
* @param secret - The raw shared secret `S` to protect.
|
|
48
|
+
* @param ephPk - The handshake's ephemeral public key.
|
|
49
|
+
* @param recipientPoint - The recipient's address point.
|
|
50
|
+
*/ export async function protectFromForgery(secret, ephPk, recipientPoint) {
|
|
51
|
+
const scalar = await poseidon2HashWithSeparator([
|
|
52
|
+
ephPk.x,
|
|
53
|
+
ephPk.y,
|
|
54
|
+
recipientPoint.x,
|
|
55
|
+
recipientPoint.y
|
|
56
|
+
], DomainSeparator.HANDSHAKE_FORGERY_PROTECTION);
|
|
57
|
+
return Grumpkin.mul(secret, new GrumpkinScalar(scalar.toBigInt()));
|
|
58
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type L1_TO_L2_MSG_TREE_HEIGHT } from '@aztec/constants';
|
|
2
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
3
|
import { BufferReader } from '@aztec/foundation/serialize';
|
|
4
4
|
import { SiblingPath } from '@aztec/foundation/trees';
|
|
@@ -45,5 +45,26 @@ export declare class L1ToL2Message {
|
|
|
45
45
|
static empty(): L1ToL2Message;
|
|
46
46
|
static random(): Promise<L1ToL2Message>;
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* The unsiloed nullifier a message consumer derives, together with the contract address needed to silo it.
|
|
50
|
+
*/
|
|
51
|
+
export interface UnsiloedMessageNullifier {
|
|
52
|
+
contractAddress: AztecAddress;
|
|
53
|
+
nullifier: Fr;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Computes the unsiloed nullifier that the fee juice contract (and any consumer following the same scheme) derives when
|
|
57
|
+
* consuming an L1 to L2 message.
|
|
58
|
+
*
|
|
59
|
+
* This is not a general-purpose utility: other contracts may derive the secret hash and hence the nullifier
|
|
60
|
+
* differently. The result is unsiloed — callers silo it (with the consuming contract's address) before looking it up
|
|
61
|
+
* in the nullifier tree.
|
|
62
|
+
*/
|
|
63
|
+
export declare function computeFeeJuiceMessageNullifier(messageHash: Fr, secret: Fr): Promise<Fr>;
|
|
64
|
+
/**
|
|
65
|
+
* Fetches the membership witness of an L1 to L2 message. When `unsiloedNullifier` is provided, the message is
|
|
66
|
+
* additionally required to be un-nullified.
|
|
67
|
+
*/
|
|
68
|
+
export declare function getL1ToL2MessageWitness(node: AztecNode, messageHash: Fr, unsiloedNullifier?: UnsiloedMessageNullifier, referenceBlock?: BlockParameter): Promise<[bigint, SiblingPath<typeof L1_TO_L2_MSG_TREE_HEIGHT>]>;
|
|
48
69
|
export declare function getNonNullifiedL1ToL2MessageWitness(node: AztecNode, contractAddress: AztecAddress, messageHash: Fr, secret: Fr, referenceBlock?: BlockParameter): Promise<[bigint, SiblingPath<typeof L1_TO_L2_MSG_TREE_HEIGHT>]>;
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDFfdG9fbDJfbWVzc2FnZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lc3NhZ2luZy9sMV90b19sMl9tZXNzYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUIsS0FBSyx3QkFBd0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBR2xGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFxQixNQUFNLDZCQUE2QixDQUFDO0FBRTlFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV0RCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVsRSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEM7O0dBRUc7QUFDSCxxQkFBYSxhQUFhO0lBRXRCLHVDQUF1QzthQUN2QixNQUFNLEVBQUUsT0FBTztJQUMvQiwwQ0FBMEM7YUFDMUIsU0FBUyxFQUFFLE9BQU87SUFDbEMsMkJBQTJCO2FBQ1gsT0FBTyxFQUFFLEVBQUU7SUFDM0IsdUNBQXVDO2FBQ3ZCLFVBQVUsRUFBRSxFQUFFO0lBQzlCLGdEQUFnRDthQUNoQyxLQUFLLEVBQUUsRUFBRTtJQVYzQjtJQUNFLHVDQUF1QztJQUN2QixNQUFNLEVBQUUsT0FBTztJQUMvQiwwQ0FBMEM7SUFDMUIsU0FBUyxFQUFFLE9BQU87SUFDbEMsMkJBQTJCO0lBQ1gsT0FBTyxFQUFFLEVBQUU7SUFDM0IsdUNBQXVDO0lBQ3ZCLFVBQVUsRUFBRSxFQUFFO0lBQzlCLGdEQUFnRDtJQUNoQyxLQUFLLEVBQUUsRUFBRSxFQUN2QjtJQUVKOzs7T0FHRztJQUNILFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FFZjtJQUVELFFBQVEsSUFBSSxNQUFNLENBRWpCO0lBRUQsSUFBSSxJQUFJLEVBQUUsQ0FFVDtJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxZQUFZLEdBQUcsYUFBYSxDQVE5RDtJQUVELFFBQVEsSUFBSSxNQUFNLENBRWpCO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLGFBQWEsQ0FHN0M7SUFFRCxNQUFNLENBQUMsS0FBSyxJQUFJLGFBQWEsQ0FFNUI7SUFFRCxPQUFhLE1BQU0sSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLENBRTVDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyx3QkFBd0I7SUFDdkMsZUFBZSxFQUFFLFlBQVksQ0FBQztJQUM5QixTQUFTLEVBQUUsRUFBRSxDQUFDO0NBQ2Y7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsd0JBQWdCLCtCQUErQixDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBRXhGO0FBRUQ7OztHQUdHO0FBQ0gsd0JBQXNCLHVCQUF1QixDQUMzQyxJQUFJLEVBQUUsU0FBUyxFQUNmLFdBQVcsRUFBRSxFQUFFLEVBQ2YsaUJBQWlCLENBQUMsRUFBRSx3QkFBd0IsRUFDNUMsY0FBYyxHQUFFLGNBQXlCLEdBQ3hDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsT0FBTyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FvQmpFO0FBR0Qsd0JBQXNCLG1DQUFtQyxDQUN2RCxJQUFJLEVBQUUsU0FBUyxFQUNmLGVBQWUsRUFBRSxZQUFZLEVBQzdCLFdBQVcsRUFBRSxFQUFFLEVBQ2YsTUFBTSxFQUFFLEVBQUUsRUFDVixjQUFjLEdBQUUsY0FBeUIsR0FDeEMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxPQUFPLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUdqRSJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"l1_to_l2_message.d.ts","sourceRoot":"","sources":["../../src/messaging/l1_to_l2_message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"l1_to_l2_message.d.ts","sourceRoot":"","sources":["../../src/messaging/l1_to_l2_message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAGlF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAE9E,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC;;GAEG;AACH,qBAAa,aAAa;IAEtB,uCAAuC;aACvB,MAAM,EAAE,OAAO;IAC/B,0CAA0C;aAC1B,SAAS,EAAE,OAAO;IAClC,2BAA2B;aACX,OAAO,EAAE,EAAE;IAC3B,uCAAuC;aACvB,UAAU,EAAE,EAAE;IAC9B,gDAAgD;aAChC,KAAK,EAAE,EAAE;IAV3B;IACE,uCAAuC;IACvB,MAAM,EAAE,OAAO;IAC/B,0CAA0C;IAC1B,SAAS,EAAE,OAAO;IAClC,2BAA2B;IACX,OAAO,EAAE,EAAE;IAC3B,uCAAuC;IACvB,UAAU,EAAE,EAAE;IAC9B,gDAAgD;IAChC,KAAK,EAAE,EAAE,EACvB;IAEJ;;;OAGG;IACH,QAAQ,IAAI,EAAE,EAAE,CAEf;IAED,QAAQ,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,EAAE,CAET;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,CAQ9D;IAED,QAAQ,IAAI,MAAM,CAEjB;IAED,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAG7C;IAED,MAAM,CAAC,KAAK,IAAI,aAAa,CAE5B;IAED,OAAa,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC,CAE5C;CACF;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,YAAY,CAAC;IAC9B,SAAS,EAAE,EAAE,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAExF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,EAAE,EACf,iBAAiB,CAAC,EAAE,wBAAwB,EAC5C,cAAc,GAAE,cAAyB,GACxC,OAAO,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAoBjE;AAGD,wBAAsB,mCAAmC,CACvD,IAAI,EAAE,SAAS,EACf,eAAe,EAAE,YAAY,EAC7B,WAAW,EAAE,EAAE,EACf,MAAM,EAAE,EAAE,EACV,cAAc,GAAE,cAAyB,GACxC,OAAO,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAGjE"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { DomainSeparator } from '@aztec/constants';
|
|
2
|
+
import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
|
|
1
3
|
import { sha256ToField } from '@aztec/foundation/crypto/sha256';
|
|
2
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
5
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
4
6
|
import { bufferToHex } from '@aztec/foundation/string';
|
|
5
|
-
import {
|
|
7
|
+
import { siloNullifier } from '../hash/hash.js';
|
|
6
8
|
import { MerkleTreeId } from '../trees/merkle_tree_id.js';
|
|
7
9
|
import { L1Actor } from './l1_actor.js';
|
|
8
10
|
import { L2Actor } from './l2_actor.js';
|
|
@@ -62,20 +64,43 @@ import { L2Actor } from './l2_actor.js';
|
|
|
62
64
|
return new L1ToL2Message(L1Actor.random(), await L2Actor.random(), Fr.random(), Fr.random(), Fr.random());
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Computes the unsiloed nullifier that the fee juice contract (and any consumer following the same scheme) derives when
|
|
69
|
+
* consuming an L1 to L2 message.
|
|
70
|
+
*
|
|
71
|
+
* This is not a general-purpose utility: other contracts may derive the secret hash and hence the nullifier
|
|
72
|
+
* differently. The result is unsiloed — callers silo it (with the consuming contract's address) before looking it up
|
|
73
|
+
* in the nullifier tree.
|
|
74
|
+
*/ export function computeFeeJuiceMessageNullifier(messageHash, secret) {
|
|
75
|
+
return poseidon2HashWithSeparator([
|
|
76
|
+
messageHash,
|
|
77
|
+
secret
|
|
78
|
+
], DomainSeparator.MESSAGE_NULLIFIER);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Fetches the membership witness of an L1 to L2 message. When `unsiloedNullifier` is provided, the message is
|
|
82
|
+
* additionally required to be un-nullified.
|
|
83
|
+
*/ export async function getL1ToL2MessageWitness(node, messageHash, unsiloedNullifier, referenceBlock = 'latest') {
|
|
84
|
+
// Both requests are dispatched before awaiting so they run concurrently.
|
|
85
|
+
const l1ToL2ResponsePromise = node.getL1ToL2MessageMembershipWitness(referenceBlock, messageHash);
|
|
86
|
+
const nullifierResponsePromise = unsiloedNullifier ? siloNullifier(unsiloedNullifier.contractAddress, unsiloedNullifier.nullifier).then((siloed)=>node.findLeavesIndexes(referenceBlock, MerkleTreeId.NULLIFIER_TREE, [
|
|
87
|
+
siloed
|
|
88
|
+
])) : undefined;
|
|
89
|
+
const l1ToL2Response = await l1ToL2ResponsePromise;
|
|
74
90
|
if (!l1ToL2Response) {
|
|
75
91
|
throw new Error(`No L1 to L2 message found for message hash ${messageHash.toString()}`);
|
|
76
92
|
}
|
|
77
|
-
|
|
93
|
+
const nullifierResponse = await nullifierResponsePromise;
|
|
94
|
+
if (nullifierResponse?.[0] !== undefined) {
|
|
78
95
|
throw new Error(`No non-nullified L1 to L2 message found for message hash ${messageHash.toString()}`);
|
|
79
96
|
}
|
|
80
97
|
return l1ToL2Response;
|
|
81
98
|
}
|
|
99
|
+
// This functionality is not on the node because we do not want to pass the node the secret, and give the node the ability to derive a valid nullifer for an L1 to L2 message.
|
|
100
|
+
export async function getNonNullifiedL1ToL2MessageWitness(node, contractAddress, messageHash, secret, referenceBlock = 'latest') {
|
|
101
|
+
const nullifier = await computeFeeJuiceMessageNullifier(messageHash, secret);
|
|
102
|
+
return getL1ToL2MessageWitness(node, messageHash, {
|
|
103
|
+
contractAddress,
|
|
104
|
+
nullifier
|
|
105
|
+
}, referenceBlock);
|
|
106
|
+
}
|
package/dest/noir/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ABIParameter, ABIParameterVisibility, AbiErrorType, AbiType, AbiValue, DebugFileMap, DebugInfo } from '../abi/abi.js';
|
|
1
|
+
import type { ABIParameter, ABIParameterVisibility, AbiErrorType, AbiNamedValue, AbiType, AbiValue, DebugFileMap, DebugInfo } from '../abi/abi.js';
|
|
2
2
|
export declare const AZTEC_PRIVATE_ATTRIBUTE = "abi_private";
|
|
3
3
|
export declare const AZTEC_PUBLIC_ATTRIBUTE = "abi_public";
|
|
4
4
|
export declare const AZTEC_UTILITY_ATTRIBUTE = "abi_utility";
|
|
@@ -61,7 +61,7 @@ export interface NoirCompiledContract {
|
|
|
61
61
|
/** The events of the contract */
|
|
62
62
|
outputs: {
|
|
63
63
|
structs: Record<string, AbiType[]>;
|
|
64
|
-
globals: Record<string, AbiValue[]>;
|
|
64
|
+
globals: Record<string, (AbiNamedValue | AbiValue)[]>;
|
|
65
65
|
};
|
|
66
66
|
/** The map of file ID to the source code and path of the file. */
|
|
67
67
|
file_map: DebugFileMap;
|
|
@@ -144,4 +144,4 @@ export declare function isNoirContractCompilationArtifacts(artifact: NoirCompila
|
|
|
144
144
|
*/
|
|
145
145
|
export declare function isNoirProgramCompilationArtifacts(artifact: NoirCompilationResult): artifact is NoirProgramCompilationArtifacts;
|
|
146
146
|
export {};
|
|
147
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ub2lyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUNWLFlBQVksRUFDWixzQkFBc0IsRUFDdEIsWUFBWSxFQUNaLGFBQWEsRUFDYixPQUFPLEVBQ1AsUUFBUSxFQUNSLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsZUFBTyxNQUFNLHVCQUF1QixnQkFBZ0IsQ0FBQztBQUNyRCxlQUFPLE1BQU0sc0JBQXNCLGVBQWUsQ0FBQztBQUNuRCxlQUFPLE1BQU0sdUJBQXVCLGdCQUFnQixDQUFDO0FBQ3JELGVBQU8sTUFBTSx5QkFBeUIsa0JBQWtCLENBQUM7QUFDekQsZUFBTyxNQUFNLDJCQUEyQixvQkFBb0IsQ0FBQztBQUM3RCxlQUFPLE1BQU0sb0JBQW9CLGFBQWEsQ0FBQztBQUUvQyx1Q0FBdUM7QUFDdkMsTUFBTSxXQUFXLGVBQWU7SUFDOUIsc0NBQXNDO0lBQ3RDLFVBQVUsRUFBRSxZQUFZLEVBQUUsQ0FBQztJQUMzQixtRUFBbUU7SUFDbkUsV0FBVyxFQUFFO1FBQ1g7O1dBRUc7UUFDSCxRQUFRLEVBQUUsT0FBTyxDQUFDO1FBQ2xCOztXQUVHO1FBQ0gsVUFBVSxFQUFFLHNCQUFzQixDQUFDO0tBQ3BDLEdBQUcsSUFBSSxDQUFDO0lBQ1QsOENBQThDO0lBQzlDLFdBQVcsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0NBQ3BEO0FBRUQ7O0dBRUc7QUFDSCxVQUFVLGlCQUFpQjtJQUN6QixnQ0FBZ0M7SUFDaEMsSUFBSSxFQUFFLE1BQU0sQ0FBQztJQUNiLDZDQUE2QztJQUM3QyxnQkFBZ0IsRUFBRSxPQUFPLENBQUM7SUFDMUIsNkNBQTZDO0lBQzdDLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzVCLCtCQUErQjtJQUMvQixHQUFHLEVB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
|
package/dest/noir/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/noir/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EACtB,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,SAAS,EACV,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,uBAAuB,gBAAgB,CAAC;AACrD,eAAO,MAAM,sBAAsB,eAAe,CAAC;AACnD,eAAO,MAAM,uBAAuB,gBAAgB,CAAC;AACrD,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AACzD,eAAO,MAAM,2BAA2B,oBAAoB,CAAC;AAC7D,eAAO,MAAM,oBAAoB,aAAa,CAAC;AAE/C,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,mEAAmE;IACnE,WAAW,EAAE;QACX;;WAEG;QACH,QAAQ,EAAE,OAAO,CAAC;QAClB;;WAEG;QACH,UAAU,EAAE,sBAAsB,CAAC;KACpC,GAAG,IAAI,CAAC;IACT,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;CACpD;AAED;;GAEG;AACH,UAAU,iBAAiB;IACzB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,6CAA6C;IAC7C,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,+BAA+B;IAC/B,GAAG,EAAE,eAAe,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4BAA4B;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qCAAqC;IACrC,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,iCAAiC;IACjC,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/noir/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -118,8 +118,8 @@ export declare class FeeRecipient {
|
|
|
118
118
|
static empty(): FeeRecipient;
|
|
119
119
|
isEmpty(): boolean;
|
|
120
120
|
toFriendlyJSON(): {
|
|
121
|
-
recipient?: undefined;
|
|
122
121
|
value?: undefined;
|
|
122
|
+
recipient?: undefined;
|
|
123
123
|
} | {
|
|
124
124
|
recipient: `0x${string}`;
|
|
125
125
|
value: `0x${string}`;
|
|
@@ -1,8 +1,16 @@
|
|
|
1
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
1
2
|
import type { PublicDataTreeLeaf } from '../trees/index.js';
|
|
2
3
|
/** Data used to initialize the genesis block, including prefilled public state and an optional timestamp. */
|
|
3
4
|
export type GenesisData = {
|
|
4
5
|
/** Public data tree leaves to pre-populate in the genesis state (e.g. fee juice balances). */
|
|
5
6
|
prefilledPublicData: PublicDataTreeLeaf[];
|
|
7
|
+
/**
|
|
8
|
+
* Nullifiers to pre-insert into the genesis nullifier tree. Optional; defaults to an empty list, which leaves the
|
|
9
|
+
* nullifier tree at its canonical empty-genesis state so that production genesis roots are unchanged. When non-empty,
|
|
10
|
+
* the leaves must be unique and strictly increasing in field value (the native world state enforces this before
|
|
11
|
+
* construction). Test networks pass a non-empty list to seed e.g. standard-contract registration nullifiers.
|
|
12
|
+
*/
|
|
13
|
+
prefilledNullifiers?: Fr[];
|
|
6
14
|
/** Timestamp for the genesis block header. Defaults to 0 (canonical empty genesis) in production. */
|
|
7
15
|
genesisTimestamp: bigint;
|
|
8
16
|
};
|
|
@@ -10,4 +18,4 @@ export type GenesisData = {
|
|
|
10
18
|
export declare const EMPTY_GENESIS_DATA: GenesisData;
|
|
11
19
|
/** Returns if an object looks like genesis data */
|
|
12
20
|
export declare function isGenesisData(obj: any): obj is GenesisData;
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXNpc19kYXRhLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ybGQtc3RhdGUvZ2VuZXNpc19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXpELE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQsNkdBQTZHO0FBQzdHLE1BQU0sTUFBTSxXQUFXLEdBQUc7SUFDeEIsOEZBQThGO0lBQzlGLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLENBQUM7SUFDMUM7Ozs7O09BS0c7SUFDSCxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzNCLHFHQUFxRztJQUNyRyxnQkFBZ0IsRUFBRSxNQUFNLENBQUM7Q0FDMUIsQ0FBQztBQUVGLDBFQUEwRTtBQUMxRSxlQUFPLE1BQU0sa0JBQWtCLEVBQUUsV0FJaEMsQ0FBQztBQUVGLG1EQUFtRDtBQUNuRCx3QkFBZ0IsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FTMUQifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"genesis_data.d.ts","sourceRoot":"","sources":["../../src/world-state/genesis_data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,6GAA6G;AAC7G,MAAM,MAAM,WAAW,GAAG;IACxB,8FAA8F;IAC9F,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,qGAAqG;IACrG,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"genesis_data.d.ts","sourceRoot":"","sources":["../../src/world-state/genesis_data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,6GAA6G;AAC7G,MAAM,MAAM,WAAW,GAAG;IACxB,8FAA8F;IAC9F,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC;IAC3B,qGAAqG;IACrG,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,EAAE,WAIhC,CAAC;AAEF,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,WAAW,CAS1D"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** An empty genesis data with no prefilled state and a zero timestamp. */ export const EMPTY_GENESIS_DATA = {
|
|
2
2
|
prefilledPublicData: [],
|
|
3
|
+
prefilledNullifiers: [],
|
|
3
4
|
genesisTimestamp: 0n
|
|
4
5
|
};
|
|
5
6
|
/** Returns if an object looks like genesis data */ export function isGenesisData(obj) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/stdlib",
|
|
3
|
-
"version": "6.0.0-nightly.
|
|
3
|
+
"version": "6.0.0-nightly.20260725",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"inherits": [
|
|
6
6
|
"../package.common.json",
|
|
@@ -92,13 +92,13 @@
|
|
|
92
92
|
},
|
|
93
93
|
"dependencies": {
|
|
94
94
|
"@aws-sdk/client-s3": "^3.892.0",
|
|
95
|
-
"@aztec/bb.js": "6.0.0-nightly.
|
|
96
|
-
"@aztec/blob-lib": "6.0.0-nightly.
|
|
97
|
-
"@aztec/constants": "6.0.0-nightly.
|
|
98
|
-
"@aztec/ethereum": "6.0.0-nightly.
|
|
99
|
-
"@aztec/foundation": "6.0.0-nightly.
|
|
100
|
-
"@aztec/l1-artifacts": "6.0.0-nightly.
|
|
101
|
-
"@aztec/noir-noirc_abi": "6.0.0-nightly.
|
|
95
|
+
"@aztec/bb.js": "6.0.0-nightly.20260725",
|
|
96
|
+
"@aztec/blob-lib": "6.0.0-nightly.20260725",
|
|
97
|
+
"@aztec/constants": "6.0.0-nightly.20260725",
|
|
98
|
+
"@aztec/ethereum": "6.0.0-nightly.20260725",
|
|
99
|
+
"@aztec/foundation": "6.0.0-nightly.20260725",
|
|
100
|
+
"@aztec/l1-artifacts": "6.0.0-nightly.20260725",
|
|
101
|
+
"@aztec/noir-noirc_abi": "6.0.0-nightly.20260725",
|
|
102
102
|
"@google-cloud/storage": "^7.15.0",
|
|
103
103
|
"axios": "^1.15.1",
|
|
104
104
|
"json-stringify-deterministic": "1.0.12",
|
package/src/abi/abi.ts
CHANGED
|
@@ -27,6 +27,14 @@ export type AbiValue =
|
|
|
27
27
|
| IntegerValue
|
|
28
28
|
| StructValue;
|
|
29
29
|
|
|
30
|
+
/** An exported value together with the name of the global that produced it. */
|
|
31
|
+
export interface AbiNamedValue {
|
|
32
|
+
/** The name of the exported global. */
|
|
33
|
+
name: string;
|
|
34
|
+
/** The exported value. */
|
|
35
|
+
value: AbiValue;
|
|
36
|
+
}
|
|
37
|
+
|
|
30
38
|
export const AbiValueSchema: z.ZodType<AbiValue> = z.discriminatedUnion('kind', [
|
|
31
39
|
z.object({ kind: z.literal('boolean'), value: z.boolean() }),
|
|
32
40
|
z.object({ kind: z.literal('string'), value: z.string() }),
|
|
@@ -13,7 +13,9 @@ import {
|
|
|
13
13
|
type ABIParameter,
|
|
14
14
|
type ABIParameterVisibility,
|
|
15
15
|
ARTIFACT_VERSION_BEFORE_INJECTION,
|
|
16
|
+
type AbiNamedValue,
|
|
16
17
|
type AbiType,
|
|
18
|
+
type AbiValue,
|
|
17
19
|
type BasicValue,
|
|
18
20
|
type ContractArtifact,
|
|
19
21
|
ContractArtifactSchema,
|
|
@@ -246,20 +248,24 @@ function hasKernelFunctionInputs(params: ABIParameter[]): boolean {
|
|
|
246
248
|
|
|
247
249
|
/**
|
|
248
250
|
* Generates a storage layout for the contract artifact.
|
|
249
|
-
* @param
|
|
251
|
+
* @param contractName - The name of the compiled Noir contract.
|
|
252
|
+
* @param globals - The normalized globals exported by the contract.
|
|
250
253
|
* @returns A storage layout for the contract.
|
|
251
254
|
*/
|
|
252
|
-
function getStorageLayout(
|
|
255
|
+
function getStorageLayout(contractName: string, globals: Record<string, AbiValue[]>) {
|
|
253
256
|
// If another contract is imported by the main contract, its storage layout its going to also show up here.
|
|
254
257
|
// The layout export includes the contract name, so here we can find the one that belongs to the current one and
|
|
255
258
|
// ignore the rest.
|
|
256
|
-
const storageExports =
|
|
257
|
-
const storageForContract = storageExports.find(storageExport => {
|
|
259
|
+
const storageExports = globals.storage ?? [];
|
|
260
|
+
const storageForContract = storageExports.find((storageExport): storageExport is StructValue => {
|
|
261
|
+
if (storageExport.kind !== 'struct') {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
258
264
|
const contractNameField = storageExport.fields.find(field => field.name === 'contract_name')?.value as BasicValue<
|
|
259
265
|
'string',
|
|
260
266
|
string
|
|
261
267
|
>;
|
|
262
|
-
return contractNameField.value ===
|
|
268
|
+
return contractNameField.value === contractName;
|
|
263
269
|
});
|
|
264
270
|
const storageFields = storageForContract
|
|
265
271
|
? ((storageForContract.fields.find(field => field.name == 'fields') as TypedStructFieldValue<StructValue>).value
|
|
@@ -280,6 +286,22 @@ function getStorageLayout(input: NoirCompiledContract) {
|
|
|
280
286
|
}, {});
|
|
281
287
|
}
|
|
282
288
|
|
|
289
|
+
function isAbiNamedValue(value: AbiNamedValue | AbiValue): value is AbiNamedValue {
|
|
290
|
+
return 'name' in value;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function normalizeContractOutputs(outputs: NoirCompiledContract['outputs']): ContractArtifact['outputs'] {
|
|
294
|
+
return {
|
|
295
|
+
structs: outputs.structs,
|
|
296
|
+
globals: Object.fromEntries(
|
|
297
|
+
Object.entries(outputs.globals).map(([tag, values]) => [
|
|
298
|
+
tag,
|
|
299
|
+
values.map(value => (isAbiNamedValue(value) ? value.value : value)),
|
|
300
|
+
]),
|
|
301
|
+
),
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
|
|
283
305
|
/**
|
|
284
306
|
* Given a post-processed Nargo output defined as `contract` generates an Aztec-compatible contract artifact.
|
|
285
307
|
*
|
|
@@ -290,6 +312,7 @@ function generateContractArtifact(contract: NoirCompiledContract): ContractArtif
|
|
|
290
312
|
if (!contract.transpiled) {
|
|
291
313
|
throw new Error("Contract's public bytecode has not been transpiled");
|
|
292
314
|
}
|
|
315
|
+
const outputs = normalizeContractOutputs(contract.outputs);
|
|
293
316
|
return ContractArtifactSchema.parse({
|
|
294
317
|
name: contract.name,
|
|
295
318
|
aztecVersion: contract.aztec_version,
|
|
@@ -297,8 +320,8 @@ function generateContractArtifact(contract: NoirCompiledContract): ContractArtif
|
|
|
297
320
|
nonDispatchPublicFunctions: contract.functions
|
|
298
321
|
.filter(f => !retainBytecode(f))
|
|
299
322
|
.map(f => generateFunctionAbi(f, contract)),
|
|
300
|
-
outputs
|
|
301
|
-
storageLayout: getStorageLayout(contract),
|
|
323
|
+
outputs,
|
|
324
|
+
storageLayout: getStorageLayout(contract.name, outputs.globals),
|
|
302
325
|
fileMap: contract.file_map,
|
|
303
326
|
});
|
|
304
327
|
} catch (err) {
|
|
@@ -313,6 +336,7 @@ function generateContractArtifact(contract: NoirCompiledContract): ContractArtif
|
|
|
313
336
|
*/
|
|
314
337
|
function generateContractArtifactForPublic(contract: NoirCompiledContract): ContractArtifact {
|
|
315
338
|
try {
|
|
339
|
+
const outputs = normalizeContractOutputs(contract.outputs);
|
|
316
340
|
return ContractArtifactSchema.parse({
|
|
317
341
|
name: contract.name,
|
|
318
342
|
aztecVersion: contract.aztec_version,
|
|
@@ -320,8 +344,8 @@ function generateContractArtifactForPublic(contract: NoirCompiledContract): Cont
|
|
|
320
344
|
nonDispatchPublicFunctions: contract.functions
|
|
321
345
|
.filter(f => !retainBytecode(f))
|
|
322
346
|
.map(f => generateFunctionAbi(f, contract)),
|
|
323
|
-
outputs
|
|
324
|
-
storageLayout: getStorageLayout(contract),
|
|
347
|
+
outputs,
|
|
348
|
+
storageLayout: getStorageLayout(contract.name, outputs.globals),
|
|
325
349
|
fileMap: contract.file_map,
|
|
326
350
|
});
|
|
327
351
|
} catch (err) {
|