Skip to content

Commit 0790778

Browse files
authored
feat(aztec-nr): include delivery mode in handshake discovery (#23873)
1 parent de8da01 commit 0790778

10 files changed

Lines changed: 74 additions & 88 deletions

File tree

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,13 @@
11
use crate::protocol::traits::Serialize;
22

3-
pub(crate) struct ProvidedSecretKindEnum {
4-
pub UNCONSTRAINED: Field,
5-
pub CONSTRAINED: Field,
6-
}
7-
8-
/// Delivery modes for a [`ProvidedSecret`]. The numeric values match the TypeScript
9-
/// `AppTaggingSecretKind` ordering so they round-trip across the oracle boundary.
10-
pub(crate) global ProvidedSecretKind: ProvidedSecretKindEnum =
11-
ProvidedSecretKindEnum { UNCONSTRAINED: 0, CONSTRAINED: 1 };
12-
133
/// A tagging secret the app supplies explicitly to `get_pending_tagged_logs`.
144
///
155
/// These are searched alongside the secrets PXE derives or stores internally, and exist for secrets PXE cannot
16-
/// enumerate on its own (e.g. handshake-derived ones). A provided secret carries its mode explicitly: `mode` selects
17-
/// both the tag domain separator and the index discipline used when searching for its logs.
6+
/// enumerate on its own (e.g. handshake-derived ones). `mode` is a delivery mode constant from
7+
/// [`crate::messages::message_delivery`] (`ONCHAIN_UNCONSTRAINED` or `ONCHAIN_CONSTRAINED`).
188
#[derive(Serialize)]
9+
#[allow(dead_code)]
1910
pub(crate) struct ProvidedSecret {
2011
pub secret: Field,
2112
pub mode: Field,
2213
}
23-
24-
mod test {
25-
use super::{ProvidedSecret, ProvidedSecretKind};
26-
27-
#[test]
28-
fn kind_values_match_typescript() {
29-
// The numeric values must match the TS `AppTaggingSecretKind` ordering so that contracts and PXE agree on
30-
// the wire encoding for `mode`.
31-
assert_eq(ProvidedSecretKind.UNCONSTRAINED, 0);
32-
assert_eq(ProvidedSecretKind.CONSTRAINED, 1);
33-
34-
let _ = ProvidedSecret { secret: 1, mode: ProvidedSecretKind.UNCONSTRAINED };
35-
let _ = ProvidedSecret { secret: 2, mode: ProvidedSecretKind.CONSTRAINED };
36-
}
37-
}

noir-projects/aztec-nr/aztec/src/standard_addresses.nr

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22
use protocol_types::{address::AztecAddress, traits::FromField};
33

44
pub global STANDARD_AUTH_REGISTRY_ADDRESS: AztecAddress = AztecAddress::from_field(
5-
0x2e1c8ae9471649da39ea42c4abb17ecb7028ae1e5e23bd35fd4251a69658a2e1,
5+
0x023cb6fed0ebb1235f1c2a6656c3b2438b84d24705a517211dc186db7d1ba754,
66
);
77

88
pub global STANDARD_MULTI_CALL_ENTRYPOINT_ADDRESS: AztecAddress = AztecAddress::from_field(
9-
0x0e169f6f6864aadf1eeafdef9af209f951f997f0b5187af191af7b271334aa20,
9+
0x27d70a9a022dcd1195a8d2a4a3a8c89b5af1d7831a68891d052af0125a1f1341,
1010
);
1111

1212
pub global STANDARD_PUBLIC_CHECKS_ADDRESS: AztecAddress = AztecAddress::from_field(
13-
0x106479f2993a73b878821b4cd0098c9bd48164b32e9b567df009732dabaa65e2,
13+
0x2f5e1e2b07b1fab93a0d8217643d988da90e12bd9c41a42265eabfe66c1824a8,
1414
);
1515

1616
pub global STANDARD_HANDSHAKE_REGISTRY_ADDRESS: AztecAddress = AztecAddress::from_field(
17-
0x04ee9dc0b25d393c804ab6a6fc34223f3ca914a9a9043bdc6cd877efc9067383,
17+
0x30280ec85136f131f9c34a9ac5c1390363c9207930c47eb93ddfd83f3601b5a1,
1818
);

noir-projects/noir-contracts/contracts/protocol/aztec_sublib/src/standard_addresses.nr

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22
use protocol_types::{address::AztecAddress, traits::FromField};
33

44
pub global STANDARD_AUTH_REGISTRY_ADDRESS: AztecAddress = AztecAddress::from_field(
5-
0x2e1c8ae9471649da39ea42c4abb17ecb7028ae1e5e23bd35fd4251a69658a2e1,
5+
0x023cb6fed0ebb1235f1c2a6656c3b2438b84d24705a517211dc186db7d1ba754,
66
);
77

88
pub global STANDARD_MULTI_CALL_ENTRYPOINT_ADDRESS: AztecAddress = AztecAddress::from_field(
9-
0x0e169f6f6864aadf1eeafdef9af209f951f997f0b5187af191af7b271334aa20,
9+
0x27d70a9a022dcd1195a8d2a4a3a8c89b5af1d7831a68891d052af0125a1f1341,
1010
);
1111

1212
pub global STANDARD_PUBLIC_CHECKS_ADDRESS: AztecAddress = AztecAddress::from_field(
13-
0x106479f2993a73b878821b4cd0098c9bd48164b32e9b567df009732dabaa65e2,
13+
0x2f5e1e2b07b1fab93a0d8217643d988da90e12bd9c41a42265eabfe66c1824a8,
1414
);
1515

1616
pub global STANDARD_HANDSHAKE_REGISTRY_ADDRESS: AztecAddress = AztecAddress::from_field(
17-
0x04ee9dc0b25d393c804ab6a6fc34223f3ca914a9a9043bdc6cd877efc9067383,
17+
0x30280ec85136f131f9c34a9ac5c1390363c9207930c47eb93ddfd83f3601b5a1,
1818
);

noir-projects/noir-contracts/contracts/standard/handshake_registry_contract/src/main.nr

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,21 @@ pub contract HandshakeRegistry {
3838
constants::DOM_SEP__NON_INTERACTIVE_HANDSHAKE_LOG_TAG,
3939
hash::compute_log_tag,
4040
point::EmbeddedCurvePoint,
41-
traits::{Deserialize, Serialize, ToField},
41+
traits::{Deserialize, Packable, Serialize, ToField},
4242
},
4343
state_vars::{Map, Owned, PrivateMutable},
4444
};
4545

