@aztec/protocol-contracts 5.0.0-nightly.20260413 → 5.0.0-nightly.20260414

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.
@@ -32,7 +32,7 @@
32
32
  }
33
33
  },
34
34
  "bytecode": "JwACBAEoAAABBIBEJwAABEQnAgIEACcCAwQAHwoAAgADAEMlAAAAPC0CAkMnAgMEQycCBAQBOw4ABAADHgIAAwknAgQBASQCAAMAAABTJQAAAngeAgADASkCAAQA71JTTScCBQABKwIABgAAAAAAAAAAAwAAAAAAAAAALQgBBycCCAQFAAgBCAEnAwcEAQAiBwIILQoICS0OBAkAIgkCCS0OBQkAIgkCCS0OAwkAIgkCCS0OBgktCAEDJwIEBAUACAEEAScDAwQBACIHAgQAIgMCBT8PAAQABScCBAQBACoDBAUtCwUFJwIDAAAKKgUDBCcCAwEACioEAwYkAgAGAAABCCUAAAKKHgIAAwYeAgAEAC8qAAUABAAGHAoGBQQcCgUEAAIqBgQFLAIABAAtXgmLgro3tDuZoTFhGP0g1C9RZsnp8T+16mWpbR4KbQQqBQQGHAoGBwQcCgcFAAIqBgUHBCoHBAYcCgYIAhwKCAcAHAoHCAIcCggJARwKCQcCJwIIAgAKKgcICRYKCQccCgcKAAIqBgoLLAIABgAwM+okblBuiY6X9XDK/9cEywu0YDE/tyCynhOeXBAAAQQqCwYKHAoKDAQcCgwLAAIqCgsMBCoMBAocCgoMAhwKDAQAHAoEDAIcCgwNARwKDQQCCioECAwWCgwEHAoECAACKgoIDQQqDQYIHAoICgQcCgoGABwKBggFHAoMBgUcCgQKBQQqCggEHAoLCAUcCgkKBRwKBwkFBCoJCAccCgUIBQwqAwgFKQIAAwUAAVGAJAIABQAAAmgjAAACWQQqCgMEACoHBAIjAAACdwQqBgMFACoEBQIjAAACdyYqAQABBU/fSorXz/DTPAQCASYqAQABBbq7IdeCMxhkPAQCASY=",
35
- "debug_symbols": "rVjbbhoxEP2XfebBc/Mlv1JVEUlIhYRIRKFSFfHvnYEdL0Sy27p9YQ9n2bPH4+Pxsh/Ty+bp9O1xu399+z49fPmYng7b3W777XH39rw+bt/2yn5MwT6iftJqijI98GpK4XrIl0Om6SHqQb+B/qak6xECzgDJgZ8iP0XOsDPsjIADmYGZuAJ2UGaQ/BZpdgHZBMVAnEEBBzODARw4A86A2dBRIaIDZ8h+kw3EGbAz7Iw4I2UG5hnRgDJoTFKGggKzSnYqpxkUY8iAMVpjInagl5M6JGYHxqgxEmOSAWP0FmQ3vQJnLjctBsoMsjIcDJQZFGeKTTCsJg5aXkYDxqgxZpmBWBbYgMzAponFgDFqjC95SQZkBtmZbIwa4xIcGKPGJAQH6keCAXUo6kfAGDRgjNoQZAfGqA2xil2BM+yMVUzUoVjFrsCZ6IxVTNS8WMUkn8+ryZfF4/Gw2diquFknunre14fN/jg97E+73Wr6sd6dLj/6/r7eX47H9UHP6jg2+xc9quDrdrcxdF4tV4f2pbqQCs+Xg4YuVgm514C2RokAs0SJhItCvlPAjouQo5uAUKpCgtFx5NY4uhrCi4ZIamlIW4MsXRcFXShD4xDrFe6BqeUh9TR4kShSFbLcKeS2AmaPlK7Xej0C3gmUTiQouIVCvEQCUrlPVacUJVgzuGqEEtoa0JsOl6B8MxD6pNCJpnZtjyZC5jENJLeBGDs+uK0hAJ5NTQgs1ch/bINKgjqtqTRt9KIFxfMNFGIrWtCRSIgukXRzWyR4cI2kds/qJFQ3fPZqKI7UMoIdJ1k3plkj862PT52vk9BYC5ogtRrGbwaSZBlISc2BUEckY8gukjWuTRHudXGk2sYD3vbPT/XoNNBSSqoaAbipETs11We3WSNCbtvopBSTlwNLs4/3x2EPEz4OzE0TnaklkbpgY8Cmjf7Exuoja1duTSx1MqrPjlKrQfmmE8NfaNSlQjqvgxpSd9cAMqShJag1DREGNeqKIwAa1eCqgWlMAyRVjRhHNWLVSPAfNEZ9lKqBOOqjhH/XyDVjSDymgbFmDEdrirlmjGDUR64ZIxxbt0RLxmg0Y7Tkg0brcacx6mPJGGMY1Qj/rrFkjGmwf/DSCzmWMY3EvjdoSXFMI9/8Vxjs6/onwzPGAdq98M8fg/RpubXRSW/XD6E+qAe+NaIaX/Xr+nl7uHuVdTaxw3b9tNvMX19P++ebs8ef737GX4W9H96eNy+nw8aUlvdh9p7oC+i/Gd1Svp7tfr8A"
35
+ "debug_symbols": "rVhbbuM4ELyLvv3BfvGRqwwGgZMoAwOGE3jsBRaB777dtpqyByB3lrM/VrlklYrNYlPW1/Q2v5x/PO8O7x8/p6dvX9PLcbff73487z9et6fdx0HZrynYR9RP2kxRpifeTCncDvl6yDQ9RT3oN9DflHQ7QsAFIDnwU+SnyBl2hp0RcCALMBM3wA7KApLfIi0uIJugGIgLKOBgYTCAA2fAGTAbOipEdOAM2W+ygbgAdoadEWekLMA8IxpQBo1JylBQYFbJTuW0gGIMGTBGa0zEDvRyUofE7MAYNUZiTDJgjN6C7KY34Mz1psVAWUBWhoOBsoDiTLEJhs3EQcvLaMAYNcYsCxDLAhuQBdg0sRgwRo3xNS/JgCwgO5ONUWNcggNj1JiE4ED9SDCgDkX9CBiDBoxRG4LswBi1IVaxG3CGnbGKiToUq9gNOBOdsYqJmhermOTLZTP5sng+HefZVsXdOtHV87k9zofT9HQ47/eb6a/t/nz90c/P7eF6PG2PelbHMR/e9KiC77v9bOiyWa8O7UsB2YZ4vVxxkiohjxrQ1igRYJEokXBVyA8K2HERcnQTEEpVSDA6jtQaR1cjhlUjQmxpSFuDLF1XBV0oQ+PQcKweArY8pH4tqkRZZzTLg0JuK2D2SOl6rdcj4INA6USCglsoxOsgIJXHVHVKUQL7bJRQQlsDetPhEpTvBkK/KHSiqV3bo4mQeUwDyW0gxo4PbmsIgOdCdB9bq5F/2waVBHVaU2na6EULiucbKMRWtKAjkRBdIunmtkrw4Bqhds/qJFQ3fPZqKI7UMoIdJ1k3pkUjc4rNztdJaKwFTZBaDeNfBpJkHUhJzYFQRyRjyC6SNa5NEe51caTaxoNOUrMenQZaSklVIwA3NWKnpvrstmhEyG0bnZRi8nJgafbx/jjsYcLHgblpojO1JFIX7P1W8KuN/sTG6iNrV25NLHUyqs+OUqtB+a4Tw3/QqEuFdF4HNaTurgFkSENLUGsaIgxq1BVHADSqwVUD05gGSKoaMY5qxKqR4H/QGPVRqgbiqI8S/lwj14wh8ZiGPjxWjdGaYq4ZIxj1kWvGCMfWLdGaMRrNGK35oNF6PGiM+lgzxhhGNcKfa6wZYxrsH7z2Qo5lTCOx7w1aUhzTyHf/FQb7uv7J8IxxgHYv/P3HIH1abm100tv1Q/0DiIHvjajGd/26fd0dH15lXUzsuNu+7Ofl6/v58Hp39vT3p5/xV2Gfx4/X+e18nE1pfR9m74m+gf6b0S3l+8Xu9w8="
36
36
  },
