@aztec-labs/protocol-contracts 6.0.0-rc.2 → 6.0.0-rc.3
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.
|
@@ -352,7 +352,7 @@
|
|
|
352
352
|
}
|
|
353
353
|
],
|
|
354
354
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/fnd/noir-protocol-circuits/crates/types/src/address/aztec_address.nr",
|
|
355
|
-
"source": "use crate::{\n address::{\n partial_address::PartialAddress, salted_initialization_hash::SaltedInitializationHash,\n },\n constants::{AZTEC_ADDRESS_LENGTH, DOM_SEP__CONTRACT_ADDRESS_V2, MAX_FIELD_VALUE},\n contract_class_id::ContractClassId,\n hash::poseidon2_hash_with_separator,\n public_keys::{hash_public_key, IvpkM, PublicKeys, ToPoint},\n traits::{Deserialize, Empty, FromField, Packable, Serialize, ToField},\n utils::field::sqrt,\n};\n\nuse crate::point::EmbeddedCurvePoint;\n\nuse crate::public_keys::AddressPoint;\nuse std::{\n embedded_curve_ops::{EmbeddedCurveScalar, fixed_base_scalar_mul as derive_public_key},\n ops::Add,\n};\nuse std::meta::derive;\n\n// Aztec address\n#[derive(Deserialize, Eq, Packable, Serialize)]\npub struct AztecAddress {\n pub inner: Field,\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self { inner: 0 }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for AztecAddress {\n fn from_field(value: Field) -> AztecAddress {\n AztecAddress { inner: value }\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n /// Returns `true` if the address is valid.\n ///\n /// An invalid address is one that can be proven to not be correctly derived, meaning it contains no contract code,\n /// public keys, etc., and can therefore not receive messages nor execute calls.\n pub fn is_valid(self) -> bool {\n self.get_y().is_some()\n }\n\n /// Returns an address's [`AddressPoint`].\n ///\n /// This can be used to create shared secrets with the owner of the address. If the address is invalid (see\n /// [`AztecAddress::is_valid`]) then this returns `Option::none()`, and no shared secrets can be created.\n pub fn to_address_point(self) -> Option<AddressPoint> {\n self.get_y().map(|y| {\n // If we get a negative y coordinate (y > (r - 1) / 2), we swap it to the\n // positive one (where y <= (r - 1) / 2) by negating it.\n let final_y = if Self::is_positive(y) { y } else { -y };\n\n AddressPoint { inner: EmbeddedCurvePoint { x: self.inner, y: final_y } }\n })\n }\n\n /// Determines whether a y-coordinate is in the lower (positive) or upper (negative) \"half\" of the field.\n /// I.e.\n /// y <= (r - 1)/2 => positive.\n /// y > (r - 1)/2 => negative.\n /// An AddressPoint always uses the \"positive\" y.\n fn is_positive(y: Field) -> bool {\n // Note: The field modulus r is MAX_FIELD_VALUE + 1.\n let MID = MAX_FIELD_VALUE / 2; // (r - 1) / 2\n let MID_PLUS_1 = MID + 1; // (r - 1)/2 + 1\n // Note: y <= m implies y < m + 1.\n y.lt(MID_PLUS_1)\n }\n\n /// Returns one of the two possible y-coordinates.\n ///\n /// Not all `AztecAddresses` are valid, in which case there is no corresponding y-coordinate. This returns\n /// `Option::none()` for invalid addresses.\n ///\n /// An `AztecAddress` is defined by an x-coordinate, for which two y-coordinates exist as solutions to the curve\n /// equation. This function returns either of them. Note that an [`AddressPoint`] must **always** have a positive\n /// y-coordinate - if trying to obtain the underlying point use [`AztecAddress::to_address_point`] instead.\n fn get_y(self) -> Option<Field> {\n // We compute the address point by taking our address as x, and then solving for y in the\n // equation which defines the grumpkin curve:\n // y^2 = x^3 - 17; x = address\n let x = self.inner;\n let y_squared = x * x * x - 17;\n\n sqrt(y_squared)\n }\n\n pub fn compute(public_keys: PublicKeys, partial_address: PartialAddress) -> AztecAddress {\n //\n // address = address_point.x\n // |\n // address_point = pre_address * G + Ivpk_m (always choose \"positive\" y-coord)\n // | ^\n // | |.....................\n // pre_address .\n // / \\ .\n // / \\ .\n // partial_address public_keys_hash .\n // / \\ / / | | | \\ .\n // / \\ / / | | | \\ .\n // npk_m_hash Ivpk_m ovpk_m_hash tpk_m_hash mspk_m_hash fbpk_m_hash\n // contract_class_id \\ |.........................\n // / | \\ \\\n // artifact_hash | public_bytecode_commitment salted_initialization_hash\n // | / / \\ \\\n // private_function_tree_root salt initialization_hash deployer_address immutables_hash\n // / \\ / \\\n // ... ... constructor_fn_selector constructor_args_hash\n // / \\\n // / \\ / \\\n // leaf leaf leaf leaf\n // ^\n // |\n // |---h(function_selector, vk_hash)\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n // Each of these represents a private function of the contract.\n\n let public_keys_hash = public_keys.hash();\n\n let pre_address = poseidon2_hash_with_separator(\n [public_keys_hash.to_field(), partial_address.to_field()],\n DOM_SEP__CONTRACT_ADDRESS_V2,\n );\n\n // Note: `.add()` will fail within the blackbox fn if either of the points are not on the curve. (See tests below).\n let address_point = derive_public_key(EmbeddedCurveScalar::from_field(pre_address)).add(\n public_keys.ivpk_m.to_point(),\n );\n\n // Note that our address is only the x-coordinate of the full address_point. This is okay because when people want to encrypt something and send it to us\n // they can recover our full point using the x-coordinate (our address itself). To do this, they recompute the y-coordinate according to the equation y^2 = x^3 - 17.\n // When they do this, they may get a positive y-coordinate (a value that is less than or equal to MAX_FIELD_VALUE / 2) or\n // a negative y-coordinate (a value that is more than MAX_FIELD_VALUE), and we cannot dictate which one they get and hence the recovered point may sometimes be different than the one\n // our secret can decrypt. Regardless though, they should and will always encrypt using point with the positive y-coordinate by convention.\n // This ensures that everyone encrypts to the same point given an arbitrary x-coordinate (address). This is allowed because even though our original point may not have a positive y-coordinate,\n // with our original secret, we will be able to derive the secret to the point with the flipped (and now positive) y-coordinate that everyone encrypts to.\n AztecAddress::from_field(address_point.x)\n }\n\n pub fn compute_from_class_id(\n contract_class_id: ContractClassId,\n salted_initialization_hash: SaltedInitializationHash,\n public_keys: PublicKeys,\n ) -> Self {\n let partial_address = PartialAddress::compute_from_salted_initialization_hash(\n contract_class_id,\n salted_initialization_hash,\n );\n\n AztecAddress::compute(public_keys, partial_address)\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n\n#[test]\nfn check_max_field_value() {\n // Check that it is indeed r-1.\n assert_eq(MAX_FIELD_VALUE + 1, 0);\n}\n\n#[test]\nfn check_is_positive() {\n assert(AztecAddress::is_positive(0));\n assert(AztecAddress::is_positive(1));\n assert(!AztecAddress::is_positive(-1));\n assert(AztecAddress::is_positive(MAX_FIELD_VALUE / 2));\n assert(!AztecAddress::is_positive((MAX_FIELD_VALUE / 2) + 1));\n}\n\n// Gives us confidence that we don't need to manually check that the input public keys need to be on the curve for `add`,\n// because the blackbox function does this check for us.\n#[test(should_fail_with = \"is not on curve\")]\nfn check_embedded_curve_point_add() {\n // Choose a point not on the curve in the 2nd position.\n let p1 = EmbeddedCurvePoint::generator();\n let key = IvpkM { inner: EmbeddedCurvePoint { x: 1, y: 1 } };\n let _ = p1 + key.to_point();\n}\n\n#[test]\nfn compute_address_from_partial_and_pub_keys() {\n let npk_m_point = EmbeddedCurvePoint {\n x: 0x22f7fcddfa3ce3e8f0cc8e82d7b94cdd740afa3e77f8e4a63ea78a239432dcab,\n y: 0x0471657de2b6216ade6c506d28fbc22ba8b8ed95c871ad9f3e3984e90d9723a7,\n };\n let ovpk_m_point = EmbeddedCurvePoint {\n x: 0x09115c96e962322ffed6522f57194627136b8d03ac7469109707f5e44190c484,\n y: 0x0c49773308a13d740a7f0d4f0e6163b02c5a408b6f965856b6a491002d073d5b,\n };\n let tpk_m_point = EmbeddedCurvePoint {\n x: 0x00d3d81beb009873eb7116327cf47c612d5758ef083d4fda78e9b63980b2a762,\n y: 0x2f567d22d2b02fe1f4ad42db9d58a36afd1983e7e2909d1cab61cafedad6193a,\n };\n let mspk_m_point = EmbeddedCurvePoint {\n x: 0x1bd6cb13e0bc8c6e0c1a8b2c5d7f9e0a4b6c8d0e2f4a6c8e0a2c4e6f8a0b2c4d,\n y: 0x0a032ec7b21c2bdb35f8a13e594764e39ee786c4b275eef3f0435bf6ab2b9822,\n };\n let fbpk_m_point = EmbeddedCurvePoint {\n x: 0x2c8e0a2c4e6f8b0d2f4a6c8e0a2c4e6f8b0d2f4a6c8e0a2c4e6f8b0d2f4a6c90,\n y: 0x2ef338da3a77e65f90b6d48ac686fc9ff3a95de0c39e0426fc443377425e6634,\n };\n\n let public_keys = PublicKeys {\n npk_m_hash: hash_public_key(npk_m_point),\n ivpk_m: IvpkM {\n inner: EmbeddedCurvePoint {\n x: 0x111223493147f6785514b1c195bb37a2589f22a6596d30bb2bb145fdc9ca8f1e,\n y: 0x273bbffd678edce8fe30e0deafc4f66d58357c06fd4a820285294b9746c3be95,\n },\n },\n ovpk_m_hash: hash_public_key(ovpk_m_point),\n tpk_m_hash: hash_public_key(tpk_m_point),\n mspk_m_hash: hash_public_key(mspk_m_point),\n fbpk_m_hash: hash_public_key(fbpk_m_point),\n };\n\n let partial_address = PartialAddress::from_field(\n 0x0a7c585381b10f4666044266a02405bf6e01fa564c8517d4ad5823493abd31de,\n );\n\n let address = AztecAddress::compute(public_keys, partial_address).to_field();\n\n let expected_computed_address_from_partial_and_pubkeys =\n 0x303ffc8bd456d132463b1fc3a633aeb718a7883c268f3956c05e6fe09b5a5424;\n assert_eq(address, expected_computed_address_from_partial_and_pubkeys);\n}\n\n#[test]\nfn compute_preaddress_from_partial_and_pub_keys() {\n let pre_address = poseidon2_hash_with_separator([1, 2], DOM_SEP__CONTRACT_ADDRESS_V2);\n let expected_computed_preaddress_from_partial_and_pubkey =\n 0x0fa1c698858df1a99170cd39d5f4bfad6d0d60f1f8afa3dc92281ee60b36f3bb;\n assert(pre_address == expected_computed_preaddress_from_partial_and_pubkey);\n}\n\n#[test]\nfn from_field_to_field() {\n let address = AztecAddress { inner: 37 };\n assert_eq(FromField::from_field(address.to_field()), address);\n}\n\n#[test]\nfn serde() {\n let address = AztecAddress { inner: 37 };\n // We use the AZTEC_ADDRESS_LENGTH constant to ensure that there is a match between the derived trait\n // implementation and the constant.\n let serialized: [Field; AZTEC_ADDRESS_LENGTH] = address.serialize();\n let deserialized = AztecAddress::deserialize(serialized);\n assert_eq(address, deserialized);\n}\n\n#[test]\nfn to_address_point_valid() {\n // x = 8 where x^3 - 17 = 512 - 17 = 495, which is a residue in this field\n let address = AztecAddress { inner: 8 };\n\n assert(address.get_y().is_some()); // We don't bother checking the result of get_y as it is only used internally\n assert(address.is_valid());\n\n let maybe_point = address.to_address_point();\n assert(maybe_point.is_some());\n\n let point = maybe_point.unwrap().inner;\n // check that x is preserved\n assert_eq(point.x, Field::from(8));\n\n // check that the curve equation holds: y^2 == x^3 - 17\n assert_eq(point.y * point.y, point.x * point.x * point.x - 17);\n}\n\n#[test]\nfn to_address_point_invalid() {\n // x = 3 where x^3 - 17 = 27 - 17 = 10, which is a non-residue in this field\n let address = AztecAddress { inner: 3 };\n\n assert(address.get_y().is_none());\n assert(!address.is_valid());\n\n assert(address.to_address_point().is_none());\n}\n"
|
|
355
|
+
"source": "use crate::{\n address::{\n partial_address::PartialAddress, salted_initialization_hash::SaltedInitializationHash,\n },\n constants::{AZTEC_ADDRESS_LENGTH, DOM_SEP__CONTRACT_ADDRESS_V3, MAX_FIELD_VALUE},\n contract_class_id::ContractClassId,\n hash::poseidon2_hash_with_separator,\n public_keys::{hash_public_key, IvpkM, PublicKeys, ToPoint},\n traits::{Deserialize, Empty, FromField, Packable, Serialize, ToField},\n utils::field::sqrt,\n};\n\nuse crate::point::EmbeddedCurvePoint;\n\nuse crate::public_keys::AddressPoint;\nuse std::{\n embedded_curve_ops::{EmbeddedCurveScalar, fixed_base_scalar_mul as derive_public_key},\n ops::Add,\n};\nuse std::meta::derive;\n\n// Aztec address\n#[derive(Deserialize, Eq, Packable, Serialize)]\npub struct AztecAddress {\n pub inner: Field,\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self { inner: 0 }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for AztecAddress {\n fn from_field(value: Field) -> AztecAddress {\n AztecAddress { inner: value }\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n /// Returns `true` if the address is valid.\n ///\n /// An invalid address is one that can be proven to not be correctly derived, meaning it contains no contract code,\n /// public keys, etc., and can therefore not receive messages nor execute calls.\n pub fn is_valid(self) -> bool {\n self.get_y().is_some()\n }\n\n /// Returns an address's [`AddressPoint`].\n ///\n /// This can be used to create shared secrets with the owner of the address. If the address is invalid (see\n /// [`AztecAddress::is_valid`]) then this returns `Option::none()`, and no shared secrets can be created.\n pub fn to_address_point(self) -> Option<AddressPoint> {\n self.get_y().map(|y| {\n // If we get a negative y coordinate (y > (r - 1) / 2), we swap it to the\n // positive one (where y <= (r - 1) / 2) by negating it.\n let final_y = if Self::is_positive(y) { y } else { -y };\n\n AddressPoint { inner: EmbeddedCurvePoint { x: self.inner, y: final_y } }\n })\n }\n\n /// Determines whether a y-coordinate is in the lower (positive) or upper (negative) \"half\" of the field.\n /// I.e.\n /// y <= (r - 1)/2 => positive.\n /// y > (r - 1)/2 => negative.\n /// An AddressPoint always uses the \"positive\" y.\n fn is_positive(y: Field) -> bool {\n // Note: The field modulus r is MAX_FIELD_VALUE + 1.\n let MID = MAX_FIELD_VALUE / 2; // (r - 1) / 2\n let MID_PLUS_1 = MID + 1; // (r - 1)/2 + 1\n // Note: y <= m implies y < m + 1.\n y.lt(MID_PLUS_1)\n }\n\n /// Returns one of the two possible y-coordinates.\n ///\n /// Not all `AztecAddresses` are valid, in which case there is no corresponding y-coordinate. This returns\n /// `Option::none()` for invalid addresses.\n ///\n /// An `AztecAddress` is defined by an x-coordinate, for which two y-coordinates exist as solutions to the curve\n /// equation. This function returns either of them. Note that an [`AddressPoint`] must **always** have a positive\n /// y-coordinate - if trying to obtain the underlying point use [`AztecAddress::to_address_point`] instead.\n fn get_y(self) -> Option<Field> {\n // We compute the address point by taking our address as x, and then solving for y in the\n // equation which defines the grumpkin curve:\n // y^2 = x^3 - 17; x = address\n let x = self.inner;\n let y_squared = x * x * x - 17;\n\n sqrt(y_squared)\n }\n\n pub fn compute(public_keys: PublicKeys, partial_address: PartialAddress) -> AztecAddress {\n //\n // address = address_point.x\n // |\n // address_point = pre_address * G + Ivpk_m (always choose \"positive\" y-coord)\n // | ^\n // | |.....................\n // pre_address .\n // / \\ .\n // / \\ .\n // partial_address public_keys_hash .\n // / \\ / / | | | \\ .\n // / \\ / / | | | \\ .\n // npk_m_hash Ivpk_m ovpk_m_hash tpk_m_hash mspk_m_hash fbpk_m_hash\n // contract_class_id \\ |.........................\n // / | \\ \\\n // artifact_hash | public_bytecode_commitment salted_initialization_hash\n // | / / \\ \\\n // private_function_tree_root salt initialization_hash deployer_address immutables_hash\n // / \\ / \\\n // ... ... constructor_fn_selector constructor_args_hash\n // / \\\n // / \\ / \\\n // leaf leaf leaf leaf\n // ^\n // |\n // |---h(function_selector, vk_hash)\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n // Each of these represents a private function of the contract.\n\n let public_keys_hash = public_keys.hash();\n\n let pre_address = poseidon2_hash_with_separator(\n [public_keys_hash.to_field(), partial_address.to_field()],\n DOM_SEP__CONTRACT_ADDRESS_V3,\n );\n\n // Note: `.add()` will fail within the blackbox fn if either of the points are not on the curve. (See tests below).\n let address_point = derive_public_key(EmbeddedCurveScalar::from_field(pre_address)).add(\n public_keys.ivpk_m.to_point(),\n );\n\n // Note that our address is only the x-coordinate of the full address_point. This is okay because when people want to encrypt something and send it to us\n // they can recover our full point using the x-coordinate (our address itself). To do this, they recompute the y-coordinate according to the equation y^2 = x^3 - 17.\n // When they do this, they may get a positive y-coordinate (a value that is less than or equal to MAX_FIELD_VALUE / 2) or\n // a negative y-coordinate (a value that is more than MAX_FIELD_VALUE), and we cannot dictate which one they get and hence the recovered point may sometimes be different than the one\n // our secret can decrypt. Regardless though, they should and will always encrypt using point with the positive y-coordinate by convention.\n // This ensures that everyone encrypts to the same point given an arbitrary x-coordinate (address). This is allowed because even though our original point may not have a positive y-coordinate,\n // with our original secret, we will be able to derive the secret to the point with the flipped (and now positive) y-coordinate that everyone encrypts to.\n AztecAddress::from_field(address_point.x)\n }\n\n pub fn compute_from_class_id(\n contract_class_id: ContractClassId,\n salted_initialization_hash: SaltedInitializationHash,\n public_keys: PublicKeys,\n ) -> Self {\n let partial_address = PartialAddress::compute_from_salted_initialization_hash(\n contract_class_id,\n salted_initialization_hash,\n );\n\n AztecAddress::compute(public_keys, partial_address)\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n\n#[test]\nfn check_max_field_value() {\n // Check that it is indeed r-1.\n assert_eq(MAX_FIELD_VALUE + 1, 0);\n}\n\n#[test]\nfn check_is_positive() {\n assert(AztecAddress::is_positive(0));\n assert(AztecAddress::is_positive(1));\n assert(!AztecAddress::is_positive(-1));\n assert(AztecAddress::is_positive(MAX_FIELD_VALUE / 2));\n assert(!AztecAddress::is_positive((MAX_FIELD_VALUE / 2) + 1));\n}\n\n// Gives us confidence that we don't need to manually check that the input public keys need to be on the curve for `add`,\n// because the blackbox function does this check for us.\n#[test(should_fail_with = \"is not on curve\")]\nfn check_embedded_curve_point_add() {\n // Choose a point not on the curve in the 2nd position.\n let p1 = EmbeddedCurvePoint::generator();\n let key = IvpkM { inner: EmbeddedCurvePoint { x: 1, y: 1 } };\n let _ = p1 + key.to_point();\n}\n\n#[test]\nfn compute_address_from_partial_and_pub_keys() {\n let npk_m_point = EmbeddedCurvePoint {\n x: 0x22f7fcddfa3ce3e8f0cc8e82d7b94cdd740afa3e77f8e4a63ea78a239432dcab,\n y: 0x0471657de2b6216ade6c506d28fbc22ba8b8ed95c871ad9f3e3984e90d9723a7,\n };\n let ovpk_m_point = EmbeddedCurvePoint {\n x: 0x09115c96e962322ffed6522f57194627136b8d03ac7469109707f5e44190c484,\n y: 0x0c49773308a13d740a7f0d4f0e6163b02c5a408b6f965856b6a491002d073d5b,\n };\n let tpk_m_point = EmbeddedCurvePoint {\n x: 0x00d3d81beb009873eb7116327cf47c612d5758ef083d4fda78e9b63980b2a762,\n y: 0x2f567d22d2b02fe1f4ad42db9d58a36afd1983e7e2909d1cab61cafedad6193a,\n };\n let mspk_m_point = EmbeddedCurvePoint {\n x: 0x1bd6cb13e0bc8c6e0c1a8b2c5d7f9e0a4b6c8d0e2f4a6c8e0a2c4e6f8a0b2c4d,\n y: 0x0a032ec7b21c2bdb35f8a13e594764e39ee786c4b275eef3f0435bf6ab2b9822,\n };\n let fbpk_m_point = EmbeddedCurvePoint {\n x: 0x2c8e0a2c4e6f8b0d2f4a6c8e0a2c4e6f8b0d2f4a6c8e0a2c4e6f8b0d2f4a6c90,\n y: 0x2ef338da3a77e65f90b6d48ac686fc9ff3a95de0c39e0426fc443377425e6634,\n };\n\n let public_keys = PublicKeys {\n npk_m_hash: hash_public_key(npk_m_point),\n ivpk_m: IvpkM {\n inner: EmbeddedCurvePoint {\n x: 0x111223493147f6785514b1c195bb37a2589f22a6596d30bb2bb145fdc9ca8f1e,\n y: 0x273bbffd678edce8fe30e0deafc4f66d58357c06fd4a820285294b9746c3be95,\n },\n },\n ovpk_m_hash: hash_public_key(ovpk_m_point),\n tpk_m_hash: hash_public_key(tpk_m_point),\n mspk_m_hash: hash_public_key(mspk_m_point),\n fbpk_m_hash: hash_public_key(fbpk_m_point),\n };\n\n let partial_address = PartialAddress::from_field(\n 0x0a7c585381b10f4666044266a02405bf6e01fa564c8517d4ad5823493abd31de,\n );\n\n let address = AztecAddress::compute(public_keys, partial_address).to_field();\n\n let expected_computed_address_from_partial_and_pubkeys =\n 0x23877639c7424d1d2a9f514e59ee662b3154a730b783caf822d196b625ba4355;\n assert_eq(address, expected_computed_address_from_partial_and_pubkeys);\n}\n\n#[test]\nfn compute_preaddress_from_partial_and_pub_keys() {\n let pre_address = poseidon2_hash_with_separator([1, 2], DOM_SEP__CONTRACT_ADDRESS_V3);\n let expected_computed_preaddress_from_partial_and_pubkey =\n 0x2e0787752b82b3ab9c28d67b48f24f8a3dac253023bf5136bbcb8ddbf4b1381c;\n assert(pre_address == expected_computed_preaddress_from_partial_and_pubkey);\n}\n\n#[test]\nfn from_field_to_field() {\n let address = AztecAddress { inner: 37 };\n assert_eq(FromField::from_field(address.to_field()), address);\n}\n\n#[test]\nfn serde() {\n let address = AztecAddress { inner: 37 };\n // We use the AZTEC_ADDRESS_LENGTH constant to ensure that there is a match between the derived trait\n // implementation and the constant.\n let serialized: [Field; AZTEC_ADDRESS_LENGTH] = address.serialize();\n let deserialized = AztecAddress::deserialize(serialized);\n assert_eq(address, deserialized);\n}\n\n#[test]\nfn to_address_point_valid() {\n // x = 8 where x^3 - 17 = 512 - 17 = 495, which is a residue in this field\n let address = AztecAddress { inner: 8 };\n\n assert(address.get_y().is_some()); // We don't bother checking the result of get_y as it is only used internally\n assert(address.is_valid());\n\n let maybe_point = address.to_address_point();\n assert(maybe_point.is_some());\n\n let point = maybe_point.unwrap().inner;\n // check that x is preserved\n assert_eq(point.x, Field::from(8));\n\n // check that the curve equation holds: y^2 == x^3 - 17\n assert_eq(point.y * point.y, point.x * point.x * point.x - 17);\n}\n\n#[test]\nfn to_address_point_invalid() {\n // x = 3 where x^3 - 17 = 27 - 17 = 10, which is a non-residue in this field\n let address = AztecAddress { inner: 3 };\n\n assert(address.get_y().is_none());\n assert(!address.is_valid());\n\n assert(address.to_address_point().is_none());\n}\n"
|
|
356
356
|
},
|
|
357
357
|
"145": {
|
|
358
358
|
"function_locations": [
|
|
@@ -4645,14 +4645,14 @@
|
|
|
4645
4645
|
"visibility": "databus"
|
|
4646
4646
|
}
|
|
4647
4647
|
},
|
|
4648
|
-
"bytecode": "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",
|
|
4648
|
+
"bytecode": "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",
|
|
4649
4649
|
"custom_attributes": [
|
|
4650
4650
|
"abi_private"
|
|
4651
4651
|
],
|
|
4652
4652
|
"debug_symbols": "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",
|
|
4653
4653
|
"is_unconstrained": false,
|
|
4654
4654
|
"name": "publish_for_public_execution",
|
|
4655
|
-
"verification_key": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAjc2r8ThB22y1flTYQgRI9QAAAAAAAAAAAAAAAAAAAAAABMcPK+mZjKZrqH1t6js1QAAAAAAAAAAAAAAAAAAACrjtukDi5lIaQ9+YwEOtIugAAAAAAAAAAAAAAAAAAAAAAAok0Uua1xsZzj9c2fRNBUAAAAAAAAAAAAAAAAAAAAtdHy+AV+vqQzpiQ69hp8jawAAAAAAAAAAAAAAAAAAAAAACenzKdOxVCXwgrwmKj+NAAAAAAAAAAAAAAAAAAAA2Kvs19iWTsBz6nsAFpDvNKkAAAAAAAAAAAAAAAAAAAAAAClfhrPbKt13aDnpy6z5tgAAAAAAAAAAAAAAAAAAAAMqZmVT2IRuVN1SookNP37NAAAAAAAAAAAAAAAAAAAAAAAivxYY/C0aoL9Rx6SV9ecAAAAAAAAAAAAAAAAAAACtk3ghg7AUaSGH1jU8GKX5dgAAAAAAAAAAAAAAAAAAAAAAIhmHs15XWUIH/stso7t6AAAAAAAAAAAAAAAAAAAA4DDFJcLak9jZkg0145mei0MAAAAAAAAAAAAAAAAAAAAAAB++qZtG+6atP9SnLyUnngAAAAAAAAAAAAAAAAAAAH/l1o9fiSQdCJo3sRZydCmbAAAAAAAAAAAAAAAAAAAAAAABIRnmcJDdOc16e/J+wrcAAAAAAAAAAAAAAAAAAAAH9s6eR2l+u3Q6JLVzKaidagAAAAAAAAAAAAAAAAAAAAAAE8AyeY6H5jXAQh0KF49sAAAAAAAAAAAAAAAAAAAAgQe/Cj+P3zz89YaziItUaU0AAAAAAAAAAAAAAAAAAAAAAAEjNKwsX4hibgR9Mk4cZgAAAAAAAAAAAAAAAAAAAEPckDyQK+nbalRgZBddZjKUAAAAAAAAAAAAAAAAAAAAAAAsTdxnQwIeIaXAVyH5BU0AAAAAAAAAAAAAAAAAAABIJs34uc7Kp0XmcLSsrNag9QAAAAAAAAAAAAAAAAAAAAAAAp1A98E/SC9oASg6r6dEAAAAAAAAAAAAAAAAAAAAcQUcMamgwWJCgD9Ir2E66REAAAAAAAAAAAAAAAAAAAAAAAPe1RsiIMmfN3+TzBFL8AAAAAAAAAAAAAAAAAAAAPIm4Ez0w827ig5IDOCHPssvAAAAAAAAAAAAAAAAAAAAAAAGrz9k6H4tuFB+LjeYGj0AAAAAAAAAAAAAAAAAAABdx9R2dkB11mzWaixpoV/gQgAAAAAAAAAAAAAAAAAAAAAAD1CxMTNGE9LhdPcZvQgpAAAAAAAAAAAAAAAAAAAAj5LT5bNYgwCf/a91r0xIh6sAAAAAAAAAAAAAAAAAAAAAACjxIg8TcQjF48miNXXJaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxTYP6fWDbSQZRbuJ5zWbrvkAAAAAAAAAAAAAAAAAAAAAAC5my4nXn1KgoVbIIcQSrgAAAAAAAAAAAAAAAAAAAHomTu5KdVxWFjwAzOtX8vEQAAAAAAAAAAAAAAAAAAAAAAAM0+KPLzuNjTOZBsn/
|
|
4655
|
+
"verification_key": "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"
|
|
4656
4656
|
},
|
|
4657
4657
|
{
|
|
4658
4658
|
"abi": {
|
|
@@ -5197,5 +5197,5 @@
|
|
|
5197
5197
|
}
|
|
5198
5198
|
},
|
|
5199
5199
|
"transpiled": true,
|
|
5200
|
-
"aztec_version": "6.0.0-rc.
|
|
5200
|
+
"aztec_version": "6.0.0-rc.3"
|
|
5201
5201
|
}
|
package/artifacts/FeeJuice.json
CHANGED
|
@@ -19,19 +19,19 @@ export const ProtocolContractAddress = {
|
|
|
19
19
|
FeeJuice: AztecAddress.fromBigIntUnsafe(3n)
|
|
20
20
|
};
|
|
21
21
|
export const ProtocolContractDerivedAddress = {
|
|
22
|
-
ContractInstanceRegistry: AztecAddress.fromStringUnsafe('
|
|
23
|
-
ContractClassRegistry: AztecAddress.fromStringUnsafe('
|
|
24
|
-
FeeJuice: AztecAddress.fromStringUnsafe('
|
|
22
|
+
ContractInstanceRegistry: AztecAddress.fromStringUnsafe('0x2b937086a6b367070f03fd007b932f64fcce36501ffcad6ff7c73f1d116e1c77'),
|
|
23
|
+
ContractClassRegistry: AztecAddress.fromStringUnsafe('0x2b95cb98fbd2723c66350f27310e670ff9faeaa8ca100ce83a3195e4d8235e17'),
|
|
24
|
+
FeeJuice: AztecAddress.fromStringUnsafe('0x064e81954bc70f4c8e060d4fa2ba0427eff0fe10f1f5aa57bf8f93c8745fac79')
|
|
25
25
|
};
|
|
26
26
|
export const ProtocolContractClassId = {
|
|
27
|
-
ContractInstanceRegistry: Fr.fromString('
|
|
27
|
+
ContractInstanceRegistry: Fr.fromString('0x250bc22bd53e83820ec12b83b41addb81073884ef63e7dc5261787bf92850f7f'),
|
|
28
28
|
ContractClassRegistry: Fr.fromString('0x010f027b753bf0e29dedc8e47a8bdda62211a7253b002b625cffb475495dc002'),
|
|
29
29
|
FeeJuice: Fr.fromString('0x1fa4d16bbcc242b144b07ee9a424083ee404ed9ce11037b24c465057b6a92c59')
|
|
30
30
|
};
|
|
31
31
|
export const ProtocolContractClassIdPreimage = {
|
|
32
32
|
ContractInstanceRegistry: {
|
|
33
|
-
artifactHash: Fr.fromString('
|
|
34
|
-
privateFunctionsRoot: Fr.fromString('
|
|
33
|
+
artifactHash: Fr.fromString('0x28f9ec60f51cd93bc2cd3d021d3a0d1847cd3b4b57ed6fb22435d422b3a0fb31'),
|
|
34
|
+
privateFunctionsRoot: Fr.fromString('0x2cab3dca97df25e1b2f62b64540799a1130f8d2cf41aff507909ec075cb3905b'),
|
|
35
35
|
publicBytecodeCommitment: Fr.fromString('0x1fd8380bb220e7d13db681da7e62c93b03add6754895a84c51d13fcde03e8d25')
|
|
36
36
|
},
|
|
37
37
|
ContractClassRegistry: {
|
|
@@ -54,7 +54,7 @@ export const ProtocolContractPrivateFunctions = {
|
|
|
54
54
|
ContractInstanceRegistry: [
|
|
55
55
|
{
|
|
56
56
|
selector: FunctionSelector.fromField(Fr.fromString('0x0000000000000000000000000000000000000000000000000000000077cff62f')),
|
|
57
|
-
vkHash: Fr.fromString('
|
|
57
|
+
vkHash: Fr.fromString('0x0ba93c1df26342e4871884648597eba8204fe51b1295e00ecb69a011db1359b6')
|
|
58
58
|
}
|
|
59
59
|
],
|
|
60
60
|
ContractClassRegistry: [
|
|
@@ -75,9 +75,9 @@ export const ProtocolContractPrivateFunctions = {
|
|
|
75
75
|
]
|
|
76
76
|
};
|
|
77
77
|
export const ProtocolContractsList = new ProtocolContracts([
|
|
78
|
-
AztecAddress.fromStringUnsafe('
|
|
79
|
-
AztecAddress.fromStringUnsafe('
|
|
80
|
-
AztecAddress.fromStringUnsafe('
|
|
78
|
+
AztecAddress.fromStringUnsafe('0x2b95cb98fbd2723c66350f27310e670ff9faeaa8ca100ce83a3195e4d8235e17'),
|
|
79
|
+
AztecAddress.fromStringUnsafe('0x2b937086a6b367070f03fd007b932f64fcce36501ffcad6ff7c73f1d116e1c77'),
|
|
80
|
+
AztecAddress.fromStringUnsafe('0x064e81954bc70f4c8e060d4fa2ba0427eff0fe10f1f5aa57bf8f93c8745fac79'),
|
|
81
81
|
AztecAddress.fromStringUnsafe('0x0000000000000000000000000000000000000000000000000000000000000000'),
|
|
82
82
|
AztecAddress.fromStringUnsafe('0x0000000000000000000000000000000000000000000000000000000000000000'),
|
|
83
83
|
AztecAddress.fromStringUnsafe('0x0000000000000000000000000000000000000000000000000000000000000000'),
|
|
@@ -87,13 +87,13 @@ export const ProtocolContractsList = new ProtocolContracts([
|
|
|
87
87
|
AztecAddress.fromStringUnsafe('0x0000000000000000000000000000000000000000000000000000000000000000'),
|
|
88
88
|
AztecAddress.fromStringUnsafe('0x0000000000000000000000000000000000000000000000000000000000000000')
|
|
89
89
|
]);
|
|
90
|
-
export const protocolContractsHash = Fr.fromString('
|
|
90
|
+
export const protocolContractsHash = Fr.fromString('0x0f54271c52865841a77aaa66036eed901aff22fdce9f08e123ec8b205c9854d7');
|
|
91
91
|
export const ProtocolContractGenesisNullifiers = [
|
|
92
92
|
Fr.fromString('0x04287df03953b0d68b0e83e08a89067afc602626defd6002277cd6df34696818'),
|
|
93
93
|
Fr.fromString('0x0d99507b7ecac720c73bf197a0e7366a5ed80c1c1b0afe8ff8c6ecc7b5a7aefe'),
|
|
94
94
|
Fr.fromString('0x0eb50b367fb754d3a7d1238bfc105cc9b391a02e187be69038876ae9a502e877'),
|
|
95
|
+
Fr.fromString('0x16f917edd8e333013e5bb0633f7f484725bd19403854d6112992dccef4961e32'),
|
|
95
96
|
Fr.fromString('0x1cea539e01abaa5db980e7ff52ef0d2a7772310306ac625783ae435756ee326d'),
|
|
96
|
-
Fr.fromString('0x2c1eb017f1534e95d91808e7ccc5f24a1cc6bf5686c6b6598e79b6f571d386fe'),
|
|
97
97
|
Fr.fromString('0x2c3a57c8d7c387652babd36c4d79ab03c0fe593e160315a4dc098f92caf592c3')
|
|
98
98
|
];
|
|
99
99
|
export const CONTRACT_INSTANCE_PUBLISHED_EVENT_TAG = Fr.fromHexString('0x1a7e1badb79abdd38c684b3c8306ffe7ecb33c69e3380d9855730aaaa83a21a8');
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@aztec-labs/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": "6.0.0-rc.
|
|
5
|
+
"version": "6.0.0-rc.3",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": "./dest/index.js",
|
|
@@ -73,15 +73,15 @@
|
|
|
73
73
|
]
|
|
74
74
|
},
|
|
75
75
|
"dependencies": {
|
|
76
|
-
"@aztec-labs/constants": "6.0.0-rc.
|
|
77
|
-
"@aztec-labs/foundation": "6.0.0-rc.
|
|
78
|
-
"@aztec-labs/stdlib": "6.0.0-rc.
|
|
76
|
+
"@aztec-labs/constants": "6.0.0-rc.3",
|
|
77
|
+
"@aztec-labs/foundation": "6.0.0-rc.3",
|
|
78
|
+
"@aztec-labs/stdlib": "6.0.0-rc.3",
|
|
79
79
|
"lodash.chunk": "^4.2.0",
|
|
80
80
|
"lodash.omit": "^4.5.0",
|
|
81
81
|
"tslib": "^2.4.0"
|
|
82
82
|
},
|
|
83
83
|
"devDependencies": {
|
|
84
|
-
"@aztec-foundation/protocol-contracts-artifacts": "6.0.0-rc.
|
|
84
|
+
"@aztec-foundation/protocol-contracts-artifacts": "6.0.0-rc.6",
|
|
85
85
|
"@jest/globals": "^30.0.0",
|
|
86
86
|
"@types/jest": "^30.0.0",
|
|
87
87
|
"@types/lodash.chunk": "^4.2.9",
|
|
@@ -33,23 +33,23 @@ FeeJuice: AztecAddress.fromBigIntUnsafe(3n)
|
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
export const ProtocolContractDerivedAddress = {
|
|
36
|
-
ContractInstanceRegistry: AztecAddress.fromStringUnsafe('
|
|
37
|
-
ContractClassRegistry: AztecAddress.fromStringUnsafe('
|
|
38
|
-
FeeJuice: AztecAddress.fromStringUnsafe('
|
|
36
|
+
ContractInstanceRegistry: AztecAddress.fromStringUnsafe('0x2b937086a6b367070f03fd007b932f64fcce36501ffcad6ff7c73f1d116e1c77'),
|
|
37
|
+
ContractClassRegistry: AztecAddress.fromStringUnsafe('0x2b95cb98fbd2723c66350f27310e670ff9faeaa8ca100ce83a3195e4d8235e17'),
|
|
38
|
+
FeeJuice: AztecAddress.fromStringUnsafe('0x064e81954bc70f4c8e060d4fa2ba0427eff0fe10f1f5aa57bf8f93c8745fac79')
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
export const ProtocolContractClassId: Record<ProtocolContractName, Fr> = {
|
|
44
|
-
ContractInstanceRegistry: Fr.fromString('
|
|
44
|
+
ContractInstanceRegistry: Fr.fromString('0x250bc22bd53e83820ec12b83b41addb81073884ef63e7dc5261787bf92850f7f'),
|
|
45
45
|
ContractClassRegistry: Fr.fromString('0x010f027b753bf0e29dedc8e47a8bdda62211a7253b002b625cffb475495dc002'),
|
|
46
46
|
FeeJuice: Fr.fromString('0x1fa4d16bbcc242b144b07ee9a424083ee404ed9ce11037b24c465057b6a92c59')
|
|
47
47
|
};
|
|
48
48
|
|
|
49
49
|
export const ProtocolContractClassIdPreimage: Record<ProtocolContractName, { artifactHash: Fr; privateFunctionsRoot: Fr; publicBytecodeCommitment: Fr }> = {
|
|
50
50
|
ContractInstanceRegistry: {
|
|
51
|
-
artifactHash: Fr.fromString('
|
|
52
|
-
privateFunctionsRoot: Fr.fromString('
|
|
51
|
+
artifactHash: Fr.fromString('0x28f9ec60f51cd93bc2cd3d021d3a0d1847cd3b4b57ed6fb22435d422b3a0fb31'),
|
|
52
|
+
privateFunctionsRoot: Fr.fromString('0x2cab3dca97df25e1b2f62b64540799a1130f8d2cf41aff507909ec075cb3905b'),
|
|
53
53
|
publicBytecodeCommitment: Fr.fromString('0x1fd8380bb220e7d13db681da7e62c93b03add6754895a84c51d13fcde03e8d25'),
|
|
54
54
|
},
|
|
55
55
|
ContractClassRegistry: {
|
|
@@ -71,7 +71,7 @@ FeeJuice: Fr.fromString('0x00000000000000000000000000000000000000000000000000000
|
|
|
71
71
|
};
|
|
72
72
|
|
|
73
73
|
export const ProtocolContractPrivateFunctions: Record<ProtocolContractName, { selector: FunctionSelector; vkHash: Fr }[]> = {
|
|
74
|
-
ContractInstanceRegistry: [{ selector: FunctionSelector.fromField(Fr.fromString('0x0000000000000000000000000000000000000000000000000000000077cff62f')), vkHash: Fr.fromString('
|
|
74
|
+
ContractInstanceRegistry: [{ selector: FunctionSelector.fromField(Fr.fromString('0x0000000000000000000000000000000000000000000000000000000077cff62f')), vkHash: Fr.fromString('0x0ba93c1df26342e4871884648597eba8204fe51b1295e00ecb69a011db1359b6') }],
|
|
75
75
|
ContractClassRegistry: [{ selector: FunctionSelector.fromField(Fr.fromString('0x000000000000000000000000000000000000000000000000000000006934ed0d')), vkHash: Fr.fromString('0x1af8e7c965fa21b828e2307fb320fbf38038a42121495906aba2b80c3f072bd8') }],
|
|
76
76
|
FeeJuice: [{ selector: FunctionSelector.fromField(Fr.fromString('0x00000000000000000000000000000000000000000000000000000000cbe67243')), vkHash: Fr.fromString('0x2e78182eafa9eedb8a75d0eabee8cc7031a41b2d630949979a9495f6be9d9e2e') }, { selector: FunctionSelector.fromField(Fr.fromString('0x00000000000000000000000000000000000000000000000000000000e8d374b6')), vkHash: Fr.fromString('0x253da18011550ba749e4311e9dc5f59309a35c27b1d16e1f9ccb90bae9db1235') }]
|
|
77
77
|
};
|
|
@@ -79,9 +79,9 @@ FeeJuice: [{ selector: FunctionSelector.fromField(Fr.fromString('0x0000000000000
|
|
|
79
79
|
|
|
80
80
|
|
|
81
81
|
export const ProtocolContractsList = new ProtocolContracts([
|
|
82
|
-
AztecAddress.fromStringUnsafe('
|
|
83
|
-
AztecAddress.fromStringUnsafe('
|
|
84
|
-
AztecAddress.fromStringUnsafe('
|
|
82
|
+
AztecAddress.fromStringUnsafe('0x2b95cb98fbd2723c66350f27310e670ff9faeaa8ca100ce83a3195e4d8235e17'),
|
|
83
|
+
AztecAddress.fromStringUnsafe('0x2b937086a6b367070f03fd007b932f64fcce36501ffcad6ff7c73f1d116e1c77'),
|
|
84
|
+
AztecAddress.fromStringUnsafe('0x064e81954bc70f4c8e060d4fa2ba0427eff0fe10f1f5aa57bf8f93c8745fac79'),
|
|
85
85
|
AztecAddress.fromStringUnsafe('0x0000000000000000000000000000000000000000000000000000000000000000'),
|
|
86
86
|
AztecAddress.fromStringUnsafe('0x0000000000000000000000000000000000000000000000000000000000000000'),
|
|
87
87
|
AztecAddress.fromStringUnsafe('0x0000000000000000000000000000000000000000000000000000000000000000'),
|
|
@@ -92,7 +92,7 @@ AztecAddress.fromStringUnsafe('0x00000000000000000000000000000000000000000000000
|
|
|
92
92
|
AztecAddress.fromStringUnsafe('0x0000000000000000000000000000000000000000000000000000000000000000')
|
|
93
93
|
]);
|
|
94
94
|
|
|
95
|
-
export const protocolContractsHash = Fr.fromString('
|
|
95
|
+
export const protocolContractsHash = Fr.fromString('0x0f54271c52865841a77aaa66036eed901aff22fdce9f08e123ec8b205c9854d7');
|
|
96
96
|
|
|
97
97
|
|
|
98
98
|
|
|
@@ -100,8 +100,8 @@ AztecAddress.fromStringUnsafe('0x00000000000000000000000000000000000000000000000
|
|
|
100
100
|
Fr.fromString('0x04287df03953b0d68b0e83e08a89067afc602626defd6002277cd6df34696818'),
|
|
101
101
|
Fr.fromString('0x0d99507b7ecac720c73bf197a0e7366a5ed80c1c1b0afe8ff8c6ecc7b5a7aefe'),
|
|
102
102
|
Fr.fromString('0x0eb50b367fb754d3a7d1238bfc105cc9b391a02e187be69038876ae9a502e877'),
|
|
103
|
+
Fr.fromString('0x16f917edd8e333013e5bb0633f7f484725bd19403854d6112992dccef4961e32'),
|
|
103
104
|
Fr.fromString('0x1cea539e01abaa5db980e7ff52ef0d2a7772310306ac625783ae435756ee326d'),
|
|
104
|
-
Fr.fromString('0x2c1eb017f1534e95d91808e7ccc5f24a1cc6bf5686c6b6598e79b6f571d386fe'),
|
|
105
105
|
Fr.fromString('0x2c3a57c8d7c387652babd36c4d79ab03c0fe593e160315a4dc098f92caf592c3')
|
|
106
106
|
];
|
|
107
107
|
|