46+
/// A handshake discovered during sync: the sender's ephemeral public key and the delivery mode.
47+
#[derive(Deserialize, Eq, Packable, Serialize)]
48+
pub struct DiscoveredHandshake {
49+
pub eph_pk: EmbeddedCurvePoint,
50+
pub mode: u8,
51+
}
52+
4653
#[derive(Deserialize, Serialize)]
4754
pub struct HandshakePage {
48-
/// Sender ephemeral public keys. The recipient derives each shared
49-
/// secret via `recipient_isk * eph_pk`.
50-
pub items: BoundedVec<EmbeddedCurvePoint, MAX_HANDSHAKES_PER_PAGE>,
55+
pub items: BoundedVec<DiscoveredHandshake, MAX_HANDSHAKES_PER_PAGE>,
5156
pub total_count: u32,
5257
}
5358

@@ -68,10 +73,11 @@ pub contract HandshakeRegistry {
6873
/// `S = eph_sk * recipient_address_point`, and produces three effects:
6974
///
7075
/// 1. Inserts or replaces a [`HandshakeNote`] owned by `sender` for `mode`, holding the raw point `S`.
71-
/// 2. Emits an encrypted private log under a recipient-keyed tag with payload `[eph_pk.x]`. The recipient
72-
/// discovers handshakes addressed to them by scanning their tag and recovers `S` from `eph_pk` via their own
73-
/// ECDH (`recipient_isk * eph_pk`). `eph_pk.y` is fixed positive by the
74-
/// [`generate_positive_ephemeral_key_pair`] convention, so only `eph_pk.x` is transmitted.
76+
/// 2. Emits an encrypted private log under a recipient-keyed tag with payload `[eph_pk.x, mode]`. The
77+
/// recipient discovers handshakes addressed to them by scanning their tag and recovers `S` from `eph_pk`
78+
/// via their own ECDH (`recipient_isk * eph_pk`). `eph_pk.y` is fixed positive by the
79+
/// [`generate_positive_ephemeral_key_pair`] convention, so only `eph_pk.x` is transmitted. The mode is
80+
/// included so the recipient knows which delivery domain to search for tagged logs.
7581
/// 3. Returns the app-siloed shared secret for `msg_sender()`, allowing the caller to fold "handshake + first
7682
/// tag" into one call without a second hop into the registry.
7783
///
@@ -105,7 +111,11 @@ pub contract HandshakeRegistry {
105111
DOM_SEP__NON_INTERACTIVE_HANDSHAKE_LOG_TAG,
106112
);
107113

108-
let ciphertext = AES128::encrypt([eph_pk.x], recipient, self.context.this_address());
114+
let ciphertext = AES128::encrypt(
115+
[eph_pk.x, mode as Field],
116+
recipient,
117+
self.context.this_address(),
118+
);
109119
self.context.emit_private_log_unsafe(log_tag, BoundedVec::from_array(ciphertext));
110120

111121
note.siloed_for(self.msg_sender())

noir-projects/noir-contracts/contracts/standard/handshake_registry_contract/src/sync.nr

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use crate::HandshakeRegistry::DiscoveredHandshake;
2+
13
use aztec::{
24
capsules::CapsuleArray,
35
context::UtilityContext,
@@ -16,13 +18,12 @@ use aztec::{
1618
address::AztecAddress,
1719
constants::DOM_SEP__NON_INTERACTIVE_HANDSHAKE_LOG_TAG,
1820
hash::{compute_log_tag, sha256_to_field},
19-
point::EmbeddedCurvePoint,
2021
traits::ToField,
2122
},
2223
utils::point::point_from_x_coord_and_sign,
2324
};
2425

25-
/// Capsule base slot for the per-recipient list of discovered handshake `eph_pk`s populated by
26+
/// Capsule base slot for the per-recipient list of discovered handshakes populated by
2627
/// [`handshake_registry_sync`] and read by [`get_all_handshakes`].
2728
global HANDSHAKES_CAPSULE_SLOT: Field = sha256_to_field("HANDSHAKE_REGISTRY::HANDSHAKES".as_bytes());
2829

@@ -61,14 +62,19 @@ pub(crate) unconstrained fn handshake_registry_sync(
6162
let tag = compute_log_tag(scope.to_field(), DOM_SEP__NON_INTERACTIVE_HANDSHAKE_LOG_TAG);
6263
let logs = get_handshake_logs_in_range(contract_address, tag, cursor, Option::some(next_block));
6364

64-
// Store all valid handshakes
65-
let handshakes = CapsuleArray::at(contract_address, HANDSHAKES_CAPSULE_SLOT, scope);
65+
// Store all valid handshakes with their delivery mode
66+
let handshakes: CapsuleArray<DiscoveredHandshake> =
67+
CapsuleArray::at(contract_address, HANDSHAKES_CAPSULE_SLOT, scope);
6668
logs.for_each(|_i, log| {
6769
let ciphertext = aztec::utils::array::subbvec(log.log_payload, 0);
6870

6971
let _ = AES128::decrypt(ciphertext, scope, contract_address)
70-
.and_then(|pt| point_from_x_coord_and_sign(pt.get(0), true))
71-
.map(|pk| handshakes.push(pk));
72+
.and_then(|pt| {
73+
point_from_x_coord_and_sign(pt.get(0), true).map(|pk| {
74+
DiscoveredHandshake { eph_pk: pk, mode: pt.get(1) as u8 }
75+
})
76+
})
77+
.map(|h| handshakes.push(h));
7278
});
7379

7480
// Update the cursor
@@ -91,11 +97,11 @@ pub(crate) unconstrained fn handshake_registry_sync(
9197
);
9298
}
9399

94-
/// Returns the capsule array of discovered handshake ephemeral public keys for `recipient`.
100+
/// Returns the capsule array of discovered handshakes for `recipient`.
95101
pub(crate) unconstrained fn get_all_handshakes(
96102
contract_address: AztecAddress,
97103
recipient: AztecAddress,
98-
) -> CapsuleArray<EmbeddedCurvePoint> {
104+
) -> CapsuleArray<DiscoveredHandshake> {
99105
CapsuleArray::at(contract_address, HANDSHAKES_CAPSULE_SLOT, recipient)
100106
}
101107

noir-projects/noir-contracts/contracts/standard/handshake_registry_contract/src/test.nr

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -461,8 +461,9 @@ unconstrained fn non_interactive_handshake_is_discovered_by_recipient() {
461461
assert_eq(discovered.total_count, 1);
462462

463463
// The recipient derives the same app-siloed secret from the discovered eph_pk via ECDH.
464-
let eph_pk = discovered.items.get(0);
465-
let recipient_secret = env.utility_context_at(sender, |_| get_shared_secret(recipient, eph_pk, sender));
464+
let handshake = discovered.items.get(0);
465+
assert_eq(handshake.mode, ONCHAIN_UNCONSTRAINED);
466+
let recipient_secret = env.utility_context_at(sender, |_| get_shared_secret(recipient, handshake.eph_pk, sender));
466467
assert_eq(recipient_secret, returned_secret);
467468

468469
// The custom sync hook falls through to `do_sync_state`, so default note discovery still works.
@@ -530,16 +531,18 @@ unconstrained fn multiple_senders_discovered_for_same_recipient() {
530531
let _ = env.call_private(sender, registry.non_interactive_handshake(sender, recipient, ONCHAIN_UNCONSTRAINED));
531532
let _ = env.call_private(
532533
other_sender,
533-
registry.non_interactive_handshake(other_sender, recipient, ONCHAIN_UNCONSTRAINED),
534+
registry.non_interactive_handshake(other_sender, recipient, ONCHAIN_CONSTRAINED),
534535
);
535536

536537
let discovered = env.execute_utility(registry.get_handshakes(recipient, 0));
537538

538539
assert_eq(discovered.items.len(), 2);
539540
assert(
540-
discovered.items.get(0).x != discovered.items.get(1).x,
541+
discovered.items.get(0).eph_pk.x != discovered.items.get(1).eph_pk.x,
541542
"distinct senders should produce distinct ephemeral public keys",
542543
);
544+
assert_eq(discovered.items.get(0).mode, ONCHAIN_CONSTRAINED);
545+
assert_eq(discovered.items.get(1).mode, ONCHAIN_UNCONSTRAINED);
543546
}
544547

545548
#[test]
16.4 KB
Binary file not shown.

yarn-project/pxe/src/contract_function_simulator/noir-structs/provided_secret.test.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,21 @@ import { AppTaggingSecretKind } from '@aztec/stdlib/logs';
44
import { ProvidedSecret } from './provided_secret.js';
55

66
describe('ProvidedSecret', () => {
7-
it('deserializes mode 0 as unconstrained', () => {
8-
const provided = ProvidedSecret.fromFields([new Fr(42), new Fr(0)]);
7+
it('deserializes delivery mode 2 as unconstrained', () => {
8+
const provided = ProvidedSecret.fromFields([new Fr(42), new Fr(2)]);
99
expect(provided.secret).toEqual(new Fr(42));
1010
expect(provided.mode).toEqual(AppTaggingSecretKind.UNCONSTRAINED);
1111
});
1212

13-
it('deserializes mode 1 as constrained', () => {
14-
const provided = ProvidedSecret.fromFields([new Fr(42), new Fr(1)]);
13+
it('deserializes delivery mode 3 as constrained', () => {
14+
const provided = ProvidedSecret.fromFields([new Fr(42), new Fr(3)]);
1515
expect(provided.secret).toEqual(new Fr(42));
1616
expect(provided.mode).toEqual(AppTaggingSecretKind.CONSTRAINED);
1717
});
1818

1919
it('rejects an invalid mode value', () => {
20-
expect(() => ProvidedSecret.fromFields([Fr.random(), new Fr(2)])).toThrow('Invalid app tagging secret kind');
20+
expect(() => ProvidedSecret.fromFields([Fr.random(), new Fr(99)])).toThrow(
21+
'Unrecognized delivery mode for tagging',
22+
);
2123
});
2224
});
Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Fr } from '@aztec/foundation/curves/bn254';
22
import { FieldReader } from '@aztec/foundation/serialize';
3-
import { AppTaggingSecretKind } from '@aztec/stdlib/logs';
3+
import { AppTaggingSecretKind, appTaggingSecretKindFromDeliveryMode } from '@aztec/stdlib/logs';
44

55
/** A tagging secret an app supplies explicitly to `getPendingTaggedLogs` when PXE cannot derive it internally. */
66
export class ProvidedSecret {
@@ -11,17 +11,6 @@ export class ProvidedSecret {
1111

1212
static fromFields(fields: Fr[] | FieldReader): ProvidedSecret {
1313
const reader = FieldReader.asReader(fields);
14-
return new ProvidedSecret(reader.readField(), kindFromField(reader.readField()));
15-
}
16-
}
17-
18-
function kindFromField(mode: Fr): AppTaggingSecretKind {
19-
switch (mode.toBigInt()) {
20-
case 0n:
21-
return AppTaggingSecretKind.UNCONSTRAINED;
22-
case 1n:
23-
return AppTaggingSecretKind.CONSTRAINED;
24-
default:
25-
throw new Error(`Invalid app tagging secret kind: ${mode.toString()}`);
14+
return new ProvidedSecret(reader.readField(), appTaggingSecretKindFromDeliveryMode(reader.readField().toNumber()));
2615
}
2716
}

yarn-project/standard-contracts/src/standard_contract_data.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,41 +20,41 @@ export const StandardContractSalt: Record<StandardContractName, Fr> = {
2020
};
2121

2222
export const StandardContractAddress: Record<StandardContractName, AztecAddress> = {
23-
AuthRegistry: AztecAddress.fromString('0x2e1c8ae9471649da39ea42c4abb17ecb7028ae1e5e23bd35fd4251a69658a2e1'),
24-
MultiCallEntrypoint: AztecAddress.fromString('0x0e169f6f6864aadf1eeafdef9af209f951f997f0b5187af191af7b271334aa20'),
25-
PublicChecks: AztecAddress.fromString('0x106479f2993a73b878821b4cd0098c9bd48164b32e9b567df009732dabaa65e2'),
26-
HandshakeRegistry: AztecAddress.fromString('0x04ee9dc0b25d393c804ab6a6fc34223f3ca914a9a9043bdc6cd877efc9067383'),
23+
AuthRegistry: AztecAddress.fromString('0x023cb6fed0ebb1235f1c2a6656c3b2438b84d24705a517211dc186db7d1ba754'),
24+
MultiCallEntrypoint: AztecAddress.fromString('0x27d70a9a022dcd1195a8d2a4a3a8c89b5af1d7831a68891d052af0125a1f1341'),
25+
PublicChecks: AztecAddress.fromString('0x2f5e1e2b07b1fab93a0d8217643d988da90e12bd9c41a42265eabfe66c1824a8'),
26+
HandshakeRegistry: AztecAddress.fromString('0x30280ec85136f131f9c34a9ac5c1390363c9207930c47eb93ddfd83f3601b5a1'),
2727
};
2828

2929
export const StandardContractClassId: Record<StandardContractName, Fr> = {
30-
AuthRegistry: Fr.fromString('0x09f06345b8e37c037d622f668d380018d2e013d04a31cbebaa9e7c23f7cc7a7d'),
31-
MultiCallEntrypoint: Fr.fromString('0x239cdcd8464627acdf64f352b0a71b4b3cb2c27e8582ff4f273faff87a33ba65'),
32-
PublicChecks: Fr.fromString('0x24ce4becc7cb6bf880726dc4358b09ada12fb0f7015c32b971822033fc5844f2'),
33-
HandshakeRegistry: Fr.fromString('0x2453d20a9e6e312567b7c088c669ae376b13773971dd055af99251c86bcc59f3'),
30+
AuthRegistry: Fr.fromString('0x0a2e03b7a5b45285478faf0981baafed6a2a23ef72f52cc9c7f44d3e5056e2fa'),
31+
MultiCallEntrypoint: Fr.fromString('0x0e6d4ba224e83a0883923cd280ceca43832cddb97496c3a81ea73c6833d9d52a'),
32+
PublicChecks: Fr.fromString('0x0642156526e3d53f5c83f9554ed147f5102e7ac87dead1bf835e4256bbbdec13'),
33+
HandshakeRegistry: Fr.fromString('0x17919296e72cb4fbd9a6c9d91b3cd4ffbd65b5893ca5f8e0d5147e37ceb97ce8'),
3434
};
3535

3636
export const StandardContractClassIdPreimage: Record<
3737
StandardContractName,
3838
{ artifactHash: Fr; privateFunctionsRoot: Fr; publicBytecodeCommitment: Fr }
3939
> = {
4040
AuthRegistry: {
41-
artifactHash: Fr.fromString('0x294cf57741ec175652921fd6fbd5ac8bcfe592ad761a5711b66a23b60ba8fbc0'),
41+
artifactHash: Fr.fromString('0x0ba2481d3279c0dc1845c0474410833e44a14ea21ecaf7777c6d131d7a7af48e'),
4242
privateFunctionsRoot: Fr.fromString('0x17b584350f4c3ccafd8f688729afb9feab8976114fb40012e9dee65022c072a4'),
4343
publicBytecodeCommitment: Fr.fromString('0x2545f39893766508ce37bb5cea5e4dcab04c6f7f79f3089b1c076876e9d268b2'),
4444
},
4545
MultiCallEntrypoint: {
46-
artifactHash: Fr.fromString('0x16a1c11f78386c8e1ff3d413e05e068a81f88b2659b66b909f7215226553fa60'),
46+
artifactHash: Fr.fromString('0x1e0e30618d0ebfd6e6b2572f7e8aacb0e3d56bdbfcc517335dd9709c7960177b'),
4747
privateFunctionsRoot: Fr.fromString('0x0e68dfbb256e80b08b3aef47aca1f2669e97a9c6259787893c1223ac083ad5d5'),
4848
publicBytecodeCommitment: Fr.fromString('0x0ce4c618c3ed7f3a20410e618c06bb701e150af7fe28a3e92f68e7733809f33e'),
4949
},
5050
PublicChecks: {
51-
artifactHash: Fr.fromString('0x12c44e639e8a6c994c94c913eaf37c7809b1d97ea30d2c527474b09d4367c87d'),
51+
artifactHash: Fr.fromString('0x0ecc1629b1851e48ef40757e6aa458cdacdb9d5bd585b046fe5f6a79edb439f7'),
5252
privateFunctionsRoot: Fr.fromString('0x202860adb1b8975971eeaf571aaaa88a27f4035290d58532ae7d60b0dfaad54c'),
5353
publicBytecodeCommitment: Fr.fromString('0x013c4f854a5c87c9daf86c5f9bc07a42c2a061f1d924a5b3564ec7edc8e18cb7'),
5454
},
5555
HandshakeRegistry: {
56-
artifactHash: Fr.fromString('0x16dc423d685d565f0713936fa5acec94daefe82d92c4306354c4eec35ae8aca6'),
57-
privateFunctionsRoot: Fr.fromString('0x22071f2bef1999fe9698359ef95acfeb9cd7c473d04207ed160715c81292c6b3'),
56+
artifactHash: Fr.fromString('0x1662bedcee99614ec387e5184ad5b3027ee09fbe53227b52f400b145cdd0b6ae'),
57+
privateFunctionsRoot: Fr.fromString('0x0cf78fb872901f2883a6f9e940156658f5b317f4c437d80a67eb2a47d3bfc0c3'),
5858
publicBytecodeCommitment: Fr.fromString('0x0ce4c618c3ed7f3a20410e618c06bb701e150af7fe28a3e92f68e7733809f33e'),
5959
},
6060
};
@@ -98,7 +98,7 @@ export const StandardContractPrivateFunctions: Record<
9898
selector: FunctionSelector.fromField(
9999
Fr.fromString('0x000000000000000000000000000000000000000000000000000000005fa93894'),
100100
),
101-
vkHash: Fr.fromString('0x0ed3c8564b7f78e1dd558a0e38719c7056b27ae7f48aed795ffa2d6d84bae85d'),
101+
vkHash: Fr.fromString('0x086f9209118872f060094869666a20edb9ad69272c3a1b12fc93dbe839d271c7'),
102102
},
103103
],
104104
};

0 commit comments

Comments
 (0)