37
37
  {
38
38
  "name": "public_dispatch",
@@ -96,7 +96,7 @@
96
96
  }
97
97
  },
98
98
  "bytecode": "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",
99
- "debug_symbols": "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"
99
+ "debug_symbols": "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"
100
100
  },
101
101
  {
102
102
  "name": "publish_for_public_execution",
@@ -2064,23 +2064,39 @@
2064
2064
  "error_kind": "string",
2065
2065
  "string": "Point not on curve"
2066
2066
  },
2067
+ "1560923443647584783": {
2068
+ "error_kind": "string",
2069
+ "string": "TpkM is the point at infinity"
2070
+ },
2071
+ "1911279422186654533": {
2072
+ "error_kind": "string",
2073
+ "string": "OvpkM is the point at infinity"
2074
+ },
2067
2075
  "4135474769840782447": {
2068
2076
  "error_kind": "string",
2069
2077
  "string": "Point at infinity should have canonical representation (0 0)"
2070
2078
  },
2079
+ "7264753475633835214": {
2080
+ "error_kind": "string",
2081
+ "string": "NpkM is the point at infinity"
2082
+ },
2071
2083
  "12469291177396340830": {
2072
2084
  "error_kind": "string",
2073
2085
  "string": "call to assert_max_bit_size"
2074
2086
  },
2087
+ "14483585040754951598": {
2088
+ "error_kind": "string",
2089
+ "string": "IvpkM is the point at infinity"
2090
+ },
2075
2091
  "14990209321349310352": {
2076
2092
  "error_kind": "string",
2077
2093
  "string": "attempt to add with overflow"
2078
2094
  }
2079
2095
  }
2080
2096
  },
2081
- "bytecode": "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",
2082
- "debug_symbols": "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",
2083
- "verification_key": "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"
2097
+ "bytecode": "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",
2098
+ "debug_symbols": "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",
2099
+ "verification_key": "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"
2084
2100
  },
2085
2101
  {
2086
2102
  "name": "set_update_delay",
@@ -2129,7 +2145,7 @@
2129
2145
  }
2130
2146
  },
2131
2147
  "bytecode": "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",
2132
- "debug_symbols": "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"
2148
+ "debug_symbols": "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"
2133
2149
  },
2134
2150
  {
2135
2151
  "name": "update",
@@ -2185,7 +2201,7 @@
2185
2201
  }
2186
2202
  },
2187
2203
  "bytecode": "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",
2188
- "debug_symbols": "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"
2204
+ "debug_symbols": "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"
2189
2205
  }
2190
2206
  ],
2191
2207
  "outputs": {
@@ -3903,25 +3919,45 @@
3903
3919
  "name": "PublicKeys::validate_on_curve",
3904
3920
  "start": 2492
3905
3921
  },
3922
+ {
3923
+ "name": "PublicKeys::validate_non_infinity",
3924
+ "start": 2722
3925
+ },
3906
3926
  {
3907
3927
  "name": "<impl ToPoint for AddressPoint>::to_point",
3908
- "start": 2799
3928
+ "start": 3207
3909
3929
  },
3910
3930
  {
3911
3931
  "name": "test::compute_public_keys_hash",
3912
- "start": 3086
3932
+ "start": 3517
3933
+ },
3934
+ {
3935
+ "name": "test::test_validate_on_curve",
3936
+ "start": 4231
3937
+ },
3938
+ {
3939
+ "name": "test::test_validate_not_on_curve",
3940
+ "start": 4690
3941
+ },
3942
+ {
3943
+ "name": "test::test_validate_non_infinity",
3944
+ "start": 5151
3945
+ },
3946
+ {
3947
+ "name": "test::test_validate_infinity",
3948
+ "start": 5621
3913
3949
  },
3914
3950
  {
3915
3951
  "name": "test::compute_default_hash",
3916
- "start": 3798
3952
+ "start": 6015
3917
3953
  },
3918
3954
  {
3919
3955
  "name": "test::serde",
3920
- "start": 4176
3956
+ "start": 6393
3921
3957
  }
3922
3958
  ],
3923
3959
  "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/public_keys.nr",
3924
- "source": "use crate::{\n address::public_keys_hash::PublicKeysHash,\n constants::{\n DEFAULT_IVPK_M_X, DEFAULT_IVPK_M_Y, DEFAULT_NPK_M_X, DEFAULT_NPK_M_Y, DEFAULT_OVPK_M_X,\n DEFAULT_OVPK_M_Y, DEFAULT_TPK_M_X, DEFAULT_TPK_M_Y, DOM_SEP__PUBLIC_KEYS_HASH,\n },\n hash::poseidon2_hash_with_separator,\n point::validate_on_curve,\n traits::{Deserialize, Hash, Serialize},\n};\n\nuse crate::point::Point;\nuse std::{default::Default, meta::derive};\n\npub trait ToPoint {\n fn to_point(self) -> Point;\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct NpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for NpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n// Note: If we store npk_m_hash directly we can remove this trait implementation. See #8091\nimpl Hash for NpkM {\n fn hash(self) -> Field {\n self.inner.hash()\n }\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct IvpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for IvpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct OvpkM {\n pub inner: Point,\n}\n\nimpl Hash for OvpkM {\n fn hash(self) -> Field {\n self.inner.hash()\n }\n}\n\nimpl ToPoint for OvpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct TpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for TpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct PublicKeys {\n pub npk_m: NpkM,\n pub ivpk_m: IvpkM,\n pub ovpk_m: OvpkM,\n pub tpk_m: TpkM,\n}\n\nimpl Default for PublicKeys {\n fn default() -> Self {\n PublicKeys {\n npk_m: NpkM {\n inner: Point { x: DEFAULT_NPK_M_X, y: DEFAULT_NPK_M_Y, is_infinite: false },\n },\n ivpk_m: IvpkM {\n inner: Point { x: DEFAULT_IVPK_M_X, y: DEFAULT_IVPK_M_Y, is_infinite: false },\n },\n ovpk_m: OvpkM {\n inner: Point { x: DEFAULT_OVPK_M_X, y: DEFAULT_OVPK_M_Y, is_infinite: false },\n },\n tpk_m: TpkM {\n inner: Point { x: DEFAULT_TPK_M_X, y: DEFAULT_TPK_M_Y, is_infinite: false },\n },\n }\n }\n}\n\nimpl PublicKeys {\n pub fn hash(self) -> PublicKeysHash {\n PublicKeysHash::from_field(poseidon2_hash_with_separator(\n self.serialize(),\n DOM_SEP__PUBLIC_KEYS_HASH as Field,\n ))\n }\n\n pub fn validate_on_curve(self) {\n validate_on_curve(self.npk_m.inner);\n validate_on_curve(self.ivpk_m.inner);\n validate_on_curve(self.ovpk_m.inner);\n validate_on_curve(self.tpk_m.inner);\n }\n}\n\npub struct AddressPoint {\n pub inner: Point,\n}\n\nimpl ToPoint for AddressPoint {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nmod test {\n use crate::point::Point;\n use crate::{\n point::POINT_LENGTH,\n public_keys::{IvpkM, NpkM, OvpkM, PublicKeys, TpkM},\n traits::{Deserialize, Serialize},\n };\n\n #[test]\n unconstrained fn compute_public_keys_hash() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point { x: 1, y: 2, is_infinite: false } },\n ivpk_m: IvpkM { inner: Point { x: 3, y: 4, is_infinite: false } },\n ovpk_m: OvpkM { inner: Point { x: 5, y: 6, is_infinite: false } },\n tpk_m: TpkM { inner: Point { x: 7, y: 8, is_infinite: false } },\n };\n\n let actual = keys.hash();\n\n // The following value was generated by `public_keys.test.ts`.\n let expected_public_keys_hash =\n 0x056998309f6c119e4d753e404f94fef859dddfa530a9379634ceb0854b29bf7a;\n\n assert(actual.to_field() == expected_public_keys_hash);\n }\n\n #[test]\n unconstrained fn compute_default_hash() {\n let keys = PublicKeys::default();\n\n let actual = keys.hash();\n\n // The following value was generated by `public_keys.test.ts`.\n let test_data_default_hash =\n 0x023547e676dba19784188825b901a0e70d8ad978300d21d6185a54281b734da0;\n\n assert(actual.to_field() == test_data_default_hash);\n }\n\n #[test]\n unconstrained fn serde() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point { x: 1, y: 2, is_infinite: false } },\n ivpk_m: IvpkM { inner: Point { x: 3, y: 4, is_infinite: false } },\n ovpk_m: OvpkM { inner: Point { x: 5, y: 6, is_infinite: false } },\n tpk_m: TpkM { inner: Point { x: 7, y: 8, is_infinite: false } },\n };\n\n // We use the PUBLIC_KEYS_LENGTH constant to ensure that there is a match between the derived trait\n let serialized: [Field; POINT_LENGTH * 4] = keys.serialize();\n let deserialized = PublicKeys::deserialize(serialized);\n\n assert_eq(keys, deserialized);\n }\n}\n"
3960
+ "source": "use crate::{\n address::public_keys_hash::PublicKeysHash,\n constants::{\n DEFAULT_IVPK_M_X, DEFAULT_IVPK_M_Y, DEFAULT_NPK_M_X, DEFAULT_NPK_M_Y, DEFAULT_OVPK_M_X,\n DEFAULT_OVPK_M_Y, DEFAULT_TPK_M_X, DEFAULT_TPK_M_Y, DOM_SEP__PUBLIC_KEYS_HASH,\n },\n hash::poseidon2_hash_with_separator,\n point::validate_on_curve,\n traits::{Deserialize, Hash, Serialize},\n};\n\nuse crate::point::Point;\nuse std::{default::Default, meta::derive};\n\npub trait ToPoint {\n fn to_point(self) -> Point;\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct NpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for NpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n// Note: If we store npk_m_hash directly we can remove this trait implementation. See #8091\nimpl Hash for NpkM {\n fn hash(self) -> Field {\n self.inner.hash()\n }\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct IvpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for IvpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct OvpkM {\n pub inner: Point,\n}\n\nimpl Hash for OvpkM {\n fn hash(self) -> Field {\n self.inner.hash()\n }\n}\n\nimpl ToPoint for OvpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct TpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for TpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct PublicKeys {\n pub npk_m: NpkM,\n pub ivpk_m: IvpkM,\n pub ovpk_m: OvpkM,\n pub tpk_m: TpkM,\n}\n\nimpl Default for PublicKeys {\n fn default() -> Self {\n PublicKeys {\n npk_m: NpkM {\n inner: Point { x: DEFAULT_NPK_M_X, y: DEFAULT_NPK_M_Y, is_infinite: false },\n },\n ivpk_m: IvpkM {\n inner: Point { x: DEFAULT_IVPK_M_X, y: DEFAULT_IVPK_M_Y, is_infinite: false },\n },\n ovpk_m: OvpkM {\n inner: Point { x: DEFAULT_OVPK_M_X, y: DEFAULT_OVPK_M_Y, is_infinite: false },\n },\n tpk_m: TpkM {\n inner: Point { x: DEFAULT_TPK_M_X, y: DEFAULT_TPK_M_Y, is_infinite: false },\n },\n }\n }\n}\n\nimpl PublicKeys {\n pub fn hash(self) -> PublicKeysHash {\n PublicKeysHash::from_field(poseidon2_hash_with_separator(\n self.serialize(),\n DOM_SEP__PUBLIC_KEYS_HASH as Field,\n ))\n }\n\n pub fn validate_on_curve(self) {\n validate_on_curve(self.npk_m.inner);\n validate_on_curve(self.ivpk_m.inner);\n validate_on_curve(self.ovpk_m.inner);\n validate_on_curve(self.tpk_m.inner);\n }\n\n pub fn validate_non_infinity(self) {\n assert_eq(self.npk_m.inner.is_infinite, false, \"NpkM is the point at infinity\");\n assert_eq(self.ivpk_m.inner.is_infinite, false, \"IvpkM is the point at infinity\");\n assert_eq(self.ovpk_m.inner.is_infinite, false, \"OvpkM is the point at infinity\");\n assert_eq(self.tpk_m.inner.is_infinite, false, \"TpkM is the point at infinity\");\n }\n}\n\npub struct AddressPoint {\n pub inner: Point,\n}\n\nimpl ToPoint for AddressPoint {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nmod test {\n use crate::point::Point;\n use crate::{\n point::POINT_LENGTH,\n public_keys::{IvpkM, NpkM, OvpkM, PublicKeys, TpkM},\n traits::{Deserialize, Serialize},\n };\n use std::ops::Neg;\n\n #[test]\n unconstrained fn compute_public_keys_hash() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point { x: 1, y: 2, is_infinite: false } },\n ivpk_m: IvpkM { inner: Point { x: 3, y: 4, is_infinite: false } },\n ovpk_m: OvpkM { inner: Point { x: 5, y: 6, is_infinite: false } },\n tpk_m: TpkM { inner: Point { x: 7, y: 8, is_infinite: false } },\n };\n\n let actual = keys.hash();\n\n // The following value was generated by `public_keys.test.ts`.\n let expected_public_keys_hash =\n 0x056998309f6c119e4d753e404f94fef859dddfa530a9379634ceb0854b29bf7a;\n\n assert(actual.to_field() == expected_public_keys_hash);\n }\n\n #[test]\n unconstrained fn test_validate_on_curve() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point::generator() },\n ivpk_m: IvpkM { inner: Point::generator().double() },\n ovpk_m: OvpkM { inner: Point::generator().neg() },\n tpk_m: TpkM { inner: Point::generator() + Point::generator().double() },\n };\n\n keys.validate_on_curve();\n }\n\n #[test(should_fail_with = \"Point not on curve\")]\n unconstrained fn test_validate_not_on_curve() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point { x: 1, y: 2, is_infinite: false } },\n ivpk_m: IvpkM { inner: Point { x: 3, y: 4, is_infinite: false } },\n ovpk_m: OvpkM { inner: Point { x: 5, y: 6, is_infinite: false } },\n tpk_m: TpkM { inner: Point { x: 7, y: 8, is_infinite: false } },\n };\n\n keys.validate_on_curve();\n }\n\n #[test]\n unconstrained fn test_validate_non_infinity() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point::generator() },\n ivpk_m: IvpkM { inner: Point::generator().double() },\n ovpk_m: OvpkM { inner: Point::generator().neg() },\n tpk_m: TpkM { inner: Point::generator() + Point::generator().double() },\n };\n\n keys.validate_non_infinity();\n }\n\n #[test(should_fail_with = \"TpkM is the point at infinity\")]\n unconstrained fn test_validate_infinity() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point::generator() },\n ivpk_m: IvpkM { inner: Point::generator().double() },\n ovpk_m: OvpkM { inner: Point::generator().neg() },\n tpk_m: TpkM { inner: Point::point_at_infinity() },\n };\n\n keys.validate_non_infinity();\n }\n\n #[test]\n unconstrained fn compute_default_hash() {\n let keys = PublicKeys::default();\n\n let actual = keys.hash();\n\n // The following value was generated by `public_keys.test.ts`.\n let test_data_default_hash =\n 0x023547e676dba19784188825b901a0e70d8ad978300d21d6185a54281b734da0;\n\n assert(actual.to_field() == test_data_default_hash);\n }\n\n #[test]\n unconstrained fn serde() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point { x: 1, y: 2, is_infinite: false } },\n ivpk_m: IvpkM { inner: Point { x: 3, y: 4, is_infinite: false } },\n ovpk_m: OvpkM { inner: Point { x: 5, y: 6, is_infinite: false } },\n tpk_m: TpkM { inner: Point { x: 7, y: 8, is_infinite: false } },\n };\n\n // We use the PUBLIC_KEYS_LENGTH constant to ensure that there is a match between the derived trait\n let serialized: [Field; POINT_LENGTH * 4] = keys.serialize();\n let deserialized = PublicKeys::deserialize(serialized);\n\n assert_eq(keys, deserialized);\n }\n}\n"
3925
3961
  },
3926
3962
  "212": {
3927
3963
  "function_locations": [
@@ -4873,27 +4909,27 @@
4873
4909
  },
4874
4910
  {
4875
4911
  "name": "ContractInstanceRegistry::update",
4876
- "start": 8454
4912
+ "start": 8513
4877
4913
  },
4878
4914
  {
4879
4915
  "name": "ContractInstanceRegistry::set_update_delay",
4880
- "start": 10748
4916
+ "start": 10807
4881
4917
  },
4882
4918
  {
4883
4919
  "name": "ContractInstanceRegistry::get_update_delay",
4884
- "start": 12051
4920
+ "start": 12110
4885
4921
  },
4886
4922
  {
4887
4923
  "name": "ContractInstanceRegistry::public_dispatch",
4888
- "start": 13211
4924
+ "start": 13270
4889
4925
  },
4890
4926
  {
4891
4927
  "name": "ContractInstanceRegistry::Storage<Context>::init",
4892
- "start": 14376
4928
+ "start": 14435
4893
4929
  }
4894
4930
  ],
4895
4931
  "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-contracts/contracts/protocol/contract_instance_registry_contract/src/main.nr",
4896
- "source": "/// Protocol contract responsible for deploying contract instances and managing contract upgrades.\n///\n/// In Aztec, contracts are split into *classes* (code, registered via ContractClassRegistry) and *instances*\n/// (deployments of a class at a unique address). This contract handles contract instance publishing and contract\n/// updates (updating instance to a new class).\npub contract ContractInstanceRegistry {\n use aztec::{\n context::{PrivateContext, PublicContext},\n hash::hash_args,\n nullifier::utils::compute_nullifier_existence_request,\n oracle::{avm, logging::debug_log_format, version::assert_compatible_oracle_version},\n protocol::{\n abis::function_selector::FunctionSelector,\n address::{AztecAddress, PartialAddress},\n constants::{\n CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS, CONTRACT_INSTANCE_PUBLISHED_MAGIC_VALUE,\n CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE, DEFAULT_UPDATE_DELAY, MINIMUM_UPDATE_DELAY,\n },\n contract_class_id::ContractClassId,\n public_keys::PublicKeys,\n traits::{Deserialize, Serialize, ToField},\n utils::reader::Reader,\n },\n state_vars::{DelayedPublicMutable, Map, StateVariable},\n };\n\n #[abi(events)]\n struct ContractInstancePublished {\n CONTRACT_INSTANCE_PUBLISHED_MAGIC_VALUE: Field,\n address: AztecAddress,\n version: u8,\n salt: Field,\n contract_class_id: ContractClassId,\n initialization_hash: Field,\n public_keys: PublicKeys,\n deployer: AztecAddress,\n }\n\n // Custom serialization is required because we don't want to waste one field for the `is_infinite` flag of public\n // key points (public key points will never be the infinity point).\n impl ContractInstancePublished {\n fn serialize_non_standard(self) -> [Field; 15] {\n [\n self.CONTRACT_INSTANCE_PUBLISHED_MAGIC_VALUE,\n self.address.to_field(),\n self.version.to_field(),\n self.salt,\n self.contract_class_id.to_field(),\n self.initialization_hash,\n self.public_keys.npk_m.serialize()[0],\n self.public_keys.npk_m.serialize()[1],\n self.public_keys.ivpk_m.serialize()[0],\n self.public_keys.ivpk_m.serialize()[1],\n self.public_keys.ovpk_m.serialize()[0],\n self.public_keys.ovpk_m.serialize()[1],\n self.public_keys.tpk_m.serialize()[0],\n self.public_keys.tpk_m.serialize()[1],\n self.deployer.to_field(),\n ]\n }\n }\n\n #[abi(events)]\n #[derive(Serialize)]\n struct ContractInstanceUpdated {\n CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE: Field,\n address: AztecAddress,\n prev_contract_class_id: ContractClassId,\n new_contract_class_id: ContractClassId,\n timestamp_of_change: u64,\n }\n\n struct Storage<Context> {\n /// Map from contract instance address to a `DelayedPublicMutable` holding the updated contract class ID.\n updated_class_ids: Map<AztecAddress, DelayedPublicMutable<ContractClassId, DEFAULT_UPDATE_DELAY, Context>, Context>,\n }\n\n /// Publishes a new contract instance.\n ///\n /// The caller provides deployment parameters (salt, class_id, init_hash, public_keys, universal_deploy).\n /// The `universal_deploy` flag controls whether the deployer address is bound into the contract address:\n /// when true, deployer is zero (anyone can deploy the same instance); when false, deployer is the caller.\n ///\n /// This function:\n /// 1. Verifies the contract class is registered in ContractClassRegistry (nullifier existence check).\n /// 2. Validates public key points are on the Grumpkin curve (preventing AVM DoS via invalid points).\n /// 3. Computes the deterministic contract address from the deployment parameters.\n /// 4. Emits the address as a nullifier (proving publication preventing duplicate deployment)\n /// --> this address nullifier is then checked to exist by the AVM upon public function execution (if it doesn't\n /// exist AVM reverts)\n /// 5. Broadcasts a `ContractInstancePublished` event so nodes can reconstruct the instance.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_private]\n fn publish_for_public_execution(\n inputs: aztec::context::inputs::PrivateContextInputs,\n salt: Field,\n contract_class_id: ContractClassId,\n initialization_hash: Field,\n public_keys: PublicKeys,\n universal_deploy: bool,\n ) -> return_data aztec::protocol::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs {\n // MACRO CODE START\n // Note: The macros initially inserted a phase check here, but since there is no phase change in this function\n // body, I have removed that check.\n assert_compatible_oracle_version();\n\n let serialized_params: [Field; 16] = [\n salt,\n contract_class_id.to_field(),\n initialization_hash,\n ]\n .concat(public_keys.serialize())\n .concat([universal_deploy.to_field()]);\n\n let args_hash: Field = hash_args(serialized_params);\n let mut context: PrivateContext = PrivateContext::new(inputs, args_hash);\n // MACRO CODE END\n\n // Verify the contract class is registered by checking for its nullifier at the ContractClassRegistry address.\n let nullifier_existence_request = compute_nullifier_existence_request(\n contract_class_id.to_field(),\n CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS,\n );\n context.assert_nullifier_exists(nullifier_existence_request);\n\n // For universal deployments, deployer is zero so the resulting address is the same regardless of who initiates\n // deployment.\n let deployer = if universal_deploy {\n AztecAddress::zero()\n } else {\n context.maybe_msg_sender().unwrap()\n };\n\n let partial_address =\n PartialAddress::compute(contract_class_id, salt, initialization_hash, deployer);\n\n // Validate public key points lie on the Grumpkin curve to prevent AVM DoS attacks.\n public_keys.validate_on_curve();\n\n let address = AztecAddress::compute(public_keys, partial_address);\n\n // Emit address as nullifier: prevents duplicate deployment and proves publication.\n // We use no domain separators because these are the only nullifiers this contract uses.\n context.push_nullifier(address.to_field());\n\n // Broadcast deployment event. Uses non-standard serialization (2 fields per point,\n // omitting is_infinite) for TypeScript SDK compatibility.\n let event = ContractInstancePublished {\n CONTRACT_INSTANCE_PUBLISHED_MAGIC_VALUE,\n contract_class_id,\n address,\n public_keys,\n initialization_hash,\n salt,\n deployer,\n version: 1,\n };\n let payload = event.serialize_non_standard();\n debug_log_format(\"ContractInstancePublished: {}\", payload);\n // We pad the payload with [0] to match the length required by emit_private_log. Since the log is not\n // encrypted, padding with zero rather than a random value is acceptable (we don't care about privacy here).\n let padded_log = payload.concat([0]);\n let length = payload.len();\n context.emit_private_log(padded_log, length);\n\n // MACRO CODE START\n context.finish()\n // MACRO CODE END\n }\n\n /// Schedules an upgrade of the calling contract instance to a new contract class.\n ///\n /// The change is time-delayed via `DelayedPublicMutable` and only takes effect after the configured\n /// delay has elapsed. Only the contract instance itself can call this function (msg.sender == address).\n ///\n /// This function:\n /// 1. Verifies msg.sender is a deployed contract (its address nullifier exists).\n /// 2. Verifies the new class is registered in ContractClassRegistry.\n /// 3. Schedules the class ID change and emits a `ContractInstanceUpdated` event.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n unconstrained fn update(new_contract_class_id: ContractClassId) {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 1] =\n avm::calldata_copy(1, <ContractClassId as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n // MACRO CODE END\n\n let address = context.maybe_msg_sender().unwrap();\n\n // Safety: we're using the nullifier's existence as a guarantee of the availability of the contract's\n // information through publishing, which is safe - we just need this information to be _eventually_ available.\n assert(\n context.nullifier_exists_unsafe(address.to_field(), context.this_address()),\n \"msg.sender is not deployed\",\n );\n\n // Safety: we're using the nullifier's existence as a guarantee of the availability of the new contract class'\n // information through registration, which is safe - we just need this information to be _eventually_ available.\n assert(\n context.nullifier_exists_unsafe(\n new_contract_class_id.to_field(),\n CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS,\n ),\n \"New contract class is not registered\",\n );\n\n let scheduled_value_update = storage\n .updated_class_ids\n .at(address)\n .schedule_and_get_value_change(new_contract_class_id);\n let (prev_contract_class_id, timestamp_of_change) = scheduled_value_update.get_previous();\n\n let event = ContractInstanceUpdated {\n CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE,\n address,\n prev_contract_class_id,\n new_contract_class_id,\n timestamp_of_change,\n };\n context.emit_public_log(event);\n }\n\n /// Schedules a change to the upgrade delay for the calling contract instance. The delay change is\n /// itself delayed (preventing atomically reducing delay + scheduling an instant upgrade). The new\n /// delay must be at least `MINIMUM_UPDATE_DELAY`.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n unconstrained fn set_update_delay(new_update_delay: u64) {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 1] = avm::calldata_copy(1, <u64 as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n // MACRO CODE END\n\n let msg_sender = context.maybe_msg_sender().unwrap();\n\n // Safety: we're using the nullifier's existence as a guarantee of the availability of the contract's\n // information through publishing, which is safe - we just need this information to be _eventually_ available.\n assert(\n context.nullifier_exists_unsafe(msg_sender.to_field(), context.this_address()),\n \"msg.sender is not deployed\",\n );\n\n assert(new_update_delay >= MINIMUM_UPDATE_DELAY, \"New update delay is too low\");\n\n storage.updated_class_ids.at(msg_sender).schedule_delay_change(new_update_delay);\n }\n\n /// Returns the current update delay for the calling contract instance.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_view]\n unconstrained fn get_update_delay() -> pub u64 {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 0] = avm::calldata_copy(1, 0);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n assert(context.is_static_call(), \"Function get_update_delay can only be called statically\");\n // MACRO CODE END\n\n storage.updated_class_ids.at(avm::sender()).get_current_delay()\n }\n\n // THE REST OF THE CODE IN THIS CONTRACT WAS ORIGINALLY INJECTED BY THE #[aztec] MACRO.\n\n global UPDATE_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"update((Field))\").to_field() };\n global SET_UPDATE_DELAY_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"set_update_delay(u64)\").to_field() };\n global GET_UPDATE_DELAY_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"get_update_delay()\").to_field() };\n\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n pub unconstrained fn public_dispatch(selector: Field) {\n if selector == UPDATE_SELECTOR {\n let input_calldata: [Field; 1] =\n avm::calldata_copy(1, <ContractClassId as Serialize>::N);\n let mut reader: Reader<1> = Reader::new(input_calldata);\n let arg0: ContractClassId =\n <ContractClassId as Deserialize>::stream_deserialize(&mut reader);\n update(arg0);\n avm::avm_return([].as_vector());\n };\n if selector == SET_UPDATE_DELAY_SELECTOR {\n let input_calldata: [Field; 1] = avm::calldata_copy(1, <u64 as Serialize>::N);\n let mut reader: Reader<1> = Reader::new(input_calldata);\n let arg0: u64 = <u64 as Deserialize>::stream_deserialize(&mut reader);\n set_update_delay(arg0);\n avm::avm_return([].as_vector());\n };\n if selector == GET_UPDATE_DELAY_SELECTOR {\n let return_value: [Field; 1] = <u64 as Serialize>::serialize(get_update_delay());\n avm::avm_return(return_value.as_vector());\n };\n panic(f\"Unknown selector {selector}\")\n }\n\n impl<Context> Storage<Context> {\n fn init(context: Context) -> Self {\n Self {\n updated_class_ids: <Map<AztecAddress, DelayedPublicMutable<ContractClassId, DEFAULT_UPDATE_DELAY, Context>, Context> as StateVariable<1, Context>>::new(\n context,\n 1,\n ),\n }\n }\n }\n\n pub struct publish_for_public_execution_parameters {\n pub _salt: Field,\n pub _contract_class_id: ContractClassId,\n pub _initialization_hash: Field,\n pub _public_keys: PublicKeys,\n pub _universal_deploy: bool,\n }\n\n pub struct update_parameters {\n pub _new_contract_class_id: ContractClassId,\n }\n\n pub struct set_update_delay_parameters {\n pub _new_update_delay: u64,\n }\n\n pub struct get_update_delay_parameters {}\n\n #[abi(functions)]\n pub struct publish_for_public_execution_abi {\n parameters: publish_for_public_execution_parameters,\n }\n\n #[abi(functions)]\n pub struct update_abi {\n parameters: update_parameters,\n }\n\n #[abi(functions)]\n pub struct set_update_delay_abi {\n parameters: set_update_delay_parameters,\n }\n\n #[abi(functions)]\n pub struct get_update_delay_abi {\n parameters: get_update_delay_parameters,\n return_type: u64,\n }\n}\n"
4932
+ "source": "/// Protocol contract responsible for deploying contract instances and managing contract upgrades.\n///\n/// In Aztec, contracts are split into *classes* (code, registered via ContractClassRegistry) and *instances*\n/// (deployments of a class at a unique address). This contract handles contract instance publishing and contract\n/// updates (updating instance to a new class).\npub contract ContractInstanceRegistry {\n use aztec::{\n context::{PrivateContext, PublicContext},\n hash::hash_args,\n nullifier::utils::compute_nullifier_existence_request,\n oracle::{avm, logging::debug_log_format, version::assert_compatible_oracle_version},\n protocol::{\n abis::function_selector::FunctionSelector,\n address::{AztecAddress, PartialAddress},\n constants::{\n CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS, CONTRACT_INSTANCE_PUBLISHED_MAGIC_VALUE,\n CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE, DEFAULT_UPDATE_DELAY, MINIMUM_UPDATE_DELAY,\n },\n contract_class_id::ContractClassId,\n public_keys::PublicKeys,\n traits::{Deserialize, Serialize, ToField},\n utils::reader::Reader,\n },\n state_vars::{DelayedPublicMutable, Map, StateVariable},\n };\n\n #[abi(events)]\n struct ContractInstancePublished {\n CONTRACT_INSTANCE_PUBLISHED_MAGIC_VALUE: Field,\n address: AztecAddress,\n version: u8,\n salt: Field,\n contract_class_id: ContractClassId,\n initialization_hash: Field,\n public_keys: PublicKeys,\n deployer: AztecAddress,\n }\n\n // Custom serialization is required because we don't want to waste one field for the `is_infinite` flag of public\n // key points (public key points will never be the infinity point).\n impl ContractInstancePublished {\n fn serialize_non_standard(self) -> [Field; 15] {\n [\n self.CONTRACT_INSTANCE_PUBLISHED_MAGIC_VALUE,\n self.address.to_field(),\n self.version.to_field(),\n self.salt,\n self.contract_class_id.to_field(),\n self.initialization_hash,\n self.public_keys.npk_m.serialize()[0],\n self.public_keys.npk_m.serialize()[1],\n self.public_keys.ivpk_m.serialize()[0],\n self.public_keys.ivpk_m.serialize()[1],\n self.public_keys.ovpk_m.serialize()[0],\n self.public_keys.ovpk_m.serialize()[1],\n self.public_keys.tpk_m.serialize()[0],\n self.public_keys.tpk_m.serialize()[1],\n self.deployer.to_field(),\n ]\n }\n }\n\n #[abi(events)]\n #[derive(Serialize)]\n struct ContractInstanceUpdated {\n CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE: Field,\n address: AztecAddress,\n prev_contract_class_id: ContractClassId,\n new_contract_class_id: ContractClassId,\n timestamp_of_change: u64,\n }\n\n struct Storage<Context> {\n /// Map from contract instance address to a `DelayedPublicMutable` holding the updated contract class ID.\n updated_class_ids: Map<AztecAddress, DelayedPublicMutable<ContractClassId, DEFAULT_UPDATE_DELAY, Context>, Context>,\n }\n\n /// Publishes a new contract instance.\n ///\n /// The caller provides deployment parameters (salt, class_id, init_hash, public_keys, universal_deploy).\n /// The `universal_deploy` flag controls whether the deployer address is bound into the contract address:\n /// when true, deployer is zero (anyone can deploy the same instance); when false, deployer is the caller.\n ///\n /// This function:\n /// 1. Verifies the contract class is registered in ContractClassRegistry (nullifier existence check).\n /// 2. Validates public key points are on the Grumpkin curve (preventing AVM DoS via invalid points).\n /// 3. Computes the deterministic contract address from the deployment parameters.\n /// 4. Emits the address as a nullifier (proving publication preventing duplicate deployment)\n /// --> this address nullifier is then checked to exist by the AVM upon public function execution (if it doesn't\n /// exist AVM reverts)\n /// 5. Broadcasts a `ContractInstancePublished` event so nodes can reconstruct the instance.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_private]\n fn publish_for_public_execution(\n inputs: aztec::context::inputs::PrivateContextInputs,\n salt: Field,\n contract_class_id: ContractClassId,\n initialization_hash: Field,\n public_keys: PublicKeys,\n universal_deploy: bool,\n ) -> return_data aztec::protocol::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs {\n // MACRO CODE START\n // Note: The macros initially inserted a phase check here, but since there is no phase change in this function\n // body, I have removed that check.\n assert_compatible_oracle_version();\n\n let serialized_params: [Field; 16] = [\n salt,\n contract_class_id.to_field(),\n initialization_hash,\n ]\n .concat(public_keys.serialize())\n .concat([universal_deploy.to_field()]);\n\n let args_hash: Field = hash_args(serialized_params);\n let mut context: PrivateContext = PrivateContext::new(inputs, args_hash);\n // MACRO CODE END\n\n // Verify the contract class is registered by checking for its nullifier at the ContractClassRegistry address.\n let nullifier_existence_request = compute_nullifier_existence_request(\n contract_class_id.to_field(),\n CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS,\n );\n context.assert_nullifier_exists(nullifier_existence_request);\n\n // For universal deployments, deployer is zero so the resulting address is the same regardless of who initiates\n // deployment.\n let deployer = if universal_deploy {\n AztecAddress::zero()\n } else {\n context.maybe_msg_sender().unwrap()\n };\n\n let partial_address =\n PartialAddress::compute(contract_class_id, salt, initialization_hash, deployer);\n\n // Validate public key points lie on the Grumpkin curve and are non-0 to prevent AVM DoS attacks.\n public_keys.validate_on_curve();\n public_keys.validate_non_infinity();\n\n let address = AztecAddress::compute(public_keys, partial_address);\n\n // Emit address as nullifier: prevents duplicate deployment and proves publication.\n // We use no domain separators because these are the only nullifiers this contract uses.\n context.push_nullifier(address.to_field());\n\n // Broadcast deployment event. Uses non-standard serialization (2 fields per point,\n // omitting is_infinite) for TypeScript SDK compatibility.\n let event = ContractInstancePublished {\n CONTRACT_INSTANCE_PUBLISHED_MAGIC_VALUE,\n contract_class_id,\n address,\n public_keys,\n initialization_hash,\n salt,\n deployer,\n version: 1,\n };\n let payload = event.serialize_non_standard();\n debug_log_format(\"ContractInstancePublished: {}\", payload);\n // We pad the payload with [0] to match the length required by emit_private_log. Since the log is not\n // encrypted, padding with zero rather than a random value is acceptable (we don't care about privacy here).\n let padded_log = payload.concat([0]);\n let length = payload.len();\n context.emit_private_log(padded_log, length);\n\n // MACRO CODE START\n context.finish()\n // MACRO CODE END\n }\n\n /// Schedules an upgrade of the calling contract instance to a new contract class.\n ///\n /// The change is time-delayed via `DelayedPublicMutable` and only takes effect after the configured\n /// delay has elapsed. Only the contract instance itself can call this function (msg.sender == address).\n ///\n /// This function:\n /// 1. Verifies msg.sender is a deployed contract (its address nullifier exists).\n /// 2. Verifies the new class is registered in ContractClassRegistry.\n /// 3. Schedules the class ID change and emits a `ContractInstanceUpdated` event.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n unconstrained fn update(new_contract_class_id: ContractClassId) {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 1] =\n avm::calldata_copy(1, <ContractClassId as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n // MACRO CODE END\n\n let address = context.maybe_msg_sender().unwrap();\n\n // Safety: we're using the nullifier's existence as a guarantee of the availability of the contract's\n // information through publishing, which is safe - we just need this information to be _eventually_ available.\n assert(\n context.nullifier_exists_unsafe(address.to_field(), context.this_address()),\n \"msg.sender is not deployed\",\n );\n\n // Safety: we're using the nullifier's existence as a guarantee of the availability of the new contract class'\n // information through registration, which is safe - we just need this information to be _eventually_ available.\n assert(\n context.nullifier_exists_unsafe(\n new_contract_class_id.to_field(),\n CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS,\n ),\n \"New contract class is not registered\",\n );\n\n let scheduled_value_update = storage\n .updated_class_ids\n .at(address)\n .schedule_and_get_value_change(new_contract_class_id);\n let (prev_contract_class_id, timestamp_of_change) = scheduled_value_update.get_previous();\n\n let event = ContractInstanceUpdated {\n CONTRACT_INSTANCE_UPDATED_MAGIC_VALUE,\n address,\n prev_contract_class_id,\n new_contract_class_id,\n timestamp_of_change,\n };\n context.emit_public_log(event);\n }\n\n /// Schedules a change to the upgrade delay for the calling contract instance. The delay change is\n /// itself delayed (preventing atomically reducing delay + scheduling an instant upgrade). The new\n /// delay must be at least `MINIMUM_UPDATE_DELAY`.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n unconstrained fn set_update_delay(new_update_delay: u64) {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 1] = avm::calldata_copy(1, <u64 as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n // MACRO CODE END\n\n let msg_sender = context.maybe_msg_sender().unwrap();\n\n // Safety: we're using the nullifier's existence as a guarantee of the availability of the contract's\n // information through publishing, which is safe - we just need this information to be _eventually_ available.\n assert(\n context.nullifier_exists_unsafe(msg_sender.to_field(), context.this_address()),\n \"msg.sender is not deployed\",\n );\n\n assert(new_update_delay >= MINIMUM_UPDATE_DELAY, \"New update delay is too low\");\n\n storage.updated_class_ids.at(msg_sender).schedule_delay_change(new_update_delay);\n }\n\n /// Returns the current update delay for the calling contract instance.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_view]\n unconstrained fn get_update_delay() -> pub u64 {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 0] = avm::calldata_copy(1, 0);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n assert(context.is_static_call(), \"Function get_update_delay can only be called statically\");\n // MACRO CODE END\n\n storage.updated_class_ids.at(avm::sender()).get_current_delay()\n }\n\n // THE REST OF THE CODE IN THIS CONTRACT WAS ORIGINALLY INJECTED BY THE #[aztec] MACRO.\n\n global UPDATE_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"update((Field))\").to_field() };\n global SET_UPDATE_DELAY_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"set_update_delay(u64)\").to_field() };\n global GET_UPDATE_DELAY_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"get_update_delay()\").to_field() };\n\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n pub unconstrained fn public_dispatch(selector: Field) {\n if selector == UPDATE_SELECTOR {\n let input_calldata: [Field; 1] =\n avm::calldata_copy(1, <ContractClassId as Serialize>::N);\n let mut reader: Reader<1> = Reader::new(input_calldata);\n let arg0: ContractClassId =\n <ContractClassId as Deserialize>::stream_deserialize(&mut reader);\n update(arg0);\n avm::avm_return([].as_vector());\n };\n if selector == SET_UPDATE_DELAY_SELECTOR {\n let input_calldata: [Field; 1] = avm::calldata_copy(1, <u64 as Serialize>::N);\n let mut reader: Reader<1> = Reader::new(input_calldata);\n let arg0: u64 = <u64 as Deserialize>::stream_deserialize(&mut reader);\n set_update_delay(arg0);\n avm::avm_return([].as_vector());\n };\n if selector == GET_UPDATE_DELAY_SELECTOR {\n let return_value: [Field; 1] = <u64 as Serialize>::serialize(get_update_delay());\n avm::avm_return(return_value.as_vector());\n };\n panic(f\"Unknown selector {selector}\")\n }\n\n impl<Context> Storage<Context> {\n fn init(context: Context) -> Self {\n Self {\n updated_class_ids: <Map<AztecAddress, DelayedPublicMutable<ContractClassId, DEFAULT_UPDATE_DELAY, Context>, Context> as StateVariable<1, Context>>::new(\n context,\n 1,\n ),\n }\n }\n }\n\n pub struct publish_for_public_execution_parameters {\n pub _salt: Field,\n pub _contract_class_id: ContractClassId,\n pub _initialization_hash: Field,\n pub _public_keys: PublicKeys,\n pub _universal_deploy: bool,\n }\n\n pub struct update_parameters {\n pub _new_contract_class_id: ContractClassId,\n }\n\n pub struct set_update_delay_parameters {\n pub _new_update_delay: u64,\n }\n\n pub struct get_update_delay_parameters {}\n\n #[abi(functions)]\n pub struct publish_for_public_execution_abi {\n parameters: publish_for_public_execution_parameters,\n }\n\n #[abi(functions)]\n pub struct update_abi {\n parameters: update_parameters,\n }\n\n #[abi(functions)]\n pub struct set_update_delay_abi {\n parameters: set_update_delay_parameters,\n }\n\n #[abi(functions)]\n pub struct get_update_delay_abi {\n parameters: get_update_delay_parameters,\n return_type: u64,\n }\n}\n"
4897
4933
  },
4898
4934
  "57": {
4899
4935
  "function_locations": [
@@ -29,7 +29,7 @@ export const ProtocolContractAddress = {
29
29
  };
30
30
  export const ProtocolContractDerivedAddress = {
31
31
  AuthRegistry: AztecAddress.fromString('0x12a6459c1f2b533065c084d826186d9dfad492924922c68e003bc5c43ba2a08e'),
32
- ContractInstanceRegistry: AztecAddress.fromString('0x1cefb7bd4829e0a592041e4214189b022a6d92b952c209896c1397669dedd5b6'),
32
+ ContractInstanceRegistry: AztecAddress.fromString('0x0fd3bd193160436d0f3b5fb8dc571b6dd26609676208dbbaa651a3091c3be622'),
33
33
  ContractClassRegistry: AztecAddress.fromString('0x1bd5e1848cea1978e5e7e1ab43e1ee0841eec353180d2a6b9424b621129c841f'),
34
34
  MultiCallEntrypoint: AztecAddress.fromString('0x1805bdf9ea6b8d24b7e77adacdc97cad5e05b4c6bca82aa9643bb61185d84645'),
35
35
  FeeJuice: AztecAddress.fromString('0x0422e93a4e0ec61d7aa9e15a18be31b4df0579272fee35d8035f6f5a22aecab4'),
@@ -37,7 +37,7 @@ export const ProtocolContractDerivedAddress = {
37
37
  };
38
38
  export const ProtocolContractClassId = {
39
39
  AuthRegistry: Fr.fromString('0x0c924424eb45fb647574ea3cab77e5eddad77783d7c8cea3e37ee1fabeabd8b9'),
40
- ContractInstanceRegistry: Fr.fromString('0x12512943b1a65df8daa2d97d7fd2bd75877467575033477a823a259ae2764e33'),
40
+ ContractInstanceRegistry: Fr.fromString('0x2b558d170505b9145742125a6145c4c0c60955caf4c57475348b442ed832160c'),
41
41
  ContractClassRegistry: Fr.fromString('0x01947a92fff95dc197da2aaec7619020db90d3a7db5d626256959a823af38e7d'),
42
42
  MultiCallEntrypoint: Fr.fromString('0x007d59b1b2d473558d7fa470595bfa370f8bb7859916b277cd84744241b23ca7'),
43
43
  FeeJuice: Fr.fromString('0x133473e9cd85598f72a98353225f1bd1804fdedcc7c655fccbc5572c4ea5a5af'),
@@ -50,8 +50,8 @@ export const ProtocolContractClassIdPreimage = {
50
50
  publicBytecodeCommitment: Fr.fromString('0x2545f39893766508ce37bb5cea5e4dcab04c6f7f79f3089b1c076876e9d268b2')
51
51
  },
52
52
  ContractInstanceRegistry: {
53
- artifactHash: Fr.fromString('0x034e3d1a5d68d07503c81df5cd90878b703a4c81b0a64f48593a818fb9f4bcd8'),
54
- privateFunctionsRoot: Fr.fromString('0x1df6fcdaf6edcfed3c82805121f879323d6b9fd44ccb8cf3a4c4af2826e781ba'),
53
+ artifactHash: Fr.fromString('0x283e94b2b29f2d1635d6f24284d03d2cea147a84477bbd66dc577f665e6fde48'),
54
+ privateFunctionsRoot: Fr.fromString('0x05e22bcc8b2a467fe12c7db8dc68888236c6c5922cc616e8b29bc4ac4bdfb6f5'),
55
55
  publicBytecodeCommitment: Fr.fromString('0x260735cf6645c6f07d2f0ebe2bfbd3062e95ddc820661329a5422bc239261bba')
56
56
  },
57
57
  ContractClassRegistry: {
@@ -93,7 +93,7 @@ export const ProtocolContractPrivateFunctions = {
93
93
  ContractInstanceRegistry: [
94
94
  {
95
95
  selector: FunctionSelector.fromField(Fr.fromString('0x0000000000000000000000000000000000000000000000000000000016ec12aa')),
96
- vkHash: Fr.fromString('0x21b9be49b81978f5e5aded45163364cfd51f9297ace9e1fba53a566f877f8701')
96
+ vkHash: Fr.fromString('0x2f916d74991f77eb9e6bf0493cea7b19c2a5ecf6b393bb1a8bb3bad4d7dd70a8')
97
97
  }
98
98
  ],
99
99
  ContractClassRegistry: [
@@ -122,7 +122,7 @@ export const ProtocolContractPrivateFunctions = {
122
122
  };
123
123
  export const ProtocolContractsList = new ProtocolContracts([
124
124
  AztecAddress.fromString('0x12a6459c1f2b533065c084d826186d9dfad492924922c68e003bc5c43ba2a08e'),
125
- AztecAddress.fromString('0x1cefb7bd4829e0a592041e4214189b022a6d92b952c209896c1397669dedd5b6'),
125
+ AztecAddress.fromString('0x0fd3bd193160436d0f3b5fb8dc571b6dd26609676208dbbaa651a3091c3be622'),
126
126
  AztecAddress.fromString('0x1bd5e1848cea1978e5e7e1ab43e1ee0841eec353180d2a6b9424b621129c841f'),
127
127
  AztecAddress.fromString('0x1805bdf9ea6b8d24b7e77adacdc97cad5e05b4c6bca82aa9643bb61185d84645'),
128
128
  AztecAddress.fromString('0x0422e93a4e0ec61d7aa9e15a18be31b4df0579272fee35d8035f6f5a22aecab4'),
@@ -133,5 +133,5 @@ export const ProtocolContractsList = new ProtocolContracts([
133
133
  AztecAddress.fromString('0x0000000000000000000000000000000000000000000000000000000000000000'),
134
134
  AztecAddress.fromString('0x0000000000000000000000000000000000000000000000000000000000000000')
135
135
  ]);
136
- export const protocolContractsHash = Fr.fromString('0x079ac03cfe37610a3aa59465b1d5308cb37f3fabc9562cf74339db2e897d4660');
136
+ export const protocolContractsHash = Fr.fromString('0x1a97530a258e8d3f92cf2d366264d2a1130bf38edf1b8d685bb7a674e9596486');
137
137
  export const CONTRACT_INSTANCE_PUBLISHED_EVENT_TAG = Fr.fromHexString('0x1a7e1badb79abdd38c684b3c8306ffe7ecb33c69e3380d9855730aaaa83a21a8');
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@aztec/protocol-contracts",
3
3
  "homepage": "https://github.com/AztecProtocol/aztec-packages/tree/master/yarn-project/protocol-contracts",
4
4
  "description": "Canonical Noir contracts for the Aztec Network",
5
- "version": "5.0.0-nightly.20260413",
5
+ "version": "5.0.0-nightly.20260414",
6
6
  "type": "module",
7
7
  "exports": {
8
8
  ".": "./dest/index.js",
@@ -73,9 +73,9 @@
73
73
  ]
74
74
  },
75
75
  "dependencies": {
76
- "@aztec/constants": "5.0.0-nightly.20260413",
77
- "@aztec/foundation": "5.0.0-nightly.20260413",
78
- "@aztec/stdlib": "5.0.0-nightly.20260413",
76
+ "@aztec/constants": "5.0.0-nightly.20260414",
77
+ "@aztec/foundation": "5.0.0-nightly.20260414",
78
+ "@aztec/stdlib": "5.0.0-nightly.20260414",
79
79
  "lodash.chunk": "^4.2.0",
80
80
  "lodash.omit": "^4.5.0",
81
81
  "tslib": "^2.4.0"
@@ -43,7 +43,7 @@ PublicChecks: AztecAddress.fromBigInt(6n)
43
43
 
44
44
  export const ProtocolContractDerivedAddress = {
45
45
  AuthRegistry: AztecAddress.fromString('0x12a6459c1f2b533065c084d826186d9dfad492924922c68e003bc5c43ba2a08e'),
46
- ContractInstanceRegistry: AztecAddress.fromString('0x1cefb7bd4829e0a592041e4214189b022a6d92b952c209896c1397669dedd5b6'),
46
+ ContractInstanceRegistry: AztecAddress.fromString('0x0fd3bd193160436d0f3b5fb8dc571b6dd26609676208dbbaa651a3091c3be622'),
47
47
  ContractClassRegistry: AztecAddress.fromString('0x1bd5e1848cea1978e5e7e1ab43e1ee0841eec353180d2a6b9424b621129c841f'),
48
48
  MultiCallEntrypoint: AztecAddress.fromString('0x1805bdf9ea6b8d24b7e77adacdc97cad5e05b4c6bca82aa9643bb61185d84645'),
49
49
  FeeJuice: AztecAddress.fromString('0x0422e93a4e0ec61d7aa9e15a18be31b4df0579272fee35d8035f6f5a22aecab4'),
@@ -54,7 +54,7 @@ PublicChecks: AztecAddress.fromString('0x14dcba1710109b8f3c942b8f4a81c7693c7d20b
54
54
 
55
55
  export const ProtocolContractClassId: Record<ProtocolContractName, Fr> = {
56
56
  AuthRegistry: Fr.fromString('0x0c924424eb45fb647574ea3cab77e5eddad77783d7c8cea3e37ee1fabeabd8b9'),
57
- ContractInstanceRegistry: Fr.fromString('0x12512943b1a65df8daa2d97d7fd2bd75877467575033477a823a259ae2764e33'),
57
+ ContractInstanceRegistry: Fr.fromString('0x2b558d170505b9145742125a6145c4c0c60955caf4c57475348b442ed832160c'),
58
58
  ContractClassRegistry: Fr.fromString('0x01947a92fff95dc197da2aaec7619020db90d3a7db5d626256959a823af38e7d'),
59
59
  MultiCallEntrypoint: Fr.fromString('0x007d59b1b2d473558d7fa470595bfa370f8bb7859916b277cd84744241b23ca7'),
60
60
  FeeJuice: Fr.fromString('0x133473e9cd85598f72a98353225f1bd1804fdedcc7c655fccbc5572c4ea5a5af'),
@@ -68,8 +68,8 @@ PublicChecks: Fr.fromString('0x2be0cdc153987032d0fc98096cbb42768f2ba747b07e10ae7
68
68
  publicBytecodeCommitment: Fr.fromString('0x2545f39893766508ce37bb5cea5e4dcab04c6f7f79f3089b1c076876e9d268b2'),
69
69
  },
70
70
  ContractInstanceRegistry: {
71
- artifactHash: Fr.fromString('0x034e3d1a5d68d07503c81df5cd90878b703a4c81b0a64f48593a818fb9f4bcd8'),
72
- privateFunctionsRoot: Fr.fromString('0x1df6fcdaf6edcfed3c82805121f879323d6b9fd44ccb8cf3a4c4af2826e781ba'),
71
+ artifactHash: Fr.fromString('0x283e94b2b29f2d1635d6f24284d03d2cea147a84477bbd66dc577f665e6fde48'),
72
+ privateFunctionsRoot: Fr.fromString('0x05e22bcc8b2a467fe12c7db8dc68888236c6c5922cc616e8b29bc4ac4bdfb6f5'),
73
73
  publicBytecodeCommitment: Fr.fromString('0x260735cf6645c6f07d2f0ebe2bfbd3062e95ddc820661329a5422bc239261bba'),
74
74
  },
75
75
  ContractClassRegistry: {
@@ -105,7 +105,7 @@ PublicChecks: Fr.fromString('0x0000000000000000000000000000000000000000000000000
105
105
 
106
106
  export const ProtocolContractPrivateFunctions: Record<ProtocolContractName, { selector: FunctionSelector; vkHash: Fr }[]> = {
107
107
  AuthRegistry: [{ selector: FunctionSelector.fromField(Fr.fromString('0x0000000000000000000000000000000000000000000000000000000079a3d418')), vkHash: Fr.fromString('0x25272e75e40823447b7914834e26e930f9fdd5a59f54deb854523a0c7ef291d3') }],
108
- ContractInstanceRegistry: [{ selector: FunctionSelector.fromField(Fr.fromString('0x0000000000000000000000000000000000000000000000000000000016ec12aa')), vkHash: Fr.fromString('0x21b9be49b81978f5e5aded45163364cfd51f9297ace9e1fba53a566f877f8701') }],
108
+ ContractInstanceRegistry: [{ selector: FunctionSelector.fromField(Fr.fromString('0x0000000000000000000000000000000000000000000000000000000016ec12aa')), vkHash: Fr.fromString('0x2f916d74991f77eb9e6bf0493cea7b19c2a5ecf6b393bb1a8bb3bad4d7dd70a8') }],
109
109
  ContractClassRegistry: [{ selector: FunctionSelector.fromField(Fr.fromString('0x000000000000000000000000000000000000000000000000000000006934ed0d')), vkHash: Fr.fromString('0x090f3a5b58db16a7ec1be17608fd4d96b875f825db6ba1b5015c410c11093da1') }],
110
110
  MultiCallEntrypoint: [{ selector: FunctionSelector.fromField(Fr.fromString('0x00000000000000000000000000000000000000000000000000000000f04908a9')), vkHash: Fr.fromString('0x2fd0a2c5fefca8b516af41dcc7e388f8710b638954b43924b5040b8b9c3e32ff') }],
111
111
  FeeJuice: [{ selector: FunctionSelector.fromField(Fr.fromString('0x00000000000000000000000000000000000000000000000000000000cbe67243')), vkHash: Fr.fromString('0x0fe89af8fdc790508d77050545e2b36bae91c2553c22ba9d0e3b7c492df6df52') }, { selector: FunctionSelector.fromField(Fr.fromString('0x00000000000000000000000000000000000000000000000000000000e8d374b6')), vkHash: Fr.fromString('0x0341fb609d50598157a44deef41e36b9a6c47bfe47ab8c5659753cc545fae2c5') }],
@@ -116,7 +116,7 @@ PublicChecks: []
116
116
 
117
117
  export const ProtocolContractsList = new ProtocolContracts([
118
118
  AztecAddress.fromString('0x12a6459c1f2b533065c084d826186d9dfad492924922c68e003bc5c43ba2a08e'),
119
- AztecAddress.fromString('0x1cefb7bd4829e0a592041e4214189b022a6d92b952c209896c1397669dedd5b6'),
119
+ AztecAddress.fromString('0x0fd3bd193160436d0f3b5fb8dc571b6dd26609676208dbbaa651a3091c3be622'),
120
120
  AztecAddress.fromString('0x1bd5e1848cea1978e5e7e1ab43e1ee0841eec353180d2a6b9424b621129c841f'),
121
121
  AztecAddress.fromString('0x1805bdf9ea6b8d24b7e77adacdc97cad5e05b4c6bca82aa9643bb61185d84645'),
122
122
  AztecAddress.fromString('0x0422e93a4e0ec61d7aa9e15a18be31b4df0579272fee35d8035f6f5a22aecab4'),
@@ -128,7 +128,7 @@ AztecAddress.fromString('0x00000000000000000000000000000000000000000000000000000
128
128
  AztecAddress.fromString('0x0000000000000000000000000000000000000000000000000000000000000000')
129
129
  ]);
130
130
 
131
- export const protocolContractsHash = Fr.fromString('0x079ac03cfe37610a3aa59465b1d5308cb37f3fabc9562cf74339db2e897d4660');
131
+ export const protocolContractsHash = Fr.fromString('0x1a97530a258e8d3f92cf2d366264d2a1130bf38edf1b8d685bb7a674e9596486');
132
132
 
133
133
 
134
134